diff options
author | hkuang <hkuang@google.com> | 2015-03-23 16:50:15 -0700 |
---|---|---|
committer | Gerrit Code Review <gerrit@gerrit.golo.chromium.org> | 2015-03-23 16:50:15 -0700 |
commit | cd1d40ff5d58dd62ea540b357f74be7fd9850880 (patch) | |
tree | f45190711cdba141e27d9d76bf078fe1ca7f7764 /vp9 | |
parent | f7bcce91afb858084cb006a3660330af0ad71bb6 (diff) | |
parent | b88dac8938106537460889e5eacaaafe59715048 (diff) | |
download | libvpx-cd1d40ff5d58dd62ea540b357f74be7fd9850880.tar libvpx-cd1d40ff5d58dd62ea540b357f74be7fd9850880.tar.gz libvpx-cd1d40ff5d58dd62ea540b357f74be7fd9850880.tar.bz2 libvpx-cd1d40ff5d58dd62ea540b357f74be7fd9850880.zip |
Merge "Safely free all the frame buffers after all the workers finish the work."
Diffstat (limited to 'vp9')
-rw-r--r-- | vp9/common/vp9_alloccommon.c | 8 | ||||
-rw-r--r-- | vp9/common/vp9_alloccommon.h | 4 | ||||
-rw-r--r-- | vp9/common/vp9_onyxc_int.h | 2 | ||||
-rw-r--r-- | vp9/encoder/vp9_encoder.c | 9 | ||||
-rw-r--r-- | vp9/vp9_dx_iface.c | 7 |
5 files changed, 23 insertions, 7 deletions
diff --git a/vp9/common/vp9_alloccommon.c b/vp9/common/vp9_alloccommon.c index e209788c3..20cf68618 100644 --- a/vp9/common/vp9_alloccommon.c +++ b/vp9/common/vp9_alloccommon.c @@ -83,8 +83,7 @@ static void free_seg_map(VP9_COMMON *cm) { } } -void vp9_free_ref_frame_buffers(VP9_COMMON *cm) { - BufferPool *const pool = cm->buffer_pool; +void vp9_free_ref_frame_buffers(BufferPool *pool) { int i; for (i = 0; i < FRAME_BUFFERS; ++i) { @@ -97,10 +96,14 @@ void vp9_free_ref_frame_buffers(VP9_COMMON *cm) { pool->frame_bufs[i].mvs = NULL; vp9_free_frame_buffer(&pool->frame_bufs[i].buf); } +} +void vp9_free_postproc_buffers(VP9_COMMON *cm) { #if CONFIG_VP9_POSTPROC vp9_free_frame_buffer(&cm->post_proc_buffer); vp9_free_frame_buffer(&cm->post_proc_buffer_int); +#else + (void)cm; #endif } @@ -142,7 +145,6 @@ int vp9_alloc_context_buffers(VP9_COMMON *cm, int width, int height) { } void vp9_remove_common(VP9_COMMON *cm) { - vp9_free_ref_frame_buffers(cm); vp9_free_context_buffers(cm); vpx_free(cm->fc); diff --git a/vp9/common/vp9_alloccommon.h b/vp9/common/vp9_alloccommon.h index d82397fa3..c0e51a6ce 100644 --- a/vp9/common/vp9_alloccommon.h +++ b/vp9/common/vp9_alloccommon.h @@ -19,6 +19,7 @@ extern "C" { #endif struct VP9Common; +struct BufferPool; void vp9_remove_common(struct VP9Common *cm); @@ -26,7 +27,8 @@ int vp9_alloc_context_buffers(struct VP9Common *cm, int width, int height); void vp9_init_context_buffers(struct VP9Common *cm); void vp9_free_context_buffers(struct VP9Common *cm); -void vp9_free_ref_frame_buffers(struct VP9Common *cm); +void vp9_free_ref_frame_buffers(struct BufferPool *pool); +void vp9_free_postproc_buffers(struct VP9Common *cm); int vp9_alloc_state_buffers(struct VP9Common *cm, int width, int height); void vp9_free_state_buffers(struct VP9Common *cm); diff --git a/vp9/common/vp9_onyxc_int.h b/vp9/common/vp9_onyxc_int.h index 7ca24a56e..62e4ee7a5 100644 --- a/vp9/common/vp9_onyxc_int.h +++ b/vp9/common/vp9_onyxc_int.h @@ -88,7 +88,7 @@ typedef struct { int col; } RefCntBuffer; -typedef struct { +typedef struct BufferPool { // Protect BufferPool from being accessed by several FrameWorkers at // the same time during frame parallel decode. // TODO(hkuang): Try to use atomic variable instead of locking the whole pool. diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index 273fcf56b..fc05811a3 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -314,7 +314,10 @@ static void dealloc_compressor_data(VP9_COMP *cpi) { vpx_free(cpi->active_map.map); cpi->active_map.map = NULL; - vp9_free_ref_frame_buffers(cm); + vp9_free_ref_frame_buffers(cm->buffer_pool); +#if CONFIG_VP9_POSTPROC + vp9_free_postproc_buffers(cm); +#endif vp9_free_context_buffers(cm); vp9_free_frame_buffer(&cpi->last_frame_uf); @@ -1919,6 +1922,10 @@ void vp9_remove_compressor(VP9_COMP *cpi) { #endif vp9_remove_common(cm); + vp9_free_ref_frame_buffers(cm->buffer_pool); +#if CONFIG_VP9_POSTPROC + vp9_free_postproc_buffers(cm); +#endif vpx_free(cpi); #if CONFIG_VP9_TEMPORAL_DENOISING diff --git a/vp9/vp9_dx_iface.c b/vp9/vp9_dx_iface.c index 9e4c1a5c4..7350cb392 100644 --- a/vp9/vp9_dx_iface.c +++ b/vp9/vp9_dx_iface.c @@ -116,6 +116,9 @@ static vpx_codec_err_t decoder_destroy(vpx_codec_alg_priv_t *ctx) { (FrameWorkerData *)worker->data1; vp9_get_worker_interface()->end(worker); vp9_remove_common(&frame_worker_data->pbi->common); +#if CONFIG_VP9_POSTPROC + vp9_free_postproc_buffers(&frame_worker_data->pbi->common); +#endif vp9_decoder_remove(frame_worker_data->pbi); vpx_free(frame_worker_data->scratch_buffer); #if CONFIG_MULTITHREAD @@ -129,8 +132,10 @@ static vpx_codec_err_t decoder_destroy(vpx_codec_alg_priv_t *ctx) { #endif } - if (ctx->buffer_pool) + if (ctx->buffer_pool) { + vp9_free_ref_frame_buffers(ctx->buffer_pool); vp9_free_internal_frame_buffers(&ctx->buffer_pool->int_frame_buffers); + } vpx_free(ctx->frame_workers); vpx_free(ctx->buffer_pool); |