ref: aab0f5b121e2ca7fb294358ceb904b2f91225e6f
parent: e913eb97c9eb2abd325d3416423925e501710098
parent: 8db5da2906a6a75dd5b8aba7147e73214a306d24
author: Yunqing Wang <yunqingwang@google.com>
date: Fri Sep 24 04:34:07 EDT 2010
Merge "Adjust multi-thread sync ranges according to image sizes"
--- a/vp8/decoder/onyxd_int.h
+++ b/vp8/decoder/onyxd_int.h
@@ -96,6 +96,7 @@
// 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
--- a/vp8/decoder/threading.c
+++ b/vp8/decoder/threading.c
@@ -257,6 +257,7 @@
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 @@
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 @@
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 @@
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 @@
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);