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);
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;
126 s->cur_frame_pts[k] =
127 s->cur_frame_dts[k] = AV_NOPTS_VALUE;
131 /* WARNING: the returned index can be negative */
132 index = s->parser->parser_parse(s, avctx, poutbuf, poutbuf_size, buf, buf_size);
133 //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);
134 /* update the file pointer */
136 /* fill the data for the current frame */
137 s->frame_offset = s->last_frame_offset;
138 s->pts = s->last_pts;
139 s->dts = s->last_dts;
141 /* offset of the next frame */
142 s->last_frame_offset = s->cur_offset + index;
143 /* find the packet in which the new frame starts. It
144 is tricky because of MPEG video start codes
145 which can begin in one packet and finish in
146 another packet. In the worst case, an MPEG
147 video start code could be in 4 different
149 k = s->cur_frame_start_index;
150 for(i = 0; i < AV_PARSER_PTS_NB; i++) {
151 if (s->last_frame_offset >= s->cur_frame_offset[k])
153 k = (k - 1) & (AV_PARSER_PTS_NB - 1);
156 s->last_pts = s->cur_frame_pts[k];
157 s->last_dts = s->cur_frame_dts[k];
159 /* some parsers tell us the packet size even before seeing the first byte of the next packet,
160 so the next pts/dts is in the next chunk */
161 if(index == buf_size){
162 s->fetch_timestamp=1;
167 s->cur_offset += index;
173 * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed
174 * @deprecated use AVBitstreamFilter
176 int av_parser_change(AVCodecParserContext *s,
177 AVCodecContext *avctx,
178 uint8_t **poutbuf, int *poutbuf_size,
179 const uint8_t *buf, int buf_size, int keyframe){
181 if(s && s->parser->split){
182 if((avctx->flags & CODEC_FLAG_GLOBAL_HEADER) || (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER)){
183 int i= s->parser->split(avctx, buf, buf_size);
189 /* cast to avoid warning about discarding qualifiers */
190 *poutbuf= (uint8_t *) buf;
191 *poutbuf_size= buf_size;
192 if(avctx->extradata){
193 if( (keyframe && (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER))
194 /*||(s->pict_type != I_TYPE && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_NOKEY))*/
195 /*||(? && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_BEGIN)*/){
196 int size= buf_size + avctx->extradata_size;
198 *poutbuf= av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
200 memcpy(*poutbuf, avctx->extradata, avctx->extradata_size);
201 memcpy((*poutbuf) + avctx->extradata_size, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
209 void av_parser_close(AVCodecParserContext *s)
211 if (s->parser->parser_close)
212 s->parser->parser_close(s);
213 av_free(s->priv_data);
217 /*****************************************************/
220 * combines the (truncated) bitstream to a complete frame
221 * @returns -1 if no complete frame could be created
223 int ff_combine_frame(ParseContext *pc, int next, uint8_t **buf, int *buf_size)
227 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
228 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
232 /* copy overreaded bytes from last frame into buffer */
233 for(; pc->overread>0; pc->overread--){
234 pc->buffer[pc->index++]= pc->buffer[pc->overread_index++];
237 /* flush remaining if EOF */
238 if(!*buf_size && next == END_NOT_FOUND){
242 pc->last_index= pc->index;
244 /* copy into buffer end return */
245 if(next == END_NOT_FOUND){
246 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, (*buf_size) + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
248 memcpy(&pc->buffer[pc->index], *buf, *buf_size);
249 pc->index += *buf_size;
254 pc->overread_index= pc->index + next;
256 /* append to buffer */
258 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, next + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
260 memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
265 /* store overread bytes */
266 for(;next < 0; next++){
267 pc->state = (pc->state<<8) | pc->buffer[pc->last_index + next];
273 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
274 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
281 void ff_parse_close(AVCodecParserContext *s)
283 ParseContext *pc = s->priv_data;
288 void ff_parse1_close(AVCodecParserContext *s)
290 ParseContext1 *pc1 = s->priv_data;
292 av_free(pc1->pc.buffer);
296 /*************************/
298 #ifdef CONFIG_MPEG4VIDEO_PARSER
300 /* XXX: make it use less memory */
301 static int av_mpeg4_decode_header(AVCodecParserContext *s1,
302 AVCodecContext *avctx,
303 const uint8_t *buf, int buf_size)
305 ParseContext1 *pc = s1->priv_data;
306 MpegEncContext *s = pc->enc;
307 GetBitContext gb1, *gb = &gb1;
311 s->current_picture_ptr = &s->current_picture;
313 if (avctx->extradata_size && pc->first_picture){
314 init_get_bits(gb, avctx->extradata, avctx->extradata_size*8);
315 ret = ff_mpeg4_decode_picture_header(s, gb);
318 init_get_bits(gb, buf, 8 * buf_size);
319 ret = ff_mpeg4_decode_picture_header(s, gb);
321 avcodec_set_dimensions(avctx, s->width, s->height);
323 s1->pict_type= s->pict_type;
324 pc->first_picture = 0;
328 static int mpeg4video_parse_init(AVCodecParserContext *s)
330 ParseContext1 *pc = s->priv_data;
332 pc->enc = av_mallocz(sizeof(MpegEncContext));
335 pc->first_picture = 1;
339 static int mpeg4video_parse(AVCodecParserContext *s,
340 AVCodecContext *avctx,
341 uint8_t **poutbuf, int *poutbuf_size,
342 const uint8_t *buf, int buf_size)
344 ParseContext *pc = s->priv_data;
347 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
350 next= ff_mpeg4_find_frame_end(pc, buf, buf_size);
352 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
358 av_mpeg4_decode_header(s, avctx, buf, buf_size);
360 *poutbuf = (uint8_t *)buf;
361 *poutbuf_size = buf_size;
366 int ff_mpeg4video_split(AVCodecContext *avctx,
367 const uint8_t *buf, int buf_size)
372 for(i=0; i<buf_size; i++){
373 state= (state<<8) | buf[i];
374 if(state == 0x1B3 || state == 0x1B6)
380 /*************************/
382 #ifdef CONFIG_MPEGAUDIO_PARSER
383 typedef struct MpegAudioParseContext {
384 uint8_t inbuf[MPA_MAX_CODED_FRAME_SIZE]; /* input buffer */
387 int free_format_frame_size;
388 int free_format_next_header;
391 } MpegAudioParseContext;
393 #define MPA_HEADER_SIZE 4
395 /* header + layer + bitrate + freq + lsf/mpeg25 */
396 #undef SAME_HEADER_MASK /* mpegaudio.h defines different version */
397 #define SAME_HEADER_MASK \
398 (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19))
400 static int mpegaudio_parse_init(AVCodecParserContext *s1)
402 MpegAudioParseContext *s = s1->priv_data;
403 s->inbuf_ptr = s->inbuf;
407 static int mpegaudio_parse(AVCodecParserContext *s1,
408 AVCodecContext *avctx,
409 uint8_t **poutbuf, int *poutbuf_size,
410 const uint8_t *buf, int buf_size)
412 MpegAudioParseContext *s = s1->priv_data;
415 const uint8_t *buf_ptr;
420 while (buf_size > 0) {
421 len = s->inbuf_ptr - s->inbuf;
422 if (s->frame_size == 0) {
423 /* special case for next header for first frame in free
424 format case (XXX: find a simpler method) */
425 if (s->free_format_next_header != 0) {
426 s->inbuf[0] = s->free_format_next_header >> 24;
427 s->inbuf[1] = s->free_format_next_header >> 16;
428 s->inbuf[2] = s->free_format_next_header >> 8;
429 s->inbuf[3] = s->free_format_next_header;
430 s->inbuf_ptr = s->inbuf + 4;
431 s->free_format_next_header = 0;
434 /* no header seen : find one. We need at least MPA_HEADER_SIZE
436 len = FFMIN(MPA_HEADER_SIZE - len, buf_size);
438 memcpy(s->inbuf_ptr, buf_ptr, len);
443 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) {
445 header = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
446 (s->inbuf[2] << 8) | s->inbuf[3];
448 ret = mpa_decode_header(avctx, header, &sr);
451 /* no sync found : move by one byte (inefficient, but simple!) */
452 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
454 dprintf(avctx, "skip %x\n", header);
455 /* reset free format frame size to give a chance
456 to get a new bitrate */
457 s->free_format_frame_size = 0;
459 if((header&SAME_HEADER_MASK) != (s->header&SAME_HEADER_MASK) && s->header)
466 /* free format: prepare to compute frame size */
467 if (decode_header(s, header) == 1) {
472 if(s->header_count > 1)
473 avctx->sample_rate= sr;
477 if (s->frame_size == -1) {
478 /* free format : find next sync to compute frame size */
479 len = MPA_MAX_CODED_FRAME_SIZE - len;
483 /* frame too long: resync */
485 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
492 memcpy(s->inbuf_ptr, buf_ptr, len);
493 /* check for header */
494 p = s->inbuf_ptr - 3;
495 pend = s->inbuf_ptr + len - 4;
497 header = (p[0] << 24) | (p[1] << 16) |
499 header1 = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
500 (s->inbuf[2] << 8) | s->inbuf[3];
501 /* check with high probability that we have a
503 if ((header & SAME_HEADER_MASK) ==
504 (header1 & SAME_HEADER_MASK)) {
505 /* header found: update pointers */
506 len = (p + 4) - s->inbuf_ptr;
510 /* compute frame size */
511 s->free_format_next_header = header;
512 s->free_format_frame_size = s->inbuf_ptr - s->inbuf;
513 padding = (header1 >> 9) & 1;
515 s->free_format_frame_size -= padding * 4;
517 s->free_format_frame_size -= padding;
518 dprintf(avctx, "free frame size=%d padding=%d\n",
519 s->free_format_frame_size, padding);
520 decode_header(s, header1);
525 /* not found: simply increase pointers */
532 if (len < s->frame_size) {
533 if (s->frame_size > MPA_MAX_CODED_FRAME_SIZE)
534 s->frame_size = MPA_MAX_CODED_FRAME_SIZE;
535 len = FFMIN(s->frame_size - len, buf_size);
536 memcpy(s->inbuf_ptr, buf_ptr, len);
542 if(s->frame_size > 0 && buf_ptr - buf == s->inbuf_ptr - s->inbuf
543 && buf_size + buf_ptr - buf >= s->frame_size){
544 if(s->header_count > 0){
546 *poutbuf_size = s->frame_size;
548 buf_ptr = buf + s->frame_size;
549 s->inbuf_ptr = s->inbuf;
555 if (s->frame_size > 0 &&
556 (s->inbuf_ptr - s->inbuf) >= s->frame_size) {
557 if(s->header_count > 0){
559 *poutbuf_size = s->inbuf_ptr - s->inbuf;
561 s->inbuf_ptr = s->inbuf;
566 return buf_ptr - buf;
568 #endif /* CONFIG_MPEGAUDIO_PARSER */
570 #if defined(CONFIG_AC3_PARSER) || defined(CONFIG_AAC_PARSER)
571 /* also used for ADTS AAC */
572 typedef struct AC3ParseContext {
576 int (*sync)(const uint8_t *buf, int *channels, int *sample_rate,
577 int *bit_rate, int *samples);
578 uint8_t inbuf[8192]; /* input buffer */
581 #define AC3_HEADER_SIZE 7
582 #define AAC_HEADER_SIZE 7
584 #ifdef CONFIG_AC3_PARSER
586 static const uint8_t eac3_blocks[4] = {
590 #endif /* CONFIG_AC3_PARSER */
592 #ifdef CONFIG_AAC_PARSER
593 static const int aac_sample_rates[16] = {
594 96000, 88200, 64000, 48000, 44100, 32000,
595 24000, 22050, 16000, 12000, 11025, 8000, 7350
598 static const int aac_channels[8] = {
599 0, 1, 2, 3, 4, 5, 6, 8
603 #ifdef CONFIG_AC3_PARSER
604 static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
605 int *bit_rate, int *samples)
608 unsigned int fscod, acmod, bsid, lfeon;
609 unsigned int strmtyp, substreamid, frmsiz, fscod2, numblkscod;
613 err = ff_ac3_parse_header(buf, &hdr);
615 if(err < 0 && err != -2)
619 if(bsid <= 10) { /* Normal AC-3 */
620 *sample_rate = hdr.sample_rate;
621 *bit_rate = hdr.bit_rate;
622 *channels = hdr.channels;
623 *samples = AC3_FRAME_SIZE;
624 return hdr.frame_size;
625 } else if (bsid > 10 && bsid <= 16) { /* Enhanced AC-3 */
626 init_get_bits(&bits, &buf[2], (AC3_HEADER_SIZE-2) * 8);
627 strmtyp = get_bits(&bits, 2);
628 substreamid = get_bits(&bits, 3);
630 if (strmtyp != 0 || substreamid != 0)
631 return 0; /* Currently don't support additional streams */
633 frmsiz = get_bits(&bits, 11) + 1;
634 fscod = get_bits(&bits, 2);
636 fscod2 = get_bits(&bits, 2);
642 *sample_rate = ff_ac3_freqs[fscod2] / 2;
644 numblkscod = get_bits(&bits, 2);
646 *sample_rate = ff_ac3_freqs[fscod];
649 acmod = get_bits(&bits, 3);
650 lfeon = get_bits1(&bits);
652 *samples = eac3_blocks[numblkscod] * 256;
653 *bit_rate = frmsiz * (*sample_rate) * 16 / (*samples);
654 *channels = ff_ac3_channels[acmod] + lfeon;
659 /* Unsupported bitstream version */
662 #endif /* CONFIG_AC3_PARSER */
664 #ifdef CONFIG_AAC_PARSER
665 static int aac_sync(const uint8_t *buf, int *channels, int *sample_rate,
666 int *bit_rate, int *samples)
669 int size, rdb, ch, sr;
671 init_get_bits(&bits, buf, AAC_HEADER_SIZE * 8);
673 if(get_bits(&bits, 12) != 0xfff)
676 skip_bits1(&bits); /* id */
677 skip_bits(&bits, 2); /* layer */
678 skip_bits1(&bits); /* protection_absent */
679 skip_bits(&bits, 2); /* profile_objecttype */
680 sr = get_bits(&bits, 4); /* sample_frequency_index */
681 if(!aac_sample_rates[sr])
683 skip_bits1(&bits); /* private_bit */
684 ch = get_bits(&bits, 3); /* channel_configuration */
685 if(!aac_channels[ch])
687 skip_bits1(&bits); /* original/copy */
688 skip_bits1(&bits); /* home */
690 /* adts_variable_header */
691 skip_bits1(&bits); /* copyright_identification_bit */
692 skip_bits1(&bits); /* copyright_identification_start */
693 size = get_bits(&bits, 13); /* aac_frame_length */
694 skip_bits(&bits, 11); /* adts_buffer_fullness */
695 rdb = get_bits(&bits, 2); /* number_of_raw_data_blocks_in_frame */
697 *channels = aac_channels[ch];
698 *sample_rate = aac_sample_rates[sr];
699 *samples = (rdb + 1) * 1024;
700 *bit_rate = size * 8 * *sample_rate / *samples;
704 #endif /* CONFIG_AAC_PARSER */
706 #ifdef CONFIG_AC3_PARSER
707 static int ac3_parse_init(AVCodecParserContext *s1)
709 AC3ParseContext *s = s1->priv_data;
710 s->inbuf_ptr = s->inbuf;
711 s->header_size = AC3_HEADER_SIZE;
717 #ifdef CONFIG_AAC_PARSER
718 static int aac_parse_init(AVCodecParserContext *s1)
720 AC3ParseContext *s = s1->priv_data;
721 s->inbuf_ptr = s->inbuf;
722 s->header_size = AAC_HEADER_SIZE;
728 /* also used for ADTS AAC */
729 static int ac3_parse(AVCodecParserContext *s1,
730 AVCodecContext *avctx,
731 uint8_t **poutbuf, int *poutbuf_size,
732 const uint8_t *buf, int buf_size)
734 AC3ParseContext *s = s1->priv_data;
735 const uint8_t *buf_ptr;
736 int len, sample_rate, bit_rate, channels, samples;
742 while (buf_size > 0) {
743 len = s->inbuf_ptr - s->inbuf;
744 if (s->frame_size == 0) {
745 /* no header seen : find one. We need at least s->header_size
747 len = FFMIN(s->header_size - len, buf_size);
749 memcpy(s->inbuf_ptr, buf_ptr, len);
753 if ((s->inbuf_ptr - s->inbuf) == s->header_size) {
754 len = s->sync(s->inbuf, &channels, &sample_rate, &bit_rate,
757 /* no sync found : move by one byte (inefficient, but simple!) */
758 memmove(s->inbuf, s->inbuf + 1, s->header_size - 1);
762 /* update codec info */
763 avctx->sample_rate = sample_rate;
764 /* set channels,except if the user explicitly requests 1 or 2 channels, XXX/FIXME this is a bit ugly */
765 if(avctx->codec_id == CODEC_ID_AC3){
766 if(avctx->channels!=1 && avctx->channels!=2){
767 avctx->channels = channels;
770 avctx->channels = channels;
772 avctx->bit_rate = bit_rate;
773 avctx->frame_size = samples;
777 len = FFMIN(s->frame_size - len, buf_size);
779 memcpy(s->inbuf_ptr, buf_ptr, len);
784 if(s->inbuf_ptr - s->inbuf == s->frame_size){
786 *poutbuf_size = s->frame_size;
787 s->inbuf_ptr = s->inbuf;
793 return buf_ptr - buf;
795 #endif /* CONFIG_AC3_PARSER || CONFIG_AAC_PARSER */
797 #ifdef CONFIG_MPEG4VIDEO_PARSER
798 AVCodecParser mpeg4video_parser = {
800 sizeof(ParseContext1),
801 mpeg4video_parse_init,
807 #ifdef CONFIG_MPEGAUDIO_PARSER
808 AVCodecParser mpegaudio_parser = {
809 { CODEC_ID_MP2, CODEC_ID_MP3 },
810 sizeof(MpegAudioParseContext),
811 mpegaudio_parse_init,
816 #ifdef CONFIG_AC3_PARSER
817 AVCodecParser ac3_parser = {
819 sizeof(AC3ParseContext),
825 #ifdef CONFIG_AAC_PARSER
826 AVCodecParser aac_parser = {
828 sizeof(AC3ParseContext),