diff options
author | bnnm <bananaman255@gmail.com> | 2017-01-19 20:53:12 +0100 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2017-01-20 12:53:57 +0100 |
commit | cab0f3abc53e050828a66dc5db8a21181d0b4dcb (patch) | |
tree | 8895120612b76d71ca382100c0fd0d42a93db990 | |
parent | 9a619bef5492a664c1e80a74c5779e28763179f3 (diff) | |
download | ffmpeg-cab0f3abc53e050828a66dc5db8a21181d0b4dcb.tar.gz |
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 <bananaman255@gmail.com>
-rw-r--r-- | libavcodec/atrac3.c | 17 |
1 files changed, 8 insertions, 9 deletions
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"); |