media/libvpx/vp9/encoder/vp9_ratectrl.c

Thu, 15 Jan 2015 15:59:08 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:59:08 +0100
branch
TOR_BUG_9701
changeset 10
ac0c01689b40
permissions
-rw-r--r--

Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 /*
     2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
     3  *
     4  *  Use of this source code is governed by a BSD-style license
     5  *  that can be found in the LICENSE file in the root of the source
     6  *  tree. An additional intellectual property rights grant can be found
     7  *  in the file PATENTS.  All contributing project authors may
     8  *  be found in the AUTHORS file in the root of the source tree.
     9  */
    12 #include <stdlib.h>
    13 #include <stdio.h>
    14 #include <string.h>
    15 #include <limits.h>
    16 #include <assert.h>
    17 #include <math.h>
    19 #include "vp9/common/vp9_alloccommon.h"
    20 #include "vp9/common/vp9_common.h"
    21 #include "vp9/encoder/vp9_ratectrl.h"
    22 #include "vp9/common/vp9_entropymode.h"
    23 #include "vpx_mem/vpx_mem.h"
    24 #include "vp9/common/vp9_systemdependent.h"
    25 #include "vp9/encoder/vp9_encodemv.h"
    26 #include "vp9/common/vp9_quant_common.h"
    27 #include "vp9/common/vp9_seg_common.h"
    29 #define MIN_BPB_FACTOR 0.005
    30 #define MAX_BPB_FACTOR 50
    32 // Bits Per MB at different Q (Multiplied by 512)
    33 #define BPER_MB_NORMBITS    9
    35 static const unsigned int prior_key_frame_weight[KEY_FRAME_CONTEXT] =
    36     { 1, 2, 3, 4, 5 };
    38 // These functions use formulaic calculations to make playing with the
    39 // quantizer tables easier. If necessary they can be replaced by lookup
    40 // tables if and when things settle down in the experimental bitstream
    41 double vp9_convert_qindex_to_q(int qindex) {
    42   // Convert the index to a real Q value (scaled down to match old Q values)
    43   return vp9_ac_quant(qindex, 0) / 4.0;
    44 }
    46 int vp9_gfboost_qadjust(int qindex) {
    47   const double q = vp9_convert_qindex_to_q(qindex);
    48   return (int)((0.00000828 * q * q * q) +
    49                (-0.0055 * q * q) +
    50                (1.32 * q) + 79.3);
    51 }
    53 static int kfboost_qadjust(int qindex) {
    54   const double q = vp9_convert_qindex_to_q(qindex);
    55   return (int)((0.00000973 * q * q * q) +
    56                (-0.00613 * q * q) +
    57                (1.316 * q) + 121.2);
    58 }
    60 int vp9_bits_per_mb(FRAME_TYPE frame_type, int qindex,
    61                     double correction_factor) {
    62   const double q = vp9_convert_qindex_to_q(qindex);
    63   int enumerator = frame_type == KEY_FRAME ? 3300000 : 2250000;
    65   // q based adjustment to baseline enumerator
    66   enumerator += (int)(enumerator * q) >> 12;
    67   return (int)(0.5 + (enumerator * correction_factor / q));
    68 }
    70 void vp9_save_coding_context(VP9_COMP *cpi) {
    71   CODING_CONTEXT *const cc = &cpi->coding_context;
    72   VP9_COMMON *cm = &cpi->common;
    74   // Stores a snapshot of key state variables which can subsequently be
    75   // restored with a call to vp9_restore_coding_context. These functions are
    76   // intended for use in a re-code loop in vp9_compress_frame where the
    77   // quantizer value is adjusted between loop iterations.
    78   vp9_copy(cc->nmvjointcost,  cpi->mb.nmvjointcost);
    79   vp9_copy(cc->nmvcosts,  cpi->mb.nmvcosts);
    80   vp9_copy(cc->nmvcosts_hp,  cpi->mb.nmvcosts_hp);
    82   vp9_copy(cc->segment_pred_probs, cm->seg.pred_probs);
    84   vpx_memcpy(cpi->coding_context.last_frame_seg_map_copy,
    85              cm->last_frame_seg_map, (cm->mi_rows * cm->mi_cols));
    87   vp9_copy(cc->last_ref_lf_deltas, cm->lf.last_ref_deltas);
    88   vp9_copy(cc->last_mode_lf_deltas, cm->lf.last_mode_deltas);
    90   cc->fc = cm->fc;
    91 }
    93 void vp9_restore_coding_context(VP9_COMP *cpi) {
    94   CODING_CONTEXT *const cc = &cpi->coding_context;
    95   VP9_COMMON *cm = &cpi->common;
    97   // Restore key state variables to the snapshot state stored in the
    98   // previous call to vp9_save_coding_context.
    99   vp9_copy(cpi->mb.nmvjointcost, cc->nmvjointcost);
   100   vp9_copy(cpi->mb.nmvcosts, cc->nmvcosts);
   101   vp9_copy(cpi->mb.nmvcosts_hp, cc->nmvcosts_hp);
   103   vp9_copy(cm->seg.pred_probs, cc->segment_pred_probs);
   105   vpx_memcpy(cm->last_frame_seg_map,
   106              cpi->coding_context.last_frame_seg_map_copy,
   107              (cm->mi_rows * cm->mi_cols));
   109   vp9_copy(cm->lf.last_ref_deltas, cc->last_ref_lf_deltas);
   110   vp9_copy(cm->lf.last_mode_deltas, cc->last_mode_lf_deltas);
   112   cm->fc = cc->fc;
   113 }
   115 void vp9_setup_key_frame(VP9_COMP *cpi) {
   116   VP9_COMMON *cm = &cpi->common;
   118   vp9_setup_past_independence(cm);
   120   // interval before next GF
   121   cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
   122   /* All buffers are implicitly updated on key frames. */
   123   cpi->refresh_golden_frame = 1;
   124   cpi->refresh_alt_ref_frame = 1;
   125 }
   127 void vp9_setup_inter_frame(VP9_COMP *cpi) {
   128   VP9_COMMON *cm = &cpi->common;
   129   if (cm->error_resilient_mode || cm->intra_only)
   130     vp9_setup_past_independence(cm);
   132   assert(cm->frame_context_idx < NUM_FRAME_CONTEXTS);
   133   cm->fc = cm->frame_contexts[cm->frame_context_idx];
   134 }
   136 static int estimate_bits_at_q(int frame_kind, int q, int mbs,
   137                               double correction_factor) {
   138   const int bpm = (int)(vp9_bits_per_mb(frame_kind, q, correction_factor));
   140   // Attempt to retain reasonable accuracy without overflow. The cutoff is
   141   // chosen such that the maximum product of Bpm and MBs fits 31 bits. The
   142   // largest Bpm takes 20 bits.
   143   return (mbs > (1 << 11)) ? (bpm >> BPER_MB_NORMBITS) * mbs
   144                            : (bpm * mbs) >> BPER_MB_NORMBITS;
   145 }
   148 static void calc_iframe_target_size(VP9_COMP *cpi) {
   149   // boost defaults to half second
   150   int target;
   152   // Clear down mmx registers to allow floating point in what follows
   153   vp9_clear_system_state();  // __asm emms;
   155   // New Two pass RC
   156   target = cpi->per_frame_bandwidth;
   158   if (cpi->oxcf.rc_max_intra_bitrate_pct) {
   159     int max_rate = cpi->per_frame_bandwidth
   160                  * cpi->oxcf.rc_max_intra_bitrate_pct / 100;
   162     if (target > max_rate)
   163       target = max_rate;
   164   }
   166   cpi->this_frame_target = target;
   167 }
   170 //  Do the best we can to define the parameters for the next GF based
   171 //  on what information we have available.
   172 //
   173 //  In this experimental code only two pass is supported
   174 //  so we just use the interval determined in the two pass code.
   175 static void calc_gf_params(VP9_COMP *cpi) {
   176   // Set the gf interval
   177   cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
   178 }
   181 static void calc_pframe_target_size(VP9_COMP *cpi) {
   182   const int min_frame_target = MAX(cpi->min_frame_bandwidth,
   183                                    cpi->av_per_frame_bandwidth >> 5);
   184   if (cpi->refresh_alt_ref_frame) {
   185     // Special alt reference frame case
   186     // Per frame bit target for the alt ref frame
   187     cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
   188     cpi->this_frame_target = cpi->per_frame_bandwidth;
   189   } else {
   190     // Normal frames (gf,and inter)
   191     cpi->this_frame_target = cpi->per_frame_bandwidth;
   192   }
   194   // Check that the total sum of adjustments is not above the maximum allowed.
   195   // That is, having allowed for the KF and GF penalties, we have not pushed
   196   // the current inter-frame target too low. If the adjustment we apply here is
   197   // not capable of recovering all the extra bits we have spent in the KF or GF,
   198   // then the remainder will have to be recovered over a longer time span via
   199   // other buffer / rate control mechanisms.
   200   if (cpi->this_frame_target < min_frame_target)
   201     cpi->this_frame_target = min_frame_target;
   203   if (!cpi->refresh_alt_ref_frame)
   204     // Note the baseline target data rate for this inter frame.
   205     cpi->inter_frame_target = cpi->this_frame_target;
   207   // Adjust target frame size for Golden Frames:
   208   if (cpi->frames_till_gf_update_due == 0) {
   209     const int q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME]
   210                                           : cpi->oxcf.fixed_q;
   212     cpi->refresh_golden_frame = 1;
   214     calc_gf_params(cpi);
   216     // If we are using alternate ref instead of gf then do not apply the boost
   217     // It will instead be applied to the altref update
   218     // Jims modified boost
   219     if (!cpi->source_alt_ref_active) {
   220       if (cpi->oxcf.fixed_q < 0) {
   221         // The spend on the GF is defined in the two pass code
   222         // for two pass encodes
   223         cpi->this_frame_target = cpi->per_frame_bandwidth;
   224       } else {
   225         cpi->this_frame_target =
   226           (estimate_bits_at_q(1, q, cpi->common.MBs, 1.0)
   227            * cpi->last_boost) / 100;
   228       }
   229     } else {
   230       // If there is an active ARF at this location use the minimum
   231       // bits on this frame even if it is a constructed arf.
   232       // The active maximum quantizer insures that an appropriate
   233       // number of bits will be spent if needed for constructed ARFs.
   234       cpi->this_frame_target = 0;
   235     }
   236   }
   237 }
   240 void vp9_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) {
   241   const int q = cpi->common.base_qindex;
   242   int correction_factor = 100;
   243   double rate_correction_factor;
   244   double adjustment_limit;
   246   int projected_size_based_on_q = 0;
   248   // Clear down mmx registers to allow floating point in what follows
   249   vp9_clear_system_state();  // __asm emms;
   251   if (cpi->common.frame_type == KEY_FRAME) {
   252     rate_correction_factor = cpi->key_frame_rate_correction_factor;
   253   } else {
   254     if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame)
   255       rate_correction_factor = cpi->gf_rate_correction_factor;
   256     else
   257       rate_correction_factor = cpi->rate_correction_factor;
   258   }
   260   // Work out how big we would have expected the frame to be at this Q given
   261   // the current correction factor.
   262   // Stay in double to avoid int overflow when values are large
   263   projected_size_based_on_q = estimate_bits_at_q(cpi->common.frame_type, q,
   264                                                  cpi->common.MBs,
   265                                                  rate_correction_factor);
   267   // Work out a size correction factor.
   268   if (projected_size_based_on_q > 0)
   269     correction_factor =
   270         (100 * cpi->projected_frame_size) / projected_size_based_on_q;
   272   // More heavily damped adjustment used if we have been oscillating either side
   273   // of target.
   274   switch (damp_var) {
   275     case 0:
   276       adjustment_limit = 0.75;
   277       break;
   278     case 1:
   279       adjustment_limit = 0.375;
   280       break;
   281     case 2:
   282     default:
   283       adjustment_limit = 0.25;
   284       break;
   285   }
   287   // if ( (correction_factor > 102) && (Q < cpi->active_worst_quality) )
   288   if (correction_factor > 102) {
   289     // We are not already at the worst allowable quality
   290     correction_factor =
   291         (int)(100 + ((correction_factor - 100) * adjustment_limit));
   292     rate_correction_factor =
   293         ((rate_correction_factor * correction_factor) / 100);
   295     // Keep rate_correction_factor within limits
   296     if (rate_correction_factor > MAX_BPB_FACTOR)
   297       rate_correction_factor = MAX_BPB_FACTOR;
   298   } else if (correction_factor < 99) {
   299     // We are not already at the best allowable quality
   300     correction_factor =
   301         (int)(100 - ((100 - correction_factor) * adjustment_limit));
   302     rate_correction_factor =
   303         ((rate_correction_factor * correction_factor) / 100);
   305     // Keep rate_correction_factor within limits
   306     if (rate_correction_factor < MIN_BPB_FACTOR)
   307       rate_correction_factor = MIN_BPB_FACTOR;
   308   }
   310   if (cpi->common.frame_type == KEY_FRAME) {
   311     cpi->key_frame_rate_correction_factor = rate_correction_factor;
   312   } else {
   313     if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame)
   314       cpi->gf_rate_correction_factor = rate_correction_factor;
   315     else
   316       cpi->rate_correction_factor = rate_correction_factor;
   317   }
   318 }
   321 int vp9_regulate_q(VP9_COMP *cpi, int target_bits_per_frame) {
   322   int q = cpi->active_worst_quality;
   324   int i;
   325   int last_error = INT_MAX;
   326   int target_bits_per_mb;
   327   int bits_per_mb_at_this_q;
   328   double correction_factor;
   330   // Select the appropriate correction factor based upon type of frame.
   331   if (cpi->common.frame_type == KEY_FRAME) {
   332     correction_factor = cpi->key_frame_rate_correction_factor;
   333   } else {
   334     if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame)
   335       correction_factor = cpi->gf_rate_correction_factor;
   336     else
   337       correction_factor = cpi->rate_correction_factor;
   338   }
   340   // Calculate required scaling factor based on target frame size and size of
   341   // frame produced using previous Q.
   342   if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS))
   343     target_bits_per_mb =
   344         (target_bits_per_frame / cpi->common.MBs)
   345         << BPER_MB_NORMBITS;  // Case where we would overflow int
   346   else
   347     target_bits_per_mb =
   348         (target_bits_per_frame << BPER_MB_NORMBITS) / cpi->common.MBs;
   350   i = cpi->active_best_quality;
   352   do {
   353     bits_per_mb_at_this_q = (int)vp9_bits_per_mb(cpi->common.frame_type, i,
   354                                                  correction_factor);
   356     if (bits_per_mb_at_this_q <= target_bits_per_mb) {
   357       if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error)
   358         q = i;
   359       else
   360         q = i - 1;
   362       break;
   363     } else {
   364       last_error = bits_per_mb_at_this_q - target_bits_per_mb;
   365     }
   366   } while (++i <= cpi->active_worst_quality);
   368   return q;
   369 }
   372 static int estimate_keyframe_frequency(VP9_COMP *cpi) {
   373   int i;
   375   // Average key frame frequency
   376   int av_key_frame_frequency = 0;
   378   /* First key frame at start of sequence is a special case. We have no
   379    * frequency data.
   380    */
   381   if (cpi->key_frame_count == 1) {
   382     /* Assume a default of 1 kf every 2 seconds, or the max kf interval,
   383      * whichever is smaller.
   384      */
   385     int key_freq = cpi->oxcf.key_freq > 0 ? cpi->oxcf.key_freq : 1;
   386     av_key_frame_frequency = (int)cpi->output_framerate * 2;
   388     if (cpi->oxcf.auto_key && av_key_frame_frequency > key_freq)
   389       av_key_frame_frequency = cpi->oxcf.key_freq;
   391     cpi->prior_key_frame_distance[KEY_FRAME_CONTEXT - 1]
   392       = av_key_frame_frequency;
   393   } else {
   394     unsigned int total_weight = 0;
   395     int last_kf_interval =
   396       (cpi->frames_since_key > 0) ? cpi->frames_since_key : 1;
   398     /* reset keyframe context and calculate weighted average of last
   399      * KEY_FRAME_CONTEXT keyframes
   400      */
   401     for (i = 0; i < KEY_FRAME_CONTEXT; i++) {
   402       if (i < KEY_FRAME_CONTEXT - 1)
   403         cpi->prior_key_frame_distance[i]
   404           = cpi->prior_key_frame_distance[i + 1];
   405       else
   406         cpi->prior_key_frame_distance[i] = last_kf_interval;
   408       av_key_frame_frequency += prior_key_frame_weight[i]
   409                                 * cpi->prior_key_frame_distance[i];
   410       total_weight += prior_key_frame_weight[i];
   411     }
   413     av_key_frame_frequency /= total_weight;
   414   }
   415   return av_key_frame_frequency;
   416 }
   419 void vp9_adjust_key_frame_context(VP9_COMP *cpi) {
   420   // Clear down mmx registers to allow floating point in what follows
   421   vp9_clear_system_state();
   423   cpi->frames_since_key = 0;
   424   cpi->key_frame_count++;
   425 }
   428 void vp9_compute_frame_size_bounds(VP9_COMP *cpi, int *frame_under_shoot_limit,
   429                                    int *frame_over_shoot_limit) {
   430   // Set-up bounds on acceptable frame size:
   431   if (cpi->oxcf.fixed_q >= 0) {
   432     // Fixed Q scenario: frame size never outranges target (there is no target!)
   433     *frame_under_shoot_limit = 0;
   434     *frame_over_shoot_limit  = INT_MAX;
   435   } else {
   436     if (cpi->common.frame_type == KEY_FRAME) {
   437       *frame_over_shoot_limit  = cpi->this_frame_target * 9 / 8;
   438       *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8;
   439     } else {
   440       if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) {
   441         *frame_over_shoot_limit  = cpi->this_frame_target * 9 / 8;
   442         *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8;
   443       } else {
   444         // Stron overshoot limit for constrained quality
   445         if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
   446           *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
   447           *frame_under_shoot_limit = cpi->this_frame_target * 2 / 8;
   448         } else {
   449           *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
   450           *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8;
   451         }
   452       }
   453     }
   455     // For very small rate targets where the fractional adjustment
   456     // (eg * 7/8) may be tiny make sure there is at least a minimum
   457     // range.
   458     *frame_over_shoot_limit += 200;
   459     *frame_under_shoot_limit -= 200;
   460     if (*frame_under_shoot_limit < 0)
   461       *frame_under_shoot_limit = 0;
   462   }
   463 }
   466 // return of 0 means drop frame
   467 int vp9_pick_frame_size(VP9_COMP *cpi) {
   468   VP9_COMMON *cm = &cpi->common;
   470   if (cm->frame_type == KEY_FRAME)
   471     calc_iframe_target_size(cpi);
   472   else
   473     calc_pframe_target_size(cpi);
   475   return 1;
   476 }

mercurial