]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/aic.c
utvideodec: Support UQRA and UQRG
[ffmpeg] / libavcodec / aic.c
index 9ea27a7ecdac7c7d48984f7f951e4f9d444b5f72..de9d7de91bee5f67ae3fcd92a23519e9c61263a5 100644 (file)
 #include <inttypes.h>
 
 #include "avcodec.h"
+#include "bitstream.h"
 #include "bytestream.h"
-#include "internal.h"
-#include "get_bits.h"
 #include "golomb.h"
+#include "internal.h"
 #include "idctdsp.h"
+#include "thread.h"
 #include "unary.h"
 
 #define AIC_HDR_SIZE    24
@@ -132,7 +133,7 @@ static const uint8_t aic_c_ext_scan[192] = {
     177, 184, 176, 169, 162, 161, 168, 160,
 };
 
-static const uint8_t *aic_scan[NUM_BANDS] = {
+static const uint8_t * const aic_scan[NUM_BANDS] = {
     aic_y_scan, aic_c_scan, aic_y_ext_scan, aic_c_ext_scan
 };
 
@@ -190,14 +191,14 @@ static int aic_decode_header(AICContext *ctx, const uint8_t *src, int size)
 #define GET_CODE(val, type, add_bits)                         \
     do {                                                      \
         if (type)                                             \
-            val = get_ue_golomb(gb);                          \
+            val = get_ue_golomb(bc);                          \
         else                                                  \
-            val = get_unary(gb, 1, 31);                       \
+            val = get_unary(bc, 1, 31);                       \
         if (add_bits)                                         \
-            val = (val << add_bits) + get_bits(gb, add_bits); \
+            val = (val << add_bits) + bitstream_read(bc, add_bits); \
     } while (0)
 
-static int aic_decode_coeffs(GetBitContext *gb, int16_t *dst,
+static int aic_decode_coeffs(BitstreamContext *bc, int16_t *dst,
                              int band, int slice_width, int force_chroma)
 {
     int has_skips, coeff_type, coeff_bits, skip_type, skip_bits;
@@ -205,13 +206,13 @@ static int aic_decode_coeffs(GetBitContext *gb, int16_t *dst,
     const uint8_t *scan = aic_scan[band | force_chroma];
     int mb, idx, val;
 
-    has_skips  = get_bits1(gb);
-    coeff_type = get_bits1(gb);
-    coeff_bits = get_bits(gb, 3);
+    has_skips  = bitstream_read_bit(bc);
+    coeff_type = bitstream_read_bit(bc);
+    coeff_bits = bitstream_read(bc, 3);
 
     if (has_skips) {
-        skip_type = get_bits1(gb);
-        skip_bits = get_bits(gb, 3);
+        skip_type = bitstream_read_bit(bc);
+        skip_bits = bitstream_read(bc, 3);
 
         for (mb = 0; mb < slice_width; mb++) {
             idx = -1;
@@ -302,7 +303,7 @@ static void unquant_block(int16_t *block, int q)
 static int aic_decode_slice(AICContext *ctx, int mb_x, int mb_y,
                             const uint8_t *src, int src_size)
 {
-    GetBitContext gb;
+    BitstreamContext bc;
     int ret, i, mb, blk;
     int slice_width = FFMIN(ctx->slice_width, ctx->mb_width - mb_x);
     uint8_t *Y, *C[2];
@@ -317,12 +318,12 @@ static int aic_decode_slice(AICContext *ctx, int mb_x, int mb_y,
     for (i = 0; i < 2; i++)
         C[i] = ctx->frame->data[i + 1] + mb_x * 8
                + mb_y * 8 * ctx->frame->linesize[i + 1];
-    init_get_bits(&gb, src, src_size * 8);
+    bitstream_init8(&bc, src, src_size);
 
     memset(ctx->slice_data, 0,
            sizeof(*ctx->slice_data) * slice_width * AIC_BAND_COEFFS);
     for (i = 0; i < NUM_BANDS; i++)
-        if ((ret = aic_decode_coeffs(&gb, ctx->data_ptr[i],
+        if ((ret = aic_decode_coeffs(&bc, ctx->data_ptr[i],
                                      i, slice_width,
                                      !ctx->interlaced)) < 0)
             return ret;
@@ -373,6 +374,7 @@ static int aic_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
     uint32_t off;
     int x, y, ret;
     int slice_size;
+    ThreadFrame frame = { .f = data };
 
     ctx->frame            = data;
     ctx->frame->pict_type = AV_PICTURE_TYPE_I;
@@ -391,7 +393,7 @@ static int aic_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
         return ret;
     }
 
-    if ((ret = ff_get_buffer(avctx, ctx->frame, 0)) < 0)
+    if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
         return ret;
 
     bytestream2_init(&gb, buf + AIC_HDR_SIZE,
@@ -484,5 +486,7 @@ AVCodec ff_aic_decoder = {
     .init           = aic_decode_init,
     .close          = aic_decode_close,
     .decode         = aic_decode_frame,
-    .capabilities   = AV_CODEC_CAP_DR1,
+    .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
+    .init_thread_copy = ONLY_IF_THREADS_ENABLED(aic_decode_init),
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };