diff options
author | Ritu Baldwa <ritu.baldwa@ittiam.com> | 2019-01-23 09:39:06 +0530 |
---|---|---|
committer | Venkatarama NG. Avadhani <venkatarama.avadhani@ittiam.com> | 2019-01-30 09:40:29 +0530 |
commit | c1b024b48861dcd788a3419e556eb31bb727d5d1 (patch) | |
tree | f1c8466eacb70042a736e96f6102e3472422cffe /vp9/decoder/vp9_decoder.c | |
parent | 5818014b691c1dc20f3597bbcbf165782b54eacb (diff) | |
download | libvpx-c1b024b48861dcd788a3419e556eb31bb727d5d1.tar libvpx-c1b024b48861dcd788a3419e556eb31bb727d5d1.tar.gz libvpx-c1b024b48861dcd788a3419e556eb31bb727d5d1.tar.bz2 libvpx-c1b024b48861dcd788a3419e556eb31bb727d5d1.zip |
Modify map read/write to sync logic in row_mt case
Adds conditional wait/signal instead of sched_yield.
Change-Id: I49a760eacdd6b6ac690e797ea5f10febf6a1a084
Diffstat (limited to 'vp9/decoder/vp9_decoder.c')
-rw-r--r-- | vp9/decoder/vp9_decoder.c | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/vp9/decoder/vp9_decoder.c b/vp9/decoder/vp9_decoder.c index cd3750166..0aed3d717 100644 --- a/vp9/decoder/vp9_decoder.c +++ b/vp9/decoder/vp9_decoder.c @@ -56,10 +56,34 @@ static void vp9_dec_setup_mi(VP9_COMMON *cm) { } void vp9_dec_alloc_row_mt_mem(RowMTWorkerData *row_mt_worker_data, - VP9_COMMON *cm, int num_sbs, int max_threads) { + VP9_COMMON *cm, int num_sbs, int max_threads, + int num_jobs) { int plane; const size_t dqcoeff_size = (num_sbs << DQCOEFFS_PER_SB_LOG2) * sizeof(*row_mt_worker_data->dqcoeff[0]); + row_mt_worker_data->num_jobs = num_jobs; +#if CONFIG_MULTITHREAD + { + int i; + CHECK_MEM_ERROR( + cm, row_mt_worker_data->recon_sync_mutex, + vpx_malloc(sizeof(*row_mt_worker_data->recon_sync_mutex) * num_jobs)); + if (row_mt_worker_data->recon_sync_mutex) { + for (i = 0; i < num_jobs; ++i) { + pthread_mutex_init(&row_mt_worker_data->recon_sync_mutex[i], NULL); + } + } + + CHECK_MEM_ERROR( + cm, row_mt_worker_data->recon_sync_cond, + vpx_malloc(sizeof(*row_mt_worker_data->recon_sync_cond) * num_jobs)); + if (row_mt_worker_data->recon_sync_cond) { + for (i = 0; i < num_jobs; ++i) { + pthread_cond_init(&row_mt_worker_data->recon_sync_cond[i], NULL); + } + } + } +#endif row_mt_worker_data->num_sbs = num_sbs; for (plane = 0; plane < 3; ++plane) { CHECK_MEM_ERROR(cm, row_mt_worker_data->dqcoeff[plane], @@ -87,6 +111,23 @@ void vp9_dec_alloc_row_mt_mem(RowMTWorkerData *row_mt_worker_data, void vp9_dec_free_row_mt_mem(RowMTWorkerData *row_mt_worker_data) { if (row_mt_worker_data != NULL) { int plane; +#if CONFIG_MULTITHREAD + int i; + if (row_mt_worker_data->recon_sync_mutex != NULL) { + for (i = 0; i < row_mt_worker_data->num_jobs; ++i) { + pthread_mutex_destroy(&row_mt_worker_data->recon_sync_mutex[i]); + } + vpx_free(row_mt_worker_data->recon_sync_mutex); + row_mt_worker_data->recon_sync_mutex = NULL; + } + if (row_mt_worker_data->recon_sync_cond != NULL) { + for (i = 0; i < row_mt_worker_data->num_jobs; ++i) { + pthread_cond_destroy(&row_mt_worker_data->recon_sync_cond[i]); + } + vpx_free(row_mt_worker_data->recon_sync_cond); + row_mt_worker_data->recon_sync_cond = NULL; + } +#endif for (plane = 0; plane < 3; ++plane) { vpx_free(row_mt_worker_data->eob[plane]); row_mt_worker_data->eob[plane] = NULL; @@ -193,8 +234,7 @@ void vp9_decoder_remove(VP9Decoder *pbi) { vp9_jobq_deinit(&pbi->row_mt_worker_data->jobq); vpx_free(pbi->row_mt_worker_data->jobq_buf); #if CONFIG_MULTITHREAD - pthread_mutex_destroy(&pbi->row_mt_worker_data->recon_mutex); - pthread_mutex_destroy(&pbi->row_mt_worker_data->map_mutex); + pthread_mutex_destroy(&pbi->row_mt_worker_data->recon_done_mutex); #endif } vpx_free(pbi->row_mt_worker_data); |