]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/atrac3plusdec.c
build: Detect blocks C language extension and add it as VDA dependency
[ffmpeg] / libavcodec / atrac3plusdec.c
index dbdb3b31944943b694ff46ff96e72f6e6a203c87..17774d56578503f87283faba84ac9260ca694bfe 100644 (file)
 
 #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,