| @@ -328,6 +328,15 @@ static void intra_pred_lp_top(uint8_t *d,uint8_t *top,uint8_t *left,int stride) | |||||
| #undef LOWPASS | #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) { | void ff_cavs_modify_mb_i(AVSContext *h, int *pred_mode_uv) { | ||||
| /* save pred modes before they get modified */ | /* save pred modes before they get modified */ | ||||
| h->pred_mode_Y[3] = h->pred_mode_Y[5]; | 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_intra_mv; | ||||
| extern const cavs_vector ff_cavs_dir_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) { | static inline void set_mvs(cavs_vector *mv, enum cavs_block size) { | ||||
| switch(size) { | switch(size) { | ||||
| case BLK_16X16: | 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_filter(AVSContext *h, enum cavs_mb mb_type); | ||||
| void ff_cavs_load_intra_pred_luma(AVSContext *h, uint8_t *top, uint8_t **left, | void ff_cavs_load_intra_pred_luma(AVSContext *h, uint8_t *top, uint8_t **left, | ||||
| int block); | int block); | ||||
| @@ -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]; | ||||