diff options
author | Marco Nelissen <marcone@google.com> | 2016-11-14 13:59:19 -0800 |
---|---|---|
committer | mh0rst <mhorst@tzi.de> | 2017-01-13 12:53:34 +0100 |
commit | d50cb54886c76b0da57b26d022c057bf6559ed29 (patch) | |
tree | 6b959b0e8267632b6679eef3a2df118864da8eac | |
parent | 8ba7fb7d71ab45ad0bce172621452f6cea985fee (diff) | |
download | android_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.c | 10 | ||||
-rw-r--r-- | libvpx/vp8/decoder/onyxd_if.c | 3 | ||||
-rw-r--r-- | libvpx/vp8/decoder/threading.c | 183 |
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) |