|
|
|
@ -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, |
|
|
|
|