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:%"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);
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 */
228 AVRational frame_rate;
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 #ifdef CONFIG_MPEGVIDEO_PARSER
301 extern const AVRational ff_frame_rate_tab[];
303 //FIXME move into mpeg12.c
304 static void mpegvideo_extract_headers(AVCodecParserContext *s,
305 AVCodecContext *avctx,
306 const uint8_t *buf, int buf_size)
308 ParseContext1 *pc = s->priv_data;
309 const uint8_t *buf_end;
311 int frame_rate_index, ext_type, bytes_left;
312 int frame_rate_ext_n, frame_rate_ext_d;
313 int picture_structure, top_field_first, repeat_first_field, progressive_frame;
314 int horiz_size_ext, vert_size_ext, bit_rate_ext;
315 //FIXME replace the crap with get_bits()
317 buf_end = buf + buf_size;
318 while (buf < buf_end) {
320 buf= ff_find_start_code(buf, buf_end, &start_code);
321 bytes_left = buf_end - buf;
323 case PICTURE_START_CODE:
324 if (bytes_left >= 2) {
325 s->pict_type = (buf[1] >> 3) & 7;
329 if (bytes_left >= 7) {
330 pc->width = (buf[0] << 4) | (buf[1] >> 4);
331 pc->height = ((buf[1] & 0x0f) << 8) | buf[2];
332 avcodec_set_dimensions(avctx, pc->width, pc->height);
333 frame_rate_index = buf[3] & 0xf;
334 pc->frame_rate.den = avctx->time_base.den = ff_frame_rate_tab[frame_rate_index].num;
335 pc->frame_rate.num = avctx->time_base.num = ff_frame_rate_tab[frame_rate_index].den;
336 avctx->bit_rate = ((buf[4]<<10) | (buf[5]<<2) | (buf[6]>>6))*400;
337 avctx->codec_id = CODEC_ID_MPEG1VIDEO;
342 if (bytes_left >= 1) {
343 ext_type = (buf[0] >> 4);
345 case 0x1: /* sequence extension */
346 if (bytes_left >= 6) {
347 horiz_size_ext = ((buf[1] & 1) << 1) | (buf[2] >> 7);
348 vert_size_ext = (buf[2] >> 5) & 3;
349 bit_rate_ext = ((buf[2] & 0x1F)<<7) | (buf[3]>>1);
350 frame_rate_ext_n = (buf[5] >> 5) & 3;
351 frame_rate_ext_d = (buf[5] & 0x1f);
352 pc->progressive_sequence = buf[1] & (1 << 3);
353 avctx->has_b_frames= !(buf[5] >> 7);
355 pc->width |=(horiz_size_ext << 12);
356 pc->height |=( vert_size_ext << 12);
357 avctx->bit_rate += (bit_rate_ext << 18) * 400;
358 avcodec_set_dimensions(avctx, pc->width, pc->height);
359 avctx->time_base.den = pc->frame_rate.den * (frame_rate_ext_n + 1);
360 avctx->time_base.num = pc->frame_rate.num * (frame_rate_ext_d + 1);
361 avctx->codec_id = CODEC_ID_MPEG2VIDEO;
362 avctx->sub_id = 2; /* forces MPEG2 */
365 case 0x8: /* picture coding extension */
366 if (bytes_left >= 5) {
367 picture_structure = buf[2]&3;
368 top_field_first = buf[3] & (1 << 7);
369 repeat_first_field = buf[3] & (1 << 1);
370 progressive_frame = buf[4] & (1 << 7);
372 /* check if we must repeat the frame */
373 if (repeat_first_field) {
374 if (pc->progressive_sequence) {
379 } else if (progressive_frame) {
384 /* the packet only represents half a frame
385 XXX,FIXME maybe find a different solution */
386 if(picture_structure != 3)
396 /* we stop parsing when we encounter a slice. It ensures
397 that this function takes a negligible amount of time */
398 if (start_code >= SLICE_MIN_START_CODE &&
399 start_code <= SLICE_MAX_START_CODE)
407 static int mpegvideo_parse(AVCodecParserContext *s,
408 AVCodecContext *avctx,
409 uint8_t **poutbuf, int *poutbuf_size,
410 const uint8_t *buf, int buf_size)
412 ParseContext1 *pc1 = s->priv_data;
413 ParseContext *pc= &pc1->pc;
416 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
419 next= ff_mpeg1_find_frame_end(pc, buf, buf_size);
421 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
428 /* we have a full frame : we just parse the first few MPEG headers
429 to have the full timing information. The time take by this
430 function should be negligible for uncorrupted streams */
431 mpegvideo_extract_headers(s, avctx, buf, buf_size);
433 printf("pict_type=%d frame_rate=%0.3f repeat_pict=%d\n",
434 s->pict_type, (double)avctx->time_base.den / avctx->time_base.num, s->repeat_pict);
437 *poutbuf = (uint8_t *)buf;
438 *poutbuf_size = buf_size;
442 static int mpegvideo_split(AVCodecContext *avctx,
443 const uint8_t *buf, int buf_size)
448 for(i=0; i<buf_size; i++){
449 state= (state<<8) | buf[i];
450 if(state != 0x1B3 && state != 0x1B5 && state < 0x200 && state >= 0x100)
455 #endif /* CONFIG_MPEGVIDEO_PARSER */
457 void ff_parse_close(AVCodecParserContext *s)
459 ParseContext *pc = s->priv_data;
464 static void parse1_close(AVCodecParserContext *s)
466 ParseContext1 *pc1 = s->priv_data;
468 av_free(pc1->pc.buffer);
472 /*************************/
474 #ifdef CONFIG_MPEG4VIDEO_PARSER
476 /* XXX: make it use less memory */
477 static int av_mpeg4_decode_header(AVCodecParserContext *s1,
478 AVCodecContext *avctx,
479 const uint8_t *buf, int buf_size)
481 ParseContext1 *pc = s1->priv_data;
482 MpegEncContext *s = pc->enc;
483 GetBitContext gb1, *gb = &gb1;
487 s->current_picture_ptr = &s->current_picture;
489 if (avctx->extradata_size && pc->first_picture){
490 init_get_bits(gb, avctx->extradata, avctx->extradata_size*8);
491 ret = ff_mpeg4_decode_picture_header(s, gb);
494 init_get_bits(gb, buf, 8 * buf_size);
495 ret = ff_mpeg4_decode_picture_header(s, gb);
497 avcodec_set_dimensions(avctx, s->width, s->height);
499 s1->pict_type= s->pict_type;
500 pc->first_picture = 0;
504 static int mpeg4video_parse_init(AVCodecParserContext *s)
506 ParseContext1 *pc = s->priv_data;
508 pc->enc = av_mallocz(sizeof(MpegEncContext));
511 pc->first_picture = 1;
515 static int mpeg4video_parse(AVCodecParserContext *s,
516 AVCodecContext *avctx,
517 uint8_t **poutbuf, int *poutbuf_size,
518 const uint8_t *buf, int buf_size)
520 ParseContext *pc = s->priv_data;
523 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
526 next= ff_mpeg4_find_frame_end(pc, buf, buf_size);
528 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
534 av_mpeg4_decode_header(s, avctx, buf, buf_size);
536 *poutbuf = (uint8_t *)buf;
537 *poutbuf_size = buf_size;
542 #ifdef CONFIG_CAVSVIDEO_PARSER
543 static int cavsvideo_parse(AVCodecParserContext *s,
544 AVCodecContext *avctx,
545 uint8_t **poutbuf, int *poutbuf_size,
546 const uint8_t *buf, int buf_size)
548 ParseContext *pc = s->priv_data;
551 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
554 next= ff_cavs_find_frame_end(pc, buf, buf_size);
556 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
562 *poutbuf = (uint8_t *)buf;
563 *poutbuf_size = buf_size;
566 #endif /* CONFIG_CAVSVIDEO_PARSER */
568 static int mpeg4video_split(AVCodecContext *avctx,
569 const uint8_t *buf, int buf_size)
574 for(i=0; i<buf_size; i++){
575 state= (state<<8) | buf[i];
576 if(state == 0x1B3 || state == 0x1B6)
582 /*************************/
584 #ifdef CONFIG_MPEGAUDIO_PARSER
585 typedef struct MpegAudioParseContext {
586 uint8_t inbuf[MPA_MAX_CODED_FRAME_SIZE]; /* input buffer */
589 int free_format_frame_size;
590 int free_format_next_header;
593 } MpegAudioParseContext;
595 #define MPA_HEADER_SIZE 4
597 /* header + layer + bitrate + freq + lsf/mpeg25 */
598 #undef SAME_HEADER_MASK /* mpegaudio.h defines different version */
599 #define SAME_HEADER_MASK \
600 (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19))
602 static int mpegaudio_parse_init(AVCodecParserContext *s1)
604 MpegAudioParseContext *s = s1->priv_data;
605 s->inbuf_ptr = s->inbuf;
609 static int mpegaudio_parse(AVCodecParserContext *s1,
610 AVCodecContext *avctx,
611 uint8_t **poutbuf, int *poutbuf_size,
612 const uint8_t *buf, int buf_size)
614 MpegAudioParseContext *s = s1->priv_data;
617 const uint8_t *buf_ptr;
622 while (buf_size > 0) {
623 len = s->inbuf_ptr - s->inbuf;
624 if (s->frame_size == 0) {
625 /* special case for next header for first frame in free
626 format case (XXX: find a simpler method) */
627 if (s->free_format_next_header != 0) {
628 s->inbuf[0] = s->free_format_next_header >> 24;
629 s->inbuf[1] = s->free_format_next_header >> 16;
630 s->inbuf[2] = s->free_format_next_header >> 8;
631 s->inbuf[3] = s->free_format_next_header;
632 s->inbuf_ptr = s->inbuf + 4;
633 s->free_format_next_header = 0;
636 /* no header seen : find one. We need at least MPA_HEADER_SIZE
638 len = FFMIN(MPA_HEADER_SIZE - len, buf_size);
640 memcpy(s->inbuf_ptr, buf_ptr, len);
645 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) {
647 header = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
648 (s->inbuf[2] << 8) | s->inbuf[3];
650 ret = mpa_decode_header(avctx, header, &sr);
653 /* no sync found : move by one byte (inefficient, but simple!) */
654 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
656 dprintf("skip %x\n", header);
657 /* reset free format frame size to give a chance
658 to get a new bitrate */
659 s->free_format_frame_size = 0;
661 if((header&SAME_HEADER_MASK) != (s->header&SAME_HEADER_MASK) && s->header)
668 /* free format: prepare to compute frame size */
669 if (decode_header(s, header) == 1) {
674 if(s->header_count > 1)
675 avctx->sample_rate= sr;
679 if (s->frame_size == -1) {
680 /* free format : find next sync to compute frame size */
681 len = MPA_MAX_CODED_FRAME_SIZE - len;
685 /* frame too long: resync */
687 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
694 memcpy(s->inbuf_ptr, buf_ptr, len);
695 /* check for header */
696 p = s->inbuf_ptr - 3;
697 pend = s->inbuf_ptr + len - 4;
699 header = (p[0] << 24) | (p[1] << 16) |
701 header1 = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
702 (s->inbuf[2] << 8) | s->inbuf[3];
703 /* check with high probability that we have a
705 if ((header & SAME_HEADER_MASK) ==
706 (header1 & SAME_HEADER_MASK)) {
707 /* header found: update pointers */
708 len = (p + 4) - s->inbuf_ptr;
712 /* compute frame size */
713 s->free_format_next_header = header;
714 s->free_format_frame_size = s->inbuf_ptr - s->inbuf;
715 padding = (header1 >> 9) & 1;
717 s->free_format_frame_size -= padding * 4;
719 s->free_format_frame_size -= padding;
720 dprintf("free frame size=%d padding=%d\n",
721 s->free_format_frame_size, padding);
722 decode_header(s, header1);
727 /* not found: simply increase pointers */
734 if (len < s->frame_size) {
735 if (s->frame_size > MPA_MAX_CODED_FRAME_SIZE)
736 s->frame_size = MPA_MAX_CODED_FRAME_SIZE;
737 len = FFMIN(s->frame_size - len, buf_size);
738 memcpy(s->inbuf_ptr, buf_ptr, len);
744 if(s->frame_size > 0 && buf_ptr - buf == s->inbuf_ptr - s->inbuf
745 && buf_size + buf_ptr - buf >= s->frame_size){
746 if(s->header_count > 0){
748 *poutbuf_size = s->frame_size;
750 buf_ptr = buf + s->frame_size;
751 s->inbuf_ptr = s->inbuf;
757 if (s->frame_size > 0 &&
758 (s->inbuf_ptr - s->inbuf) >= s->frame_size) {
759 if(s->header_count > 0){
761 *poutbuf_size = s->inbuf_ptr - s->inbuf;
763 s->inbuf_ptr = s->inbuf;
768 return buf_ptr - buf;
770 #endif /* CONFIG_MPEGAUDIO_PARSER */
772 #if defined(CONFIG_AC3_PARSER) || defined(CONFIG_AAC_PARSER)
773 /* also used for ADTS AAC */
774 typedef struct AC3ParseContext {
778 int (*sync)(const uint8_t *buf, int *channels, int *sample_rate,
779 int *bit_rate, int *samples);
780 uint8_t inbuf[8192]; /* input buffer */
783 #define AC3_HEADER_SIZE 7
784 #define AAC_HEADER_SIZE 7
786 #ifdef CONFIG_AC3_PARSER
787 static const int ac3_sample_rates[4] = {
788 48000, 44100, 32000, 0
791 static const int ac3_frame_sizes[64][3] = {
824 { 1024, 1114, 1536 },
825 { 1024, 1115, 1536 },
826 { 1152, 1253, 1728 },
827 { 1152, 1254, 1728 },
828 { 1280, 1393, 1920 },
829 { 1280, 1394, 1920 },
832 static const int ac3_bitrates[64] = {
833 32, 32, 40, 40, 48, 48, 56, 56, 64, 64, 80, 80, 96, 96, 112, 112,
834 128, 128, 160, 160, 192, 192, 224, 224, 256, 256, 320, 320, 384,
835 384, 448, 448, 512, 512, 576, 576, 640, 640,
838 static const int ac3_channels[8] = {
839 2, 1, 2, 3, 3, 4, 4, 5
841 #endif /* CONFIG_AC3_PARSER */
843 #ifdef CONFIG_AAC_PARSER
844 static const int aac_sample_rates[16] = {
845 96000, 88200, 64000, 48000, 44100, 32000,
846 24000, 22050, 16000, 12000, 11025, 8000, 7350
849 static const int aac_channels[8] = {
850 0, 1, 2, 3, 4, 5, 6, 8
854 #ifdef CONFIG_AC3_PARSER
855 static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
856 int *bit_rate, int *samples)
858 unsigned int fscod, frmsizecod, acmod, bsid, lfeon;
861 init_get_bits(&bits, buf, AC3_HEADER_SIZE * 8);
863 if(get_bits(&bits, 16) != 0x0b77)
866 skip_bits(&bits, 16); /* crc */
867 fscod = get_bits(&bits, 2);
868 frmsizecod = get_bits(&bits, 6);
870 if(!ac3_sample_rates[fscod])
873 bsid = get_bits(&bits, 5);
876 skip_bits(&bits, 3); /* bsmod */
877 acmod = get_bits(&bits, 3);
878 if(acmod & 1 && acmod != 1)
879 skip_bits(&bits, 2); /* cmixlev */
881 skip_bits(&bits, 2); /* surmixlev */
883 skip_bits(&bits, 2); /* dsurmod */
884 lfeon = get_bits1(&bits);
886 *sample_rate = ac3_sample_rates[fscod];
887 *bit_rate = ac3_bitrates[frmsizecod] * 1000;
888 *channels = ac3_channels[acmod] + lfeon;
891 return ac3_frame_sizes[frmsizecod][fscod] * 2;
893 #endif /* CONFIG_AC3_PARSER */
895 #ifdef CONFIG_AAC_PARSER
896 static int aac_sync(const uint8_t *buf, int *channels, int *sample_rate,
897 int *bit_rate, int *samples)
900 int size, rdb, ch, sr;
902 init_get_bits(&bits, buf, AAC_HEADER_SIZE * 8);
904 if(get_bits(&bits, 12) != 0xfff)
907 skip_bits1(&bits); /* id */
908 skip_bits(&bits, 2); /* layer */
909 skip_bits1(&bits); /* protection_absent */
910 skip_bits(&bits, 2); /* profile_objecttype */
911 sr = get_bits(&bits, 4); /* sample_frequency_index */
912 if(!aac_sample_rates[sr])
914 skip_bits1(&bits); /* private_bit */
915 ch = get_bits(&bits, 3); /* channel_configuration */
916 if(!aac_channels[ch])
918 skip_bits1(&bits); /* original/copy */
919 skip_bits1(&bits); /* home */
921 /* adts_variable_header */
922 skip_bits1(&bits); /* copyright_identification_bit */
923 skip_bits1(&bits); /* copyright_identification_start */
924 size = get_bits(&bits, 13); /* aac_frame_length */
925 skip_bits(&bits, 11); /* adts_buffer_fullness */
926 rdb = get_bits(&bits, 2); /* number_of_raw_data_blocks_in_frame */
928 *channels = aac_channels[ch];
929 *sample_rate = aac_sample_rates[sr];
930 *samples = (rdb + 1) * 1024;
931 *bit_rate = size * 8 * *sample_rate / *samples;
935 #endif /* CONFIG_AAC_PARSER */
937 #ifdef CONFIG_AC3_PARSER
938 static int ac3_parse_init(AVCodecParserContext *s1)
940 AC3ParseContext *s = s1->priv_data;
941 s->inbuf_ptr = s->inbuf;
942 s->header_size = AC3_HEADER_SIZE;
948 #ifdef CONFIG_AAC_PARSER
949 static int aac_parse_init(AVCodecParserContext *s1)
951 AC3ParseContext *s = s1->priv_data;
952 s->inbuf_ptr = s->inbuf;
953 s->header_size = AAC_HEADER_SIZE;
959 /* also used for ADTS AAC */
960 static int ac3_parse(AVCodecParserContext *s1,
961 AVCodecContext *avctx,
962 uint8_t **poutbuf, int *poutbuf_size,
963 const uint8_t *buf, int buf_size)
965 AC3ParseContext *s = s1->priv_data;
966 const uint8_t *buf_ptr;
967 int len, sample_rate, bit_rate, channels, samples;
973 while (buf_size > 0) {
974 len = s->inbuf_ptr - s->inbuf;
975 if (s->frame_size == 0) {
976 /* no header seen : find one. We need at least s->header_size
978 len = FFMIN(s->header_size - len, buf_size);
980 memcpy(s->inbuf_ptr, buf_ptr, len);
984 if ((s->inbuf_ptr - s->inbuf) == s->header_size) {
985 len = s->sync(s->inbuf, &channels, &sample_rate, &bit_rate,
988 /* no sync found : move by one byte (inefficient, but simple!) */
989 memmove(s->inbuf, s->inbuf + 1, s->header_size - 1);
993 /* update codec info */
994 avctx->sample_rate = sample_rate;
995 /* set channels,except if the user explicitly requests 1 or 2 channels, XXX/FIXME this is a bit ugly */
996 if(avctx->codec_id == CODEC_ID_AC3){
997 if(avctx->channels!=1 && avctx->channels!=2){
998 avctx->channels = channels;
1001 avctx->channels = channels;
1003 avctx->bit_rate = bit_rate;
1004 avctx->frame_size = samples;
1008 len = FFMIN(s->frame_size - len, buf_size);
1010 memcpy(s->inbuf_ptr, buf_ptr, len);
1012 s->inbuf_ptr += len;
1015 if(s->inbuf_ptr - s->inbuf == s->frame_size){
1016 *poutbuf = s->inbuf;
1017 *poutbuf_size = s->frame_size;
1018 s->inbuf_ptr = s->inbuf;
1024 return buf_ptr - buf;
1026 #endif /* CONFIG_AC3_PARSER || CONFIG_AAC_PARSER */
1028 #ifdef CONFIG_MPEGVIDEO_PARSER
1029 AVCodecParser mpegvideo_parser = {
1030 { CODEC_ID_MPEG1VIDEO, CODEC_ID_MPEG2VIDEO },
1031 sizeof(ParseContext1),
1038 #ifdef CONFIG_MPEG4VIDEO_PARSER
1039 AVCodecParser mpeg4video_parser = {
1041 sizeof(ParseContext1),
1042 mpeg4video_parse_init,
1048 #ifdef CONFIG_CAVSVIDEO_PARSER
1049 AVCodecParser cavsvideo_parser = {
1051 sizeof(ParseContext1),
1058 #ifdef CONFIG_MPEGAUDIO_PARSER
1059 AVCodecParser mpegaudio_parser = {
1060 { CODEC_ID_MP2, CODEC_ID_MP3 },
1061 sizeof(MpegAudioParseContext),
1062 mpegaudio_parse_init,
1067 #ifdef CONFIG_AC3_PARSER
1068 AVCodecParser ac3_parser = {
1070 sizeof(AC3ParseContext),
1076 #ifdef CONFIG_AAC_PARSER
1077 AVCodecParser aac_parser = {
1079 sizeof(AC3ParseContext),