From 8db5da2906a6a75dd5b8aba7147e73214a306d24 Mon Sep 17 00:00:00 2001
From: Yunqing Wang <yunqingwang@google.com>
Date: Thu, 23 Sep 2010 13:53:09 -0400
Subject: [PATCH] Adjust multi-thread sync ranges according to image sizes

In multi-threaded decoder, set different sync ranges for
different video resolutions.

Change-Id: Iea48fd36f51919e0152c8ed3b1f10e1b723c0ca7
---
 vp8/decoder/onyxd_int.h |  1 +
 vp8/decoder/threading.c | 15 +++++++++++----
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/vp8/decoder/onyxd_int.h b/vp8/decoder/onyxd_int.h
index ab926e61d5..522ac22d2e 100644
--- a/vp8/decoder/onyxd_int.h
+++ b/vp8/decoder/onyxd_int.h
@@ -96,6 +96,7 @@ typedef struct VP8Decompressor
     // variable for threading
 #if CONFIG_MULTITHREAD
     int mt_baseline_filter_level[MAX_MB_SEGMENTS];
+    int sync_range;
     int *mt_current_mb_col;                  // Each row remembers its already decoded column.
 
     unsigned char **mt_yabove_row;           // mb_rows x width
diff --git a/vp8/decoder/threading.c b/vp8/decoder/threading.c
index 93bc69e724..56dd5ef8e2 100644
--- a/vp8/decoder/threading.c
+++ b/vp8/decoder/threading.c
@@ -257,6 +257,7 @@ THREAD_FUNCTION vp8_thread_decoding_proc(void *p_data)
                 int mb_row;
                 int num_part = 1 << pbi->common.multi_token_partition;
                 volatile int *last_row_current_mb_col;
+                int nsync = pbi->sync_range;
 
                 for (mb_row = ithread+1; mb_row < pc->mb_rows; mb_row += (pbi->decoding_thread_count + 1))
                 {
@@ -292,9 +293,9 @@ THREAD_FUNCTION vp8_thread_decoding_proc(void *p_data)
 
                     for (mb_col = 0; mb_col < pc->mb_cols; mb_col++)
                     {
-                        if ((mb_col & 7) == 0)
+                        if ((mb_col & (nsync-1)) == 0)
                         {
-                            while (mb_col > (*last_row_current_mb_col - 8) && *last_row_current_mb_col != pc->mb_cols - 1)
+                            while (mb_col > (*last_row_current_mb_col - nsync) && *last_row_current_mb_col != pc->mb_cols - 1)
                             {
                                 x86_pause_hint();
                                 thread_sleep(0);
@@ -608,6 +609,11 @@ int vp8mt_alloc_temp_buffers(VP8D_COMP *pbi, int width, int prev_mb_rows)
         if ((width & 0xf) != 0)
             width += 16 - (width & 0xf);
 
+        if (width < 640) pbi->sync_range = 1;
+        else if (width <= 1280) pbi->sync_range = 8;
+        else if (width <= 2560) pbi->sync_range =16;
+        else pbi->sync_range = 32;
+
         uv_width = width >>1;
 
         // Allocate an int for each mb row.
@@ -764,6 +770,7 @@ void vp8mt_decode_mb_rows( VP8D_COMP *pbi, MACROBLOCKD *xd)
     int num_part = 1 << pbi->common.multi_token_partition;
     int i, j;
     volatile int *last_row_current_mb_col = NULL;
+    int nsync = pbi->sync_range;
 
     int filter_level;
     loop_filter_info *lfi = pc->lf_info;
@@ -832,8 +839,8 @@ void vp8mt_decode_mb_rows( VP8D_COMP *pbi, MACROBLOCKD *xd)
 
             for (mb_col = 0; mb_col < pc->mb_cols; mb_col++)
             {
-                if ( mb_row > 0 && (mb_col & 7) == 0){
-                    while (mb_col > (*last_row_current_mb_col - 8) && *last_row_current_mb_col != pc->mb_cols - 1)
+                if ( mb_row > 0 && (mb_col & (nsync-1)) == 0){
+                    while (mb_col > (*last_row_current_mb_col - nsync) && *last_row_current_mb_col != pc->mb_cols - 1)
                     {
                         x86_pause_hint();
                         thread_sleep(0);
-- 
GitLab