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) {
--
⑨