diff options
author | Marco Nelissen <marcone@google.com> | 2016-11-14 13:59:19 -0800 |
---|---|---|
committer | gitbuildkicker <android-build@google.com> | 2016-11-30 10:47:29 -0800 |
commit | 0603d0cb98502451ddf696cb538da625ec0e3b48 (patch) | |
tree | e663b8a9e77c2f1e6a5e35208f9521877157f615 | |
parent | 152b651c8a9b91d6a1e6551e568e216971f9ad21 (diff) | |
download | libvpx-0603d0cb98502451ddf696cb538da625ec0e3b48.tar.gz |
vp8:fix threading issuesandroid-7.1.1_r16android-7.1.1_r15android-7.1.1_r14android-7.1.1_r12android-7.1.1_r11android-7.1.1_r10
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)
-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 4bc87eb13..70b35c741 100644 --- a/libvpx/vp8/decoder/decodeframe.c +++ b/libvpx/vp8/decoder/decodeframe.c @@ -904,9 +904,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 3468268a2..d129e0e9e 100644 --- a/libvpx/vp8/decoder/onyxd_if.c +++ b/libvpx/vp8/decoder/onyxd_if.c @@ -347,7 +347,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; } @@ -503,8 +502,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 7c7184c78..8acc3b312 100644 --- a/libvpx/vp8/decoder/threading.c +++ b/libvpx/vp8/decoder/threading.c @@ -695,83 +695,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; + } } @@ -828,41 +812,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) |