summaryrefslogtreecommitdiff
path: root/vp9/encoder/vp9_encodeframe.c
diff options
context:
space:
mode:
Diffstat (limited to 'vp9/encoder/vp9_encodeframe.c')
-rw-r--r--vp9/encoder/vp9_encodeframe.c263
1 files changed, 208 insertions, 55 deletions
diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c
index a4dbdc5a8..f2be96dd7 100644
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -630,10 +630,6 @@ static void set_offsets(VP9_COMP *cpi,
const int idx_map = mb_row * cm->mb_cols + mb_col;
const int idx_str = xd->mode_info_stride * mb_row + mb_col;
-#ifdef ENC_DEBUG
- enc_debug = (cpi->common.current_video_frame == 2 &&
- mb_row == 4 && mb_col == 5);
-#endif
// entropy context structures
xd->above_context = cm->above_context + mb_col;
xd->left_context = cm->left_context + (mb_row & 3);
@@ -668,15 +664,8 @@ static void set_offsets(VP9_COMP *cpi,
// Set up distance of MB to edge of frame in 1/8th pel units
block_size >>= 4; // in macroblock units
assert(!(mb_col & (block_size - 1)) && !(mb_row & (block_size - 1)));
- xd->mb_to_top_edge = -((mb_row * 16) << 3);
- xd->mb_to_left_edge = -((mb_col * 16) << 3);
- xd->mb_to_bottom_edge = ((cm->mb_rows - block_size - mb_row) * 16) << 3;
- xd->mb_to_right_edge = ((cm->mb_cols - block_size - mb_col) * 16) << 3;
-
- // Are edges available for intra prediction?
- xd->up_available = (mb_row != 0);
- xd->left_available = (mb_col > cm->cur_tile_mb_col_start);
- xd->right_available = (mb_col + block_size < cm->cur_tile_mb_col_end);
+ set_mb_row(cm, xd, mb_row, block_size);
+ set_mb_col(cm, xd, mb_col, block_size);
/* set up source buffers */
setup_pred_block(&x->src, cpi->Source, mb_row, mb_col, NULL, NULL);
@@ -891,7 +880,7 @@ static void pick_sb64_modes(VP9_COMP *cpi,
}
}
-static void update_stats(VP9_COMP *cpi) {
+static void update_stats(VP9_COMP *cpi, int mb_row, int mb_col) {
VP9_COMMON *const cm = &cpi->common;
MACROBLOCK *const x = &cpi->mb;
MACROBLOCKD *const xd = &x->e_mbd;
@@ -945,6 +934,9 @@ static void update_stats(VP9_COMP *cpi) {
if ((mbmi->mode == ZEROMV) && (mbmi->ref_frame == LAST_FRAME))
cpi->inter_zz_count++;
}
+#if CONFIG_CODE_NONZEROCOUNT
+ vp9_update_nzc_counts(&cpi->common, xd, mb_row, mb_col);
+#endif
}
static void encode_sb(VP9_COMP *cpi,
@@ -963,8 +955,9 @@ static void encode_sb(VP9_COMP *cpi,
encode_superblock32(cpi, tp,
output_enabled, mb_row, mb_col);
- if (output_enabled)
- update_stats(cpi);
+ if (output_enabled) {
+ update_stats(cpi, mb_row, mb_col);
+ }
if (output_enabled) {
(*tp)->Token = EOSB_TOKEN;
@@ -992,12 +985,13 @@ static void encode_sb(VP9_COMP *cpi,
encode_macroblock(cpi, tp,
output_enabled, mb_row + y_idx, mb_col + x_idx);
- if (output_enabled)
- update_stats(cpi);
+ if (output_enabled) {
+ update_stats(cpi, mb_row + y_idx, mb_col + x_idx);
+ }
if (output_enabled) {
(*tp)->Token = EOSB_TOKEN;
- (*tp)++;
+ (*tp)++;
if (mb_row + y_idx < cm->mb_rows)
cpi->tplist[mb_row + y_idx].stop = *tp;
}
@@ -1029,7 +1023,7 @@ static void encode_sb64(VP9_COMP *cpi,
update_state(cpi, &x->sb64_context, 64, 1);
encode_superblock64(cpi, tp,
1, mb_row, mb_col);
- update_stats(cpi);
+ update_stats(cpi, mb_row, mb_col);
(*tp)->Token = EOSB_TOKEN;
(*tp)++;
@@ -1286,6 +1280,12 @@ static void encode_frame_internal(VP9_COMP *cpi) {
vp9_zero(cpi->coef_counts_8x8);
vp9_zero(cpi->coef_counts_16x16);
vp9_zero(cpi->coef_counts_32x32);
+#if CONFIG_CODE_NONZEROCOUNT
+ vp9_zero(cm->fc.nzc_counts_4x4);
+ vp9_zero(cm->fc.nzc_counts_8x8);
+ vp9_zero(cm->fc.nzc_counts_16x16);
+ vp9_zero(cm->fc.nzc_counts_32x32);
+#endif
#if CONFIG_NEW_MVREF
vp9_zero(cpi->mb_mv_ref_count);
#endif
@@ -1327,30 +1327,34 @@ static void encode_frame_internal(VP9_COMP *cpi) {
{
// Take tiles into account and give start/end MB
- int tile_col;
+ int tile_col, tile_row;
TOKENEXTRA *tp = cpi->tok;
- for (tile_col = 0; tile_col < cm->tile_columns; tile_col++) {
- TOKENEXTRA *tp_old = tp;
- // For each row of SBs in the frame
- vp9_get_tile_col_offsets(cm, tile_col);
- for (mb_row = 0; mb_row < cm->mb_rows; mb_row += 4) {
- encode_sb_row(cpi, mb_row, &tp, &totalrate);
+ for (tile_row = 0; tile_row < cm->tile_rows; tile_row++) {
+ vp9_get_tile_row_offsets(cm, tile_row);
+
+ for (tile_col = 0; tile_col < cm->tile_columns; tile_col++) {
+ TOKENEXTRA *tp_old = tp;
+
+ // For each row of SBs in the frame
+ vp9_get_tile_col_offsets(cm, tile_col);
+ for (mb_row = cm->cur_tile_mb_row_start;
+ mb_row < cm->cur_tile_mb_row_end; mb_row += 4) {
+ encode_sb_row(cpi, mb_row, &tp, &totalrate);
+ }
+ cpi->tok_count[tile_col] = (unsigned int)(tp - tp_old);
}
- cpi->tok_count[tile_col] = (unsigned int)(tp - tp_old);
}
}
vpx_usec_timer_mark(&emr_timer);
cpi->time_encode_mb_row += vpx_usec_timer_elapsed(&emr_timer);
-
}
// 256 rate units to the bit,
// projected_frame_size in units of BYTES
cpi->projected_frame_size = totalrate >> 8;
-
#if 0
// Keep record of the total distortion this time around for future use
cpi->last_frame_distortion = cpi->frame_distortion;
@@ -1930,6 +1934,135 @@ static void update_sb64_skip_coeff_state(VP9_COMP *cpi,
}
}
+#if CONFIG_CODE_NONZEROCOUNT
+static void gather_nzcs_mb16(VP9_COMMON *const cm,
+ MACROBLOCKD *xd) {
+ int i;
+ vpx_memset(xd->mode_info_context->mbmi.nzcs, 0,
+ 384 * sizeof(xd->mode_info_context->mbmi.nzcs[0]));
+ switch (xd->mode_info_context->mbmi.txfm_size) {
+ case TX_4X4:
+ for (i = 0; i < 24; ++i) {
+ xd->mode_info_context->mbmi.nzcs[i] = xd->nzcs[i];
+ }
+ break;
+
+ case TX_8X8:
+ for (i = 0; i < 16; i += 4) {
+ xd->mode_info_context->mbmi.nzcs[i] = xd->nzcs[i];
+ }
+ if (xd->mode_info_context->mbmi.mode == I8X8_PRED ||
+ xd->mode_info_context->mbmi.mode == SPLITMV) {
+ for (i = 16; i < 24; ++i) {
+ xd->mode_info_context->mbmi.nzcs[i] = xd->nzcs[i];
+ }
+ } else {
+ for (i = 16; i < 24; i += 4) {
+ xd->mode_info_context->mbmi.nzcs[i] = xd->nzcs[i];
+ }
+ }
+ break;
+
+ case TX_16X16:
+ xd->mode_info_context->mbmi.nzcs[0] = xd->nzcs[0];
+ for (i = 16; i < 24; i += 4) {
+ xd->mode_info_context->mbmi.nzcs[i] = xd->nzcs[i];
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void gather_nzcs_sb32(VP9_COMMON *const cm,
+ MACROBLOCKD *xd) {
+ int i, j;
+ MODE_INFO *m = xd->mode_info_context;
+ int mis = cm->mode_info_stride;
+ vpx_memset(m->mbmi.nzcs, 0,
+ 384 * sizeof(xd->mode_info_context->mbmi.nzcs[0]));
+ switch (xd->mode_info_context->mbmi.txfm_size) {
+ case TX_4X4:
+ for (i = 0; i < 96; ++i) {
+ xd->mode_info_context->mbmi.nzcs[i] = xd->nzcs[i];
+ }
+ break;
+
+ case TX_8X8:
+ for (i = 0; i < 96; i += 4) {
+ xd->mode_info_context->mbmi.nzcs[i] = xd->nzcs[i];
+ }
+ break;
+
+ case TX_16X16:
+ for (i = 0; i < 96; i += 16) {
+ xd->mode_info_context->mbmi.nzcs[i] = xd->nzcs[i];
+ }
+ break;
+
+ case TX_32X32:
+ xd->mode_info_context->mbmi.nzcs[0] = xd->nzcs[0];
+ for (i = 64; i < 96; i += 16) {
+ xd->mode_info_context->mbmi.nzcs[i] = xd->nzcs[i];
+ }
+ break;
+
+ default:
+ break;
+ }
+ for (i = 0; i < 2; ++i)
+ for (j = 0; j < 2; ++j) {
+ if (i == 0 && j == 0) continue;
+ vpx_memcpy((m + j + mis * i)->mbmi.nzcs, m->mbmi.nzcs,
+ 384 * sizeof(m->mbmi.nzcs[0]));
+ }
+}
+
+static void gather_nzcs_sb64(VP9_COMMON *const cm,
+ MACROBLOCKD *xd) {
+ int i, j;
+ MODE_INFO *m = xd->mode_info_context;
+ int mis = cm->mode_info_stride;
+ vpx_memset(xd->mode_info_context->mbmi.nzcs, 0,
+ 384 * sizeof(xd->mode_info_context->mbmi.nzcs[0]));
+ switch (xd->mode_info_context->mbmi.txfm_size) {
+ case TX_4X4:
+ for (i = 0; i < 384; ++i) {
+ xd->mode_info_context->mbmi.nzcs[i] = xd->nzcs[i];
+ }
+ break;
+
+ case TX_8X8:
+ for (i = 0; i < 384; i += 4) {
+ xd->mode_info_context->mbmi.nzcs[i] = xd->nzcs[i];
+ }
+ break;
+
+ case TX_16X16:
+ for (i = 0; i < 384; i += 16) {
+ xd->mode_info_context->mbmi.nzcs[i] = xd->nzcs[i];
+ }
+ break;
+
+ case TX_32X32:
+ for (i = 0; i < 384; i += 64) {
+ xd->mode_info_context->mbmi.nzcs[i] = xd->nzcs[i];
+ }
+ break;
+
+ default:
+ break;
+ }
+ for (i = 0; i < 4; ++i)
+ for (j = 0; j < 4; ++j) {
+ if (i == 0 && j == 0) continue;
+ vpx_memcpy((m + j + mis * i)->mbmi.nzcs, m->mbmi.nzcs,
+ 384 * sizeof(m->mbmi.nzcs[0]));
+ }
+}
+#endif
+
static void encode_macroblock(VP9_COMP *cpi, TOKENEXTRA **t,
int output_enabled,
int mb_row, int mb_col) {
@@ -1944,8 +2077,8 @@ static void encode_macroblock(VP9_COMP *cpi, TOKENEXTRA **t,
assert(!xd->mode_info_context->mbmi.sb_type);
#ifdef ENC_DEBUG
- enc_debug = (cpi->common.current_video_frame == 2 &&
- mb_row == 5 && mb_col == 18);
+ enc_debug = (cpi->common.current_video_frame == 1 &&
+ mb_row == 0 && mb_col == 0 && output_enabled);
if (enc_debug)
printf("Encode MB %d %d output %d\n", mb_row, mb_col, output_enabled);
#endif
@@ -1997,14 +2130,14 @@ static void encode_macroblock(VP9_COMP *cpi, TOKENEXTRA **t,
}
#endif
if (mbmi->mode == B_PRED) {
- vp9_encode_intra16x16mbuv(x);
+ vp9_encode_intra16x16mbuv(cm, x);
vp9_encode_intra4x4mby(x);
} else if (mbmi->mode == I8X8_PRED) {
vp9_encode_intra8x8mby(x);
vp9_encode_intra8x8mbuv(x);
} else {
- vp9_encode_intra16x16mbuv(x);
- vp9_encode_intra16x16mby(x);
+ vp9_encode_intra16x16mbuv(cm, x);
+ vp9_encode_intra16x16mby(cm, x);
}
if (output_enabled)
@@ -2051,7 +2184,7 @@ static void encode_macroblock(VP9_COMP *cpi, TOKENEXTRA **t,
}
if (!x->skip) {
- vp9_encode_inter16x16(x, mb_row, mb_col);
+ vp9_encode_inter16x16(cm, x, mb_row, mb_col);
// Clear mb_skip_coeff if mb_no_coeff_skip is not set
if (!cpi->common.mb_no_coeff_skip)
@@ -2079,12 +2212,12 @@ static void encode_macroblock(VP9_COMP *cpi, TOKENEXTRA **t,
}
if (!x->skip) {
-#if 0 // def ENC_DEBUG
+#ifdef ENC_DEBUG
if (enc_debug) {
int i, j;
printf("\n");
printf("qcoeff\n");
- for (i = 0; i < 400; i++) {
+ for (i = 0; i < 384; i++) {
printf("%3d ", xd->qcoeff[i]);
if (i % 16 == 15) printf("\n");
}
@@ -2131,6 +2264,9 @@ static void encode_macroblock(VP9_COMP *cpi, TOKENEXTRA **t,
}
#endif
+#if CONFIG_CODE_NONZEROCOUNT
+ gather_nzcs_mb16(cm, xd);
+#endif
vp9_tokenize_mb(cpi, xd, t, !output_enabled);
} else {
@@ -2197,6 +2333,12 @@ static void encode_superblock32(VP9_COMP *cpi, TOKENEXTRA **t,
unsigned int segment_id = mi->mbmi.segment_id;
const int mis = cm->mode_info_stride;
+#ifdef ENC_DEBUG
+ enc_debug = (cpi->common.current_video_frame == 1 &&
+ mb_row == 0 && mb_col == 0 && output_enabled);
+ if (enc_debug)
+ printf("Encode SB32 %d %d output %d\n", mb_row, mb_col, output_enabled);
+#endif
if (cm->frame_type == KEY_FRAME) {
if (cpi->oxcf.tuning == VP8_TUNE_SSIM) {
adjust_act_zbin(cpi, x);
@@ -2294,8 +2436,8 @@ static void encode_superblock32(VP9_COMP *cpi, TOKENEXTRA **t,
vp9_quantize_sby_32x32(x);
vp9_quantize_sbuv_16x16(x);
if (x->optimize) {
- vp9_optimize_sby_32x32(x);
- vp9_optimize_sbuv_16x16(x);
+ vp9_optimize_sby_32x32(cm, x);
+ vp9_optimize_sbuv_16x16(cm, x);
}
vp9_inverse_transform_sby_32x32(xd);
vp9_inverse_transform_sbuv_16x16(xd);
@@ -2306,8 +2448,8 @@ static void encode_superblock32(VP9_COMP *cpi, TOKENEXTRA **t,
vp9_quantize_sby_16x16(x);
vp9_quantize_sbuv_16x16(x);
if (x->optimize) {
- vp9_optimize_sby_16x16(x);
- vp9_optimize_sbuv_16x16(x);
+ vp9_optimize_sby_16x16(cm, x);
+ vp9_optimize_sbuv_16x16(cm, x);
}
vp9_inverse_transform_sby_16x16(xd);
vp9_inverse_transform_sbuv_16x16(xd);
@@ -2318,8 +2460,8 @@ static void encode_superblock32(VP9_COMP *cpi, TOKENEXTRA **t,
vp9_quantize_sby_8x8(x);
vp9_quantize_sbuv_8x8(x);
if (x->optimize) {
- vp9_optimize_sby_8x8(x);
- vp9_optimize_sbuv_8x8(x);
+ vp9_optimize_sby_8x8(cm, x);
+ vp9_optimize_sbuv_8x8(cm, x);
}
vp9_inverse_transform_sby_8x8(xd);
vp9_inverse_transform_sbuv_8x8(xd);
@@ -2330,8 +2472,8 @@ static void encode_superblock32(VP9_COMP *cpi, TOKENEXTRA **t,
vp9_quantize_sby_4x4(x);
vp9_quantize_sbuv_4x4(x);
if (x->optimize) {
- vp9_optimize_sby_4x4(x);
- vp9_optimize_sbuv_4x4(x);
+ vp9_optimize_sby_4x4(cm, x);
+ vp9_optimize_sbuv_4x4(cm, x);
}
vp9_inverse_transform_sby_4x4(xd);
vp9_inverse_transform_sbuv_4x4(xd);
@@ -2340,6 +2482,9 @@ static void encode_superblock32(VP9_COMP *cpi, TOKENEXTRA **t,
}
vp9_recon_sby_s_c(xd, dst);
vp9_recon_sbuv_s_c(xd, udst, vdst);
+#if CONFIG_CODE_NONZEROCOUNT
+ gather_nzcs_sb32(cm, xd);
+#endif
vp9_tokenize_sb(cpi, xd, t, !output_enabled);
} else {
@@ -2407,6 +2552,12 @@ static void encode_superblock64(VP9_COMP *cpi, TOKENEXTRA **t,
unsigned int segment_id = mi->mbmi.segment_id;
const int mis = cm->mode_info_stride;
+#ifdef ENC_DEBUG
+ enc_debug = (cpi->common.current_video_frame == 1 &&
+ mb_row == 0 && mb_col == 0 && output_enabled);
+ if (enc_debug)
+ printf("Encode SB64 %d %d output %d\n", mb_row, mb_col, output_enabled);
+#endif
if (cm->frame_type == KEY_FRAME) {
if (cpi->oxcf.tuning == VP8_TUNE_SSIM) {
adjust_act_zbin(cpi, x);
@@ -2502,8 +2653,8 @@ static void encode_superblock64(VP9_COMP *cpi, TOKENEXTRA **t,
vp9_quantize_sb64y_32x32(x);
vp9_quantize_sb64uv_32x32(x);
if (x->optimize) {
- vp9_optimize_sb64y_32x32(x);
- vp9_optimize_sb64uv_32x32(x);
+ vp9_optimize_sb64y_32x32(cm, x);
+ vp9_optimize_sb64uv_32x32(cm, x);
}
vp9_inverse_transform_sb64y_32x32(xd);
vp9_inverse_transform_sb64uv_32x32(xd);
@@ -2514,8 +2665,8 @@ static void encode_superblock64(VP9_COMP *cpi, TOKENEXTRA **t,
vp9_quantize_sb64y_16x16(x);
vp9_quantize_sb64uv_16x16(x);
if (x->optimize) {
- vp9_optimize_sb64y_16x16(x);
- vp9_optimize_sb64uv_16x16(x);
+ vp9_optimize_sb64y_16x16(cm, x);
+ vp9_optimize_sb64uv_16x16(cm, x);
}
vp9_inverse_transform_sb64y_16x16(xd);
vp9_inverse_transform_sb64uv_16x16(xd);
@@ -2526,8 +2677,8 @@ static void encode_superblock64(VP9_COMP *cpi, TOKENEXTRA **t,
vp9_quantize_sb64y_8x8(x);
vp9_quantize_sb64uv_8x8(x);
if (x->optimize) {
- vp9_optimize_sb64y_8x8(x);
- vp9_optimize_sb64uv_8x8(x);
+ vp9_optimize_sb64y_8x8(cm, x);
+ vp9_optimize_sb64uv_8x8(cm, x);
}
vp9_inverse_transform_sb64y_8x8(xd);
vp9_inverse_transform_sb64uv_8x8(xd);
@@ -2538,8 +2689,8 @@ static void encode_superblock64(VP9_COMP *cpi, TOKENEXTRA **t,
vp9_quantize_sb64y_4x4(x);
vp9_quantize_sb64uv_4x4(x);
if (x->optimize) {
- vp9_optimize_sb64y_4x4(x);
- vp9_optimize_sb64uv_4x4(x);
+ vp9_optimize_sb64y_4x4(cm, x);
+ vp9_optimize_sb64uv_4x4(cm, x);
}
vp9_inverse_transform_sb64y_4x4(xd);
vp9_inverse_transform_sb64uv_4x4(xd);
@@ -2548,7 +2699,9 @@ static void encode_superblock64(VP9_COMP *cpi, TOKENEXTRA **t,
}
vp9_recon_sb64y_s_c(xd, dst);
vp9_recon_sb64uv_s_c(&x->e_mbd, udst, vdst);
-
+#if CONFIG_CODE_NONZEROCOUNT
+ gather_nzcs_sb64(cm, &x->e_mbd);
+#endif
vp9_tokenize_sb64(cpi, &x->e_mbd, t, !output_enabled);
} else {
// FIXME(rbultje): not tile-aware (mi - 1)