X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fatrac3plusdec.c;h=17774d56578503f87283faba84ac9260ca694bfe;hb=6151e9128ce2a84a443c82b78f5b5cb364ba2ab4;hp=dbdb3b31944943b694ff46ff96e72f6e6a203c87;hpb=e6f0bb65270be51ea43345a28f8e4b1a728f7d0e;p=ffmpeg diff --git a/libavcodec/atrac3plusdec.c b/libavcodec/atrac3plusdec.c index dbdb3b31944..17774d56578 100644 --- a/libavcodec/atrac3plusdec.c +++ b/libavcodec/atrac3plusdec.c @@ -39,14 +39,15 @@ #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 @@ -77,35 +78,42 @@ static av_cold int set_channel_params(ATRAC3PContext *ctx, { 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; @@ -113,7 +121,8 @@ static av_cold int set_channel_params(ATRAC3PContext *ctx, 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; @@ -123,7 +132,7 @@ static av_cold int set_channel_params(ATRAC3PContext *ctx, 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; } @@ -140,7 +149,7 @@ static av_cold int atrac3p_decode_init(AVCodecContext *avctx) 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); @@ -326,16 +335,16 @@ static int atrac3p_decode_frame(AVCodecContext *avctx, void *data, 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; @@ -350,7 +359,7 @@ static int atrac3p_decode_frame(AVCodecContext *avctx, void *data, 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) @@ -379,6 +388,7 @@ AVCodec ff_atrac3p_decoder = { .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,