X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Ftwinvq.c;h=d7a372648a0cea69c2d5fc7bcc65e100702010d2;hb=03b078721c8e42c413da75f553e740d235092dad;hp=f47f4c30f13f8ce2314f6656a3fb190898ee541c;hpb=7fd9d49ba7fa57629592b1f7064cb12d96984a14;p=ffmpeg diff --git a/libavcodec/twinvq.c b/libavcodec/twinvq.c index f47f4c30f13..d7a372648a0 100644 --- a/libavcodec/twinvq.c +++ b/libavcodec/twinvq.c @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/channel_layout.h" #include "libavutil/float_dsp.h" #include "avcodec.h" #include "get_bits.h" @@ -1119,6 +1120,11 @@ static av_cold int twin_decode_init(AVCodecContext *avctx) avctx->channels = AV_RB32(avctx->extradata ) + 1; avctx->bit_rate = AV_RB32(avctx->extradata + 4) * 1000; isampf = AV_RB32(avctx->extradata + 8); + + if (isampf < 8 || isampf > 44) { + av_log(avctx, AV_LOG_ERROR, "Unsupported sample rate\n"); + return AVERROR_INVALIDDATA; + } switch (isampf) { case 44: avctx->sample_rate = 44100; break; case 22: avctx->sample_rate = 22050; break; @@ -1126,13 +1132,21 @@ static av_cold int twin_decode_init(AVCodecContext *avctx) default: avctx->sample_rate = isampf * 1000; break; } - if (avctx->channels > CHANNELS_MAX) { + if (avctx->channels <= 0 || avctx->channels > CHANNELS_MAX) { av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %i\n", avctx->channels); return -1; } + avctx->channel_layout = avctx->channels == 1 ? AV_CH_LAYOUT_MONO : + AV_CH_LAYOUT_STEREO; + ibps = avctx->bit_rate / (1000 * avctx->channels); + if (ibps > 255U) { + av_log(avctx, AV_LOG_ERROR, "unsupported per channel bitrate %dkbps\n", ibps); + return AVERROR_INVALIDDATA; + } + switch ((isampf << 8) + ibps) { case (8 <<8) + 8: tctx->mtab = &mode_08_08; break; case (11<<8) + 8: tctx->mtab = &mode_11_08; break;