]> granicus.if.org Git - libvpx/commitdiff
vp9: limit lpf workers to min(threads,tiles,sb_rows)
authorJames Zern <jzern@google.com>
Thu, 20 Dec 2018 08:10:47 +0000 (00:10 -0800)
committerJames Zern <jzern@google.com>
Thu, 20 Dec 2018 08:22:56 +0000 (00:22 -0800)
this implementation does not scale well beyond that. this restores the
performance in v1.7.0.

BUG=webm:1574

Change-Id: I8f3464cfe871988fa06ebefe9954811fd002584e

vp9/common/vp9_thread_common.c

index ba9aa69d0d51053116fd82637fc417b9406a346e..b008ed5cf6016509cefcf9e423f10c12aa7b3eda 100644 (file)
@@ -159,7 +159,12 @@ static void loop_filter_rows_mt(YV12_BUFFER_CONFIG *frame, VP9_COMMON *cm,
   const VPxWorkerInterface *const winterface = vpx_get_worker_interface();
   // Number of superblock rows and cols
   const int sb_rows = mi_cols_aligned_to_sb(cm->mi_rows) >> MI_BLOCK_SIZE_LOG2;
-  const int num_workers = VPXMIN(nworkers, sb_rows);
+  const int num_tile_cols = 1 << cm->log2_tile_cols;
+  // Limit the number of workers to prevent changes in frame dimensions from
+  // causing incorrect sync calculations when sb_rows < threads/tile_cols.
+  // Further restrict them by the number of tile columns should the user
+  // request more as this implementation doesn't scale well beyond that.
+  const int num_workers = VPXMIN(nworkers, VPXMIN(num_tile_cols, sb_rows));
   int i;
 
   if (!lf_sync->sync_range || sb_rows != lf_sync->rows ||