Replace imprecise 32 bits calculations by 64 bits calculations
authorGuillaume Martres <smarter3@gmail.com>
Sat, 5 Apr 2014 20:32:06 +0000 (22:32 +0200)
committerGuillaume Martres <smarter3@gmail.com>
Mon, 7 Apr 2014 16:22:08 +0000 (18:22 +0200)
Change-Id: If1b0a2d6603ce24f5dd99855e8dfe459e7a2835a

vp9/encoder/vp9_firstpass.c
vp9/encoder/vp9_ratectrl.c

index f4ec7cb..fe1f2c5 100644 (file)
@@ -917,9 +917,7 @@ int vp9_twopass_worst_quality(VP9_COMP *cpi, FIRSTPASS_STATS *fpstats,
     return rc->worst_quality;          // Highest value allowed
 
   target_norm_bits_per_mb =
-      section_target_bandwitdh < (1 << 20)
-      ? (section_target_bandwitdh << BPER_MB_NORMBITS) / num_mbs
-      : (section_target_bandwitdh / num_mbs) << BPER_MB_NORMBITS;
+      ((uint64_t)section_target_bandwitdh << BPER_MB_NORMBITS) / num_mbs;
 
   // Try and pick a max Q that will be high enough to encode the
   // content at the given rate.
index 86de99e..26e89ad 100644 (file)
@@ -152,11 +152,7 @@ static int estimate_bits_at_q(int frame_kind, int q, int mbs,
                               double correction_factor) {
   const int bpm = (int)(vp9_rc_bits_per_mb(frame_kind, q, correction_factor));
 
-  // Attempt to retain reasonable accuracy without overflow. The cutoff is
-  // chosen such that the maximum product of Bpm and MBs fits 31 bits. The
-  // largest Bpm takes 20 bits.
-  return (mbs > (1 << 11)) ? (bpm >> BPER_MB_NORMBITS) * mbs
-                           : (bpm * mbs) >> BPER_MB_NORMBITS;
+  return ((uint64_t)bpm * mbs) >> BPER_MB_NORMBITS;
 }
 
 int vp9_rc_clamp_pframe_target_size(const VP9_COMP *const cpi, int target) {
@@ -368,11 +364,8 @@ int vp9_rc_regulate_q(const VP9_COMP *cpi, int target_bits_per_frame,
 
   // Calculate required scaling factor based on target frame size and size of
   // frame produced using previous Q.
-  if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS))
-    // Case where we would overflow int
-    target_bits_per_mb = (target_bits_per_frame / cm->MBs) << BPER_MB_NORMBITS;
-  else
-    target_bits_per_mb = (target_bits_per_frame << BPER_MB_NORMBITS) / cm->MBs;
+    target_bits_per_mb =
+        ((uint64_t)target_bits_per_frame << BPER_MB_NORMBITS) / cm->MBs;
 
   i = active_best_quality;