Mercurial > libavcodec.hg
annotate parser.c @ 4580:55d7ebd2d699 libavcodec
fix chroma mc2 bug, this is based on a patch by (Oleg Metelitsa oleg hitron co kr)
and does slow the mc2 chroma put down, avg interrestingly seems unaffected speedwise on duron
this of course should be rather done in a way which doesnt slow it down but its better a few %
slower but correct then incorrect
| author | michael |
|---|---|
| date | Fri, 23 Feb 2007 14:29:13 +0000 |
| parents | 665d7cd95fd3 |
| children | 056127e5df89 |
| rev | line source |
|---|---|
| 1613 | 1 /* |
| 2 * Audio and Video frame extraction | |
| 3 * Copyright (c) 2003 Fabrice Bellard. | |
| 4 * Copyright (c) 2003 Michael Niedermayer. | |
| 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 | 9 * modify it under the terms of the GNU Lesser General Public |
| 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 | 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 | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 16 * Lesser General Public License for more details. | |
| 17 * | |
| 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 | 21 */ |
| 22 #include "avcodec.h" | |
| 23 #include "mpegvideo.h" | |
| 24 #include "mpegaudio.h" | |
|
4150
2205aefb22b7
move AVCodecParser prototypes and definitions to parser.h, and move mpegvideo parser to mpeg12.c
bcoudurier
parents:
4146
diff
changeset
|
25 #include "parser.h" |
| 1613 | 26 |
| 27 AVCodecParser *av_first_parser = NULL; | |
| 28 | |
| 29 void av_register_codec_parser(AVCodecParser *parser) | |
| 30 { | |
| 31 parser->next = av_first_parser; | |
| 32 av_first_parser = parser; | |
| 33 } | |
| 34 | |
| 35 AVCodecParserContext *av_parser_init(int codec_id) | |
| 36 { | |
| 37 AVCodecParserContext *s; | |
| 38 AVCodecParser *parser; | |
| 39 int ret; | |
| 2967 | 40 |
|
2486
f2a9559db6ac
10l (array gets padded with 0 which is CODEC_ID_NONE -> parsers claim to support CODEC_ID_NONE)
michael
parents:
2480
diff
changeset
|
41 if(codec_id == CODEC_ID_NONE) |
|
f2a9559db6ac
10l (array gets padded with 0 which is CODEC_ID_NONE -> parsers claim to support CODEC_ID_NONE)
michael
parents:
2480
diff
changeset
|
42 return NULL; |
| 1613 | 43 |
| 44 for(parser = av_first_parser; parser != NULL; parser = parser->next) { | |
| 45 if (parser->codec_ids[0] == codec_id || | |
| 46 parser->codec_ids[1] == codec_id || | |
| 2348 | 47 parser->codec_ids[2] == codec_id || |
| 48 parser->codec_ids[3] == codec_id || | |
| 49 parser->codec_ids[4] == codec_id) | |
| 1613 | 50 goto found; |
| 51 } | |
| 52 return NULL; | |
| 53 found: | |
| 54 s = av_mallocz(sizeof(AVCodecParserContext)); | |
| 55 if (!s) | |
| 56 return NULL; | |
| 57 s->parser = parser; | |
| 58 s->priv_data = av_mallocz(parser->priv_data_size); | |
| 59 if (!s->priv_data) { | |
| 60 av_free(s); | |
| 61 return NULL; | |
| 62 } | |
| 63 if (parser->parser_init) { | |
| 64 ret = parser->parser_init(s); | |
| 65 if (ret != 0) { | |
| 66 av_free(s->priv_data); | |
| 67 av_free(s); | |
| 68 return NULL; | |
| 69 } | |
| 70 } | |
| 2030 | 71 s->fetch_timestamp=1; |
| 1613 | 72 return s; |
| 73 } | |
| 74 | |
| 3989 | 75 /** |
| 76 * | |
| 77 * @param buf input | |
| 78 * @param buf_size input length, to signal EOF, this should be 0 (so that the last frame can be output) | |
| 79 * @param pts input presentation timestamp | |
| 80 * @param dts input decoding timestamp | |
| 81 * @param poutbuf will contain a pointer to the first byte of the output frame | |
| 82 * @param poutbuf_size will contain the length of the output frame | |
| 83 * @return the number of bytes of the input bitstream used | |
| 84 * | |
| 85 * Example: | |
| 86 * @code | |
| 87 * while(in_len){ | |
| 88 * len = av_parser_parse(myparser, AVCodecContext, &data, &size, | |
| 89 * in_data, in_len, | |
| 90 * pts, dts); | |
| 91 * in_data += len; | |
| 92 * in_len -= len; | |
| 93 * | |
| 4310 | 94 * if(size) |
| 95 * decode_frame(data, size); | |
| 3989 | 96 * } |
| 97 * @endcode | |
| 98 */ | |
| 2967 | 99 int av_parser_parse(AVCodecParserContext *s, |
| 1613 | 100 AVCodecContext *avctx, |
| 2967 | 101 uint8_t **poutbuf, int *poutbuf_size, |
| 1696 | 102 const uint8_t *buf, int buf_size, |
| 103 int64_t pts, int64_t dts) | |
| 1613 | 104 { |
| 1696 | 105 int index, i, k; |
|
1694
13169235c306
added End Of File handling to return last picture for MPEG1/2/4
bellard
parents:
1681
diff
changeset
|
106 uint8_t dummy_buf[FF_INPUT_BUFFER_PADDING_SIZE]; |
| 2967 | 107 |
|
1694
13169235c306
added End Of File handling to return last picture for MPEG1/2/4
bellard
parents:
1681
diff
changeset
|
108 if (buf_size == 0) { |
|
13169235c306
added End Of File handling to return last picture for MPEG1/2/4
bellard
parents:
1681
diff
changeset
|
109 /* padding is always necessary even if EOF, so we add it here */ |
|
13169235c306
added End Of File handling to return last picture for MPEG1/2/4
bellard
parents:
1681
diff
changeset
|
110 memset(dummy_buf, 0, sizeof(dummy_buf)); |
|
13169235c306
added End Of File handling to return last picture for MPEG1/2/4
bellard
parents:
1681
diff
changeset
|
111 buf = dummy_buf; |
| 1696 | 112 } else { |
| 113 /* add a new packet descriptor */ | |
| 114 k = (s->cur_frame_start_index + 1) & (AV_PARSER_PTS_NB - 1); | |
| 115 s->cur_frame_start_index = k; | |
| 116 s->cur_frame_offset[k] = s->cur_offset; | |
| 117 s->cur_frame_pts[k] = pts; | |
| 118 s->cur_frame_dts[k] = dts; | |
| 119 | |
| 120 /* fill first PTS/DTS */ | |
| 2030 | 121 if (s->fetch_timestamp){ |
| 122 s->fetch_timestamp=0; | |
| 1696 | 123 s->last_pts = pts; |
| 124 s->last_dts = dts; | |
| 2107 | 125 s->cur_frame_pts[k] = |
| 126 s->cur_frame_dts[k] = AV_NOPTS_VALUE; | |
| 1696 | 127 } |
|
1694
13169235c306
added End Of File handling to return last picture for MPEG1/2/4
bellard
parents:
1681
diff
changeset
|
128 } |
|
13169235c306
added End Of File handling to return last picture for MPEG1/2/4
bellard
parents:
1681
diff
changeset
|
129 |
| 1613 | 130 /* WARNING: the returned index can be negative */ |
| 131 index = s->parser->parser_parse(s, avctx, poutbuf, poutbuf_size, buf, buf_size); | |
|
4122
daae66c03857
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
4104
diff
changeset
|
132 //av_log(NULL, AV_LOG_DEBUG, "parser: in:%"PRId64", %"PRId64", out:%"PRId64", %"PRId64", in:%d out:%d id:%d\n", pts, dts, s->last_pts, s->last_dts, buf_size, *poutbuf_size, avctx->codec_id); |
| 1613 | 133 /* update the file pointer */ |
| 134 if (*poutbuf_size) { | |
| 1696 | 135 /* fill the data for the current frame */ |
| 1613 | 136 s->frame_offset = s->last_frame_offset; |
| 1696 | 137 s->pts = s->last_pts; |
| 138 s->dts = s->last_dts; | |
| 2967 | 139 |
| 1696 | 140 /* offset of the next frame */ |
| 1613 | 141 s->last_frame_offset = s->cur_offset + index; |
| 1696 | 142 /* find the packet in which the new frame starts. It |
| 143 is tricky because of MPEG video start codes | |
| 144 which can begin in one packet and finish in | |
| 145 another packet. In the worst case, an MPEG | |
| 146 video start code could be in 4 different | |
| 147 packets. */ | |
| 148 k = s->cur_frame_start_index; | |
| 149 for(i = 0; i < AV_PARSER_PTS_NB; i++) { | |
| 150 if (s->last_frame_offset >= s->cur_frame_offset[k]) | |
| 151 break; | |
| 152 k = (k - 1) & (AV_PARSER_PTS_NB - 1); | |
| 153 } | |
| 2030 | 154 |
| 1696 | 155 s->last_pts = s->cur_frame_pts[k]; |
| 156 s->last_dts = s->cur_frame_dts[k]; | |
| 2967 | 157 |
| 2030 | 158 /* some parsers tell us the packet size even before seeing the first byte of the next packet, |
| 159 so the next pts/dts is in the next chunk */ | |
| 160 if(index == buf_size){ | |
| 161 s->fetch_timestamp=1; | |
| 162 } | |
| 1613 | 163 } |
| 164 if (index < 0) | |
| 165 index = 0; | |
| 166 s->cur_offset += index; | |
| 167 return index; | |
| 168 } | |
| 169 | |
| 2777 | 170 /** |
| 171 * | |
| 172 * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed | |
|
3421
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
3395
diff
changeset
|
173 * @deprecated use AVBitstreamFilter |
| 2777 | 174 */ |
|
2769
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
175 int av_parser_change(AVCodecParserContext *s, |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
176 AVCodecContext *avctx, |
| 2967 | 177 uint8_t **poutbuf, int *poutbuf_size, |
|
2769
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
178 const uint8_t *buf, int buf_size, int keyframe){ |
| 2967 | 179 |
|
2769
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
180 if(s && s->parser->split){ |
| 2777 | 181 if((avctx->flags & CODEC_FLAG_GLOBAL_HEADER) || (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER)){ |
|
2769
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
182 int i= s->parser->split(avctx, buf, buf_size); |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
183 buf += i; |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
184 buf_size -= i; |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
185 } |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
186 } |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
187 |
|
2864
95bac7109ff0
Kill some compiler warnings. Compiled code verified identical after changes.
mru
parents:
2846
diff
changeset
|
188 /* cast to avoid warning about discarding qualifiers */ |
|
95bac7109ff0
Kill some compiler warnings. Compiled code verified identical after changes.
mru
parents:
2846
diff
changeset
|
189 *poutbuf= (uint8_t *) buf; |
|
2769
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
190 *poutbuf_size= buf_size; |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
191 if(avctx->extradata){ |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
192 if( (keyframe && (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER)) |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
193 /*||(s->pict_type != I_TYPE && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_NOKEY))*/ |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
194 /*||(? && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_BEGIN)*/){ |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
195 int size= buf_size + avctx->extradata_size; |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
196 *poutbuf_size= size; |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
197 *poutbuf= av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE); |
| 2967 | 198 |
|
2769
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
199 memcpy(*poutbuf, avctx->extradata, avctx->extradata_size); |
| 2777 | 200 memcpy((*poutbuf) + avctx->extradata_size, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE); |
|
2769
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
201 return 1; |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
202 } |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
203 } |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
204 |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
205 return 0; |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
206 } |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
207 |
| 1613 | 208 void av_parser_close(AVCodecParserContext *s) |
| 209 { | |
| 210 if (s->parser->parser_close) | |
| 211 s->parser->parser_close(s); | |
| 212 av_free(s->priv_data); | |
| 213 av_free(s); | |
| 214 } | |
| 215 | |
| 216 /*****************************************************/ | |
| 217 | |
| 218 /** | |
| 219 * combines the (truncated) bitstream to a complete frame | |
| 220 * @returns -1 if no complete frame could be created | |
| 221 */ | |
| 1988 | 222 int ff_combine_frame(ParseContext *pc, int next, uint8_t **buf, int *buf_size) |
| 1613 | 223 { |
| 224 #if 0 | |
| 225 if(pc->overread){ | |
| 226 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index); | |
| 227 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]); | |
| 228 } | |
| 229 #endif | |
| 230 | |
| 231 /* copy overreaded bytes from last frame into buffer */ | |
| 232 for(; pc->overread>0; pc->overread--){ | |
| 233 pc->buffer[pc->index++]= pc->buffer[pc->overread_index++]; | |
| 234 } | |
| 2386 | 235 |
| 236 /* flush remaining if EOF */ | |
| 237 if(!*buf_size && next == END_NOT_FOUND){ | |
| 238 next= 0; | |
| 239 } | |
| 240 | |
| 1613 | 241 pc->last_index= pc->index; |
| 242 | |
| 243 /* copy into buffer end return */ | |
| 244 if(next == END_NOT_FOUND){ | |
| 245 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, (*buf_size) + pc->index + FF_INPUT_BUFFER_PADDING_SIZE); | |
| 246 | |
| 247 memcpy(&pc->buffer[pc->index], *buf, *buf_size); | |
| 248 pc->index += *buf_size; | |
| 249 return -1; | |
| 250 } | |
| 251 | |
| 252 *buf_size= | |
| 253 pc->overread_index= pc->index + next; | |
| 2967 | 254 |
| 1613 | 255 /* append to buffer */ |
| 256 if(pc->index){ | |
| 257 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, next + pc->index + FF_INPUT_BUFFER_PADDING_SIZE); | |
| 258 | |
| 259 memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE ); | |
| 260 pc->index = 0; | |
| 261 *buf= pc->buffer; | |
| 262 } | |
| 263 | |
| 264 /* store overread bytes */ | |
| 265 for(;next < 0; next++){ | |
| 266 pc->state = (pc->state<<8) | pc->buffer[pc->last_index + next]; | |
| 267 pc->overread++; | |
| 268 } | |
| 269 | |
| 270 #if 0 | |
| 271 if(pc->overread){ | |
| 272 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index); | |
| 273 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]); | |
| 274 } | |
| 275 #endif | |
| 276 | |
| 277 return 0; | |
| 278 } | |
| 279 | |
| 1988 | 280 void ff_parse_close(AVCodecParserContext *s) |
| 1613 | 281 { |
| 1988 | 282 ParseContext *pc = s->priv_data; |
| 1613 | 283 |
| 284 av_free(pc->buffer); | |
| 1988 | 285 } |
| 286 | |
|
4150
2205aefb22b7
move AVCodecParser prototypes and definitions to parser.h, and move mpegvideo parser to mpeg12.c
bcoudurier
parents:
4146
diff
changeset
|
287 void ff_parse1_close(AVCodecParserContext *s) |
| 1988 | 288 { |
| 289 ParseContext1 *pc1 = s->priv_data; | |
| 290 | |
| 291 av_free(pc1->pc.buffer); | |
| 292 av_free(pc1->enc); | |
| 1613 | 293 } |
| 294 | |
| 295 /*************************/ | |
| 296 | |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
297 #ifdef CONFIG_MPEG4VIDEO_PARSER |
| 1613 | 298 /* used by parser */ |
| 299 /* XXX: make it use less memory */ | |
| 2967 | 300 static int av_mpeg4_decode_header(AVCodecParserContext *s1, |
| 1613 | 301 AVCodecContext *avctx, |
| 302 const uint8_t *buf, int buf_size) | |
| 303 { | |
| 304 ParseContext1 *pc = s1->priv_data; | |
| 305 MpegEncContext *s = pc->enc; | |
| 306 GetBitContext gb1, *gb = &gb1; | |
| 307 int ret; | |
| 308 | |
| 309 s->avctx = avctx; | |
| 1614 | 310 s->current_picture_ptr = &s->current_picture; |
| 311 | |
| 312 if (avctx->extradata_size && pc->first_picture){ | |
| 313 init_get_bits(gb, avctx->extradata, avctx->extradata_size*8); | |
| 314 ret = ff_mpeg4_decode_picture_header(s, gb); | |
| 315 } | |
| 316 | |
| 1613 | 317 init_get_bits(gb, buf, 8 * buf_size); |
| 318 ret = ff_mpeg4_decode_picture_header(s, gb); | |
| 319 if (s->width) { | |
| 2270 | 320 avcodec_set_dimensions(avctx, s->width, s->height); |
| 1613 | 321 } |
| 2837 | 322 s1->pict_type= s->pict_type; |
| 1614 | 323 pc->first_picture = 0; |
| 1613 | 324 return ret; |
| 325 } | |
| 326 | |
|
2024
f65d87bfdd5a
some of the warning fixes by (Michael Roitzsch <mroi at users dot sourceforge dot net>)
michael
parents:
1988
diff
changeset
|
327 static int mpeg4video_parse_init(AVCodecParserContext *s) |
| 1613 | 328 { |
| 329 ParseContext1 *pc = s->priv_data; | |
| 1614 | 330 |
| 1613 | 331 pc->enc = av_mallocz(sizeof(MpegEncContext)); |
| 332 if (!pc->enc) | |
| 333 return -1; | |
| 1614 | 334 pc->first_picture = 1; |
| 1613 | 335 return 0; |
| 336 } | |
| 337 | |
| 338 static int mpeg4video_parse(AVCodecParserContext *s, | |
| 339 AVCodecContext *avctx, | |
| 2967 | 340 uint8_t **poutbuf, int *poutbuf_size, |
| 1613 | 341 const uint8_t *buf, int buf_size) |
| 342 { | |
| 1988 | 343 ParseContext *pc = s->priv_data; |
| 1613 | 344 int next; |
| 2967 | 345 |
| 2837 | 346 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){ |
| 347 next= buf_size; | |
| 348 }else{ | |
| 349 next= ff_mpeg4_find_frame_end(pc, buf, buf_size); | |
| 2967 | 350 |
| 2837 | 351 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) { |
| 352 *poutbuf = NULL; | |
| 353 *poutbuf_size = 0; | |
| 354 return buf_size; | |
| 355 } | |
| 1613 | 356 } |
| 357 av_mpeg4_decode_header(s, avctx, buf, buf_size); | |
| 358 | |
| 359 *poutbuf = (uint8_t *)buf; | |
| 360 *poutbuf_size = buf_size; | |
| 361 return next; | |
| 362 } | |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
363 #endif |
| 1613 | 364 |
|
4175
b3328ed50a5e
make mpeg4video_split public as ff_mpeg4video_split
stefang
parents:
4150
diff
changeset
|
365 int ff_mpeg4video_split(AVCodecContext *avctx, |
|
2769
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
366 const uint8_t *buf, int buf_size) |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
367 { |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
368 int i; |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
369 uint32_t state= -1; |
| 2967 | 370 |
|
2769
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
371 for(i=0; i<buf_size; i++){ |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
372 state= (state<<8) | buf[i]; |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
373 if(state == 0x1B3 || state == 0x1B6) |
| 2777 | 374 return i-3; |
|
2769
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
375 } |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
376 return 0; |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
377 } |
|
1394b45a7bf4
support changing in bitstream global headers into extradata style and back
michael
parents:
2637
diff
changeset
|
378 |
| 1613 | 379 /*************************/ |
| 380 | |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
381 #ifdef CONFIG_MPEGAUDIO_PARSER |
| 1613 | 382 typedef struct MpegAudioParseContext { |
| 2979 | 383 uint8_t inbuf[MPA_MAX_CODED_FRAME_SIZE]; /* input buffer */ |
| 1613 | 384 uint8_t *inbuf_ptr; |
| 385 int frame_size; | |
| 386 int free_format_frame_size; | |
| 387 int free_format_next_header; | |
|
2470
06aafb585f69
require a few valid and equal mp3 headers for resync
michael
parents:
2389
diff
changeset
|
388 uint32_t header; |
|
06aafb585f69
require a few valid and equal mp3 headers for resync
michael
parents:
2389
diff
changeset
|
389 int header_count; |
| 1613 | 390 } MpegAudioParseContext; |
| 391 | |
| 392 #define MPA_HEADER_SIZE 4 | |
| 393 | |
| 394 /* header + layer + bitrate + freq + lsf/mpeg25 */ | |
|
2522
e25782262d7d
kill warnings patch by (M?ns Rullg?rd <mru inprovide com>)
michael
parents:
2486
diff
changeset
|
395 #undef SAME_HEADER_MASK /* mpegaudio.h defines different version */ |
| 1613 | 396 #define SAME_HEADER_MASK \ |
| 2480 | 397 (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19)) |
| 1613 | 398 |
| 399 static int mpegaudio_parse_init(AVCodecParserContext *s1) | |
| 400 { | |
| 401 MpegAudioParseContext *s = s1->priv_data; | |
| 402 s->inbuf_ptr = s->inbuf; | |
| 403 return 0; | |
| 404 } | |
| 405 | |
| 406 static int mpegaudio_parse(AVCodecParserContext *s1, | |
| 407 AVCodecContext *avctx, | |
| 2967 | 408 uint8_t **poutbuf, int *poutbuf_size, |
| 1613 | 409 const uint8_t *buf, int buf_size) |
| 410 { | |
| 411 MpegAudioParseContext *s = s1->priv_data; | |
|
2470
06aafb585f69
require a few valid and equal mp3 headers for resync
michael
parents:
2389
diff
changeset
|
412 int len, ret, sr; |
| 1613 | 413 uint32_t header; |
| 414 const uint8_t *buf_ptr; | |
| 415 | |
| 416 *poutbuf = NULL; | |
| 417 *poutbuf_size = 0; | |
| 418 buf_ptr = buf; | |
| 419 while (buf_size > 0) { | |
| 2979 | 420 len = s->inbuf_ptr - s->inbuf; |
| 421 if (s->frame_size == 0) { | |
| 1613 | 422 /* special case for next header for first frame in free |
| 423 format case (XXX: find a simpler method) */ | |
| 424 if (s->free_format_next_header != 0) { | |
| 425 s->inbuf[0] = s->free_format_next_header >> 24; | |
| 426 s->inbuf[1] = s->free_format_next_header >> 16; | |
| 427 s->inbuf[2] = s->free_format_next_header >> 8; | |
| 428 s->inbuf[3] = s->free_format_next_header; | |
| 429 s->inbuf_ptr = s->inbuf + 4; | |
| 430 s->free_format_next_header = 0; | |
| 431 goto got_header; | |
| 432 } | |
| 2979 | 433 /* no header seen : find one. We need at least MPA_HEADER_SIZE |
| 1613 | 434 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
|
435 len = FFMIN(MPA_HEADER_SIZE - len, buf_size); |
| 2979 | 436 if (len > 0) { |
| 437 memcpy(s->inbuf_ptr, buf_ptr, len); | |
| 438 buf_ptr += len; | |
| 439 buf_size -= len; | |
| 440 s->inbuf_ptr += len; | |
| 441 } | |
| 442 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) { | |
| 1613 | 443 got_header: |
| 2979 | 444 header = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) | |
| 445 (s->inbuf[2] << 8) | s->inbuf[3]; | |
| 1613 | 446 |
|
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
|
447 ret = mpa_decode_header(avctx, header, &sr); |
| 1613 | 448 if (ret < 0) { |
|
2470
06aafb585f69
require a few valid and equal mp3 headers for resync
michael
parents:
2389
diff
changeset
|
449 s->header_count= -2; |
| 2979 | 450 /* no sync found : move by one byte (inefficient, but simple!) */ |
| 451 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1); | |
| 452 s->inbuf_ptr--; | |
| 1613 | 453 dprintf("skip %x\n", header); |
| 454 /* reset free format frame size to give a chance | |
| 455 to get a new bitrate */ | |
| 456 s->free_format_frame_size = 0; | |
| 2979 | 457 } else { |
|
2470
06aafb585f69
require a few valid and equal mp3 headers for resync
michael
parents:
2389
diff
changeset
|
458 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
|
459 s->header_count= -3; |
|
06aafb585f69
require a few valid and equal mp3 headers for resync
michael
parents:
2389
diff
changeset
|
460 s->header= header; |
|
06aafb585f69
require a few valid and equal mp3 headers for resync
michael
parents:
2389
diff
changeset
|
461 s->header_count++; |
| 1613 | 462 s->frame_size = ret; |
| 2967 | 463 |
| 1613 | 464 #if 0 |
| 465 /* free format: prepare to compute frame size */ | |
| 2979 | 466 if (decode_header(s, header) == 1) { |
| 467 s->frame_size = -1; | |
| 1613 | 468 } |
| 469 #endif | |
| 2979 | 470 } |
|
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
|
471 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
|
472 avctx->sample_rate= sr; |
| 2979 | 473 } |
| 2967 | 474 } else |
| 1613 | 475 #if 0 |
| 476 if (s->frame_size == -1) { | |
| 477 /* free format : find next sync to compute frame size */ | |
| 2979 | 478 len = MPA_MAX_CODED_FRAME_SIZE - len; |
| 479 if (len > buf_size) | |
| 480 len = buf_size; | |
| 1613 | 481 if (len == 0) { |
| 2979 | 482 /* frame too long: resync */ |
| 1613 | 483 s->frame_size = 0; |
| 2979 | 484 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1); |
| 485 s->inbuf_ptr--; | |
| 1613 | 486 } else { |
| 487 uint8_t *p, *pend; | |
| 488 uint32_t header1; | |
| 489 int padding; | |
| 490 | |
| 491 memcpy(s->inbuf_ptr, buf_ptr, len); | |
| 492 /* check for header */ | |
| 493 p = s->inbuf_ptr - 3; | |
| 494 pend = s->inbuf_ptr + len - 4; | |
| 495 while (p <= pend) { | |
| 496 header = (p[0] << 24) | (p[1] << 16) | | |
| 497 (p[2] << 8) | p[3]; | |
| 498 header1 = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) | | |
| 499 (s->inbuf[2] << 8) | s->inbuf[3]; | |
| 500 /* check with high probability that we have a | |
| 501 valid header */ | |
| 502 if ((header & SAME_HEADER_MASK) == | |
| 503 (header1 & SAME_HEADER_MASK)) { | |
| 504 /* header found: update pointers */ | |
| 505 len = (p + 4) - s->inbuf_ptr; | |
| 506 buf_ptr += len; | |
| 507 buf_size -= len; | |
| 508 s->inbuf_ptr = p; | |
| 509 /* compute frame size */ | |
| 510 s->free_format_next_header = header; | |
| 511 s->free_format_frame_size = s->inbuf_ptr - s->inbuf; | |
| 512 padding = (header1 >> 9) & 1; | |
| 513 if (s->layer == 1) | |
| 514 s->free_format_frame_size -= padding * 4; | |
| 515 else | |
| 516 s->free_format_frame_size -= padding; | |
| 2967 | 517 dprintf("free frame size=%d padding=%d\n", |
| 1613 | 518 s->free_format_frame_size, padding); |
| 519 decode_header(s, header1); | |
| 520 goto next_data; | |
| 521 } | |
| 522 p++; | |
| 523 } | |
| 524 /* not found: simply increase pointers */ | |
| 525 buf_ptr += len; | |
| 526 s->inbuf_ptr += len; | |
| 527 buf_size -= len; | |
| 528 } | |
| 2979 | 529 } else |
| 1613 | 530 #endif |
| 531 if (len < s->frame_size) { | |
| 532 if (s->frame_size > MPA_MAX_CODED_FRAME_SIZE) | |
| 533 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
|
534 len = FFMIN(s->frame_size - len, buf_size); |
| 2979 | 535 memcpy(s->inbuf_ptr, buf_ptr, len); |
| 536 buf_ptr += len; | |
| 537 s->inbuf_ptr += len; | |
| 538 buf_size -= len; | |
| 539 } | |
|
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
|
540 |
|
949bc256f1e3
dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents:
3456
diff
changeset
|
541 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
|
542 && 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
|
543 if(s->header_count > 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
|
544 *poutbuf = buf; |
|
949bc256f1e3
dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents:
3456
diff
changeset
|
545 *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
|
546 } |
|
949bc256f1e3
dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents:
3456
diff
changeset
|
547 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
|
548 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
|
549 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
|
550 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
|
551 } |
|
949bc256f1e3
dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents:
3456
diff
changeset
|
552 |
| 1613 | 553 // next_data: |
| 2967 | 554 if (s->frame_size > 0 && |
| 1613 | 555 (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
|
556 if(s->header_count > 0){ |
|
06aafb585f69
require a few valid and equal mp3 headers for resync
michael
parents:
2389
diff
changeset
|
557 *poutbuf = s->inbuf; |
|
06aafb585f69
require a few valid and equal mp3 headers for resync
michael
parents:
2389
diff
changeset
|
558 *poutbuf_size = s->inbuf_ptr - s->inbuf; |
|
06aafb585f69
require a few valid and equal mp3 headers for resync
michael
parents:
2389
diff
changeset
|
559 } |
| 2979 | 560 s->inbuf_ptr = s->inbuf; |
| 561 s->frame_size = 0; | |
| 562 break; | |
| 563 } | |
| 1613 | 564 } |
| 565 return buf_ptr - buf; | |
| 566 } | |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
567 #endif /* CONFIG_MPEGAUDIO_PARSER */ |
| 1613 | 568 |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
569 #if defined(CONFIG_AC3_PARSER) || defined(CONFIG_AAC_PARSER) |
| 3098 | 570 /* also used for ADTS AAC */ |
| 1613 | 571 typedef struct AC3ParseContext { |
| 572 uint8_t *inbuf_ptr; | |
| 573 int frame_size; | |
| 3098 | 574 int header_size; |
| 575 int (*sync)(const uint8_t *buf, int *channels, int *sample_rate, | |
| 576 int *bit_rate, int *samples); | |
|
3344
f9d739057d6c
The AAC frame header uses 13 bits for the frame size, so the buffer should
mru
parents:
3104
diff
changeset
|
577 uint8_t inbuf[8192]; /* input buffer */ |
| 1613 | 578 } AC3ParseContext; |
| 579 | |
| 580 #define AC3_HEADER_SIZE 7 | |
| 3104 | 581 #define AAC_HEADER_SIZE 7 |
| 3059 | 582 |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
583 #ifdef CONFIG_AC3_PARSER |
| 3059 | 584 static const int ac3_sample_rates[4] = { |
| 585 48000, 44100, 32000, 0 | |
| 586 }; | |
| 587 | |
| 588 static const int ac3_frame_sizes[64][3] = { | |
|
3063
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
589 { 64, 69, 96 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
590 { 64, 70, 96 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
591 { 80, 87, 120 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
592 { 80, 88, 120 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
593 { 96, 104, 144 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
594 { 96, 105, 144 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
595 { 112, 121, 168 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
596 { 112, 122, 168 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
597 { 128, 139, 192 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
598 { 128, 140, 192 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
599 { 160, 174, 240 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
600 { 160, 175, 240 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
601 { 192, 208, 288 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
602 { 192, 209, 288 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
603 { 224, 243, 336 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
604 { 224, 244, 336 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
605 { 256, 278, 384 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
606 { 256, 279, 384 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
607 { 320, 348, 480 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
608 { 320, 349, 480 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
609 { 384, 417, 576 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
610 { 384, 418, 576 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
611 { 448, 487, 672 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
612 { 448, 488, 672 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
613 { 512, 557, 768 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
614 { 512, 558, 768 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
615 { 640, 696, 960 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
616 { 640, 697, 960 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
617 { 768, 835, 1152 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
618 { 768, 836, 1152 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
619 { 896, 975, 1344 }, |
|
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
620 { 896, 976, 1344 }, |
| 3059 | 621 { 1024, 1114, 1536 }, |
| 622 { 1024, 1115, 1536 }, | |
| 623 { 1152, 1253, 1728 }, | |
| 624 { 1152, 1254, 1728 }, | |
| 625 { 1280, 1393, 1920 }, | |
| 626 { 1280, 1394, 1920 }, | |
| 627 }; | |
| 628 | |
| 629 static const int ac3_bitrates[64] = { | |
| 630 32, 32, 40, 40, 48, 48, 56, 56, 64, 64, 80, 80, 96, 96, 112, 112, | |
| 631 128, 128, 160, 160, 192, 192, 224, 224, 256, 256, 320, 320, 384, | |
| 632 384, 448, 448, 512, 512, 576, 576, 640, 640, | |
| 633 }; | |
| 634 | |
|
4397
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
635 static const uint8_t ac3_channels[8] = { |
| 3059 | 636 2, 1, 2, 3, 3, 4, 4, 5 |
| 637 }; | |
|
4397
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
638 |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
639 static const uint8_t eac3_blocks[4] = { |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
640 1, 2, 3, 6 |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
641 }; |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
642 |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
643 #endif /* CONFIG_AC3_PARSER */ |
| 3059 | 644 |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
645 #ifdef CONFIG_AAC_PARSER |
| 3456 | 646 static const int aac_sample_rates[16] = { |
| 3098 | 647 96000, 88200, 64000, 48000, 44100, 32000, |
| 648 24000, 22050, 16000, 12000, 11025, 8000, 7350 | |
| 649 }; | |
| 650 | |
| 3456 | 651 static const int aac_channels[8] = { |
| 3098 | 652 0, 1, 2, 3, 4, 5, 6, 8 |
| 653 }; | |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
654 #endif |
| 3098 | 655 |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
656 #ifdef CONFIG_AC3_PARSER |
| 3059 | 657 static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate, |
| 3098 | 658 int *bit_rate, int *samples) |
| 3059 | 659 { |
| 4501 | 660 unsigned int fscod, frmsizecod, acmod, bsid, lfeon, halfratecod; |
|
4397
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
661 unsigned int strmtyp, substreamid, frmsiz, fscod2, numblkscod; |
| 3059 | 662 GetBitContext bits; |
| 663 | |
| 664 init_get_bits(&bits, buf, AC3_HEADER_SIZE * 8); | |
| 665 | |
| 666 if(get_bits(&bits, 16) != 0x0b77) | |
|
3063
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
667 return 0; |
| 3059 | 668 |
|
4397
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
669 bsid = show_bits_long(&bits, 29) & 0x1f; |
| 4501 | 670 if(bsid <= 10) { /* Normal AC-3 */ |
|
4398
d8ccac15e9d3
fix indentation, patch by Ian Caulfield % ian P caulfield A gmail P com %
gpoirier
parents:
4397
diff
changeset
|
671 skip_bits(&bits, 16); /* crc */ |
|
d8ccac15e9d3
fix indentation, patch by Ian Caulfield % ian P caulfield A gmail P com %
gpoirier
parents:
4397
diff
changeset
|
672 fscod = get_bits(&bits, 2); |
|
d8ccac15e9d3
fix indentation, patch by Ian Caulfield % ian P caulfield A gmail P com %
gpoirier
parents:
4397
diff
changeset
|
673 frmsizecod = get_bits(&bits, 6); |
| 3059 | 674 |
|
4398
d8ccac15e9d3
fix indentation, patch by Ian Caulfield % ian P caulfield A gmail P com %
gpoirier
parents:
4397
diff
changeset
|
675 if(fscod == 3) |
|
d8ccac15e9d3
fix indentation, patch by Ian Caulfield % ian P caulfield A gmail P com %
gpoirier
parents:
4397
diff
changeset
|
676 return 0; |
| 3059 | 677 |
|
4398
d8ccac15e9d3
fix indentation, patch by Ian Caulfield % ian P caulfield A gmail P com %
gpoirier
parents:
4397
diff
changeset
|
678 skip_bits(&bits, 5); /* bsid */ |
|
d8ccac15e9d3
fix indentation, patch by Ian Caulfield % ian P caulfield A gmail P com %
gpoirier
parents:
4397
diff
changeset
|
679 skip_bits(&bits, 3); /* bsmod */ |
|
d8ccac15e9d3
fix indentation, patch by Ian Caulfield % ian P caulfield A gmail P com %
gpoirier
parents:
4397
diff
changeset
|
680 acmod = get_bits(&bits, 3); |
|
d8ccac15e9d3
fix indentation, patch by Ian Caulfield % ian P caulfield A gmail P com %
gpoirier
parents:
4397
diff
changeset
|
681 if(acmod & 1 && acmod != 1) |
|
d8ccac15e9d3
fix indentation, patch by Ian Caulfield % ian P caulfield A gmail P com %
gpoirier
parents:
4397
diff
changeset
|
682 skip_bits(&bits, 2); /* cmixlev */ |
|
d8ccac15e9d3
fix indentation, patch by Ian Caulfield % ian P caulfield A gmail P com %
gpoirier
parents:
4397
diff
changeset
|
683 if(acmod & 4) |
|
d8ccac15e9d3
fix indentation, patch by Ian Caulfield % ian P caulfield A gmail P com %
gpoirier
parents:
4397
diff
changeset
|
684 skip_bits(&bits, 2); /* surmixlev */ |
|
d8ccac15e9d3
fix indentation, patch by Ian Caulfield % ian P caulfield A gmail P com %
gpoirier
parents:
4397
diff
changeset
|
685 if(acmod & 2) |
|
d8ccac15e9d3
fix indentation, patch by Ian Caulfield % ian P caulfield A gmail P com %
gpoirier
parents:
4397
diff
changeset
|
686 skip_bits(&bits, 2); /* dsurmod */ |
|
d8ccac15e9d3
fix indentation, patch by Ian Caulfield % ian P caulfield A gmail P com %
gpoirier
parents:
4397
diff
changeset
|
687 lfeon = get_bits1(&bits); |
| 3059 | 688 |
| 4501 | 689 halfratecod = FFMAX(bsid, 8) - 8; |
| 690 *sample_rate = ac3_sample_rates[fscod] >> halfratecod; | |
| 691 *bit_rate = (ac3_bitrates[frmsizecod] * 1000) >> halfratecod; | |
|
4398
d8ccac15e9d3
fix indentation, patch by Ian Caulfield % ian P caulfield A gmail P com %
gpoirier
parents:
4397
diff
changeset
|
692 *channels = ac3_channels[acmod] + lfeon; |
|
d8ccac15e9d3
fix indentation, patch by Ian Caulfield % ian P caulfield A gmail P com %
gpoirier
parents:
4397
diff
changeset
|
693 *samples = 6 * 256; |
| 3059 | 694 |
|
4398
d8ccac15e9d3
fix indentation, patch by Ian Caulfield % ian P caulfield A gmail P com %
gpoirier
parents:
4397
diff
changeset
|
695 return ac3_frame_sizes[frmsizecod][fscod] * 2; |
| 4501 | 696 } else if (bsid > 10 && bsid <= 16) { /* Enhanced AC-3 */ |
|
4397
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
697 strmtyp = get_bits(&bits, 2); |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
698 substreamid = get_bits(&bits, 3); |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
699 |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
700 if (strmtyp != 0 || substreamid != 0) |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
701 return 0; /* Currently don't support additional streams */ |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
702 |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
703 frmsiz = get_bits(&bits, 11) + 1; |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
704 fscod = get_bits(&bits, 2); |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
705 if (fscod == 3) { |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
706 fscod2 = get_bits(&bits, 2); |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
707 numblkscod = 3; |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
708 |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
709 if(fscod2 == 3) |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
710 return 0; |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
711 |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
712 *sample_rate = ac3_sample_rates[fscod2] / 2; |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
713 } else { |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
714 numblkscod = get_bits(&bits, 2); |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
715 |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
716 *sample_rate = ac3_sample_rates[fscod]; |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
717 } |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
718 |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
719 acmod = get_bits(&bits, 3); |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
720 lfeon = get_bits1(&bits); |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
721 |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
722 *samples = eac3_blocks[numblkscod] * 256; |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
723 *bit_rate = frmsiz * (*sample_rate) * 16 / (*samples); |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
724 *channels = ac3_channels[acmod] + lfeon; |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
725 |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
726 return frmsiz * 2; |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
727 } |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
728 |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
729 /* Unsupported bitstream version */ |
|
acb9faabab8d
Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents:
4310
diff
changeset
|
730 return 0; |
| 3059 | 731 } |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
732 #endif /* CONFIG_AC3_PARSER */ |
| 1613 | 733 |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
734 #ifdef CONFIG_AAC_PARSER |
| 3098 | 735 static int aac_sync(const uint8_t *buf, int *channels, int *sample_rate, |
| 736 int *bit_rate, int *samples) | |
| 737 { | |
| 738 GetBitContext bits; | |
| 739 int size, rdb, ch, sr; | |
| 740 | |
| 741 init_get_bits(&bits, buf, AAC_HEADER_SIZE * 8); | |
| 742 | |
| 743 if(get_bits(&bits, 12) != 0xfff) | |
| 744 return 0; | |
| 745 | |
| 3104 | 746 skip_bits1(&bits); /* id */ |
| 747 skip_bits(&bits, 2); /* layer */ | |
| 748 skip_bits1(&bits); /* protection_absent */ | |
| 749 skip_bits(&bits, 2); /* profile_objecttype */ | |
| 750 sr = get_bits(&bits, 4); /* sample_frequency_index */ | |
| 3098 | 751 if(!aac_sample_rates[sr]) |
| 752 return 0; | |
| 3104 | 753 skip_bits1(&bits); /* private_bit */ |
| 754 ch = get_bits(&bits, 3); /* channel_configuration */ | |
| 3098 | 755 if(!aac_channels[ch]) |
| 756 return 0; | |
| 3104 | 757 skip_bits1(&bits); /* original/copy */ |
| 758 skip_bits1(&bits); /* home */ | |
| 3098 | 759 |
| 760 /* adts_variable_header */ | |
| 3104 | 761 skip_bits1(&bits); /* copyright_identification_bit */ |
| 762 skip_bits1(&bits); /* copyright_identification_start */ | |
| 763 size = get_bits(&bits, 13); /* aac_frame_length */ | |
| 764 skip_bits(&bits, 11); /* adts_buffer_fullness */ | |
| 765 rdb = get_bits(&bits, 2); /* number_of_raw_data_blocks_in_frame */ | |
| 3098 | 766 |
| 767 *channels = aac_channels[ch]; | |
| 768 *sample_rate = aac_sample_rates[sr]; | |
| 769 *samples = (rdb + 1) * 1024; | |
| 770 *bit_rate = size * 8 * *sample_rate / *samples; | |
| 771 | |
| 772 return size; | |
| 773 } | |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
774 #endif /* CONFIG_AAC_PARSER */ |
| 3098 | 775 |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
776 #ifdef CONFIG_AC3_PARSER |
| 1613 | 777 static int ac3_parse_init(AVCodecParserContext *s1) |
| 778 { | |
| 779 AC3ParseContext *s = s1->priv_data; | |
| 780 s->inbuf_ptr = s->inbuf; | |
| 3098 | 781 s->header_size = AC3_HEADER_SIZE; |
| 782 s->sync = ac3_sync; | |
| 1613 | 783 return 0; |
| 784 } | |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
785 #endif |
| 1613 | 786 |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
787 #ifdef CONFIG_AAC_PARSER |
| 3098 | 788 static int aac_parse_init(AVCodecParserContext *s1) |
| 789 { | |
| 790 AC3ParseContext *s = s1->priv_data; | |
| 791 s->inbuf_ptr = s->inbuf; | |
| 792 s->header_size = AAC_HEADER_SIZE; | |
| 793 s->sync = aac_sync; | |
| 794 return 0; | |
| 795 } | |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
796 #endif |
| 3098 | 797 |
| 798 /* also used for ADTS AAC */ | |
| 1613 | 799 static int ac3_parse(AVCodecParserContext *s1, |
| 800 AVCodecContext *avctx, | |
| 2967 | 801 uint8_t **poutbuf, int *poutbuf_size, |
| 1613 | 802 const uint8_t *buf, int buf_size) |
| 803 { | |
| 804 AC3ParseContext *s = s1->priv_data; | |
| 805 const uint8_t *buf_ptr; | |
| 3098 | 806 int len, sample_rate, bit_rate, channels, samples; |
| 1613 | 807 |
| 808 *poutbuf = NULL; | |
| 809 *poutbuf_size = 0; | |
| 810 | |
| 811 buf_ptr = buf; | |
| 812 while (buf_size > 0) { | |
| 813 len = s->inbuf_ptr - s->inbuf; | |
| 814 if (s->frame_size == 0) { | |
| 3098 | 815 /* no header seen : find one. We need at least s->header_size |
| 816 bytes to parse it */ | |
| 817 len = FFMIN(s->header_size - len, buf_size); | |
| 3082 | 818 |
| 1613 | 819 memcpy(s->inbuf_ptr, buf_ptr, len); |
| 820 buf_ptr += len; | |
| 821 s->inbuf_ptr += len; | |
| 822 buf_size -= len; | |
| 3098 | 823 if ((s->inbuf_ptr - s->inbuf) == s->header_size) { |
| 824 len = s->sync(s->inbuf, &channels, &sample_rate, &bit_rate, | |
| 825 &samples); | |
| 1613 | 826 if (len == 0) { |
| 827 /* no sync found : move by one byte (inefficient, but simple!) */ | |
| 3098 | 828 memmove(s->inbuf, s->inbuf + 1, s->header_size - 1); |
| 1613 | 829 s->inbuf_ptr--; |
| 830 } else { | |
| 2979 | 831 s->frame_size = len; |
| 1613 | 832 /* update codec info */ |
| 833 avctx->sample_rate = sample_rate; | |
| 1987 | 834 /* set channels,except if the user explicitly requests 1 or 2 channels, XXX/FIXME this is a bit ugly */ |
| 3098 | 835 if(avctx->codec_id == CODEC_ID_AC3){ |
| 836 if(avctx->channels!=1 && avctx->channels!=2){ | |
| 837 avctx->channels = channels; | |
| 838 } | |
| 839 } else { | |
|
3063
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3059
diff
changeset
|
840 avctx->channels = channels; |
| 1987 | 841 } |
| 2979 | 842 avctx->bit_rate = bit_rate; |
| 3098 | 843 avctx->frame_size = samples; |
| 1613 | 844 } |
| 845 } | |
| 3082 | 846 } else { |
| 847 len = FFMIN(s->frame_size - len, buf_size); | |
| 1613 | 848 |
| 849 memcpy(s->inbuf_ptr, buf_ptr, len); | |
| 850 buf_ptr += len; | |
| 851 s->inbuf_ptr += len; | |
| 852 buf_size -= len; | |
| 3082 | 853 |
| 854 if(s->inbuf_ptr - s->inbuf == s->frame_size){ | |
| 855 *poutbuf = s->inbuf; | |
| 856 *poutbuf_size = s->frame_size; | |
| 857 s->inbuf_ptr = s->inbuf; | |
| 858 s->frame_size = 0; | |
| 859 break; | |
| 860 } | |
| 1613 | 861 } |
| 862 } | |
| 863 return buf_ptr - buf; | |
| 864 } | |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
865 #endif /* CONFIG_AC3_PARSER || CONFIG_AAC_PARSER */ |
| 1613 | 866 |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
867 #ifdef CONFIG_MPEG4VIDEO_PARSER |
| 1613 | 868 AVCodecParser mpeg4video_parser = { |
| 869 { CODEC_ID_MPEG4 }, | |
| 870 sizeof(ParseContext1), | |
| 871 mpeg4video_parse_init, | |
| 872 mpeg4video_parse, | |
|
4150
2205aefb22b7
move AVCodecParser prototypes and definitions to parser.h, and move mpegvideo parser to mpeg12.c
bcoudurier
parents:
4146
diff
changeset
|
873 ff_parse1_close, |
|
4175
b3328ed50a5e
make mpeg4video_split public as ff_mpeg4video_split
stefang
parents:
4150
diff
changeset
|
874 ff_mpeg4video_split, |
| 1613 | 875 }; |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
876 #endif |
|
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
877 #ifdef CONFIG_MPEGAUDIO_PARSER |
| 1613 | 878 AVCodecParser mpegaudio_parser = { |
| 879 { CODEC_ID_MP2, CODEC_ID_MP3 }, | |
| 880 sizeof(MpegAudioParseContext), | |
| 881 mpegaudio_parse_init, | |
| 882 mpegaudio_parse, | |
| 883 NULL, | |
| 884 }; | |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
885 #endif |
|
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
886 #ifdef CONFIG_AC3_PARSER |
| 1613 | 887 AVCodecParser ac3_parser = { |
| 888 { CODEC_ID_AC3 }, | |
| 889 sizeof(AC3ParseContext), | |
| 890 ac3_parse_init, | |
| 891 ac3_parse, | |
| 892 NULL, | |
| 893 }; | |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
894 #endif |
|
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
895 #ifdef CONFIG_AAC_PARSER |
| 3098 | 896 AVCodecParser aac_parser = { |
| 897 { CODEC_ID_AAC }, | |
| 898 sizeof(AC3ParseContext), | |
| 899 aac_parse_init, | |
| 900 ac3_parse, | |
| 901 NULL, | |
| 902 }; | |
|
3455
cc4b4ea83e29
--enable/disable parsers. Warning: some combinations are broken.
mru
parents:
3432
diff
changeset
|
903 #endif |
