]> granicus.if.org Git - libvpx/commitdiff
Fix to resize logic for 1 pass mode.
authorMarco <marpan@chromium.org>
Tue, 14 Jul 2015 23:22:10 +0000 (16:22 -0700)
committerMarco <marpan@chromium.org>
Tue, 14 Jul 2015 23:23:57 +0000 (16:23 -0700)
Proper use/update of resize_state and resize_pending to constrain
the total amount of downsizing to be at most one scale down, for now.

Change-Id: Id18fc32499f2fbdbec16728dcdc9e4eac09098f0

vp9/encoder/vp9_encoder.c
vp9/encoder/vp9_ratectrl.c

index 43d459eebf49c4287e9a28ffc57f5064138b17b2..432f916e28ea8e31bce57b02dec6a07f82060ab3 100644 (file)
@@ -3061,17 +3061,17 @@ static void set_frame_size(VP9_COMP *cpi) {
       oxcf->rc_mode == VPX_CBR &&
       !cpi->use_svc &&
       oxcf->resize_mode == RESIZE_DYNAMIC) {
-      if (cpi->resize_state == 1) {
+      if (cpi->resize_pending == 1) {
         oxcf->scaled_frame_width =
             (cm->width * cpi->resize_scale_num) / cpi->resize_scale_den;
         oxcf->scaled_frame_height =
             (cm->height * cpi->resize_scale_num) /cpi->resize_scale_den;
-      } else if (cpi->resize_state == -1) {
+      } else if (cpi->resize_pending == -1) {
         // Go back up to original size.
         oxcf->scaled_frame_width = oxcf->width;
         oxcf->scaled_frame_height = oxcf->height;
       }
-      if (cpi->resize_state != 0) {
+      if (cpi->resize_pending != 0) {
         // There has been a change in frame size.
         vp9_set_size_literal(cpi,
                              oxcf->scaled_frame_width,
index 926afe1c5f70f728f21fc522e4a26aa98d51d7dd..a6ad9ae2ca2b906d0e9a697533ad8be2bb678b2c 100644 (file)
@@ -1355,9 +1355,11 @@ void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) {
   }
 
   // Trigger the resizing of the next frame if it is scaled.
-  cpi->resize_pending =
-      rc->next_frame_size_selector != rc->frame_size_selector;
-  rc->frame_size_selector = rc->next_frame_size_selector;
+  if (oxcf->pass != 0) {
+    cpi->resize_pending =
+        rc->next_frame_size_selector != rc->frame_size_selector;
+    rc->frame_size_selector = rc->next_frame_size_selector;
+  }
 }
 
 void vp9_rc_postencode_update_drop_frame(VP9_COMP *cpi) {
@@ -1632,9 +1634,9 @@ void vp9_rc_get_one_pass_cbr_params(VP9_COMP *cpi) {
 
   vp9_rc_set_frame_target(cpi, target);
   if (cpi->oxcf.resize_mode == RESIZE_DYNAMIC)
-    cpi->resize_state = vp9_resize_one_pass_cbr(cpi);
+    cpi->resize_pending = vp9_resize_one_pass_cbr(cpi);
   else
-    cpi->resize_state = 0;
+    cpi->resize_pending = 0;
 }
 
 int vp9_compute_qdelta(const RATE_CONTROL *rc, double qstart, double qtarget,
@@ -1826,9 +1828,11 @@ int vp9_resize_one_pass_cbr(VP9_COMP *cpi) {
       if (cpi->resize_state == 0 &&
           cpi->resize_buffer_underflow > (cpi->resize_count >> 3)) {
         resize_now = 1;
+        cpi->resize_state = 1;
       } else if (cpi->resize_state == 1 &&
                  avg_qp < 40 * cpi->rc.worst_quality / 100) {
         resize_now = -1;
+        cpi->resize_state = 0;
       }
       // Reset for next window measurement.
       cpi->resize_avg_qp = 0;