diff options
-rw-r--r-- | libavcodec/proresenc_anatoliy.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/libavcodec/proresenc_anatoliy.c b/libavcodec/proresenc_anatoliy.c index 061621d..57d9d9a 100644 --- a/libavcodec/proresenc_anatoliy.c +++ b/libavcodec/proresenc_anatoliy.c @@ -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, |