|
|
|
@@ -411,7 +411,7 @@ static void decode_slice_plane(ProresContext *ctx, ProresThreadData *td, |
|
|
|
int data_size, uint16_t *out_ptr, |
|
|
|
int linesize, int mbs_per_slice, |
|
|
|
int blocks_per_mb, int plane_size_factor, |
|
|
|
const int16_t *qmat) |
|
|
|
const int16_t *qmat, int is_chroma) |
|
|
|
{ |
|
|
|
GetBitContext gb; |
|
|
|
DCTELEM *block_ptr; |
|
|
|
@@ -431,18 +431,33 @@ static void decode_slice_plane(ProresContext *ctx, ProresThreadData *td, |
|
|
|
/* inverse quantization, inverse transform and output */ |
|
|
|
block_ptr = td->blocks; |
|
|
|
|
|
|
|
for (mb_num = 0; mb_num < mbs_per_slice; mb_num++, out_ptr += blocks_per_mb * 4) { |
|
|
|
ctx->dsp.idct_put(out_ptr, linesize, block_ptr, qmat); |
|
|
|
block_ptr += 64; |
|
|
|
if (blocks_per_mb > 2) { |
|
|
|
ctx->dsp.idct_put(out_ptr + 8, linesize, block_ptr, qmat); |
|
|
|
if (!is_chroma) { |
|
|
|
for (mb_num = 0; mb_num < mbs_per_slice; mb_num++, out_ptr += blocks_per_mb * 4) { |
|
|
|
ctx->dsp.idct_put(out_ptr, linesize, block_ptr, qmat); |
|
|
|
block_ptr += 64; |
|
|
|
if (blocks_per_mb > 2) { |
|
|
|
ctx->dsp.idct_put(out_ptr + 8, linesize, block_ptr, qmat); |
|
|
|
block_ptr += 64; |
|
|
|
} |
|
|
|
ctx->dsp.idct_put(out_ptr + linesize * 4, linesize, block_ptr, qmat); |
|
|
|
block_ptr += 64; |
|
|
|
if (blocks_per_mb > 2) { |
|
|
|
ctx->dsp.idct_put(out_ptr + linesize * 4 + 8, linesize, block_ptr, qmat); |
|
|
|
block_ptr += 64; |
|
|
|
} |
|
|
|
} |
|
|
|
ctx->dsp.idct_put(out_ptr + linesize * 4, linesize, block_ptr, qmat); |
|
|
|
block_ptr += 64; |
|
|
|
if (blocks_per_mb > 2) { |
|
|
|
ctx->dsp.idct_put(out_ptr + linesize * 4 + 8, linesize, block_ptr, qmat); |
|
|
|
} else { |
|
|
|
for (mb_num = 0; mb_num < mbs_per_slice; mb_num++, out_ptr += blocks_per_mb * 4) { |
|
|
|
ctx->dsp.idct_put(out_ptr, linesize, block_ptr, qmat); |
|
|
|
block_ptr += 64; |
|
|
|
ctx->dsp.idct_put(out_ptr + linesize * 4, linesize, block_ptr, qmat); |
|
|
|
block_ptr += 64; |
|
|
|
if (blocks_per_mb > 2) { |
|
|
|
ctx->dsp.idct_put(out_ptr + 8, linesize, block_ptr, qmat); |
|
|
|
block_ptr += 64; |
|
|
|
ctx->dsp.idct_put(out_ptr + linesize * 4 + 8, linesize, block_ptr, qmat); |
|
|
|
block_ptr += 64; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@@ -523,7 +538,7 @@ static int decode_slice(AVCodecContext *avctx, void *tdata) |
|
|
|
(uint16_t*) (y_data + (mb_y_pos << 4) * y_linesize + |
|
|
|
(mb_x_pos << 5)), y_linesize, |
|
|
|
mbs_per_slice, 4, slice_width_factor + 2, |
|
|
|
td->qmat_luma_scaled); |
|
|
|
td->qmat_luma_scaled, 0); |
|
|
|
|
|
|
|
/* decode U chroma plane */ |
|
|
|
decode_slice_plane(ctx, td, buf + hdr_size + y_data_size, u_data_size, |
|
|
|
@@ -531,7 +546,7 @@ static int decode_slice(AVCodecContext *avctx, void *tdata) |
|
|
|
(mb_x_pos << ctx->mb_chroma_factor)), |
|
|
|
u_linesize, mbs_per_slice, ctx->num_chroma_blocks, |
|
|
|
slice_width_factor + ctx->chroma_factor - 1, |
|
|
|
td->qmat_chroma_scaled); |
|
|
|
td->qmat_chroma_scaled, 1); |
|
|
|
|
|
|
|
/* decode V chroma plane */ |
|
|
|
decode_slice_plane(ctx, td, buf + hdr_size + y_data_size + u_data_size, |
|
|
|
@@ -540,7 +555,7 @@ static int decode_slice(AVCodecContext *avctx, void *tdata) |
|
|
|
(mb_x_pos << ctx->mb_chroma_factor)), |
|
|
|
v_linesize, mbs_per_slice, ctx->num_chroma_blocks, |
|
|
|
slice_width_factor + ctx->chroma_factor - 1, |
|
|
|
td->qmat_chroma_scaled); |
|
|
|
td->qmat_chroma_scaled, 1); |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|