comparison mpegaudio_parser.c @ 8420:2b0d01be134f libavcodec

Change mpeg audio parser so it only sets frame_size, channels and bit_rate after it has a few valid frames. Fixes issue762
author michael
date Sun, 21 Dec 2008 23:50:16 +0000
parents d623b3171830
children d7d0cde5f308
comparison
equal deleted inserted replaced
8419:6a12ba62978a 8420:2b0d01be134f
42 #define SAME_HEADER_MASK \ 42 #define SAME_HEADER_MASK \
43 (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19)) 43 (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19))
44 44
45 /* useful helper to get mpeg audio stream infos. Return -1 if error in 45 /* useful helper to get mpeg audio stream infos. Return -1 if error in
46 header, otherwise the coded frame size in bytes */ 46 header, otherwise the coded frame size in bytes */
47 int ff_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate) 47 int ff_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bit_rate)
48 { 48 {
49 MPADecodeContext s1, *s = &s1; 49 MPADecodeContext s1, *s = &s1;
50 s1.avctx = avctx; 50 s1.avctx = avctx;
51 51
52 if (ff_mpa_check_header(head) != 0) 52 if (ff_mpa_check_header(head) != 0)
56 return -1; 56 return -1;
57 } 57 }
58 58
59 switch(s->layer) { 59 switch(s->layer) {
60 case 1: 60 case 1:
61 avctx->frame_size = 384; 61 *frame_size = 384;
62 break; 62 break;
63 case 2: 63 case 2:
64 avctx->frame_size = 1152; 64 *frame_size = 1152;
65 break; 65 break;
66 default: 66 default:
67 case 3: 67 case 3:
68 if (s->lsf) 68 if (s->lsf)
69 avctx->frame_size = 576; 69 *frame_size = 576;
70 else 70 else
71 avctx->frame_size = 1152; 71 *frame_size = 1152;
72 break; 72 break;
73 } 73 }
74 74
75 *sample_rate = s->sample_rate; 75 *sample_rate = s->sample_rate;
76 avctx->channels = s->nb_channels; 76 *channels = s->nb_channels;
77 avctx->bit_rate = s->bit_rate; 77 *bit_rate = s->bit_rate;
78 avctx->sub_id = s->layer; 78 avctx->sub_id = s->layer;
79 return s->frame_size; 79 return s->frame_size;
80 } 80 }
81 81
82 static int mpegaudio_parse_init(AVCodecParserContext *s1) 82 static int mpegaudio_parse_init(AVCodecParserContext *s1)
90 AVCodecContext *avctx, 90 AVCodecContext *avctx,
91 const uint8_t **poutbuf, int *poutbuf_size, 91 const uint8_t **poutbuf, int *poutbuf_size,
92 const uint8_t *buf, int buf_size) 92 const uint8_t *buf, int buf_size)
93 { 93 {
94 MpegAudioParseContext *s = s1->priv_data; 94 MpegAudioParseContext *s = s1->priv_data;
95 int len, ret, sr; 95 int len, ret, sr, channels, bit_rate, frame_size;
96 uint32_t header; 96 uint32_t header;
97 const uint8_t *buf_ptr; 97 const uint8_t *buf_ptr;
98 98
99 *poutbuf = NULL; 99 *poutbuf = NULL;
100 *poutbuf_size = 0; 100 *poutbuf_size = 0;
121 } 121 }
122 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) { 122 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) {
123 got_header: 123 got_header:
124 header = AV_RB32(s->inbuf); 124 header = AV_RB32(s->inbuf);
125 125
126 ret = ff_mpa_decode_header(avctx, header, &sr); 126 ret = ff_mpa_decode_header(avctx, header, &sr, &channels, &frame_size, &bit_rate);
127 if (ret < 0) { 127 if (ret < 0) {
128 s->header_count= -2; 128 s->header_count= -2;
129 /* no sync found : move by one byte (inefficient, but simple!) */ 129 /* no sync found : move by one byte (inefficient, but simple!) */
130 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1); 130 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
131 s->inbuf_ptr--; 131 s->inbuf_ptr--;
144 /* free format: prepare to compute frame size */ 144 /* free format: prepare to compute frame size */
145 if (ff_mpegaudio_decode_header(s, header) == 1) { 145 if (ff_mpegaudio_decode_header(s, header) == 1) {
146 s->frame_size = -1; 146 s->frame_size = -1;
147 } 147 }
148 #endif 148 #endif
149 if(s->header_count > 1) 149 if(s->header_count > 1){
150 avctx->sample_rate= sr; 150 avctx->sample_rate= sr;
151 avctx->channels = channels;
152 avctx->frame_size = frame_size;
153 avctx->bit_rate = bit_rate;
154 }
151 } 155 }
152 } 156 }
153 } else 157 } else
154 #if 0 158 #if 0
155 if (s->frame_size == -1) { 159 if (s->frame_size == -1) {