aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-04-23 16:56:12 +0200
committerMichael Niedermayer <michaelni@gmx.at>2013-04-23 16:58:31 +0200
commitb21b2ca95b3329f9dbbcabd7ade8c1d176a2264b (patch)
tree3ae170142da4d3b487721006249bcd133c4291e8
parent488c760091c2497ba7681d2fad8244b941a5b8c7 (diff)
parent9526c9ccc3dd9e80ce181d4097b52d4838983096 (diff)
downloadffmpeg-b21b2ca95b3329f9dbbcabd7ade8c1d176a2264b.tar.gz
Merge remote-tracking branch 'cehoyos/master'
* cehoyos/master: Read block_align from extradata when decoding qclp in aiff. Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavformat/aiffdec.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/libavformat/aiffdec.c b/libavformat/aiffdec.c
index 4a2629888b..62af3dca7b 100644
--- a/libavformat/aiffdec.c
+++ b/libavformat/aiffdec.c
@@ -147,9 +147,6 @@ static unsigned int get_aiff_header(AVFormatContext *s, int size,
case AV_CODEC_ID_GSM:
codec->block_align = 33;
break;
- case AV_CODEC_ID_QCELP:
- codec->block_align = 35;
- break;
default:
aiff->block_duration = 1;
break;
@@ -286,6 +283,21 @@ static int aiff_read_header(AVFormatContext *s)
if (st->codec->codec_id == AV_CODEC_ID_QDM2 && size>=12*4 && !st->codec->block_align) {
st->codec->block_align = AV_RB32(st->codec->extradata+11*4);
aiff->block_duration = AV_RB32(st->codec->extradata+9*4);
+ } else if (st->codec->codec_id == AV_CODEC_ID_QCELP) {
+ char rate = 0;
+ if (size >= 25)
+ rate = st->codec->extradata[24];
+ switch (rate) {
+ case 'H': // RATE_HALF
+ st->codec->block_align = 17;
+ break;
+ case 'F': // RATE_FULL
+ default:
+ st->codec->block_align = 35;
+ }
+ aiff->block_duration = 160;
+ st->codec->bit_rate = st->codec->sample_rate * (st->codec->block_align << 3) /
+ aiff->block_duration;
}
break;
case MKTAG('C','H','A','N'):
@@ -332,7 +344,7 @@ static int aiff_read_packet(AVFormatContext *s,
return AVERROR_EOF;
/* Now for that packet */
- if (st->codec->block_align >= 33) // GSM, QCLP, IMA4
+ if (st->codec->block_align >= 17) // GSM, QCLP, IMA4
size = st->codec->block_align;
else
size = (MAX_SIZE / st->codec->block_align) * st->codec->block_align;