From d5fa786b4f881bc50663a0c1333a053e99406dfa Mon Sep 17 00:00:00 2001 From: Hangyu Kuang Date: Mon, 2 Mar 2015 13:59:03 -0800 Subject: [PATCH] Only wait for previous frame's motion vector if needed. Change-Id: Iecce685a33b64844446c0009f21bc85566d7469f --- vp9/common/vp9_mvref_common.c | 18 ++++++++++++++---- vp9/decoder/vp9_dthread.c | 8 +++++++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/vp9/common/vp9_mvref_common.c b/vp9/common/vp9_mvref_common.c index 51aa82411..52a731329 100644 --- a/vp9/common/vp9_mvref_common.c +++ b/vp9/common/vp9_mvref_common.c @@ -69,13 +69,23 @@ static void find_mv_refs_idx(const VP9_COMMON *cm, const MACROBLOCKD *xd, } } - // Synchronize here for frame parallel decode if sync function is provided. - if (sync != NULL) { - sync(data, mi_row); - } + // TODO(hkuang): Remove this sync after fixing pthread_cond_broadcast + // on windows platform. The sync here is unncessary if use_perv_frame_mvs + // is 0. But after removing it, there will be hang in the unit test on windows + // due to several threads waiting for a thread's signal. +#if defined(_WIN32) && !HAVE_PTHREAD_H + if (cm->frame_parallel_decode && sync != NULL) { + sync(data, mi_row); + } +#endif // Check the last frame's mode and mv info. if (cm->use_prev_frame_mvs) { + // Synchronize here for frame parallel decode if sync function is provided. + if (cm->frame_parallel_decode && sync != NULL) { + sync(data, mi_row); + } + if (prev_frame_mvs->ref_frame[0] == ref_frame) { ADD_MV_REF_LIST(prev_frame_mvs->mv[0], refmv_count, mv_ref_list, Done); } else if (prev_frame_mvs->ref_frame[1] == ref_frame) { diff --git a/vp9/decoder/vp9_dthread.c b/vp9/decoder/vp9_dthread.c index d2a2b819c..0904e93f6 100644 --- a/vp9/decoder/vp9_dthread.c +++ b/vp9/decoder/vp9_dthread.c @@ -38,8 +38,14 @@ void vp9_frameworker_unlock_stats(VP9Worker *const worker) { void vp9_frameworker_signal_stats(VP9Worker *const worker) { #if CONFIG_MULTITHREAD FrameWorkerData *const worker_data = worker->data1; - // TODO(hkuang): Investigate using broadcast or signal. + +// TODO(hkuang): Fix the pthread_cond_broadcast in windows wrapper. +#if defined(_WIN32) && !HAVE_PTHREAD_H pthread_cond_signal(&worker_data->stats_cond); +#else + pthread_cond_broadcast(&worker_data->stats_cond); +#endif + #else (void)worker; #endif -- 2.40.0