Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/oapv.c
Original file line number Diff line number Diff line change
Expand Up @@ -1569,8 +1569,10 @@ static int dec_block(oapvd_ctx_t *ctx, oapvd_core_t *core, int log2_w, int log2_
{
int bit_depth = ctx->bit_depth;

// DC prediction
core->coef[0] = core->dc_diff + core->prev_dc[c];
// DC prediction; the reconstructed value must fit the coefficient range
int dc = core->dc_diff + core->prev_dc[c];
oapv_assert_rv(dc >= MIN_TX_VAL && dc <= MAX_TX_VAL, OAPV_ERR_MALFORMED_BITSTREAM);
core->coef[0] = (s16)dc;
core->prev_dc[c] = core->coef[0];
// Inverse quantization
ctx->fn_dquant[0](core->coef, core->q_mat[c], log2_w, log2_h, core->dq_shift[c]);
Expand Down
7 changes: 5 additions & 2 deletions src/oapv_vlc.c
Original file line number Diff line number Diff line change
Expand Up @@ -866,12 +866,15 @@ int oapvd_vlc_dc_coef(oapv_bs_t *bs, int *dc_diff, int *kparam_dc)
abs_dc_diff = dec_vlc_read(bs, *kparam_dc);
if(abs_dc_diff < 0) // dec_vlc_read error sentinel
return OAPV_ERR_MALFORMED_BITSTREAM;
if(abs_dc_diff > 32767)
// DC coefficients are in [-32768, 32767], so the difference between two
// neighboring blocks can legally reach 65535; only the reconstructed DC
// value is bounded, which dec_block() checks after prediction
if(abs_dc_diff > 65535)
return OAPV_ERR_MALFORMED_BITSTREAM;
if(abs_dc_diff) {
if(bs->leftbits == 0) BSR_FLUSH_1BYTE(bs);
BSR_READ_1BIT(bs, sign);
*dc_diff = oapv_set_sign16(abs_dc_diff, sign);
*dc_diff = oapv_set_sign(abs_dc_diff, sign);
*kparam_dc = KPARAM_DC(abs_dc_diff);
}
else {
Expand Down