Mercurial > libavcodec.hg
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) { |
