avcodec/proresenc_aw : move scantable to prores context
authorMartin Vignali <martin.vignali@gmail.com>
Sat, 9 Feb 2019 17:20:21 +0000 (18:20 +0100)
committerMartin Vignali <martin.vignali@gmail.com>
Sat, 23 Feb 2019 12:21:25 +0000 (13:21 +0100)
libavcodec/proresenc_anatoliy.c

index 061621d..57d9d9a 100644 (file)
@@ -186,6 +186,7 @@ typedef struct {
 
     int qmat_luma[16][64];
     int qmat_chroma[16][64];
+    const uint8_t *scantable;
 
     int is_422;
     int need_alpha;
@@ -269,14 +270,14 @@ static const uint8_t lev_to_cb[10] = { 0x04, 0x0A, 0x05, 0x06, 0x04, 0x28,
         0x28, 0x28, 0x28, 0x4C };
 
 static void encode_ac_coeffs(PutBitContext *pb,
-        int16_t *in, int blocks_per_slice, int *qmat)
+        int16_t *in, int blocks_per_slice, int *qmat, const uint8_t ff_prores_scan[64])
 {
     int prev_run = 4;
     int prev_level = 2;
 
     int run = 0, level, code, i, j;
     for (i = 1; i < 64; i++) {
-        int indp = ff_prores_progressive_scan[i];
+        int indp = ff_prores_scan[i];
         for (j = 0; j < blocks_per_slice; j++) {
             int val = QSCALE(qmat, indp, in[(j << 6) + indp]);
             if (val) {
@@ -354,7 +355,8 @@ static void calc_plane_dct(FDCTDSPContext *fdsp, uint8_t *src, int16_t * blocks,
     }
 }
 
-static int encode_slice_plane(int16_t *blocks, int mb_count, uint8_t *buf, unsigned buf_size, int *qmat, int sub_sample_chroma)
+static int encode_slice_plane(int16_t *blocks, int mb_count, uint8_t *buf, unsigned buf_size, int *qmat, int sub_sample_chroma,
+                              const uint8_t ff_prores_scan[64])
 {
     int blocks_per_slice;
     PutBitContext pb;
@@ -363,7 +365,7 @@ static int encode_slice_plane(int16_t *blocks, int mb_count, uint8_t *buf, unsig
     init_put_bits(&pb, buf, buf_size);
 
     encode_dc_coeffs(&pb, blocks, blocks_per_slice, qmat);
-    encode_ac_coeffs(&pb, blocks, blocks_per_slice, qmat);
+    encode_ac_coeffs(&pb, blocks, blocks_per_slice, qmat, ff_prores_scan);
 
     flush_put_bits(&pb);
     return put_bits_ptr(&pb) - pb.buf;
@@ -378,15 +380,15 @@ static av_always_inline unsigned encode_slice_data(AVCodecContext *avctx,
     ProresContext* ctx = avctx->priv_data;
 
     *y_data_size = encode_slice_plane(blocks_y, mb_count,
-                                      buf, data_size, ctx->qmat_luma[qp - 1], 0);
+                                      buf, data_size, ctx->qmat_luma[qp - 1], 0, ctx->scantable);
 
     if (!(avctx->flags & AV_CODEC_FLAG_GRAY)) {
         *u_data_size = encode_slice_plane(blocks_u, mb_count, buf + *y_data_size, data_size - *y_data_size,
-                                          ctx->qmat_chroma[qp - 1], ctx->is_422);
+                                          ctx->qmat_chroma[qp - 1], ctx->is_422, ctx->scantable);
 
         *v_data_size = encode_slice_plane(blocks_v, mb_count, buf + *y_data_size + *u_data_size,
                                           data_size - *y_data_size - *u_data_size,
-                                          ctx->qmat_chroma[qp - 1], ctx->is_422);
+                                          ctx->qmat_chroma[qp - 1], ctx->is_422, ctx->scantable);
     }
 
     return *y_data_size + *u_data_size + *v_data_size;
@@ -755,6 +757,7 @@ static av_cold int prores_encode_init(AVCodecContext *avctx)
 
     avctx->bits_per_raw_sample = 10;
     ctx->need_alpha = 0;
+    ctx->scantable = ff_prores_progressive_scan;
 
     if (avctx->width & 0x1) {
         av_log(avctx, AV_LOG_ERROR,