shithub: libvpx

Download patch

ref: 2c6ba737f83bd40214aae7510a9a6a8b4f8c30ce
parent: e6c435b506fbcabacabbe1535d60ebcbfd5c2c11
parent: 85640f1c9dd56378e9f86d85843732387731e69e
author: James Zern <jzern@google.com>
date: Fri Aug 23 14:52:10 EDT 2013

Merge "vp9: remove unnecessary wait w/threaded loopfilter"

--- a/vp9/decoder/vp9_decodframe.c
+++ b/vp9/decoder/vp9_decodframe.c
@@ -592,6 +592,7 @@
       lf_data->frame_buffer = fb;
       lf_data->cm = pc;
       lf_data->xd = pbi->mb;
+      lf_data->stop = 0;
       lf_data->y_only = 0;
     }
     vp9_loop_filter_frame_init(pc, pc->lf.filter_level);
@@ -615,6 +616,9 @@
       if (num_threads > 1) {
         LFWorkerData *const lf_data = (LFWorkerData*)pbi->lf_worker.data1;
 
+        // decoding has completed: finish up the loop filter in this thread.
+        if (mi_row + MI_BLOCK_SIZE >= pc->cur_tile_mi_row_end) continue;
+
         vp9_worker_sync(&pbi->lf_worker);
         lf_data->start = lf_start;
         lf_data->stop = mi_row;
@@ -627,13 +631,17 @@
   }
 
   if (pbi->do_loopfilter_inline) {
+    int lf_start;
     if (num_threads > 1) {
-      // TODO(jzern): since the loop filter is delayed one mb row, this will be
-      // forced to wait for the last row scheduled in the for loop.
+      LFWorkerData *const lf_data = (LFWorkerData*)pbi->lf_worker.data1;
+
       vp9_worker_sync(&pbi->lf_worker);
+      lf_start = lf_data->stop;
+    } else {
+      lf_start = mi_row - MI_BLOCK_SIZE;
     }
     vp9_loop_filter_rows(fb, pc, &pbi->mb,
-                         mi_row - MI_BLOCK_SIZE, pc->mi_rows, 0);
+                         lf_start, pc->mi_rows, 0);
   }
 }