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
148 * @deprecated use AVBitstreamFilter
150 int av_parser_change(AVCodecParserContext *s,
151 AVCodecContext *avctx,
152 uint8_t **poutbuf, int *poutbuf_size,
153 const uint8_t *buf, int buf_size, int keyframe){
155 if(s && s->parser->split){
156 if((avctx->flags & CODEC_FLAG_GLOBAL_HEADER) || (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER)){
157 int i= s->parser->split(avctx, buf, buf_size);
163 /* cast to avoid warning about discarding qualifiers */
164 *poutbuf= (uint8_t *) buf;
165 *poutbuf_size= buf_size;
166 if(avctx->extradata){
167 if( (keyframe && (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER))
168 /*||(s->pict_type != I_TYPE && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_NOKEY))*/
169 /*||(? && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_BEGIN)*/){
170 int size= buf_size + avctx->extradata_size;
172 *poutbuf= av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
174 memcpy(*poutbuf, avctx->extradata, avctx->extradata_size);
175 memcpy((*poutbuf) + avctx->extradata_size, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
183 void av_parser_close(AVCodecParserContext *s)
185 if (s->parser->parser_close)
186 s->parser->parser_close(s);
187 av_free(s->priv_data);
191 /*****************************************************/
193 //#define END_NOT_FOUND (-100)
195 #define PICTURE_START_CODE 0x00000100
196 #define SEQ_START_CODE 0x000001b3
197 #define EXT_START_CODE 0x000001b5
198 #define SLICE_MIN_START_CODE 0x00000101
199 #define SLICE_MAX_START_CODE 0x000001af
201 typedef struct ParseContext1{
203 /* XXX/FIXME PC1 vs. PC */
206 int progressive_sequence;
209 /* XXX: suppress that, needed by MPEG4 */
215 * combines the (truncated) bitstream to a complete frame
216 * @returns -1 if no complete frame could be created
218 int ff_combine_frame(ParseContext *pc, int next, uint8_t **buf, int *buf_size)
222 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
223 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
227 /* copy overreaded bytes from last frame into buffer */
228 for(; pc->overread>0; pc->overread--){
229 pc->buffer[pc->index++]= pc->buffer[pc->overread_index++];
232 /* flush remaining if EOF */
233 if(!*buf_size && next == END_NOT_FOUND){
237 pc->last_index= pc->index;
239 /* copy into buffer end return */
240 if(next == END_NOT_FOUND){
241 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, (*buf_size) + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
243 memcpy(&pc->buffer[pc->index], *buf, *buf_size);
244 pc->index += *buf_size;
249 pc->overread_index= pc->index + next;
251 /* append to buffer */
253 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, next + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
255 memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
260 /* store overread bytes */
261 for(;next < 0; next++){
262 pc->state = (pc->state<<8) | pc->buffer[pc->last_index + next];
268 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
269 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
276 /* XXX: merge with libavcodec ? */
277 #define MPEG1_FRAME_RATE_BASE 1001
279 static const int frame_rate_tab[16] = {
291 // libmpeg3's "Unofficial economy rates": (10-13)
296 // random, just to avoid segfault !never encode these
301 #ifdef CONFIG_MPEGVIDEO_PARSER
302 //FIXME move into mpeg12.c
303 static void mpegvideo_extract_headers(AVCodecParserContext *s,
304 AVCodecContext *avctx,
305 const uint8_t *buf, int buf_size)
307 ParseContext1 *pc = s->priv_data;
308 const uint8_t *buf_end;
310 int frame_rate_index, ext_type, bytes_left;
311 int frame_rate_ext_n, frame_rate_ext_d;
312 int picture_structure, top_field_first, repeat_first_field, progressive_frame;
313 int horiz_size_ext, vert_size_ext, bit_rate_ext;
314 //FIXME replace the crap with get_bits()
316 buf_end = buf + buf_size;
317 while (buf < buf_end) {
319 buf= ff_find_start_code(buf, buf_end, &start_code);
320 bytes_left = buf_end - buf;
322 case PICTURE_START_CODE:
323 if (bytes_left >= 2) {
324 s->pict_type = (buf[1] >> 3) & 7;
328 if (bytes_left >= 7) {
329 pc->width = (buf[0] << 4) | (buf[1] >> 4);
330 pc->height = ((buf[1] & 0x0f) << 8) | buf[2];
331 avcodec_set_dimensions(avctx, pc->width, pc->height);
332 frame_rate_index = buf[3] & 0xf;
333 pc->frame_rate = avctx->time_base.den = frame_rate_tab[frame_rate_index];
334 avctx->time_base.num = MPEG1_FRAME_RATE_BASE;
335 avctx->bit_rate = ((buf[4]<<10) | (buf[5]<<2) | (buf[6]>>6))*400;
336 avctx->codec_id = CODEC_ID_MPEG1VIDEO;
341 if (bytes_left >= 1) {
342 ext_type = (buf[0] >> 4);
344 case 0x1: /* sequence extension */
345 if (bytes_left >= 6) {
346 horiz_size_ext = ((buf[1] & 1) << 1) | (buf[2] >> 7);
347 vert_size_ext = (buf[2] >> 5) & 3;
348 bit_rate_ext = ((buf[2] & 0x1F)<<7) | (buf[3]>>1);
349 frame_rate_ext_n = (buf[5] >> 5) & 3;
350 frame_rate_ext_d = (buf[5] & 0x1f);
351 pc->progressive_sequence = buf[1] & (1 << 3);
352 avctx->has_b_frames= !(buf[5] >> 7);
354 pc->width |=(horiz_size_ext << 12);
355 pc->height |=( vert_size_ext << 12);
356 avctx->bit_rate += (bit_rate_ext << 18) * 400;
357 avcodec_set_dimensions(avctx, pc->width, pc->height);
358 avctx->time_base.den = pc->frame_rate * (frame_rate_ext_n + 1);
359 avctx->time_base.num = MPEG1_FRAME_RATE_BASE * (frame_rate_ext_d + 1);
360 avctx->codec_id = CODEC_ID_MPEG2VIDEO;
361 avctx->sub_id = 2; /* forces MPEG2 */
364 case 0x8: /* picture coding extension */
365 if (bytes_left >= 5) {
366 picture_structure = buf[2]&3;
367 top_field_first = buf[3] & (1 << 7);
368 repeat_first_field = buf[3] & (1 << 1);
369 progressive_frame = buf[4] & (1 << 7);
371 /* check if we must repeat the frame */
372 if (repeat_first_field) {
373 if (pc->progressive_sequence) {
378 } else if (progressive_frame) {
383 /* the packet only represents half a frame
384 XXX,FIXME maybe find a different solution */
385 if(picture_structure != 3)
395 /* we stop parsing when we encounter a slice. It ensures
396 that this function takes a negligible amount of time */
397 if (start_code >= SLICE_MIN_START_CODE &&
398 start_code <= SLICE_MAX_START_CODE)
406 static int mpegvideo_parse(AVCodecParserContext *s,
407 AVCodecContext *avctx,
408 uint8_t **poutbuf, int *poutbuf_size,
409 const uint8_t *buf, int buf_size)
411 ParseContext1 *pc1 = s->priv_data;
412 ParseContext *pc= &pc1->pc;
415 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
418 next= ff_mpeg1_find_frame_end(pc, buf, buf_size);
420 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
427 /* we have a full frame : we just parse the first few MPEG headers
428 to have the full timing information. The time take by this
429 function should be negligible for uncorrupted streams */
430 mpegvideo_extract_headers(s, avctx, buf, buf_size);
432 printf("pict_type=%d frame_rate=%0.3f repeat_pict=%d\n",
433 s->pict_type, (double)avctx->time_base.den / avctx->time_base.num, s->repeat_pict);
436 *poutbuf = (uint8_t *)buf;
437 *poutbuf_size = buf_size;
441 static int mpegvideo_split(AVCodecContext *avctx,
442 const uint8_t *buf, int buf_size)
447 for(i=0; i<buf_size; i++){
448 state= (state<<8) | buf[i];
449 if(state != 0x1B3 && state != 0x1B5 && state < 0x200 && state >= 0x100)
454 #endif /* CONFIG_MPEGVIDEO_PARSER */
456 void ff_parse_close(AVCodecParserContext *s)
458 ParseContext *pc = s->priv_data;
463 static void parse1_close(AVCodecParserContext *s)
465 ParseContext1 *pc1 = s->priv_data;
467 av_free(pc1->pc.buffer);
471 /*************************/
473 #ifdef CONFIG_MPEG4VIDEO_PARSER
475 /* XXX: make it use less memory */
476 static int av_mpeg4_decode_header(AVCodecParserContext *s1,
477 AVCodecContext *avctx,
478 const uint8_t *buf, int buf_size)
480 ParseContext1 *pc = s1->priv_data;
481 MpegEncContext *s = pc->enc;
482 GetBitContext gb1, *gb = &gb1;
486 s->current_picture_ptr = &s->current_picture;
488 if (avctx->extradata_size && pc->first_picture){
489 init_get_bits(gb, avctx->extradata, avctx->extradata_size*8);
490 ret = ff_mpeg4_decode_picture_header(s, gb);
493 init_get_bits(gb, buf, 8 * buf_size);
494 ret = ff_mpeg4_decode_picture_header(s, gb);
496 avcodec_set_dimensions(avctx, s->width, s->height);
498 s1->pict_type= s->pict_type;
499 pc->first_picture = 0;
503 static int mpeg4video_parse_init(AVCodecParserContext *s)
505 ParseContext1 *pc = s->priv_data;
507 pc->enc = av_mallocz(sizeof(MpegEncContext));
510 pc->first_picture = 1;
514 static int mpeg4video_parse(AVCodecParserContext *s,
515 AVCodecContext *avctx,
516 uint8_t **poutbuf, int *poutbuf_size,
517 const uint8_t *buf, int buf_size)
519 ParseContext *pc = s->priv_data;
522 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
525 next= ff_mpeg4_find_frame_end(pc, buf, buf_size);
527 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
533 av_mpeg4_decode_header(s, avctx, buf, buf_size);
535 *poutbuf = (uint8_t *)buf;
536 *poutbuf_size = buf_size;
541 #ifdef CONFIG_CAVSVIDEO_PARSER
542 static int cavsvideo_parse(AVCodecParserContext *s,
543 AVCodecContext *avctx,
544 uint8_t **poutbuf, int *poutbuf_size,
545 const uint8_t *buf, int buf_size)
547 ParseContext *pc = s->priv_data;
550 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
553 next= ff_cavs_find_frame_end(pc, buf, buf_size);
555 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
561 *poutbuf = (uint8_t *)buf;
562 *poutbuf_size = buf_size;
565 #endif /* CONFIG_CAVSVIDEO_PARSER */
567 static int mpeg4video_split(AVCodecContext *avctx,
568 const uint8_t *buf, int buf_size)
573 for(i=0; i<buf_size; i++){
574 state= (state<<8) | buf[i];
575 if(state == 0x1B3 || state == 0x1B6)
581 /*************************/
583 #ifdef CONFIG_MPEGAUDIO_PARSER
584 typedef struct MpegAudioParseContext {
585 uint8_t inbuf[MPA_MAX_CODED_FRAME_SIZE]; /* input buffer */
588 int free_format_frame_size;
589 int free_format_next_header;
592 } MpegAudioParseContext;
594 #define MPA_HEADER_SIZE 4
596 /* header + layer + bitrate + freq + lsf/mpeg25 */
597 #undef SAME_HEADER_MASK /* mpegaudio.h defines different version */
598 #define SAME_HEADER_MASK \
599 (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19))
601 static int mpegaudio_parse_init(AVCodecParserContext *s1)
603 MpegAudioParseContext *s = s1->priv_data;
604 s->inbuf_ptr = s->inbuf;
608 static int mpegaudio_parse(AVCodecParserContext *s1,
609 AVCodecContext *avctx,
610 uint8_t **poutbuf, int *poutbuf_size,
611 const uint8_t *buf, int buf_size)
613 MpegAudioParseContext *s = s1->priv_data;
616 const uint8_t *buf_ptr;
621 while (buf_size > 0) {
622 len = s->inbuf_ptr - s->inbuf;
623 if (s->frame_size == 0) {
624 /* special case for next header for first frame in free
625 format case (XXX: find a simpler method) */
626 if (s->free_format_next_header != 0) {
627 s->inbuf[0] = s->free_format_next_header >> 24;
628 s->inbuf[1] = s->free_format_next_header >> 16;
629 s->inbuf[2] = s->free_format_next_header >> 8;
630 s->inbuf[3] = s->free_format_next_header;
631 s->inbuf_ptr = s->inbuf + 4;
632 s->free_format_next_header = 0;
635 /* no header seen : find one. We need at least MPA_HEADER_SIZE
637 len = MPA_HEADER_SIZE - len;
641 memcpy(s->inbuf_ptr, buf_ptr, len);
646 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) {
648 sr= avctx->sample_rate;
649 header = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
650 (s->inbuf[2] << 8) | s->inbuf[3];
652 ret = mpa_decode_header(avctx, header);
655 /* no sync found : move by one byte (inefficient, but simple!) */
656 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
658 dprintf("skip %x\n", header);
659 /* reset free format frame size to give a chance
660 to get a new bitrate */
661 s->free_format_frame_size = 0;
663 if((header&SAME_HEADER_MASK) != (s->header&SAME_HEADER_MASK) && s->header)
670 /* free format: prepare to compute frame size */
671 if (decode_header(s, header) == 1) {
676 if(s->header_count <= 0)
677 avctx->sample_rate= sr; //FIXME ugly
681 if (s->frame_size == -1) {
682 /* free format : find next sync to compute frame size */
683 len = MPA_MAX_CODED_FRAME_SIZE - len;
687 /* frame too long: resync */
689 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
696 memcpy(s->inbuf_ptr, buf_ptr, len);
697 /* check for header */
698 p = s->inbuf_ptr - 3;
699 pend = s->inbuf_ptr + len - 4;
701 header = (p[0] << 24) | (p[1] << 16) |
703 header1 = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
704 (s->inbuf[2] << 8) | s->inbuf[3];
705 /* check with high probability that we have a
707 if ((header & SAME_HEADER_MASK) ==
708 (header1 & SAME_HEADER_MASK)) {
709 /* header found: update pointers */
710 len = (p + 4) - s->inbuf_ptr;
714 /* compute frame size */
715 s->free_format_next_header = header;
716 s->free_format_frame_size = s->inbuf_ptr - s->inbuf;
717 padding = (header1 >> 9) & 1;
719 s->free_format_frame_size -= padding * 4;
721 s->free_format_frame_size -= padding;
722 dprintf("free frame size=%d padding=%d\n",
723 s->free_format_frame_size, padding);
724 decode_header(s, header1);
729 /* not found: simply increase pointers */
736 if (len < s->frame_size) {
737 if (s->frame_size > MPA_MAX_CODED_FRAME_SIZE)
738 s->frame_size = MPA_MAX_CODED_FRAME_SIZE;
739 len = s->frame_size - len;
742 memcpy(s->inbuf_ptr, buf_ptr, len);
748 if (s->frame_size > 0 &&
749 (s->inbuf_ptr - s->inbuf) >= s->frame_size) {
750 if(s->header_count > 0){
752 *poutbuf_size = s->inbuf_ptr - s->inbuf;
754 s->inbuf_ptr = s->inbuf;
759 return buf_ptr - buf;
761 #endif /* CONFIG_MPEGAUDIO_PARSER */
763 #if defined(CONFIG_AC3_PARSER) || defined(CONFIG_AAC_PARSER)
764 /* also used for ADTS AAC */
765 typedef struct AC3ParseContext {
769 int (*sync)(const uint8_t *buf, int *channels, int *sample_rate,
770 int *bit_rate, int *samples);
771 uint8_t inbuf[8192]; /* input buffer */
774 #define AC3_HEADER_SIZE 7
775 #define AAC_HEADER_SIZE 7
777 #ifdef CONFIG_AC3_PARSER
778 static const int ac3_sample_rates[4] = {
779 48000, 44100, 32000, 0
782 static const int ac3_frame_sizes[64][3] = {
815 { 1024, 1114, 1536 },
816 { 1024, 1115, 1536 },
817 { 1152, 1253, 1728 },
818 { 1152, 1254, 1728 },
819 { 1280, 1393, 1920 },
820 { 1280, 1394, 1920 },
823 static const int ac3_bitrates[64] = {
824 32, 32, 40, 40, 48, 48, 56, 56, 64, 64, 80, 80, 96, 96, 112, 112,
825 128, 128, 160, 160, 192, 192, 224, 224, 256, 256, 320, 320, 384,
826 384, 448, 448, 512, 512, 576, 576, 640, 640,
829 static const int ac3_channels[8] = {
830 2, 1, 2, 3, 3, 4, 4, 5
832 #endif /* CONFIG_AC3_PARSER */
834 #ifdef CONFIG_AAC_PARSER
835 static const int aac_sample_rates[16] = {
836 96000, 88200, 64000, 48000, 44100, 32000,
837 24000, 22050, 16000, 12000, 11025, 8000, 7350
840 static const int aac_channels[8] = {
841 0, 1, 2, 3, 4, 5, 6, 8
845 #ifdef CONFIG_AC3_PARSER
846 static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
847 int *bit_rate, int *samples)
849 unsigned int fscod, frmsizecod, acmod, bsid, lfeon;
852 init_get_bits(&bits, buf, AC3_HEADER_SIZE * 8);
854 if(get_bits(&bits, 16) != 0x0b77)
857 skip_bits(&bits, 16); /* crc */
858 fscod = get_bits(&bits, 2);
859 frmsizecod = get_bits(&bits, 6);
861 if(!ac3_sample_rates[fscod])
864 bsid = get_bits(&bits, 5);
867 skip_bits(&bits, 3); /* bsmod */
868 acmod = get_bits(&bits, 3);
869 if(acmod & 1 && acmod != 1)
870 skip_bits(&bits, 2); /* cmixlev */
872 skip_bits(&bits, 2); /* surmixlev */
874 skip_bits(&bits, 2); /* dsurmod */
875 lfeon = get_bits1(&bits);
877 *sample_rate = ac3_sample_rates[fscod];
878 *bit_rate = ac3_bitrates[frmsizecod] * 1000;
879 *channels = ac3_channels[acmod] + lfeon;
882 return ac3_frame_sizes[frmsizecod][fscod] * 2;
884 #endif /* CONFIG_AC3_PARSER */
886 #ifdef CONFIG_AAC_PARSER
887 static int aac_sync(const uint8_t *buf, int *channels, int *sample_rate,
888 int *bit_rate, int *samples)
891 int size, rdb, ch, sr;
893 init_get_bits(&bits, buf, AAC_HEADER_SIZE * 8);
895 if(get_bits(&bits, 12) != 0xfff)
898 skip_bits1(&bits); /* id */
899 skip_bits(&bits, 2); /* layer */
900 skip_bits1(&bits); /* protection_absent */
901 skip_bits(&bits, 2); /* profile_objecttype */
902 sr = get_bits(&bits, 4); /* sample_frequency_index */
903 if(!aac_sample_rates[sr])
905 skip_bits1(&bits); /* private_bit */
906 ch = get_bits(&bits, 3); /* channel_configuration */
907 if(!aac_channels[ch])
909 skip_bits1(&bits); /* original/copy */
910 skip_bits1(&bits); /* home */
912 /* adts_variable_header */
913 skip_bits1(&bits); /* copyright_identification_bit */
914 skip_bits1(&bits); /* copyright_identification_start */
915 size = get_bits(&bits, 13); /* aac_frame_length */
916 skip_bits(&bits, 11); /* adts_buffer_fullness */
917 rdb = get_bits(&bits, 2); /* number_of_raw_data_blocks_in_frame */
919 *channels = aac_channels[ch];
920 *sample_rate = aac_sample_rates[sr];
921 *samples = (rdb + 1) * 1024;
922 *bit_rate = size * 8 * *sample_rate / *samples;
926 #endif /* CONFIG_AAC_PARSER */
928 #ifdef CONFIG_AC3_PARSER
929 static int ac3_parse_init(AVCodecParserContext *s1)
931 AC3ParseContext *s = s1->priv_data;
932 s->inbuf_ptr = s->inbuf;
933 s->header_size = AC3_HEADER_SIZE;
939 #ifdef CONFIG_AAC_PARSER
940 static int aac_parse_init(AVCodecParserContext *s1)
942 AC3ParseContext *s = s1->priv_data;
943 s->inbuf_ptr = s->inbuf;
944 s->header_size = AAC_HEADER_SIZE;
950 /* also used for ADTS AAC */
951 static int ac3_parse(AVCodecParserContext *s1,
952 AVCodecContext *avctx,
953 uint8_t **poutbuf, int *poutbuf_size,
954 const uint8_t *buf, int buf_size)
956 AC3ParseContext *s = s1->priv_data;
957 const uint8_t *buf_ptr;
958 int len, sample_rate, bit_rate, channels, samples;
964 while (buf_size > 0) {
965 len = s->inbuf_ptr - s->inbuf;
966 if (s->frame_size == 0) {
967 /* no header seen : find one. We need at least s->header_size
969 len = FFMIN(s->header_size - len, buf_size);
971 memcpy(s->inbuf_ptr, buf_ptr, len);
975 if ((s->inbuf_ptr - s->inbuf) == s->header_size) {
976 len = s->sync(s->inbuf, &channels, &sample_rate, &bit_rate,
979 /* no sync found : move by one byte (inefficient, but simple!) */
980 memmove(s->inbuf, s->inbuf + 1, s->header_size - 1);
984 /* update codec info */
985 avctx->sample_rate = sample_rate;
986 /* set channels,except if the user explicitly requests 1 or 2 channels, XXX/FIXME this is a bit ugly */
987 if(avctx->codec_id == CODEC_ID_AC3){
988 if(avctx->channels!=1 && avctx->channels!=2){
989 avctx->channels = channels;
992 avctx->channels = channels;
994 avctx->bit_rate = bit_rate;
995 avctx->frame_size = samples;
999 len = FFMIN(s->frame_size - len, buf_size);
1001 memcpy(s->inbuf_ptr, buf_ptr, len);
1003 s->inbuf_ptr += len;
1006 if(s->inbuf_ptr - s->inbuf == s->frame_size){
1007 *poutbuf = s->inbuf;
1008 *poutbuf_size = s->frame_size;
1009 s->inbuf_ptr = s->inbuf;
1015 return buf_ptr - buf;
1017 #endif /* CONFIG_AC3_PARSER || CONFIG_AAC_PARSER */
1019 #ifdef CONFIG_MPEGVIDEO_PARSER
1020 AVCodecParser mpegvideo_parser = {
1021 { CODEC_ID_MPEG1VIDEO, CODEC_ID_MPEG2VIDEO },
1022 sizeof(ParseContext1),
1029 #ifdef CONFIG_MPEG4VIDEO_PARSER
1030 AVCodecParser mpeg4video_parser = {
1032 sizeof(ParseContext1),
1033 mpeg4video_parse_init,
1039 #ifdef CONFIG_CAVSVIDEO_PARSER
1040 AVCodecParser cavsvideo_parser = {
1042 sizeof(ParseContext1),
1049 #ifdef CONFIG_MPEGAUDIO_PARSER
1050 AVCodecParser mpegaudio_parser = {
1051 { CODEC_ID_MP2, CODEC_ID_MP3 },
1052 sizeof(MpegAudioParseContext),
1053 mpegaudio_parse_init,
1058 #ifdef CONFIG_AC3_PARSER
1059 AVCodecParser ac3_parser = {
1061 sizeof(AC3ParseContext),
1067 #ifdef CONFIG_AAC_PARSER
1068 AVCodecParser aac_parser = {
1070 sizeof(AC3ParseContext),