]> granicus.if.org Git - libvpx/commitdiff
No arf right before real scene cut.
authorPaul Wilkins <paulwilkins@google.com>
Fri, 3 Jan 2014 14:14:04 +0000 (14:14 +0000)
committerPaul Wilkins <paulwilkins@google.com>
Mon, 13 Jan 2014 11:35:02 +0000 (11:35 +0000)
To reduce pulsing we now allow an arf just before forced key frames
and at the end of a clip or section (which may be stitched to
another clip or section). However, this does not make sense for
key frames arising from real scene cuts.

Change from original patch reflects other recent changes in regard
to alignment of gf/arf and kf groups.

Change-Id: I074a91d1207e9b3e28085af982f6718aa599775f

vp9/encoder/vp9_firstpass.c

index 34f8a9442c279634ea41fb0287758ca1210c0087..812ffa96d43ed8916e7badb188c749df723a31c2 100644 (file)
@@ -1660,7 +1660,7 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
 
   // Don't allow a gf too near the next kf
   if ((cpi->rc.frames_to_key - i) < MIN_GF_INTERVAL) {
-    while (i < cpi->rc.frames_to_key) {
+    while (i < (cpi->rc.frames_to_key + !cpi->rc.next_key_frame_forced)) {
       i++;
 
       if (EOF == input_stats(&cpi->twopass, this_frame))
@@ -1695,6 +1695,9 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
   if (allow_alt_ref &&
       (i < cpi->oxcf.lag_in_frames) &&
       (i >= MIN_GF_INTERVAL) &&
+      // for real scene cuts (not forced kfs) dont allow arf very near kf.
+      (cpi->rc.next_key_frame_forced ||
+        (i <= (cpi->rc.frames_to_key - MIN_GF_INTERVAL))) &&
       ((next_frame.pcnt_inter > 0.75) ||
        (next_frame.pcnt_second_ref > 0.5)) &&
       ((mv_in_out_accumulator / (double)i > -0.2) ||
@@ -2368,6 +2371,8 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
       input_stats(&cpi->twopass, &tmp_frame);
     }
     cpi->rc.next_key_frame_forced = 1;
+  } else if (cpi->twopass.stats_in == cpi->twopass.stats_in_end) {
+    cpi->rc.next_key_frame_forced = 1;
   } else {
     cpi->rc.next_key_frame_forced = 0;
   }