From ea392d47142bfa6d2decf622487ca39b9d92e6f2 Mon Sep 17 00:00:00 2001 From: Attila Nagy Date: Tue, 22 May 2012 14:19:10 +0300 Subject: [PATCH] Fix another multithreaded encoder loopfilter race condition After a key frame encoding, the frame type could change while filtering is still going on. Pass the frame type as parameter to the loopfilter function and don't read it from common storage. vp8cx_set_alt_lf_level has to be done before packing the stream. Currently alt_lf_level is not used so there hasn't been any visible problem here. Change-Id: Ia114162158cd833c2b16e3b89303cc9c91f19165 --- vp8/common/loopfilter.c | 10 +++------- vp8/common/loopfilter.h | 3 ++- vp8/decoder/onyxd_if.c | 2 +- vp8/encoder/onyx_if.c | 10 ++++++++-- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/vp8/common/loopfilter.c b/vp8/common/loopfilter.c index 3f05efe81..b9ac0ff3e 100644 --- a/vp8/common/loopfilter.c +++ b/vp8/common/loopfilter.c @@ -196,18 +196,14 @@ void vp8_loop_filter_frame_init(VP8_COMMON *cm, } } -void vp8_loop_filter_frame -( - VP8_COMMON *cm, - MACROBLOCKD *mbd -) +void vp8_loop_filter_frame(VP8_COMMON *cm, + MACROBLOCKD *mbd, + int frame_type) { YV12_BUFFER_CONFIG *post = cm->frame_to_show; loop_filter_info_n *lfi_n = &cm->lf_info; loop_filter_info lfi; - FRAME_TYPE frame_type = cm->frame_type; - int mb_row; int mb_col; int mb_rows = cm->mb_rows; diff --git a/vp8/common/loopfilter.h b/vp8/common/loopfilter.h index 0fa83750b..0497271b0 100644 --- a/vp8/common/loopfilter.h +++ b/vp8/common/loopfilter.h @@ -76,7 +76,8 @@ void vp8_loop_filter_frame_init(struct VP8Common *cm, struct macroblockd *mbd, int default_filt_lvl); -void vp8_loop_filter_frame(struct VP8Common *cm, struct macroblockd *mbd); +void vp8_loop_filter_frame(struct VP8Common *cm, struct macroblockd *mbd, + int frame_type); void vp8_loop_filter_partial_frame(struct VP8Common *cm, struct macroblockd *mbd, diff --git a/vp8/decoder/onyxd_if.c b/vp8/decoder/onyxd_if.c index 50d609d6e..e9d1a560f 100644 --- a/vp8/decoder/onyxd_if.c +++ b/vp8/decoder/onyxd_if.c @@ -471,7 +471,7 @@ int vp8dx_receive_compressed_data(VP8D_COMP *pbi, unsigned long size, const unsi if(cm->filter_level) { /* Apply the loop filter if appropriate. */ - vp8_loop_filter_frame(cm, &pbi->mb); + vp8_loop_filter_frame(cm, &pbi->mb, cm->frame_type); } vp8_yv12_extend_frame_borders(cm->frame_to_show); } diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c index 5f2391545..a201549b3 100644 --- a/vp8/encoder/onyx_if.c +++ b/vp8/encoder/onyx_if.c @@ -3117,6 +3117,8 @@ static void update_reference_frames(VP8_COMMON *cm) void vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm) { + const FRAME_TYPE frame_type = cm->frame_type; + if (cm->no_lpf) { cm->filter_level = 0; @@ -3134,6 +3136,11 @@ void vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm) else vp8cx_pick_filter_level(cpi->Source, cpi); + if (cm->filter_level > 0) + { + vp8cx_set_alt_lf_level(cpi, cm->filter_level); + } + vpx_usec_timer_mark(&timer); cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer); } @@ -3145,8 +3152,7 @@ void vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm) if (cm->filter_level > 0) { - vp8cx_set_alt_lf_level(cpi, cm->filter_level); - vp8_loop_filter_frame(cm, &cpi->mb.e_mbd); + vp8_loop_filter_frame(cm, &cpi->mb.e_mbd, frame_type); } vp8_yv12_extend_frame_borders(cm->frame_to_show);