diff options
Diffstat (limited to 'vp9/encoder')
-rw-r--r-- | vp9/encoder/vp9_encoder.c | 16 | ||||
-rw-r--r-- | vp9/encoder/vp9_encoder.h | 6 | ||||
-rw-r--r-- | vp9/encoder/vp9_ethread.c | 20 | ||||
-rw-r--r-- | vp9/encoder/vp9_picklpf.c | 10 |
4 files changed, 36 insertions, 16 deletions
diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index 7cfe0de90..35fea57f5 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -1786,7 +1786,7 @@ void vp9_remove_compressor(VP9_COMP *cpi) { for (t = 0; t < cpi->num_workers; ++t) { VP9Worker *const worker = &cpi->workers[t]; - EncWorkerData *const thread_data = (EncWorkerData*)worker->data1; + EncWorkerData *const thread_data = &cpi->tile_thr_data[t]; // Deallocate allocated threads. vp9_get_worker_interface()->end(worker); @@ -1797,11 +1797,13 @@ void vp9_remove_compressor(VP9_COMP *cpi) { vp9_free_pc_tree(thread_data->td); vpx_free(thread_data->td); } - - vpx_free(worker->data1); } + vpx_free(cpi->tile_thr_data); vpx_free(cpi->workers); + if (cpi->num_workers > 1) + vp9_loop_filter_dealloc(&cpi->lf_row_sync); + dealloc_compressor_data(cpi); for (i = 0; i < sizeof(cpi->mbgraph_stats) / @@ -2437,7 +2439,13 @@ static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) { } if (lf->filter_level > 0) { - vp9_loop_filter_frame(cm->frame_to_show, cm, xd, lf->filter_level, 0, 0); + if (cpi->num_workers > 1) + vp9_loop_filter_frame_mt(cm->frame_to_show, cm, xd->plane, + lf->filter_level, 0, 0, + cpi->workers, cpi->num_workers, + &cpi->lf_row_sync); + else + vp9_loop_filter_frame(cm->frame_to_show, cm, xd, lf->filter_level, 0, 0); } vp9_extend_frame_inner_borders(cm->frame_to_show); diff --git a/vp9/encoder/vp9_encoder.h b/vp9/encoder/vp9_encoder.h index a41284af0..cf269c108 100644 --- a/vp9/encoder/vp9_encoder.h +++ b/vp9/encoder/vp9_encoder.h @@ -19,6 +19,7 @@ #include "vp9/common/vp9_ppflags.h" #include "vp9/common/vp9_entropymode.h" +#include "vp9/common/vp9_loopfilter_thread.h" #include "vp9/common/vp9_onyxc_int.h" #include "vp9/common/vp9_thread.h" @@ -36,6 +37,7 @@ #include "vp9/encoder/vp9_svc_layercontext.h" #include "vp9/encoder/vp9_tokenize.h" #include "vp9/encoder/vp9_variance.h" + #if CONFIG_VP9_TEMPORAL_DENOISING #include "vp9/encoder/vp9_denoiser.h" #endif @@ -262,6 +264,8 @@ typedef struct ThreadData { PC_TREE *pc_root; } ThreadData; +struct EncWorkerData; + typedef struct VP9_COMP { QUANTS quants; ThreadData td; @@ -447,6 +451,8 @@ typedef struct VP9_COMP { // Multi-threading int num_workers; VP9Worker *workers; + struct EncWorkerData *tile_thr_data; + VP9LfSync lf_row_sync; } VP9_COMP; void vp9_initialize_enc(void); diff --git a/vp9/encoder/vp9_ethread.c b/vp9/encoder/vp9_ethread.c index 9ee32366c..12fb4d107 100644 --- a/vp9/encoder/vp9_ethread.c +++ b/vp9/encoder/vp9_ethread.c @@ -167,16 +167,15 @@ void vp9_encode_tiles_mt(VP9_COMP *cpi) { CHECK_MEM_ERROR(cm, cpi->workers, vpx_malloc(num_workers * sizeof(*cpi->workers))); + CHECK_MEM_ERROR(cm, cpi->tile_thr_data, + vpx_calloc(num_workers, sizeof(*cpi->tile_thr_data))); + for (i = 0; i < num_workers; i++) { VP9Worker *const worker = &cpi->workers[i]; - EncWorkerData *thread_data; + EncWorkerData *thread_data = &cpi->tile_thr_data[i]; ++cpi->num_workers; - winterface->init(worker); - CHECK_MEM_ERROR(cm, worker->data1, - (EncWorkerData*)vpx_calloc(1, sizeof(EncWorkerData))); - thread_data = (EncWorkerData*)worker->data1; if (i < num_workers - 1) { thread_data->cpi = cpi; @@ -205,17 +204,18 @@ void vp9_encode_tiles_mt(VP9_COMP *cpi) { thread_data->td = &cpi->td; } - // data2 is unused. - worker->data2 = NULL; - winterface->sync(worker); - worker->hook = (VP9WorkerHook)enc_worker_hook; } } for (i = 0; i < num_workers; i++) { VP9Worker *const worker = &cpi->workers[i]; - EncWorkerData *const thread_data = (EncWorkerData*)worker->data1; + EncWorkerData *thread_data; + + worker->hook = (VP9WorkerHook)enc_worker_hook; + worker->data1 = &cpi->tile_thr_data[i]; + worker->data2 = NULL; + thread_data = (EncWorkerData*)worker->data1; // Before encoding a frame, copy the thread data from cpi. thread_data->td->mb = cpi->td.mb; diff --git a/vp9/encoder/vp9_picklpf.c b/vp9/encoder/vp9_picklpf.c index 01cc519f9..a95f0f46d 100644 --- a/vp9/encoder/vp9_picklpf.c +++ b/vp9/encoder/vp9_picklpf.c @@ -39,8 +39,14 @@ static int64_t try_filter_frame(const YV12_BUFFER_CONFIG *sd, VP9_COMMON *const cm = &cpi->common; int64_t filt_err; - vp9_loop_filter_frame(cm->frame_to_show, cm, &cpi->td.mb.e_mbd, filt_level, 1, - partial_frame); + if (cpi->num_workers > 1) + vp9_loop_filter_frame_mt(cm->frame_to_show, cm, cpi->td.mb.e_mbd.plane, + filt_level, 1, partial_frame, + cpi->workers, cpi->num_workers, &cpi->lf_row_sync); + else + vp9_loop_filter_frame(cm->frame_to_show, cm, &cpi->td.mb.e_mbd, filt_level, + 1, partial_frame); + #if CONFIG_VP9_HIGHBITDEPTH if (cm->use_highbitdepth) { filt_err = vp9_highbd_get_y_sse(sd, cm->frame_to_show); |