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"
28 AVCodecParser *av_first_parser = NULL;
30 void av_register_codec_parser(AVCodecParser *parser)
32 parser->next = av_first_parser;
33 av_first_parser = parser;
36 AVCodecParserContext *av_parser_init(int codec_id)
38 AVCodecParserContext *s;
39 AVCodecParser *parser;
42 if(codec_id == CODEC_ID_NONE)
45 for(parser = av_first_parser; parser != NULL; parser = parser->next) {
46 if (parser->codec_ids[0] == codec_id ||
47 parser->codec_ids[1] == codec_id ||
48 parser->codec_ids[2] == codec_id ||
49 parser->codec_ids[3] == codec_id ||
50 parser->codec_ids[4] == codec_id)
55 s = av_mallocz(sizeof(AVCodecParserContext));
59 s->priv_data = av_mallocz(parser->priv_data_size);
64 if (parser->parser_init) {
65 ret = parser->parser_init(s);
67 av_free(s->priv_data);
73 s->pict_type = FF_I_TYPE;
80 * @param buf_size input length, to signal EOF, this should be 0 (so that the last frame can be output)
81 * @param pts input presentation timestamp
82 * @param dts input decoding timestamp
83 * @param poutbuf will contain a pointer to the first byte of the output frame
84 * @param poutbuf_size will contain the length of the output frame
85 * @return the number of bytes of the input bitstream used
90 * len = av_parser_parse(myparser, AVCodecContext, &data, &size,
97 * decode_frame(data, size);
101 int av_parser_parse(AVCodecParserContext *s,
102 AVCodecContext *avctx,
103 uint8_t **poutbuf, int *poutbuf_size,
104 const uint8_t *buf, int buf_size,
105 int64_t pts, int64_t dts)
108 uint8_t dummy_buf[FF_INPUT_BUFFER_PADDING_SIZE];
111 /* padding is always necessary even if EOF, so we add it here */
112 memset(dummy_buf, 0, sizeof(dummy_buf));
115 /* add a new packet descriptor */
116 k = (s->cur_frame_start_index + 1) & (AV_PARSER_PTS_NB - 1);
117 s->cur_frame_start_index = k;
118 s->cur_frame_offset[k] = s->cur_offset;
119 s->cur_frame_pts[k] = pts;
120 s->cur_frame_dts[k] = dts;
122 /* fill first PTS/DTS */
123 if (s->fetch_timestamp){
124 s->fetch_timestamp=0;
128 s->cur_frame_pts[k] =
129 s->cur_frame_dts[k] = AV_NOPTS_VALUE;
133 /* WARNING: the returned index can be negative */
134 index = s->parser->parser_parse(s, avctx, poutbuf, poutbuf_size, buf, buf_size);
135 //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);
136 /* update the file pointer */
138 /* fill the data for the current frame */
139 s->frame_offset = s->last_frame_offset;
140 s->pts = s->last_pts;
141 s->dts = s->last_dts;
142 s->offset = s->last_offset;
144 /* offset of the next frame */
145 s->last_frame_offset = s->cur_offset + index;
146 /* find the packet in which the new frame starts. It
147 is tricky because of MPEG video start codes
148 which can begin in one packet and finish in
149 another packet. In the worst case, an MPEG
150 video start code could be in 4 different
152 k = s->cur_frame_start_index;
153 for(i = 0; i < AV_PARSER_PTS_NB; i++) {
154 if (s->last_frame_offset >= s->cur_frame_offset[k])
156 k = (k - 1) & (AV_PARSER_PTS_NB - 1);
159 s->last_pts = s->cur_frame_pts[k];
160 s->last_dts = s->cur_frame_dts[k];
161 s->last_offset = s->last_frame_offset - s->cur_frame_offset[k];
163 /* some parsers tell us the packet size even before seeing the first byte of the next packet,
164 so the next pts/dts is in the next chunk */
165 if(index == buf_size){
166 s->fetch_timestamp=1;
171 s->cur_offset += index;
177 * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed
178 * @deprecated use AVBitstreamFilter
180 int av_parser_change(AVCodecParserContext *s,
181 AVCodecContext *avctx,
182 uint8_t **poutbuf, int *poutbuf_size,
183 const uint8_t *buf, int buf_size, int keyframe){
185 if(s && s->parser->split){
186 if((avctx->flags & CODEC_FLAG_GLOBAL_HEADER) || (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER)){
187 int i= s->parser->split(avctx, buf, buf_size);
193 /* cast to avoid warning about discarding qualifiers */
194 *poutbuf= (uint8_t *) buf;
195 *poutbuf_size= buf_size;
196 if(avctx->extradata){
197 if( (keyframe && (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER))
198 /*||(s->pict_type != I_TYPE && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_NOKEY))*/
199 /*||(? && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_BEGIN)*/){
200 int size= buf_size + avctx->extradata_size;
202 *poutbuf= av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
204 memcpy(*poutbuf, avctx->extradata, avctx->extradata_size);
205 memcpy((*poutbuf) + avctx->extradata_size, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
213 void av_parser_close(AVCodecParserContext *s)
215 if (s->parser->parser_close)
216 s->parser->parser_close(s);
217 av_free(s->priv_data);
221 /*****************************************************/
224 * combines the (truncated) bitstream to a complete frame
225 * @returns -1 if no complete frame could be created
227 int ff_combine_frame(ParseContext *pc, int next, uint8_t **buf, int *buf_size)
231 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
232 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
236 /* Copy overread bytes from last frame into buffer. */
237 for(; pc->overread>0; pc->overread--){
238 pc->buffer[pc->index++]= pc->buffer[pc->overread_index++];
241 /* flush remaining if EOF */
242 if(!*buf_size && next == END_NOT_FOUND){
246 pc->last_index= pc->index;
248 /* copy into buffer end return */
249 if(next == END_NOT_FOUND){
250 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, (*buf_size) + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
252 memcpy(&pc->buffer[pc->index], *buf, *buf_size);
253 pc->index += *buf_size;
258 pc->overread_index= pc->index + next;
260 /* append to buffer */
262 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, next + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
264 memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
269 /* store overread bytes */
270 for(;next < 0; next++){
271 pc->state = (pc->state<<8) | pc->buffer[pc->last_index + next];
277 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
278 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
285 void ff_parse_close(AVCodecParserContext *s)
287 ParseContext *pc = s->priv_data;
292 void ff_parse1_close(AVCodecParserContext *s)
294 ParseContext1 *pc1 = s->priv_data;
296 av_free(pc1->pc.buffer);
300 /*************************/
302 #ifdef CONFIG_MPEG4VIDEO_PARSER
304 /* XXX: make it use less memory */
305 static int av_mpeg4_decode_header(AVCodecParserContext *s1,
306 AVCodecContext *avctx,
307 const uint8_t *buf, int buf_size)
309 ParseContext1 *pc = s1->priv_data;
310 MpegEncContext *s = pc->enc;
311 GetBitContext gb1, *gb = &gb1;
315 s->current_picture_ptr = &s->current_picture;
317 if (avctx->extradata_size && pc->first_picture){
318 init_get_bits(gb, avctx->extradata, avctx->extradata_size*8);
319 ret = ff_mpeg4_decode_picture_header(s, gb);
322 init_get_bits(gb, buf, 8 * buf_size);
323 ret = ff_mpeg4_decode_picture_header(s, gb);
325 avcodec_set_dimensions(avctx, s->width, s->height);
327 s1->pict_type= s->pict_type;
328 pc->first_picture = 0;
332 static int mpeg4video_parse_init(AVCodecParserContext *s)
334 ParseContext1 *pc = s->priv_data;
336 pc->enc = av_mallocz(sizeof(MpegEncContext));
339 pc->first_picture = 1;
343 static int mpeg4video_parse(AVCodecParserContext *s,
344 AVCodecContext *avctx,
345 uint8_t **poutbuf, int *poutbuf_size,
346 const uint8_t *buf, int buf_size)
348 ParseContext *pc = s->priv_data;
351 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
354 next= ff_mpeg4_find_frame_end(pc, buf, buf_size);
356 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
362 av_mpeg4_decode_header(s, avctx, buf, buf_size);
364 *poutbuf = (uint8_t *)buf;
365 *poutbuf_size = buf_size;
370 int ff_mpeg4video_split(AVCodecContext *avctx,
371 const uint8_t *buf, int buf_size)
376 for(i=0; i<buf_size; i++){
377 state= (state<<8) | buf[i];
378 if(state == 0x1B3 || state == 0x1B6)
384 /*************************/
386 #ifdef CONFIG_MPEGAUDIO_PARSER
387 typedef struct MpegAudioParseContext {
388 uint8_t inbuf[MPA_MAX_CODED_FRAME_SIZE]; /* input buffer */
391 int free_format_frame_size;
392 int free_format_next_header;
395 } MpegAudioParseContext;
397 #define MPA_HEADER_SIZE 4
399 /* header + layer + bitrate + freq + lsf/mpeg25 */
400 #undef SAME_HEADER_MASK /* mpegaudio.h defines different version */
401 #define SAME_HEADER_MASK \
402 (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19))
404 static int mpegaudio_parse_init(AVCodecParserContext *s1)
406 MpegAudioParseContext *s = s1->priv_data;
407 s->inbuf_ptr = s->inbuf;
411 static int mpegaudio_parse(AVCodecParserContext *s1,
412 AVCodecContext *avctx,
413 uint8_t **poutbuf, int *poutbuf_size,
414 const uint8_t *buf, int buf_size)
416 MpegAudioParseContext *s = s1->priv_data;
419 const uint8_t *buf_ptr;
424 while (buf_size > 0) {
425 len = s->inbuf_ptr - s->inbuf;
426 if (s->frame_size == 0) {
427 /* special case for next header for first frame in free
428 format case (XXX: find a simpler method) */
429 if (s->free_format_next_header != 0) {
430 s->inbuf[0] = s->free_format_next_header >> 24;
431 s->inbuf[1] = s->free_format_next_header >> 16;
432 s->inbuf[2] = s->free_format_next_header >> 8;
433 s->inbuf[3] = s->free_format_next_header;
434 s->inbuf_ptr = s->inbuf + 4;
435 s->free_format_next_header = 0;
438 /* no header seen : find one. We need at least MPA_HEADER_SIZE
440 len = FFMIN(MPA_HEADER_SIZE - len, buf_size);
442 memcpy(s->inbuf_ptr, buf_ptr, len);
447 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) {
449 header = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
450 (s->inbuf[2] << 8) | s->inbuf[3];
452 ret = mpa_decode_header(avctx, header, &sr);
455 /* no sync found : move by one byte (inefficient, but simple!) */
456 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
458 dprintf(avctx, "skip %x\n", header);
459 /* reset free format frame size to give a chance
460 to get a new bitrate */
461 s->free_format_frame_size = 0;
463 if((header&SAME_HEADER_MASK) != (s->header&SAME_HEADER_MASK) && s->header)
470 /* free format: prepare to compute frame size */
471 if (decode_header(s, header) == 1) {
476 if(s->header_count > 1)
477 avctx->sample_rate= sr;
481 if (s->frame_size == -1) {
482 /* free format : find next sync to compute frame size */
483 len = MPA_MAX_CODED_FRAME_SIZE - len;
487 /* frame too long: resync */
489 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
496 memcpy(s->inbuf_ptr, buf_ptr, len);
497 /* check for header */
498 p = s->inbuf_ptr - 3;
499 pend = s->inbuf_ptr + len - 4;
501 header = (p[0] << 24) | (p[1] << 16) |
503 header1 = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
504 (s->inbuf[2] << 8) | s->inbuf[3];
505 /* check with high probability that we have a
507 if ((header & SAME_HEADER_MASK) ==
508 (header1 & SAME_HEADER_MASK)) {
509 /* header found: update pointers */
510 len = (p + 4) - s->inbuf_ptr;
514 /* compute frame size */
515 s->free_format_next_header = header;
516 s->free_format_frame_size = s->inbuf_ptr - s->inbuf;
517 padding = (header1 >> 9) & 1;
519 s->free_format_frame_size -= padding * 4;
521 s->free_format_frame_size -= padding;
522 dprintf(avctx, "free frame size=%d padding=%d\n",
523 s->free_format_frame_size, padding);
524 decode_header(s, header1);
529 /* not found: simply increase pointers */
536 if (len < s->frame_size) {
537 if (s->frame_size > MPA_MAX_CODED_FRAME_SIZE)
538 s->frame_size = MPA_MAX_CODED_FRAME_SIZE;
539 len = FFMIN(s->frame_size - len, buf_size);
540 memcpy(s->inbuf_ptr, buf_ptr, len);
546 if(s->frame_size > 0 && buf_ptr - buf == s->inbuf_ptr - s->inbuf
547 && buf_size + buf_ptr - buf >= s->frame_size){
548 if(s->header_count > 0){
550 *poutbuf_size = s->frame_size;
552 buf_ptr = buf + s->frame_size;
553 s->inbuf_ptr = s->inbuf;
559 if (s->frame_size > 0 &&
560 (s->inbuf_ptr - s->inbuf) >= s->frame_size) {
561 if(s->header_count > 0){
563 *poutbuf_size = s->inbuf_ptr - s->inbuf;
565 s->inbuf_ptr = s->inbuf;
570 return buf_ptr - buf;
572 #endif /* CONFIG_MPEGAUDIO_PARSER */
574 #if defined(CONFIG_AC3_PARSER) || defined(CONFIG_AAC_PARSER)
575 /* also used for ADTS AAC */
576 typedef struct AC3ParseContext {
580 int (*sync)(const uint8_t *buf, int *channels, int *sample_rate,
581 int *bit_rate, int *samples);
582 uint8_t inbuf[8192]; /* input buffer */
585 #define AC3_HEADER_SIZE 7
586 #define AAC_HEADER_SIZE 7
588 #ifdef CONFIG_AC3_PARSER
590 static const uint8_t eac3_blocks[4] = {
594 #endif /* CONFIG_AC3_PARSER */
596 #ifdef CONFIG_AAC_PARSER
597 static const int aac_sample_rates[16] = {
598 96000, 88200, 64000, 48000, 44100, 32000,
599 24000, 22050, 16000, 12000, 11025, 8000, 7350
602 static const int aac_channels[8] = {
603 0, 1, 2, 3, 4, 5, 6, 8
607 #ifdef CONFIG_AC3_PARSER
608 static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
609 int *bit_rate, int *samples)
612 unsigned int fscod, acmod, bsid, lfeon;
613 unsigned int strmtyp, substreamid, frmsiz, fscod2, numblkscod;
617 err = ff_ac3_parse_header(buf, &hdr);
619 if(err < 0 && err != -2)
623 if(bsid <= 10) { /* Normal AC-3 */
624 *sample_rate = hdr.sample_rate;
625 *bit_rate = hdr.bit_rate;
626 *channels = hdr.channels;
627 *samples = AC3_FRAME_SIZE;
628 return hdr.frame_size;
629 } else if (bsid > 10 && bsid <= 16) { /* Enhanced AC-3 */
630 init_get_bits(&bits, &buf[2], (AC3_HEADER_SIZE-2) * 8);
631 strmtyp = get_bits(&bits, 2);
632 substreamid = get_bits(&bits, 3);
634 if (strmtyp != 0 || substreamid != 0)
635 return 0; /* Currently don't support additional streams */
637 frmsiz = get_bits(&bits, 11) + 1;
638 fscod = get_bits(&bits, 2);
640 fscod2 = get_bits(&bits, 2);
646 *sample_rate = ff_ac3_freqs[fscod2] / 2;
648 numblkscod = get_bits(&bits, 2);
650 *sample_rate = ff_ac3_freqs[fscod];
653 acmod = get_bits(&bits, 3);
654 lfeon = get_bits1(&bits);
656 *samples = eac3_blocks[numblkscod] * 256;
657 *bit_rate = frmsiz * (*sample_rate) * 16 / (*samples);
658 *channels = ff_ac3_channels[acmod] + lfeon;
663 /* Unsupported bitstream version */
666 #endif /* CONFIG_AC3_PARSER */
668 #ifdef CONFIG_AAC_PARSER
669 static int aac_sync(const uint8_t *buf, int *channels, int *sample_rate,
670 int *bit_rate, int *samples)
673 int size, rdb, ch, sr;
675 init_get_bits(&bits, buf, AAC_HEADER_SIZE * 8);
677 if(get_bits(&bits, 12) != 0xfff)
680 skip_bits1(&bits); /* id */
681 skip_bits(&bits, 2); /* layer */
682 skip_bits1(&bits); /* protection_absent */
683 skip_bits(&bits, 2); /* profile_objecttype */
684 sr = get_bits(&bits, 4); /* sample_frequency_index */
685 if(!aac_sample_rates[sr])
687 skip_bits1(&bits); /* private_bit */
688 ch = get_bits(&bits, 3); /* channel_configuration */
689 if(!aac_channels[ch])
691 skip_bits1(&bits); /* original/copy */
692 skip_bits1(&bits); /* home */
694 /* adts_variable_header */
695 skip_bits1(&bits); /* copyright_identification_bit */
696 skip_bits1(&bits); /* copyright_identification_start */
697 size = get_bits(&bits, 13); /* aac_frame_length */
698 skip_bits(&bits, 11); /* adts_buffer_fullness */
699 rdb = get_bits(&bits, 2); /* number_of_raw_data_blocks_in_frame */
701 *channels = aac_channels[ch];
702 *sample_rate = aac_sample_rates[sr];
703 *samples = (rdb + 1) * 1024;
704 *bit_rate = size * 8 * *sample_rate / *samples;
708 #endif /* CONFIG_AAC_PARSER */
710 #ifdef CONFIG_AC3_PARSER
711 static int ac3_parse_init(AVCodecParserContext *s1)
713 AC3ParseContext *s = s1->priv_data;
714 s->inbuf_ptr = s->inbuf;
715 s->header_size = AC3_HEADER_SIZE;
721 #ifdef CONFIG_AAC_PARSER
722 static int aac_parse_init(AVCodecParserContext *s1)
724 AC3ParseContext *s = s1->priv_data;
725 s->inbuf_ptr = s->inbuf;
726 s->header_size = AAC_HEADER_SIZE;
732 /* also used for ADTS AAC */
733 static int ac3_parse(AVCodecParserContext *s1,
734 AVCodecContext *avctx,
735 uint8_t **poutbuf, int *poutbuf_size,
736 const uint8_t *buf, int buf_size)
738 AC3ParseContext *s = s1->priv_data;
739 const uint8_t *buf_ptr;
740 int len, sample_rate, bit_rate, channels, samples;
746 while (buf_size > 0) {
747 len = s->inbuf_ptr - s->inbuf;
748 if (s->frame_size == 0) {
749 /* no header seen : find one. We need at least s->header_size
751 len = FFMIN(s->header_size - len, buf_size);
753 memcpy(s->inbuf_ptr, buf_ptr, len);
757 if ((s->inbuf_ptr - s->inbuf) == s->header_size) {
758 len = s->sync(s->inbuf, &channels, &sample_rate, &bit_rate,
761 /* no sync found : move by one byte (inefficient, but simple!) */
762 memmove(s->inbuf, s->inbuf + 1, s->header_size - 1);
766 /* update codec info */
767 avctx->sample_rate = sample_rate;
768 /* set channels,except if the user explicitly requests 1 or 2 channels, XXX/FIXME this is a bit ugly */
769 if(avctx->codec_id == CODEC_ID_AC3){
770 if(avctx->channels!=1 && avctx->channels!=2){
771 avctx->channels = channels;
774 avctx->channels = channels;
776 avctx->bit_rate = bit_rate;
777 avctx->frame_size = samples;
781 len = FFMIN(s->frame_size - len, buf_size);
783 memcpy(s->inbuf_ptr, buf_ptr, len);
788 if(s->inbuf_ptr - s->inbuf == s->frame_size){
790 *poutbuf_size = s->frame_size;
791 s->inbuf_ptr = s->inbuf;
797 return buf_ptr - buf;
799 #endif /* CONFIG_AC3_PARSER || CONFIG_AAC_PARSER */
801 #ifdef CONFIG_MPEG4VIDEO_PARSER
802 AVCodecParser mpeg4video_parser = {
804 sizeof(ParseContext1),
805 mpeg4video_parse_init,
811 #ifdef CONFIG_MPEGAUDIO_PARSER
812 AVCodecParser mpegaudio_parser = {
813 { CODEC_ID_MP2, CODEC_ID_MP3 },
814 sizeof(MpegAudioParseContext),
815 mpegaudio_parse_init,
820 #ifdef CONFIG_AC3_PARSER
821 AVCodecParser ac3_parser = {
823 sizeof(AC3ParseContext),
829 #ifdef CONFIG_AAC_PARSER
830 AVCodecParser aac_parser = {
832 sizeof(AC3ParseContext),