diff options
author | Yunqing Wang <yunqingwang@google.com> | 2016-01-20 01:51:37 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2016-01-20 01:51:37 +0000 |
commit | 5ac25c91020d345ee88615d9bbbfce22cdcc1b04 (patch) | |
tree | 5da1ff3003af677aa6771a62c1c0e06344dc0165 /vp8/encoder/ethreading.c | |
parent | cb785ade5b22029872afbf8103d6df484af66ffa (diff) | |
parent | ff0107f60dbddec82d7d7feacd1c9a3ff9ab4a51 (diff) | |
download | libvpx-5ac25c91020d345ee88615d9bbbfce22cdcc1b04.tar libvpx-5ac25c91020d345ee88615d9bbbfce22cdcc1b04.tar.gz libvpx-5ac25c91020d345ee88615d9bbbfce22cdcc1b04.tar.bz2 libvpx-5ac25c91020d345ee88615d9bbbfce22cdcc1b04.zip |
Merge "Amend and improve VP8 multithreading implementation"
Diffstat (limited to 'vp8/encoder/ethreading.c')
-rw-r--r-- | vp8/encoder/ethreading.c | 54 |
1 files changed, 32 insertions, 22 deletions
diff --git a/vp8/encoder/ethreading.c b/vp8/encoder/ethreading.c index 4e234ccd5..4f689c4bc 100644 --- a/vp8/encoder/ethreading.c +++ b/vp8/encoder/ethreading.c @@ -26,12 +26,13 @@ static THREAD_FUNCTION thread_loopfilter(void *p_data) while (1) { - if (cpi->b_multi_threaded == 0) + if (protected_read(&cpi->mt_mutex, &cpi->b_multi_threaded) == 0) break; if (sem_wait(&cpi->h_event_start_lpf) == 0) { - if (cpi->b_multi_threaded == 0) /* we're shutting down */ + /* we're shutting down */ + if (protected_read(&cpi->mt_mutex, &cpi->b_multi_threaded) == 0) break; vp8_loopfilter_frame(cpi, cm); @@ -53,7 +54,7 @@ THREAD_FUNCTION thread_encoding_proc(void *p_data) while (1) { - if (cpi->b_multi_threaded == 0) + if (protected_read(&cpi->mt_mutex, &cpi->b_multi_threaded) == 0) break; if (sem_wait(&cpi->h_event_start_encoding[ithread]) == 0) @@ -72,9 +73,14 @@ THREAD_FUNCTION thread_encoding_proc(void *p_data) int *segment_counts = mbri->segment_counts; int *totalrate = &mbri->totalrate; - if (cpi->b_multi_threaded == 0) /* we're shutting down */ + /* we're shutting down */ + if (protected_read(&cpi->mt_mutex, &cpi->b_multi_threaded) == 0) break; + xd->mode_info_context = cm->mi + cm->mode_info_stride * + (ithread + 1); + xd->mode_info_stride = cm->mode_info_stride; + for (mb_row = ithread + 1; mb_row < cm->mb_rows; mb_row += (cpi->encoding_thread_count + 1)) { @@ -85,8 +91,8 @@ THREAD_FUNCTION thread_encoding_proc(void *p_data) int recon_y_stride = cm->yv12_fb[ref_fb_idx].y_stride; int recon_uv_stride = cm->yv12_fb[ref_fb_idx].uv_stride; int map_index = (mb_row * cm->mb_cols); - volatile const int *last_row_current_mb_col; - volatile int *current_mb_col = &cpi->mt_current_mb_col[mb_row]; + const int *last_row_current_mb_col; + int *current_mb_col = &cpi->mt_current_mb_col[mb_row]; #if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING) vp8_writer *w = &cpi->bc[1 + (mb_row % num_part)]; @@ -113,15 +119,14 @@ THREAD_FUNCTION thread_encoding_proc(void *p_data) /* for each macroblock col in image */ for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) { - *current_mb_col = mb_col - 1; + if (((mb_col - 1) % nsync) == 0) { + pthread_mutex_t *mutex = &cpi->pmutex[mb_row]; + protected_write(mutex, current_mb_col, mb_col - 1); + } - if ((mb_col & (nsync - 1)) == 0) - { - while (mb_col > (*last_row_current_mb_col - nsync)) - { - x86_pause_hint(); - thread_sleep(0); - } + if (mb_row && !(mb_col & (nsync - 1))) { + pthread_mutex_t *mutex = &cpi->pmutex[mb_row-1]; + sync_read(mutex, mb_col, last_row_current_mb_col, nsync); } #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING @@ -296,7 +301,8 @@ THREAD_FUNCTION thread_encoding_proc(void *p_data) xd->dst.u_buffer + 8, xd->dst.v_buffer + 8); - *current_mb_col = mb_col + nsync; + protected_write(&cpi->pmutex[mb_row], current_mb_col, + mb_col + nsync); /* this is to account for the border */ xd->mode_info_context++; @@ -473,9 +479,6 @@ void vp8cx_init_mbrthread_data(VP8_COMP *cpi, mb->partition_info = x->pi + x->e_mbd.mode_info_stride * (i + 1); - mbd->mode_info_context = cm->mi + x->e_mbd.mode_info_stride * (i + 1); - mbd->mode_info_stride = cm->mode_info_stride; - mbd->frame_type = cm->frame_type; mb->src = * cpi->Source; @@ -517,6 +520,8 @@ int vp8cx_create_encoder_threads(VP8_COMP *cpi) cpi->encoding_thread_count = 0; cpi->b_lpf_running = 0; + pthread_mutex_init(&cpi->mt_mutex, NULL); + if (cm->processor_core_count > 1 && cpi->oxcf.multi_threaded > 1) { int ithread; @@ -580,7 +585,7 @@ int vp8cx_create_encoder_threads(VP8_COMP *cpi) if(rc) { /* shutdown other threads */ - cpi->b_multi_threaded = 0; + protected_write(&cpi->mt_mutex, &cpi->b_multi_threaded, 0); for(--ithread; ithread >= 0; ithread--) { pthread_join(cpi->h_encoding_thread[ithread], 0); @@ -594,6 +599,8 @@ int vp8cx_create_encoder_threads(VP8_COMP *cpi) vpx_free(cpi->mb_row_ei); vpx_free(cpi->en_thread_data); + pthread_mutex_destroy(&cpi->mt_mutex); + return -1; } @@ -611,7 +618,7 @@ int vp8cx_create_encoder_threads(VP8_COMP *cpi) if(rc) { /* shutdown other threads */ - cpi->b_multi_threaded = 0; + protected_write(&cpi->mt_mutex, &cpi->b_multi_threaded, 0); for(--ithread; ithread >= 0; ithread--) { sem_post(&cpi->h_event_start_encoding[ithread]); @@ -628,6 +635,8 @@ int vp8cx_create_encoder_threads(VP8_COMP *cpi) vpx_free(cpi->mb_row_ei); vpx_free(cpi->en_thread_data); + pthread_mutex_destroy(&cpi->mt_mutex); + return -2; } } @@ -637,10 +646,10 @@ int vp8cx_create_encoder_threads(VP8_COMP *cpi) void vp8cx_remove_encoder_threads(VP8_COMP *cpi) { - if (cpi->b_multi_threaded) + if (protected_read(&cpi->mt_mutex, &cpi->b_multi_threaded)) { /* shutdown other threads */ - cpi->b_multi_threaded = 0; + protected_write(&cpi->mt_mutex, &cpi->b_multi_threaded, 0); { int i; @@ -666,5 +675,6 @@ void vp8cx_remove_encoder_threads(VP8_COMP *cpi) vpx_free(cpi->mb_row_ei); vpx_free(cpi->en_thread_data); } + pthread_mutex_destroy(&cpi->mt_mutex); } #endif |