shithub: libvpx

Download patch

ref: ea392d47142bfa6d2decf622487ca39b9d92e6f2
parent: 282b58006b97b0b35c3a20c55545251161aa5f35
author: Attila Nagy <attilanagy@google.com>
date: Tue May 22 10:19:10 EDT 2012

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

--- a/vp8/common/loopfilter.c
+++ b/vp8/common/loopfilter.c
@@ -196,17 +196,13 @@
     }
 }
 
-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;
--- a/vp8/common/loopfilter.h
+++ b/vp8/common/loopfilter.h
@@ -76,7 +76,8 @@
                                 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,
--- a/vp8/decoder/onyxd_if.c
+++ b/vp8/decoder/onyxd_if.c
@@ -471,7 +471,7 @@
         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);
     }
--- a/vp8/encoder/onyx_if.c
+++ b/vp8/encoder/onyx_if.c
@@ -3117,6 +3117,8 @@
 
 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 @@
         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 @@
 
     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);
--