]> granicus.if.org Git - libvpx/commitdiff
Only wait for previous frame's motion vector if needed.
authorHangyu Kuang <hkuang@google.com>
Mon, 2 Mar 2015 21:59:03 +0000 (13:59 -0800)
committerhkuang <hkuang@google.com>
Fri, 6 Mar 2015 00:09:44 +0000 (16:09 -0800)
Change-Id: Iecce685a33b64844446c0009f21bc85566d7469f

vp9/common/vp9_mvref_common.c
vp9/decoder/vp9_dthread.c

index 51aa82411a9254d89b49574b7208e482f5ba0a28..52a731329d3ec8de5f8a9ea4d17e9bd205daec7f 100644 (file)
@@ -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) {
index d2a2b819c702e9cd593cf70490762a1fcf5b8f5d..0904e93f6206101d5b91678a65f8b88ac6ca7a02 100644 (file)
@@ -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