Commit cab0f3ab authored by bnnm's avatar bnnm Committed by Paul B Mahol

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: 's avatarbnnm <bananaman255@gmail.com>
parent 9a619bef
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,7 @@
#include "atrac3data.h" #include "atrac3data.h"
#define JOINT_STEREO 0x12 #define JOINT_STEREO 0x12
#define STEREO 0x2 #define SINGLE 0x2
#define SAMPLES_PER_FRAME 1024 #define SAMPLES_PER_FRAME 1024
#define MDCT_SIZE 512 #define MDCT_SIZE 512
...@@ -567,7 +567,7 @@ static void channel_weighting(float *su1, float *su2, int *p3) ...@@ -567,7 +567,7 @@ static void channel_weighting(float *su1, float *su2, int *p3)
* @param snd the channel unit to be used * @param snd the channel unit to be used
* @param output the decoded samples before IQMF in float representation * @param output the decoded samples before IQMF in float representation
* @param channel_num channel number * @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, static int decode_channel_sound_unit(ATRAC3Context *q, GetBitContext *gb,
ChannelUnit *snd, float *output, ChannelUnit *snd, float *output,
...@@ -702,7 +702,7 @@ static int decode_frame(AVCodecContext *avctx, const uint8_t *databuf, ...@@ -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); channel_weighting(out_samples[0], out_samples[1], q->weighting_delay);
} else { } else {
/* normal stereo mode or mono */ /* single channels */
/* Decode the channel sound units. */ /* Decode the channel sound units. */
for (i = 0; i < avctx->channels; i++) { for (i = 0; i < avctx->channels; i++) {
/* Set the bitstream reader at the start of a channel sound unit. */ /* 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) ...@@ -797,7 +797,7 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx)
const uint8_t *edata_ptr = avctx->extradata; const uint8_t *edata_ptr = avctx->extradata;
ATRAC3Context *q = avctx->priv_data; 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"); av_log(avctx, AV_LOG_ERROR, "Channel configuration error!\n");
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
...@@ -823,7 +823,7 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx) ...@@ -823,7 +823,7 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx)
samples_per_frame = SAMPLES_PER_FRAME * avctx->channels; samples_per_frame = SAMPLES_PER_FRAME * avctx->channels;
version = 4; version = 4;
delay = 0x88E; delay = 0x88E;
q->coding_mode = q->coding_mode ? JOINT_STEREO : STEREO; q->coding_mode = q->coding_mode ? JOINT_STEREO : SINGLE;
q->scrambled_stream = 0; q->scrambled_stream = 0;
if (avctx->block_align != 96 * avctx->channels * frame_factor && if (avctx->block_align != 96 * avctx->channels * frame_factor &&
...@@ -855,8 +855,7 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx) ...@@ -855,8 +855,7 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
if (samples_per_frame != SAMPLES_PER_FRAME && if (samples_per_frame != SAMPLES_PER_FRAME * avctx->channels) {
samples_per_frame != SAMPLES_PER_FRAME * 2) {
av_log(avctx, AV_LOG_ERROR, "Unknown amount of samples per frame %d.\n", av_log(avctx, AV_LOG_ERROR, "Unknown amount of samples per frame %d.\n",
samples_per_frame); samples_per_frame);
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
...@@ -868,8 +867,8 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx) ...@@ -868,8 +867,8 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
if (q->coding_mode == STEREO) if (q->coding_mode == SINGLE)
av_log(avctx, AV_LOG_DEBUG, "Normal stereo detected.\n"); av_log(avctx, AV_LOG_DEBUG, "Single channels detected.\n");
else if (q->coding_mode == JOINT_STEREO) { else if (q->coding_mode == JOINT_STEREO) {
if (avctx->channels != 2) { if (avctx->channels != 2) {
av_log(avctx, AV_LOG_ERROR, "Invalid coding mode\n"); av_log(avctx, AV_LOG_ERROR, "Invalid coding mode\n");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment