]> granicus.if.org Git - libvpx/commitdiff
Move count buffers from stack to heap
authorYaowu Xu <yaowu@google.com>
Tue, 10 May 2016 21:42:27 +0000 (14:42 -0700)
committerYaowu Xu <yaowu@google.com>
Tue, 10 May 2016 21:49:26 +0000 (14:49 -0700)
This fixes the stack overflow issue on MSVC build.

Change-Id: Icb0a78e5992a097d2192979ec2432546eaa452dd

vp10/encoder/bitstream.c
vp10/encoder/encoder.h

index a7f81625f1a91ba53c3a950251011d4000192bf0..4f8e89c5679734cca43e4d04389e39d63f36f7c3 100644 (file)
@@ -2291,10 +2291,6 @@ static void update_coef_probs(VP10_COMP *cpi, vp10_writer* w) {
   unsigned int eob_counts_copy[TX_SIZES][PLANE_TYPES][REF_TYPES]
                               [COEF_BANDS][COEFF_CONTEXTS];
   int i;
-  vp10_coeff_count coef_counts[COEF_PROBS_BUFS][TX_SIZES][PLANE_TYPES];
-  unsigned int eob_counts[COEF_PROBS_BUFS][TX_SIZES][PLANE_TYPES]
-                         [REF_TYPES][COEF_BANDS][COEFF_CONTEXTS];
-  vp10_coeff_stats branch_ct[COEF_PROBS_BUFS][TX_SIZES][PLANE_TYPES];
   vp10_coeff_probs_model dummy_frame_coef_probs[PLANE_TYPES];
 
   if (cm->do_subframe_update &&
@@ -2302,7 +2298,9 @@ static void update_coef_probs(VP10_COMP *cpi, vp10_writer* w) {
     vp10_copy(cpi->common.fc->coef_probs,
               subframe_stats->enc_starting_coef_probs);
     for (i = 0; i <= cpi->common.coef_probs_update_idx; ++i) {
-      get_coef_counts_diff(cpi, i, coef_counts[i], eob_counts[i]);
+      get_coef_counts_diff(cpi, i,
+                           cpi->wholeframe_stats.coef_counts_buf[i],
+                           cpi->wholeframe_stats.eob_counts_buf[i]);
     }
   }
 #endif  // CONFIG_ENTROPY
@@ -2326,16 +2324,17 @@ static void update_coef_probs(VP10_COMP *cpi, vp10_writer* w) {
                                 frame_coef_probs);
         for (i = 0; i <= cpi->common.coef_probs_update_idx; ++i) {
           vp10_copy(cpi->common.counts.eob_branch[tx_size],
-                    eob_counts[i][tx_size]);
+                    cpi->wholeframe_stats.eob_counts_buf[i][tx_size]);
           vp10_copy(cpi->td.rd_counts.coef_counts[tx_size],
-                    coef_counts[i][tx_size]);
-          build_tree_distribution(cpi, tx_size, branch_ct[i][tx_size],
+                    cpi->wholeframe_stats.coef_counts_buf[i][tx_size]);
+          build_tree_distribution(cpi, tx_size,
+                                  cpi->branch_ct_buf[i][tx_size],
                                   dummy_frame_coef_probs);
         }
         vp10_copy(cpi->common.counts.eob_branch[tx_size], eob_counts_copy);
         vp10_copy(cpi->td.rd_counts.coef_counts[tx_size], coef_counts_copy);
 
-        update_coef_probs_subframe(w, cpi, tx_size, branch_ct,
+        update_coef_probs_subframe(w, cpi, tx_size, cpi->branch_ct_buf,
                                    frame_coef_probs);
 #if CONFIG_ANS
         update = 1;
index 93f274db421dd3e5e8f4e33d70c815438e2b47ef..67ebe6d3faa88455990b147ec55b84dae059e7c3 100644 (file)
@@ -580,6 +580,9 @@ typedef struct VP10_COMP {
   VP9LfSync lf_row_sync;
 #if CONFIG_ENTROPY
   SUBFRAME_STATS subframe_stats;
+  // TODO(yaowu): minimize the size of count buffers
+  SUBFRAME_STATS wholeframe_stats;
+  vp10_coeff_stats branch_ct_buf[COEF_PROBS_BUFS][TX_SIZES][PLANE_TYPES];
 #endif  // CONFIG_ENTROPY
 #if CONFIG_ANS
   struct BufAnsCoder buf_ans;