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"
26 AVCodecParser *av_first_parser = NULL;
28 void av_register_codec_parser(AVCodecParser *parser)
30 parser->next = av_first_parser;
31 av_first_parser = parser;
34 AVCodecParserContext *av_parser_init(int codec_id)
36 AVCodecParserContext *s;
37 AVCodecParser *parser;
40 if(codec_id == CODEC_ID_NONE)
43 for(parser = av_first_parser; parser != NULL; parser = parser->next) {
44 if (parser->codec_ids[0] == codec_id ||
45 parser->codec_ids[1] == codec_id ||
46 parser->codec_ids[2] == codec_id ||
47 parser->codec_ids[3] == codec_id ||
48 parser->codec_ids[4] == codec_id)
53 s = av_mallocz(sizeof(AVCodecParserContext));
57 s->priv_data = av_mallocz(parser->priv_data_size);
62 if (parser->parser_init) {
63 ret = parser->parser_init(s);
65 av_free(s->priv_data);
77 * @param buf_size input length, to signal EOF, this should be 0 (so that the last frame can be output)
78 * @param pts input presentation timestamp
79 * @param dts input decoding timestamp
80 * @param poutbuf will contain a pointer to the first byte of the output frame
81 * @param poutbuf_size will contain the length of the output frame
82 * @return the number of bytes of the input bitstream used
87 * len = av_parser_parse(myparser, AVCodecContext, &data, &size,
93 * decode_frame(data, size);
97 int av_parser_parse(AVCodecParserContext *s,
98 AVCodecContext *avctx,
99 uint8_t **poutbuf, int *poutbuf_size,
100 const uint8_t *buf, int buf_size,
101 int64_t pts, int64_t dts)
104 uint8_t dummy_buf[FF_INPUT_BUFFER_PADDING_SIZE];
107 /* padding is always necessary even if EOF, so we add it here */
108 memset(dummy_buf, 0, sizeof(dummy_buf));
111 /* add a new packet descriptor */
112 k = (s->cur_frame_start_index + 1) & (AV_PARSER_PTS_NB - 1);
113 s->cur_frame_start_index = k;
114 s->cur_frame_offset[k] = s->cur_offset;
115 s->cur_frame_pts[k] = pts;
116 s->cur_frame_dts[k] = dts;
118 /* fill first PTS/DTS */
119 if (s->fetch_timestamp){
120 s->fetch_timestamp=0;
123 s->cur_frame_pts[k] =
124 s->cur_frame_dts[k] = AV_NOPTS_VALUE;
128 /* WARNING: the returned index can be negative */
129 index = s->parser->parser_parse(s, avctx, poutbuf, poutbuf_size, buf, buf_size);
130 //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);
131 /* update the file pointer */
133 /* fill the data for the current frame */
134 s->frame_offset = s->last_frame_offset;
135 s->pts = s->last_pts;
136 s->dts = s->last_dts;
138 /* offset of the next frame */
139 s->last_frame_offset = s->cur_offset + index;
140 /* find the packet in which the new frame starts. It
141 is tricky because of MPEG video start codes
142 which can begin in one packet and finish in
143 another packet. In the worst case, an MPEG
144 video start code could be in 4 different
146 k = s->cur_frame_start_index;
147 for(i = 0; i < AV_PARSER_PTS_NB; i++) {
148 if (s->last_frame_offset >= s->cur_frame_offset[k])
150 k = (k - 1) & (AV_PARSER_PTS_NB - 1);
153 s->last_pts = s->cur_frame_pts[k];
154 s->last_dts = s->cur_frame_dts[k];
156 /* some parsers tell us the packet size even before seeing the first byte of the next packet,
157 so the next pts/dts is in the next chunk */
158 if(index == buf_size){
159 s->fetch_timestamp=1;
164 s->cur_offset += index;
170 * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed
171 * @deprecated use AVBitstreamFilter
173 int av_parser_change(AVCodecParserContext *s,
174 AVCodecContext *avctx,
175 uint8_t **poutbuf, int *poutbuf_size,
176 const uint8_t *buf, int buf_size, int keyframe){
178 if(s && s->parser->split){
179 if((avctx->flags & CODEC_FLAG_GLOBAL_HEADER) || (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER)){
180 int i= s->parser->split(avctx, buf, buf_size);
186 /* cast to avoid warning about discarding qualifiers */
187 *poutbuf= (uint8_t *) buf;
188 *poutbuf_size= buf_size;
189 if(avctx->extradata){
190 if( (keyframe && (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER))
191 /*||(s->pict_type != I_TYPE && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_NOKEY))*/
192 /*||(? && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_BEGIN)*/){
193 int size= buf_size + avctx->extradata_size;
195 *poutbuf= av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
197 memcpy(*poutbuf, avctx->extradata, avctx->extradata_size);
198 memcpy((*poutbuf) + avctx->extradata_size, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
206 void av_parser_close(AVCodecParserContext *s)
208 if (s->parser->parser_close)
209 s->parser->parser_close(s);
210 av_free(s->priv_data);
214 /*****************************************************/
216 //#define END_NOT_FOUND (-100)
218 #define PICTURE_START_CODE 0x00000100
219 #define SEQ_START_CODE 0x000001b3
220 #define EXT_START_CODE 0x000001b5
221 #define SLICE_MIN_START_CODE 0x00000101
222 #define SLICE_MAX_START_CODE 0x000001af
224 typedef struct ParseContext1{
226 /* XXX/FIXME PC1 vs. PC */
229 int progressive_sequence;
232 /* XXX: suppress that, needed by MPEG4 */
238 * combines the (truncated) bitstream to a complete frame
239 * @returns -1 if no complete frame could be created
241 int ff_combine_frame(ParseContext *pc, int next, uint8_t **buf, int *buf_size)
245 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
246 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
250 /* copy overreaded bytes from last frame into buffer */
251 for(; pc->overread>0; pc->overread--){
252 pc->buffer[pc->index++]= pc->buffer[pc->overread_index++];
255 /* flush remaining if EOF */
256 if(!*buf_size && next == END_NOT_FOUND){
260 pc->last_index= pc->index;
262 /* copy into buffer end return */
263 if(next == END_NOT_FOUND){
264 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, (*buf_size) + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
266 memcpy(&pc->buffer[pc->index], *buf, *buf_size);
267 pc->index += *buf_size;
272 pc->overread_index= pc->index + next;
274 /* append to buffer */
276 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, next + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
278 memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
283 /* store overread bytes */
284 for(;next < 0; next++){
285 pc->state = (pc->state<<8) | pc->buffer[pc->last_index + next];
291 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
292 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
299 /* XXX: merge with libavcodec ? */
300 #define MPEG1_FRAME_RATE_BASE 1001
302 static const int frame_rate_tab[16] = {
314 // libmpeg3's "Unofficial economy rates": (10-13)
319 // random, just to avoid segfault !never encode these
324 #ifdef CONFIG_MPEGVIDEO_PARSER
325 //FIXME move into mpeg12.c
326 static void mpegvideo_extract_headers(AVCodecParserContext *s,
327 AVCodecContext *avctx,
328 const uint8_t *buf, int buf_size)
330 ParseContext1 *pc = s->priv_data;
331 const uint8_t *buf_end;
333 int frame_rate_index, ext_type, bytes_left;
334 int frame_rate_ext_n, frame_rate_ext_d;
335 int picture_structure, top_field_first, repeat_first_field, progressive_frame;
336 int horiz_size_ext, vert_size_ext, bit_rate_ext;
337 //FIXME replace the crap with get_bits()
339 buf_end = buf + buf_size;
340 while (buf < buf_end) {
342 buf= ff_find_start_code(buf, buf_end, &start_code);
343 bytes_left = buf_end - buf;
345 case PICTURE_START_CODE:
346 if (bytes_left >= 2) {
347 s->pict_type = (buf[1] >> 3) & 7;
351 if (bytes_left >= 7) {
352 pc->width = (buf[0] << 4) | (buf[1] >> 4);
353 pc->height = ((buf[1] & 0x0f) << 8) | buf[2];
354 avcodec_set_dimensions(avctx, pc->width, pc->height);
355 frame_rate_index = buf[3] & 0xf;
356 pc->frame_rate = avctx->time_base.den = frame_rate_tab[frame_rate_index];
357 avctx->time_base.num = MPEG1_FRAME_RATE_BASE;
358 avctx->bit_rate = ((buf[4]<<10) | (buf[5]<<2) | (buf[6]>>6))*400;
359 avctx->codec_id = CODEC_ID_MPEG1VIDEO;
364 if (bytes_left >= 1) {
365 ext_type = (buf[0] >> 4);
367 case 0x1: /* sequence extension */
368 if (bytes_left >= 6) {
369 horiz_size_ext = ((buf[1] & 1) << 1) | (buf[2] >> 7);
370 vert_size_ext = (buf[2] >> 5) & 3;
371 bit_rate_ext = ((buf[2] & 0x1F)<<7) | (buf[3]>>1);
372 frame_rate_ext_n = (buf[5] >> 5) & 3;
373 frame_rate_ext_d = (buf[5] & 0x1f);
374 pc->progressive_sequence = buf[1] & (1 << 3);
375 avctx->has_b_frames= !(buf[5] >> 7);
377 pc->width |=(horiz_size_ext << 12);
378 pc->height |=( vert_size_ext << 12);
379 avctx->bit_rate += (bit_rate_ext << 18) * 400;
380 avcodec_set_dimensions(avctx, pc->width, pc->height);
381 avctx->time_base.den = pc->frame_rate * (frame_rate_ext_n + 1);
382 avctx->time_base.num = MPEG1_FRAME_RATE_BASE * (frame_rate_ext_d + 1);
383 avctx->codec_id = CODEC_ID_MPEG2VIDEO;
384 avctx->sub_id = 2; /* forces MPEG2 */
387 case 0x8: /* picture coding extension */
388 if (bytes_left >= 5) {
389 picture_structure = buf[2]&3;
390 top_field_first = buf[3] & (1 << 7);
391 repeat_first_field = buf[3] & (1 << 1);
392 progressive_frame = buf[4] & (1 << 7);
394 /* check if we must repeat the frame */
395 if (repeat_first_field) {
396 if (pc->progressive_sequence) {
401 } else if (progressive_frame) {
406 /* the packet only represents half a frame
407 XXX,FIXME maybe find a different solution */
408 if(picture_structure != 3)
418 /* we stop parsing when we encounter a slice. It ensures
419 that this function takes a negligible amount of time */
420 if (start_code >= SLICE_MIN_START_CODE &&
421 start_code <= SLICE_MAX_START_CODE)
429 static int mpegvideo_parse(AVCodecParserContext *s,
430 AVCodecContext *avctx,
431 uint8_t **poutbuf, int *poutbuf_size,
432 const uint8_t *buf, int buf_size)
434 ParseContext1 *pc1 = s->priv_data;
435 ParseContext *pc= &pc1->pc;
438 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
441 next= ff_mpeg1_find_frame_end(pc, buf, buf_size);
443 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
450 /* we have a full frame : we just parse the first few MPEG headers
451 to have the full timing information. The time take by this
452 function should be negligible for uncorrupted streams */
453 mpegvideo_extract_headers(s, avctx, buf, buf_size);
455 printf("pict_type=%d frame_rate=%0.3f repeat_pict=%d\n",
456 s->pict_type, (double)avctx->time_base.den / avctx->time_base.num, s->repeat_pict);
459 *poutbuf = (uint8_t *)buf;
460 *poutbuf_size = buf_size;
464 static int mpegvideo_split(AVCodecContext *avctx,
465 const uint8_t *buf, int buf_size)
470 for(i=0; i<buf_size; i++){
471 state= (state<<8) | buf[i];
472 if(state != 0x1B3 && state != 0x1B5 && state < 0x200 && state >= 0x100)
477 #endif /* CONFIG_MPEGVIDEO_PARSER */
479 void ff_parse_close(AVCodecParserContext *s)
481 ParseContext *pc = s->priv_data;
486 static void parse1_close(AVCodecParserContext *s)
488 ParseContext1 *pc1 = s->priv_data;
490 av_free(pc1->pc.buffer);
494 /*************************/
496 #ifdef CONFIG_MPEG4VIDEO_PARSER
498 /* XXX: make it use less memory */
499 static int av_mpeg4_decode_header(AVCodecParserContext *s1,
500 AVCodecContext *avctx,
501 const uint8_t *buf, int buf_size)
503 ParseContext1 *pc = s1->priv_data;
504 MpegEncContext *s = pc->enc;
505 GetBitContext gb1, *gb = &gb1;
509 s->current_picture_ptr = &s->current_picture;
511 if (avctx->extradata_size && pc->first_picture){
512 init_get_bits(gb, avctx->extradata, avctx->extradata_size*8);
513 ret = ff_mpeg4_decode_picture_header(s, gb);
516 init_get_bits(gb, buf, 8 * buf_size);
517 ret = ff_mpeg4_decode_picture_header(s, gb);
519 avcodec_set_dimensions(avctx, s->width, s->height);
521 s1->pict_type= s->pict_type;
522 pc->first_picture = 0;
526 static int mpeg4video_parse_init(AVCodecParserContext *s)
528 ParseContext1 *pc = s->priv_data;
530 pc->enc = av_mallocz(sizeof(MpegEncContext));
533 pc->first_picture = 1;
537 static int mpeg4video_parse(AVCodecParserContext *s,
538 AVCodecContext *avctx,
539 uint8_t **poutbuf, int *poutbuf_size,
540 const uint8_t *buf, int buf_size)
542 ParseContext *pc = s->priv_data;
545 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
548 next= ff_mpeg4_find_frame_end(pc, buf, buf_size);
550 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
556 av_mpeg4_decode_header(s, avctx, buf, buf_size);
558 *poutbuf = (uint8_t *)buf;
559 *poutbuf_size = buf_size;
564 #ifdef CONFIG_CAVSVIDEO_PARSER
565 static int cavsvideo_parse(AVCodecParserContext *s,
566 AVCodecContext *avctx,
567 uint8_t **poutbuf, int *poutbuf_size,
568 const uint8_t *buf, int buf_size)
570 ParseContext *pc = s->priv_data;
573 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
576 next= ff_cavs_find_frame_end(pc, buf, buf_size);
578 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
584 *poutbuf = (uint8_t *)buf;
585 *poutbuf_size = buf_size;
588 #endif /* CONFIG_CAVSVIDEO_PARSER */
590 static int mpeg4video_split(AVCodecContext *avctx,
591 const uint8_t *buf, int buf_size)
596 for(i=0; i<buf_size; i++){
597 state= (state<<8) | buf[i];
598 if(state == 0x1B3 || state == 0x1B6)
604 /*************************/
606 #ifdef CONFIG_MPEGAUDIO_PARSER
607 typedef struct MpegAudioParseContext {
608 uint8_t inbuf[MPA_MAX_CODED_FRAME_SIZE]; /* input buffer */
611 int free_format_frame_size;
612 int free_format_next_header;
615 } MpegAudioParseContext;
617 #define MPA_HEADER_SIZE 4
619 /* header + layer + bitrate + freq + lsf/mpeg25 */
620 #undef SAME_HEADER_MASK /* mpegaudio.h defines different version */
621 #define SAME_HEADER_MASK \
622 (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19))
624 static int mpegaudio_parse_init(AVCodecParserContext *s1)
626 MpegAudioParseContext *s = s1->priv_data;
627 s->inbuf_ptr = s->inbuf;
631 static int mpegaudio_parse(AVCodecParserContext *s1,
632 AVCodecContext *avctx,
633 uint8_t **poutbuf, int *poutbuf_size,
634 const uint8_t *buf, int buf_size)
636 MpegAudioParseContext *s = s1->priv_data;
639 const uint8_t *buf_ptr;
644 while (buf_size > 0) {
645 len = s->inbuf_ptr - s->inbuf;
646 if (s->frame_size == 0) {
647 /* special case for next header for first frame in free
648 format case (XXX: find a simpler method) */
649 if (s->free_format_next_header != 0) {
650 s->inbuf[0] = s->free_format_next_header >> 24;
651 s->inbuf[1] = s->free_format_next_header >> 16;
652 s->inbuf[2] = s->free_format_next_header >> 8;
653 s->inbuf[3] = s->free_format_next_header;
654 s->inbuf_ptr = s->inbuf + 4;
655 s->free_format_next_header = 0;
658 /* no header seen : find one. We need at least MPA_HEADER_SIZE
660 len = FFMIN(MPA_HEADER_SIZE - len, buf_size);
662 memcpy(s->inbuf_ptr, buf_ptr, len);
667 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) {
669 header = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
670 (s->inbuf[2] << 8) | s->inbuf[3];
672 ret = mpa_decode_header(avctx, header, &sr);
675 /* no sync found : move by one byte (inefficient, but simple!) */
676 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
678 dprintf("skip %x\n", header);
679 /* reset free format frame size to give a chance
680 to get a new bitrate */
681 s->free_format_frame_size = 0;
683 if((header&SAME_HEADER_MASK) != (s->header&SAME_HEADER_MASK) && s->header)
690 /* free format: prepare to compute frame size */
691 if (decode_header(s, header) == 1) {
696 if(s->header_count > 1)
697 avctx->sample_rate= sr;
701 if (s->frame_size == -1) {
702 /* free format : find next sync to compute frame size */
703 len = MPA_MAX_CODED_FRAME_SIZE - len;
707 /* frame too long: resync */
709 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
716 memcpy(s->inbuf_ptr, buf_ptr, len);
717 /* check for header */
718 p = s->inbuf_ptr - 3;
719 pend = s->inbuf_ptr + len - 4;
721 header = (p[0] << 24) | (p[1] << 16) |
723 header1 = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
724 (s->inbuf[2] << 8) | s->inbuf[3];
725 /* check with high probability that we have a
727 if ((header & SAME_HEADER_MASK) ==
728 (header1 & SAME_HEADER_MASK)) {
729 /* header found: update pointers */
730 len = (p + 4) - s->inbuf_ptr;
734 /* compute frame size */
735 s->free_format_next_header = header;
736 s->free_format_frame_size = s->inbuf_ptr - s->inbuf;
737 padding = (header1 >> 9) & 1;
739 s->free_format_frame_size -= padding * 4;
741 s->free_format_frame_size -= padding;
742 dprintf("free frame size=%d padding=%d\n",
743 s->free_format_frame_size, padding);
744 decode_header(s, header1);
749 /* not found: simply increase pointers */
756 if (len < s->frame_size) {
757 if (s->frame_size > MPA_MAX_CODED_FRAME_SIZE)
758 s->frame_size = MPA_MAX_CODED_FRAME_SIZE;
759 len = FFMIN(s->frame_size - len, buf_size);
760 memcpy(s->inbuf_ptr, buf_ptr, len);
766 if(s->frame_size > 0 && buf_ptr - buf == s->inbuf_ptr - s->inbuf
767 && buf_size + buf_ptr - buf >= s->frame_size){
768 if(s->header_count > 0){
770 *poutbuf_size = s->frame_size;
772 buf_ptr = buf + s->frame_size;
773 s->inbuf_ptr = s->inbuf;
779 if (s->frame_size > 0 &&
780 (s->inbuf_ptr - s->inbuf) >= s->frame_size) {
781 if(s->header_count > 0){
783 *poutbuf_size = s->inbuf_ptr - s->inbuf;
785 s->inbuf_ptr = s->inbuf;
790 return buf_ptr - buf;
792 #endif /* CONFIG_MPEGAUDIO_PARSER */
794 #if defined(CONFIG_AC3_PARSER) || defined(CONFIG_AAC_PARSER)
795 /* also used for ADTS AAC */
796 typedef struct AC3ParseContext {
800 int (*sync)(const uint8_t *buf, int *channels, int *sample_rate,
801 int *bit_rate, int *samples);
802 uint8_t inbuf[8192]; /* input buffer */
805 #define AC3_HEADER_SIZE 7
806 #define AAC_HEADER_SIZE 7
808 #ifdef CONFIG_AC3_PARSER
809 static const int ac3_sample_rates[4] = {
810 48000, 44100, 32000, 0
813 static const int ac3_frame_sizes[64][3] = {
846 { 1024, 1114, 1536 },
847 { 1024, 1115, 1536 },
848 { 1152, 1253, 1728 },
849 { 1152, 1254, 1728 },
850 { 1280, 1393, 1920 },
851 { 1280, 1394, 1920 },
854 static const int ac3_bitrates[64] = {
855 32, 32, 40, 40, 48, 48, 56, 56, 64, 64, 80, 80, 96, 96, 112, 112,
856 128, 128, 160, 160, 192, 192, 224, 224, 256, 256, 320, 320, 384,
857 384, 448, 448, 512, 512, 576, 576, 640, 640,
860 static const int ac3_channels[8] = {
861 2, 1, 2, 3, 3, 4, 4, 5
863 #endif /* CONFIG_AC3_PARSER */
865 #ifdef CONFIG_AAC_PARSER
866 static const int aac_sample_rates[16] = {
867 96000, 88200, 64000, 48000, 44100, 32000,
868 24000, 22050, 16000, 12000, 11025, 8000, 7350
871 static const int aac_channels[8] = {
872 0, 1, 2, 3, 4, 5, 6, 8
876 #ifdef CONFIG_AC3_PARSER
877 static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
878 int *bit_rate, int *samples)
880 unsigned int fscod, frmsizecod, acmod, bsid, lfeon;
883 init_get_bits(&bits, buf, AC3_HEADER_SIZE * 8);
885 if(get_bits(&bits, 16) != 0x0b77)
888 skip_bits(&bits, 16); /* crc */
889 fscod = get_bits(&bits, 2);
890 frmsizecod = get_bits(&bits, 6);
892 if(!ac3_sample_rates[fscod])
895 bsid = get_bits(&bits, 5);
898 skip_bits(&bits, 3); /* bsmod */
899 acmod = get_bits(&bits, 3);
900 if(acmod & 1 && acmod != 1)
901 skip_bits(&bits, 2); /* cmixlev */
903 skip_bits(&bits, 2); /* surmixlev */
905 skip_bits(&bits, 2); /* dsurmod */
906 lfeon = get_bits1(&bits);
908 *sample_rate = ac3_sample_rates[fscod];
909 *bit_rate = ac3_bitrates[frmsizecod] * 1000;
910 *channels = ac3_channels[acmod] + lfeon;
913 return ac3_frame_sizes[frmsizecod][fscod] * 2;
915 #endif /* CONFIG_AC3_PARSER */
917 #ifdef CONFIG_AAC_PARSER
918 static int aac_sync(const uint8_t *buf, int *channels, int *sample_rate,
919 int *bit_rate, int *samples)
922 int size, rdb, ch, sr;
924 init_get_bits(&bits, buf, AAC_HEADER_SIZE * 8);
926 if(get_bits(&bits, 12) != 0xfff)
929 skip_bits1(&bits); /* id */
930 skip_bits(&bits, 2); /* layer */
931 skip_bits1(&bits); /* protection_absent */
932 skip_bits(&bits, 2); /* profile_objecttype */
933 sr = get_bits(&bits, 4); /* sample_frequency_index */
934 if(!aac_sample_rates[sr])
936 skip_bits1(&bits); /* private_bit */
937 ch = get_bits(&bits, 3); /* channel_configuration */
938 if(!aac_channels[ch])
940 skip_bits1(&bits); /* original/copy */
941 skip_bits1(&bits); /* home */
943 /* adts_variable_header */
944 skip_bits1(&bits); /* copyright_identification_bit */
945 skip_bits1(&bits); /* copyright_identification_start */
946 size = get_bits(&bits, 13); /* aac_frame_length */
947 skip_bits(&bits, 11); /* adts_buffer_fullness */
948 rdb = get_bits(&bits, 2); /* number_of_raw_data_blocks_in_frame */
950 *channels = aac_channels[ch];
951 *sample_rate = aac_sample_rates[sr];
952 *samples = (rdb + 1) * 1024;
953 *bit_rate = size * 8 * *sample_rate / *samples;
957 #endif /* CONFIG_AAC_PARSER */
959 #ifdef CONFIG_AC3_PARSER
960 static int ac3_parse_init(AVCodecParserContext *s1)
962 AC3ParseContext *s = s1->priv_data;
963 s->inbuf_ptr = s->inbuf;
964 s->header_size = AC3_HEADER_SIZE;
970 #ifdef CONFIG_AAC_PARSER
971 static int aac_parse_init(AVCodecParserContext *s1)
973 AC3ParseContext *s = s1->priv_data;
974 s->inbuf_ptr = s->inbuf;
975 s->header_size = AAC_HEADER_SIZE;
981 /* also used for ADTS AAC */
982 static int ac3_parse(AVCodecParserContext *s1,
983 AVCodecContext *avctx,
984 uint8_t **poutbuf, int *poutbuf_size,
985 const uint8_t *buf, int buf_size)
987 AC3ParseContext *s = s1->priv_data;
988 const uint8_t *buf_ptr;
989 int len, sample_rate, bit_rate, channels, samples;
995 while (buf_size > 0) {
996 len = s->inbuf_ptr - s->inbuf;
997 if (s->frame_size == 0) {
998 /* no header seen : find one. We need at least s->header_size
1000 len = FFMIN(s->header_size - len, buf_size);
1002 memcpy(s->inbuf_ptr, buf_ptr, len);
1004 s->inbuf_ptr += len;
1006 if ((s->inbuf_ptr - s->inbuf) == s->header_size) {
1007 len = s->sync(s->inbuf, &channels, &sample_rate, &bit_rate,
1010 /* no sync found : move by one byte (inefficient, but simple!) */
1011 memmove(s->inbuf, s->inbuf + 1, s->header_size - 1);
1014 s->frame_size = len;
1015 /* update codec info */
1016 avctx->sample_rate = sample_rate;
1017 /* set channels,except if the user explicitly requests 1 or 2 channels, XXX/FIXME this is a bit ugly */
1018 if(avctx->codec_id == CODEC_ID_AC3){
1019 if(avctx->channels!=1 && avctx->channels!=2){
1020 avctx->channels = channels;
1023 avctx->channels = channels;
1025 avctx->bit_rate = bit_rate;
1026 avctx->frame_size = samples;
1030 len = FFMIN(s->frame_size - len, buf_size);
1032 memcpy(s->inbuf_ptr, buf_ptr, len);
1034 s->inbuf_ptr += len;
1037 if(s->inbuf_ptr - s->inbuf == s->frame_size){
1038 *poutbuf = s->inbuf;
1039 *poutbuf_size = s->frame_size;
1040 s->inbuf_ptr = s->inbuf;
1046 return buf_ptr - buf;
1048 #endif /* CONFIG_AC3_PARSER || CONFIG_AAC_PARSER */
1050 #ifdef CONFIG_MPEGVIDEO_PARSER
1051 AVCodecParser mpegvideo_parser = {
1052 { CODEC_ID_MPEG1VIDEO, CODEC_ID_MPEG2VIDEO },
1053 sizeof(ParseContext1),
1060 #ifdef CONFIG_MPEG4VIDEO_PARSER
1061 AVCodecParser mpeg4video_parser = {
1063 sizeof(ParseContext1),
1064 mpeg4video_parse_init,
1070 #ifdef CONFIG_CAVSVIDEO_PARSER
1071 AVCodecParser cavsvideo_parser = {
1073 sizeof(ParseContext1),
1080 #ifdef CONFIG_MPEGAUDIO_PARSER
1081 AVCodecParser mpegaudio_parser = {
1082 { CODEC_ID_MP2, CODEC_ID_MP3 },
1083 sizeof(MpegAudioParseContext),
1084 mpegaudio_parse_init,
1089 #ifdef CONFIG_AC3_PARSER
1090 AVCodecParser ac3_parser = {
1092 sizeof(AC3ParseContext),
1098 #ifdef CONFIG_AAC_PARSER
1099 AVCodecParser aac_parser = {
1101 sizeof(AC3ParseContext),