1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-11-26 19:01:44 +02:00

atrac3: use AVCodecContext.channels instead of keeping a private copy

This commit is contained in:
Justin Ruggles 2012-10-18 17:13:22 -04:00
parent aefdb735c3
commit 5ac673b553

View File

@ -89,7 +89,6 @@ typedef struct ATRAC3Context {
GetBitContext gb;
//@{
/** stream data */
int channels;
int coding_mode;
int bit_rate;
int sample_rate;
@ -716,9 +715,10 @@ static int decode_channel_sound_unit(ATRAC3Context *q, GetBitContext *gb,
return 0;
}
static int decode_frame(ATRAC3Context *q, const uint8_t *databuf,
static int decode_frame(AVCodecContext *avctx, const uint8_t *databuf,
float **out_samples)
{
ATRAC3Context *q = avctx->priv_data;
int ret, i;
uint8_t *ptr1;
@ -782,11 +782,11 @@ static int decode_frame(ATRAC3Context *q, const uint8_t *databuf,
} else {
/* normal stereo mode or mono */
/* Decode the channel sound units. */
for (i = 0; i < q->channels; i++) {
for (i = 0; i < avctx->channels; i++) {
/* Set the bitstream reader at the start of a channel sound unit. */
init_get_bits(&q->gb,
databuf + i * q->bytes_per_frame / q->channels,
q->bits_per_frame / q->channels);
databuf + i * q->bytes_per_frame / avctx->channels,
q->bits_per_frame / avctx->channels);
ret = decode_channel_sound_unit(q, &q->gb, &q->units[i],
out_samples[i], i, q->coding_mode);
@ -796,7 +796,7 @@ static int decode_frame(ATRAC3Context *q, const uint8_t *databuf,
}
/* Apply the iQMF synthesis filter. */
for (i = 0; i < q->channels; i++) {
for (i = 0; i < avctx->channels; i++) {
float *p1 = out_samples[i];
float *p2 = p1 + 256;
float *p3 = p2 + 256;
@ -839,7 +839,7 @@ static int atrac3_decode_frame(AVCodecContext *avctx, void *data,
databuf = buf;
}
ret = decode_frame(q, databuf, (float **)q->frame.extended_data);
ret = decode_frame(avctx, databuf, (float **)q->frame.extended_data);
if (ret) {
av_log(NULL, AV_LOG_ERROR, "Frame decoding error!\n");
return ret;
@ -861,11 +861,15 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx)
/* Take data from the AVCodecContext (RM container). */
q->sample_rate = avctx->sample_rate;
q->channels = avctx->channels;
q->bit_rate = avctx->bit_rate;
q->bits_per_frame = avctx->block_align * 8;
q->bytes_per_frame = avctx->block_align;
if (avctx->channels <= 0 || avctx->channels > 2) {
av_log(avctx, AV_LOG_ERROR, "Channel configuration error!\n");
return AVERROR(EINVAL);
}
/* Take care of the codec-specific extradata. */
if (avctx->extradata_size == 14) {
/* Parse the extradata, WAV format */
@ -880,18 +884,18 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx)
bytestream_get_le16(&edata_ptr)); // Unknown always 0
/* setup */
q->samples_per_frame = SAMPLES_PER_FRAME * q->channels;
q->samples_per_frame = SAMPLES_PER_FRAME * avctx->channels;
q->version = 4;
q->delay = 0x88E;
q->coding_mode = q->coding_mode ? JOINT_STEREO : STEREO;
q->scrambled_stream = 0;
if (q->bytes_per_frame != 96 * q->channels * q->frame_factor &&
q->bytes_per_frame != 152 * q->channels * q->frame_factor &&
q->bytes_per_frame != 192 * q->channels * q->frame_factor) {
if (q->bytes_per_frame != 96 * avctx->channels * q->frame_factor &&
q->bytes_per_frame != 152 * avctx->channels * q->frame_factor &&
q->bytes_per_frame != 192 * avctx->channels * q->frame_factor) {
av_log(avctx, AV_LOG_ERROR, "Unknown frame/channel/frame_factor "
"configuration %d/%d/%d\n", q->bytes_per_frame, q->channels,
q->frame_factor);
"configuration %d/%d/%d\n", q->bytes_per_frame,
avctx->channels, q->frame_factor);
return AVERROR_INVALIDDATA;
}
} else if (avctx->extradata_size == 10) {
@ -900,7 +904,7 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx)
q->samples_per_frame = bytestream_get_be16(&edata_ptr);
q->delay = bytestream_get_be16(&edata_ptr);
q->coding_mode = bytestream_get_be16(&edata_ptr);
q->samples_per_channel = q->samples_per_frame / q->channels;
q->samples_per_channel = q->samples_per_frame / avctx->channels;
q->scrambled_stream = 1;
} else {
@ -938,11 +942,6 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx)
return AVERROR_INVALIDDATA;
}
if (avctx->channels <= 0 || avctx->channels > 2) {
av_log(avctx, AV_LOG_ERROR, "Channel configuration error!\n");
return AVERROR(EINVAL);
}
if (avctx->block_align >= UINT_MAX / 2)
return AVERROR(EINVAL);
@ -1000,7 +999,7 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx)
avpriv_float_dsp_init(&q->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
ff_fmt_convert_init(&q->fmt_conv, avctx);
q->units = av_mallocz(sizeof(ChannelUnit) * q->channels);
q->units = av_mallocz(sizeof(ChannelUnit) * avctx->channels);
if (!q->units) {
atrac3_decode_close(avctx);
return AVERROR(ENOMEM);