2 * Audio and Video frame extraction
3 * Copyright (c) 2003 Fabrice Bellard.
4 * Copyright (c) 2003 Michael Niedermayer.
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 #include "mpegvideo.h"
22 #include "mpegaudio.h"
24 AVCodecParser *av_first_parser = NULL;
26 void av_register_codec_parser(AVCodecParser *parser)
28 parser->next = av_first_parser;
29 av_first_parser = parser;
32 AVCodecParserContext *av_parser_init(int codec_id)
34 AVCodecParserContext *s;
35 AVCodecParser *parser;
38 if(codec_id == CODEC_ID_NONE)
41 for(parser = av_first_parser; parser != NULL; parser = parser->next) {
42 if (parser->codec_ids[0] == codec_id ||
43 parser->codec_ids[1] == codec_id ||
44 parser->codec_ids[2] == codec_id ||
45 parser->codec_ids[3] == codec_id ||
46 parser->codec_ids[4] == codec_id)
51 s = av_mallocz(sizeof(AVCodecParserContext));
55 s->priv_data = av_mallocz(parser->priv_data_size);
60 if (parser->parser_init) {
61 ret = parser->parser_init(s);
63 av_free(s->priv_data);
72 /* NOTE: buf_size == 0 is used to signal EOF so that the last frame
73 can be returned if necessary */
74 int av_parser_parse(AVCodecParserContext *s,
75 AVCodecContext *avctx,
76 uint8_t **poutbuf, int *poutbuf_size,
77 const uint8_t *buf, int buf_size,
78 int64_t pts, int64_t dts)
81 uint8_t dummy_buf[FF_INPUT_BUFFER_PADDING_SIZE];
84 /* padding is always necessary even if EOF, so we add it here */
85 memset(dummy_buf, 0, sizeof(dummy_buf));
88 /* add a new packet descriptor */
89 k = (s->cur_frame_start_index + 1) & (AV_PARSER_PTS_NB - 1);
90 s->cur_frame_start_index = k;
91 s->cur_frame_offset[k] = s->cur_offset;
92 s->cur_frame_pts[k] = pts;
93 s->cur_frame_dts[k] = dts;
95 /* fill first PTS/DTS */
96 if (s->fetch_timestamp){
100 s->cur_frame_pts[k] =
101 s->cur_frame_dts[k] = AV_NOPTS_VALUE;
105 /* WARNING: the returned index can be negative */
106 index = s->parser->parser_parse(s, avctx, poutbuf, poutbuf_size, buf, buf_size);
107 //av_log(NULL, AV_LOG_DEBUG, "parser: in:%lld, %lld, out:%lld, %lld, in:%d out:%d id:%d\n", pts, dts, s->last_pts, s->last_dts, buf_size, *poutbuf_size, avctx->codec_id);
108 /* update the file pointer */
110 /* fill the data for the current frame */
111 s->frame_offset = s->last_frame_offset;
112 s->pts = s->last_pts;
113 s->dts = s->last_dts;
115 /* offset of the next frame */
116 s->last_frame_offset = s->cur_offset + index;
117 /* find the packet in which the new frame starts. It
118 is tricky because of MPEG video start codes
119 which can begin in one packet and finish in
120 another packet. In the worst case, an MPEG
121 video start code could be in 4 different
123 k = s->cur_frame_start_index;
124 for(i = 0; i < AV_PARSER_PTS_NB; i++) {
125 if (s->last_frame_offset >= s->cur_frame_offset[k])
127 k = (k - 1) & (AV_PARSER_PTS_NB - 1);
130 s->last_pts = s->cur_frame_pts[k];
131 s->last_dts = s->cur_frame_dts[k];
133 /* some parsers tell us the packet size even before seeing the first byte of the next packet,
134 so the next pts/dts is in the next chunk */
135 if(index == buf_size){
136 s->fetch_timestamp=1;
141 s->cur_offset += index;
147 * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed
149 int av_parser_change(AVCodecParserContext *s,
150 AVCodecContext *avctx,
151 uint8_t **poutbuf, int *poutbuf_size,
152 const uint8_t *buf, int buf_size, int keyframe){
154 if(s && s->parser->split){
155 if((avctx->flags & CODEC_FLAG_GLOBAL_HEADER) || (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER)){
156 int i= s->parser->split(avctx, buf, buf_size);
162 /* cast to avoid warning about discarding qualifiers */
163 *poutbuf= (uint8_t *) buf;
164 *poutbuf_size= buf_size;
165 if(avctx->extradata){
166 if( (keyframe && (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER))
167 /*||(s->pict_type != I_TYPE && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_NOKEY))*/
168 /*||(? && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_BEGIN)*/){
169 int size= buf_size + avctx->extradata_size;
171 *poutbuf= av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
173 memcpy(*poutbuf, avctx->extradata, avctx->extradata_size);
174 memcpy((*poutbuf) + avctx->extradata_size, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
182 void av_parser_close(AVCodecParserContext *s)
184 if (s->parser->parser_close)
185 s->parser->parser_close(s);
186 av_free(s->priv_data);
190 /*****************************************************/
192 //#define END_NOT_FOUND (-100)
194 #define PICTURE_START_CODE 0x00000100
195 #define SEQ_START_CODE 0x000001b3
196 #define EXT_START_CODE 0x000001b5
197 #define SLICE_MIN_START_CODE 0x00000101
198 #define SLICE_MAX_START_CODE 0x000001af
200 typedef struct ParseContext1{
202 /* XXX/FIXME PC1 vs. PC */
205 int progressive_sequence;
208 /* XXX: suppress that, needed by MPEG4 */
214 * combines the (truncated) bitstream to a complete frame
215 * @returns -1 if no complete frame could be created
217 int ff_combine_frame(ParseContext *pc, int next, uint8_t **buf, int *buf_size)
221 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
222 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
226 /* copy overreaded bytes from last frame into buffer */
227 for(; pc->overread>0; pc->overread--){
228 pc->buffer[pc->index++]= pc->buffer[pc->overread_index++];
231 /* flush remaining if EOF */
232 if(!*buf_size && next == END_NOT_FOUND){
236 pc->last_index= pc->index;
238 /* copy into buffer end return */
239 if(next == END_NOT_FOUND){
240 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, (*buf_size) + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
242 memcpy(&pc->buffer[pc->index], *buf, *buf_size);
243 pc->index += *buf_size;
248 pc->overread_index= pc->index + next;
250 /* append to buffer */
252 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, next + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
254 memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
259 /* store overread bytes */
260 for(;next < 0; next++){
261 pc->state = (pc->state<<8) | pc->buffer[pc->last_index + next];
267 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
268 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
275 /* XXX: merge with libavcodec ? */
276 #define MPEG1_FRAME_RATE_BASE 1001
278 static const int frame_rate_tab[16] = {
290 // libmpeg3's "Unofficial economy rates": (10-13)
295 // random, just to avoid segfault !never encode these
300 //FIXME move into mpeg12.c
301 static void mpegvideo_extract_headers(AVCodecParserContext *s,
302 AVCodecContext *avctx,
303 const uint8_t *buf, int buf_size)
305 ParseContext1 *pc = s->priv_data;
306 const uint8_t *buf_end;
308 int frame_rate_index, ext_type, bytes_left;
309 int frame_rate_ext_n, frame_rate_ext_d;
310 int picture_structure, top_field_first, repeat_first_field, progressive_frame;
311 int horiz_size_ext, vert_size_ext, bit_rate_ext;
312 //FIXME replace the crap with get_bits()
314 buf_end = buf + buf_size;
315 while (buf < buf_end) {
317 buf= ff_find_start_code(buf, buf_end, &start_code);
318 bytes_left = buf_end - buf;
320 case PICTURE_START_CODE:
321 if (bytes_left >= 2) {
322 s->pict_type = (buf[1] >> 3) & 7;
326 if (bytes_left >= 7) {
327 pc->width = (buf[0] << 4) | (buf[1] >> 4);
328 pc->height = ((buf[1] & 0x0f) << 8) | buf[2];
329 avcodec_set_dimensions(avctx, pc->width, pc->height);
330 frame_rate_index = buf[3] & 0xf;
331 pc->frame_rate = avctx->time_base.den = frame_rate_tab[frame_rate_index];
332 avctx->time_base.num = MPEG1_FRAME_RATE_BASE;
333 avctx->bit_rate = ((buf[4]<<10) | (buf[5]<<2) | (buf[6]>>6))*400;
334 avctx->codec_id = CODEC_ID_MPEG1VIDEO;
339 if (bytes_left >= 1) {
340 ext_type = (buf[0] >> 4);
342 case 0x1: /* sequence extension */
343 if (bytes_left >= 6) {
344 horiz_size_ext = ((buf[1] & 1) << 1) | (buf[2] >> 7);
345 vert_size_ext = (buf[2] >> 5) & 3;
346 bit_rate_ext = ((buf[2] & 0x1F)<<7) | (buf[3]>>1);
347 frame_rate_ext_n = (buf[5] >> 5) & 3;
348 frame_rate_ext_d = (buf[5] & 0x1f);
349 pc->progressive_sequence = buf[1] & (1 << 3);
350 avctx->has_b_frames= !(buf[5] >> 7);
352 pc->width |=(horiz_size_ext << 12);
353 pc->height |=( vert_size_ext << 12);
354 avctx->bit_rate += (bit_rate_ext << 18) * 400;
355 avcodec_set_dimensions(avctx, pc->width, pc->height);
356 avctx->time_base.den = pc->frame_rate * (frame_rate_ext_n + 1);
357 avctx->time_base.num = MPEG1_FRAME_RATE_BASE * (frame_rate_ext_d + 1);
358 avctx->codec_id = CODEC_ID_MPEG2VIDEO;
359 avctx->sub_id = 2; /* forces MPEG2 */
362 case 0x8: /* picture coding extension */
363 if (bytes_left >= 5) {
364 picture_structure = buf[2]&3;
365 top_field_first = buf[3] & (1 << 7);
366 repeat_first_field = buf[3] & (1 << 1);
367 progressive_frame = buf[4] & (1 << 7);
369 /* check if we must repeat the frame */
370 if (repeat_first_field) {
371 if (pc->progressive_sequence) {
376 } else if (progressive_frame) {
381 /* the packet only represents half a frame
382 XXX,FIXME maybe find a different solution */
383 if(picture_structure != 3)
393 /* we stop parsing when we encounter a slice. It ensures
394 that this function takes a negligible amount of time */
395 if (start_code >= SLICE_MIN_START_CODE &&
396 start_code <= SLICE_MAX_START_CODE)
404 static int mpegvideo_parse(AVCodecParserContext *s,
405 AVCodecContext *avctx,
406 uint8_t **poutbuf, int *poutbuf_size,
407 const uint8_t *buf, int buf_size)
409 ParseContext1 *pc1 = s->priv_data;
410 ParseContext *pc= &pc1->pc;
413 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
416 next= ff_mpeg1_find_frame_end(pc, buf, buf_size);
418 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
425 /* we have a full frame : we just parse the first few MPEG headers
426 to have the full timing information. The time take by this
427 function should be negligible for uncorrupted streams */
428 mpegvideo_extract_headers(s, avctx, buf, buf_size);
430 printf("pict_type=%d frame_rate=%0.3f repeat_pict=%d\n",
431 s->pict_type, (double)avctx->time_base.den / avctx->time_base.num, s->repeat_pict);
434 *poutbuf = (uint8_t *)buf;
435 *poutbuf_size = buf_size;
439 static int mpegvideo_split(AVCodecContext *avctx,
440 const uint8_t *buf, int buf_size)
445 for(i=0; i<buf_size; i++){
446 state= (state<<8) | buf[i];
447 if(state != 0x1B3 && state != 0x1B5 && state < 0x200 && state >= 0x100)
453 void ff_parse_close(AVCodecParserContext *s)
455 ParseContext *pc = s->priv_data;
460 static void parse1_close(AVCodecParserContext *s)
462 ParseContext1 *pc1 = s->priv_data;
464 av_free(pc1->pc.buffer);
468 /*************************/
471 /* XXX: make it use less memory */
472 static int av_mpeg4_decode_header(AVCodecParserContext *s1,
473 AVCodecContext *avctx,
474 const uint8_t *buf, int buf_size)
476 ParseContext1 *pc = s1->priv_data;
477 MpegEncContext *s = pc->enc;
478 GetBitContext gb1, *gb = &gb1;
482 s->current_picture_ptr = &s->current_picture;
484 if (avctx->extradata_size && pc->first_picture){
485 init_get_bits(gb, avctx->extradata, avctx->extradata_size*8);
486 ret = ff_mpeg4_decode_picture_header(s, gb);
489 init_get_bits(gb, buf, 8 * buf_size);
490 ret = ff_mpeg4_decode_picture_header(s, gb);
492 avcodec_set_dimensions(avctx, s->width, s->height);
494 s1->pict_type= s->pict_type;
495 pc->first_picture = 0;
499 static int mpeg4video_parse_init(AVCodecParserContext *s)
501 ParseContext1 *pc = s->priv_data;
503 pc->enc = av_mallocz(sizeof(MpegEncContext));
506 pc->first_picture = 1;
510 static int mpeg4video_parse(AVCodecParserContext *s,
511 AVCodecContext *avctx,
512 uint8_t **poutbuf, int *poutbuf_size,
513 const uint8_t *buf, int buf_size)
515 ParseContext *pc = s->priv_data;
518 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
521 next= ff_mpeg4_find_frame_end(pc, buf, buf_size);
523 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
529 av_mpeg4_decode_header(s, avctx, buf, buf_size);
531 *poutbuf = (uint8_t *)buf;
532 *poutbuf_size = buf_size;
536 static int mpeg4video_split(AVCodecContext *avctx,
537 const uint8_t *buf, int buf_size)
542 for(i=0; i<buf_size; i++){
543 state= (state<<8) | buf[i];
544 if(state == 0x1B3 || state == 0x1B6)
550 /*************************/
552 typedef struct MpegAudioParseContext {
553 uint8_t inbuf[MPA_MAX_CODED_FRAME_SIZE]; /* input buffer */
556 int free_format_frame_size;
557 int free_format_next_header;
560 } MpegAudioParseContext;
562 #define MPA_HEADER_SIZE 4
564 /* header + layer + bitrate + freq + lsf/mpeg25 */
565 #undef SAME_HEADER_MASK /* mpegaudio.h defines different version */
566 #define SAME_HEADER_MASK \
567 (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19))
569 static int mpegaudio_parse_init(AVCodecParserContext *s1)
571 MpegAudioParseContext *s = s1->priv_data;
572 s->inbuf_ptr = s->inbuf;
576 static int mpegaudio_parse(AVCodecParserContext *s1,
577 AVCodecContext *avctx,
578 uint8_t **poutbuf, int *poutbuf_size,
579 const uint8_t *buf, int buf_size)
581 MpegAudioParseContext *s = s1->priv_data;
584 const uint8_t *buf_ptr;
589 while (buf_size > 0) {
590 len = s->inbuf_ptr - s->inbuf;
591 if (s->frame_size == 0) {
592 /* special case for next header for first frame in free
593 format case (XXX: find a simpler method) */
594 if (s->free_format_next_header != 0) {
595 s->inbuf[0] = s->free_format_next_header >> 24;
596 s->inbuf[1] = s->free_format_next_header >> 16;
597 s->inbuf[2] = s->free_format_next_header >> 8;
598 s->inbuf[3] = s->free_format_next_header;
599 s->inbuf_ptr = s->inbuf + 4;
600 s->free_format_next_header = 0;
603 /* no header seen : find one. We need at least MPA_HEADER_SIZE
605 len = MPA_HEADER_SIZE - len;
609 memcpy(s->inbuf_ptr, buf_ptr, len);
614 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) {
616 sr= avctx->sample_rate;
617 header = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
618 (s->inbuf[2] << 8) | s->inbuf[3];
620 ret = mpa_decode_header(avctx, header);
623 /* no sync found : move by one byte (inefficient, but simple!) */
624 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
626 dprintf("skip %x\n", header);
627 /* reset free format frame size to give a chance
628 to get a new bitrate */
629 s->free_format_frame_size = 0;
631 if((header&SAME_HEADER_MASK) != (s->header&SAME_HEADER_MASK) && s->header)
638 /* free format: prepare to compute frame size */
639 if (decode_header(s, header) == 1) {
644 if(s->header_count <= 0)
645 avctx->sample_rate= sr; //FIXME ugly
649 if (s->frame_size == -1) {
650 /* free format : find next sync to compute frame size */
651 len = MPA_MAX_CODED_FRAME_SIZE - len;
655 /* frame too long: resync */
657 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
664 memcpy(s->inbuf_ptr, buf_ptr, len);
665 /* check for header */
666 p = s->inbuf_ptr - 3;
667 pend = s->inbuf_ptr + len - 4;
669 header = (p[0] << 24) | (p[1] << 16) |
671 header1 = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
672 (s->inbuf[2] << 8) | s->inbuf[3];
673 /* check with high probability that we have a
675 if ((header & SAME_HEADER_MASK) ==
676 (header1 & SAME_HEADER_MASK)) {
677 /* header found: update pointers */
678 len = (p + 4) - s->inbuf_ptr;
682 /* compute frame size */
683 s->free_format_next_header = header;
684 s->free_format_frame_size = s->inbuf_ptr - s->inbuf;
685 padding = (header1 >> 9) & 1;
687 s->free_format_frame_size -= padding * 4;
689 s->free_format_frame_size -= padding;
690 dprintf("free frame size=%d padding=%d\n",
691 s->free_format_frame_size, padding);
692 decode_header(s, header1);
697 /* not found: simply increase pointers */
704 if (len < s->frame_size) {
705 if (s->frame_size > MPA_MAX_CODED_FRAME_SIZE)
706 s->frame_size = MPA_MAX_CODED_FRAME_SIZE;
707 len = s->frame_size - len;
710 memcpy(s->inbuf_ptr, buf_ptr, len);
716 if (s->frame_size > 0 &&
717 (s->inbuf_ptr - s->inbuf) >= s->frame_size) {
718 if(s->header_count > 0){
720 *poutbuf_size = s->inbuf_ptr - s->inbuf;
722 s->inbuf_ptr = s->inbuf;
727 return buf_ptr - buf;
730 typedef struct AC3ParseContext {
731 uint8_t inbuf[4096]; /* input buffer */
736 #define AC3_HEADER_SIZE 7
738 static const int ac3_sample_rates[4] = {
739 48000, 44100, 32000, 0
742 static const int ac3_frame_sizes[64][3] = {
775 { 1024, 1114, 1536 },
776 { 1024, 1115, 1536 },
777 { 1152, 1253, 1728 },
778 { 1152, 1254, 1728 },
779 { 1280, 1393, 1920 },
780 { 1280, 1394, 1920 },
783 static const int ac3_bitrates[64] = {
784 32, 32, 40, 40, 48, 48, 56, 56, 64, 64, 80, 80, 96, 96, 112, 112,
785 128, 128, 160, 160, 192, 192, 224, 224, 256, 256, 320, 320, 384,
786 384, 448, 448, 512, 512, 576, 576, 640, 640,
789 static const int ac3_channels[8] = {
790 2, 1, 2, 3, 3, 4, 4, 5
793 static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
796 unsigned int fscod, frmsizecod, acmod, bsid, lfeon;
799 init_get_bits(&bits, buf, AC3_HEADER_SIZE * 8);
801 if(get_bits(&bits, 16) != 0x0b77)
804 get_bits(&bits, 16); /* crc */
805 fscod = get_bits(&bits, 2);
806 frmsizecod = get_bits(&bits, 6);
808 if(!ac3_sample_rates[fscod])
811 bsid = get_bits(&bits, 5);
814 get_bits(&bits, 3); /* bsmod */
815 acmod = get_bits(&bits, 3);
816 if(acmod & 1 && acmod != 1)
817 get_bits(&bits, 2); /* cmixlev */
819 get_bits(&bits, 2); /* surmixlev */
821 get_bits(&bits, 2); /* dsurmod */
822 lfeon = get_bits(&bits, 1);
824 *sample_rate = ac3_sample_rates[fscod];
825 *bit_rate = ac3_bitrates[frmsizecod] * 1000;
826 *channels = ac3_channels[acmod] + lfeon;
828 return ac3_frame_sizes[frmsizecod][fscod] * 2;
831 static int ac3_parse_init(AVCodecParserContext *s1)
833 AC3ParseContext *s = s1->priv_data;
834 s->inbuf_ptr = s->inbuf;
838 static int ac3_parse(AVCodecParserContext *s1,
839 AVCodecContext *avctx,
840 uint8_t **poutbuf, int *poutbuf_size,
841 const uint8_t *buf, int buf_size)
843 AC3ParseContext *s = s1->priv_data;
844 const uint8_t *buf_ptr;
845 int len, sample_rate, bit_rate, channels;
851 while (buf_size > 0) {
852 len = s->inbuf_ptr - s->inbuf;
853 if (s->frame_size == 0) {
854 /* no header seen : find one. We need at least 7 bytes to parse it */
855 len = FFMIN(AC3_HEADER_SIZE - len, buf_size);
857 memcpy(s->inbuf_ptr, buf_ptr, len);
861 if ((s->inbuf_ptr - s->inbuf) == AC3_HEADER_SIZE) {
862 len = ac3_sync(s->inbuf, &channels, &sample_rate, &bit_rate);
864 /* no sync found : move by one byte (inefficient, but simple!) */
865 memmove(s->inbuf, s->inbuf + 1, AC3_HEADER_SIZE - 1);
869 /* update codec info */
870 avctx->sample_rate = sample_rate;
871 /* set channels,except if the user explicitly requests 1 or 2 channels, XXX/FIXME this is a bit ugly */
872 if(avctx->channels!=1 && avctx->channels!=2){
873 avctx->channels = channels;
875 avctx->bit_rate = bit_rate;
876 avctx->frame_size = 6 * 256;
880 len = FFMIN(s->frame_size - len, buf_size);
882 memcpy(s->inbuf_ptr, buf_ptr, len);
887 if(s->inbuf_ptr - s->inbuf == s->frame_size){
889 *poutbuf_size = s->frame_size;
890 s->inbuf_ptr = s->inbuf;
896 return buf_ptr - buf;
899 AVCodecParser mpegvideo_parser = {
900 { CODEC_ID_MPEG1VIDEO, CODEC_ID_MPEG2VIDEO },
901 sizeof(ParseContext1),
908 AVCodecParser mpeg4video_parser = {
910 sizeof(ParseContext1),
911 mpeg4video_parse_init,
917 AVCodecParser mpegaudio_parser = {
918 { CODEC_ID_MP2, CODEC_ID_MP3 },
919 sizeof(MpegAudioParseContext),
920 mpegaudio_parse_init,
925 AVCodecParser ac3_parser = {
927 sizeof(AC3ParseContext),