|
|
@ -511,6 +511,26 @@ static inline int get_ue_code(GetBitContext *gb, int order) { |
|
|
|
return get_ue_golomb(gb); |
|
|
|
return get_ue_golomb(gb); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline int dequant(AVSContext *h, DCTELEM *level_buf, uint8_t *run_buf, |
|
|
|
|
|
|
|
DCTELEM *dst, int mul, int shift, int coeff_num) { |
|
|
|
|
|
|
|
int round = 1 << (shift - 1); |
|
|
|
|
|
|
|
int pos = -1; |
|
|
|
|
|
|
|
const uint8_t *scantab = h->scantable.permutated; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* inverse scan and dequantization */ |
|
|
|
|
|
|
|
while(--coeff_num >= 0){ |
|
|
|
|
|
|
|
pos += run_buf[coeff_num]; |
|
|
|
|
|
|
|
if(pos > 63) { |
|
|
|
|
|
|
|
av_log(h->s.avctx, AV_LOG_ERROR, |
|
|
|
|
|
|
|
"position out of block bounds at pic %d MB(%d,%d)\n", |
|
|
|
|
|
|
|
h->picture.poc, h->mbx, h->mby); |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
dst[scantab[pos]] = (level_buf[coeff_num]*mul + round) >> shift; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* decode coefficients from one 8x8 block, dequantize, inverse transform |
|
|
|
* decode coefficients from one 8x8 block, dequantize, inverse transform |
|
|
|
* and add them to sample block |
|
|
|
* and add them to sample block |
|
|
@ -597,6 +617,15 @@ static inline int decode_residual_inter(AVSContext *h) { |
|
|
|
* |
|
|
|
* |
|
|
|
****************************************************************************/ |
|
|
|
****************************************************************************/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline void set_mv_intra(AVSContext *h) { |
|
|
|
|
|
|
|
h->mv[MV_FWD_X0] = ff_cavs_intra_mv; |
|
|
|
|
|
|
|
set_mvs(&h->mv[MV_FWD_X0], BLK_16X16); |
|
|
|
|
|
|
|
h->mv[MV_BWD_X0] = ff_cavs_intra_mv; |
|
|
|
|
|
|
|
set_mvs(&h->mv[MV_BWD_X0], BLK_16X16); |
|
|
|
|
|
|
|
if(h->pic_type != AV_PICTURE_TYPE_B) |
|
|
|
|
|
|
|
h->col_type_base[h->mbidx] = I_8X8; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int decode_mb_i(AVSContext *h, int cbp_code) { |
|
|
|
static int decode_mb_i(AVSContext *h, int cbp_code) { |
|
|
|
GetBitContext *gb = &h->s.gb; |
|
|
|
GetBitContext *gb = &h->s.gb; |
|
|
|
unsigned pred_mode_uv; |
|
|
|
unsigned pred_mode_uv; |
|
|
@ -664,6 +693,16 @@ static int decode_mb_i(AVSContext *h, int cbp_code) { |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline void set_intra_mode_default(AVSContext *h) { |
|
|
|
|
|
|
|
if(h->stream_revision > 0) { |
|
|
|
|
|
|
|
h->pred_mode_Y[3] = h->pred_mode_Y[6] = NOT_AVAIL; |
|
|
|
|
|
|
|
h->top_pred_Y[h->mbx*2+0] = h->top_pred_Y[h->mbx*2+1] = NOT_AVAIL; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
h->pred_mode_Y[3] = h->pred_mode_Y[6] = INTRA_L_LP; |
|
|
|
|
|
|
|
h->top_pred_Y[h->mbx*2+0] = h->top_pred_Y[h->mbx*2+1] = INTRA_L_LP; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void decode_mb_p(AVSContext *h, enum cavs_mb mb_type) { |
|
|
|
static void decode_mb_p(AVSContext *h, enum cavs_mb mb_type) { |
|
|
|
GetBitContext *gb = &h->s.gb; |
|
|
|
GetBitContext *gb = &h->s.gb; |
|
|
|
int ref[4]; |
|
|
|
int ref[4]; |
|
|
|