diff options
Diffstat (limited to 'vp8/common')
-rw-r--r-- | vp8/common/blockd.h | 29 | ||||
-rw-r--r-- | vp8/common/debugmodes.c | 2 | ||||
-rw-r--r-- | vp8/common/findnearmv.c | 23 | ||||
-rw-r--r-- | vp8/common/findnearmv.h | 56 |
4 files changed, 79 insertions, 31 deletions
diff --git a/vp8/common/blockd.h b/vp8/common/blockd.h index 51c7bfefd..330f1611c 100644 --- a/vp8/common/blockd.h +++ b/vp8/common/blockd.h @@ -167,14 +167,16 @@ typedef struct unsigned char segment_id; /* Which set of segmentation parameters should be used for this MB */ } MB_MODE_INFO; - typedef struct { MB_MODE_INFO mbmi; - B_MODE_INFO bmi[16]; + union + { + B_PREDICTION_MODE as_mode; + int_mv mv; + } bmi[16]; } MODE_INFO; - typedef struct { short *qcoeff; @@ -197,7 +199,6 @@ typedef struct int eob; B_MODE_INFO bmi; - } BLOCKD; typedef struct @@ -285,4 +286,24 @@ typedef struct extern void vp8_build_block_doffsets(MACROBLOCKD *x); extern void vp8_setup_block_dptrs(MACROBLOCKD *x); +static void update_blockd_bmi(MACROBLOCKD *xd) +{ + int i; + if (xd->mode_info_context->mbmi.mode == SPLITMV) + { + for (i = 0; i < 16; i++) + { + BLOCKD *d = &xd->block[i]; + d->bmi.mv.as_int = xd->mode_info_context->bmi[i].mv.as_int; + } + }else if (xd->mode_info_context->mbmi.mode == B_PRED) + { + for (i = 0; i < 16; i++) + { + BLOCKD *d = &xd->block[i]; + d->bmi.mode = xd->mode_info_context->bmi[i].as_mode; + } + } +} + #endif /* __INC_BLOCKD_H */ diff --git a/vp8/common/debugmodes.c b/vp8/common/debugmodes.c index 8c03480fa..46064e61d 100644 --- a/vp8/common/debugmodes.c +++ b/vp8/common/debugmodes.c @@ -97,7 +97,7 @@ void vp8_print_modes_and_motion_vectors(MODE_INFO *mi, int rows, int cols, int f bindex = (b_row & 3) * 4 + (b_col & 3); if (mi[mb_index].mbmi.mode == B_PRED) - fprintf(mvs, "%2d ", mi[mb_index].bmi[bindex].mode); + fprintf(mvs, "%2d ", mi[mb_index].bmi[bindex].as_mode); else fprintf(mvs, "xx "); diff --git a/vp8/common/findnearmv.c b/vp8/common/findnearmv.c index d5019d32a..c1022363e 100644 --- a/vp8/common/findnearmv.c +++ b/vp8/common/findnearmv.c @@ -153,26 +153,3 @@ vp8_prob *vp8_mv_ref_probs( return p; } -const B_MODE_INFO *vp8_left_bmi(const MODE_INFO *cur_mb, int b) -{ - if (!(b & 3)) - { - /* On L edge, get from MB to left of us */ - --cur_mb; - b += 4; - } - - return cur_mb->bmi + b - 1; -} - -const B_MODE_INFO *vp8_above_bmi(const MODE_INFO *cur_mb, int b, int mi_stride) -{ - if (!(b >> 2)) - { - /* On top edge, get from MB above us */ - cur_mb -= mi_stride; - b += 16; - } - - return cur_mb->bmi + b - 4; -} diff --git a/vp8/common/findnearmv.h b/vp8/common/findnearmv.h index 20a77a57a..135e60b83 100644 --- a/vp8/common/findnearmv.h +++ b/vp8/common/findnearmv.h @@ -85,10 +85,60 @@ vp8_prob *vp8_mv_ref_probs( vp8_prob p[VP8_MVREFS-1], const int near_mv_ref_ct[4] ); -const B_MODE_INFO *vp8_left_bmi(const MODE_INFO *cur_mb, int b); +extern const unsigned char vp8_mbsplit_offset[4][16]; -const B_MODE_INFO *vp8_above_bmi(const MODE_INFO *cur_mb, int b, int mi_stride); -extern const unsigned char vp8_mbsplit_offset[4][16]; +static int left_block_mv(const MODE_INFO *cur_mb, int b) +{ + if (!(b & 3)) + { + /* On L edge, get from MB to left of us */ + --cur_mb; + + if(cur_mb->mbmi.mode != SPLITMV) + return cur_mb->mbmi.mv.as_int; + b += 4; + } + + return (cur_mb->bmi + b - 1)->mv.as_int; +} + +static int above_block_mv(const MODE_INFO *cur_mb, int b, int mi_stride) +{ + if (!(b >> 2)) + { + /* On top edge, get from MB above us */ + cur_mb -= mi_stride; + + if(cur_mb->mbmi.mode != SPLITMV) + return cur_mb->mbmi.mv.as_int; + b += 16; + } + + return (cur_mb->bmi + b - 4)->mv.as_int; +} +static B_PREDICTION_MODE left_block_mode(const MODE_INFO *cur_mb, int b) +{ + if (!(b & 3)) + { + /* On L edge, get from MB to left of us */ + --cur_mb; + b += 4; + } + + return (cur_mb->bmi + b - 1)->as_mode; +} + +static B_PREDICTION_MODE above_block_mode(const MODE_INFO *cur_mb, int b, int mi_stride) +{ + if (!(b >> 2)) + { + /* On top edge, get from MB above us */ + cur_mb -= mi_stride; + b += 16; + } + + return (cur_mb->bmi + b - 4)->as_mode; +} #endif |