summaryrefslogtreecommitdiff
path: root/libavcodec/alac.c
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2011-10-05 20:07:29 -0400
committerJustin Ruggles <justin.ruggles@gmail.com>2011-10-26 11:50:16 -0400
commitdcaa83a0fccb3bd63eb71c48d70c1adfc97e4102 (patch)
tree0772d552f9402f0e855901bc566ee1481c710715 /libavcodec/alac.c
parent47e9c75b36aa533f1c06c063f80cdf6b7f026b03 (diff)
alacdec: read/validate number of channels from the extradata.
check frame header channel count against header/container channel count.
Diffstat (limited to 'libavcodec/alac.c')
-rw-r--r--libavcodec/alac.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/libavcodec/alac.c b/libavcodec/alac.c
index 5e376ac030..d4926e848f 100644
--- a/libavcodec/alac.c
+++ b/libavcodec/alac.c
@@ -119,7 +119,7 @@ static int alac_set_info(ALACContext *alac)
alac->setinfo_rice_historymult = *ptr++;
alac->setinfo_rice_initialhistory = *ptr++;
alac->setinfo_rice_kmodifier = *ptr++;
- ptr++; /* channels? */
+ alac->numchannels = *ptr++;
bytestream_get_be16(&ptr); /* ??? */
bytestream_get_be32(&ptr); /* max coded frame size */
bytestream_get_be32(&ptr); /* bitrate ? */
@@ -456,10 +456,9 @@ static int alac_decode_frame(AVCodecContext *avctx,
init_get_bits(&alac->gb, inbuffer, input_buffer_size * 8);
channels = get_bits(&alac->gb, 3) + 1;
- if (channels > MAX_CHANNELS) {
- av_log(avctx, AV_LOG_ERROR, "channels > %d not supported\n",
- MAX_CHANNELS);
- return -1;
+ if (channels != avctx->channels) {
+ av_log(avctx, AV_LOG_ERROR, "frame header channel count mismatch\n");
+ return AVERROR_INVALIDDATA;
}
/* 2^result = something to do with output waiting.
@@ -634,7 +633,6 @@ static av_cold int alac_decode_init(AVCodecContext * avctx)
{
ALACContext *alac = avctx->priv_data;
alac->avctx = avctx;
- alac->numchannels = alac->avctx->channels;
/* initialize from the extradata */
if (alac->avctx->extradata_size != ALAC_EXTRADATA_SIZE) {
@@ -657,6 +655,21 @@ static av_cold int alac_decode_init(AVCodecContext * avctx)
return -1;
}
+ if (alac->numchannels < 1) {
+ av_log(avctx, AV_LOG_WARNING, "Invalid channel count\n");
+ alac->numchannels = avctx->channels;
+ } else {
+ if (alac->numchannels > MAX_CHANNELS)
+ alac->numchannels = avctx->channels;
+ else
+ avctx->channels = alac->numchannels;
+ }
+ if (avctx->channels > MAX_CHANNELS) {
+ av_log(avctx, AV_LOG_ERROR, "Unsupported channel count: %d\n",
+ avctx->channels);
+ return AVERROR_PATCHWELCOME;
+ }
+
return 0;
}