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, halfratecod;
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 <= 10) { /* 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 halfratecod = FFMAX(bsid, 8) - 8;
690 *sample_rate = ac3_sample_rates[fscod] >> halfratecod;
691 *bit_rate = (ac3_bitrates[frmsizecod] * 1000) >> halfratecod;
692 *channels = ac3_channels[acmod] + lfeon;
695 return ac3_frame_sizes[frmsizecod][fscod] * 2;
696 } else if (bsid > 10 && bsid <= 16) { /* Enhanced AC-3 */
697 strmtyp = get_bits(&bits, 2);
698 substreamid = get_bits(&bits, 3);
700 if (strmtyp != 0 || substreamid != 0)
701 return 0; /* Currently don't support additional streams */
703 frmsiz = get_bits(&bits, 11) + 1;
704 fscod = get_bits(&bits, 2);
706 fscod2 = get_bits(&bits, 2);
712 *sample_rate = ac3_sample_rates[fscod2] / 2;
714 numblkscod = get_bits(&bits, 2);
716 *sample_rate = ac3_sample_rates[fscod];
719 acmod = get_bits(&bits, 3);
720 lfeon = get_bits1(&bits);
722 *samples = eac3_blocks[numblkscod] * 256;
723 *bit_rate = frmsiz * (*sample_rate) * 16 / (*samples);
724 *channels = ac3_channels[acmod] + lfeon;
729 /* Unsupported bitstream version */
732 #endif /* CONFIG_AC3_PARSER */
734 #ifdef CONFIG_AAC_PARSER
735 static int aac_sync(const uint8_t *buf, int *channels, int *sample_rate,
736 int *bit_rate, int *samples)
739 int size, rdb, ch, sr;
741 init_get_bits(&bits, buf, AAC_HEADER_SIZE * 8);
743 if(get_bits(&bits, 12) != 0xfff)
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 */
751 if(!aac_sample_rates[sr])
753 skip_bits1(&bits); /* private_bit */
754 ch = get_bits(&bits, 3); /* channel_configuration */
755 if(!aac_channels[ch])
757 skip_bits1(&bits); /* original/copy */
758 skip_bits1(&bits); /* home */
760 /* adts_variable_header */
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 */
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;
774 #endif /* CONFIG_AAC_PARSER */
776 #ifdef CONFIG_AC3_PARSER
777 static int ac3_parse_init(AVCodecParserContext *s1)
779 AC3ParseContext *s = s1->priv_data;
780 s->inbuf_ptr = s->inbuf;
781 s->header_size = AC3_HEADER_SIZE;
787 #ifdef CONFIG_AAC_PARSER
788 static int aac_parse_init(AVCodecParserContext *s1)
790 AC3ParseContext *s = s1->priv_data;
791 s->inbuf_ptr = s->inbuf;
792 s->header_size = AAC_HEADER_SIZE;
798 /* also used for ADTS AAC */
799 static int ac3_parse(AVCodecParserContext *s1,
800 AVCodecContext *avctx,
801 uint8_t **poutbuf, int *poutbuf_size,
802 const uint8_t *buf, int buf_size)
804 AC3ParseContext *s = s1->priv_data;
805 const uint8_t *buf_ptr;
806 int len, sample_rate, bit_rate, channels, samples;
812 while (buf_size > 0) {
813 len = s->inbuf_ptr - s->inbuf;
814 if (s->frame_size == 0) {
815 /* no header seen : find one. We need at least s->header_size
817 len = FFMIN(s->header_size - len, buf_size);
819 memcpy(s->inbuf_ptr, buf_ptr, len);
823 if ((s->inbuf_ptr - s->inbuf) == s->header_size) {
824 len = s->sync(s->inbuf, &channels, &sample_rate, &bit_rate,
827 /* no sync found : move by one byte (inefficient, but simple!) */
828 memmove(s->inbuf, s->inbuf + 1, s->header_size - 1);
832 /* update codec info */
833 avctx->sample_rate = sample_rate;
834 /* set channels,except if the user explicitly requests 1 or 2 channels, XXX/FIXME this is a bit ugly */
835 if(avctx->codec_id == CODEC_ID_AC3){
836 if(avctx->channels!=1 && avctx->channels!=2){
837 avctx->channels = channels;
840 avctx->channels = channels;
842 avctx->bit_rate = bit_rate;
843 avctx->frame_size = samples;
847 len = FFMIN(s->frame_size - len, buf_size);
849 memcpy(s->inbuf_ptr, buf_ptr, len);
854 if(s->inbuf_ptr - s->inbuf == s->frame_size){
856 *poutbuf_size = s->frame_size;
857 s->inbuf_ptr = s->inbuf;
863 return buf_ptr - buf;
865 #endif /* CONFIG_AC3_PARSER || CONFIG_AAC_PARSER */
867 #ifdef CONFIG_MPEG4VIDEO_PARSER
868 AVCodecParser mpeg4video_parser = {
870 sizeof(ParseContext1),
871 mpeg4video_parse_init,
877 #ifdef CONFIG_MPEGAUDIO_PARSER
878 AVCodecParser mpegaudio_parser = {
879 { CODEC_ID_MP2, CODEC_ID_MP3 },
880 sizeof(MpegAudioParseContext),
881 mpegaudio_parse_init,
886 #ifdef CONFIG_AC3_PARSER
887 AVCodecParser ac3_parser = {
889 sizeof(AC3ParseContext),
895 #ifdef CONFIG_AAC_PARSER
896 AVCodecParser aac_parser = {
898 sizeof(AC3ParseContext),