]> granicus.if.org Git - libvpx/commitdiff
vp9-rtc: Move noise estimation to after scene change detection
authorMarco Paniconi <marpan@google.com>
Mon, 1 Apr 2019 21:18:54 +0000 (14:18 -0700)
committerMarco Paniconi <marpan@google.com>
Tue, 2 Apr 2019 16:14:17 +0000 (09:14 -0700)
This allows to use result from scene chage detection to exclude
the current frame from noise estimation analysis if the frame has
scene/ big content change (i.e., high_source_sad flag is set).

The behavior change for noise estimation may be small in practice,
since in the current code, a scene change would have blocks excluded
due to thresh_sum_diff, and the subsequent frames would also be mostly
excluded due to (past) non-zero motion vectors (until the
consec_zeromv > thresh_consec_zeromv is satisfied again).
But its better to completely exclude current frame if its a scene change.

Change-Id: Icd08bab7a8e1b994c7accced89697e0b2d7f50c5

vp9/encoder/vp9_encoder.c
vp9/encoder/vp9_noise_estimate.c

index 03e8ed674983f1af01e1d1b3deff52b9a342880b..ada1a3934351624ced28c121cf1b247b344805f4 100644 (file)
@@ -3839,7 +3839,6 @@ static int encode_without_recode_loop(VP9_COMP *cpi, size_t *size,
   if (cpi->oxcf.noise_sensitivity > 0 && cpi->use_svc)
     vp9_denoiser_reset_on_first_frame(cpi);
 #endif
-  vp9_update_noise_estimate(cpi);
 
   // Scene detection is always used for VBR mode or screen-content case.
   // For other cases (e.g., CBR mode) use it for 5 <= speed < 8 for now
@@ -3871,6 +3870,8 @@ static int encode_without_recode_loop(VP9_COMP *cpi, size_t *size,
     }
   }
 
+  vp9_update_noise_estimate(cpi);
+
   // For 1 pass CBR, check if we are dropping this frame.
   // Never drop on key frame, if base layer is key for svc,
   // on scene change, or if superframe has layer sync.
index b605003469feb9a5f1782c1204533b764acdb8cf..4bc81986e2a11bd4043538bbc2599a144d66cb9a 100644 (file)
@@ -209,8 +209,11 @@ void vp9_update_noise_estimate(VP9_COMP *const cpi) {
           // Only consider blocks that are likely steady background. i.e, have
           // been encoded as zero/low motion x (= thresh_consec_zeromv) frames
           // in a row. consec_zero_mv[] defined for 8x8 blocks, so consider all
-          // 4 sub-blocks for 16x16 block. Also, avoid skin blocks.
-          if (frame_low_motion && consec_zeromv > thresh_consec_zeromv) {
+          // 4 sub-blocks for 16x16 block. And exclude this frame if
+          // high_source_sad is true (i.e., scene/content change).
+          if (frame_low_motion && consec_zeromv > thresh_consec_zeromv &&
+              !cpi->rc.high_source_sad &&
+              !cpi->svc.high_source_sad_superframe) {
             int is_skin = 0;
             if (cpi->use_skin_detection) {
               is_skin =