summaryrefslogtreecommitdiff
path: root/vp9/encoder
diff options
context:
space:
mode:
authorYunqing Wang <yunqingwang@google.com>2017-02-22 16:55:03 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2017-02-22 16:55:04 +0000
commit66f36f473563042f1fd8eadaf7610739328f34af (patch)
treec7d062d8291398ed8c7ee0278074091cb7233ecd /vp9/encoder
parentb1dcaf7f1e17af1697dd842521cb1fecf330f221 (diff)
parent97d6a4cbd1d89224fcb2c4045a8adefa9c75bfe0 (diff)
downloadlibvpx-66f36f473563042f1fd8eadaf7610739328f34af.tar
libvpx-66f36f473563042f1fd8eadaf7610739328f34af.tar.gz
libvpx-66f36f473563042f1fd8eadaf7610739328f34af.tar.bz2
libvpx-66f36f473563042f1fd8eadaf7610739328f34af.zip
Merge "Refactored the row based multi-threading code"
Diffstat (limited to 'vp9/encoder')
-rw-r--r--vp9/encoder/vp9_encoder.c11
-rw-r--r--vp9/encoder/vp9_firstpass.c79
-rw-r--r--vp9/encoder/vp9_firstpass.h5
3 files changed, 43 insertions, 52 deletions
diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c
index d624d04fd..aa8a27c6d 100644
--- a/vp9/encoder/vp9_encoder.c
+++ b/vp9/encoder/vp9_encoder.c
@@ -1732,12 +1732,6 @@ VP9_COMP *vp9_create_compressor(VP9EncoderConfig *oxcf,
}
#endif
-#if ENABLE_MT_BIT_MATCH
- CHECK_MEM_ERROR(
- cm, cpi->twopass.fp_mb_float_stats,
- vpx_calloc(cm->MBs * sizeof(*cpi->twopass.fp_mb_float_stats), 1));
-#endif
-
cpi->refresh_alt_ref_frame = 0;
cpi->multi_arf_last_grp_enabled = 0;
@@ -2118,11 +2112,6 @@ void vp9_remove_compressor(VP9_COMP *cpi) {
}
#endif
-#if ENABLE_MT_BIT_MATCH
- vpx_free(cpi->twopass.fp_mb_float_stats);
- cpi->twopass.fp_mb_float_stats = NULL;
-#endif
-
vp9_remove_common(cm);
vp9_free_ref_frame_buffers(cm->buffer_pool);
#if CONFIG_VP9_POSTPROC
diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c
index 3f722090f..280e3d6a6 100644
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -293,6 +293,9 @@ void vp9_end_first_pass(VP9_COMP *cpi) {
} else {
output_stats(&cpi->twopass.total_stats, cpi->output_pkt_list);
}
+
+ vpx_free(cpi->twopass.fp_mb_float_stats);
+ cpi->twopass.fp_mb_float_stats = NULL;
}
static vpx_variance_fn_t get_block_variance_fn(BLOCK_SIZE bsize) {
@@ -653,7 +656,8 @@ static int fp_estimate_block_noise(MACROBLOCK *x, BLOCK_SIZE bsize) {
return block_noise << 2; // Scale << 2 to account for sampling.
}
-#if ENABLE_MT_BIT_MATCH
+// This function is called to test the functionality of row based
+// multi-threading in unit tests for bit-exactness
static void accumulate_floating_point_stats(VP9_COMP *cpi,
TileDataEnc *first_tile_col) {
VP9_COMMON *const cm = &cpi->common;
@@ -673,7 +677,6 @@ static void accumulate_floating_point_stats(VP9_COMP *cpi,
}
}
}
-#endif
static void first_pass_stat_calc(VP9_COMP *cpi, FIRSTPASS_STATS *fps,
FIRSTPASS_DATA *fp_acc_data) {
@@ -814,6 +817,10 @@ void vp9_first_pass_encode_tile_mb_row(VP9_COMP *cpi, ThreadData *td,
: NULL;
MODE_INFO mi_above, mi_left;
+ double mb_intra_factor;
+ double mb_brightness_factor;
+ double mb_neutral_count;
+
// First pass code requires valid last and new frame buffers.
assert(new_yv12 != NULL);
assert((lc != NULL) || frame_is_intra_only(cm) || (lst_yv12 != NULL));
@@ -871,9 +878,7 @@ void vp9_first_pass_encode_tile_mb_row(VP9_COMP *cpi, ThreadData *td,
const BLOCK_SIZE bsize = get_bsize(cm, mb_row, mb_col);
double log_intra;
int level_sample;
-#if ENABLE_MT_BIT_MATCH
const int mb_index = mb_row * cm->mb_cols + mb_col;
-#endif
#if CONFIG_FP_MB_STATS
const int mb_index = mb_row * cm->mb_cols + mb_col;
@@ -972,16 +977,15 @@ void vp9_first_pass_encode_tile_mb_row(VP9_COMP *cpi, ThreadData *td,
vpx_clear_system_state();
log_intra = log(this_error + 1.0);
if (log_intra < 10.0) {
- fp_acc_data->intra_factor += 1.0 + ((10.0 - log_intra) * 0.05);
-#if ENABLE_MT_BIT_MATCH
- cpi->twopass.fp_mb_float_stats[mb_index].frame_mb_intra_factor =
- 1.0 + ((10.0 - log_intra) * 0.05);
-#endif
+ mb_intra_factor = 1.0 + ((10.0 - log_intra) * 0.05);
+ fp_acc_data->intra_factor += mb_intra_factor;
+ if (cpi->oxcf.ethread_bit_match)
+ cpi->twopass.fp_mb_float_stats[mb_index].frame_mb_intra_factor =
+ mb_intra_factor;
} else {
fp_acc_data->intra_factor += 1.0;
-#if ENABLE_MT_BIT_MATCH
- cpi->twopass.fp_mb_float_stats[mb_index].frame_mb_intra_factor = 1.0;
-#endif
+ if (cpi->oxcf.ethread_bit_match)
+ cpi->twopass.fp_mb_float_stats[mb_index].frame_mb_intra_factor = 1.0;
}
#if CONFIG_VP9_HIGHBITDEPTH
@@ -993,17 +997,16 @@ void vp9_first_pass_encode_tile_mb_row(VP9_COMP *cpi, ThreadData *td,
level_sample = x->plane[0].src.buf[0];
#endif
if ((level_sample < DARK_THRESH) && (log_intra < 9.0)) {
- fp_acc_data->brightness_factor +=
- 1.0 + (0.01 * (DARK_THRESH - level_sample));
-#if ENABLE_MT_BIT_MATCH
- cpi->twopass.fp_mb_float_stats[mb_index].frame_mb_brightness_factor =
- 1.0 + (0.01 * (DARK_THRESH - level_sample));
-#endif
+ mb_brightness_factor = 1.0 + (0.01 * (DARK_THRESH - level_sample));
+ fp_acc_data->brightness_factor += mb_brightness_factor;
+ if (cpi->oxcf.ethread_bit_match)
+ cpi->twopass.fp_mb_float_stats[mb_index].frame_mb_brightness_factor =
+ mb_brightness_factor;
} else {
fp_acc_data->brightness_factor += 1.0;
-#if ENABLE_MT_BIT_MATCH
- cpi->twopass.fp_mb_float_stats[mb_index].frame_mb_brightness_factor = 1.0;
-#endif
+ if (cpi->oxcf.ethread_bit_match)
+ cpi->twopass.fp_mb_float_stats[mb_index].frame_mb_brightness_factor =
+ 1.0;
}
// Intrapenalty below deals with situations where the intra and inter
@@ -1163,19 +1166,19 @@ void vp9_first_pass_encode_tile_mb_row(VP9_COMP *cpi, ThreadData *td,
if (((this_error - intrapenalty) * 9 <= motion_error * 10) &&
(this_error < (2 * intrapenalty))) {
fp_acc_data->neutral_count += 1.0;
-#if ENABLE_MT_BIT_MATCH
- cpi->twopass.fp_mb_float_stats[mb_index].frame_mb_neutral_count = 1.0;
-#endif
+ if (cpi->oxcf.ethread_bit_match)
+ cpi->twopass.fp_mb_float_stats[mb_index].frame_mb_neutral_count =
+ 1.0;
// Also track cases where the intra is not much worse than the inter
// and use this in limiting the GF/arf group length.
} else if ((this_error > NCOUNT_INTRA_THRESH) &&
(this_error < (NCOUNT_INTRA_FACTOR * motion_error))) {
- fp_acc_data->neutral_count +=
- (double)motion_error / DOUBLE_DIVIDE_CHECK((double)this_error);
-#if ENABLE_MT_BIT_MATCH
- cpi->twopass.fp_mb_float_stats[mb_index].frame_mb_neutral_count =
+ mb_neutral_count =
(double)motion_error / DOUBLE_DIVIDE_CHECK((double)this_error);
-#endif
+ fp_acc_data->neutral_count += mb_neutral_count;
+ if (cpi->oxcf.ethread_bit_match)
+ cpi->twopass.fp_mb_float_stats[mb_index].frame_mb_neutral_count =
+ mb_neutral_count;
}
mv.row *= 8;
@@ -1421,6 +1424,11 @@ void vp9_first_pass(VP9_COMP *cpi, const struct lookahead_entry *source) {
cm->log2_tile_rows = 0;
+ if (cpi->oxcf.ethread_bit_match && cpi->twopass.fp_mb_float_stats == NULL)
+ CHECK_MEM_ERROR(
+ cm, cpi->twopass.fp_mb_float_stats,
+ vpx_calloc(cm->MBs * sizeof(*cpi->twopass.fp_mb_float_stats), 1));
+
{
FIRSTPASS_STATS fps;
TileDataEnc *first_tile_col;
@@ -1433,15 +1441,14 @@ void vp9_first_pass(VP9_COMP *cpi, const struct lookahead_entry *source) {
} else {
cpi->row_mt_sync_read_ptr = vp9_row_mt_sync_read;
cpi->row_mt_sync_write_ptr = vp9_row_mt_sync_write;
-#if ENABLE_MT_BIT_MATCH
- cm->log2_tile_cols = 0;
- vp9_zero_array(cpi->twopass.fp_mb_float_stats, cm->MBs);
-#endif
+ if (cpi->oxcf.ethread_bit_match) {
+ cm->log2_tile_cols = 0;
+ vp9_zero_array(cpi->twopass.fp_mb_float_stats, cm->MBs);
+ }
vp9_encode_fp_row_mt(cpi);
first_tile_col = &cpi->tile_data[0];
-#if ENABLE_MT_BIT_MATCH
- accumulate_floating_point_stats(cpi, first_tile_col);
-#endif
+ if (cpi->oxcf.ethread_bit_match)
+ accumulate_floating_point_stats(cpi, first_tile_col);
first_pass_stat_calc(cpi, &fps, &(first_tile_col->fp_data));
}
diff --git a/vp9/encoder/vp9_firstpass.h b/vp9/encoder/vp9_firstpass.h
index fd6fe66fb..d660aa1ff 100644
--- a/vp9/encoder/vp9_firstpass.h
+++ b/vp9/encoder/vp9_firstpass.h
@@ -41,14 +41,11 @@ typedef struct {
#define INVALID_ROW -1
-#define ENABLE_MT_BIT_MATCH 0
-#if ENABLE_MT_BIT_MATCH
typedef struct {
double frame_mb_intra_factor;
double frame_mb_brightness_factor;
double frame_mb_neutral_count;
} FP_MB_FLOAT_STATS;
-#endif
typedef struct {
double intra_factor;
@@ -153,9 +150,7 @@ typedef struct {
FIRSTPASS_MB_STATS firstpass_mb_stats;
#endif
-#if ENABLE_MT_BIT_MATCH
FP_MB_FLOAT_STATS *fp_mb_float_stats;
-#endif
// An indication of the content type of the current frame
FRAME_CONTENT_TYPE fr_content_type;