diff options
Diffstat (limited to 'vp8/decoder')
-rw-r--r-- | vp8/decoder/decodemv.c | 36 | ||||
-rw-r--r-- | vp8/decoder/decodframe.c | 11 | ||||
-rw-r--r-- | vp8/decoder/onyxd_if.c | 18 | ||||
-rw-r--r-- | vp8/decoder/threading.c | 19 |
4 files changed, 34 insertions, 50 deletions
diff --git a/vp8/decoder/decodemv.c b/vp8/decoder/decodemv.c index cd67536bc..97cc6c943 100644 --- a/vp8/decoder/decodemv.c +++ b/vp8/decoder/decodemv.c @@ -94,10 +94,10 @@ static void vp8_kfread_modes(VP8D_COMP *pbi, MODE_INFO *m, int mb_row, int mb_co do { - const B_PREDICTION_MODE A = vp8_above_bmi(m, i, mis)->mode; - const B_PREDICTION_MODE L = vp8_left_bmi(m, i)->mode; + const B_PREDICTION_MODE A = above_block_mode(m, i, mis); + const B_PREDICTION_MODE L = left_block_mode(m, i); - m->bmi[i].mode = (B_PREDICTION_MODE) vp8_read_bmode(bc, pbi->common.kf_bmode_prob [A] [L]); + m->bmi[i].as_mode = (B_PREDICTION_MODE) vp8_read_bmode(bc, pbi->common.kf_bmode_prob [A] [L]); } while (++i < 16); } @@ -127,7 +127,7 @@ static void vp8_kfread_modes(VP8D_COMP *pbi, MODE_INFO *m, int mb_row, int mb_co do { - m->bmi[i].mode = (B_PREDICTION_MODE)BMode; + m->bmi[i].as_mode = (B_PREDICTION_MODE)BMode; } while (++i < 16); } @@ -354,12 +354,15 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi, do /* for each subset j */ { + int_mv leftmv, abovemv; B_MODE_INFO bmi; int k; /* first block in subset j */ int mv_contz; k = vp8_mbsplit_offset[s][j]; - mv_contz = vp8_mv_cont(&(vp8_left_bmi(mi, k)->mv.as_mv), &(vp8_above_bmi(mi, k, mis)->mv.as_mv)); + leftmv.as_int = left_block_mv(mi, k); + abovemv.as_int = above_block_mv(mi, k, mis); + mv_contz = vp8_mv_cont(&(leftmv.as_mv), &(abovemv.as_mv)); switch (bmi.mode = (B_PREDICTION_MODE) sub_mv_ref(bc, vp8_sub_mv_ref_prob2 [mv_contz])) /*pc->fc.sub_mv_ref_prob))*/ { @@ -372,13 +375,13 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi, #endif break; case LEFT4X4: - bmi.mv.as_int = vp8_left_bmi(mi, k)->mv.as_int; + bmi.mv.as_int = leftmv.as_int; #ifdef VPX_MODE_COUNT vp8_mv_cont_count[mv_contz][0]++; #endif break; case ABOVE4X4: - bmi.mv.as_int = vp8_above_bmi(mi, k, mis)->mv.as_int; + bmi.mv.as_int = abovemv.as_int; #ifdef VPX_MODE_COUNT vp8_mv_cont_count[mv_contz][1]++; #endif @@ -409,9 +412,8 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi, fill_offset = &mbsplit_fill_offset[s][(unsigned char)j * mbsplit_fill_count[s]]; do { - mi->bmi[ *fill_offset] = bmi; + mi->bmi[ *fill_offset].mv.as_int = bmi.mv.as_int; fill_offset++; - }while (--fill_count); } @@ -485,20 +487,16 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi, } else { - /* MB is intra coded */ - int j = 0; - do - { - mi->bmi[j].mv.as_int = 0; - } - while (++j < 16); + /* required for left and above block mv */ + mbmi->mv.as_int = 0; + /* MB is intra coded */ if ((mbmi->mode = (MB_PREDICTION_MODE) vp8_read_ymode(bc, pbi->common.fc.ymode_prob)) == B_PRED) { - j = 0; + int j = 0; do { - mi->bmi[j].mode = (B_PREDICTION_MODE)vp8_read_bmode(bc, pbi->common.fc.bmode_prob); + mi->bmi[j].as_mode = (B_PREDICTION_MODE)vp8_read_bmode(bc, pbi->common.fc.bmode_prob); } while (++j < 16); } @@ -531,7 +529,9 @@ void vp8_decode_mode_mvs(VP8D_COMP *pbi) while (++mb_col < pbi->common.mb_cols) { +#if CONFIG_ERROR_CONCEALMENT int mb_num = mb_row * pbi->common.mb_cols + mb_col; +#endif /*read_mb_modes_mv(pbi, xd->mode_info_context, &xd->mode_info_context->mbmi, mb_row, mb_col);*/ if(pbi->common.frame_type == KEY_FRAME) vp8_kfread_modes(pbi, mi, mb_row, mb_col); diff --git a/vp8/decoder/decodframe.c b/vp8/decoder/decodframe.c index f8e04a7d0..80e8723d6 100644 --- a/vp8/decoder/decodframe.c +++ b/vp8/decoder/decodframe.c @@ -350,8 +350,6 @@ FILE *vpxlog = 0; static void decode_mb_row(VP8D_COMP *pbi, VP8_COMMON *pc, int mb_row, MACROBLOCKD *xd) { - - int i; int recon_yoffset, recon_uvoffset; int mb_col; int ref_fb_idx = pc->lst_fb_idx; @@ -399,14 +397,7 @@ decode_mb_row(VP8D_COMP *pbi, VP8_COMMON *pc, int mb_row, MACROBLOCKD *xd) } #endif - if (xd->mode_info_context->mbmi.mode == SPLITMV || xd->mode_info_context->mbmi.mode == B_PRED) - { - for (i = 0; i < 16; i++) - { - BLOCKD *d = &xd->block[i]; - vpx_memcpy(&d->bmi, &xd->mode_info_context->bmi[i], sizeof(B_MODE_INFO)); - } - } + update_blockd_bmi(xd); xd->dst.y_buffer = pc->yv12_fb[dst_fb_idx].y_buffer + recon_yoffset; xd->dst.u_buffer = pc->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset; diff --git a/vp8/decoder/onyxd_if.c b/vp8/decoder/onyxd_if.c index 705fb334f..d10b2cb34 100644 --- a/vp8/decoder/onyxd_if.c +++ b/vp8/decoder/onyxd_if.c @@ -39,6 +39,8 @@ extern void vp8_init_loop_filter(VP8_COMMON *cm); extern void vp8cx_init_de_quantizer(VP8D_COMP *pbi); +static int get_free_fb (VP8_COMMON *cm); +static void ref_cnt_fb (int *buf, int *idx, int new_idx); void vp8dx_initialize() @@ -155,18 +157,24 @@ int vp8dx_set_reference(VP8D_PTR ptr, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_C { VP8D_COMP *pbi = (VP8D_COMP *) ptr; VP8_COMMON *cm = &pbi->common; - int ref_fb_idx; + int *ref_fb_ptr = NULL; + int free_fb; if (ref_frame_flag == VP8_LAST_FLAG) - ref_fb_idx = cm->lst_fb_idx; + *ref_fb_ptr = cm->lst_fb_idx; else if (ref_frame_flag == VP8_GOLD_FLAG) - ref_fb_idx = cm->gld_fb_idx; + *ref_fb_ptr = cm->gld_fb_idx; else if (ref_frame_flag == VP8_ALT_FLAG) - ref_fb_idx = cm->alt_fb_idx; + *ref_fb_ptr = cm->alt_fb_idx; else return -1; - vp8_yv12_copy_frame_ptr(sd, &cm->yv12_fb[ref_fb_idx]); + /* Find an empty frame buffer. */ + free_fb = get_free_fb(cm); + + /* Manage the reference counters and copy image. */ + ref_cnt_fb (cm->fb_idx_ref_cnt, ref_fb_ptr, free_fb); + vp8_yv12_copy_frame_ptr(sd, &cm->yv12_fb[*ref_fb_ptr]); return 0; } diff --git a/vp8/decoder/threading.c b/vp8/decoder/threading.c index de1583473..4ca53fbe4 100644 --- a/vp8/decoder/threading.c +++ b/vp8/decoder/threading.c @@ -187,7 +187,6 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, int mb_row, int m { BLOCKD *b = &xd->block[i]; vp8mt_predict_intra4x4(pbi, xd, b->bmi.mode, b->predictor, mb_row, mb_col, i); - if (xd->eobs[i] > 1) { DEQUANT_INVOKE(&pbi->dequant, idct_add) @@ -288,14 +287,7 @@ static THREAD_FUNCTION thread_decoding_proc(void *p_data) } } - if (xd->mode_info_context->mbmi.mode == SPLITMV || xd->mode_info_context->mbmi.mode == B_PRED) - { - for (i = 0; i < 16; i++) - { - BLOCKD *d = &xd->block[i]; - vpx_memcpy(&d->bmi, &xd->mode_info_context->bmi[i], sizeof(B_MODE_INFO)); - } - } + update_blockd_bmi(xd); /* Distance of Mb to the various image edges. * These are specified to 8th pel as they are always compared to values that are in 1/8th pel units @@ -776,14 +768,7 @@ void vp8mt_decode_mb_rows( VP8D_COMP *pbi, MACROBLOCKD *xd) } } - if (xd->mode_info_context->mbmi.mode == SPLITMV || xd->mode_info_context->mbmi.mode == B_PRED) - { - for (i = 0; i < 16; i++) - { - BLOCKD *d = &xd->block[i]; - vpx_memcpy(&d->bmi, &xd->mode_info_context->bmi[i], sizeof(B_MODE_INFO)); - } - } + update_blockd_bmi(xd); /* Distance of Mb to the various image edges. * These are specified to 8th pel as they are always compared to values that are in 1/8th pel units |