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);
72 s->pict_type = FF_I_TYPE;
79 * @param buf_size input length, to signal EOF, this should be 0 (so that the last frame can be output)
80 * @param pts input presentation timestamp
81 * @param dts input decoding timestamp
82 * @param poutbuf will contain a pointer to the first byte of the output frame
83 * @param poutbuf_size will contain the length of the output frame
84 * @return the number of bytes of the input bitstream used
89 * len = av_parser_parse(myparser, AVCodecContext, &data, &size,
96 * decode_frame(data, size);
100 int av_parser_parse(AVCodecParserContext *s,
101 AVCodecContext *avctx,
102 uint8_t **poutbuf, int *poutbuf_size,
103 const uint8_t *buf, int buf_size,
104 int64_t pts, int64_t dts)
107 uint8_t dummy_buf[FF_INPUT_BUFFER_PADDING_SIZE];
110 /* padding is always necessary even if EOF, so we add it here */
111 memset(dummy_buf, 0, sizeof(dummy_buf));
114 /* add a new packet descriptor */
115 k = (s->cur_frame_start_index + 1) & (AV_PARSER_PTS_NB - 1);
116 s->cur_frame_start_index = k;
117 s->cur_frame_offset[k] = s->cur_offset;
118 s->cur_frame_pts[k] = pts;
119 s->cur_frame_dts[k] = dts;
121 /* fill first PTS/DTS */
122 if (s->fetch_timestamp){
123 s->fetch_timestamp=0;
127 s->cur_frame_pts[k] =
128 s->cur_frame_dts[k] = AV_NOPTS_VALUE;
132 /* WARNING: the returned index can be negative */
133 index = s->parser->parser_parse(s, avctx, poutbuf, poutbuf_size, buf, buf_size);
134 //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);
135 /* update the file pointer */
137 /* fill the data for the current frame */
138 s->frame_offset = s->last_frame_offset;
139 s->pts = s->last_pts;
140 s->dts = s->last_dts;
141 s->offset = s->last_offset;
143 /* offset of the next frame */
144 s->last_frame_offset = s->cur_offset + index;
145 /* find the packet in which the new frame starts. It
146 is tricky because of MPEG video start codes
147 which can begin in one packet and finish in
148 another packet. In the worst case, an MPEG
149 video start code could be in 4 different
151 k = s->cur_frame_start_index;
152 for(i = 0; i < AV_PARSER_PTS_NB; i++) {
153 if (s->last_frame_offset >= s->cur_frame_offset[k])
155 k = (k - 1) & (AV_PARSER_PTS_NB - 1);
158 s->last_pts = s->cur_frame_pts[k];
159 s->last_dts = s->cur_frame_dts[k];
160 s->last_offset = s->last_frame_offset - s->cur_frame_offset[k];
162 /* some parsers tell us the packet size even before seeing the first byte of the next packet,
163 so the next pts/dts is in the next chunk */
164 if(index == buf_size){
165 s->fetch_timestamp=1;
170 s->cur_offset += index;
176 * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed
177 * @deprecated use AVBitstreamFilter
179 int av_parser_change(AVCodecParserContext *s,
180 AVCodecContext *avctx,
181 uint8_t **poutbuf, int *poutbuf_size,
182 const uint8_t *buf, int buf_size, int keyframe){
184 if(s && s->parser->split){
185 if((avctx->flags & CODEC_FLAG_GLOBAL_HEADER) || (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER)){
186 int i= s->parser->split(avctx, buf, buf_size);
192 /* cast to avoid warning about discarding qualifiers */
193 *poutbuf= (uint8_t *) buf;
194 *poutbuf_size= buf_size;
195 if(avctx->extradata){
196 if( (keyframe && (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER))
197 /*||(s->pict_type != I_TYPE && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_NOKEY))*/
198 /*||(? && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_BEGIN)*/){
199 int size= buf_size + avctx->extradata_size;
201 *poutbuf= av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
203 memcpy(*poutbuf, avctx->extradata, avctx->extradata_size);
204 memcpy((*poutbuf) + avctx->extradata_size, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
212 void av_parser_close(AVCodecParserContext *s)
214 if (s->parser->parser_close)
215 s->parser->parser_close(s);
216 av_free(s->priv_data);
220 /*****************************************************/
223 * combines the (truncated) bitstream to a complete frame
224 * @returns -1 if no complete frame could be created
226 int ff_combine_frame(ParseContext *pc, int next, uint8_t **buf, int *buf_size)
230 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
231 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
235 /* Copy overread bytes from last frame into buffer. */
236 for(; pc->overread>0; pc->overread--){
237 pc->buffer[pc->index++]= pc->buffer[pc->overread_index++];
240 /* flush remaining if EOF */
241 if(!*buf_size && next == END_NOT_FOUND){
245 pc->last_index= pc->index;
247 /* copy into buffer end return */
248 if(next == END_NOT_FOUND){
249 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, (*buf_size) + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
251 memcpy(&pc->buffer[pc->index], *buf, *buf_size);
252 pc->index += *buf_size;
257 pc->overread_index= pc->index + next;
259 /* append to buffer */
261 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, next + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
263 memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
268 /* store overread bytes */
269 for(;next < 0; next++){
270 pc->state = (pc->state<<8) | pc->buffer[pc->last_index + next];
276 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
277 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
284 void ff_parse_close(AVCodecParserContext *s)
286 ParseContext *pc = s->priv_data;
291 void ff_parse1_close(AVCodecParserContext *s)
293 ParseContext1 *pc1 = s->priv_data;
295 av_free(pc1->pc.buffer);
299 /*************************/
301 #ifdef CONFIG_MPEG4VIDEO_PARSER
303 /* XXX: make it use less memory */
304 static int av_mpeg4_decode_header(AVCodecParserContext *s1,
305 AVCodecContext *avctx,
306 const uint8_t *buf, int buf_size)
308 ParseContext1 *pc = s1->priv_data;
309 MpegEncContext *s = pc->enc;
310 GetBitContext gb1, *gb = &gb1;
314 s->current_picture_ptr = &s->current_picture;
316 if (avctx->extradata_size && pc->first_picture){
317 init_get_bits(gb, avctx->extradata, avctx->extradata_size*8);
318 ret = ff_mpeg4_decode_picture_header(s, gb);
321 init_get_bits(gb, buf, 8 * buf_size);
322 ret = ff_mpeg4_decode_picture_header(s, gb);
324 avcodec_set_dimensions(avctx, s->width, s->height);
326 s1->pict_type= s->pict_type;
327 pc->first_picture = 0;
331 static int mpeg4video_parse_init(AVCodecParserContext *s)
333 ParseContext1 *pc = s->priv_data;
335 pc->enc = av_mallocz(sizeof(MpegEncContext));
338 pc->first_picture = 1;
342 static int mpeg4video_parse(AVCodecParserContext *s,
343 AVCodecContext *avctx,
344 uint8_t **poutbuf, int *poutbuf_size,
345 const uint8_t *buf, int buf_size)
347 ParseContext *pc = s->priv_data;
350 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
353 next= ff_mpeg4_find_frame_end(pc, buf, buf_size);
355 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
361 av_mpeg4_decode_header(s, avctx, buf, buf_size);
363 *poutbuf = (uint8_t *)buf;
364 *poutbuf_size = buf_size;
369 int ff_mpeg4video_split(AVCodecContext *avctx,
370 const uint8_t *buf, int buf_size)
375 for(i=0; i<buf_size; i++){
376 state= (state<<8) | buf[i];
377 if(state == 0x1B3 || state == 0x1B6)
383 /*************************/
385 #ifdef CONFIG_MPEGAUDIO_PARSER
386 typedef struct MpegAudioParseContext {
387 uint8_t inbuf[MPA_MAX_CODED_FRAME_SIZE]; /* input buffer */
390 int free_format_frame_size;
391 int free_format_next_header;
394 } MpegAudioParseContext;
396 #define MPA_HEADER_SIZE 4
398 /* header + layer + bitrate + freq + lsf/mpeg25 */
399 #undef SAME_HEADER_MASK /* mpegaudio.h defines different version */
400 #define SAME_HEADER_MASK \
401 (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19))
403 static int mpegaudio_parse_init(AVCodecParserContext *s1)
405 MpegAudioParseContext *s = s1->priv_data;
406 s->inbuf_ptr = s->inbuf;
410 static int mpegaudio_parse(AVCodecParserContext *s1,
411 AVCodecContext *avctx,
412 uint8_t **poutbuf, int *poutbuf_size,
413 const uint8_t *buf, int buf_size)
415 MpegAudioParseContext *s = s1->priv_data;
418 const uint8_t *buf_ptr;
423 while (buf_size > 0) {
424 len = s->inbuf_ptr - s->inbuf;
425 if (s->frame_size == 0) {
426 /* special case for next header for first frame in free
427 format case (XXX: find a simpler method) */
428 if (s->free_format_next_header != 0) {
429 s->inbuf[0] = s->free_format_next_header >> 24;
430 s->inbuf[1] = s->free_format_next_header >> 16;
431 s->inbuf[2] = s->free_format_next_header >> 8;
432 s->inbuf[3] = s->free_format_next_header;
433 s->inbuf_ptr = s->inbuf + 4;
434 s->free_format_next_header = 0;
437 /* no header seen : find one. We need at least MPA_HEADER_SIZE
439 len = FFMIN(MPA_HEADER_SIZE - len, buf_size);
441 memcpy(s->inbuf_ptr, buf_ptr, len);
446 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) {
448 header = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
449 (s->inbuf[2] << 8) | s->inbuf[3];
451 ret = mpa_decode_header(avctx, header, &sr);
454 /* no sync found : move by one byte (inefficient, but simple!) */
455 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
457 dprintf(avctx, "skip %x\n", header);
458 /* reset free format frame size to give a chance
459 to get a new bitrate */
460 s->free_format_frame_size = 0;
462 if((header&SAME_HEADER_MASK) != (s->header&SAME_HEADER_MASK) && s->header)
469 /* free format: prepare to compute frame size */
470 if (decode_header(s, header) == 1) {
475 if(s->header_count > 1)
476 avctx->sample_rate= sr;
480 if (s->frame_size == -1) {
481 /* free format : find next sync to compute frame size */
482 len = MPA_MAX_CODED_FRAME_SIZE - len;
486 /* frame too long: resync */
488 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
495 memcpy(s->inbuf_ptr, buf_ptr, len);
496 /* check for header */
497 p = s->inbuf_ptr - 3;
498 pend = s->inbuf_ptr + len - 4;
500 header = (p[0] << 24) | (p[1] << 16) |
502 header1 = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
503 (s->inbuf[2] << 8) | s->inbuf[3];
504 /* check with high probability that we have a
506 if ((header & SAME_HEADER_MASK) ==
507 (header1 & SAME_HEADER_MASK)) {
508 /* header found: update pointers */
509 len = (p + 4) - s->inbuf_ptr;
513 /* compute frame size */
514 s->free_format_next_header = header;
515 s->free_format_frame_size = s->inbuf_ptr - s->inbuf;
516 padding = (header1 >> 9) & 1;
518 s->free_format_frame_size -= padding * 4;
520 s->free_format_frame_size -= padding;
521 dprintf(avctx, "free frame size=%d padding=%d\n",
522 s->free_format_frame_size, padding);
523 decode_header(s, header1);
528 /* not found: simply increase pointers */
535 if (len < s->frame_size) {
536 if (s->frame_size > MPA_MAX_CODED_FRAME_SIZE)
537 s->frame_size = MPA_MAX_CODED_FRAME_SIZE;
538 len = FFMIN(s->frame_size - len, buf_size);
539 memcpy(s->inbuf_ptr, buf_ptr, len);
545 if(s->frame_size > 0 && buf_ptr - buf == s->inbuf_ptr - s->inbuf
546 && buf_size + buf_ptr - buf >= s->frame_size){
547 if(s->header_count > 0){
549 *poutbuf_size = s->frame_size;
551 buf_ptr = buf + s->frame_size;
552 s->inbuf_ptr = s->inbuf;
558 if (s->frame_size > 0 &&
559 (s->inbuf_ptr - s->inbuf) >= s->frame_size) {
560 if(s->header_count > 0){
562 *poutbuf_size = s->inbuf_ptr - s->inbuf;
564 s->inbuf_ptr = s->inbuf;
569 return buf_ptr - buf;
571 #endif /* CONFIG_MPEGAUDIO_PARSER */
573 #if defined(CONFIG_AC3_PARSER) || defined(CONFIG_AAC_PARSER)
574 /* also used for ADTS AAC */
575 typedef struct AC3ParseContext {
579 int (*sync)(const uint8_t *buf, int *channels, int *sample_rate,
580 int *bit_rate, int *samples);
581 uint8_t inbuf[8192]; /* input buffer */
584 #define AC3_HEADER_SIZE 7
585 #define AAC_HEADER_SIZE 7
587 #ifdef CONFIG_AC3_PARSER
589 static const uint8_t eac3_blocks[4] = {
593 #endif /* CONFIG_AC3_PARSER */
595 #ifdef CONFIG_AAC_PARSER
596 static const int aac_sample_rates[16] = {
597 96000, 88200, 64000, 48000, 44100, 32000,
598 24000, 22050, 16000, 12000, 11025, 8000, 7350
601 static const int aac_channels[8] = {
602 0, 1, 2, 3, 4, 5, 6, 8
606 #ifdef CONFIG_AC3_PARSER
607 int ff_ac3_parse_header(const uint8_t buf[7], AC3HeaderInfo *hdr)
611 memset(hdr, 0, sizeof(*hdr));
613 init_get_bits(&gbc, buf, 54);
615 hdr->sync_word = get_bits(&gbc, 16);
616 if(hdr->sync_word != 0x0B77)
619 /* read ahead to bsid to make sure this is AC-3, not E-AC-3 */
620 hdr->bsid = show_bits_long(&gbc, 29) & 0x1F;
624 hdr->crc1 = get_bits(&gbc, 16);
625 hdr->fscod = get_bits(&gbc, 2);
629 hdr->frmsizecod = get_bits(&gbc, 6);
630 if(hdr->frmsizecod > 37)
633 skip_bits(&gbc, 5); // skip bsid, already got it
635 hdr->bsmod = get_bits(&gbc, 3);
636 hdr->acmod = get_bits(&gbc, 3);
637 if((hdr->acmod & 1) && hdr->acmod != 1) {
638 hdr->cmixlev = get_bits(&gbc, 2);
641 hdr->surmixlev = get_bits(&gbc, 2);
643 if(hdr->acmod == 2) {
644 hdr->dsurmod = get_bits(&gbc, 2);
646 hdr->lfeon = get_bits1(&gbc);
648 hdr->halfratecod = FFMAX(hdr->bsid, 8) - 8;
649 hdr->sample_rate = ff_ac3_freqs[hdr->fscod] >> hdr->halfratecod;
650 hdr->bit_rate = (ff_ac3_bitratetab[hdr->frmsizecod>>1] * 1000) >> hdr->halfratecod;
651 hdr->channels = ff_ac3_channels[hdr->acmod] + hdr->lfeon;
652 hdr->frame_size = ff_ac3_frame_sizes[hdr->frmsizecod][hdr->fscod] * 2;
657 static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
658 int *bit_rate, int *samples)
661 unsigned int fscod, acmod, bsid, lfeon;
662 unsigned int strmtyp, substreamid, frmsiz, fscod2, numblkscod;
666 err = ff_ac3_parse_header(buf, &hdr);
668 if(err < 0 && err != -2)
672 if(bsid <= 10) { /* Normal AC-3 */
673 *sample_rate = hdr.sample_rate;
674 *bit_rate = hdr.bit_rate;
675 *channels = hdr.channels;
676 *samples = AC3_FRAME_SIZE;
677 return hdr.frame_size;
678 } else if (bsid > 10 && bsid <= 16) { /* Enhanced AC-3 */
679 init_get_bits(&bits, &buf[2], (AC3_HEADER_SIZE-2) * 8);
680 strmtyp = get_bits(&bits, 2);
681 substreamid = get_bits(&bits, 3);
683 if (strmtyp != 0 || substreamid != 0)
684 return 0; /* Currently don't support additional streams */
686 frmsiz = get_bits(&bits, 11) + 1;
687 fscod = get_bits(&bits, 2);
689 fscod2 = get_bits(&bits, 2);
695 *sample_rate = ff_ac3_freqs[fscod2] / 2;
697 numblkscod = get_bits(&bits, 2);
699 *sample_rate = ff_ac3_freqs[fscod];
702 acmod = get_bits(&bits, 3);
703 lfeon = get_bits1(&bits);
705 *samples = eac3_blocks[numblkscod] * 256;
706 *bit_rate = frmsiz * (*sample_rate) * 16 / (*samples);
707 *channels = ff_ac3_channels[acmod] + lfeon;
712 /* Unsupported bitstream version */
715 #endif /* CONFIG_AC3_PARSER */
717 #ifdef CONFIG_AAC_PARSER
718 static int aac_sync(const uint8_t *buf, int *channels, int *sample_rate,
719 int *bit_rate, int *samples)
722 int size, rdb, ch, sr;
724 init_get_bits(&bits, buf, AAC_HEADER_SIZE * 8);
726 if(get_bits(&bits, 12) != 0xfff)
729 skip_bits1(&bits); /* id */
730 skip_bits(&bits, 2); /* layer */
731 skip_bits1(&bits); /* protection_absent */
732 skip_bits(&bits, 2); /* profile_objecttype */
733 sr = get_bits(&bits, 4); /* sample_frequency_index */
734 if(!aac_sample_rates[sr])
736 skip_bits1(&bits); /* private_bit */
737 ch = get_bits(&bits, 3); /* channel_configuration */
738 if(!aac_channels[ch])
740 skip_bits1(&bits); /* original/copy */
741 skip_bits1(&bits); /* home */
743 /* adts_variable_header */
744 skip_bits1(&bits); /* copyright_identification_bit */
745 skip_bits1(&bits); /* copyright_identification_start */
746 size = get_bits(&bits, 13); /* aac_frame_length */
747 skip_bits(&bits, 11); /* adts_buffer_fullness */
748 rdb = get_bits(&bits, 2); /* number_of_raw_data_blocks_in_frame */
750 *channels = aac_channels[ch];
751 *sample_rate = aac_sample_rates[sr];
752 *samples = (rdb + 1) * 1024;
753 *bit_rate = size * 8 * *sample_rate / *samples;
757 #endif /* CONFIG_AAC_PARSER */
759 #ifdef CONFIG_AC3_PARSER
760 static int ac3_parse_init(AVCodecParserContext *s1)
762 AC3ParseContext *s = s1->priv_data;
763 s->inbuf_ptr = s->inbuf;
764 s->header_size = AC3_HEADER_SIZE;
770 #ifdef CONFIG_AAC_PARSER
771 static int aac_parse_init(AVCodecParserContext *s1)
773 AC3ParseContext *s = s1->priv_data;
774 s->inbuf_ptr = s->inbuf;
775 s->header_size = AAC_HEADER_SIZE;
781 /* also used for ADTS AAC */
782 static int ac3_parse(AVCodecParserContext *s1,
783 AVCodecContext *avctx,
784 uint8_t **poutbuf, int *poutbuf_size,
785 const uint8_t *buf, int buf_size)
787 AC3ParseContext *s = s1->priv_data;
788 const uint8_t *buf_ptr;
789 int len, sample_rate, bit_rate, channels, samples;
795 while (buf_size > 0) {
796 len = s->inbuf_ptr - s->inbuf;
797 if (s->frame_size == 0) {
798 /* no header seen : find one. We need at least s->header_size
800 len = FFMIN(s->header_size - len, buf_size);
802 memcpy(s->inbuf_ptr, buf_ptr, len);
806 if ((s->inbuf_ptr - s->inbuf) == s->header_size) {
807 len = s->sync(s->inbuf, &channels, &sample_rate, &bit_rate,
810 /* no sync found : move by one byte (inefficient, but simple!) */
811 memmove(s->inbuf, s->inbuf + 1, s->header_size - 1);
815 /* update codec info */
816 avctx->sample_rate = sample_rate;
817 /* set channels,except if the user explicitly requests 1 or 2 channels, XXX/FIXME this is a bit ugly */
818 if(avctx->codec_id == CODEC_ID_AC3){
819 if(avctx->channels!=1 && avctx->channels!=2){
820 avctx->channels = channels;
823 avctx->channels = channels;
825 avctx->bit_rate = bit_rate;
826 avctx->frame_size = samples;
830 len = FFMIN(s->frame_size - len, buf_size);
832 memcpy(s->inbuf_ptr, buf_ptr, len);
837 if(s->inbuf_ptr - s->inbuf == s->frame_size){
839 *poutbuf_size = s->frame_size;
840 s->inbuf_ptr = s->inbuf;
846 return buf_ptr - buf;
848 #endif /* CONFIG_AC3_PARSER || CONFIG_AAC_PARSER */
850 #ifdef CONFIG_MPEG4VIDEO_PARSER
851 AVCodecParser mpeg4video_parser = {
853 sizeof(ParseContext1),
854 mpeg4video_parse_init,
860 #ifdef CONFIG_MPEGAUDIO_PARSER
861 AVCodecParser mpegaudio_parser = {
862 { CODEC_ID_MP2, CODEC_ID_MP3 },
863 sizeof(MpegAudioParseContext),
864 mpegaudio_parse_init,
869 #ifdef CONFIG_AC3_PARSER
870 AVCodecParser ac3_parser = {
872 sizeof(AC3ParseContext),
878 #ifdef CONFIG_AAC_PARSER
879 AVCodecParser aac_parser = {
881 sizeof(AC3ParseContext),