ref: ffb3c50da1d7ac24e6ae7858cb62abb348552b6a
parent: f951881e8cc8487b812b2cd562fb1d9d583ec30b
author: Marco <marpan@google.com>
date: Tue Mar 7 09:32:30 EST 2017
vp9: Enable row multithreading for SVC in real-time mode. Enable row-mt for SVC for real-time mode, speed >=5. Add the controls to the sample encoders, but keep it off for now. Add the control and enable it for the 1 pass CBR unittests. For speed 7, 3 layer SVC, 2 threads, row-mt enabled gives about ~5% speedup. Change-Id: Ie8e77323c17263e3e7a7b9858aec12a3a93ec0c1
--- a/examples/vp9_spatial_svc_encoder.c
+++ b/examples/vp9_spatial_svc_encoder.c
@@ -697,8 +697,10 @@
if (svc_ctx.speed != -1)
vpx_codec_control(&codec, VP8E_SET_CPUUSED, svc_ctx.speed);
- if (svc_ctx.threads)
+ if (svc_ctx.threads) {
vpx_codec_control(&codec, VP9E_SET_TILE_COLUMNS, (svc_ctx.threads >> 1));
+ vpx_codec_control(&codec, VP9E_SET_ROW_MT, 0);
+ }
if (svc_ctx.speed >= 5 && svc_ctx.aqmode == 1)
vpx_codec_control(&codec, VP9E_SET_AQ_MODE, 3);
if (svc_ctx.speed >= 5)
--- a/test/datarate_test.cc
+++ b/test/datarate_test.cc
@@ -1096,6 +1096,7 @@
encoder->Control(VP9E_SET_TILE_COLUMNS, 0);
encoder->Control(VP8E_SET_MAX_INTRA_BITRATE_PCT, 300);
encoder->Control(VP9E_SET_TILE_COLUMNS, (cfg_.g_threads >> 1));
+ encoder->Control(VP9E_SET_ROW_MT, 1);
encoder->Control(VP8E_SET_STATIC_THRESHOLD, 1);
}
const vpx_rational_t tb = video->timebase();
--- a/vp9/encoder/vp9_encoder.c
+++ b/vp9/encoder/vp9_encoder.c
@@ -5201,8 +5201,7 @@
// In realtime mode, enable row based multi-threading for all the speed levels
// where non-rd path is used.
- if (cpi->oxcf.mode == REALTIME && cpi->oxcf.speed >= 5 && cpi->oxcf.row_mt &&
- !cpi->use_svc) {
+ if (cpi->oxcf.mode == REALTIME && cpi->oxcf.speed >= 5 && cpi->oxcf.row_mt) {
cpi->row_mt = 1;
}
}
--- a/vp9/encoder/vp9_ethread.c
+++ b/vp9/encoder/vp9_ethread.c
@@ -77,8 +77,9 @@
int allocated_workers = num_workers;
// While using SVC, we need to allocate threads according to the highest
- // resolution.
- if (cpi->use_svc) {
+ // resolution. When row based multithreading is enabled, it is OK to
+ // allocate more threads than the number of max tile columns.
+ if (cpi->use_svc && !cpi->row_mt) {
int max_tile_cols = get_max_tile_cols(cpi);
allocated_workers = VPXMIN(cpi->oxcf.max_threads, max_tile_cols);
}
@@ -615,7 +616,6 @@
for (i = 0; i < num_workers; i++) {
EncWorkerData *thread_data;
thread_data = &cpi->tile_thr_data[i];
-
// Before encoding a frame, copy the thread data from cpi.
if (thread_data->td != &cpi->td) {
thread_data->td->mb = cpi->td.mb;