annotate mpegaudio_parser.c @ 6170:8cbfc9d75833 libavcodec

Put some disabled functions that are only used in the test program in cabac.c under TEST as preprocessor conditional, same as the test program.
author diego
date Wed, 23 Jan 2008 10:19:39 +0000
parents d623b3171830
children 2b0d01be134f
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) {
5089
bff60ecc02f9 Use AV_xx throughout libavcodec
ramiro
parents: 5051
diff changeset
108 AV_WB32(s->inbuf, s->free_format_next_header);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
109 s->inbuf_ptr = s->inbuf + 4;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
110 s->free_format_next_header = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
111 goto got_header;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
112 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
113 /* no header seen : find one. We need at least MPA_HEADER_SIZE
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
114 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
115 len = FFMIN(MPA_HEADER_SIZE - len, buf_size);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
116 if (len > 0) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
117 memcpy(s->inbuf_ptr, buf_ptr, len);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
118 buf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
119 buf_size -= len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
120 s->inbuf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
121 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
122 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) {
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
123 got_header:
5089
bff60ecc02f9 Use AV_xx throughout libavcodec
ramiro
parents: 5051
diff changeset
124 header = AV_RB32(s->inbuf);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
125
5051
b908c67063c8 add a ff_ prefix to some mpegaudio funcs
aurel
parents: 5050
diff changeset
126 ret = ff_mpa_decode_header(avctx, header, &sr);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
127 if (ret < 0) {
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
128 s->header_count= -2;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
129 /* no sync found : move by one byte (inefficient, but simple!) */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
130 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
131 s->inbuf_ptr--;
4652
6679d37a3338 Give context to dprintf
mbardiaux
parents: 4648
diff changeset
132 dprintf(avctx, "skip %x\n", header);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
133 /* reset free format frame size to give a chance
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
134 to get a new bitrate */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
135 s->free_format_frame_size = 0;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
136 } else {
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
137 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
138 s->header_count= -3;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
139 s->header= header;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
140 s->header_count++;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
141 s->frame_size = ret;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
142
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
143 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
144 /* free format: prepare to compute frame size */
5051
b908c67063c8 add a ff_ prefix to some mpegaudio funcs
aurel
parents: 5050
diff changeset
145 if (ff_mpegaudio_decode_header(s, header) == 1) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
146 s->frame_size = -1;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
147 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
148 #endif
5260
mru
parents: 5259
diff changeset
149 if(s->header_count > 1)
mru
parents: 5259
diff changeset
150 avctx->sample_rate= sr;
5259
3f48ee403351 set sample rate in more logical place, kill warning
mru
parents: 5089
diff changeset
151 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
152 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
153 } else
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
154 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
155 if (s->frame_size == -1) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
156 /* free format : find next sync to compute frame size */
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
157 len = MPA_MAX_CODED_FRAME_SIZE - len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
158 if (len > buf_size)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
159 len = buf_size;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
160 if (len == 0) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
161 /* frame too long: resync */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
162 s->frame_size = 0;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
163 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
164 s->inbuf_ptr--;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
165 } else {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
166 uint8_t *p, *pend;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
167 uint32_t header1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
168 int padding;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
169
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
170 memcpy(s->inbuf_ptr, buf_ptr, len);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
171 /* check for header */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
172 p = s->inbuf_ptr - 3;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
173 pend = s->inbuf_ptr + len - 4;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
174 while (p <= pend) {
5089
bff60ecc02f9 Use AV_xx throughout libavcodec
ramiro
parents: 5051
diff changeset
175 header = AV_RB32(p);
bff60ecc02f9 Use AV_xx throughout libavcodec
ramiro
parents: 5051
diff changeset
176 header1 = AV_RB32(s->inbuf);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
177 /* check with high probability that we have a
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
178 valid header */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
179 if ((header & SAME_HEADER_MASK) ==
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
180 (header1 & SAME_HEADER_MASK)) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
181 /* header found: update pointers */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
182 len = (p + 4) - s->inbuf_ptr;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
183 buf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
184 buf_size -= len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
185 s->inbuf_ptr = p;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
186 /* compute frame size */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
187 s->free_format_next_header = header;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
188 s->free_format_frame_size = s->inbuf_ptr - s->inbuf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
189 padding = (header1 >> 9) & 1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
190 if (s->layer == 1)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
191 s->free_format_frame_size -= padding * 4;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
192 else
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
193 s->free_format_frame_size -= padding;
4652
6679d37a3338 Give context to dprintf
mbardiaux
parents: 4648
diff changeset
194 dprintf(avctx, "free frame size=%d padding=%d\n",
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
195 s->free_format_frame_size, padding);
5051
b908c67063c8 add a ff_ prefix to some mpegaudio funcs
aurel
parents: 5050
diff changeset
196 ff_mpegaudio_decode_header(s, header1);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
197 goto next_data;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
198 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
199 p++;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
200 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
201 /* not found: simply increase pointers */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
202 buf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
203 s->inbuf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
204 buf_size -= len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
205 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
206 } else
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
207 #endif
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
208 if (len < s->frame_size) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
209 if (s->frame_size > MPA_MAX_CODED_FRAME_SIZE)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
210 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
211 len = FFMIN(s->frame_size - len, buf_size);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
212 memcpy(s->inbuf_ptr, buf_ptr, len);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
213 buf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
214 s->inbuf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
215 buf_size -= len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
216 }
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
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
218 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
219 && 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
220 if(s->header_count > 0){
4931
0d1cc37d9430 make some parser parameters const to avoid casting const to non-const
aurel
parents: 4914
diff changeset
221 *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
222 *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
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 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
225 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
226 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
227 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
228 }
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
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
230 // next_data:
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
231 if (s->frame_size > 0 &&
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
232 (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
233 if(s->header_count > 0){
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
234 *poutbuf = s->inbuf;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
235 *poutbuf_size = s->inbuf_ptr - s->inbuf;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
236 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
237 s->inbuf_ptr = s->inbuf;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
238 s->frame_size = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
239 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
240 }
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
241 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
242 return buf_ptr - buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
243 }
4397
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
244
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
245
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
246 AVCodecParser mpegaudio_parser = {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
247 { CODEC_ID_MP2, CODEC_ID_MP3 },
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
248 sizeof(MpegAudioParseContext),
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
249 mpegaudio_parse_init,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
250 mpegaudio_parse,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
251 NULL,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
252 };