From a723f5ecd174264f0c494161cb3c18711d5887d3 Mon Sep 17 00:00:00 2001 From: hkuang Date: Tue, 3 Mar 2015 12:57:26 -0800 Subject: [PATCH] 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 --- vp9/decoder/vp9_decodeframe.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vp9/decoder/vp9_decodeframe.c b/vp9/decoder/vp9_decodeframe.c index d345a0578..a2535a0cf 100644 --- a/vp9/decoder/vp9_decodeframe.c +++ b/vp9/decoder/vp9_decodeframe.c @@ -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) { -- 2.40.0