|
|
|
@ -391,10 +391,10 @@ static av_always_inline void decode_ac_coeffs(AVCodecContext *avctx, GetBitConte |
|
|
|
|
CLOSE_READER(re, gb); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void decode_slice_full(AVCodecContext *avctx, SliceContext *slice, |
|
|
|
|
static void decode_slice_luma(AVCodecContext *avctx, SliceContext *slice, |
|
|
|
|
uint8_t *dst, int dst_stride, |
|
|
|
|
const uint8_t *buf, unsigned buf_size, |
|
|
|
|
const int *qmat, int rotate) |
|
|
|
|
const int *qmat) |
|
|
|
|
{ |
|
|
|
|
ProresContext *ctx = avctx->priv_data; |
|
|
|
|
LOCAL_ALIGNED_16(DCTELEM, blocks, [8*4*64]); |
|
|
|
@ -412,38 +412,27 @@ static void decode_slice_full(AVCodecContext *avctx, SliceContext *slice, |
|
|
|
|
|
|
|
|
|
block = blocks; |
|
|
|
|
|
|
|
|
|
if (rotate) { |
|
|
|
|
for (i = 0; i < slice->mb_count; i++) { |
|
|
|
|
ctx->idct_put(block+(0<<6), dst, dst_stride); |
|
|
|
|
ctx->idct_put(block+(2<<6), dst+16, dst_stride); |
|
|
|
|
ctx->idct_put(block+(1<<6), dst+8*dst_stride, dst_stride); |
|
|
|
|
ctx->idct_put(block+(3<<6), dst+8*dst_stride+16, dst_stride); |
|
|
|
|
block += 4*64; |
|
|
|
|
dst += 32; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
for (i = 0; i < slice->mb_count; i++) { |
|
|
|
|
ctx->idct_put(block+(0<<6), dst, dst_stride); |
|
|
|
|
ctx->idct_put(block+(1<<6), dst+16, dst_stride); |
|
|
|
|
ctx->idct_put(block+(2<<6), dst+8*dst_stride, dst_stride); |
|
|
|
|
ctx->idct_put(block+(3<<6), dst+8*dst_stride+16, dst_stride); |
|
|
|
|
block += 4*64; |
|
|
|
|
dst += 32; |
|
|
|
|
} |
|
|
|
|
for (i = 0; i < slice->mb_count; i++) { |
|
|
|
|
ctx->idct_put(block+(0<<6), dst, dst_stride); |
|
|
|
|
ctx->idct_put(block+(1<<6), dst+16, dst_stride); |
|
|
|
|
ctx->idct_put(block+(2<<6), dst+8*dst_stride, dst_stride); |
|
|
|
|
ctx->idct_put(block+(3<<6), dst+8*dst_stride+16, dst_stride); |
|
|
|
|
block += 4*64; |
|
|
|
|
dst += 32; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void decode_slice_half(AVCodecContext *avctx, SliceContext *slice, |
|
|
|
|
static void decode_slice_chroma(AVCodecContext *avctx, SliceContext *slice, |
|
|
|
|
uint8_t *dst, int dst_stride, |
|
|
|
|
const uint8_t *buf, unsigned buf_size, |
|
|
|
|
const int *qmat) |
|
|
|
|
const int *qmat, int log2_blocks_per_mb) |
|
|
|
|
{ |
|
|
|
|
ProresContext *ctx = avctx->priv_data; |
|
|
|
|
LOCAL_ALIGNED_16(DCTELEM, blocks, [8*4*64]); |
|
|
|
|
DCTELEM *block; |
|
|
|
|
GetBitContext gb; |
|
|
|
|
int i, blocks_per_slice = slice->mb_count<<1; |
|
|
|
|
int i, j, blocks_per_slice = slice->mb_count << log2_blocks_per_mb; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < blocks_per_slice; i++) |
|
|
|
|
ctx->dsp.clear_block(blocks+(i<<6)); |
|
|
|
@ -455,10 +444,12 @@ static void decode_slice_half(AVCodecContext *avctx, SliceContext *slice, |
|
|
|
|
|
|
|
|
|
block = blocks; |
|
|
|
|
for (i = 0; i < slice->mb_count; i++) { |
|
|
|
|
ctx->idct_put(block+(0<<6), dst, dst_stride); |
|
|
|
|
ctx->idct_put(block+(1<<6), dst+8*dst_stride, dst_stride); |
|
|
|
|
block += 2*64; |
|
|
|
|
dst += 16; |
|
|
|
|
for (j = 0; j < log2_blocks_per_mb; j++) { |
|
|
|
|
ctx->idct_put(block+(0<<6), dst, dst_stride); |
|
|
|
|
ctx->idct_put(block+(1<<6), dst+8*dst_stride, dst_stride); |
|
|
|
|
block += 2*64; |
|
|
|
|
dst += 16; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -518,24 +509,24 @@ static int decode_slice_thread(AVCodecContext *avctx, void *arg, int jobnr, int |
|
|
|
|
dest_v += pic->linesize[2]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
decode_slice_full(avctx, slice, dest_y, luma_stride, |
|
|
|
|
buf, y_data_size, qmat_luma_scaled, 0); |
|
|
|
|
decode_slice_luma(avctx, slice, dest_y, luma_stride, |
|
|
|
|
buf, y_data_size, qmat_luma_scaled); |
|
|
|
|
|
|
|
|
|
if (avctx->flags & CODEC_FLAG_GRAY) { |
|
|
|
|
} else if(avctx->pix_fmt == PIX_FMT_YUV444P10) { |
|
|
|
|
decode_slice_full(avctx, slice, dest_u, chroma_stride, |
|
|
|
|
if ((avctx->flags & CODEC_FLAG_GRAY)) { |
|
|
|
|
} else if (avctx->pix_fmt == PIX_FMT_YUV444P10) { |
|
|
|
|
decode_slice_chroma(avctx, slice, dest_u, chroma_stride, |
|
|
|
|
buf + y_data_size, u_data_size, |
|
|
|
|
qmat_chroma_scaled, 1); |
|
|
|
|
decode_slice_full(avctx, slice, dest_v, chroma_stride, |
|
|
|
|
qmat_chroma_scaled, 2); |
|
|
|
|
decode_slice_chroma(avctx, slice, dest_v, chroma_stride, |
|
|
|
|
buf + y_data_size + u_data_size, v_data_size, |
|
|
|
|
qmat_chroma_scaled, 1); |
|
|
|
|
qmat_chroma_scaled, 2); |
|
|
|
|
} else { |
|
|
|
|
decode_slice_half(avctx, slice, dest_u, chroma_stride, |
|
|
|
|
decode_slice_chroma(avctx, slice, dest_u, chroma_stride, |
|
|
|
|
buf + y_data_size, u_data_size, |
|
|
|
|
qmat_chroma_scaled); |
|
|
|
|
decode_slice_half(avctx, slice, dest_v, chroma_stride, |
|
|
|
|
qmat_chroma_scaled, 1); |
|
|
|
|
decode_slice_chroma(avctx, slice, dest_v, chroma_stride, |
|
|
|
|
buf + y_data_size + u_data_size, v_data_size, |
|
|
|
|
qmat_chroma_scaled); |
|
|
|
|
qmat_chroma_scaled, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|