#include "libavutil/channel_layout.h"
#include "libavutil/float_dsp.h"
+
#include "avcodec.h"
-#include "get_bits.h"
+#include "bitstream.h"
#include "internal.h"
#include "atrac.h"
#include "atrac3plus.h"
typedef struct ATRAC3PContext {
- GetBitContext gb;
+ BitstreamContext bc;
AVFloatDSPContext fdsp;
DECLARE_ALIGNED(32, float, samples)[2][ATRAC3P_FRAME_SAMPLES]; ///< quantized MDCT spectrum
{
memset(ctx->channel_blocks, 0, sizeof(ctx->channel_blocks));
- switch (avctx->channel_layout) {
- case AV_CH_FRONT_LEFT:
- case AV_CH_LAYOUT_MONO:
+ switch (avctx->channels) {
+ case 1:
+ if (avctx->channel_layout != AV_CH_FRONT_LEFT)
+ avctx->channel_layout = AV_CH_LAYOUT_MONO;
+
ctx->num_channel_blocks = 1;
ctx->channel_blocks[0] = CH_UNIT_MONO;
break;
- case AV_CH_LAYOUT_STEREO:
+ case 2:
+ avctx->channel_layout = AV_CH_LAYOUT_STEREO;
ctx->num_channel_blocks = 1;
ctx->channel_blocks[0] = CH_UNIT_STEREO;
break;
- case AV_CH_LAYOUT_SURROUND:
+ case 3:
+ avctx->channel_layout = AV_CH_LAYOUT_SURROUND;
ctx->num_channel_blocks = 2;
ctx->channel_blocks[0] = CH_UNIT_STEREO;
ctx->channel_blocks[1] = CH_UNIT_MONO;
break;
- case AV_CH_LAYOUT_4POINT0:
+ case 4:
+ avctx->channel_layout = AV_CH_LAYOUT_4POINT0;
ctx->num_channel_blocks = 3;
ctx->channel_blocks[0] = CH_UNIT_STEREO;
ctx->channel_blocks[1] = CH_UNIT_MONO;
ctx->channel_blocks[2] = CH_UNIT_MONO;
break;
- case AV_CH_LAYOUT_5POINT1_BACK:
+ case 6:
+ avctx->channel_layout = AV_CH_LAYOUT_5POINT1_BACK;
ctx->num_channel_blocks = 4;
ctx->channel_blocks[0] = CH_UNIT_STEREO;
ctx->channel_blocks[1] = CH_UNIT_MONO;
ctx->channel_blocks[2] = CH_UNIT_STEREO;
ctx->channel_blocks[3] = CH_UNIT_MONO;
break;
- case AV_CH_LAYOUT_6POINT1_BACK:
+ case 7:
+ avctx->channel_layout = AV_CH_LAYOUT_6POINT1_BACK;
ctx->num_channel_blocks = 5;
ctx->channel_blocks[0] = CH_UNIT_STEREO;
ctx->channel_blocks[1] = CH_UNIT_MONO;
ctx->channel_blocks[3] = CH_UNIT_MONO;
ctx->channel_blocks[4] = CH_UNIT_MONO;
break;
- case AV_CH_LAYOUT_7POINT1:
+ case 8:
+ avctx->channel_layout = AV_CH_LAYOUT_7POINT1;
ctx->num_channel_blocks = 5;
ctx->channel_blocks[0] = CH_UNIT_STEREO;
ctx->channel_blocks[1] = CH_UNIT_MONO;
break;
default:
av_log(avctx, AV_LOG_ERROR,
- "Unsupported channel layout: %"PRIx64"!\n", avctx->channel_layout);
+ "Unsupported channel count: %d!\n", avctx->channels);
return AVERROR_INVALIDDATA;
}
return AVERROR(EINVAL);
}
- avpriv_float_dsp_init(&ctx->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
+ avpriv_float_dsp_init(&ctx->fdsp, avctx->flags & AV_CODEC_FLAG_BITEXACT);
/* initialize IPQF */
ff_mdct_init(&ctx->ipqf_dct_ctx, 5, 1, 32.0 / 32768.0);
return ret;
}
- if ((ret = init_get_bits8(&ctx->gb, avpkt->data, avpkt->size)) < 0)
+ if ((ret = bitstream_init8(&ctx->bc, avpkt->data, avpkt->size)) < 0)
return ret;
- if (get_bits1(&ctx->gb)) {
+ if (bitstream_read_bit(&ctx->bc)) {
av_log(avctx, AV_LOG_ERROR, "Invalid start bit!\n");
return AVERROR_INVALIDDATA;
}
- while (get_bits_left(&ctx->gb) >= 2 &&
- (ch_unit_id = get_bits(&ctx->gb, 2)) != CH_UNIT_TERMINATOR) {
+ while (bitstream_bits_left(&ctx->bc) >= 2 &&
+ (ch_unit_id = bitstream_read(&ctx->bc, 2)) != CH_UNIT_TERMINATOR) {
if (ch_unit_id == CH_UNIT_EXTENSION) {
avpriv_report_missing_feature(avctx, "Channel unit extension");
return AVERROR_PATCHWELCOME;
ctx->ch_units[ch_block].unit_type = ch_unit_id;
channels_to_process = ch_unit_id + 1;
- if ((ret = ff_atrac3p_decode_channel_unit(&ctx->gb,
+ if ((ret = ff_atrac3p_decode_channel_unit(&ctx->bc,
&ctx->ch_units[ch_block],
channels_to_process,
avctx)) < 0)
.long_name = NULL_IF_CONFIG_SMALL("ATRAC3+ (Adaptive TRansform Acoustic Coding 3+)"),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_ATRAC3P,
+ .capabilities = AV_CODEC_CAP_DR1,
.priv_data_size = sizeof(ATRAC3PContext),
.init = atrac3p_decode_init,
.init_static_data = ff_atrac3p_init_vlcs,