]> granicus.if.org Git - libvpx/commitdiff
Fix a tsan error bug in frame parallel decode.
authorhkuang <hkuang@google.com>
Tue, 3 Mar 2015 20:57:26 +0000 (12:57 -0800)
committerhkuang <hkuang@google.com>
Tue, 3 Mar 2015 20:58:25 +0000 (12:58 -0800)
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

vp9/decoder/vp9_decodeframe.c

index d345a0578439d7b08ce2e70fb5f35447bae2cc65..a2535a0cf3ee846d6a2972c60f8add6832b99845 100644 (file)
@@ -1927,7 +1927,7 @@ void dec_build_inter_predictors(VP9Decoder *const pbi, MACROBLOCKD *xd,
       // 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 @@ void dec_build_inter_predictors(VP9Decoder *const pbi, MACROBLOCKD *xd,
       // 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) {