summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Nelissen <marcone@google.com>2016-11-14 13:59:19 -0800
committermh0rst <mhorst@tzi.de>2017-01-13 12:53:34 +0100
commitd50cb54886c76b0da57b26d022c057bf6559ed29 (patch)
tree6b959b0e8267632b6679eef3a2df118864da8eac
parent8ba7fb7d71ab45ad0bce172621452f6cea985fee (diff)
downloadandroid_external_libvpx-d50cb54886c76b0da57b26d022c057bf6559ed29.tar.gz
android_external_libvpx-d50cb54886c76b0da57b26d022c057bf6559ed29.tar.bz2
android_external_libvpx-d50cb54886c76b0da57b26d022c057bf6559ed29.zip
vp8:fix threading issuesreplicant-6.0-0001
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) (cherry picked from commit 6886e8e0a9db2dbad723dc37a548233e004b33bc)
-rw-r--r--libvpx/vp8/decoder/decodeframe.c10
-rw-r--r--libvpx/vp8/decoder/onyxd_if.c3
-rw-r--r--libvpx/vp8/decoder/threading.c183
3 files changed, 89 insertions, 107 deletions
diff --git a/libvpx/vp8/decoder/decodeframe.c b/libvpx/vp8/decoder/decodeframe.c
index 56e167d..7bdb2bd 100644
--- a/libvpx/vp8/decoder/decodeframe.c
+++ b/libvpx/vp8/decoder/decodeframe.c
@@ -903,9 +903,13 @@ static void setup_token_decoder(VP8D_COMP *pbi,
}
#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 9015fcb..b70c1a0 100644
--- a/libvpx/vp8/decoder/onyxd_if.c
+++ b/libvpx/vp8/decoder/onyxd_if.c
@@ -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;
}
@@ -487,8 +486,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
diff --git a/libvpx/vp8/decoder/threading.c b/libvpx/vp8/decoder/threading.c
index 6801532..a5ac33a 100644
--- a/libvpx/vp8/decoder/threading.c
+++ b/libvpx/vp8/decoder/threading.c
@@ -694,83 +694,67 @@ 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 ;
- }
-
- 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 ;
- }
+void vp8mt_de_alloc_temp_buffers(VP8D_COMP *pbi, int mb_rows) {
+ int i;
- 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 ;
- }
+ vpx_free(pbi->mt_current_mb_col);
+ pbi->mt_current_mb_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;
+ }
}
@@ -827,41 +811,38 @@ void vp8mt_alloc_temp_buffers(VP8D_COMP *pbi, int width, int prev_mb_rows)
}
-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);
+ }
- /* 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]);
+ }
- 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);
- sem_destroy(&pbi->h_event_end_decoding);
+ vpx_free(pbi->h_decoding_thread);
+ pbi->h_decoding_thread = NULL;
- 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->h_event_start_decoding);
- pbi->h_event_start_decoding = NULL;
+ vpx_free(pbi->mb_row_di);
+ pbi->mb_row_di = NULL;
- vpx_free(pbi->mb_row_di);
- pbi->mb_row_di = NULL ;
+ vpx_free(pbi->de_thread_data);
+ pbi->de_thread_data = 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)