2 * Audio and Video frame extraction
3 * Copyright (c) 2003 Fabrice Bellard.
4 * Copyright (c) 2003 Michael Niedermayer.
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
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.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #include "mpegvideo.h"
24 #include "mpegaudio.h"
27 AVCodecParser *av_first_parser = NULL;
29 void av_register_codec_parser(AVCodecParser *parser)
31 parser->next = av_first_parser;
32 av_first_parser = parser;
35 AVCodecParserContext *av_parser_init(int codec_id)
37 AVCodecParserContext *s;
38 AVCodecParser *parser;
41 if(codec_id == CODEC_ID_NONE)
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 ||
47 parser->codec_ids[2] == codec_id ||
48 parser->codec_ids[3] == codec_id ||
49 parser->codec_ids[4] == codec_id)
54 s = av_mallocz(sizeof(AVCodecParserContext));
58 s->priv_data = av_mallocz(parser->priv_data_size);
63 if (parser->parser_init) {
64 ret = parser->parser_init(s);
66 av_free(s->priv_data);
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
88 * len = av_parser_parse(myparser, AVCodecContext, &data, &size,
95 * decode_frame(data, size);
99 int av_parser_parse(AVCodecParserContext *s,
100 AVCodecContext *avctx,
101 uint8_t **poutbuf, int *poutbuf_size,
102 const uint8_t *buf, int buf_size,
103 int64_t pts, int64_t dts)
106 uint8_t dummy_buf[FF_INPUT_BUFFER_PADDING_SIZE];
109 /* padding is always necessary even if EOF, so we add it here */
110 memset(dummy_buf, 0, sizeof(dummy_buf));
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;
120 /* fill first PTS/DTS */
121 if (s->fetch_timestamp){
122 s->fetch_timestamp=0;
125 s->cur_frame_pts[k] =
126 s->cur_frame_dts[k] = AV_NOPTS_VALUE;
130 /* WARNING: the returned index can be negative */
131 index = s->parser->parser_parse(s, avctx, poutbuf, poutbuf_size, buf, buf_size);
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);
133 /* update the file pointer */
135 /* fill the data for the current frame */
136 s->frame_offset = s->last_frame_offset;
137 s->pts = s->last_pts;
138 s->dts = s->last_dts;
140 /* offset of the next frame */
141 s->last_frame_offset = s->cur_offset + index;
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
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])
152 k = (k - 1) & (AV_PARSER_PTS_NB - 1);
155 s->last_pts = s->cur_frame_pts[k];
156 s->last_dts = s->cur_frame_dts[k];
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;
166 s->cur_offset += index;
172 * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed
173 * @deprecated use AVBitstreamFilter
175 int av_parser_change(AVCodecParserContext *s,
176 AVCodecContext *avctx,
177 uint8_t **poutbuf, int *poutbuf_size,
178 const uint8_t *buf, int buf_size, int keyframe){
180 if(s && s->parser->split){
181 if((avctx->flags & CODEC_FLAG_GLOBAL_HEADER) || (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER)){
182 int i= s->parser->split(avctx, buf, buf_size);
188 /* cast to avoid warning about discarding qualifiers */
189 *poutbuf= (uint8_t *) buf;
190 *poutbuf_size= buf_size;
191 if(avctx->extradata){
192 if( (keyframe && (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER))
193 /*||(s->pict_type != I_TYPE && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_NOKEY))*/
194 /*||(? && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_BEGIN)*/){
195 int size= buf_size + avctx->extradata_size;
197 *poutbuf= av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
199 memcpy(*poutbuf, avctx->extradata, avctx->extradata_size);
200 memcpy((*poutbuf) + avctx->extradata_size, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
208 void av_parser_close(AVCodecParserContext *s)
210 if (s->parser->parser_close)
211 s->parser->parser_close(s);
212 av_free(s->priv_data);
216 /*****************************************************/
219 * combines the (truncated) bitstream to a complete frame
220 * @returns -1 if no complete frame could be created
222 int ff_combine_frame(ParseContext *pc, int next, uint8_t **buf, int *buf_size)
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]);
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++];
236 /* flush remaining if EOF */
237 if(!*buf_size && next == END_NOT_FOUND){
241 pc->last_index= pc->index;
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);
247 memcpy(&pc->buffer[pc->index], *buf, *buf_size);
248 pc->index += *buf_size;
253 pc->overread_index= pc->index + next;
255 /* append to buffer */
257 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, next + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
259 memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
264 /* store overread bytes */
265 for(;next < 0; next++){
266 pc->state = (pc->state<<8) | pc->buffer[pc->last_index + next];
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]);
280 void ff_parse_close(AVCodecParserContext *s)
282 ParseContext *pc = s->priv_data;
287 void ff_parse1_close(AVCodecParserContext *s)
289 ParseContext1 *pc1 = s->priv_data;
291 av_free(pc1->pc.buffer);
295 /*************************/
297 #ifdef CONFIG_MPEG4VIDEO_PARSER
299 /* XXX: make it use less memory */
300 static int av_mpeg4_decode_header(AVCodecParserContext *s1,
301 AVCodecContext *avctx,
302 const uint8_t *buf, int buf_size)
304 ParseContext1 *pc = s1->priv_data;
305 MpegEncContext *s = pc->enc;
306 GetBitContext gb1, *gb = &gb1;
310 s->current_picture_ptr = &s->current_picture;
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);
317 init_get_bits(gb, buf, 8 * buf_size);
318 ret = ff_mpeg4_decode_picture_header(s, gb);
320 avcodec_set_dimensions(avctx, s->width, s->height);
322 s1->pict_type= s->pict_type;
323 pc->first_picture = 0;
327 static int mpeg4video_parse_init(AVCodecParserContext *s)
329 ParseContext1 *pc = s->priv_data;
331 pc->enc = av_mallocz(sizeof(MpegEncContext));
334 pc->first_picture = 1;
338 static int mpeg4video_parse(AVCodecParserContext *s,
339 AVCodecContext *avctx,
340 uint8_t **poutbuf, int *poutbuf_size,
341 const uint8_t *buf, int buf_size)
343 ParseContext *pc = s->priv_data;
346 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
349 next= ff_mpeg4_find_frame_end(pc, buf, buf_size);
351 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
357 av_mpeg4_decode_header(s, avctx, buf, buf_size);
359 *poutbuf = (uint8_t *)buf;
360 *poutbuf_size = buf_size;
365 int ff_mpeg4video_split(AVCodecContext *avctx,
366 const uint8_t *buf, int buf_size)
371 for(i=0; i<buf_size; i++){
372 state= (state<<8) | buf[i];
373 if(state == 0x1B3 || state == 0x1B6)
379 /*************************/
381 #ifdef CONFIG_MPEGAUDIO_PARSER
382 typedef struct MpegAudioParseContext {
383 uint8_t inbuf[MPA_MAX_CODED_FRAME_SIZE]; /* input buffer */
386 int free_format_frame_size;
387 int free_format_next_header;
390 } MpegAudioParseContext;
392 #define MPA_HEADER_SIZE 4
394 /* header + layer + bitrate + freq + lsf/mpeg25 */
395 #undef SAME_HEADER_MASK /* mpegaudio.h defines different version */
396 #define SAME_HEADER_MASK \
397 (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19))
399 static int mpegaudio_parse_init(AVCodecParserContext *s1)
401 MpegAudioParseContext *s = s1->priv_data;
402 s->inbuf_ptr = s->inbuf;
406 static int mpegaudio_parse(AVCodecParserContext *s1,
407 AVCodecContext *avctx,
408 uint8_t **poutbuf, int *poutbuf_size,
409 const uint8_t *buf, int buf_size)
411 MpegAudioParseContext *s = s1->priv_data;
414 const uint8_t *buf_ptr;
419 while (buf_size > 0) {
420 len = s->inbuf_ptr - s->inbuf;
421 if (s->frame_size == 0) {
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;
433 /* no header seen : find one. We need at least MPA_HEADER_SIZE
435 len = FFMIN(MPA_HEADER_SIZE - len, buf_size);
437 memcpy(s->inbuf_ptr, buf_ptr, len);
442 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) {
444 header = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
445 (s->inbuf[2] << 8) | s->inbuf[3];
447 ret = mpa_decode_header(avctx, header, &sr);
450 /* no sync found : move by one byte (inefficient, but simple!) */
451 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
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;
458 if((header&SAME_HEADER_MASK) != (s->header&SAME_HEADER_MASK) && s->header)
465 /* free format: prepare to compute frame size */
466 if (decode_header(s, header) == 1) {
471 if(s->header_count > 1)
472 avctx->sample_rate= sr;
476 if (s->frame_size == -1) {
477 /* free format : find next sync to compute frame size */
478 len = MPA_MAX_CODED_FRAME_SIZE - len;
482 /* frame too long: resync */
484 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
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;
496 header = (p[0] << 24) | (p[1] << 16) |
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
502 if ((header & SAME_HEADER_MASK) ==
503 (header1 & SAME_HEADER_MASK)) {
504 /* header found: update pointers */
505 len = (p + 4) - s->inbuf_ptr;
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;
514 s->free_format_frame_size -= padding * 4;
516 s->free_format_frame_size -= padding;
517 dprintf("free frame size=%d padding=%d\n",
518 s->free_format_frame_size, padding);
519 decode_header(s, header1);
524 /* not found: simply increase pointers */
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;
534 len = FFMIN(s->frame_size - len, buf_size);
535 memcpy(s->inbuf_ptr, buf_ptr, len);
541 if(s->frame_size > 0 && buf_ptr - buf == s->inbuf_ptr - s->inbuf
542 && buf_size + buf_ptr - buf >= s->frame_size){
543 if(s->header_count > 0){
545 *poutbuf_size = s->frame_size;
547 buf_ptr = buf + s->frame_size;
548 s->inbuf_ptr = s->inbuf;
554 if (s->frame_size > 0 &&
555 (s->inbuf_ptr - s->inbuf) >= s->frame_size) {
556 if(s->header_count > 0){
558 *poutbuf_size = s->inbuf_ptr - s->inbuf;
560 s->inbuf_ptr = s->inbuf;
565 return buf_ptr - buf;
567 #endif /* CONFIG_MPEGAUDIO_PARSER */
569 #if defined(CONFIG_AC3_PARSER) || defined(CONFIG_AAC_PARSER)
570 /* also used for ADTS AAC */
571 typedef struct AC3ParseContext {
575 int (*sync)(const uint8_t *buf, int *channels, int *sample_rate,
576 int *bit_rate, int *samples);
577 uint8_t inbuf[8192]; /* input buffer */
580 #define AC3_HEADER_SIZE 7
581 #define AAC_HEADER_SIZE 7
583 #ifdef CONFIG_AC3_PARSER
584 static const int ac3_sample_rates[4] = {
585 48000, 44100, 32000, 0
588 static const int ac3_frame_sizes[64][3] = {
621 { 1024, 1114, 1536 },
622 { 1024, 1115, 1536 },
623 { 1152, 1253, 1728 },
624 { 1152, 1254, 1728 },
625 { 1280, 1393, 1920 },
626 { 1280, 1394, 1920 },
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,
635 static const uint8_t ac3_channels[8] = {
636 2, 1, 2, 3, 3, 4, 4, 5
639 static const uint8_t eac3_blocks[4] = {
643 #endif /* CONFIG_AC3_PARSER */
645 #ifdef CONFIG_AAC_PARSER
646 static const int aac_sample_rates[16] = {
647 96000, 88200, 64000, 48000, 44100, 32000,
648 24000, 22050, 16000, 12000, 11025, 8000, 7350
651 static const int aac_channels[8] = {
652 0, 1, 2, 3, 4, 5, 6, 8
656 #ifdef CONFIG_AC3_PARSER
657 static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
658 int *bit_rate, int *samples)
660 unsigned int fscod, frmsizecod, acmod, bsid, lfeon;
661 unsigned int strmtyp, substreamid, frmsiz, fscod2, numblkscod;
664 init_get_bits(&bits, buf, AC3_HEADER_SIZE * 8);
666 if(get_bits(&bits, 16) != 0x0b77)
669 bsid = show_bits_long(&bits, 29) & 0x1f;
670 if(bsid <= 8) { /* Normal AC-3 */
671 skip_bits(&bits, 16); /* crc */
672 fscod = get_bits(&bits, 2);
673 frmsizecod = get_bits(&bits, 6);
678 skip_bits(&bits, 5); /* bsid */
679 skip_bits(&bits, 3); /* bsmod */
680 acmod = get_bits(&bits, 3);
681 if(acmod & 1 && acmod != 1)
682 skip_bits(&bits, 2); /* cmixlev */
684 skip_bits(&bits, 2); /* surmixlev */
686 skip_bits(&bits, 2); /* dsurmod */
687 lfeon = get_bits1(&bits);
689 *sample_rate = ac3_sample_rates[fscod];
690 *bit_rate = ac3_bitrates[frmsizecod] * 1000;
691 *channels = ac3_channels[acmod] + lfeon;
694 return ac3_frame_sizes[frmsizecod][fscod] * 2;
695 } else if (bsid >= 10 && bsid <= 16) { /* Enhanced AC-3 */
696 strmtyp = get_bits(&bits, 2);
697 substreamid = get_bits(&bits, 3);
699 if (strmtyp != 0 || substreamid != 0)
700 return 0; /* Currently don't support additional streams */
702 frmsiz = get_bits(&bits, 11) + 1;
703 fscod = get_bits(&bits, 2);
705 fscod2 = get_bits(&bits, 2);
711 *sample_rate = ac3_sample_rates[fscod2] / 2;
713 numblkscod = get_bits(&bits, 2);
715 *sample_rate = ac3_sample_rates[fscod];
718 acmod = get_bits(&bits, 3);
719 lfeon = get_bits1(&bits);
721 *samples = eac3_blocks[numblkscod] * 256;
722 *bit_rate = frmsiz * (*sample_rate) * 16 / (*samples);
723 *channels = ac3_channels[acmod] + lfeon;
728 /* Unsupported bitstream version */
731 #endif /* CONFIG_AC3_PARSER */
733 #ifdef CONFIG_AAC_PARSER
734 static int aac_sync(const uint8_t *buf, int *channels, int *sample_rate,
735 int *bit_rate, int *samples)
738 int size, rdb, ch, sr;
740 init_get_bits(&bits, buf, AAC_HEADER_SIZE * 8);
742 if(get_bits(&bits, 12) != 0xfff)
745 skip_bits1(&bits); /* id */
746 skip_bits(&bits, 2); /* layer */
747 skip_bits1(&bits); /* protection_absent */
748 skip_bits(&bits, 2); /* profile_objecttype */
749 sr = get_bits(&bits, 4); /* sample_frequency_index */
750 if(!aac_sample_rates[sr])
752 skip_bits1(&bits); /* private_bit */
753 ch = get_bits(&bits, 3); /* channel_configuration */
754 if(!aac_channels[ch])
756 skip_bits1(&bits); /* original/copy */
757 skip_bits1(&bits); /* home */
759 /* adts_variable_header */
760 skip_bits1(&bits); /* copyright_identification_bit */
761 skip_bits1(&bits); /* copyright_identification_start */
762 size = get_bits(&bits, 13); /* aac_frame_length */
763 skip_bits(&bits, 11); /* adts_buffer_fullness */
764 rdb = get_bits(&bits, 2); /* number_of_raw_data_blocks_in_frame */
766 *channels = aac_channels[ch];
767 *sample_rate = aac_sample_rates[sr];
768 *samples = (rdb + 1) * 1024;
769 *bit_rate = size * 8 * *sample_rate / *samples;
773 #endif /* CONFIG_AAC_PARSER */
775 #ifdef CONFIG_AC3_PARSER
776 static int ac3_parse_init(AVCodecParserContext *s1)
778 AC3ParseContext *s = s1->priv_data;
779 s->inbuf_ptr = s->inbuf;
780 s->header_size = AC3_HEADER_SIZE;
786 #ifdef CONFIG_AAC_PARSER
787 static int aac_parse_init(AVCodecParserContext *s1)
789 AC3ParseContext *s = s1->priv_data;
790 s->inbuf_ptr = s->inbuf;
791 s->header_size = AAC_HEADER_SIZE;
797 /* also used for ADTS AAC */
798 static int ac3_parse(AVCodecParserContext *s1,
799 AVCodecContext *avctx,
800 uint8_t **poutbuf, int *poutbuf_size,
801 const uint8_t *buf, int buf_size)
803 AC3ParseContext *s = s1->priv_data;
804 const uint8_t *buf_ptr;
805 int len, sample_rate, bit_rate, channels, samples;
811 while (buf_size > 0) {
812 len = s->inbuf_ptr - s->inbuf;
813 if (s->frame_size == 0) {
814 /* no header seen : find one. We need at least s->header_size
816 len = FFMIN(s->header_size - len, buf_size);
818 memcpy(s->inbuf_ptr, buf_ptr, len);
822 if ((s->inbuf_ptr - s->inbuf) == s->header_size) {
823 len = s->sync(s->inbuf, &channels, &sample_rate, &bit_rate,
826 /* no sync found : move by one byte (inefficient, but simple!) */
827 memmove(s->inbuf, s->inbuf + 1, s->header_size - 1);
831 /* update codec info */
832 avctx->sample_rate = sample_rate;
833 /* set channels,except if the user explicitly requests 1 or 2 channels, XXX/FIXME this is a bit ugly */
834 if(avctx->codec_id == CODEC_ID_AC3){
835 if(avctx->channels!=1 && avctx->channels!=2){
836 avctx->channels = channels;
839 avctx->channels = channels;
841 avctx->bit_rate = bit_rate;
842 avctx->frame_size = samples;
846 len = FFMIN(s->frame_size - len, buf_size);
848 memcpy(s->inbuf_ptr, buf_ptr, len);
853 if(s->inbuf_ptr - s->inbuf == s->frame_size){
855 *poutbuf_size = s->frame_size;
856 s->inbuf_ptr = s->inbuf;
862 return buf_ptr - buf;
864 #endif /* CONFIG_AC3_PARSER || CONFIG_AAC_PARSER */
866 #ifdef CONFIG_MPEG4VIDEO_PARSER
867 AVCodecParser mpeg4video_parser = {
869 sizeof(ParseContext1),
870 mpeg4video_parse_init,
876 #ifdef CONFIG_MPEGAUDIO_PARSER
877 AVCodecParser mpegaudio_parser = {
878 { CODEC_ID_MP2, CODEC_ID_MP3 },
879 sizeof(MpegAudioParseContext),
880 mpegaudio_parse_init,
885 #ifdef CONFIG_AC3_PARSER
886 AVCodecParser ac3_parser = {
888 sizeof(AC3ParseContext),
894 #ifdef CONFIG_AAC_PARSER
895 AVCodecParser aac_parser = {
897 sizeof(AC3ParseContext),