vp8:fix threading issues
authorJim Bankoski <jimbankoski@google.com>
Thu, 21 Jul 2016 16:20:10 +0000 (09:20 -0700)
committerJames Bankoski <jimbankoski@google.com>
Sat, 23 Jul 2016 00:50:55 +0000 (00:50 +0000)
1 - stops de allocating before threads are closed.
2 - limits threads to mb_rows when mb_rows < partitions

BUG=webm:851

Change-Id: I7ead53e80cc0f8c2e4c1c53506eff8431de2a37e

vp8/decoder/decodeframe.c
vp8/decoder/onyxd_if.c
vp8/decoder/threading.c

index affe453..c76418e 100644 (file)
@@ -798,6 +798,9 @@ static void setup_token_decoder(VP8D_COMP *pbi,
   if (pbi->decoding_thread_count > num_token_partitions - 1) {
     pbi->decoding_thread_count = num_token_partitions - 1;
   }
+  if (pbi->decoding_thread_count > pbi->common.mb_rows - 1) {
+    pbi->decoding_thread_count = pbi->common.mb_rows - 1;
+  }
 #endif
 }
 
index 62b4cb0..dff53dc 100644 (file)
@@ -331,7 +331,6 @@ int vp8dx_receive_compressed_data(VP8D_COMP *pbi, size_t size,
     if (cm->fb_idx_ref_cnt[cm->new_fb_idx] > 0) {
       cm->fb_idx_ref_cnt[cm->new_fb_idx]--;
     }
-
     goto decode_exit;
   }
 
@@ -464,9 +463,6 @@ int vp8_remove_decoder_instances(struct frame_buffers *fb) {
 
     if (!pbi) return VPX_CODEC_ERROR;
 #if CONFIG_MULTITHREAD
-    if (pbi->b_multithreaded_rd) {
-      vp8mt_de_alloc_temp_buffers(pbi, pbi->common.mb_rows);
-    }
     vp8_decoder_remove_threads(pbi);
 #endif
 
index 3f24b44..e9d391d 100644 (file)
@@ -631,65 +631,63 @@ void vp8_decoder_create_threads(VP8D_COMP *pbi) {
 void vp8mt_de_alloc_temp_buffers(VP8D_COMP *pbi, int mb_rows) {
   int i;
 
-  if (pbi->b_multithreaded_rd) {
-    vpx_free(pbi->mt_current_mb_col);
-    pbi->mt_current_mb_col = NULL;
-
-    /* Free above_row buffers. */
-    if (pbi->mt_yabove_row) {
-      for (i = 0; i < mb_rows; ++i) {
-        vpx_free(pbi->mt_yabove_row[i]);
-        pbi->mt_yabove_row[i] = NULL;
-      }
-      vpx_free(pbi->mt_yabove_row);
-      pbi->mt_yabove_row = NULL;
+  vpx_free(pbi->mt_current_mb_col);
+  pbi->mt_current_mb_col = NULL;
+
+  /* Free above_row buffers. */
+  if (pbi->mt_yabove_row) {
+    for (i = 0; i < mb_rows; ++i) {
+      vpx_free(pbi->mt_yabove_row[i]);
+      pbi->mt_yabove_row[i] = NULL;
     }
+    vpx_free(pbi->mt_yabove_row);
+    pbi->mt_yabove_row = NULL;
+  }
 
-    if (pbi->mt_uabove_row) {
-      for (i = 0; i < mb_rows; ++i) {
-        vpx_free(pbi->mt_uabove_row[i]);
-        pbi->mt_uabove_row[i] = NULL;
-      }
-      vpx_free(pbi->mt_uabove_row);
-      pbi->mt_uabove_row = NULL;
+  if (pbi->mt_uabove_row) {
+    for (i = 0; i < mb_rows; ++i) {
+      vpx_free(pbi->mt_uabove_row[i]);
+      pbi->mt_uabove_row[i] = NULL;
     }
+    vpx_free(pbi->mt_uabove_row);
+    pbi->mt_uabove_row = NULL;
+  }
 
-    if (pbi->mt_vabove_row) {
-      for (i = 0; i < mb_rows; ++i) {
-        vpx_free(pbi->mt_vabove_row[i]);
-        pbi->mt_vabove_row[i] = NULL;
-      }
-      vpx_free(pbi->mt_vabove_row);
-      pbi->mt_vabove_row = NULL;
+  if (pbi->mt_vabove_row) {
+    for (i = 0; i < mb_rows; ++i) {
+      vpx_free(pbi->mt_vabove_row[i]);
+      pbi->mt_vabove_row[i] = NULL;
     }
+    vpx_free(pbi->mt_vabove_row);
+    pbi->mt_vabove_row = NULL;
+  }
 
-    /* Free left_col buffers. */
-    if (pbi->mt_yleft_col) {
-      for (i = 0; i < mb_rows; ++i) {
-        vpx_free(pbi->mt_yleft_col[i]);
-        pbi->mt_yleft_col[i] = NULL;
-      }
-      vpx_free(pbi->mt_yleft_col);
-      pbi->mt_yleft_col = NULL;
+  /* Free left_col buffers. */
+  if (pbi->mt_yleft_col) {
+    for (i = 0; i < mb_rows; ++i) {
+      vpx_free(pbi->mt_yleft_col[i]);
+      pbi->mt_yleft_col[i] = NULL;
     }
+    vpx_free(pbi->mt_yleft_col);
+    pbi->mt_yleft_col = NULL;
+  }
 
-    if (pbi->mt_uleft_col) {
-      for (i = 0; i < mb_rows; ++i) {
-        vpx_free(pbi->mt_uleft_col[i]);
-        pbi->mt_uleft_col[i] = NULL;
-      }
-      vpx_free(pbi->mt_uleft_col);
-      pbi->mt_uleft_col = NULL;
+  if (pbi->mt_uleft_col) {
+    for (i = 0; i < mb_rows; ++i) {
+      vpx_free(pbi->mt_uleft_col[i]);
+      pbi->mt_uleft_col[i] = NULL;
     }
+    vpx_free(pbi->mt_uleft_col);
+    pbi->mt_uleft_col = NULL;
+  }
 
-    if (pbi->mt_vleft_col) {
-      for (i = 0; i < mb_rows; ++i) {
-        vpx_free(pbi->mt_vleft_col[i]);
-        pbi->mt_vleft_col[i] = NULL;
-      }
-      vpx_free(pbi->mt_vleft_col);
-      pbi->mt_vleft_col = NULL;
+  if (pbi->mt_vleft_col) {
+    for (i = 0; i < mb_rows; ++i) {
+      vpx_free(pbi->mt_vleft_col[i]);
+      pbi->mt_vleft_col[i] = NULL;
     }
+    vpx_free(pbi->mt_vleft_col);
+    pbi->mt_vleft_col = NULL;
   }
 }
 
@@ -760,7 +758,6 @@ void vp8_decoder_remove_threads(VP8D_COMP *pbi) {
   /* shutdown MB Decoding thread; */
   if (pbi->b_multithreaded_rd) {
     int i;
-
     pbi->b_multithreaded_rd = 0;
 
     /* allow all threads to exit */
@@ -786,6 +783,8 @@ void vp8_decoder_remove_threads(VP8D_COMP *pbi) {
 
     vpx_free(pbi->de_thread_data);
     pbi->de_thread_data = NULL;
+
+    vp8mt_de_alloc_temp_buffers(pbi, pbi->common.mb_rows);
   }
 }