vp8:fix threading issues

1 - stops de allocating before threads are closed.
2 - limits threads to mb_rows when mb_rows < partitions

BUG=webm:851
Bug: 30436808

Change-Id: Ie017818ed28103ca9d26d57087f31361b642e09b
(cherry picked from commit 70cca742efa20617c70c3209aa614a70f282f90e)
diff --git a/libvpx/vp8/decoder/decodeframe.c b/libvpx/vp8/decoder/decodeframe.c
index 4bc87eb..70b35c7 100644
--- a/libvpx/vp8/decoder/decodeframe.c
+++ b/libvpx/vp8/decoder/decodeframe.c
@@ -904,9 +904,13 @@
     }
 
 #if CONFIG_MULTITHREAD
-    /* Clamp number of decoder threads */
-    if (pbi->decoding_thread_count > num_token_partitions - 1)
-        pbi->decoding_thread_count = num_token_partitions - 1;
+  /* Clamp number of decoder threads */
+  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
 }
 
diff --git a/libvpx/vp8/decoder/onyxd_if.c b/libvpx/vp8/decoder/onyxd_if.c
index 3468268..d129e0e 100644
--- a/libvpx/vp8/decoder/onyxd_if.c
+++ b/libvpx/vp8/decoder/onyxd_if.c
@@ -347,7 +347,6 @@
 
         if (cm->fb_idx_ref_cnt[cm->new_fb_idx] > 0)
           cm->fb_idx_ref_cnt[cm->new_fb_idx]--;
-
         goto decode_exit;
     }
 
@@ -503,8 +502,6 @@
         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
 
diff --git a/libvpx/vp8/decoder/threading.c b/libvpx/vp8/decoder/threading.c
index 7c7184c..8acc3b3 100644
--- a/libvpx/vp8/decoder/threading.c
+++ b/libvpx/vp8/decoder/threading.c
@@ -695,83 +695,67 @@
 }
 
 
-void vp8mt_de_alloc_temp_buffers(VP8D_COMP *pbi, int mb_rows)
-{
-    int i;
+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 ;
+  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_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 ;
-        }
-
-        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 ;
-        }
+  /* 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_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;
+  }
+
+  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;
+  }
 }
 
 
@@ -828,41 +812,38 @@
 }
 
 
-void vp8_decoder_remove_threads(VP8D_COMP *pbi)
-{
-    /* shutdown MB Decoding thread; */
-    if (pbi->b_multithreaded_rd)
-    {
-        int i;
+void vp8_decoder_remove_threads(VP8D_COMP *pbi) {
+  /* shutdown MB Decoding thread; */
+  if (pbi->b_multithreaded_rd) {
+    int i;
+    pbi->b_multithreaded_rd = 0;
 
-        pbi->b_multithreaded_rd = 0;
-
-        /* allow all threads to exit */
-        for (i = 0; i < pbi->allocated_decoding_thread_count; i++)
-        {
-            sem_post(&pbi->h_event_start_decoding[i]);
-            pthread_join(pbi->h_decoding_thread[i], NULL);
-        }
-
-        for (i = 0; i < pbi->allocated_decoding_thread_count; i++)
-        {
-            sem_destroy(&pbi->h_event_start_decoding[i]);
-        }
-
-        sem_destroy(&pbi->h_event_end_decoding);
-
-            vpx_free(pbi->h_decoding_thread);
-            pbi->h_decoding_thread = NULL;
-
-            vpx_free(pbi->h_event_start_decoding);
-            pbi->h_event_start_decoding = NULL;
-
-            vpx_free(pbi->mb_row_di);
-            pbi->mb_row_di = NULL ;
-
-            vpx_free(pbi->de_thread_data);
-            pbi->de_thread_data = NULL;
+    /* allow all threads to exit */
+    for (i = 0; i < pbi->allocated_decoding_thread_count; ++i) {
+      sem_post(&pbi->h_event_start_decoding[i]);
+      pthread_join(pbi->h_decoding_thread[i], NULL);
     }
+
+    for (i = 0; i < pbi->allocated_decoding_thread_count; ++i) {
+      sem_destroy(&pbi->h_event_start_decoding[i]);
+    }
+
+    sem_destroy(&pbi->h_event_end_decoding);
+
+    vpx_free(pbi->h_decoding_thread);
+    pbi->h_decoding_thread = NULL;
+
+    vpx_free(pbi->h_event_start_decoding);
+    pbi->h_event_start_decoding = NULL;
+
+    vpx_free(pbi->mb_row_di);
+    pbi->mb_row_di = NULL;
+
+    vpx_free(pbi->de_thread_data);
+    pbi->de_thread_data = NULL;
+
+    vp8mt_de_alloc_temp_buffers(pbi, pbi->common.mb_rows);
+  }
 }
 
 void vp8mt_decode_mb_rows( VP8D_COMP *pbi, MACROBLOCKD *xd)