annotate mpegaudio_parser.c @ 5062:2dd00b1cc94b libavcodec

Remove mdct.o and fft.o from fft-test prerequisites list. Both objects were added to the link command, resulting in multiple definitions of symbols. Now linking works in the general case when mdct.o and fft.o are compiled into libavcodec.a.
author diego
date Tue, 22 May 2007 07:08:38 +0000
parents b908c67063c8
children bff60ecc02f9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1 /*
4913
b7bde71aa752 move mpegaudio_parser in it's own file
aurel
parents: 4912
diff changeset
2 * MPEG Audio parser
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
3 * Copyright (c) 2003 Fabrice Bellard.
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
4 * Copyright (c) 2003 Michael Niedermayer.
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
5 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
6 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
7 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
12 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
16 * Lesser General Public License for more details.
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
17 *
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
21 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
22
4913
b7bde71aa752 move mpegaudio_parser in it's own file
aurel
parents: 4912
diff changeset
23 #include "parser.h"
b7bde71aa752 move mpegaudio_parser in it's own file
aurel
parents: 4912
diff changeset
24 #include "mpegaudio.h"
5050
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
25 #include "mpegaudiodecheader.h"
2386
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
26
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
27
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
28 typedef struct MpegAudioParseContext {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
29 uint8_t inbuf[MPA_MAX_CODED_FRAME_SIZE]; /* input buffer */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
30 uint8_t *inbuf_ptr;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
31 int frame_size;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
32 int free_format_frame_size;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
33 int free_format_next_header;
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
34 uint32_t header;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
35 int header_count;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
36 } MpegAudioParseContext;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
37
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
38 #define MPA_HEADER_SIZE 4
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
39
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
40 /* header + layer + bitrate + freq + lsf/mpeg25 */
2522
e25782262d7d kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents: 2486
diff changeset
41 #undef SAME_HEADER_MASK /* mpegaudio.h defines different version */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
42 #define SAME_HEADER_MASK \
2480
5252700f61df 10000l vbr mp3 fix
michael
parents: 2470
diff changeset
43 (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19))
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
44
5050
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
45 /* useful helper to get mpeg audio stream infos. Return -1 if error in
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
46 header, otherwise the coded frame size in bytes */
5051
b908c67063c8 add a ff_ prefix to some mpegaudio funcs
aurel
parents: 5050
diff changeset
47 int ff_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate)
5050
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
48 {
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
49 MPADecodeContext s1, *s = &s1;
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
50 s1.avctx = avctx;
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
51
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
52 if (ff_mpa_check_header(head) != 0)
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
53 return -1;
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
54
5051
b908c67063c8 add a ff_ prefix to some mpegaudio funcs
aurel
parents: 5050
diff changeset
55 if (ff_mpegaudio_decode_header(s, head) != 0) {
5050
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
56 return -1;
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
57 }
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
58
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
59 switch(s->layer) {
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
60 case 1:
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
61 avctx->frame_size = 384;
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
62 break;
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
63 case 2:
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
64 avctx->frame_size = 1152;
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
65 break;
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
66 default:
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
67 case 3:
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
68 if (s->lsf)
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
69 avctx->frame_size = 576;
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
70 else
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
71 avctx->frame_size = 1152;
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
72 break;
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
73 }
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
74
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
75 *sample_rate = s->sample_rate;
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
76 avctx->channels = s->nb_channels;
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
77 avctx->bit_rate = s->bit_rate;
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
78 avctx->sub_id = s->layer;
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
79 return s->frame_size;
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
80 }
a5f6fbc9fa66 loosen dependencies over mpegaudiodec
aurel
parents: 4931
diff changeset
81
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
82 static int mpegaudio_parse_init(AVCodecParserContext *s1)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
83 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
84 MpegAudioParseContext *s = s1->priv_data;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
85 s->inbuf_ptr = s->inbuf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
86 return 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
87 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
88
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
89 static int mpegaudio_parse(AVCodecParserContext *s1,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
90 AVCodecContext *avctx,
4931
0d1cc37d9430 make some parser parameters const to avoid casting const to non-const
aurel
parents: 4914
diff changeset
91 const uint8_t **poutbuf, int *poutbuf_size,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
92 const uint8_t *buf, int buf_size)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
93 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
94 MpegAudioParseContext *s = s1->priv_data;
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
95 int len, ret, sr;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
96 uint32_t header;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
97 const uint8_t *buf_ptr;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
98
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
99 *poutbuf = NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
100 *poutbuf_size = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
101 buf_ptr = buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
102 while (buf_size > 0) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
103 len = s->inbuf_ptr - s->inbuf;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
104 if (s->frame_size == 0) {
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
105 /* special case for next header for first frame in free
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
106 format case (XXX: find a simpler method) */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
107 if (s->free_format_next_header != 0) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
108 s->inbuf[0] = s->free_format_next_header >> 24;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
109 s->inbuf[1] = s->free_format_next_header >> 16;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
110 s->inbuf[2] = s->free_format_next_header >> 8;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
111 s->inbuf[3] = s->free_format_next_header;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
112 s->inbuf_ptr = s->inbuf + 4;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
113 s->free_format_next_header = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
114 goto got_header;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
115 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
116 /* no header seen : find one. We need at least MPA_HEADER_SIZE
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
117 bytes to parse it */
3639
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
118 len = FFMIN(MPA_HEADER_SIZE - len, buf_size);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
119 if (len > 0) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
120 memcpy(s->inbuf_ptr, buf_ptr, len);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
121 buf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
122 buf_size -= len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
123 s->inbuf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
124 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
125 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) {
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
126 got_header:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
127 header = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
128 (s->inbuf[2] << 8) | s->inbuf[3];
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
129
5051
b908c67063c8 add a ff_ prefix to some mpegaudio funcs
aurel
parents: 5050
diff changeset
130 ret = ff_mpa_decode_header(avctx, header, &sr);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
131 if (ret < 0) {
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
132 s->header_count= -2;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
133 /* no sync found : move by one byte (inefficient, but simple!) */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
134 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
135 s->inbuf_ptr--;
4652
6679d37a3338 Give context to dprintf
mbardiaux
parents: 4648
diff changeset
136 dprintf(avctx, "skip %x\n", header);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
137 /* reset free format frame size to give a chance
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
138 to get a new bitrate */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
139 s->free_format_frame_size = 0;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
140 } else {
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
141 if((header&SAME_HEADER_MASK) != (s->header&SAME_HEADER_MASK) && s->header)
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
142 s->header_count= -3;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
143 s->header= header;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
144 s->header_count++;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
145 s->frame_size = ret;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
146
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
147 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
148 /* free format: prepare to compute frame size */
5051
b908c67063c8 add a ff_ prefix to some mpegaudio funcs
aurel
parents: 5050
diff changeset
149 if (ff_mpegaudio_decode_header(s, header) == 1) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
150 s->frame_size = -1;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
151 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
152 #endif
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
153 }
4104
04ff8026d9c0 dont set the sampling rate just because 1 mp3 packet header says so (fixes playback speed on some old mencoder generated avis which where then dumped to mp3)
michael
parents: 3989
diff changeset
154 if(s->header_count > 1)
04ff8026d9c0 dont set the sampling rate just because 1 mp3 packet header says so (fixes playback speed on some old mencoder generated avis which where then dumped to mp3)
michael
parents: 3989
diff changeset
155 avctx->sample_rate= sr;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
156 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
157 } else
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
158 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
159 if (s->frame_size == -1) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
160 /* free format : find next sync to compute frame size */
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
161 len = MPA_MAX_CODED_FRAME_SIZE - len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
162 if (len > buf_size)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
163 len = buf_size;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
164 if (len == 0) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
165 /* frame too long: resync */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
166 s->frame_size = 0;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
167 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
168 s->inbuf_ptr--;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
169 } else {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
170 uint8_t *p, *pend;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
171 uint32_t header1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
172 int padding;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
173
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
174 memcpy(s->inbuf_ptr, buf_ptr, len);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
175 /* check for header */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
176 p = s->inbuf_ptr - 3;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
177 pend = s->inbuf_ptr + len - 4;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
178 while (p <= pend) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
179 header = (p[0] << 24) | (p[1] << 16) |
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
180 (p[2] << 8) | p[3];
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
181 header1 = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
182 (s->inbuf[2] << 8) | s->inbuf[3];
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
183 /* check with high probability that we have a
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
184 valid header */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
185 if ((header & SAME_HEADER_MASK) ==
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
186 (header1 & SAME_HEADER_MASK)) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
187 /* header found: update pointers */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
188 len = (p + 4) - s->inbuf_ptr;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
189 buf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
190 buf_size -= len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
191 s->inbuf_ptr = p;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
192 /* compute frame size */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
193 s->free_format_next_header = header;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
194 s->free_format_frame_size = s->inbuf_ptr - s->inbuf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
195 padding = (header1 >> 9) & 1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
196 if (s->layer == 1)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
197 s->free_format_frame_size -= padding * 4;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
198 else
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
199 s->free_format_frame_size -= padding;
4652
6679d37a3338 Give context to dprintf
mbardiaux
parents: 4648
diff changeset
200 dprintf(avctx, "free frame size=%d padding=%d\n",
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
201 s->free_format_frame_size, padding);
5051
b908c67063c8 add a ff_ prefix to some mpegaudio funcs
aurel
parents: 5050
diff changeset
202 ff_mpegaudio_decode_header(s, header1);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
203 goto next_data;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
204 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
205 p++;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
206 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
207 /* not found: simply increase pointers */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
208 buf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
209 s->inbuf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
210 buf_size -= len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
211 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
212 } else
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
213 #endif
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
214 if (len < s->frame_size) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
215 if (s->frame_size > MPA_MAX_CODED_FRAME_SIZE)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
216 s->frame_size = MPA_MAX_CODED_FRAME_SIZE;
3639
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
217 len = FFMIN(s->frame_size - len, buf_size);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
218 memcpy(s->inbuf_ptr, buf_ptr, len);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
219 buf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
220 s->inbuf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
221 buf_size -= len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
222 }
3639
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
223
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
224 if(s->frame_size > 0 && buf_ptr - buf == s->inbuf_ptr - s->inbuf
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
225 && buf_size + buf_ptr - buf >= s->frame_size){
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
226 if(s->header_count > 0){
4931
0d1cc37d9430 make some parser parameters const to avoid casting const to non-const
aurel
parents: 4914
diff changeset
227 *poutbuf = buf;
3639
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
228 *poutbuf_size = s->frame_size;
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
229 }
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
230 buf_ptr = buf + s->frame_size;
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
231 s->inbuf_ptr = s->inbuf;
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
232 s->frame_size = 0;
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
233 break;
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
234 }
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
235
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
236 // next_data:
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
237 if (s->frame_size > 0 &&
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
238 (s->inbuf_ptr - s->inbuf) >= s->frame_size) {
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
239 if(s->header_count > 0){
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
240 *poutbuf = s->inbuf;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
241 *poutbuf_size = s->inbuf_ptr - s->inbuf;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
242 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
243 s->inbuf_ptr = s->inbuf;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
244 s->frame_size = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
245 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
246 }
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
247 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
248 return buf_ptr - buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
249 }
4397
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
250
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
251
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
252 AVCodecParser mpegaudio_parser = {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
253 { CODEC_ID_MP2, CODEC_ID_MP3 },
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
254 sizeof(MpegAudioParseContext),
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
255 mpegaudio_parse_init,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
256 mpegaudio_parse,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
257 NULL,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
258 };