From cab0f3abc53e050828a66dc5db8a21181d0b4dcb Mon Sep 17 00:00:00 2001 From: bnnm Date: Thu, 19 Jan 2017 20:53:12 +0100 Subject: avcodec/atrac3: allow 6 channels (non-joint stereo) Raises max channels to 6 (for non joint-stereo only), there is no difference decoding 1 or N discrete channels. Fixes trac issue #5840 Signed-off-by: bnnm --- libavcodec/atrac3.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'libavcodec/atrac3.c') diff --git a/libavcodec/atrac3.c b/libavcodec/atrac3.c index 256990b311..ffd93e4946 100644 --- a/libavcodec/atrac3.c +++ b/libavcodec/atrac3.c @@ -49,7 +49,7 @@ #include "atrac3data.h" #define JOINT_STEREO 0x12 -#define STEREO 0x2 +#define SINGLE 0x2 #define SAMPLES_PER_FRAME 1024 #define MDCT_SIZE 512 @@ -567,7 +567,7 @@ static void channel_weighting(float *su1, float *su2, int *p3) * @param snd the channel unit to be used * @param output the decoded samples before IQMF in float representation * @param channel_num channel number - * @param coding_mode the coding mode (JOINT_STEREO or regular stereo/mono) + * @param coding_mode the coding mode (JOINT_STEREO or single channels) */ static int decode_channel_sound_unit(ATRAC3Context *q, GetBitContext *gb, ChannelUnit *snd, float *output, @@ -702,7 +702,7 @@ static int decode_frame(AVCodecContext *avctx, const uint8_t *databuf, channel_weighting(out_samples[0], out_samples[1], q->weighting_delay); } else { - /* normal stereo mode or mono */ + /* single channels */ /* Decode the channel sound units. */ for (i = 0; i < avctx->channels; i++) { /* Set the bitstream reader at the start of a channel sound unit. */ @@ -797,7 +797,7 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx) const uint8_t *edata_ptr = avctx->extradata; ATRAC3Context *q = avctx->priv_data; - if (avctx->channels <= 0 || avctx->channels > 2) { + if (avctx->channels <= 0 || avctx->channels > 6) { av_log(avctx, AV_LOG_ERROR, "Channel configuration error!\n"); return AVERROR(EINVAL); } @@ -823,7 +823,7 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx) samples_per_frame = SAMPLES_PER_FRAME * avctx->channels; version = 4; delay = 0x88E; - q->coding_mode = q->coding_mode ? JOINT_STEREO : STEREO; + q->coding_mode = q->coding_mode ? JOINT_STEREO : SINGLE; q->scrambled_stream = 0; if (avctx->block_align != 96 * avctx->channels * frame_factor && @@ -855,8 +855,7 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx) return AVERROR_INVALIDDATA; } - if (samples_per_frame != SAMPLES_PER_FRAME && - samples_per_frame != SAMPLES_PER_FRAME * 2) { + if (samples_per_frame != SAMPLES_PER_FRAME * avctx->channels) { av_log(avctx, AV_LOG_ERROR, "Unknown amount of samples per frame %d.\n", samples_per_frame); return AVERROR_INVALIDDATA; @@ -868,8 +867,8 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx) return AVERROR_INVALIDDATA; } - if (q->coding_mode == STEREO) - av_log(avctx, AV_LOG_DEBUG, "Normal stereo detected.\n"); + if (q->coding_mode == SINGLE) + av_log(avctx, AV_LOG_DEBUG, "Single channels detected.\n"); else if (q->coding_mode == JOINT_STEREO) { if (avctx->channels != 2) { av_log(avctx, AV_LOG_ERROR, "Invalid coding mode\n"); -- cgit v1.2.3