summaryrefslogtreecommitdiff
path: root/vp8
diff options
context:
space:
mode:
Diffstat (limited to 'vp8')
-rw-r--r--vp8/common/blockd.c2
-rw-r--r--vp8/common/blockd.h12
-rw-r--r--vp8/encoder/encodemb.c30
-rw-r--r--vp8/encoder/firstpass.c8
-rw-r--r--vp8/encoder/rdopt.c81
5 files changed, 46 insertions, 87 deletions
diff --git a/vp8/common/blockd.c b/vp8/common/blockd.c
index 7f75a72c5..1fc3cd0ca 100644
--- a/vp8/common/blockd.c
+++ b/vp8/common/blockd.c
@@ -12,8 +12,6 @@
#include "blockd.h"
#include "vpx_mem/vpx_mem.h"
-const int vp8_block2type[25] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 1};
-
const unsigned char vp8_block2left[25] =
{
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8
diff --git a/vp8/common/blockd.h b/vp8/common/blockd.h
index 5a8991e65..fc8e0722c 100644
--- a/vp8/common/blockd.h
+++ b/vp8/common/blockd.h
@@ -28,11 +28,6 @@ void vpx_log(const char *format, ...);
#define DCPREDSIMTHRESH 0
#define DCPREDCNTTHRESH 3
-#define Y1CONTEXT 0
-#define UCONTEXT 1
-#define VCONTEXT 2
-#define Y2CONTEXT 3
-
#define MB_FEATURE_TREE_PROBS 3
#define MAX_MB_SEGMENTS 4
@@ -48,6 +43,11 @@ typedef struct
int r, c;
} POS;
+#define PLANE_TYPE_Y_NO_DC 0
+#define PLANE_TYPE_Y2 1
+#define PLANE_TYPE_UV 2
+#define PLANE_TYPE_Y_WITH_DC 3
+
typedef char ENTROPY_CONTEXT;
typedef struct
@@ -58,8 +58,6 @@ typedef struct
ENTROPY_CONTEXT y2;
} ENTROPY_CONTEXT_PLANES;
-extern const int vp8_block2type[25];
-
extern const unsigned char vp8_block2left[25];
extern const unsigned char vp8_block2above[25];
diff --git a/vp8/encoder/encodemb.c b/vp8/encoder/encodemb.c
index f75b25858..3cd10ce5d 100644
--- a/vp8/encoder/encodemb.c
+++ b/vp8/encoder/encodemb.c
@@ -522,7 +522,7 @@ void vp8_optimize_mb(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd)
has_2nd_order = (x->e_mbd.mode_info_context->mbmi.mode != B_PRED
&& x->e_mbd.mode_info_context->mbmi.mode != SPLITMV);
- type = has_2nd_order ? 0 : 3;
+ type = has_2nd_order ? PLANE_TYPE_Y_NO_DC : PLANE_TYPE_Y_WITH_DC;
for (b = 0; b < 16; b++)
{
@@ -530,23 +530,16 @@ void vp8_optimize_mb(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd)
ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd);
}
- for (b = 16; b < 20; b++)
+ for (b = 16; b < 24; b++)
{
- vp8_optimize_b(x, b, vp8_block2type[b],
+ vp8_optimize_b(x, b, PLANE_TYPE_UV,
ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd);
}
- for (b = 20; b < 24; b++)
- {
- vp8_optimize_b(x, b, vp8_block2type[b],
- ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd);
- }
-
-
if (has_2nd_order)
{
b=24;
- vp8_optimize_b(x, b, vp8_block2type[b],
+ vp8_optimize_b(x, b, PLANE_TYPE_Y2,
ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd);
}
}
@@ -576,7 +569,7 @@ void vp8_optimize_mby(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd)
has_2nd_order = (x->e_mbd.mode_info_context->mbmi.mode != B_PRED
&& x->e_mbd.mode_info_context->mbmi.mode != SPLITMV);
- type = has_2nd_order ? 0 : 3;
+ type = has_2nd_order ? PLANE_TYPE_Y_NO_DC : PLANE_TYPE_Y_WITH_DC;
for (b = 0; b < 16; b++)
{
@@ -588,7 +581,7 @@ void vp8_optimize_mby(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd)
if (has_2nd_order)
{
b=24;
- vp8_optimize_b(x, b, vp8_block2type[b],
+ vp8_optimize_b(x, b, PLANE_TYPE_Y2,
ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd);
}
}
@@ -612,18 +605,11 @@ void vp8_optimize_mbuv(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd)
ta = (ENTROPY_CONTEXT *)&t_above;
tl = (ENTROPY_CONTEXT *)&t_left;
- for (b = 16; b < 20; b++)
+ for (b = 16; b < 24; b++)
{
- vp8_optimize_b(x, b, vp8_block2type[b],
+ vp8_optimize_b(x, b, PLANE_TYPE_UV,
ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd);
}
-
- for (b = 20; b < 24; b++)
- {
- vp8_optimize_b(x, b, vp8_block2type[b],
- ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd);
- }
-
}
#endif
diff --git a/vp8/encoder/firstpass.c b/vp8/encoder/firstpass.c
index eec239afb..0fe85494d 100644
--- a/vp8/encoder/firstpass.c
+++ b/vp8/encoder/firstpass.c
@@ -560,8 +560,8 @@ void vp8_first_pass(VP8_COMP *cpi)
YV12_BUFFER_CONFIG *gld_yv12 = &cm->yv12_fb[cm->gld_fb_idx];
int recon_y_stride = lst_yv12->y_stride;
int recon_uv_stride = lst_yv12->uv_stride;
- int intra_error = 0;
- int coded_error = 0;
+ long long intra_error = 0;
+ long long coded_error = 0;
int sum_mvr = 0, sum_mvc = 0;
int sum_mvr_abs = 0, sum_mvc_abs = 0;
@@ -648,7 +648,7 @@ void vp8_first_pass(VP8_COMP *cpi)
this_error += intrapenalty;
// Cumulative intra error total
- intra_error += this_error;
+ intra_error += (long long)this_error;
// Indicate default assumption of intra in the motion map
*fp_motion_map_ptr = 0;
@@ -800,7 +800,7 @@ void vp8_first_pass(VP8_COMP *cpi)
}
}
- coded_error += this_error;
+ coded_error += (long long)this_error;
// adjust to the next column of macroblocks
x->src.y_buffer += 16;
diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c
index cf5b5ccc6..3db05155c 100644
--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -590,10 +590,10 @@ static int vp8_rdcost_mby(MACROBLOCK *mb)
tl = (ENTROPY_CONTEXT *)&t_left;
for (b = 0; b < 16; b++)
- cost += cost_coeffs(mb, x->block + b, 0,
+ cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_Y_NO_DC,
ta + vp8_block2above[b], tl + vp8_block2left[b]);
- cost += cost_coeffs(mb, x->block + 24, 1,
+ cost += cost_coeffs(mb, x->block + 24, PLANE_TYPE_Y2,
ta + vp8_block2above[24], tl + vp8_block2left[24]);
return cost;
@@ -645,33 +645,14 @@ static void macro_block_yrd( MACROBLOCK *mb,
*Rate = vp8_rdcost_mby(mb);
}
-static void save_predictor(unsigned char *predictor, unsigned char *dst)
+static void copy_predictor(unsigned char *dst, const unsigned char *predictor)
{
- int r, c;
- for (r = 0; r < 4; r++)
- {
- for (c = 0; c < 4; c++)
- {
- *dst = predictor[c];
- dst++;
- }
-
- predictor += 16;
- }
-}
-static void restore_predictor(unsigned char *predictor, unsigned char *dst)
-{
- int r, c;
- for (r = 0; r < 4; r++)
- {
- for (c = 0; c < 4; c++)
- {
- predictor[c] = *dst;
- dst++;
- }
-
- predictor += 16;
- }
+ const unsigned int *p = (const unsigned int *)predictor;
+ unsigned int *d = (unsigned int *)dst;
+ d[0] = p[0];
+ d[4] = p[4];
+ d[8] = p[8];
+ d[12] = p[12];
}
static int rd_pick_intra4x4block(
VP8_COMP *cpi,
@@ -694,9 +675,13 @@ static int rd_pick_intra4x4block(
ENTROPY_CONTEXT ta = *a, tempa = *a;
ENTROPY_CONTEXT tl = *l, templ = *l;
-
- DECLARE_ALIGNED_ARRAY(16, unsigned char, predictor, 16);
- DECLARE_ALIGNED_ARRAY(16, short, dqcoeff, 16);
+ /*
+ * The predictor buffer is a 2d buffer with a stride of 16. Create
+ * a temp buffer that meets the stride requirements, but we are only
+ * interested in the left 4x4 block
+ * */
+ DECLARE_ALIGNED_ARRAY(16, unsigned char, best_predictor, 16*4);
+ DECLARE_ALIGNED_ARRAY(16, short, best_dqcoeff, 16);
for (mode = B_DC_PRED; mode <= B_HU_PRED; mode++)
{
@@ -713,7 +698,7 @@ static int rd_pick_intra4x4block(
tempa = ta;
templ = tl;
- ratey = cost_coeffs(x, b, 3, &tempa, &templ);
+ ratey = cost_coeffs(x, b, PLANE_TYPE_Y_WITH_DC, &tempa, &templ);
rate += ratey;
distortion = ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), berr)(be->coeff, b->dqcoeff) >> 2;
@@ -728,21 +713,17 @@ static int rd_pick_intra4x4block(
*best_mode = mode;
*a = tempa;
*l = templ;
- save_predictor(b->predictor, predictor);
- vpx_memcpy(dqcoeff, b->dqcoeff, 32);
+ copy_predictor(best_predictor, b->predictor);
+ vpx_memcpy(best_dqcoeff, b->dqcoeff, 32);
}
}
b->bmi.mode = (B_PREDICTION_MODE)(*best_mode);
- restore_predictor(b->predictor, predictor);
- vpx_memcpy(b->dqcoeff, dqcoeff, 32);
-
- IDCT_INVOKE(IF_RTCD(&cpi->rtcd.common->idct), idct16)(b->dqcoeff, b->diff, 32);
- RECON_INVOKE(IF_RTCD(&cpi->rtcd.common->recon), recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
+ IDCT_INVOKE(IF_RTCD(&cpi->rtcd.common->idct), idct16)(best_dqcoeff, b->diff, 32);
+ RECON_INVOKE(IF_RTCD(&cpi->rtcd.common->recon), recon)(best_predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
return best_rd;
-
}
int vp8_rd_pick_intra4x4mby_modes(VP8_COMP *cpi, MACROBLOCK *mb, int *Rate,
@@ -753,7 +734,7 @@ int vp8_rd_pick_intra4x4mby_modes(VP8_COMP *cpi, MACROBLOCK *mb, int *Rate,
int cost = mb->mbmode_cost [xd->frame_type] [B_PRED];
int distortion = 0;
int tot_rate_y = 0;
- int total_rd = 0;
+ long long total_rd = 0;
ENTROPY_CONTEXT_PLANES t_above, t_left;
ENTROPY_CONTEXT *ta;
ENTROPY_CONTEXT *tl;
@@ -794,12 +775,12 @@ int vp8_rd_pick_intra4x4mby_modes(VP8_COMP *cpi, MACROBLOCK *mb, int *Rate,
tot_rate_y += ry;
mic->bmi[i].mode = xd->block[i].bmi.mode = best_mode;
- if(total_rd >= best_rd)
- break;
+ if(total_rd >= (long long)best_rd)
+ break;
}
- if(total_rd >= best_rd)
- return INT_MAX;
+ if(total_rd >= (long long)best_rd)
+ return INT_MAX;
*Rate = cost;
*rate_y += tot_rate_y;
@@ -862,12 +843,8 @@ static int rd_cost_mbuv(MACROBLOCK *mb)
ta = (ENTROPY_CONTEXT *)&t_above;
tl = (ENTROPY_CONTEXT *)&t_left;
- for (b = 16; b < 20; b++)
- cost += cost_coeffs(mb, x->block + b, vp8_block2type[b],
- ta + vp8_block2above[b], tl + vp8_block2left[b]);
-
- for (b = 20; b < 24; b++)
- cost += cost_coeffs(mb, x->block + b, vp8_block2type[b],
+ for (b = 16; b < 24; b++)
+ cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_UV,
ta + vp8_block2above[b], tl + vp8_block2left[b]);
return cost;
@@ -1048,7 +1025,7 @@ static int rdcost_mbsegment_y(MACROBLOCK *mb, const int *labels,
for (b = 0; b < 16; b++)
if (labels[ b] == which_label)
- cost += cost_coeffs(mb, x->block + b, 3,
+ cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_Y_WITH_DC,
ta + vp8_block2above[b],
tl + vp8_block2left[b]);