shithub: libvpx

Download patch

ref: a723f5ecd174264f0c494161cb3c18711d5887d3
parent: 1790d45252efb29903baae3d1776bb24cee76558
author: hkuang <hkuang@google.com>
date: Tue Mar 3 07:57:26 EST 2015

Fix a tsan error bug in frame parallel decode.

A frame may be waiting for an out of border pixel from another
frame. A frame's row progress variable is set to -1 when start being decoded
and another frame may be waiting for -2 row pixel from this frame.
In this case, vp9_frameworker_wait will return directly and skip the waiting
which leads to tsan error between threads.

Change-Id: Id16604915fb598b823e34393f696e3aa46fb6422

--- a/vp9/decoder/vp9_decodeframe.c
+++ b/vp9/decoder/vp9_decodeframe.c
@@ -1927,7 +1927,7 @@
       // pixels of each superblock row can be changed by next superblock row.
        if (pbi->frame_parallel_decode)
          vp9_frameworker_wait(pbi->frame_worker_owner, ref_frame_buf,
-                              (y1 + 7) << (plane == 0 ? 0 : 1));
+                              MAX(0, (y1 + 7) << (plane == 0 ? 0 : 1)));
 
       // Skip border extension if block is inside the frame.
       if (x0 < 0 || x0 > frame_width - 1 || x1 < 0 || x1 > frame_width - 1 ||
@@ -1983,7 +1983,7 @@
       // pixels of each superblock row can be changed by next superblock row.
        if (pbi->frame_parallel_decode)
          vp9_frameworker_wait(pbi->frame_worker_owner, ref_frame_buf,
-                              (y1 + 7) << (plane == 0 ? 0 : 1));
+                              MAX(0, (y1 + 7) << (plane == 0 ? 0 : 1)));
     }
 #if CONFIG_VP9_HIGHBITDEPTH
     if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {