summaryrefslogtreecommitdiff
path: root/vp8/encoder
diff options
context:
space:
mode:
Diffstat (limited to 'vp8/encoder')
-rw-r--r--vp8/encoder/bitstream.c17
-rw-r--r--vp8/encoder/encodeframe.c20
-rw-r--r--vp8/encoder/encodeintra.c2
-rw-r--r--vp8/encoder/ethreading.c19
-rw-r--r--vp8/encoder/pickinter.c22
-rw-r--r--vp8/encoder/rdopt.c46
6 files changed, 71 insertions, 55 deletions
diff --git a/vp8/encoder/bitstream.c b/vp8/encoder/bitstream.c
index 4427dfa79..284025d4e 100644
--- a/vp8/encoder/bitstream.c
+++ b/vp8/encoder/bitstream.c
@@ -948,8 +948,7 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi)
int j = 0;
do
- write_bmode(w, m->bmi[j].mode, pc->fc.bmode_prob);
-
+ write_bmode(w, m->bmi[j].as_mode, pc->fc.bmode_prob);
while (++j < 16);
}
@@ -1016,14 +1015,16 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi)
const int *const L = vp8_mbsplits [mi->partitioning];
int k = -1; /* first block in subset j */
int mv_contz;
+ int_mv leftmv, abovemv;
+
while (j != L[++k])
if (k >= 16)
assert(0);
+ leftmv.as_int = left_block_mv(m, k);
+ abovemv.as_int = above_block_mv(m, k, mis);
+ mv_contz = vp8_mv_cont(&(leftmv.as_mv), &(abovemv.as_mv));
- mv_contz = vp8_mv_cont
- (&(vp8_left_bmi(m, k)->mv.as_mv),
- &(vp8_above_bmi(m, k, mis)->mv.as_mv));
write_sub_mv_ref(w, b->mode, vp8_sub_mv_ref_prob2 [mv_contz]); //pc->fc.sub_mv_ref_prob);
if (b->mode == NEW4X4)
@@ -1099,9 +1100,9 @@ static void write_kfmodes(VP8_COMP *cpi)
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 int bm = m->bmi[i].mode;
+ const B_PREDICTION_MODE A = above_block_mode(m, i, mis);
+ const B_PREDICTION_MODE L = left_block_mode(m, i);
+ const int bm = m->bmi[i].as_mode;
#ifdef ENTROPY_STATS
++intra_mode_stats [A] [L] [bm];
diff --git a/vp8/encoder/encodeframe.c b/vp8/encoder/encodeframe.c
index 984776fdb..672ceeca0 100644
--- a/vp8/encoder/encodeframe.c
+++ b/vp8/encoder/encodeframe.c
@@ -477,8 +477,24 @@ void encode_mb_row(VP8_COMP *cpi,
x->mb_activity_ptr++;
x->mb_norm_activity_ptr++;
- for (i = 0; i < 16; i++)
- vpx_memcpy(&xd->mode_info_context->bmi[i], &xd->block[i].bmi, sizeof(xd->block[i].bmi));
+ if(cm->frame_type != INTRA_FRAME)
+ {
+ if (xd->mode_info_context->mbmi.mode != B_PRED)
+ {
+ for (i = 0; i < 16; i++)
+ xd->mode_info_context->bmi[i].mv.as_int = xd->block[i].bmi.mv.as_int;
+ }else
+ {
+ for (i = 0; i < 16; i++)
+ xd->mode_info_context->bmi[i].as_mode = xd->block[i].bmi.mode;
+ }
+ }
+ else
+ {
+ if(xd->mode_info_context->mbmi.mode != B_PRED)
+ for (i = 0; i < 16; i++)
+ xd->mode_info_context->bmi[i].as_mode = xd->block[i].bmi.mode;
+ }
// adjust to the next column of macroblocks
x->src.y_buffer += 16;
diff --git a/vp8/encoder/encodeintra.c b/vp8/encoder/encodeintra.c
index 307064153..835c80d28 100644
--- a/vp8/encoder/encodeintra.c
+++ b/vp8/encoder/encodeintra.c
@@ -88,7 +88,6 @@ void vp8_encode_intra16x16mby(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x)
switch (x->e_mbd.mode_info_context->mbmi.mode)
{
-
case DC_PRED:
d->bmi.mode = B_DC_PRED;
break;
@@ -104,7 +103,6 @@ void vp8_encode_intra16x16mby(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x)
default:
d->bmi.mode = B_DC_PRED;
break;
-
}
}
}
diff --git a/vp8/encoder/ethreading.c b/vp8/encoder/ethreading.c
index a03ff951f..f99ce6d2f 100644
--- a/vp8/encoder/ethreading.c
+++ b/vp8/encoder/ethreading.c
@@ -234,8 +234,23 @@ THREAD_FUNCTION thread_encoding_proc(void *p_data)
x->mb_activity_ptr++;
x->mb_norm_activity_ptr++;
- for (i = 0; i < 16; i++)
- vpx_memcpy(&xd->mode_info_context->bmi[i], &xd->block[i].bmi, sizeof(xd->block[i].bmi));
+ if(cm->frame_type != INTRA_FRAME)
+ {
+ if (xd->mode_info_context->mbmi.mode != B_PRED)
+ {
+ for (i = 0; i < 16; i++)
+ xd->mode_info_context->bmi[i].mv.as_int = xd->block[i].bmi.mv.as_int;
+ }else
+ {
+ for (i = 0; i < 16; i++)
+ xd->mode_info_context->bmi[i].as_mode = xd->block[i].bmi.mode;
+ }
+ }
+ else {
+ if(xd->mode_info_context->mbmi.mode != B_PRED)
+ for (i = 0; i < 16; i++)
+ xd->mode_info_context->bmi[i].as_mode = xd->block[i].bmi.mode;
+ }
// adjust to the next column of macroblocks
x->src.y_buffer += 16;
diff --git a/vp8/encoder/pickinter.c b/vp8/encoder/pickinter.c
index b47c7b5f8..431127626 100644
--- a/vp8/encoder/pickinter.c
+++ b/vp8/encoder/pickinter.c
@@ -214,7 +214,6 @@ static int pick_intra4x4block(
*best_mode = mode;
}
}
-
b->bmi.mode = (B_PREDICTION_MODE)(*best_mode);
vp8_encode_intra4x4block(rtcd, x, ib);
return best_rd;
@@ -241,8 +240,9 @@ int vp8_pick_intra4x4mby_modes
{
MODE_INFO *const mic = xd->mode_info_context;
const int mis = xd->mode_info_stride;
- const B_PREDICTION_MODE A = vp8_above_bmi(mic, i, mis)->mode;
- const B_PREDICTION_MODE L = vp8_left_bmi(mic, i)->mode;
+ const B_PREDICTION_MODE A = above_block_mode(mic, i, mis);
+ const B_PREDICTION_MODE L = left_block_mode(mic, i);
+
B_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode);
int UNINITIALIZED_IS_SAFE(r), UNINITIALIZED_IS_SAFE(d);
@@ -250,8 +250,7 @@ int vp8_pick_intra4x4mby_modes
cost += r;
distortion += d;
-
- mic->bmi[i].mode = xd->block[i].bmi.mode = best_mode;
+ mic->bmi[i].as_mode = xd->block[i].bmi.mode = best_mode;
// Break out case where we have already exceeded best so far value
// that was passed in
@@ -272,9 +271,6 @@ int vp8_pick_intra4x4mby_modes
error = INT_MAX;
}
- for (i = 0; i < 16; i++)
- xd->block[i].bmi.mv.as_int = 0;
-
return error;
}
@@ -432,9 +428,9 @@ static void update_mvcount(VP8_COMP *cpi, MACROBLOCKD *xd, int_mv *best_ref_mv)
* therefore, only need to modify MVcount in NEWMV mode. */
if (xd->mode_info_context->mbmi.mode == NEWMV)
{
- cpi->MVcount[0][mv_max+((xd->block[0].bmi.mv.as_mv.row -
+ cpi->MVcount[0][mv_max+((xd->mode_info_context->mbmi.mv.as_mv.row -
best_ref_mv->as_mv.row) >> 1)]++;
- cpi->MVcount[1][mv_max+((xd->block[0].bmi.mv.as_mv.col -
+ cpi->MVcount[1][mv_max+((xd->mode_info_context->mbmi.mv.as_mv.col -
best_ref_mv->as_mv.col) >> 1)]++;
}
}
@@ -966,11 +962,11 @@ void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset,
// macroblock modes
vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MODE_INFO));
- if (x->e_mbd.mode_info_context->mbmi.mode == B_PRED)
+
+ if (x->e_mbd.mode_info_context->mbmi.mode <= B_PRED)
for (i = 0; i < 16; i++)
{
- vpx_memcpy(&x->e_mbd.block[i].bmi, &best_bmodes[i], sizeof(B_MODE_INFO));
-
+ x->e_mbd.block[i].bmi.mode = best_bmodes[i].mode;
}
else
{
diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c
index 5ac3e4fa7..3d535bc22 100644
--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -646,7 +646,6 @@ static int rd_pick_intra4x4block(
vpx_memcpy(best_dqcoeff, b->dqcoeff, 32);
}
}
-
b->bmi.mode = (B_PREDICTION_MODE)(*best_mode);
IDCT_INVOKE(IF_RTCD(&cpi->rtcd.common->idct), idct16)(best_dqcoeff, b->diff, 32);
@@ -688,8 +687,8 @@ int vp8_rd_pick_intra4x4mby_modes(VP8_COMP *cpi, MACROBLOCK *mb, int *Rate,
if (mb->e_mbd.frame_type == KEY_FRAME)
{
- const B_PREDICTION_MODE A = vp8_above_bmi(mic, i, mis)->mode;
- const B_PREDICTION_MODE L = vp8_left_bmi(mic, i)->mode;
+ const B_PREDICTION_MODE A = above_block_mode(mic, i, mis);
+ const B_PREDICTION_MODE L = left_block_mode(mic, i);
bmode_costs = mb->bmode_costs[A][L];
}
@@ -702,7 +701,8 @@ int vp8_rd_pick_intra4x4mby_modes(VP8_COMP *cpi, MACROBLOCK *mb, int *Rate,
cost += r;
distortion += d;
tot_rate_y += ry;
- mic->bmi[i].mode = xd->block[i].bmi.mode = best_mode;
+
+ mic->bmi[i].as_mode = best_mode;
if(total_rd >= (long long)best_rd)
break;
@@ -850,17 +850,8 @@ int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4])
void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv)
{
- int i;
-
x->e_mbd.mode_info_context->mbmi.mode = mb;
x->e_mbd.mode_info_context->mbmi.mv.as_int = mv->as_int;
-
- for (i = 0; i < 16; i++)
- {
- B_MODE_INFO *bmi = &x->e_mbd.block[i].bmi;
- bmi->mode = (B_PREDICTION_MODE) mb;
- bmi->mv.as_int = mv->as_int;
- }
}
static int labels2mode(
@@ -908,10 +899,10 @@ static int labels2mode(
thismvcost = vp8_mv_bit_cost(this_mv, best_ref_mv, mvcost, 102);
break;
case LEFT4X4:
- this_mv->as_int = col ? d[-1].bmi.mv.as_int : vp8_left_bmi(mic, i)->mv.as_int;
+ this_mv->as_int = col ? d[-1].bmi.mv.as_int : left_block_mv(mic, i);
break;
case ABOVE4X4:
- this_mv->as_int = row ? d[-4].bmi.mv.as_int : vp8_above_bmi(mic, i, mis)->mv.as_int;
+ this_mv->as_int = row ? d[-4].bmi.mv.as_int : above_block_mv(mic, i, mis);
break;
case ZERO4X4:
this_mv->as_int = 0;
@@ -923,8 +914,9 @@ static int labels2mode(
if (m == ABOVE4X4) // replace above with left if same
{
int_mv left_mv;
+
left_mv.as_int = col ? d[-1].bmi.mv.as_int :
- vp8_left_bmi(mic, i)->mv.as_int;
+ left_block_mv(mic, i);
if (left_mv.as_int == this_mv->as_int)
m = LEFT4X4;
@@ -1408,6 +1400,7 @@ static int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x,
BLOCKD *bd = &x->e_mbd.block[i];
bd->bmi.mv.as_mv = bsi.mvs[i].as_mv;
+ bd->bmi.mode = bsi.modes[i];
bd->eob = bsi.eobs[i];
}
@@ -2317,6 +2310,8 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int
if (this_mode <= B_PRED)
{
x->e_mbd.mode_info_context->mbmi.uv_mode = uv_intra_mode;
+ /* required for left and above block mv */
+ x->e_mbd.mode_info_context->mbmi.mv.as_int = 0;
}
other_cost += ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame];
@@ -2408,27 +2403,22 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int
return;
}
-
- if(best_mbmode.mode <= B_PRED)
- {
- int i;
- for (i = 0; i < 16; i++)
- {
- best_bmodes[i].mv.as_int = 0;
- }
- }
-
// macroblock modes
vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MODE_INFO));
- for (i = 0; i < 16; i++)
+ if (best_mbmode.mode == B_PRED)
{
- vpx_memcpy(&x->e_mbd.block[i].bmi, &best_bmodes[i], sizeof(B_MODE_INFO));
+ for (i = 0; i < 16; i++)
+ x->e_mbd.block[i].bmi.mode = best_bmodes[i].mode;
}
if (best_mbmode.mode == SPLITMV)
{
+ for (i = 0; i < 16; i++)
+ x->e_mbd.block[i].bmi.mv.as_int = best_bmodes[i].mv.as_int;
+
vpx_memcpy(x->partition_info, &best_partition, sizeof(PARTITION_INFO));
+
x->e_mbd.mode_info_context->mbmi.mv.as_int =
x->partition_info->bmi[15].mv.as_int;
}