]> granicus.if.org Git - libvpx/commitdiff
Fix another multithreaded encoder loopfilter race condition
authorAttila Nagy <attilanagy@google.com>
Tue, 22 May 2012 11:19:10 +0000 (14:19 +0300)
committerJohn Koleszar <jkoleszar@google.com>
Wed, 23 May 2012 20:50:59 +0000 (13:50 -0700)
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
vp8/common/loopfilter.h
vp8/decoder/onyxd_if.c
vp8/encoder/onyx_if.c

index 3f05efe812381d9c413b54b635236e2cac4f6ac3..b9ac0ff3e806d9e00c6414d5724489942d2df684 100644 (file)
@@ -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;
index 0fa83750b8801c89378d63b914ca7ce81c81e97f..0497271b021e907b1df271e7994a9a0ef715f0ad 100644 (file)
@@ -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,
index c59ce259fc6a96d41a09b723c69af52f142e363c..2a9a11b4a3b001ecc4a7484f071a3bbb36e4c199 100644 (file)
@@ -468,7 +468,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);
     }
index b7699aeb731a04884fc7b1ffcf72618a8b9bfb97..0f4bc1d1ac7900d6fef37e49fa4372f5ce2dc1f7 100644 (file)
@@ -3114,6 +3114,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;
@@ -3131,6 +3133,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);
     }
@@ -3142,8 +3149,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);