shithub: libvpx

Download patch

ref: a4f747921ae9b0a11dc032ebc3a6364d2f6dd8b9
parent: 3f95a230c7e54104201b3f6c577dfa9251b4642a
author: Adrian Grange <agrange@google.com>
date: Fri Jun 6 06:37:22 EDT 2014

Revert "Removing this_frame_stats member from TWO_PASS struct."

Use of stack frame variable "fps" beyond the lifetime of the function.

fps is sent as a paremeter to output_stats and stored in the
packet holding this encoded frame. This has scope beyond the
lifetime of the calling function.

This reverts commit 3f95a230c7e54104201b3f6c577dfa9251b4642a

Change-Id: Icd8e14b3d7dd733590ada12e619b9dce95b6b0f5

--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -495,7 +495,6 @@
   TWO_PASS *twopass = &cpi->twopass;
   const MV zero_mv = {0, 0};
   const YV12_BUFFER_CONFIG *first_ref_buf = lst_yv12;
-  FIRSTPASS_STATS fps;
 
   vp9_clear_system_state();
 
@@ -790,6 +789,8 @@
 
   vp9_clear_system_state();
   {
+    FIRSTPASS_STATS fps;
+
     fps.frame = cm->current_video_frame;
     fps.spatial_layer_id = cpi->svc.spatial_layer_id;
     fps.intra_error = (double)(intra_error >> 8);
@@ -829,7 +830,8 @@
     fps.duration = (double)(cpi->source->ts_end - cpi->source->ts_start);
 
     // Don't want to do output stats with a stack variable!
-    output_stats(&fps, cpi->output_pkt_list);
+    twopass->this_frame_stats = fps;
+    output_stats(&twopass->this_frame_stats, cpi->output_pkt_list);
     accumulate_stats(&twopass->total_stats, &fps);
   }
 
@@ -837,9 +839,9 @@
   // the prediction is good enough... but also don't allow it to lag too far.
   if ((twopass->sr_update_lag > 3) ||
       ((cm->current_video_frame > 0) &&
-       (fps.pcnt_inter > 0.20) &&
-       ((fps.intra_error /
-         DOUBLE_DIVIDE_CHECK(fps.coded_error)) > 2.0))) {
+       (twopass->this_frame_stats.pcnt_inter > 0.20) &&
+       ((twopass->this_frame_stats.intra_error /
+         DOUBLE_DIVIDE_CHECK(twopass->this_frame_stats.coded_error)) > 2.0))) {
     if (gld_yv12 != NULL) {
       vp8_yv12_copy_frame(lst_yv12, gld_yv12);
     }
--- a/vp9/encoder/vp9_firstpass.h
+++ b/vp9/encoder/vp9_firstpass.h
@@ -44,6 +44,7 @@
   unsigned int section_intra_rating;
   unsigned int next_iiratio;
   FIRSTPASS_STATS total_stats;
+  FIRSTPASS_STATS this_frame_stats;
   const FIRSTPASS_STATS *stats_in;
   const FIRSTPASS_STATS *stats_in_start;
   const FIRSTPASS_STATS *stats_in_end;