| @@ -328,6 +328,15 @@ static void intra_pred_lp_top(uint8_t *d,uint8_t *top,uint8_t *left,int stride) | |||
| #undef LOWPASS | |||
| static inline void modify_pred(const int8_t *mod_table, int *mode) | |||
| { | |||
| *mode = mod_table[*mode]; | |||
| if(*mode < 0) { | |||
| av_log(NULL, AV_LOG_ERROR, "Illegal intra prediction mode\n"); | |||
| *mode = 0; | |||
| } | |||
| } | |||
| void ff_cavs_modify_mb_i(AVSContext *h, int *pred_mode_uv) { | |||
| /* save pred modes before they get modified */ | |||
| h->pred_mode_Y[3] = h->pred_mode_Y[5]; | |||
| @@ -229,25 +229,6 @@ extern const uint8_t ff_cavs_partition_flags[30]; | |||
| extern const cavs_vector ff_cavs_intra_mv; | |||
| extern const cavs_vector ff_cavs_dir_mv; | |||
| static inline void modify_pred(const int8_t *mod_table, int *mode) | |||
| { | |||
| *mode = mod_table[*mode]; | |||
| if(*mode < 0) { | |||
| av_log(NULL, AV_LOG_ERROR, "Illegal intra prediction mode\n"); | |||
| *mode = 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 inline void set_mvs(cavs_vector *mv, enum cavs_block size) { | |||
| switch(size) { | |||
| case BLK_16X16: | |||
| @@ -262,35 +243,6 @@ static inline void set_mvs(cavs_vector *mv, enum cavs_block size) { | |||
| } | |||
| } | |||
| 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 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; | |||
| } | |||
| void ff_cavs_filter(AVSContext *h, enum cavs_mb mb_type); | |||
| void ff_cavs_load_intra_pred_luma(AVSContext *h, uint8_t *top, uint8_t **left, | |||
| int block); | |||
| @@ -511,6 +511,26 @@ static inline int get_ue_code(GetBitContext *gb, int order) { | |||
| 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 | |||
| * 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) { | |||
| GetBitContext *gb = &h->s.gb; | |||
| unsigned pred_mode_uv; | |||
| @@ -664,6 +693,16 @@ static int decode_mb_i(AVSContext *h, int cbp_code) { | |||
| 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) { | |||
| GetBitContext *gb = &h->s.gb; | |||
| int ref[4]; | |||