| OLD | NEW | 
|     1 /* |     1 /* | 
|     2  * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |     2  * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 
|     3  * |     3  * | 
|     4  *  Use of this source code is governed by a BSD-style license |     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 |     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 |     6  *  tree. An additional intellectual property rights grant can be found | 
|     7  *  in the file PATENTS.  All contributing project authors may |     7  *  in the file PATENTS.  All contributing project authors may | 
|     8  *  be found in the AUTHORS file in the root of the source tree. |     8  *  be found in the AUTHORS file in the root of the source tree. | 
|     9  */ |     9  */ | 
|    10  |    10  | 
|    11 #include <math.h> |    11 #include <math.h> | 
|    12 #include <stdio.h> |    12 #include <stdio.h> | 
|    13 #include <limits.h> |    13 #include <limits.h> | 
|    14  |    14  | 
|    15 #include "./vpx_config.h" |    15 #include "./vpx_config.h" | 
|    16 #include "./vpx_scale_rtcd.h" |    16 #include "./vpx_scale_rtcd.h" | 
|    17 #include "vpx/internal/vpx_psnr.h" |    17 #include "vpx/internal/vpx_psnr.h" | 
|    18 #include "vpx_ports/vpx_timer.h" |    18 #include "vpx_ports/vpx_timer.h" | 
|    19  |    19  | 
|    20 #include "vp9/common/vp9_alloccommon.h" |    20 #include "vp9/common/vp9_alloccommon.h" | 
|    21 #include "vp9/common/vp9_filter.h" |    21 #include "vp9/common/vp9_filter.h" | 
|    22 #include "vp9/common/vp9_idct.h" |    22 #include "vp9/common/vp9_idct.h" | 
|    23 #if CONFIG_VP9_POSTPROC |    23 #if CONFIG_VP9_POSTPROC | 
|    24 #include "vp9/common/vp9_postproc.h" |    24 #include "vp9/common/vp9_postproc.h" | 
|    25 #endif |    25 #endif | 
|    26 #include "vp9/common/vp9_reconinter.h" |    26 #include "vp9/common/vp9_reconinter.h" | 
|    27 #include "vp9/common/vp9_systemdependent.h" |    27 #include "vp9/common/vp9_systemdependent.h" | 
|    28 #include "vp9/common/vp9_tile_common.h" |    28 #include "vp9/common/vp9_tile_common.h" | 
|    29  |    29  | 
 |    30 #include "vp9/encoder/vp9_aq_complexity.h" | 
 |    31 #include "vp9/encoder/vp9_aq_cyclicrefresh.h" | 
 |    32 #include "vp9/encoder/vp9_aq_variance.h" | 
|    30 #include "vp9/encoder/vp9_bitstream.h" |    33 #include "vp9/encoder/vp9_bitstream.h" | 
 |    34 #include "vp9/encoder/vp9_encodeframe.h" | 
|    31 #include "vp9/encoder/vp9_encodemv.h" |    35 #include "vp9/encoder/vp9_encodemv.h" | 
|    32 #include "vp9/encoder/vp9_firstpass.h" |    36 #include "vp9/encoder/vp9_firstpass.h" | 
|    33 #include "vp9/encoder/vp9_mbgraph.h" |    37 #include "vp9/encoder/vp9_mbgraph.h" | 
|    34 #include "vp9/encoder/vp9_onyx_int.h" |    38 #include "vp9/encoder/vp9_onyx_int.h" | 
|    35 #include "vp9/encoder/vp9_picklpf.h" |    39 #include "vp9/encoder/vp9_picklpf.h" | 
|    36 #include "vp9/encoder/vp9_ratectrl.h" |    40 #include "vp9/encoder/vp9_ratectrl.h" | 
|    37 #include "vp9/encoder/vp9_rdopt.h" |    41 #include "vp9/encoder/vp9_rdopt.h" | 
|    38 #include "vp9/encoder/vp9_segmentation.h" |    42 #include "vp9/encoder/vp9_segmentation.h" | 
 |    43 #include "vp9/encoder/vp9_speed_features.h" | 
 |    44 #if CONFIG_INTERNAL_STATS | 
 |    45 #include "vp9/encoder/vp9_ssim.h" | 
 |    46 #endif | 
|    39 #include "vp9/encoder/vp9_temporal_filter.h" |    47 #include "vp9/encoder/vp9_temporal_filter.h" | 
|    40 #include "vp9/encoder/vp9_vaq.h" |  | 
|    41 #include "vp9/encoder/vp9_resize.h" |    48 #include "vp9/encoder/vp9_resize.h" | 
 |    49 #include "vp9/encoder/vp9_svc_layercontext.h" | 
|    42  |    50  | 
|    43 void vp9_coef_tree_initialize(); |    51 void vp9_coef_tree_initialize(); | 
|    44  |    52  | 
|    45 #define DEFAULT_INTERP_FILTER SWITCHABLE |    53 #define DEFAULT_INTERP_FILTER SWITCHABLE | 
|    46  |    54  | 
|    47 #define SHARP_FILTER_QTHRESH 0          /* Q threshold for 8-tap sharp filter */ |    55 #define SHARP_FILTER_QTHRESH 0          /* Q threshold for 8-tap sharp filter */ | 
|    48  |    56  | 
|    49 #define ALTREF_HIGH_PRECISION_MV 1      // Whether to use high precision mv |    57 #define ALTREF_HIGH_PRECISION_MV 1      // Whether to use high precision mv | 
|    50                                          //  for altref computation. |    58                                          //  for altref computation. | 
|    51 #define HIGH_PRECISION_MV_QTHRESH 200   // Q threshold for high precision |    59 #define HIGH_PRECISION_MV_QTHRESH 200   // Q threshold for high precision | 
|    52                                          // mv. Choose a very high value for |    60                                          // mv. Choose a very high value for | 
|    53                                          // now so that HIGH_PRECISION is always |    61                                          // now so that HIGH_PRECISION is always | 
|    54                                          // chosen. |    62                                          // chosen. | 
|    55  |    63  | 
|    56 // Masks for partially or completely disabling split mode |  | 
|    57 #define DISABLE_ALL_SPLIT         0x3F |  | 
|    58 #define DISABLE_ALL_INTER_SPLIT   0x1F |  | 
|    59 #define DISABLE_COMPOUND_SPLIT    0x18 |  | 
|    60 #define LAST_AND_INTRA_SPLIT_ONLY 0x1E |  | 
|    61  |  | 
|    62 // Max rate target for 1080P and below encodes under normal circumstances |    64 // Max rate target for 1080P and below encodes under normal circumstances | 
|    63 // (1920 * 1080 / (16 * 16)) * MAX_MB_RATE bits per MB |    65 // (1920 * 1080 / (16 * 16)) * MAX_MB_RATE bits per MB | 
|    64 #define MAX_MB_RATE 250 |    66 #define MAX_MB_RATE 250 | 
|    65 #define MAXRATE_1080P 2025000 |    67 #define MAXRATE_1080P 2025000 | 
|    66  |    68  | 
|    67 #if CONFIG_INTERNAL_STATS |  | 
|    68 extern double vp9_calc_ssim(YV12_BUFFER_CONFIG *source, |  | 
|    69                             YV12_BUFFER_CONFIG *dest, int lumamask, |  | 
|    70                             double *weight); |  | 
|    71  |  | 
|    72  |  | 
|    73 extern double vp9_calc_ssimg(YV12_BUFFER_CONFIG *source, |  | 
|    74                              YV12_BUFFER_CONFIG *dest, double *ssim_y, |  | 
|    75                              double *ssim_u, double *ssim_v); |  | 
|    76  |  | 
|    77  |  | 
|    78 #endif |  | 
|    79  |  | 
|    80 // #define OUTPUT_YUV_REC |    69 // #define OUTPUT_YUV_REC | 
|    81  |    70  | 
|    82 #ifdef OUTPUT_YUV_SRC |    71 #ifdef OUTPUT_YUV_SRC | 
|    83 FILE *yuv_file; |    72 FILE *yuv_file; | 
|    84 #endif |    73 #endif | 
|    85 #ifdef OUTPUT_YUV_REC |    74 #ifdef OUTPUT_YUV_REC | 
|    86 FILE *yuv_rec_file; |    75 FILE *yuv_rec_file; | 
|    87 #endif |    76 #endif | 
|    88  |    77  | 
|    89 #if 0 |    78 #if 0 | 
|    90 FILE *framepsnr; |    79 FILE *framepsnr; | 
|    91 FILE *kf_list; |    80 FILE *kf_list; | 
|    92 FILE *keyfile; |    81 FILE *keyfile; | 
|    93 #endif |    82 #endif | 
|    94  |    83  | 
|    95 void vp9_init_quantizer(VP9_COMP *cpi); |    84 static INLINE void Scale2Ratio(VPX_SCALING mode, int *hr, int *hs) { | 
|    96  |  | 
|    97 static const double in_frame_q_adj_ratio[MAX_SEGMENTS] = |  | 
|    98   {1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; |  | 
|    99  |  | 
|   100 static INLINE void Scale2Ratio(int mode, int *hr, int *hs) { |  | 
|   101   switch (mode) { |    85   switch (mode) { | 
|   102     case NORMAL: |    86     case NORMAL: | 
|   103       *hr = 1; |    87       *hr = 1; | 
|   104       *hs = 1; |    88       *hs = 1; | 
|   105       break; |    89       break; | 
|   106     case FOURFIVE: |    90     case FOURFIVE: | 
|   107       *hr = 4; |    91       *hr = 4; | 
|   108       *hs = 5; |    92       *hs = 5; | 
|   109       break; |    93       break; | 
|   110     case THREEFIVE: |    94     case THREEFIVE: | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
|   128   cpi->common.allow_high_precision_mv = allow_high_precision_mv; |   112   cpi->common.allow_high_precision_mv = allow_high_precision_mv; | 
|   129   if (cpi->common.allow_high_precision_mv) { |   113   if (cpi->common.allow_high_precision_mv) { | 
|   130     mb->mvcost = mb->nmvcost_hp; |   114     mb->mvcost = mb->nmvcost_hp; | 
|   131     mb->mvsadcost = mb->nmvsadcost_hp; |   115     mb->mvsadcost = mb->nmvsadcost_hp; | 
|   132   } else { |   116   } else { | 
|   133     mb->mvcost = mb->nmvcost; |   117     mb->mvcost = mb->nmvcost; | 
|   134     mb->mvsadcost = mb->nmvsadcost; |   118     mb->mvsadcost = mb->nmvsadcost; | 
|   135   } |   119   } | 
|   136 } |   120 } | 
|   137  |   121  | 
 |   122 static void setup_key_frame(VP9_COMP *cpi) { | 
 |   123   vp9_setup_past_independence(&cpi->common); | 
 |   124  | 
 |   125   // All buffers are implicitly updated on key frames. | 
 |   126   cpi->refresh_golden_frame = 1; | 
 |   127   cpi->refresh_alt_ref_frame = 1; | 
 |   128 } | 
 |   129  | 
 |   130 static void setup_inter_frame(VP9_COMMON *cm) { | 
 |   131   if (cm->error_resilient_mode || cm->intra_only) | 
 |   132     vp9_setup_past_independence(cm); | 
 |   133  | 
 |   134   assert(cm->frame_context_idx < FRAME_CONTEXTS); | 
 |   135   cm->fc = cm->frame_contexts[cm->frame_context_idx]; | 
 |   136 } | 
 |   137  | 
|   138 void vp9_initialize_enc() { |   138 void vp9_initialize_enc() { | 
|   139   static int init_done = 0; |   139   static int init_done = 0; | 
|   140  |   140  | 
|   141   if (!init_done) { |   141   if (!init_done) { | 
|   142     vp9_initialize_common(); |   142     vp9_init_neighbors(); | 
 |   143     vp9_init_quant_tables(); | 
 |   144  | 
|   143     vp9_coef_tree_initialize(); |   145     vp9_coef_tree_initialize(); | 
|   144     vp9_tokenize_initialize(); |   146     vp9_tokenize_initialize(); | 
|   145     vp9_init_quant_tables(); |  | 
|   146     vp9_init_me_luts(); |   147     vp9_init_me_luts(); | 
|   147     vp9_rc_init_minq_luts(); |   148     vp9_rc_init_minq_luts(); | 
|   148     // init_base_skip_probs(); |  | 
|   149     vp9_entropy_mv_init(); |   149     vp9_entropy_mv_init(); | 
|   150     vp9_entropy_mode_init(); |   150     vp9_entropy_mode_init(); | 
|   151     init_done = 1; |   151     init_done = 1; | 
|   152   } |   152   } | 
|   153 } |   153 } | 
|   154  |   154  | 
|   155 static void dealloc_compressor_data(VP9_COMP *cpi) { |   155 static void dealloc_compressor_data(VP9_COMP *cpi) { | 
|   156   VP9_COMMON *const cm = &cpi->common; |   156   VP9_COMMON *const cm = &cpi->common; | 
 |   157   int i; | 
|   157  |   158  | 
|   158   // Delete sementation map |   159   // Delete sementation map | 
|   159   vpx_free(cpi->segmentation_map); |   160   vpx_free(cpi->segmentation_map); | 
|   160   cpi->segmentation_map = NULL; |   161   cpi->segmentation_map = NULL; | 
|   161   vpx_free(cm->last_frame_seg_map); |   162   vpx_free(cm->last_frame_seg_map); | 
|   162   cm->last_frame_seg_map = NULL; |   163   cm->last_frame_seg_map = NULL; | 
|   163   vpx_free(cpi->coding_context.last_frame_seg_map_copy); |   164   vpx_free(cpi->coding_context.last_frame_seg_map_copy); | 
|   164   cpi->coding_context.last_frame_seg_map_copy = NULL; |   165   cpi->coding_context.last_frame_seg_map_copy = NULL; | 
|   165  |   166  | 
|   166   vpx_free(cpi->complexity_map); |   167   vpx_free(cpi->complexity_map); | 
|   167   cpi->complexity_map = 0; |   168   cpi->complexity_map = NULL; | 
 |   169  | 
 |   170   vp9_cyclic_refresh_free(cpi->cyclic_refresh); | 
 |   171   cpi->cyclic_refresh = NULL; | 
 |   172  | 
|   168   vpx_free(cpi->active_map); |   173   vpx_free(cpi->active_map); | 
|   169   cpi->active_map = 0; |   174   cpi->active_map = NULL; | 
|   170  |   175  | 
|   171   vp9_free_frame_buffers(cm); |   176   vp9_free_frame_buffers(cm); | 
|   172  |   177  | 
|   173   vp9_free_frame_buffer(&cpi->last_frame_uf); |   178   vp9_free_frame_buffer(&cpi->last_frame_uf); | 
|   174   vp9_free_frame_buffer(&cpi->scaled_source); |   179   vp9_free_frame_buffer(&cpi->scaled_source); | 
 |   180   vp9_free_frame_buffer(&cpi->scaled_last_source); | 
|   175   vp9_free_frame_buffer(&cpi->alt_ref_buffer); |   181   vp9_free_frame_buffer(&cpi->alt_ref_buffer); | 
|   176   vp9_lookahead_destroy(cpi->lookahead); |   182   vp9_lookahead_destroy(cpi->lookahead); | 
|   177  |   183  | 
|   178   vpx_free(cpi->tok); |   184   vpx_free(cpi->tok); | 
|   179   cpi->tok = 0; |   185   cpi->tok = 0; | 
|   180  |   186  | 
|   181   // Activity mask based per mb zbin adjustments |   187   // Activity mask based per mb zbin adjustments | 
|   182   vpx_free(cpi->mb_activity_map); |   188   vpx_free(cpi->mb_activity_map); | 
|   183   cpi->mb_activity_map = 0; |   189   cpi->mb_activity_map = 0; | 
|   184   vpx_free(cpi->mb_norm_activity_map); |   190   vpx_free(cpi->mb_norm_activity_map); | 
|   185   cpi->mb_norm_activity_map = 0; |   191   cpi->mb_norm_activity_map = 0; | 
|   186  |   192  | 
|   187   vpx_free(cpi->above_context[0]); |   193   for (i = 0; i < cpi->svc.number_spatial_layers; ++i) { | 
|   188   cpi->above_context[0] = NULL; |   194     LAYER_CONTEXT *const lc = &cpi->svc.layer_context[i]; | 
|   189  |   195     vpx_free(lc->rc_twopass_stats_in.buf); | 
|   190   vpx_free(cpi->above_seg_context); |   196     lc->rc_twopass_stats_in.buf = NULL; | 
|   191   cpi->above_seg_context = NULL; |   197     lc->rc_twopass_stats_in.sz = 0; | 
 |   198   } | 
|   192 } |   199 } | 
|   193  |   200  | 
|   194 // Computes a q delta (in "q index" terms) to get from a starting q value |   201 static void save_coding_context(VP9_COMP *cpi) { | 
|   195 // to a target value |   202   CODING_CONTEXT *const cc = &cpi->coding_context; | 
|   196 // target q value |   203   VP9_COMMON *cm = &cpi->common; | 
|   197 int vp9_compute_qdelta(const VP9_COMP *cpi, double qstart, double qtarget) { |  | 
|   198   const RATE_CONTROL *const rc = &cpi->rc; |  | 
|   199   int start_index = rc->worst_quality; |  | 
|   200   int target_index = rc->worst_quality; |  | 
|   201   int i; |  | 
|   202  |   204  | 
|   203   // Convert the average q value to an index. |   205   // Stores a snapshot of key state variables which can subsequently be | 
|   204   for (i = rc->best_quality; i < rc->worst_quality; ++i) { |   206   // restored with a call to vp9_restore_coding_context. These functions are | 
|   205     start_index = i; |   207   // intended for use in a re-code loop in vp9_compress_frame where the | 
|   206     if (vp9_convert_qindex_to_q(i) >= qstart) |   208   // quantizer value is adjusted between loop iterations. | 
|   207       break; |   209   vp9_copy(cc->nmvjointcost,  cpi->mb.nmvjointcost); | 
|   208   } |   210   vp9_copy(cc->nmvcosts,  cpi->mb.nmvcosts); | 
 |   211   vp9_copy(cc->nmvcosts_hp,  cpi->mb.nmvcosts_hp); | 
|   209  |   212  | 
|   210   // Convert the q target to an index |   213   vp9_copy(cc->segment_pred_probs, cm->seg.pred_probs); | 
|   211   for (i = rc->best_quality; i < rc->worst_quality; ++i) { |  | 
|   212     target_index = i; |  | 
|   213     if (vp9_convert_qindex_to_q(i) >= qtarget) |  | 
|   214       break; |  | 
|   215   } |  | 
|   216  |   214  | 
|   217   return target_index - start_index; |   215   vpx_memcpy(cpi->coding_context.last_frame_seg_map_copy, | 
 |   216              cm->last_frame_seg_map, (cm->mi_rows * cm->mi_cols)); | 
 |   217  | 
 |   218   vp9_copy(cc->last_ref_lf_deltas, cm->lf.last_ref_deltas); | 
 |   219   vp9_copy(cc->last_mode_lf_deltas, cm->lf.last_mode_deltas); | 
 |   220  | 
 |   221   cc->fc = cm->fc; | 
|   218 } |   222 } | 
|   219  |   223  | 
|   220 // Computes a q delta (in "q index" terms) to get from a starting q value |   224 static void restore_coding_context(VP9_COMP *cpi) { | 
|   221 // to a value that should equate to thegiven rate ratio. |   225   CODING_CONTEXT *const cc = &cpi->coding_context; | 
 |   226   VP9_COMMON *cm = &cpi->common; | 
|   222  |   227  | 
|   223 static int compute_qdelta_by_rate(VP9_COMP *cpi, int base_q_index, |   228   // Restore key state variables to the snapshot state stored in the | 
|   224                                   double rate_target_ratio) { |   229   // previous call to vp9_save_coding_context. | 
|   225   int i; |   230   vp9_copy(cpi->mb.nmvjointcost, cc->nmvjointcost); | 
|   226   int target_index = cpi->rc.worst_quality; |   231   vp9_copy(cpi->mb.nmvcosts, cc->nmvcosts); | 
 |   232   vp9_copy(cpi->mb.nmvcosts_hp, cc->nmvcosts_hp); | 
|   227  |   233  | 
|   228   // Look up the current projected bits per block for the base index |   234   vp9_copy(cm->seg.pred_probs, cc->segment_pred_probs); | 
|   229   const int base_bits_per_mb = vp9_rc_bits_per_mb(cpi->common.frame_type, |  | 
|   230                                             base_q_index, 1.0); |  | 
|   231  |   235  | 
|   232   // Find the target bits per mb based on the base value and given ratio. |   236   vpx_memcpy(cm->last_frame_seg_map, | 
|   233   const int target_bits_per_mb = (int)(rate_target_ratio * base_bits_per_mb); |   237              cpi->coding_context.last_frame_seg_map_copy, | 
 |   238              (cm->mi_rows * cm->mi_cols)); | 
|   234  |   239  | 
|   235   // Convert the q target to an index |   240   vp9_copy(cm->lf.last_ref_deltas, cc->last_ref_lf_deltas); | 
|   236   for (i = cpi->rc.best_quality; i < cpi->rc.worst_quality; ++i) { |   241   vp9_copy(cm->lf.last_mode_deltas, cc->last_mode_lf_deltas); | 
|   237     target_index = i; |  | 
|   238     if (vp9_rc_bits_per_mb(cpi->common.frame_type, i, 1.0) <= |  | 
|   239             target_bits_per_mb ) |  | 
|   240       break; |  | 
|   241   } |  | 
|   242  |   242  | 
|   243   return target_index - base_q_index; |   243   cm->fc = cc->fc; | 
|   244 } |   244 } | 
|   245  |   245  | 
|   246 // This function sets up a set of segments with delta Q values around |   246 static void configure_static_seg_features(VP9_COMP *cpi) { | 
|   247 // the baseline frame quantizer. |  | 
|   248 static void setup_in_frame_q_adj(VP9_COMP *cpi) { |  | 
|   249   VP9_COMMON *const cm = &cpi->common; |   247   VP9_COMMON *const cm = &cpi->common; | 
 |   248   const RATE_CONTROL *const rc = &cpi->rc; | 
|   250   struct segmentation *const seg = &cm->seg; |   249   struct segmentation *const seg = &cm->seg; | 
|   251  |   250  | 
|   252   // Make SURE use of floating point in this function is safe. |   251   int high_q = (int)(rc->avg_q > 48.0); | 
|   253   vp9_clear_system_state(); |  | 
|   254  |  | 
|   255   if (cm->frame_type == KEY_FRAME || |  | 
|   256       cpi->refresh_alt_ref_frame || |  | 
|   257       (cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref)) { |  | 
|   258     int segment; |  | 
|   259  |  | 
|   260     // Clear down the segment map |  | 
|   261     vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols); |  | 
|   262  |  | 
|   263     // Clear down the complexity map used for rd |  | 
|   264     vpx_memset(cpi->complexity_map, 0, cm->mi_rows * cm->mi_cols); |  | 
|   265  |  | 
|   266     vp9_enable_segmentation(seg); |  | 
|   267     vp9_clearall_segfeatures(seg); |  | 
|   268  |  | 
|   269     // Select delta coding method |  | 
|   270     seg->abs_delta = SEGMENT_DELTADATA; |  | 
|   271  |  | 
|   272     // Segment 0 "Q" feature is disabled so it defaults to the baseline Q |  | 
|   273     vp9_disable_segfeature(seg, 0, SEG_LVL_ALT_Q); |  | 
|   274  |  | 
|   275     // Use some of the segments for in frame Q adjustment |  | 
|   276     for (segment = 1; segment < 2; segment++) { |  | 
|   277       const int qindex_delta = compute_qdelta_by_rate(cpi, cm->base_qindex, |  | 
|   278                                    in_frame_q_adj_ratio[segment]); |  | 
|   279       vp9_enable_segfeature(seg, segment, SEG_LVL_ALT_Q); |  | 
|   280       vp9_set_segdata(seg, segment, SEG_LVL_ALT_Q, qindex_delta); |  | 
|   281     } |  | 
|   282   } |  | 
|   283 } |  | 
|   284 static void configure_static_seg_features(VP9_COMP *cpi) { |  | 
|   285   VP9_COMMON *const cm = &cpi->common; |  | 
|   286   struct segmentation *const seg = &cm->seg; |  | 
|   287  |  | 
|   288   int high_q = (int)(cpi->rc.avg_q > 48.0); |  | 
|   289   int qi_delta; |   252   int qi_delta; | 
|   290  |   253  | 
|   291   // Disable and clear down for KF |   254   // Disable and clear down for KF | 
|   292   if (cm->frame_type == KEY_FRAME) { |   255   if (cm->frame_type == KEY_FRAME) { | 
|   293     // Clear down the global segmentation map |   256     // Clear down the global segmentation map | 
|   294     vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols); |   257     vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols); | 
|   295     seg->update_map = 0; |   258     seg->update_map = 0; | 
|   296     seg->update_data = 0; |   259     seg->update_data = 0; | 
|   297     cpi->static_mb_pct = 0; |   260     cpi->static_mb_pct = 0; | 
|   298  |   261  | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
|   316     // Scan frames from current to arf frame. |   279     // Scan frames from current to arf frame. | 
|   317     // This function re-enables segmentation if appropriate. |   280     // This function re-enables segmentation if appropriate. | 
|   318     vp9_update_mbgraph_stats(cpi); |   281     vp9_update_mbgraph_stats(cpi); | 
|   319  |   282  | 
|   320     // If segmentation was enabled set those features needed for the |   283     // If segmentation was enabled set those features needed for the | 
|   321     // arf itself. |   284     // arf itself. | 
|   322     if (seg->enabled) { |   285     if (seg->enabled) { | 
|   323       seg->update_map = 1; |   286       seg->update_map = 1; | 
|   324       seg->update_data = 1; |   287       seg->update_data = 1; | 
|   325  |   288  | 
|   326       qi_delta = vp9_compute_qdelta( |   289       qi_delta = vp9_compute_qdelta(rc, rc->avg_q, rc->avg_q * 0.875); | 
|   327           cpi, cpi->rc.avg_q, (cpi->rc.avg_q * 0.875)); |   290       vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta - 2); | 
|   328       vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, (qi_delta - 2)); |  | 
|   329       vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2); |   291       vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2); | 
|   330  |   292  | 
|   331       vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q); |   293       vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q); | 
|   332       vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF); |   294       vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF); | 
|   333  |   295  | 
|   334       // Where relevant assume segment data is delta data |   296       // Where relevant assume segment data is delta data | 
|   335       seg->abs_delta = SEGMENT_DELTADATA; |   297       seg->abs_delta = SEGMENT_DELTADATA; | 
|   336     } |   298     } | 
|   337   } else if (seg->enabled) { |   299   } else if (seg->enabled) { | 
|   338     // All other frames if segmentation has been enabled |   300     // All other frames if segmentation has been enabled | 
|   339  |   301  | 
|   340     // First normal frame in a valid gf or alt ref group |   302     // First normal frame in a valid gf or alt ref group | 
|   341     if (cpi->rc.frames_since_golden == 0) { |   303     if (rc->frames_since_golden == 0) { | 
|   342       // Set up segment features for normal frames in an arf group |   304       // Set up segment features for normal frames in an arf group | 
|   343       if (cpi->rc.source_alt_ref_active) { |   305       if (rc->source_alt_ref_active) { | 
|   344         seg->update_map = 0; |   306         seg->update_map = 0; | 
|   345         seg->update_data = 1; |   307         seg->update_data = 1; | 
|   346         seg->abs_delta = SEGMENT_DELTADATA; |   308         seg->abs_delta = SEGMENT_DELTADATA; | 
|   347  |   309  | 
|   348         qi_delta = vp9_compute_qdelta(cpi, cpi->rc.avg_q, |   310         qi_delta = vp9_compute_qdelta(rc, rc->avg_q, rc->avg_q * 1.125); | 
|   349                                       (cpi->rc.avg_q * 1.125)); |   311         vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta + 2); | 
|   350         vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, (qi_delta + 2)); |  | 
|   351         vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q); |   312         vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q); | 
|   352  |   313  | 
|   353         vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2); |   314         vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2); | 
|   354         vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF); |   315         vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF); | 
|   355  |   316  | 
|   356         // Segment coding disabled for compred testing |   317         // Segment coding disabled for compred testing | 
|   357         if (high_q || (cpi->static_mb_pct == 100)) { |   318         if (high_q || (cpi->static_mb_pct == 100)) { | 
|   358           vp9_set_segdata(seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME); |   319           vp9_set_segdata(seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME); | 
|   359           vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME); |   320           vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME); | 
|   360           vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP); |   321           vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP); | 
|   361         } |   322         } | 
|   362       } else { |   323       } else { | 
|   363         // Disable segmentation and clear down features if alt ref |   324         // Disable segmentation and clear down features if alt ref | 
|   364         // is not active for this group |   325         // is not active for this group | 
|   365  |   326  | 
|   366         vp9_disable_segmentation(seg); |   327         vp9_disable_segmentation(seg); | 
|   367  |   328  | 
|   368         vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols); |   329         vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols); | 
|   369  |   330  | 
|   370         seg->update_map = 0; |   331         seg->update_map = 0; | 
|   371         seg->update_data = 0; |   332         seg->update_data = 0; | 
|   372  |   333  | 
|   373         vp9_clearall_segfeatures(seg); |   334         vp9_clearall_segfeatures(seg); | 
|   374       } |   335       } | 
|   375     } else if (cpi->rc.is_src_frame_alt_ref) { |   336     } else if (rc->is_src_frame_alt_ref) { | 
|   376       // Special case where we are coding over the top of a previous |   337       // Special case where we are coding over the top of a previous | 
|   377       // alt ref frame. |   338       // alt ref frame. | 
|   378       // Segment coding disabled for compred testing |   339       // Segment coding disabled for compred testing | 
|   379  |   340  | 
|   380       // Enable ref frame features for segment 0 as well |   341       // Enable ref frame features for segment 0 as well | 
|   381       vp9_enable_segfeature(seg, 0, SEG_LVL_REF_FRAME); |   342       vp9_enable_segfeature(seg, 0, SEG_LVL_REF_FRAME); | 
|   382       vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME); |   343       vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME); | 
|   383  |   344  | 
|   384       // All mbs should use ALTREF_FRAME |   345       // All mbs should use ALTREF_FRAME | 
|   385       vp9_clear_segdata(seg, 0, SEG_LVL_REF_FRAME); |   346       vp9_clear_segdata(seg, 0, SEG_LVL_REF_FRAME); | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
|   397     } else { |   358     } else { | 
|   398       // All other frames. |   359       // All other frames. | 
|   399  |   360  | 
|   400       // No updates.. leave things as they are. |   361       // No updates.. leave things as they are. | 
|   401       seg->update_map = 0; |   362       seg->update_map = 0; | 
|   402       seg->update_data = 0; |   363       seg->update_data = 0; | 
|   403     } |   364     } | 
|   404   } |   365   } | 
|   405 } |   366 } | 
|   406  |   367  | 
|   407 // DEBUG: Print out the segment id of each MB in the current frame. |  | 
|   408 static void print_seg_map(VP9_COMP *cpi) { |  | 
|   409   VP9_COMMON *cm = &cpi->common; |  | 
|   410   int row, col; |  | 
|   411   int map_index = 0; |  | 
|   412   FILE *statsfile = fopen("segmap.stt", "a"); |  | 
|   413  |  | 
|   414   fprintf(statsfile, "%10d\n", cm->current_video_frame); |  | 
|   415  |  | 
|   416   for (row = 0; row < cpi->common.mi_rows; row++) { |  | 
|   417     for (col = 0; col < cpi->common.mi_cols; col++) { |  | 
|   418       fprintf(statsfile, "%10d", cpi->segmentation_map[map_index]); |  | 
|   419       map_index++; |  | 
|   420     } |  | 
|   421     fprintf(statsfile, "\n"); |  | 
|   422   } |  | 
|   423   fprintf(statsfile, "\n"); |  | 
|   424  |  | 
|   425   fclose(statsfile); |  | 
|   426 } |  | 
|   427  |  | 
|   428 static void update_reference_segmentation_map(VP9_COMP *cpi) { |   368 static void update_reference_segmentation_map(VP9_COMP *cpi) { | 
|   429   VP9_COMMON *const cm = &cpi->common; |   369   VP9_COMMON *const cm = &cpi->common; | 
|   430   MODE_INFO **mi_8x8_ptr = cm->mi_grid_visible; |   370   MODE_INFO **mi_8x8_ptr = cm->mi_grid_visible; | 
|   431   uint8_t *cache_ptr = cm->last_frame_seg_map; |   371   uint8_t *cache_ptr = cm->last_frame_seg_map; | 
|   432   int row, col; |   372   int row, col; | 
|   433  |   373  | 
|   434   for (row = 0; row < cm->mi_rows; row++) { |   374   for (row = 0; row < cm->mi_rows; row++) { | 
|   435     MODE_INFO **mi_8x8 = mi_8x8_ptr; |   375     MODE_INFO **mi_8x8 = mi_8x8_ptr; | 
|   436     uint8_t *cache = cache_ptr; |   376     uint8_t *cache = cache_ptr; | 
|   437     for (col = 0; col < cm->mi_cols; col++, mi_8x8++, cache++) |   377     for (col = 0; col < cm->mi_cols; col++, mi_8x8++, cache++) | 
|   438       cache[0] = mi_8x8[0]->mbmi.segment_id; |   378       cache[0] = mi_8x8[0]->mbmi.segment_id; | 
|   439     mi_8x8_ptr += cm->mode_info_stride; |   379     mi_8x8_ptr += cm->mi_stride; | 
|   440     cache_ptr += cm->mi_cols; |   380     cache_ptr += cm->mi_cols; | 
|   441   } |   381   } | 
|   442 } |   382 } | 
|   443 static int is_slowest_mode(int mode) { |   383 static int is_slowest_mode(int mode) { | 
|   444   return (mode == MODE_SECONDPASS_BEST || mode == MODE_BESTQUALITY); |   384   return (mode == MODE_SECONDPASS_BEST || mode == MODE_BESTQUALITY); | 
|   445 } |   385 } | 
|   446  |   386  | 
|   447 static void set_rd_speed_thresholds(VP9_COMP *cpi) { |   387 static void set_rd_speed_thresholds(VP9_COMP *cpi) { | 
|   448   SPEED_FEATURES *sf = &cpi->sf; |  | 
|   449   int i; |   388   int i; | 
|   450  |   389  | 
|   451   // Set baseline threshold values |   390   // Set baseline threshold values | 
|   452   for (i = 0; i < MAX_MODES; ++i) |   391   for (i = 0; i < MAX_MODES; ++i) | 
|   453     sf->thresh_mult[i] = is_slowest_mode(cpi->oxcf.mode) ? -500 : 0; |   392   cpi->rd_thresh_mult[i] = is_slowest_mode(cpi->oxcf.mode) ? -500 : 0; | 
|   454  |   393  | 
|   455   sf->thresh_mult[THR_NEARESTMV] = 0; |   394   cpi->rd_thresh_mult[THR_NEARESTMV] = 0; | 
|   456   sf->thresh_mult[THR_NEARESTG] = 0; |   395   cpi->rd_thresh_mult[THR_NEARESTG] = 0; | 
|   457   sf->thresh_mult[THR_NEARESTA] = 0; |   396   cpi->rd_thresh_mult[THR_NEARESTA] = 0; | 
|   458  |   397  | 
|   459   sf->thresh_mult[THR_DC] += 1000; |   398   cpi->rd_thresh_mult[THR_DC] += 1000; | 
|   460  |   399  | 
|   461   sf->thresh_mult[THR_NEWMV] += 1000; |   400   cpi->rd_thresh_mult[THR_NEWMV] += 1000; | 
|   462   sf->thresh_mult[THR_NEWA] += 1000; |   401   cpi->rd_thresh_mult[THR_NEWA] += 1000; | 
|   463   sf->thresh_mult[THR_NEWG] += 1000; |   402   cpi->rd_thresh_mult[THR_NEWG] += 1000; | 
|   464  |   403  | 
|   465   sf->thresh_mult[THR_NEARMV] += 1000; |   404   cpi->rd_thresh_mult[THR_NEARMV] += 1000; | 
|   466   sf->thresh_mult[THR_NEARA] += 1000; |   405   cpi->rd_thresh_mult[THR_NEARA] += 1000; | 
|   467   sf->thresh_mult[THR_COMP_NEARESTLA] += 1000; |   406   cpi->rd_thresh_mult[THR_COMP_NEARESTLA] += 1000; | 
|   468   sf->thresh_mult[THR_COMP_NEARESTGA] += 1000; |   407   cpi->rd_thresh_mult[THR_COMP_NEARESTGA] += 1000; | 
|   469  |   408  | 
|   470   sf->thresh_mult[THR_TM] += 1000; |   409   cpi->rd_thresh_mult[THR_TM] += 1000; | 
|   471  |   410  | 
|   472   sf->thresh_mult[THR_COMP_NEARLA] += 1500; |   411   cpi->rd_thresh_mult[THR_COMP_NEARLA] += 1500; | 
|   473   sf->thresh_mult[THR_COMP_NEWLA] += 2000; |   412   cpi->rd_thresh_mult[THR_COMP_NEWLA] += 2000; | 
|   474   sf->thresh_mult[THR_NEARG] += 1000; |   413   cpi->rd_thresh_mult[THR_NEARG] += 1000; | 
|   475   sf->thresh_mult[THR_COMP_NEARGA] += 1500; |   414   cpi->rd_thresh_mult[THR_COMP_NEARGA] += 1500; | 
|   476   sf->thresh_mult[THR_COMP_NEWGA] += 2000; |   415   cpi->rd_thresh_mult[THR_COMP_NEWGA] += 2000; | 
|   477  |   416  | 
|   478   sf->thresh_mult[THR_ZEROMV] += 2000; |   417   cpi->rd_thresh_mult[THR_ZEROMV] += 2000; | 
|   479   sf->thresh_mult[THR_ZEROG] += 2000; |   418   cpi->rd_thresh_mult[THR_ZEROG] += 2000; | 
|   480   sf->thresh_mult[THR_ZEROA] += 2000; |   419   cpi->rd_thresh_mult[THR_ZEROA] += 2000; | 
|   481   sf->thresh_mult[THR_COMP_ZEROLA] += 2500; |   420   cpi->rd_thresh_mult[THR_COMP_ZEROLA] += 2500; | 
|   482   sf->thresh_mult[THR_COMP_ZEROGA] += 2500; |   421   cpi->rd_thresh_mult[THR_COMP_ZEROGA] += 2500; | 
|   483  |   422  | 
|   484   sf->thresh_mult[THR_H_PRED] += 2000; |   423   cpi->rd_thresh_mult[THR_H_PRED] += 2000; | 
|   485   sf->thresh_mult[THR_V_PRED] += 2000; |   424   cpi->rd_thresh_mult[THR_V_PRED] += 2000; | 
|   486   sf->thresh_mult[THR_D45_PRED ] += 2500; |   425   cpi->rd_thresh_mult[THR_D45_PRED ] += 2500; | 
|   487   sf->thresh_mult[THR_D135_PRED] += 2500; |   426   cpi->rd_thresh_mult[THR_D135_PRED] += 2500; | 
|   488   sf->thresh_mult[THR_D117_PRED] += 2500; |   427   cpi->rd_thresh_mult[THR_D117_PRED] += 2500; | 
|   489   sf->thresh_mult[THR_D153_PRED] += 2500; |   428   cpi->rd_thresh_mult[THR_D153_PRED] += 2500; | 
|   490   sf->thresh_mult[THR_D207_PRED] += 2500; |   429   cpi->rd_thresh_mult[THR_D207_PRED] += 2500; | 
|   491   sf->thresh_mult[THR_D63_PRED] += 2500; |   430   cpi->rd_thresh_mult[THR_D63_PRED] += 2500; | 
|   492  |   431  | 
|   493   /* disable frame modes if flags not set */ |   432   /* disable frame modes if flags not set */ | 
|   494   if (!(cpi->ref_frame_flags & VP9_LAST_FLAG)) { |   433   if (!(cpi->ref_frame_flags & VP9_LAST_FLAG)) { | 
|   495     sf->thresh_mult[THR_NEWMV    ] = INT_MAX; |   434     cpi->rd_thresh_mult[THR_NEWMV    ] = INT_MAX; | 
|   496     sf->thresh_mult[THR_NEARESTMV] = INT_MAX; |   435     cpi->rd_thresh_mult[THR_NEARESTMV] = INT_MAX; | 
|   497     sf->thresh_mult[THR_ZEROMV   ] = INT_MAX; |   436     cpi->rd_thresh_mult[THR_ZEROMV   ] = INT_MAX; | 
|   498     sf->thresh_mult[THR_NEARMV   ] = INT_MAX; |   437     cpi->rd_thresh_mult[THR_NEARMV   ] = INT_MAX; | 
|   499   } |   438   } | 
|   500   if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG)) { |   439   if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG)) { | 
|   501     sf->thresh_mult[THR_NEARESTG ] = INT_MAX; |   440     cpi->rd_thresh_mult[THR_NEARESTG ] = INT_MAX; | 
|   502     sf->thresh_mult[THR_ZEROG    ] = INT_MAX; |   441     cpi->rd_thresh_mult[THR_ZEROG    ] = INT_MAX; | 
|   503     sf->thresh_mult[THR_NEARG    ] = INT_MAX; |   442     cpi->rd_thresh_mult[THR_NEARG    ] = INT_MAX; | 
|   504     sf->thresh_mult[THR_NEWG     ] = INT_MAX; |   443     cpi->rd_thresh_mult[THR_NEWG     ] = INT_MAX; | 
|   505   } |   444   } | 
|   506   if (!(cpi->ref_frame_flags & VP9_ALT_FLAG)) { |   445   if (!(cpi->ref_frame_flags & VP9_ALT_FLAG)) { | 
|   507     sf->thresh_mult[THR_NEARESTA ] = INT_MAX; |   446     cpi->rd_thresh_mult[THR_NEARESTA ] = INT_MAX; | 
|   508     sf->thresh_mult[THR_ZEROA    ] = INT_MAX; |   447     cpi->rd_thresh_mult[THR_ZEROA    ] = INT_MAX; | 
|   509     sf->thresh_mult[THR_NEARA    ] = INT_MAX; |   448     cpi->rd_thresh_mult[THR_NEARA    ] = INT_MAX; | 
|   510     sf->thresh_mult[THR_NEWA     ] = INT_MAX; |   449     cpi->rd_thresh_mult[THR_NEWA     ] = INT_MAX; | 
|   511   } |   450   } | 
|   512  |   451  | 
|   513   if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) != |   452   if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) != | 
|   514       (VP9_LAST_FLAG | VP9_ALT_FLAG)) { |   453       (VP9_LAST_FLAG | VP9_ALT_FLAG)) { | 
|   515     sf->thresh_mult[THR_COMP_ZEROLA   ] = INT_MAX; |   454     cpi->rd_thresh_mult[THR_COMP_ZEROLA   ] = INT_MAX; | 
|   516     sf->thresh_mult[THR_COMP_NEARESTLA] = INT_MAX; |   455     cpi->rd_thresh_mult[THR_COMP_NEARESTLA] = INT_MAX; | 
|   517     sf->thresh_mult[THR_COMP_NEARLA   ] = INT_MAX; |   456     cpi->rd_thresh_mult[THR_COMP_NEARLA   ] = INT_MAX; | 
|   518     sf->thresh_mult[THR_COMP_NEWLA    ] = INT_MAX; |   457     cpi->rd_thresh_mult[THR_COMP_NEWLA    ] = INT_MAX; | 
|   519   } |   458   } | 
|   520   if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) != |   459   if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) != | 
|   521       (VP9_GOLD_FLAG | VP9_ALT_FLAG)) { |   460       (VP9_GOLD_FLAG | VP9_ALT_FLAG)) { | 
|   522     sf->thresh_mult[THR_COMP_ZEROGA   ] = INT_MAX; |   461     cpi->rd_thresh_mult[THR_COMP_ZEROGA   ] = INT_MAX; | 
|   523     sf->thresh_mult[THR_COMP_NEARESTGA] = INT_MAX; |   462     cpi->rd_thresh_mult[THR_COMP_NEARESTGA] = INT_MAX; | 
|   524     sf->thresh_mult[THR_COMP_NEARGA   ] = INT_MAX; |   463     cpi->rd_thresh_mult[THR_COMP_NEARGA   ] = INT_MAX; | 
|   525     sf->thresh_mult[THR_COMP_NEWGA    ] = INT_MAX; |   464     cpi->rd_thresh_mult[THR_COMP_NEWGA    ] = INT_MAX; | 
|   526   } |   465   } | 
|   527 } |   466 } | 
|   528  |   467  | 
|   529 static void set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) { |   468 static void set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) { | 
|   530   SPEED_FEATURES *sf = &cpi->sf; |   469   const SPEED_FEATURES *const sf = &cpi->sf; | 
|   531   int i; |   470   int i; | 
|   532  |   471  | 
|   533   for (i = 0; i < MAX_REFS; ++i) |   472   for (i = 0; i < MAX_REFS; ++i) | 
|   534     sf->thresh_mult_sub8x8[i] = is_slowest_mode(cpi->oxcf.mode)  ? -500 : 0; |   473     cpi->rd_thresh_mult_sub8x8[i] = is_slowest_mode(cpi->oxcf.mode)  ? -500 : 0; | 
|   535  |   474  | 
|   536   sf->thresh_mult_sub8x8[THR_LAST] += 2500; |   475   cpi->rd_thresh_mult_sub8x8[THR_LAST] += 2500; | 
|   537   sf->thresh_mult_sub8x8[THR_GOLD] += 2500; |   476   cpi->rd_thresh_mult_sub8x8[THR_GOLD] += 2500; | 
|   538   sf->thresh_mult_sub8x8[THR_ALTR] += 2500; |   477   cpi->rd_thresh_mult_sub8x8[THR_ALTR] += 2500; | 
|   539   sf->thresh_mult_sub8x8[THR_INTRA] += 2500; |   478   cpi->rd_thresh_mult_sub8x8[THR_INTRA] += 2500; | 
|   540   sf->thresh_mult_sub8x8[THR_COMP_LA] += 4500; |   479   cpi->rd_thresh_mult_sub8x8[THR_COMP_LA] += 4500; | 
|   541   sf->thresh_mult_sub8x8[THR_COMP_GA] += 4500; |   480   cpi->rd_thresh_mult_sub8x8[THR_COMP_GA] += 4500; | 
|   542  |   481  | 
|   543   // Check for masked out split cases. |   482   // Check for masked out split cases. | 
|   544   for (i = 0; i < MAX_REFS; i++) { |   483   for (i = 0; i < MAX_REFS; i++) | 
|   545     if (sf->disable_split_mask & (1 << i)) |   484     if (sf->disable_split_mask & (1 << i)) | 
|   546       sf->thresh_mult_sub8x8[i] = INT_MAX; |   485       cpi->rd_thresh_mult_sub8x8[i] = INT_MAX; | 
|   547   } |  | 
|   548  |   486  | 
|   549   // disable mode test if frame flag is not set |   487   // disable mode test if frame flag is not set | 
|   550   if (!(cpi->ref_frame_flags & VP9_LAST_FLAG)) |   488   if (!(cpi->ref_frame_flags & VP9_LAST_FLAG)) | 
|   551     sf->thresh_mult_sub8x8[THR_LAST] = INT_MAX; |   489     cpi->rd_thresh_mult_sub8x8[THR_LAST] = INT_MAX; | 
|   552   if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG)) |   490   if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG)) | 
|   553     sf->thresh_mult_sub8x8[THR_GOLD] = INT_MAX; |   491     cpi->rd_thresh_mult_sub8x8[THR_GOLD] = INT_MAX; | 
|   554   if (!(cpi->ref_frame_flags & VP9_ALT_FLAG)) |   492   if (!(cpi->ref_frame_flags & VP9_ALT_FLAG)) | 
|   555     sf->thresh_mult_sub8x8[THR_ALTR] = INT_MAX; |   493     cpi->rd_thresh_mult_sub8x8[THR_ALTR] = INT_MAX; | 
|   556   if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) != |   494   if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) != | 
|   557       (VP9_LAST_FLAG | VP9_ALT_FLAG)) |   495       (VP9_LAST_FLAG | VP9_ALT_FLAG)) | 
|   558     sf->thresh_mult_sub8x8[THR_COMP_LA] = INT_MAX; |   496     cpi->rd_thresh_mult_sub8x8[THR_COMP_LA] = INT_MAX; | 
|   559   if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) != |   497   if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) != | 
|   560       (VP9_GOLD_FLAG | VP9_ALT_FLAG)) |   498       (VP9_GOLD_FLAG | VP9_ALT_FLAG)) | 
|   561     sf->thresh_mult_sub8x8[THR_COMP_GA] = INT_MAX; |   499     cpi->rd_thresh_mult_sub8x8[THR_COMP_GA] = INT_MAX; | 
|   562 } |   500 } | 
|   563  |   501  | 
|   564 static void set_good_speed_feature(VP9_COMMON *cm, |   502 static void set_speed_features(VP9_COMP *cpi) { | 
|   565                                    SPEED_FEATURES *sf, |   503 #if CONFIG_INTERNAL_STATS | 
|   566                                    int speed) { |  | 
|   567   int i; |   504   int i; | 
|   568   sf->adaptive_rd_thresh = 1; |  | 
|   569   sf->recode_loop = ((speed < 1) ? ALLOW_RECODE : ALLOW_RECODE_KFMAXBW); |  | 
|   570   if (speed == 1) { |  | 
|   571     sf->use_square_partition_only = !frame_is_intra_only(cm); |  | 
|   572     sf->less_rectangular_check  = 1; |  | 
|   573     sf->tx_size_search_method = frame_is_intra_only(cm) |  | 
|   574       ? USE_FULL_RD : USE_LARGESTALL; |  | 
|   575  |  | 
|   576     if (MIN(cm->width, cm->height) >= 720) |  | 
|   577       sf->disable_split_mask = cm->show_frame ? |  | 
|   578         DISABLE_ALL_SPLIT : DISABLE_ALL_INTER_SPLIT; |  | 
|   579     else |  | 
|   580       sf->disable_split_mask = DISABLE_COMPOUND_SPLIT; |  | 
|   581  |  | 
|   582     sf->use_rd_breakout = 1; |  | 
|   583     sf->adaptive_motion_search = 1; |  | 
|   584     sf->adaptive_pred_interp_filter = 1; |  | 
|   585     sf->auto_mv_step_size = 1; |  | 
|   586     sf->adaptive_rd_thresh = 2; |  | 
|   587     sf->recode_loop = ALLOW_RECODE_KFARFGF; |  | 
|   588     sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V; |  | 
|   589     sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V; |  | 
|   590     sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V; |  | 
|   591   } |  | 
|   592   if (speed == 2) { |  | 
|   593     sf->use_square_partition_only = !frame_is_intra_only(cm); |  | 
|   594     sf->less_rectangular_check  = 1; |  | 
|   595     sf->tx_size_search_method = frame_is_intra_only(cm) |  | 
|   596       ? USE_FULL_RD : USE_LARGESTALL; |  | 
|   597  |  | 
|   598     if (MIN(cm->width, cm->height) >= 720) |  | 
|   599       sf->disable_split_mask = cm->show_frame ? |  | 
|   600         DISABLE_ALL_SPLIT : DISABLE_ALL_INTER_SPLIT; |  | 
|   601     else |  | 
|   602       sf->disable_split_mask = LAST_AND_INTRA_SPLIT_ONLY; |  | 
|   603  |  | 
|   604     sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH | |  | 
|   605                                  FLAG_SKIP_INTRA_BESTINTER | |  | 
|   606                                  FLAG_SKIP_COMP_BESTINTRA | |  | 
|   607                                  FLAG_SKIP_INTRA_LOWVAR; |  | 
|   608     sf->use_rd_breakout = 1; |  | 
|   609     sf->adaptive_motion_search = 1; |  | 
|   610     sf->adaptive_pred_interp_filter = 2; |  | 
|   611     sf->reference_masking = 1; |  | 
|   612     sf->auto_mv_step_size = 1; |  | 
|   613  |  | 
|   614     sf->disable_filter_search_var_thresh = 50; |  | 
|   615     sf->comp_inter_joint_search_thresh = BLOCK_SIZES; |  | 
|   616  |  | 
|   617     sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX; |  | 
|   618     sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_LOW_MOTION; |  | 
|   619     sf->adjust_partitioning_from_last_frame = 1; |  | 
|   620     sf->last_partitioning_redo_frequency = 3; |  | 
|   621  |  | 
|   622     sf->adaptive_rd_thresh = 2; |  | 
|   623     sf->recode_loop = ALLOW_RECODE_KFARFGF; |  | 
|   624     sf->use_lp32x32fdct = 1; |  | 
|   625     sf->mode_skip_start = 11; |  | 
|   626     sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V; |  | 
|   627     sf->intra_y_mode_mask[TX_16X16] = INTRA_DC_H_V; |  | 
|   628     sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V; |  | 
|   629     sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V; |  | 
|   630   } |  | 
|   631   if (speed == 3) { |  | 
|   632     sf->use_square_partition_only = 1; |  | 
|   633     sf->tx_size_search_method = USE_LARGESTALL; |  | 
|   634  |  | 
|   635     if (MIN(cm->width, cm->height) >= 720) |  | 
|   636       sf->disable_split_mask = DISABLE_ALL_SPLIT; |  | 
|   637     else |  | 
|   638       sf->disable_split_mask = DISABLE_ALL_INTER_SPLIT; |  | 
|   639  |  | 
|   640     sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH | |  | 
|   641       FLAG_SKIP_INTRA_BESTINTER | |  | 
|   642       FLAG_SKIP_COMP_BESTINTRA | |  | 
|   643       FLAG_SKIP_INTRA_LOWVAR; |  | 
|   644  |  | 
|   645     sf->use_rd_breakout = 1; |  | 
|   646     sf->adaptive_motion_search = 1; |  | 
|   647     sf->adaptive_pred_interp_filter = 2; |  | 
|   648     sf->reference_masking = 1; |  | 
|   649     sf->auto_mv_step_size = 1; |  | 
|   650  |  | 
|   651     sf->disable_split_var_thresh = 32; |  | 
|   652     sf->disable_filter_search_var_thresh = 100; |  | 
|   653     sf->comp_inter_joint_search_thresh = BLOCK_SIZES; |  | 
|   654  |  | 
|   655     sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX; |  | 
|   656     sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_ALL; |  | 
|   657     sf->adjust_partitioning_from_last_frame = 1; |  | 
|   658     sf->last_partitioning_redo_frequency = 3; |  | 
|   659  |  | 
|   660     sf->use_uv_intra_rd_estimate = 1; |  | 
|   661     sf->skip_encode_sb = 1; |  | 
|   662     sf->use_lp32x32fdct = 1; |  | 
|   663     sf->subpel_iters_per_step = 1; |  | 
|   664     sf->use_fast_coef_updates = 2; |  | 
|   665  |  | 
|   666     sf->adaptive_rd_thresh = 4; |  | 
|   667     sf->mode_skip_start = 6; |  | 
|   668   } |  | 
|   669   if (speed == 4) { |  | 
|   670     sf->use_square_partition_only = 1; |  | 
|   671     sf->tx_size_search_method = USE_LARGESTALL; |  | 
|   672     sf->disable_split_mask = DISABLE_ALL_SPLIT; |  | 
|   673  |  | 
|   674     sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH | |  | 
|   675       FLAG_SKIP_INTRA_BESTINTER | |  | 
|   676       FLAG_SKIP_COMP_BESTINTRA | |  | 
|   677       FLAG_SKIP_COMP_REFMISMATCH | |  | 
|   678       FLAG_SKIP_INTRA_LOWVAR | |  | 
|   679       FLAG_EARLY_TERMINATE; |  | 
|   680  |  | 
|   681     sf->use_rd_breakout = 1; |  | 
|   682     sf->adaptive_motion_search = 1; |  | 
|   683     sf->adaptive_pred_interp_filter = 2; |  | 
|   684     sf->reference_masking = 1; |  | 
|   685     sf->auto_mv_step_size = 1; |  | 
|   686  |  | 
|   687     sf->disable_split_var_thresh = 64; |  | 
|   688     sf->disable_filter_search_var_thresh = 200; |  | 
|   689     sf->comp_inter_joint_search_thresh = BLOCK_SIZES; |  | 
|   690  |  | 
|   691     sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX; |  | 
|   692     sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_ALL; |  | 
|   693     sf->adjust_partitioning_from_last_frame = 1; |  | 
|   694     sf->last_partitioning_redo_frequency = 3; |  | 
|   695  |  | 
|   696     sf->use_uv_intra_rd_estimate = 1; |  | 
|   697     sf->skip_encode_sb = 1; |  | 
|   698     sf->use_lp32x32fdct = 1; |  | 
|   699     sf->subpel_iters_per_step = 1; |  | 
|   700     sf->use_fast_coef_updates = 2; |  | 
|   701  |  | 
|   702     sf->adaptive_rd_thresh = 4; |  | 
|   703     sf->mode_skip_start = 6; |  | 
|   704   } |  | 
|   705   if (speed >= 5) { |  | 
|   706     sf->comp_inter_joint_search_thresh = BLOCK_SIZES; |  | 
|   707     sf->partition_search_type = FIXED_PARTITION; |  | 
|   708     sf->always_this_block_size = BLOCK_16X16; |  | 
|   709     sf->tx_size_search_method = frame_is_intra_only(cm) ? |  | 
|   710       USE_FULL_RD : USE_LARGESTALL; |  | 
|   711     sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH | |  | 
|   712                                  FLAG_SKIP_INTRA_BESTINTER | |  | 
|   713                                  FLAG_SKIP_COMP_BESTINTRA | |  | 
|   714                                  FLAG_SKIP_COMP_REFMISMATCH | |  | 
|   715                                  FLAG_SKIP_INTRA_LOWVAR | |  | 
|   716                                  FLAG_EARLY_TERMINATE; |  | 
|   717     sf->use_rd_breakout = 1; |  | 
|   718     sf->use_lp32x32fdct = 1; |  | 
|   719     sf->optimize_coefficients = 0; |  | 
|   720     sf->auto_mv_step_size = 1; |  | 
|   721     sf->reference_masking = 1; |  | 
|   722  |  | 
|   723     sf->disable_split_mask = DISABLE_ALL_SPLIT; |  | 
|   724     sf->search_method = HEX; |  | 
|   725     sf->subpel_iters_per_step = 1; |  | 
|   726     sf->disable_split_var_thresh = 64; |  | 
|   727     sf->disable_filter_search_var_thresh = 500; |  | 
|   728     for (i = 0; i < TX_SIZES; i++) { |  | 
|   729       sf->intra_y_mode_mask[i] = INTRA_DC_ONLY; |  | 
|   730       sf->intra_uv_mode_mask[i] = INTRA_DC_ONLY; |  | 
|   731     } |  | 
|   732     sf->use_fast_coef_updates = 2; |  | 
|   733     sf->adaptive_rd_thresh = 4; |  | 
|   734     sf->mode_skip_start = 6; |  | 
|   735   } |  | 
|   736 } |  | 
|   737  |  | 
|   738 static void set_rt_speed_feature(VP9_COMMON *cm, |  | 
|   739                                  SPEED_FEATURES *sf, |  | 
|   740                                  int speed) { |  | 
|   741   sf->static_segmentation = 0; |  | 
|   742   sf->adaptive_rd_thresh = 1; |  | 
|   743   sf->recode_loop = ((speed < 1) ? ALLOW_RECODE : ALLOW_RECODE_KFMAXBW); |  | 
|   744   sf->encode_breakout_thresh = 1; |  | 
|   745  |  | 
|   746   if (speed == 1) { |  | 
|   747     sf->use_square_partition_only = !frame_is_intra_only(cm); |  | 
|   748     sf->less_rectangular_check = 1; |  | 
|   749     sf->tx_size_search_method = |  | 
|   750         frame_is_intra_only(cm) ? USE_FULL_RD : USE_LARGESTALL; |  | 
|   751  |  | 
|   752     if (MIN(cm->width, cm->height) >= 720) |  | 
|   753       sf->disable_split_mask = cm->show_frame ? |  | 
|   754         DISABLE_ALL_SPLIT : DISABLE_ALL_INTER_SPLIT; |  | 
|   755     else |  | 
|   756       sf->disable_split_mask = DISABLE_COMPOUND_SPLIT; |  | 
|   757  |  | 
|   758     sf->use_rd_breakout = 1; |  | 
|   759     sf->adaptive_motion_search = 1; |  | 
|   760     sf->adaptive_pred_interp_filter = 1; |  | 
|   761     sf->auto_mv_step_size = 1; |  | 
|   762     sf->adaptive_rd_thresh = 2; |  | 
|   763     sf->recode_loop = ALLOW_RECODE_KFARFGF; |  | 
|   764     sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V; |  | 
|   765     sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V; |  | 
|   766     sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V; |  | 
|   767     sf->encode_breakout_thresh = 8; |  | 
|   768   } |  | 
|   769   if (speed >= 2) { |  | 
|   770     sf->use_square_partition_only = !frame_is_intra_only(cm); |  | 
|   771     sf->less_rectangular_check = 1; |  | 
|   772     sf->tx_size_search_method = |  | 
|   773         frame_is_intra_only(cm) ? USE_FULL_RD : USE_LARGESTALL; |  | 
|   774  |  | 
|   775     if (MIN(cm->width, cm->height) >= 720) |  | 
|   776       sf->disable_split_mask = cm->show_frame ? |  | 
|   777         DISABLE_ALL_SPLIT : DISABLE_ALL_INTER_SPLIT; |  | 
|   778     else |  | 
|   779       sf->disable_split_mask = LAST_AND_INTRA_SPLIT_ONLY; |  | 
|   780  |  | 
|   781     sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |  | 
|   782         | FLAG_SKIP_INTRA_BESTINTER | FLAG_SKIP_COMP_BESTINTRA |  | 
|   783         | FLAG_SKIP_INTRA_LOWVAR; |  | 
|   784  |  | 
|   785     sf->use_rd_breakout = 1; |  | 
|   786     sf->adaptive_motion_search = 1; |  | 
|   787     sf->adaptive_pred_interp_filter = 2; |  | 
|   788     sf->auto_mv_step_size = 1; |  | 
|   789     sf->reference_masking = 1; |  | 
|   790  |  | 
|   791     sf->disable_filter_search_var_thresh = 50; |  | 
|   792     sf->comp_inter_joint_search_thresh = BLOCK_SIZES; |  | 
|   793  |  | 
|   794     sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX; |  | 
|   795     sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_LOW_MOTION; |  | 
|   796     sf->adjust_partitioning_from_last_frame = 1; |  | 
|   797     sf->last_partitioning_redo_frequency = 3; |  | 
|   798  |  | 
|   799     sf->adaptive_rd_thresh = 2; |  | 
|   800     sf->recode_loop = ALLOW_RECODE_KFARFGF; |  | 
|   801     sf->use_lp32x32fdct = 1; |  | 
|   802     sf->mode_skip_start = 11; |  | 
|   803     sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V; |  | 
|   804     sf->intra_y_mode_mask[TX_16X16] = INTRA_DC_H_V; |  | 
|   805     sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V; |  | 
|   806     sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V; |  | 
|   807     sf->encode_breakout_thresh = 200; |  | 
|   808   } |  | 
|   809   if (speed >= 3) { |  | 
|   810     sf->use_square_partition_only = 1; |  | 
|   811     sf->tx_size_search_method = USE_LARGESTALL; |  | 
|   812  |  | 
|   813     if (MIN(cm->width, cm->height) >= 720) |  | 
|   814       sf->disable_split_mask = DISABLE_ALL_SPLIT; |  | 
|   815     else |  | 
|   816       sf->disable_split_mask = DISABLE_ALL_INTER_SPLIT; |  | 
|   817  |  | 
|   818     sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |  | 
|   819         | FLAG_SKIP_INTRA_BESTINTER | FLAG_SKIP_COMP_BESTINTRA |  | 
|   820         | FLAG_SKIP_INTRA_LOWVAR; |  | 
|   821  |  | 
|   822     sf->disable_filter_search_var_thresh = 100; |  | 
|   823     sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_ALL; |  | 
|   824     sf->use_uv_intra_rd_estimate = 1; |  | 
|   825     sf->skip_encode_sb = 1; |  | 
|   826     sf->subpel_iters_per_step = 1; |  | 
|   827     sf->use_fast_coef_updates = 2; |  | 
|   828     sf->adaptive_rd_thresh = 4; |  | 
|   829     sf->mode_skip_start = 6; |  | 
|   830     sf->encode_breakout_thresh = 400; |  | 
|   831   } |  | 
|   832   if (speed >= 4) { |  | 
|   833     sf->optimize_coefficients = 0; |  | 
|   834     sf->disable_split_mask = DISABLE_ALL_SPLIT; |  | 
|   835     sf->use_fast_lpf_pick = 2; |  | 
|   836     sf->encode_breakout_thresh = 700; |  | 
|   837   } |  | 
|   838   if (speed >= 5) { |  | 
|   839     int i; |  | 
|   840     sf->adaptive_rd_thresh = 5; |  | 
|   841     sf->auto_min_max_partition_size = frame_is_intra_only(cm) ? |  | 
|   842         RELAXED_NEIGHBORING_MIN_MAX : STRICT_NEIGHBORING_MIN_MAX; |  | 
|   843     sf->adjust_partitioning_from_last_frame = |  | 
|   844         cm->last_frame_type == KEY_FRAME || (0 == |  | 
|   845         (cm->current_video_frame + 1) % sf->last_partitioning_redo_frequency); |  | 
|   846     sf->subpel_force_stop = 1; |  | 
|   847     for (i = 0; i < TX_SIZES; i++) { |  | 
|   848       sf->intra_y_mode_mask[i] = INTRA_DC_H_V; |  | 
|   849       sf->intra_uv_mode_mask[i] = INTRA_DC_ONLY; |  | 
|   850     } |  | 
|   851     sf->frame_parameter_update = 0; |  | 
|   852     sf->encode_breakout_thresh = 1000; |  | 
|   853     sf->search_method = FAST_HEX; |  | 
|   854   } |  | 
|   855   if (speed >= 6) { |  | 
|   856     sf->partition_search_type = VAR_BASED_FIXED_PARTITION; |  | 
|   857     sf->search_method = HEX; |  | 
|   858   } |  | 
|   859   if (speed >= 7) { |  | 
|   860     sf->partition_search_type = VAR_BASED_FIXED_PARTITION; |  | 
|   861     sf->use_nonrd_pick_mode = 1; |  | 
|   862     sf->search_method = FAST_HEX; |  | 
|   863   } |  | 
|   864   if (speed >= 8) { |  | 
|   865     int i; |  | 
|   866     for (i = 0; i < BLOCK_SIZES; ++i) |  | 
|   867       sf->disable_inter_mode_mask[i] = 14;   // only search NEARESTMV (0) |  | 
|   868   } |  | 
|   869 } |  | 
|   870  |  | 
|   871 void vp9_set_speed_features(VP9_COMP *cpi) { |  | 
|   872   SPEED_FEATURES *sf = &cpi->sf; |  | 
|   873   VP9_COMMON *cm = &cpi->common; |  | 
|   874   int speed = cpi->speed; |  | 
|   875   int i; |  | 
|   876  |  | 
|   877   // Convert negative speed to positive |  | 
|   878   if (speed < 0) |  | 
|   879     speed = -speed; |  | 
|   880  |  | 
|   881 #if CONFIG_INTERNAL_STATS |  | 
|   882   for (i = 0; i < MAX_MODES; ++i) |   505   for (i = 0; i < MAX_MODES; ++i) | 
|   883     cpi->mode_chosen_counts[i] = 0; |   506     cpi->mode_chosen_counts[i] = 0; | 
|   884 #endif |   507 #endif | 
|   885  |   508  | 
|   886   // best quality defaults |   509   vp9_set_speed_features(cpi); | 
|   887   sf->frame_parameter_update = 1; |  | 
|   888   sf->search_method = NSTEP; |  | 
|   889   sf->recode_loop = ALLOW_RECODE; |  | 
|   890   sf->subpel_search_method = SUBPEL_TREE; |  | 
|   891   sf->subpel_iters_per_step = 2; |  | 
|   892   sf->subpel_force_stop = 0; |  | 
|   893   sf->optimize_coefficients = !cpi->oxcf.lossless; |  | 
|   894   sf->reduce_first_step_size = 0; |  | 
|   895   sf->auto_mv_step_size = 0; |  | 
|   896   sf->max_step_search_steps = MAX_MVSEARCH_STEPS; |  | 
|   897   sf->comp_inter_joint_search_thresh = BLOCK_4X4; |  | 
|   898   sf->adaptive_rd_thresh = 0; |  | 
|   899   sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_OFF; |  | 
|   900   sf->tx_size_search_method = USE_FULL_RD; |  | 
|   901   sf->use_lp32x32fdct = 0; |  | 
|   902   sf->adaptive_motion_search = 0; |  | 
|   903   sf->adaptive_pred_interp_filter = 0; |  | 
|   904   sf->reference_masking = 0; |  | 
|   905   sf->partition_search_type = SEARCH_PARTITION; |  | 
|   906   sf->less_rectangular_check = 0; |  | 
|   907   sf->use_square_partition_only = 0; |  | 
|   908   sf->auto_min_max_partition_size = NOT_IN_USE; |  | 
|   909   sf->max_partition_size = BLOCK_64X64; |  | 
|   910   sf->min_partition_size = BLOCK_4X4; |  | 
|   911   sf->adjust_partitioning_from_last_frame = 0; |  | 
|   912   sf->last_partitioning_redo_frequency = 4; |  | 
|   913   sf->disable_split_mask = 0; |  | 
|   914   sf->mode_search_skip_flags = 0; |  | 
|   915   sf->disable_split_var_thresh = 0; |  | 
|   916   sf->disable_filter_search_var_thresh = 0; |  | 
|   917   for (i = 0; i < TX_SIZES; i++) { |  | 
|   918     sf->intra_y_mode_mask[i] = ALL_INTRA_MODES; |  | 
|   919     sf->intra_uv_mode_mask[i] = ALL_INTRA_MODES; |  | 
|   920   } |  | 
|   921   sf->use_rd_breakout = 0; |  | 
|   922   sf->skip_encode_sb = 0; |  | 
|   923   sf->use_uv_intra_rd_estimate = 0; |  | 
|   924   sf->use_fast_lpf_pick = 0; |  | 
|   925   sf->use_fast_coef_updates = 0; |  | 
|   926   sf->mode_skip_start = MAX_MODES;  // Mode index at which mode skip mask set |  | 
|   927   sf->use_nonrd_pick_mode = 0; |  | 
|   928   sf->encode_breakout_thresh = 0; |  | 
|   929   for (i = 0; i < BLOCK_SIZES; ++i) |  | 
|   930     sf->disable_inter_mode_mask[i] = 0; |  | 
|   931  |  | 
|   932   switch (cpi->oxcf.mode) { |  | 
|   933     case MODE_BESTQUALITY: |  | 
|   934     case MODE_SECONDPASS_BEST:  // This is the best quality mode. |  | 
|   935       cpi->diamond_search_sad = vp9_full_range_search; |  | 
|   936       break; |  | 
|   937     case MODE_FIRSTPASS: |  | 
|   938     case MODE_GOODQUALITY: |  | 
|   939     case MODE_SECONDPASS: |  | 
|   940       set_good_speed_feature(cm, sf, speed); |  | 
|   941       break; |  | 
|   942     case MODE_REALTIME: |  | 
|   943       set_rt_speed_feature(cm, sf, speed); |  | 
|   944       break; |  | 
|   945   }; /* switch */ |  | 
|   946  |   510  | 
|   947   // Set rd thresholds based on mode and speed setting |   511   // Set rd thresholds based on mode and speed setting | 
|   948   set_rd_speed_thresholds(cpi); |   512   set_rd_speed_thresholds(cpi); | 
|   949   set_rd_speed_thresholds_sub8x8(cpi); |   513   set_rd_speed_thresholds_sub8x8(cpi); | 
|   950  |   514  | 
|   951   // Slow quant, dct and trellis not worthwhile for first pass |  | 
|   952   // so make sure they are always turned off. |  | 
|   953   if (cpi->pass == 1) { |  | 
|   954     sf->optimize_coefficients = 0; |  | 
|   955   } |  | 
|   956  |  | 
|   957   // No recode for 1 pass. |  | 
|   958   if (cpi->pass == 0) { |  | 
|   959     sf->recode_loop = DISALLOW_RECODE; |  | 
|   960     sf->optimize_coefficients = 0; |  | 
|   961   } |  | 
|   962  |  | 
|   963   cpi->mb.fwd_txm4x4 = vp9_fdct4x4; |   515   cpi->mb.fwd_txm4x4 = vp9_fdct4x4; | 
|   964   if (cpi->oxcf.lossless || cpi->mb.e_mbd.lossless) { |   516   if (cpi->oxcf.lossless || cpi->mb.e_mbd.lossless) { | 
|   965     cpi->mb.fwd_txm4x4 = vp9_fwht4x4; |   517     cpi->mb.fwd_txm4x4 = vp9_fwht4x4; | 
|   966   } |   518   } | 
|   967  |  | 
|   968   if (cpi->sf.subpel_search_method == SUBPEL_TREE) { |  | 
|   969     cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree; |  | 
|   970     cpi->find_fractional_mv_step_comp = vp9_find_best_sub_pixel_comp_tree; |  | 
|   971   } |  | 
|   972  |  | 
|   973   cpi->mb.optimize = cpi->sf.optimize_coefficients == 1 && cpi->pass != 1; |  | 
|   974  |  | 
|   975   if (cpi->encode_breakout && cpi->oxcf.mode == MODE_REALTIME && |  | 
|   976       sf->encode_breakout_thresh > cpi->encode_breakout) |  | 
|   977     cpi->encode_breakout = sf->encode_breakout_thresh; |  | 
|   978  |  | 
|   979   if (sf->disable_split_mask == DISABLE_ALL_SPLIT) |  | 
|   980     sf->adaptive_pred_interp_filter = 0; |  | 
|   981 } |   519 } | 
|   982  |   520  | 
|   983 static void alloc_raw_frame_buffers(VP9_COMP *cpi) { |   521 static void alloc_raw_frame_buffers(VP9_COMP *cpi) { | 
|   984   VP9_COMMON *cm = &cpi->common; |   522   VP9_COMMON *cm = &cpi->common; | 
|   985   const VP9_CONFIG *oxcf = &cpi->oxcf; |   523   const VP9_CONFIG *oxcf = &cpi->oxcf; | 
|   986  |   524  | 
|   987   cpi->lookahead = vp9_lookahead_init(oxcf->width, oxcf->height, |   525   cpi->lookahead = vp9_lookahead_init(oxcf->width, oxcf->height, | 
|   988                                       cm->subsampling_x, cm->subsampling_y, |   526                                       cm->subsampling_x, cm->subsampling_y, | 
|   989                                       oxcf->lag_in_frames); |   527                                       oxcf->lag_in_frames); | 
|   990   if (!cpi->lookahead) |   528   if (!cpi->lookahead) | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
|  1013     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, |   551     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, | 
|  1014                        "Failed to allocate last frame buffer"); |   552                        "Failed to allocate last frame buffer"); | 
|  1015  |   553  | 
|  1016   if (vp9_alloc_frame_buffer(&cpi->scaled_source, |   554   if (vp9_alloc_frame_buffer(&cpi->scaled_source, | 
|  1017                              cm->width, cm->height, |   555                              cm->width, cm->height, | 
|  1018                              cm->subsampling_x, cm->subsampling_y, |   556                              cm->subsampling_x, cm->subsampling_y, | 
|  1019                              VP9_ENC_BORDER_IN_PIXELS)) |   557                              VP9_ENC_BORDER_IN_PIXELS)) | 
|  1020     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, |   558     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, | 
|  1021                        "Failed to allocate scaled source buffer"); |   559                        "Failed to allocate scaled source buffer"); | 
|  1022  |   560  | 
 |   561   if (vp9_alloc_frame_buffer(&cpi->scaled_last_source, | 
 |   562                              cm->width, cm->height, | 
 |   563                              cm->subsampling_x, cm->subsampling_y, | 
 |   564                              VP9_ENC_BORDER_IN_PIXELS)) | 
 |   565     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, | 
 |   566                        "Failed to allocate scaled last source buffer"); | 
 |   567  | 
|  1023   vpx_free(cpi->tok); |   568   vpx_free(cpi->tok); | 
|  1024  |   569  | 
|  1025   { |   570   { | 
|  1026     unsigned int tokens = get_token_alloc(cm->mb_rows, cm->mb_cols); |   571     unsigned int tokens = get_token_alloc(cm->mb_rows, cm->mb_cols); | 
|  1027  |   572  | 
|  1028     CHECK_MEM_ERROR(cm, cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok))); |   573     CHECK_MEM_ERROR(cm, cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok))); | 
|  1029   } |   574   } | 
|  1030  |   575  | 
|  1031   vpx_free(cpi->mb_activity_map); |   576   vpx_free(cpi->mb_activity_map); | 
|  1032   CHECK_MEM_ERROR(cm, cpi->mb_activity_map, |   577   CHECK_MEM_ERROR(cm, cpi->mb_activity_map, | 
|  1033                   vpx_calloc(sizeof(unsigned int), |   578                   vpx_calloc(sizeof(unsigned int), | 
|  1034                              cm->mb_rows * cm->mb_cols)); |   579                              cm->mb_rows * cm->mb_cols)); | 
|  1035  |   580  | 
|  1036   vpx_free(cpi->mb_norm_activity_map); |   581   vpx_free(cpi->mb_norm_activity_map); | 
|  1037   CHECK_MEM_ERROR(cm, cpi->mb_norm_activity_map, |   582   CHECK_MEM_ERROR(cm, cpi->mb_norm_activity_map, | 
|  1038                   vpx_calloc(sizeof(unsigned int), |   583                   vpx_calloc(sizeof(unsigned int), | 
|  1039                              cm->mb_rows * cm->mb_cols)); |   584                              cm->mb_rows * cm->mb_cols)); | 
|  1040  |  | 
|  1041   // 2 contexts per 'mi unit', so that we have one context per 4x4 txfm |  | 
|  1042   // block where mi unit size is 8x8. |  | 
|  1043   vpx_free(cpi->above_context[0]); |  | 
|  1044   CHECK_MEM_ERROR(cm, cpi->above_context[0], |  | 
|  1045                   vpx_calloc(2 * mi_cols_aligned_to_sb(cm->mi_cols) * |  | 
|  1046                              MAX_MB_PLANE, |  | 
|  1047                              sizeof(*cpi->above_context[0]))); |  | 
|  1048  |  | 
|  1049   vpx_free(cpi->above_seg_context); |  | 
|  1050   CHECK_MEM_ERROR(cm, cpi->above_seg_context, |  | 
|  1051                   vpx_calloc(mi_cols_aligned_to_sb(cm->mi_cols), |  | 
|  1052                              sizeof(*cpi->above_seg_context))); |  | 
|  1053 } |   585 } | 
|  1054  |   586  | 
|  1055  |   587  | 
|  1056 static void update_frame_size(VP9_COMP *cpi) { |   588 static void update_frame_size(VP9_COMP *cpi) { | 
|  1057   VP9_COMMON *cm = &cpi->common; |   589   VP9_COMMON *const cm = &cpi->common; | 
 |   590   MACROBLOCKD *const xd = &cpi->mb.e_mbd; | 
|  1058  |   591  | 
|  1059   vp9_update_frame_size(cm); |   592   vp9_update_frame_size(cm); | 
|  1060  |   593  | 
|  1061   // Update size of buffers local to this frame |   594   // Update size of buffers local to this frame | 
|  1062   if (vp9_realloc_frame_buffer(&cpi->last_frame_uf, |   595   if (vp9_realloc_frame_buffer(&cpi->last_frame_uf, | 
|  1063                                cm->width, cm->height, |   596                                cm->width, cm->height, | 
|  1064                                cm->subsampling_x, cm->subsampling_y, |   597                                cm->subsampling_x, cm->subsampling_y, | 
|  1065                                VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL)) |   598                                VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL)) | 
|  1066     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, |   599     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, | 
|  1067                        "Failed to reallocate last frame buffer"); |   600                        "Failed to reallocate last frame buffer"); | 
|  1068  |   601  | 
|  1069   if (vp9_realloc_frame_buffer(&cpi->scaled_source, |   602   if (vp9_realloc_frame_buffer(&cpi->scaled_source, | 
|  1070                                cm->width, cm->height, |   603                                cm->width, cm->height, | 
|  1071                                cm->subsampling_x, cm->subsampling_y, |   604                                cm->subsampling_x, cm->subsampling_y, | 
|  1072                                VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL)) |   605                                VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL)) | 
|  1073     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, |   606     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, | 
|  1074                        "Failed to reallocate scaled source buffer"); |   607                        "Failed to reallocate scaled source buffer"); | 
|  1075  |   608  | 
 |   609   if (vp9_realloc_frame_buffer(&cpi->scaled_last_source, | 
 |   610                                cm->width, cm->height, | 
 |   611                                cm->subsampling_x, cm->subsampling_y, | 
 |   612                                VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL)) | 
 |   613     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, | 
 |   614                        "Failed to reallocate scaled last source buffer"); | 
 |   615  | 
|  1076   { |   616   { | 
|  1077     int y_stride = cpi->scaled_source.y_stride; |   617     int y_stride = cpi->scaled_source.y_stride; | 
|  1078  |   618  | 
|  1079     if (cpi->sf.search_method == NSTEP) { |   619     if (cpi->sf.search_method == NSTEP) { | 
|  1080       vp9_init3smotion_compensation(&cpi->mb, y_stride); |   620       vp9_init3smotion_compensation(&cpi->mb, y_stride); | 
|  1081     } else if (cpi->sf.search_method == DIAMOND) { |   621     } else if (cpi->sf.search_method == DIAMOND) { | 
|  1082       vp9_init_dsmotion_compensation(&cpi->mb, y_stride); |   622       vp9_init_dsmotion_compensation(&cpi->mb, y_stride); | 
|  1083     } |   623     } | 
|  1084   } |   624   } | 
|  1085  |   625  | 
|  1086   { |   626   init_macroblockd(cm, xd); | 
|  1087     int i; |  | 
|  1088     for (i = 1; i < MAX_MB_PLANE; ++i) { |  | 
|  1089       cpi->above_context[i] = cpi->above_context[0] + |  | 
|  1090                               i * sizeof(*cpi->above_context[0]) * 2 * |  | 
|  1091                               mi_cols_aligned_to_sb(cm->mi_cols); |  | 
|  1092     } |  | 
|  1093   } |  | 
|  1094 } |   627 } | 
|  1095  |   628  | 
|  1096  |  | 
|  1097 // Table that converts 0-63 Q range values passed in outside to the Qindex |  | 
|  1098 // range used internally. |  | 
|  1099 static const int q_trans[] = { |  | 
|  1100   0,    4,   8,  12,  16,  20,  24,  28, |  | 
|  1101   32,   36,  40,  44,  48,  52,  56,  60, |  | 
|  1102   64,   68,  72,  76,  80,  84,  88,  92, |  | 
|  1103   96,  100, 104, 108, 112, 116, 120, 124, |  | 
|  1104   128, 132, 136, 140, 144, 148, 152, 156, |  | 
|  1105   160, 164, 168, 172, 176, 180, 184, 188, |  | 
|  1106   192, 196, 200, 204, 208, 212, 216, 220, |  | 
|  1107   224, 228, 232, 236, 240, 244, 249, 255, |  | 
|  1108 }; |  | 
|  1109  |  | 
|  1110 int vp9_reverse_trans(int x) { |  | 
|  1111   int i; |  | 
|  1112  |  | 
|  1113   for (i = 0; i < 64; i++) |  | 
|  1114     if (q_trans[i] >= x) |  | 
|  1115       return i; |  | 
|  1116  |  | 
|  1117   return 63; |  | 
|  1118 }; |  | 
|  1119  |  | 
|  1120 void vp9_new_framerate(VP9_COMP *cpi, double framerate) { |   629 void vp9_new_framerate(VP9_COMP *cpi, double framerate) { | 
|  1121   VP9_COMMON *const cm = &cpi->common; |   630   VP9_COMMON *const cm = &cpi->common; | 
 |   631   RATE_CONTROL *const rc = &cpi->rc; | 
 |   632   VP9_CONFIG *const oxcf = &cpi->oxcf; | 
|  1122   int vbr_max_bits; |   633   int vbr_max_bits; | 
|  1123  |   634  | 
|  1124   if (framerate < 0.1) |   635   oxcf->framerate = framerate < 0.1 ? 30 : framerate; | 
|  1125     framerate = 30; |   636   cpi->output_framerate = cpi->oxcf.framerate; | 
 |   637   rc->av_per_frame_bandwidth = (int)(oxcf->target_bandwidth / | 
 |   638                                      cpi->output_framerate); | 
 |   639   rc->min_frame_bandwidth = (int)(rc->av_per_frame_bandwidth * | 
 |   640                                   oxcf->two_pass_vbrmin_section / 100); | 
|  1126  |   641  | 
|  1127   cpi->oxcf.framerate = framerate; |   642   rc->min_frame_bandwidth = MAX(rc->min_frame_bandwidth, FRAME_OVERHEAD_BITS); | 
|  1128   cpi->output_framerate = cpi->oxcf.framerate; |  | 
|  1129   cpi->rc.av_per_frame_bandwidth = (int)(cpi->oxcf.target_bandwidth |  | 
|  1130                                          / cpi->output_framerate); |  | 
|  1131   cpi->rc.min_frame_bandwidth = (int)(cpi->rc.av_per_frame_bandwidth * |  | 
|  1132                                       cpi->oxcf.two_pass_vbrmin_section / 100); |  | 
|  1133  |  | 
|  1134  |  | 
|  1135   cpi->rc.min_frame_bandwidth = MAX(cpi->rc.min_frame_bandwidth, |  | 
|  1136                                     FRAME_OVERHEAD_BITS); |  | 
|  1137  |   643  | 
|  1138   // A maximum bitrate for a frame is defined. |   644   // A maximum bitrate for a frame is defined. | 
|  1139   // The baseline for this aligns with HW implementations that |   645   // The baseline for this aligns with HW implementations that | 
|  1140   // can support decode of 1080P content up to a bitrate of MAX_MB_RATE bits |   646   // can support decode of 1080P content up to a bitrate of MAX_MB_RATE bits | 
|  1141   // per 16x16 MB (averaged over a frame). However this limit is extended if |   647   // per 16x16 MB (averaged over a frame). However this limit is extended if | 
|  1142   // a very high rate is given on the command line or the the rate cannnot |   648   // a very high rate is given on the command line or the the rate cannnot | 
|  1143   // be acheived because of a user specificed max q (e.g. when the user |   649   // be acheived because of a user specificed max q (e.g. when the user | 
|  1144   // specifies lossless encode. |   650   // specifies lossless encode. | 
|  1145   // |   651   // | 
|  1146   vbr_max_bits = (int)(((int64_t)cpi->rc.av_per_frame_bandwidth * |   652   vbr_max_bits = (int)(((int64_t)rc->av_per_frame_bandwidth * | 
|  1147       cpi->oxcf.two_pass_vbrmax_section) / 100); |   653       oxcf->two_pass_vbrmax_section) / 100); | 
|  1148   cpi->rc.max_frame_bandwidth = |   654   rc->max_frame_bandwidth = MAX(MAX((cm->MBs * MAX_MB_RATE), MAXRATE_1080P), | 
|  1149       MAX(MAX((cm->MBs * MAX_MB_RATE), MAXRATE_1080P), vbr_max_bits); |   655                                 vbr_max_bits); | 
|  1150  |   656  | 
|  1151   // Set Maximum gf/arf interval |   657   // Set Maximum gf/arf interval | 
|  1152   cpi->rc.max_gf_interval = 16; |   658   rc->max_gf_interval = 16; | 
|  1153  |   659  | 
|  1154   // Extended interval for genuinely static scenes |   660   // Extended interval for genuinely static scenes | 
|  1155   cpi->twopass.static_scene_max_gf_interval = cpi->key_frame_frequency >> 1; |   661   rc->static_scene_max_gf_interval = cpi->key_frame_frequency >> 1; | 
|  1156  |   662  | 
|  1157   // Special conditions when alt ref frame enabled in lagged compress mode |   663   // Special conditions when alt ref frame enabled in lagged compress mode | 
|  1158   if (cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames) { |   664   if (oxcf->play_alternate && oxcf->lag_in_frames) { | 
|  1159     if (cpi->rc.max_gf_interval > cpi->oxcf.lag_in_frames - 1) |   665     if (rc->max_gf_interval > oxcf->lag_in_frames - 1) | 
|  1160       cpi->rc.max_gf_interval = cpi->oxcf.lag_in_frames - 1; |   666       rc->max_gf_interval = oxcf->lag_in_frames - 1; | 
|  1161  |   667  | 
|  1162     if (cpi->twopass.static_scene_max_gf_interval > cpi->oxcf.lag_in_frames - 1) |   668     if (rc->static_scene_max_gf_interval > oxcf->lag_in_frames - 1) | 
|  1163       cpi->twopass.static_scene_max_gf_interval = cpi->oxcf.lag_in_frames - 1; |   669       rc->static_scene_max_gf_interval = oxcf->lag_in_frames - 1; | 
|  1164   } |   670   } | 
|  1165  |   671  | 
|  1166   if (cpi->rc.max_gf_interval > cpi->twopass.static_scene_max_gf_interval) |   672   if (rc->max_gf_interval > rc->static_scene_max_gf_interval) | 
|  1167     cpi->rc.max_gf_interval = cpi->twopass.static_scene_max_gf_interval; |   673     rc->max_gf_interval = rc->static_scene_max_gf_interval; | 
|  1168 } |   674 } | 
|  1169  |   675  | 
|  1170 static int64_t rescale(int64_t val, int64_t num, int denom) { |   676 int64_t vp9_rescale(int64_t val, int64_t num, int denom) { | 
|  1171   int64_t llnum = num; |   677   int64_t llnum = num; | 
|  1172   int64_t llden = denom; |   678   int64_t llden = denom; | 
|  1173   int64_t llval = val; |   679   int64_t llval = val; | 
|  1174  |   680  | 
|  1175   return (llval * llnum / llden); |   681   return (llval * llnum / llden); | 
|  1176 } |   682 } | 
|  1177  |   683  | 
|  1178 // Initialize layer context data from init_config(). |  | 
|  1179 static void init_layer_context(VP9_COMP *const cpi) { |  | 
|  1180   const VP9_CONFIG *const oxcf = &cpi->oxcf; |  | 
|  1181   int temporal_layer = 0; |  | 
|  1182   cpi->svc.spatial_layer_id = 0; |  | 
|  1183   cpi->svc.temporal_layer_id = 0; |  | 
|  1184   for (temporal_layer = 0; temporal_layer < cpi->svc.number_temporal_layers; |  | 
|  1185       ++temporal_layer) { |  | 
|  1186     LAYER_CONTEXT *const lc = &cpi->svc.layer_context[temporal_layer]; |  | 
|  1187     RATE_CONTROL *const lrc = &lc->rc; |  | 
|  1188     lrc->avg_frame_qindex[INTER_FRAME] = q_trans[oxcf->worst_allowed_q]; |  | 
|  1189     lrc->last_q[INTER_FRAME] = q_trans[oxcf->worst_allowed_q]; |  | 
|  1190     lrc->ni_av_qi = q_trans[oxcf->worst_allowed_q]; |  | 
|  1191     lrc->total_actual_bits = 0; |  | 
|  1192     lrc->total_target_vs_actual = 0; |  | 
|  1193     lrc->ni_tot_qi = 0; |  | 
|  1194     lrc->tot_q = 0.0; |  | 
|  1195     lrc->avg_q = 0.0; |  | 
|  1196     lrc->ni_frames = 0; |  | 
|  1197     lrc->decimation_count = 0; |  | 
|  1198     lrc->decimation_factor = 0; |  | 
|  1199     lrc->rate_correction_factor = 1.0; |  | 
|  1200     lrc->key_frame_rate_correction_factor = 1.0; |  | 
|  1201     lc->target_bandwidth = oxcf->ts_target_bitrate[temporal_layer] * |  | 
|  1202         1000; |  | 
|  1203     lrc->buffer_level = rescale((int)(oxcf->starting_buffer_level), |  | 
|  1204                                lc->target_bandwidth, 1000); |  | 
|  1205     lrc->bits_off_target = lrc->buffer_level; |  | 
|  1206   } |  | 
|  1207 } |  | 
|  1208  |  | 
|  1209 // Update the layer context from a change_config() call. |  | 
|  1210 static void update_layer_context_change_config(VP9_COMP *const cpi, |  | 
|  1211                                                const int target_bandwidth) { |  | 
|  1212   const VP9_CONFIG *const oxcf = &cpi->oxcf; |  | 
|  1213   const RATE_CONTROL *const rc = &cpi->rc; |  | 
|  1214   int temporal_layer = 0; |  | 
|  1215   float bitrate_alloc = 1.0; |  | 
|  1216   for (temporal_layer = 0; temporal_layer < cpi->svc.number_temporal_layers; |  | 
|  1217       ++temporal_layer) { |  | 
|  1218     LAYER_CONTEXT *const lc = &cpi->svc.layer_context[temporal_layer]; |  | 
|  1219     RATE_CONTROL *const lrc = &lc->rc; |  | 
|  1220     lc->target_bandwidth = oxcf->ts_target_bitrate[temporal_layer] * 1000; |  | 
|  1221     bitrate_alloc = (float)lc->target_bandwidth / (float)target_bandwidth; |  | 
|  1222     // Update buffer-related quantities. |  | 
|  1223     lc->starting_buffer_level = |  | 
|  1224         (int64_t)(oxcf->starting_buffer_level * bitrate_alloc); |  | 
|  1225     lc->optimal_buffer_level = |  | 
|  1226         (int64_t)(oxcf->optimal_buffer_level * bitrate_alloc); |  | 
|  1227     lc->maximum_buffer_size = |  | 
|  1228         (int64_t)(oxcf->maximum_buffer_size * bitrate_alloc); |  | 
|  1229     lrc->bits_off_target = MIN(lrc->bits_off_target, lc->maximum_buffer_size); |  | 
|  1230     lrc->buffer_level = MIN(lrc->buffer_level, lc->maximum_buffer_size); |  | 
|  1231     // Update framerate-related quantities. |  | 
|  1232     lc->framerate = oxcf->framerate / oxcf->ts_rate_decimator[temporal_layer]; |  | 
|  1233     lrc->av_per_frame_bandwidth = (int)(lc->target_bandwidth / lc->framerate); |  | 
|  1234     lrc->max_frame_bandwidth = rc->max_frame_bandwidth; |  | 
|  1235     // Update qp-related quantities. |  | 
|  1236     lrc->worst_quality = rc->worst_quality; |  | 
|  1237     lrc->best_quality = rc->best_quality; |  | 
|  1238   } |  | 
|  1239 } |  | 
|  1240  |  | 
|  1241 // Prior to encoding the frame, update framerate-related quantities |  | 
|  1242 // for the current layer. |  | 
|  1243 static void update_layer_framerate(VP9_COMP *const cpi) { |  | 
|  1244   int temporal_layer = cpi->svc.temporal_layer_id; |  | 
|  1245   const VP9_CONFIG *const oxcf = &cpi->oxcf; |  | 
|  1246   LAYER_CONTEXT *const lc = &cpi->svc.layer_context[temporal_layer]; |  | 
|  1247   RATE_CONTROL *const lrc = &lc->rc; |  | 
|  1248   lc->framerate = oxcf->framerate / oxcf->ts_rate_decimator[temporal_layer]; |  | 
|  1249   lrc->av_per_frame_bandwidth = (int)(lc->target_bandwidth / lc->framerate); |  | 
|  1250   lrc->max_frame_bandwidth = cpi->rc.max_frame_bandwidth; |  | 
|  1251   // Update the average layer frame size (non-cumulative per-frame-bw). |  | 
|  1252   if (temporal_layer == 0) { |  | 
|  1253     lc->avg_frame_size = lrc->av_per_frame_bandwidth; |  | 
|  1254   } else { |  | 
|  1255     double prev_layer_framerate = oxcf->framerate / |  | 
|  1256         oxcf->ts_rate_decimator[temporal_layer - 1]; |  | 
|  1257     int prev_layer_target_bandwidth = |  | 
|  1258         oxcf->ts_target_bitrate[temporal_layer - 1] * 1000; |  | 
|  1259     lc->avg_frame_size = |  | 
|  1260         (int)((lc->target_bandwidth - prev_layer_target_bandwidth) / |  | 
|  1261               (lc->framerate - prev_layer_framerate)); |  | 
|  1262   } |  | 
|  1263 } |  | 
|  1264  |  | 
|  1265 // Prior to encoding the frame, set the layer context, for the current layer |  | 
|  1266 // to be encoded, to the cpi struct. |  | 
|  1267 static void restore_layer_context(VP9_COMP *const cpi) { |  | 
|  1268   int temporal_layer = cpi->svc.temporal_layer_id; |  | 
|  1269   LAYER_CONTEXT *lc = &cpi->svc.layer_context[temporal_layer]; |  | 
|  1270   int frame_since_key = cpi->rc.frames_since_key; |  | 
|  1271   int frame_to_key = cpi->rc.frames_to_key; |  | 
|  1272   cpi->rc = lc->rc; |  | 
|  1273   cpi->oxcf.target_bandwidth = lc->target_bandwidth; |  | 
|  1274   cpi->oxcf.starting_buffer_level = lc->starting_buffer_level; |  | 
|  1275   cpi->oxcf.optimal_buffer_level = lc->optimal_buffer_level; |  | 
|  1276   cpi->oxcf.maximum_buffer_size = lc->maximum_buffer_size; |  | 
|  1277   cpi->output_framerate = lc->framerate; |  | 
|  1278   // Reset the frames_since_key and frames_to_key counters to their values |  | 
|  1279   // before the layer restore. Keep these defined for the stream (not layer). |  | 
|  1280   cpi->rc.frames_since_key = frame_since_key; |  | 
|  1281   cpi->rc.frames_to_key = frame_to_key; |  | 
|  1282 } |  | 
|  1283  |  | 
|  1284 // Save the layer context after encoding the frame. |  | 
|  1285 static void save_layer_context(VP9_COMP *const cpi) { |  | 
|  1286   int temporal_layer = cpi->svc.temporal_layer_id; |  | 
|  1287   LAYER_CONTEXT *lc = &cpi->svc.layer_context[temporal_layer]; |  | 
|  1288   lc->rc = cpi->rc; |  | 
|  1289   lc->target_bandwidth = (int)cpi->oxcf.target_bandwidth; |  | 
|  1290   lc->starting_buffer_level = cpi->oxcf.starting_buffer_level; |  | 
|  1291   lc->optimal_buffer_level = cpi->oxcf.optimal_buffer_level; |  | 
|  1292   lc->maximum_buffer_size = cpi->oxcf.maximum_buffer_size; |  | 
|  1293   lc->framerate = cpi->output_framerate; |  | 
|  1294 } |  | 
|  1295  |  | 
|  1296 static void set_tile_limits(VP9_COMP *cpi) { |   684 static void set_tile_limits(VP9_COMP *cpi) { | 
|  1297   VP9_COMMON *const cm = &cpi->common; |   685   VP9_COMMON *const cm = &cpi->common; | 
|  1298  |   686  | 
|  1299   int min_log2_tile_cols, max_log2_tile_cols; |   687   int min_log2_tile_cols, max_log2_tile_cols; | 
|  1300   vp9_get_tile_n_bits(cm->mi_cols, &min_log2_tile_cols, &max_log2_tile_cols); |   688   vp9_get_tile_n_bits(cm->mi_cols, &min_log2_tile_cols, &max_log2_tile_cols); | 
|  1301  |   689  | 
|  1302   cm->log2_tile_cols = clamp(cpi->oxcf.tile_columns, |   690   cm->log2_tile_cols = clamp(cpi->oxcf.tile_columns, | 
|  1303                              min_log2_tile_cols, max_log2_tile_cols); |   691                              min_log2_tile_cols, max_log2_tile_cols); | 
|  1304   cm->log2_tile_rows = cpi->oxcf.tile_rows; |   692   cm->log2_tile_rows = cpi->oxcf.tile_rows; | 
|  1305 } |   693 } | 
|  1306  |   694  | 
|  1307 static void init_config(VP9_PTR ptr, VP9_CONFIG *oxcf) { |   695 static void init_config(struct VP9_COMP *cpi, VP9_CONFIG *oxcf) { | 
|  1308   VP9_COMP *cpi = (VP9_COMP *)(ptr); |  | 
|  1309   VP9_COMMON *const cm = &cpi->common; |   696   VP9_COMMON *const cm = &cpi->common; | 
|  1310   int i; |   697   int i; | 
|  1311  |   698  | 
|  1312   cpi->oxcf = *oxcf; |   699   cpi->oxcf = *oxcf; | 
|  1313  |   700  | 
|  1314   cm->version = oxcf->version; |   701   cm->profile = oxcf->profile; | 
 |   702   cm->bit_depth = oxcf->bit_depth; | 
|  1315  |   703  | 
|  1316   cm->width = oxcf->width; |   704   cm->width = oxcf->width; | 
|  1317   cm->height = oxcf->height; |   705   cm->height = oxcf->height; | 
|  1318   cm->subsampling_x = 0; |   706   cm->subsampling_x = 0; | 
|  1319   cm->subsampling_y = 0; |   707   cm->subsampling_y = 0; | 
|  1320   vp9_alloc_compressor_data(cpi); |   708   vp9_alloc_compressor_data(cpi); | 
|  1321  |   709  | 
|  1322   // Spatial scalability. |   710   // Spatial scalability. | 
|  1323   cpi->svc.number_spatial_layers = oxcf->ss_number_layers; |   711   cpi->svc.number_spatial_layers = oxcf->ss_number_layers; | 
|  1324   // Temporal scalability. |   712   // Temporal scalability. | 
|  1325   cpi->svc.number_temporal_layers = oxcf->ts_number_layers; |   713   cpi->svc.number_temporal_layers = oxcf->ts_number_layers; | 
|  1326  |   714  | 
|  1327   if (cpi->svc.number_temporal_layers > 1 && |   715   if ((cpi->svc.number_temporal_layers > 1 && | 
|  1328       cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) { |   716       cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) || | 
|  1329     init_layer_context(cpi); |   717       (cpi->svc.number_spatial_layers > 1 && | 
 |   718       cpi->oxcf.mode == MODE_SECONDPASS_BEST)) { | 
 |   719     vp9_init_layer_context(cpi); | 
|  1330   } |   720   } | 
|  1331  |   721  | 
|  1332   // change includes all joint functionality |   722   // change includes all joint functionality | 
|  1333   vp9_change_config(ptr, oxcf); |   723   vp9_change_config(cpi, oxcf); | 
|  1334  |  | 
|  1335   // Initialize active best and worst q and average q values. |  | 
|  1336   if (cpi->pass == 0 && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) { |  | 
|  1337     cpi->rc.avg_frame_qindex[0] = cpi->oxcf.worst_allowed_q; |  | 
|  1338     cpi->rc.avg_frame_qindex[1] = cpi->oxcf.worst_allowed_q; |  | 
|  1339     cpi->rc.avg_frame_qindex[2] = cpi->oxcf.worst_allowed_q; |  | 
|  1340   } else { |  | 
|  1341     cpi->rc.avg_frame_qindex[0] = (cpi->oxcf.worst_allowed_q + |  | 
|  1342                                    cpi->oxcf.best_allowed_q) / 2; |  | 
|  1343     cpi->rc.avg_frame_qindex[1] = (cpi->oxcf.worst_allowed_q + |  | 
|  1344                                    cpi->oxcf.best_allowed_q) / 2; |  | 
|  1345     cpi->rc.avg_frame_qindex[2] = (cpi->oxcf.worst_allowed_q + |  | 
|  1346                                    cpi->oxcf.best_allowed_q) / 2; |  | 
|  1347   } |  | 
|  1348   cpi->rc.last_q[0]                 = cpi->oxcf.best_allowed_q; |  | 
|  1349   cpi->rc.last_q[1]                 = cpi->oxcf.best_allowed_q; |  | 
|  1350   cpi->rc.last_q[2]                 = cpi->oxcf.best_allowed_q; |  | 
|  1351  |  | 
|  1352   // Initialise the starting buffer levels |  | 
|  1353   cpi->rc.buffer_level              = cpi->oxcf.starting_buffer_level; |  | 
|  1354   cpi->rc.bits_off_target           = cpi->oxcf.starting_buffer_level; |  | 
|  1355  |  | 
|  1356   cpi->rc.rolling_target_bits       = cpi->rc.av_per_frame_bandwidth; |  | 
|  1357   cpi->rc.rolling_actual_bits       = cpi->rc.av_per_frame_bandwidth; |  | 
|  1358   cpi->rc.long_rolling_target_bits  = cpi->rc.av_per_frame_bandwidth; |  | 
|  1359   cpi->rc.long_rolling_actual_bits  = cpi->rc.av_per_frame_bandwidth; |  | 
|  1360  |  | 
|  1361   cpi->rc.total_actual_bits         = 0; |  | 
|  1362   cpi->rc.total_target_vs_actual    = 0; |  | 
|  1363  |   724  | 
|  1364   cpi->static_mb_pct = 0; |   725   cpi->static_mb_pct = 0; | 
|  1365  |   726  | 
|  1366   cpi->lst_fb_idx = 0; |   727   cpi->lst_fb_idx = 0; | 
|  1367   cpi->gld_fb_idx = 1; |   728   cpi->gld_fb_idx = 1; | 
|  1368   cpi->alt_fb_idx = 2; |   729   cpi->alt_fb_idx = 2; | 
|  1369  |   730  | 
|  1370   set_tile_limits(cpi); |   731   set_tile_limits(cpi); | 
|  1371  |   732  | 
|  1372   cpi->fixed_divide[0] = 0; |   733   cpi->fixed_divide[0] = 0; | 
|  1373   for (i = 1; i < 512; i++) |   734   for (i = 1; i < 512; i++) | 
|  1374     cpi->fixed_divide[i] = 0x80000 / i; |   735     cpi->fixed_divide[i] = 0x80000 / i; | 
|  1375 } |   736 } | 
|  1376  |   737  | 
|  1377 void vp9_change_config(VP9_PTR ptr, VP9_CONFIG *oxcf) { |   738 void vp9_change_config(struct VP9_COMP *cpi, const VP9_CONFIG *oxcf) { | 
|  1378   VP9_COMP *cpi = (VP9_COMP *)(ptr); |  | 
|  1379   VP9_COMMON *const cm = &cpi->common; |   739   VP9_COMMON *const cm = &cpi->common; | 
 |   740   RATE_CONTROL *const rc = &cpi->rc; | 
|  1380  |   741  | 
|  1381   if (!cpi || !oxcf) |   742   if (cm->profile != oxcf->profile) | 
|  1382     return; |   743     cm->profile = oxcf->profile; | 
 |   744   cm->bit_depth = oxcf->bit_depth; | 
|  1383  |   745  | 
|  1384   if (cm->version != oxcf->version) { |   746   if (cm->profile <= PROFILE_1) | 
|  1385     cm->version = oxcf->version; |   747     assert(cm->bit_depth == BITS_8); | 
|  1386   } |   748   else | 
 |   749     assert(cm->bit_depth > BITS_8); | 
|  1387  |   750  | 
|  1388   cpi->oxcf = *oxcf; |   751   cpi->oxcf = *oxcf; | 
|  1389  |   752  | 
|  1390   if (cpi->oxcf.cpu_used == -6) |   753   if (cpi->oxcf.cpu_used == -6) | 
|  1391     cpi->oxcf.play_alternate = 0; |   754     cpi->oxcf.play_alternate = 0; | 
|  1392  |   755  | 
|  1393   switch (cpi->oxcf.mode) { |   756   switch (cpi->oxcf.mode) { | 
|  1394       // Real time and one pass deprecated in test code base |   757       // Real time and one pass deprecated in test code base | 
|  1395     case MODE_GOODQUALITY: |   758     case MODE_GOODQUALITY: | 
|  1396       cpi->pass = 0; |   759       cpi->pass = 0; | 
|  1397       cpi->oxcf.cpu_used = clamp(cpi->oxcf.cpu_used, -5, 5); |   760       cpi->oxcf.cpu_used = clamp(cpi->oxcf.cpu_used, -5, 5); | 
|  1398       break; |   761       break; | 
|  1399  |   762  | 
 |   763     case MODE_BESTQUALITY: | 
 |   764       cpi->pass = 0; | 
 |   765       break; | 
 |   766  | 
|  1400     case MODE_FIRSTPASS: |   767     case MODE_FIRSTPASS: | 
|  1401       cpi->pass = 1; |   768       cpi->pass = 1; | 
|  1402       break; |   769       break; | 
|  1403  |   770  | 
|  1404     case MODE_SECONDPASS: |   771     case MODE_SECONDPASS: | 
|  1405       cpi->pass = 2; |   772       cpi->pass = 2; | 
|  1406       cpi->oxcf.cpu_used = clamp(cpi->oxcf.cpu_used, -5, 5); |   773       cpi->oxcf.cpu_used = clamp(cpi->oxcf.cpu_used, -5, 5); | 
|  1407       break; |   774       break; | 
|  1408  |   775  | 
|  1409     case MODE_SECONDPASS_BEST: |   776     case MODE_SECONDPASS_BEST: | 
|  1410       cpi->pass = 2; |   777       cpi->pass = 2; | 
|  1411       break; |   778       break; | 
|  1412  |   779  | 
|  1413     case MODE_REALTIME: |   780     case MODE_REALTIME: | 
|  1414       cpi->pass = 0; |   781       cpi->pass = 0; | 
|  1415       break; |   782       break; | 
|  1416   } |   783   } | 
|  1417  |   784  | 
|  1418   cpi->oxcf.worst_allowed_q = q_trans[oxcf->worst_allowed_q]; |  | 
|  1419   cpi->oxcf.best_allowed_q = q_trans[oxcf->best_allowed_q]; |  | 
|  1420   cpi->oxcf.cq_level = q_trans[cpi->oxcf.cq_level]; |  | 
|  1421  |  | 
|  1422   cpi->oxcf.lossless = oxcf->lossless; |   785   cpi->oxcf.lossless = oxcf->lossless; | 
|  1423   cpi->mb.e_mbd.itxm_add = cpi->oxcf.lossless ? vp9_iwht4x4_add |   786   if (cpi->oxcf.lossless) { | 
|  1424                                               : vp9_idct4x4_add; |   787     // In lossless mode, make sure right quantizer range and correct transform | 
|  1425   cpi->rc.baseline_gf_interval = DEFAULT_GF_INTERVAL; |   788     // is set. | 
|  1426  |   789     cpi->oxcf.worst_allowed_q = 0; | 
 |   790     cpi->oxcf.best_allowed_q = 0; | 
 |   791     cpi->mb.e_mbd.itxm_add = vp9_iwht4x4_add; | 
 |   792   } else { | 
 |   793     cpi->mb.e_mbd.itxm_add = vp9_idct4x4_add; | 
 |   794   } | 
 |   795   rc->baseline_gf_interval = DEFAULT_GF_INTERVAL; | 
|  1427   cpi->ref_frame_flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG; |   796   cpi->ref_frame_flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG; | 
|  1428  |   797  | 
|  1429   cpi->refresh_golden_frame = 0; |   798   cpi->refresh_golden_frame = 0; | 
|  1430   cpi->refresh_last_frame = 1; |   799   cpi->refresh_last_frame = 1; | 
|  1431   cm->refresh_frame_context = 1; |   800   cm->refresh_frame_context = 1; | 
|  1432   cm->reset_frame_context = 0; |   801   cm->reset_frame_context = 0; | 
|  1433  |   802  | 
|  1434   vp9_reset_segment_features(&cm->seg); |   803   vp9_reset_segment_features(&cm->seg); | 
|  1435   set_high_precision_mv(cpi, 0); |   804   set_high_precision_mv(cpi, 0); | 
|  1436  |   805  | 
|  1437   { |   806   { | 
|  1438     int i; |   807     int i; | 
|  1439  |   808  | 
|  1440     for (i = 0; i < MAX_SEGMENTS; i++) |   809     for (i = 0; i < MAX_SEGMENTS; i++) | 
|  1441       cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout; |   810       cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout; | 
|  1442   } |   811   } | 
|  1443   cpi->encode_breakout = cpi->oxcf.encode_breakout; |   812   cpi->encode_breakout = cpi->oxcf.encode_breakout; | 
|  1444  |   813  | 
|  1445   // local file playback mode == really big buffer |   814   // local file playback mode == really big buffer | 
|  1446   if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK) { |   815   if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK) { | 
|  1447     cpi->oxcf.starting_buffer_level   = 60000; |   816     cpi->oxcf.starting_buffer_level   = 60000; | 
|  1448     cpi->oxcf.optimal_buffer_level    = 60000; |   817     cpi->oxcf.optimal_buffer_level    = 60000; | 
|  1449     cpi->oxcf.maximum_buffer_size     = 240000; |   818     cpi->oxcf.maximum_buffer_size     = 240000; | 
|  1450   } |   819   } | 
|  1451  |   820  | 
|  1452   // Convert target bandwidth from Kbit/s to Bit/s |   821   // Convert target bandwidth from Kbit/s to Bit/s | 
|  1453   cpi->oxcf.target_bandwidth       *= 1000; |   822   cpi->oxcf.target_bandwidth       *= 1000; | 
|  1454  |   823  | 
|  1455   cpi->oxcf.starting_buffer_level = rescale(cpi->oxcf.starting_buffer_level, |   824   cpi->oxcf.starting_buffer_level = | 
|  1456                                             cpi->oxcf.target_bandwidth, 1000); |   825       vp9_rescale(cpi->oxcf.starting_buffer_level, | 
 |   826                   cpi->oxcf.target_bandwidth, 1000); | 
|  1457  |   827  | 
|  1458   // Set or reset optimal and maximum buffer levels. |   828   // Set or reset optimal and maximum buffer levels. | 
|  1459   if (cpi->oxcf.optimal_buffer_level == 0) |   829   if (cpi->oxcf.optimal_buffer_level == 0) | 
|  1460     cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8; |   830     cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8; | 
|  1461   else |   831   else | 
|  1462     cpi->oxcf.optimal_buffer_level = rescale(cpi->oxcf.optimal_buffer_level, |   832     cpi->oxcf.optimal_buffer_level = | 
|  1463                                              cpi->oxcf.target_bandwidth, 1000); |   833         vp9_rescale(cpi->oxcf.optimal_buffer_level, | 
 |   834                     cpi->oxcf.target_bandwidth, 1000); | 
|  1464  |   835  | 
|  1465   if (cpi->oxcf.maximum_buffer_size == 0) |   836   if (cpi->oxcf.maximum_buffer_size == 0) | 
|  1466     cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8; |   837     cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8; | 
|  1467   else |   838   else | 
|  1468     cpi->oxcf.maximum_buffer_size = rescale(cpi->oxcf.maximum_buffer_size, |   839     cpi->oxcf.maximum_buffer_size = | 
|  1469                                             cpi->oxcf.target_bandwidth, 1000); |   840         vp9_rescale(cpi->oxcf.maximum_buffer_size, | 
 |   841                     cpi->oxcf.target_bandwidth, 1000); | 
|  1470   // Under a configuration change, where maximum_buffer_size may change, |   842   // Under a configuration change, where maximum_buffer_size may change, | 
|  1471   // keep buffer level clipped to the maximum allowed buffer size. |   843   // keep buffer level clipped to the maximum allowed buffer size. | 
|  1472   cpi->rc.bits_off_target = MIN(cpi->rc.bits_off_target, |   844   rc->bits_off_target = MIN(rc->bits_off_target, cpi->oxcf.maximum_buffer_size); | 
|  1473                                 cpi->oxcf.maximum_buffer_size); |   845   rc->buffer_level = MIN(rc->buffer_level, cpi->oxcf.maximum_buffer_size); | 
|  1474   cpi->rc.buffer_level = MIN(cpi->rc.buffer_level, |  | 
|  1475                              cpi->oxcf.maximum_buffer_size); |  | 
|  1476  |   846  | 
|  1477   // Set up frame rate and related parameters rate control values. |   847   // Set up frame rate and related parameters rate control values. | 
|  1478   vp9_new_framerate(cpi, cpi->oxcf.framerate); |   848   vp9_new_framerate(cpi, cpi->oxcf.framerate); | 
|  1479  |   849  | 
|  1480   // Set absolute upper and lower quality limits |   850   // Set absolute upper and lower quality limits | 
|  1481   cpi->rc.worst_quality = cpi->oxcf.worst_allowed_q; |   851   rc->worst_quality = cpi->oxcf.worst_allowed_q; | 
|  1482   cpi->rc.best_quality = cpi->oxcf.best_allowed_q; |   852   rc->best_quality = cpi->oxcf.best_allowed_q; | 
|  1483  |   853  | 
|  1484   // active values should only be modified if out of new range |   854   // active values should only be modified if out of new range | 
|  1485  |   855  | 
|  1486   cpi->cq_target_quality = cpi->oxcf.cq_level; |   856   cpi->cq_target_quality = cpi->oxcf.cq_level; | 
|  1487  |   857  | 
|  1488   cm->interp_filter = DEFAULT_INTERP_FILTER; |   858   cm->interp_filter = DEFAULT_INTERP_FILTER; | 
|  1489  |   859  | 
|  1490   cm->display_width = cpi->oxcf.width; |   860   cm->display_width = cpi->oxcf.width; | 
|  1491   cm->display_height = cpi->oxcf.height; |   861   cm->display_height = cpi->oxcf.height; | 
|  1492  |   862  | 
|  1493   // VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs) |   863   // VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs) | 
|  1494   cpi->oxcf.sharpness = MIN(7, cpi->oxcf.sharpness); |   864   cpi->oxcf.sharpness = MIN(7, cpi->oxcf.sharpness); | 
|  1495  |   865  | 
|  1496   cpi->common.lf.sharpness_level = cpi->oxcf.sharpness; |   866   cpi->common.lf.sharpness_level = cpi->oxcf.sharpness; | 
|  1497  |   867  | 
|  1498   if (cpi->initial_width) { |   868   if (cpi->initial_width) { | 
|  1499     // Increasing the size of the frame beyond the first seen frame, or some |   869     // Increasing the size of the frame beyond the first seen frame, or some | 
|  1500     // otherwise signaled maximum size, is not supported. |   870     // otherwise signaled maximum size, is not supported. | 
|  1501     // TODO(jkoleszar): exit gracefully. |   871     // TODO(jkoleszar): exit gracefully. | 
|  1502     assert(cm->width <= cpi->initial_width); |   872     assert(cm->width <= cpi->initial_width); | 
|  1503     assert(cm->height <= cpi->initial_height); |   873     assert(cm->height <= cpi->initial_height); | 
|  1504   } |   874   } | 
|  1505   update_frame_size(cpi); |   875   update_frame_size(cpi); | 
|  1506  |   876  | 
|  1507   if (cpi->svc.number_temporal_layers > 1 && |   877   if ((cpi->svc.number_temporal_layers > 1 && | 
|  1508       cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) { |   878       cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) || | 
|  1509     update_layer_context_change_config(cpi, (int)cpi->oxcf.target_bandwidth); |   879       (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2)) { | 
 |   880     vp9_update_layer_context_change_config(cpi, | 
 |   881                                            (int)cpi->oxcf.target_bandwidth); | 
|  1510   } |   882   } | 
|  1511  |   883  | 
|  1512   cpi->speed = abs(cpi->oxcf.cpu_used); |   884   cpi->speed = abs(cpi->oxcf.cpu_used); | 
|  1513  |   885  | 
|  1514   // Limit on lag buffers as these are not currently dynamically allocated. |   886   // Limit on lag buffers as these are not currently dynamically allocated. | 
|  1515   if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS) |   887   if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS) | 
|  1516     cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS; |   888     cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS; | 
|  1517  |   889  | 
|  1518 #if CONFIG_MULTIPLE_ARF |   890 #if CONFIG_MULTIPLE_ARF | 
|  1519   vp9_zero(cpi->alt_ref_source); |   891   vp9_zero(cpi->alt_ref_source); | 
|  1520 #else |   892 #else | 
|  1521   cpi->alt_ref_source = NULL; |   893   cpi->alt_ref_source = NULL; | 
|  1522 #endif |   894 #endif | 
|  1523   cpi->rc.is_src_frame_alt_ref = 0; |   895   rc->is_src_frame_alt_ref = 0; | 
|  1524  |   896  | 
|  1525 #if 0 |   897 #if 0 | 
|  1526   // Experimental RD Code |   898   // Experimental RD Code | 
|  1527   cpi->frame_distortion = 0; |   899   cpi->frame_distortion = 0; | 
|  1528   cpi->last_frame_distortion = 0; |   900   cpi->last_frame_distortion = 0; | 
|  1529 #endif |   901 #endif | 
|  1530  |   902  | 
|  1531   set_tile_limits(cpi); |   903   set_tile_limits(cpi); | 
|  1532  |   904  | 
|  1533   cpi->ext_refresh_frame_flags_pending = 0; |   905   cpi->ext_refresh_frame_flags_pending = 0; | 
|  1534   cpi->ext_refresh_frame_context_pending = 0; |   906   cpi->ext_refresh_frame_context_pending = 0; | 
|  1535 } |   907 } | 
|  1536  |   908  | 
|  1537 #define M_LOG2_E 0.693147180559945309417 |   909 #define M_LOG2_E 0.693147180559945309417 | 
|  1538 #define log2f(x) (log (x) / (float) M_LOG2_E) |   910 #define log2f(x) (log (x) / (float) M_LOG2_E) | 
|  1539  |   911  | 
|  1540 static void cal_nmvjointsadcost(int *mvjointsadcost) { |   912 static void cal_nmvjointsadcost(int *mvjointsadcost) { | 
|  1541   mvjointsadcost[0] = 600; |   913   mvjointsadcost[0] = 600; | 
|  1542   mvjointsadcost[1] = 300; |   914   mvjointsadcost[1] = 300; | 
|  1543   mvjointsadcost[2] = 300; |   915   mvjointsadcost[2] = 300; | 
|  1544   mvjointsadcost[0] = 300; |   916   mvjointsadcost[3] = 300; | 
|  1545 } |   917 } | 
|  1546  |   918  | 
|  1547 static void cal_nmvsadcosts(int *mvsadcost[2]) { |   919 static void cal_nmvsadcosts(int *mvsadcost[2]) { | 
|  1548   int i = 1; |   920   int i = 1; | 
|  1549  |   921  | 
|  1550   mvsadcost[0][0] = 0; |   922   mvsadcost[0][0] = 0; | 
|  1551   mvsadcost[1][0] = 0; |   923   mvsadcost[1][0] = 0; | 
|  1552  |   924  | 
|  1553   do { |   925   do { | 
|  1554     double z = 256 * (2 * (log2f(8 * i) + .6)); |   926     double z = 256 * (2 * (log2f(8 * i) + .6)); | 
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1686         PICK_MODE_CONTEXT *ctx = get_block_context(x, i); |  1058         PICK_MODE_CONTEXT *ctx = get_block_context(x, i); | 
|  1687         free_mode_context(ctx); |  1059         free_mode_context(ctx); | 
|  1688       } |  1060       } | 
|  1689     } else { |  1061     } else { | 
|  1690       PICK_MODE_CONTEXT *ctx = get_block_context(x, i); |  1062       PICK_MODE_CONTEXT *ctx = get_block_context(x, i); | 
|  1691       free_mode_context(ctx); |  1063       free_mode_context(ctx); | 
|  1692     } |  1064     } | 
|  1693   } |  1065   } | 
|  1694 } |  1066 } | 
|  1695  |  1067  | 
|  1696 VP9_PTR vp9_create_compressor(VP9_CONFIG *oxcf) { |  1068 VP9_COMP *vp9_create_compressor(VP9_CONFIG *oxcf) { | 
|  1697   int i, j; |  1069   int i, j; | 
|  1698   volatile union { |  1070   VP9_COMP *const cpi = vpx_memalign(32, sizeof(VP9_COMP)); | 
|  1699     VP9_COMP *cpi; |  1071   VP9_COMMON *const cm = cpi != NULL ? &cpi->common : NULL; | 
|  1700     VP9_PTR   ptr; |  | 
|  1701   } ctx; |  | 
|  1702  |  1072  | 
|  1703   VP9_COMP *cpi; |  1073   if (!cm) | 
|  1704   VP9_COMMON *cm; |  1074     return NULL; | 
|  1705  |  | 
|  1706   cpi = ctx.cpi = vpx_memalign(32, sizeof(VP9_COMP)); |  | 
|  1707   // Check that the CPI instance is valid |  | 
|  1708   if (!cpi) |  | 
|  1709     return 0; |  | 
|  1710  |  | 
|  1711   cm = &cpi->common; |  | 
|  1712  |  1075  | 
|  1713   vp9_zero(*cpi); |  1076   vp9_zero(*cpi); | 
|  1714  |  1077  | 
|  1715   if (setjmp(cm->error.jmp)) { |  1078   if (setjmp(cm->error.jmp)) { | 
|  1716     VP9_PTR ptr = ctx.ptr; |  1079     cm->error.setjmp = 0; | 
|  1717  |  1080     vp9_remove_compressor(cpi); | 
|  1718     ctx.cpi->common.error.setjmp = 0; |  | 
|  1719     vp9_remove_compressor(&ptr); |  | 
|  1720     return 0; |  1081     return 0; | 
|  1721   } |  1082   } | 
|  1722  |  1083  | 
|  1723   cm->error.setjmp = 1; |  1084   cm->error.setjmp = 1; | 
|  1724  |  1085  | 
|  1725   CHECK_MEM_ERROR(cm, cpi->mb.ss, vpx_calloc(sizeof(search_site), |  1086   CHECK_MEM_ERROR(cm, cpi->mb.ss, vpx_calloc(sizeof(search_site), | 
|  1726                                              (MAX_MVSEARCH_STEPS * 8) + 1)); |  1087                                              (MAX_MVSEARCH_STEPS * 8) + 1)); | 
|  1727  |  1088  | 
|  1728   vp9_rtcd(); |  1089   vp9_rtcd(); | 
|  1729  |  1090  | 
|  1730   cpi->use_svc = 0; |  1091   cpi->use_svc = 0; | 
|  1731  |  1092  | 
|  1732   init_config((VP9_PTR)cpi, oxcf); |  1093   init_config(cpi, oxcf); | 
|  1733  |  1094   vp9_rc_init(&cpi->oxcf, cpi->pass, &cpi->rc); | 
|  1734   init_pick_mode_context(cpi); |  1095   init_pick_mode_context(cpi); | 
|  1735  |  1096  | 
|  1736   cm->current_video_frame   = 0; |  1097   cm->current_video_frame = 0; | 
|  1737  |  1098  | 
|  1738   // Set reference frame sign bias for ALTREF frame to 1 (for now) |  1099   // Set reference frame sign bias for ALTREF frame to 1 (for now) | 
|  1739   cm->ref_frame_sign_bias[ALTREF_FRAME] = 1; |  1100   cm->ref_frame_sign_bias[ALTREF_FRAME] = 1; | 
|  1740  |  1101  | 
|  1741   cpi->rc.baseline_gf_interval = DEFAULT_GF_INTERVAL; |  | 
|  1742  |  | 
|  1743   cpi->gold_is_last = 0; |  1102   cpi->gold_is_last = 0; | 
|  1744   cpi->alt_is_last  = 0; |  1103   cpi->alt_is_last = 0; | 
|  1745   cpi->gold_is_alt  = 0; |  1104   cpi->gold_is_alt = 0; | 
|  1746  |  1105  | 
|  1747   // Create the encoder segmentation map and set all entries to 0 |  1106   // Create the encoder segmentation map and set all entries to 0 | 
|  1748   CHECK_MEM_ERROR(cm, cpi->segmentation_map, |  1107   CHECK_MEM_ERROR(cm, cpi->segmentation_map, | 
|  1749                   vpx_calloc(cm->mi_rows * cm->mi_cols, 1)); |  1108                   vpx_calloc(cm->mi_rows * cm->mi_cols, 1)); | 
|  1750  |  1109  | 
|  1751   // Create a complexity map used for rd adjustment |  1110   // Create a complexity map used for rd adjustment | 
|  1752   CHECK_MEM_ERROR(cm, cpi->complexity_map, |  1111   CHECK_MEM_ERROR(cm, cpi->complexity_map, | 
|  1753                   vpx_calloc(cm->mi_rows * cm->mi_cols, 1)); |  1112                   vpx_calloc(cm->mi_rows * cm->mi_cols, 1)); | 
|  1754  |  1113  | 
 |  1114   // Create a map used for cyclic background refresh. | 
 |  1115   CHECK_MEM_ERROR(cm, cpi->cyclic_refresh, | 
 |  1116                   vp9_cyclic_refresh_alloc(cm->mi_rows, cm->mi_cols)); | 
|  1755  |  1117  | 
|  1756   // And a place holder structure is the coding context |  1118   // And a place holder structure is the coding context | 
|  1757   // for use if we want to save and restore it |  1119   // for use if we want to save and restore it | 
|  1758   CHECK_MEM_ERROR(cm, cpi->coding_context.last_frame_seg_map_copy, |  1120   CHECK_MEM_ERROR(cm, cpi->coding_context.last_frame_seg_map_copy, | 
|  1759                   vpx_calloc(cm->mi_rows * cm->mi_cols, 1)); |  1121                   vpx_calloc(cm->mi_rows * cm->mi_cols, 1)); | 
|  1760  |  1122  | 
|  1761   CHECK_MEM_ERROR(cm, cpi->active_map, vpx_calloc(cm->MBs, 1)); |  1123   CHECK_MEM_ERROR(cm, cpi->active_map, vpx_calloc(cm->MBs, 1)); | 
|  1762   vpx_memset(cpi->active_map, 1, cm->MBs); |  1124   vpx_memset(cpi->active_map, 1, cm->MBs); | 
|  1763   cpi->active_map_enabled = 0; |  1125   cpi->active_map_enabled = 0; | 
|  1764  |  1126  | 
|  1765   for (i = 0; i < (sizeof(cpi->mbgraph_stats) / |  1127   for (i = 0; i < (sizeof(cpi->mbgraph_stats) / | 
|  1766                    sizeof(cpi->mbgraph_stats[0])); i++) { |  1128                    sizeof(cpi->mbgraph_stats[0])); i++) { | 
|  1767     CHECK_MEM_ERROR(cm, cpi->mbgraph_stats[i].mb_stats, |  1129     CHECK_MEM_ERROR(cm, cpi->mbgraph_stats[i].mb_stats, | 
|  1768                     vpx_calloc(cm->MBs * |  1130                     vpx_calloc(cm->MBs * | 
|  1769                                sizeof(*cpi->mbgraph_stats[i].mb_stats), 1)); |  1131                                sizeof(*cpi->mbgraph_stats[i].mb_stats), 1)); | 
|  1770   } |  1132   } | 
|  1771  |  1133  | 
|  1772   /*Initialize the feed-forward activity masking.*/ |  1134   /*Initialize the feed-forward activity masking.*/ | 
|  1773   cpi->activity_avg = 90 << 12; |  1135   cpi->activity_avg = 90 << 12; | 
|  1774   cpi->key_frame_frequency = cpi->oxcf.key_freq; |  1136   cpi->key_frame_frequency = cpi->oxcf.key_freq; | 
|  1775  |  | 
|  1776   cpi->rc.frames_since_key = 8;  // Sensible default for first frame. |  | 
|  1777   cpi->rc.this_key_frame_forced = 0; |  | 
|  1778   cpi->rc.next_key_frame_forced = 0; |  | 
|  1779  |  | 
|  1780   cpi->rc.source_alt_ref_pending = 0; |  | 
|  1781   cpi->rc.source_alt_ref_active = 0; |  | 
|  1782   cpi->refresh_alt_ref_frame = 0; |  1137   cpi->refresh_alt_ref_frame = 0; | 
|  1783  |  1138  | 
|  1784 #if CONFIG_MULTIPLE_ARF |  1139 #if CONFIG_MULTIPLE_ARF | 
|  1785   // Turn multiple ARF usage on/off. This is a quick hack for the initial test |  1140   // Turn multiple ARF usage on/off. This is a quick hack for the initial test | 
|  1786   // version. It should eventually be set via the codec API. |  1141   // version. It should eventually be set via the codec API. | 
|  1787   cpi->multi_arf_enabled = 1; |  1142   cpi->multi_arf_enabled = 1; | 
|  1788  |  1143  | 
|  1789   if (cpi->multi_arf_enabled) { |  1144   if (cpi->multi_arf_enabled) { | 
|  1790     cpi->sequence_number = 0; |  1145     cpi->sequence_number = 0; | 
|  1791     cpi->frame_coding_order_period = 0; |  1146     cpi->frame_coding_order_period = 0; | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1827     cpi->total_ssimg_y = 0; |  1182     cpi->total_ssimg_y = 0; | 
|  1828     cpi->total_ssimg_u = 0; |  1183     cpi->total_ssimg_u = 0; | 
|  1829     cpi->total_ssimg_v = 0; |  1184     cpi->total_ssimg_v = 0; | 
|  1830     cpi->total_ssimg_all = 0; |  1185     cpi->total_ssimg_all = 0; | 
|  1831   } |  1186   } | 
|  1832  |  1187  | 
|  1833 #endif |  1188 #endif | 
|  1834  |  1189  | 
|  1835   cpi->first_time_stamp_ever = INT64_MAX; |  1190   cpi->first_time_stamp_ever = INT64_MAX; | 
|  1836  |  1191  | 
|  1837   cpi->rc.frames_till_gf_update_due      = 0; |  | 
|  1838  |  | 
|  1839   cpi->rc.ni_av_qi                     = cpi->oxcf.worst_allowed_q; |  | 
|  1840   cpi->rc.ni_tot_qi                    = 0; |  | 
|  1841   cpi->rc.ni_frames                   = 0; |  | 
|  1842   cpi->rc.tot_q = 0.0; |  | 
|  1843   cpi->rc.avg_q = vp9_convert_qindex_to_q(cpi->oxcf.worst_allowed_q); |  | 
|  1844  |  | 
|  1845   cpi->rc.rate_correction_factor         = 1.0; |  | 
|  1846   cpi->rc.key_frame_rate_correction_factor = 1.0; |  | 
|  1847   cpi->rc.gf_rate_correction_factor  = 1.0; |  | 
|  1848  |  | 
|  1849   cal_nmvjointsadcost(cpi->mb.nmvjointsadcost); |  1192   cal_nmvjointsadcost(cpi->mb.nmvjointsadcost); | 
|  1850   cpi->mb.nmvcost[0] = &cpi->mb.nmvcosts[0][MV_MAX]; |  1193   cpi->mb.nmvcost[0] = &cpi->mb.nmvcosts[0][MV_MAX]; | 
|  1851   cpi->mb.nmvcost[1] = &cpi->mb.nmvcosts[1][MV_MAX]; |  1194   cpi->mb.nmvcost[1] = &cpi->mb.nmvcosts[1][MV_MAX]; | 
|  1852   cpi->mb.nmvsadcost[0] = &cpi->mb.nmvsadcosts[0][MV_MAX]; |  1195   cpi->mb.nmvsadcost[0] = &cpi->mb.nmvsadcosts[0][MV_MAX]; | 
|  1853   cpi->mb.nmvsadcost[1] = &cpi->mb.nmvsadcosts[1][MV_MAX]; |  1196   cpi->mb.nmvsadcost[1] = &cpi->mb.nmvsadcosts[1][MV_MAX]; | 
|  1854   cal_nmvsadcosts(cpi->mb.nmvsadcost); |  1197   cal_nmvsadcosts(cpi->mb.nmvsadcost); | 
|  1855  |  1198  | 
|  1856   cpi->mb.nmvcost_hp[0] = &cpi->mb.nmvcosts_hp[0][MV_MAX]; |  1199   cpi->mb.nmvcost_hp[0] = &cpi->mb.nmvcosts_hp[0][MV_MAX]; | 
|  1857   cpi->mb.nmvcost_hp[1] = &cpi->mb.nmvcosts_hp[1][MV_MAX]; |  1200   cpi->mb.nmvcost_hp[1] = &cpi->mb.nmvcosts_hp[1][MV_MAX]; | 
|  1858   cpi->mb.nmvsadcost_hp[0] = &cpi->mb.nmvsadcosts_hp[0][MV_MAX]; |  1201   cpi->mb.nmvsadcost_hp[0] = &cpi->mb.nmvsadcosts_hp[0][MV_MAX]; | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
|  1871   kf_list = fopen("kf_list.stt", "w"); |  1214   kf_list = fopen("kf_list.stt", "w"); | 
|  1872 #endif |  1215 #endif | 
|  1873  |  1216  | 
|  1874   cpi->output_pkt_list = oxcf->output_pkt_list; |  1217   cpi->output_pkt_list = oxcf->output_pkt_list; | 
|  1875  |  1218  | 
|  1876   cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED; |  1219   cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED; | 
|  1877  |  1220  | 
|  1878   if (cpi->pass == 1) { |  1221   if (cpi->pass == 1) { | 
|  1879     vp9_init_first_pass(cpi); |  1222     vp9_init_first_pass(cpi); | 
|  1880   } else if (cpi->pass == 2) { |  1223   } else if (cpi->pass == 2) { | 
|  1881     size_t packet_sz = sizeof(FIRSTPASS_STATS); |  1224     const size_t packet_sz = sizeof(FIRSTPASS_STATS); | 
|  1882     int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz); |  1225     const int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz); | 
|  1883  |  1226  | 
|  1884     cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf; |  1227     if (cpi->svc.number_spatial_layers > 1 | 
|  1885     cpi->twopass.stats_in = cpi->twopass.stats_in_start; |  1228         && cpi->svc.number_temporal_layers == 1) { | 
|  1886     cpi->twopass.stats_in_end = (void *)((char *)cpi->twopass.stats_in |  1229       FIRSTPASS_STATS *const stats = oxcf->two_pass_stats_in.buf; | 
|  1887                                          + (packets - 1) * packet_sz); |  1230       FIRSTPASS_STATS *stats_copy[VPX_SS_MAX_LAYERS] = {0}; | 
|  1888     vp9_init_second_pass(cpi); |  1231       int i; | 
 |  1232  | 
 |  1233       for (i = 0; i < oxcf->ss_number_layers; ++i) { | 
 |  1234         FIRSTPASS_STATS *const last_packet_for_layer = | 
 |  1235             &stats[packets - oxcf->ss_number_layers + i]; | 
 |  1236         const int layer_id = (int)last_packet_for_layer->spatial_layer_id; | 
 |  1237         const int packets_in_layer = (int)last_packet_for_layer->count + 1; | 
 |  1238         if (layer_id >= 0 && layer_id < oxcf->ss_number_layers) { | 
 |  1239           LAYER_CONTEXT *const lc = &cpi->svc.layer_context[layer_id]; | 
 |  1240  | 
 |  1241           vpx_free(lc->rc_twopass_stats_in.buf); | 
 |  1242  | 
 |  1243           lc->rc_twopass_stats_in.sz = packets_in_layer * packet_sz; | 
 |  1244           CHECK_MEM_ERROR(cm, lc->rc_twopass_stats_in.buf, | 
 |  1245                           vpx_malloc(lc->rc_twopass_stats_in.sz)); | 
 |  1246           lc->twopass.stats_in_start = lc->rc_twopass_stats_in.buf; | 
 |  1247           lc->twopass.stats_in = lc->twopass.stats_in_start; | 
 |  1248           lc->twopass.stats_in_end = lc->twopass.stats_in_start | 
 |  1249                                      + packets_in_layer - 1; | 
 |  1250           stats_copy[layer_id] = lc->rc_twopass_stats_in.buf; | 
 |  1251         } | 
 |  1252       } | 
 |  1253  | 
 |  1254       for (i = 0; i < packets; ++i) { | 
 |  1255         const int layer_id = (int)stats[i].spatial_layer_id; | 
 |  1256         if (layer_id >= 0 && layer_id < oxcf->ss_number_layers | 
 |  1257             && stats_copy[layer_id] != NULL) { | 
 |  1258           *stats_copy[layer_id] = stats[i]; | 
 |  1259           ++stats_copy[layer_id]; | 
 |  1260         } | 
 |  1261       } | 
 |  1262  | 
 |  1263       vp9_init_second_pass_spatial_svc(cpi); | 
 |  1264     } else { | 
 |  1265       cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf; | 
 |  1266       cpi->twopass.stats_in = cpi->twopass.stats_in_start; | 
 |  1267       cpi->twopass.stats_in_end = &cpi->twopass.stats_in[packets - 1]; | 
 |  1268  | 
 |  1269       vp9_init_second_pass(cpi); | 
 |  1270     } | 
|  1889   } |  1271   } | 
|  1890  |  1272  | 
|  1891   vp9_set_speed_features(cpi); |  1273   set_speed_features(cpi); | 
|  1892  |  1274  | 
|  1893   // Default rd threshold factors for mode selection |  1275   // Default rd threshold factors for mode selection | 
|  1894   for (i = 0; i < BLOCK_SIZES; ++i) { |  1276   for (i = 0; i < BLOCK_SIZES; ++i) { | 
|  1895     for (j = 0; j < MAX_MODES; ++j) |  1277     for (j = 0; j < MAX_MODES; ++j) | 
|  1896       cpi->rd_thresh_freq_fact[i][j] = 32; |  1278       cpi->rd_thresh_freq_fact[i][j] = 32; | 
|  1897     for (j = 0; j < MAX_REFS; ++j) |  1279     for (j = 0; j < MAX_REFS; ++j) | 
|  1898       cpi->rd_thresh_freq_sub8x8[i][j] = 32; |  1280       cpi->rd_thresh_freq_sub8x8[i][j] = 32; | 
|  1899   } |  1281   } | 
|  1900  |  1282  | 
|  1901 #define BFP(BT, SDF, SDAF, VF, SVF, SVAF, SVFHH, SVFHV, SVFHHV, \ |  1283 #define BFP(BT, SDF, SDAF, VF, SVF, SVAF, SVFHH, SVFHV, SVFHHV, \ | 
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2003   vp9_loop_filter_init(cm); |  1385   vp9_loop_filter_init(cm); | 
|  2004  |  1386  | 
|  2005   cm->error.setjmp = 0; |  1387   cm->error.setjmp = 0; | 
|  2006  |  1388  | 
|  2007   vp9_zero(cpi->common.counts.uv_mode); |  1389   vp9_zero(cpi->common.counts.uv_mode); | 
|  2008  |  1390  | 
|  2009 #ifdef MODE_TEST_HIT_STATS |  1391 #ifdef MODE_TEST_HIT_STATS | 
|  2010   vp9_zero(cpi->mode_test_hits); |  1392   vp9_zero(cpi->mode_test_hits); | 
|  2011 #endif |  1393 #endif | 
|  2012  |  1394  | 
|  2013   return (VP9_PTR) cpi; |  1395   return cpi; | 
|  2014 } |  1396 } | 
|  2015  |  1397  | 
|  2016 void vp9_remove_compressor(VP9_PTR *ptr) { |  1398 void vp9_remove_compressor(VP9_COMP *cpi) { | 
|  2017   VP9_COMP *cpi = (VP9_COMP *)(*ptr); |  | 
|  2018   int i; |  1399   int i; | 
|  2019  |  1400  | 
|  2020   if (!cpi) |  1401   if (!cpi) | 
|  2021     return; |  1402     return; | 
|  2022  |  1403  | 
|  2023   if (cpi && (cpi->common.current_video_frame > 0)) { |  1404   if (cpi && (cpi->common.current_video_frame > 0)) { | 
|  2024 #if CONFIG_INTERNAL_STATS |  1405 #if CONFIG_INTERNAL_STATS | 
|  2025  |  1406  | 
|  2026     vp9_clear_system_state(); |  1407     vp9_clear_system_state(); | 
|  2027  |  1408  | 
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2114   vpx_free(cpi->mb.ss); |  1495   vpx_free(cpi->mb.ss); | 
|  2115   vpx_free(cpi->tok); |  1496   vpx_free(cpi->tok); | 
|  2116  |  1497  | 
|  2117   for (i = 0; i < sizeof(cpi->mbgraph_stats) / |  1498   for (i = 0; i < sizeof(cpi->mbgraph_stats) / | 
|  2118                   sizeof(cpi->mbgraph_stats[0]); ++i) { |  1499                   sizeof(cpi->mbgraph_stats[0]); ++i) { | 
|  2119     vpx_free(cpi->mbgraph_stats[i].mb_stats); |  1500     vpx_free(cpi->mbgraph_stats[i].mb_stats); | 
|  2120   } |  1501   } | 
|  2121  |  1502  | 
|  2122   vp9_remove_common(&cpi->common); |  1503   vp9_remove_common(&cpi->common); | 
|  2123   vpx_free(cpi); |  1504   vpx_free(cpi); | 
|  2124   *ptr = 0; |  | 
|  2125  |  1505  | 
|  2126 #ifdef OUTPUT_YUV_SRC |  1506 #ifdef OUTPUT_YUV_SRC | 
|  2127   fclose(yuv_file); |  1507   fclose(yuv_file); | 
|  2128 #endif |  1508 #endif | 
|  2129 #ifdef OUTPUT_YUV_REC |  1509 #ifdef OUTPUT_YUV_REC | 
|  2130   fclose(yuv_rec_file); |  1510   fclose(yuv_rec_file); | 
|  2131 #endif |  1511 #endif | 
|  2132  |  1512  | 
|  2133 #if 0 |  1513 #if 0 | 
|  2134  |  1514  | 
|  2135   if (keyfile) |  1515   if (keyfile) | 
|  2136     fclose(keyfile); |  1516     fclose(keyfile); | 
|  2137  |  1517  | 
|  2138   if (framepsnr) |  1518   if (framepsnr) | 
|  2139     fclose(framepsnr); |  1519     fclose(framepsnr); | 
|  2140  |  1520  | 
|  2141   if (kf_list) |  1521   if (kf_list) | 
|  2142     fclose(kf_list); |  1522     fclose(kf_list); | 
|  2143  |  1523  | 
|  2144 #endif |  1524 #endif | 
|  2145 } |  1525 } | 
 |  1526 static int64_t get_sse(const uint8_t *a, int a_stride, | 
 |  1527                        const uint8_t *b, int b_stride, | 
 |  1528                        int width, int height) { | 
 |  1529   const int dw = width % 16; | 
 |  1530   const int dh = height % 16; | 
 |  1531   int64_t total_sse = 0; | 
 |  1532   unsigned int sse = 0; | 
 |  1533   int sum = 0; | 
 |  1534   int x, y; | 
|  2146  |  1535  | 
 |  1536   if (dw > 0) { | 
 |  1537     variance(&a[width - dw], a_stride, &b[width - dw], b_stride, | 
 |  1538              dw, height, &sse, &sum); | 
 |  1539     total_sse += sse; | 
 |  1540   } | 
|  2147  |  1541  | 
|  2148 static uint64_t calc_plane_error(const uint8_t *orig, int orig_stride, |  1542   if (dh > 0) { | 
|  2149                                  const uint8_t *recon, int recon_stride, |  1543     variance(&a[(height - dh) * a_stride], a_stride, | 
|  2150                                  unsigned int cols, unsigned int rows) { |  1544              &b[(height - dh) * b_stride], b_stride, | 
|  2151   unsigned int row, col; |  1545              width - dw, dh, &sse, &sum); | 
|  2152   uint64_t total_sse = 0; |  1546     total_sse += sse; | 
|  2153   int diff; |  1547   } | 
|  2154  |  1548  | 
|  2155   for (row = 0; row + 16 <= rows; row += 16) { |  1549   for (y = 0; y < height / 16; ++y) { | 
|  2156     for (col = 0; col + 16 <= cols; col += 16) { |  1550     const uint8_t *pa = a; | 
|  2157       unsigned int sse; |  1551     const uint8_t *pb = b; | 
 |  1552     for (x = 0; x < width / 16; ++x) { | 
 |  1553       vp9_mse16x16(pa, a_stride, pb, b_stride, &sse); | 
 |  1554       total_sse += sse; | 
|  2158  |  1555  | 
|  2159       vp9_mse16x16(orig + col, orig_stride, recon + col, recon_stride, &sse); |  1556       pa += 16; | 
|  2160       total_sse += sse; |  1557       pb += 16; | 
|  2161     } |  1558     } | 
|  2162  |  1559  | 
|  2163     /* Handle odd-sized width */ |  1560     a += 16 * a_stride; | 
|  2164     if (col < cols) { |  1561     b += 16 * b_stride; | 
|  2165       unsigned int border_row, border_col; |  | 
|  2166       const uint8_t *border_orig = orig; |  | 
|  2167       const uint8_t *border_recon = recon; |  | 
|  2168  |  | 
|  2169       for (border_row = 0; border_row < 16; border_row++) { |  | 
|  2170         for (border_col = col; border_col < cols; border_col++) { |  | 
|  2171           diff = border_orig[border_col] - border_recon[border_col]; |  | 
|  2172           total_sse += diff * diff; |  | 
|  2173         } |  | 
|  2174  |  | 
|  2175         border_orig += orig_stride; |  | 
|  2176         border_recon += recon_stride; |  | 
|  2177       } |  | 
|  2178     } |  | 
|  2179  |  | 
|  2180     orig += orig_stride * 16; |  | 
|  2181     recon += recon_stride * 16; |  | 
|  2182   } |  | 
|  2183  |  | 
|  2184   /* Handle odd-sized height */ |  | 
|  2185   for (; row < rows; row++) { |  | 
|  2186     for (col = 0; col < cols; col++) { |  | 
|  2187       diff = orig[col] - recon[col]; |  | 
|  2188       total_sse += diff * diff; |  | 
|  2189     } |  | 
|  2190  |  | 
|  2191     orig += orig_stride; |  | 
|  2192     recon += recon_stride; |  | 
|  2193   } |  1562   } | 
|  2194  |  1563  | 
|  2195   return total_sse; |  1564   return total_sse; | 
|  2196 } |  1565 } | 
|  2197  |  1566  | 
|  2198 typedef struct { |  1567 typedef struct { | 
|  2199   double psnr[4];       // total/y/u/v |  1568   double psnr[4];       // total/y/u/v | 
|  2200   uint64_t sse[4];      // total/y/u/v |  1569   uint64_t sse[4];      // total/y/u/v | 
|  2201   uint32_t samples[4];  // total/y/u/v |  1570   uint32_t samples[4];  // total/y/u/v | 
|  2202 } PSNR_STATS; |  1571 } PSNR_STATS; | 
|  2203  |  1572  | 
|  2204 static void calc_psnr(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b, |  1573 static void calc_psnr(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b, | 
|  2205                       PSNR_STATS *psnr) { |  1574                       PSNR_STATS *psnr) { | 
|  2206   const int widths[3]        = {a->y_width,  a->uv_width,  a->uv_width }; |  1575   const int widths[3]        = {a->y_width,  a->uv_width,  a->uv_width }; | 
|  2207   const int heights[3]       = {a->y_height, a->uv_height, a->uv_height}; |  1576   const int heights[3]       = {a->y_height, a->uv_height, a->uv_height}; | 
|  2208   const uint8_t *a_planes[3] = {a->y_buffer, a->u_buffer,  a->v_buffer }; |  1577   const uint8_t *a_planes[3] = {a->y_buffer, a->u_buffer,  a->v_buffer }; | 
|  2209   const int a_strides[3]     = {a->y_stride, a->uv_stride, a->uv_stride}; |  1578   const int a_strides[3]     = {a->y_stride, a->uv_stride, a->uv_stride}; | 
|  2210   const uint8_t *b_planes[3] = {b->y_buffer, b->u_buffer,  b->v_buffer }; |  1579   const uint8_t *b_planes[3] = {b->y_buffer, b->u_buffer,  b->v_buffer }; | 
|  2211   const int b_strides[3]     = {b->y_stride, b->uv_stride, b->uv_stride}; |  1580   const int b_strides[3]     = {b->y_stride, b->uv_stride, b->uv_stride}; | 
|  2212   int i; |  1581   int i; | 
|  2213   uint64_t total_sse = 0; |  1582   uint64_t total_sse = 0; | 
|  2214   uint32_t total_samples = 0; |  1583   uint32_t total_samples = 0; | 
|  2215  |  1584  | 
|  2216   for (i = 0; i < 3; ++i) { |  1585   for (i = 0; i < 3; ++i) { | 
|  2217     const int w = widths[i]; |  1586     const int w = widths[i]; | 
|  2218     const int h = heights[i]; |  1587     const int h = heights[i]; | 
|  2219     const uint32_t samples = w * h; |  1588     const uint32_t samples = w * h; | 
|  2220     const uint64_t sse = calc_plane_error(a_planes[i], a_strides[i], |  1589     const uint64_t sse = get_sse(a_planes[i], a_strides[i], | 
|  2221                                           b_planes[i], b_strides[i], |  1590                                  b_planes[i], b_strides[i], | 
|  2222                                           w, h); |  1591                                  w, h); | 
|  2223     psnr->sse[1 + i] = sse; |  1592     psnr->sse[1 + i] = sse; | 
|  2224     psnr->samples[1 + i] = samples; |  1593     psnr->samples[1 + i] = samples; | 
|  2225     psnr->psnr[1 + i] = vpx_sse_to_psnr(samples, 255.0, (double)sse); |  1594     psnr->psnr[1 + i] = vpx_sse_to_psnr(samples, 255.0, (double)sse); | 
|  2226  |  1595  | 
|  2227     total_sse += sse; |  1596     total_sse += sse; | 
|  2228     total_samples += samples; |  1597     total_samples += samples; | 
|  2229   } |  1598   } | 
|  2230  |  1599  | 
|  2231   psnr->sse[0] = total_sse; |  1600   psnr->sse[0] = total_sse; | 
|  2232   psnr->samples[0] = total_samples; |  1601   psnr->samples[0] = total_samples; | 
|  2233   psnr->psnr[0] = vpx_sse_to_psnr((double)total_samples, 255.0, |  1602   psnr->psnr[0] = vpx_sse_to_psnr((double)total_samples, 255.0, | 
|  2234                                   (double)total_sse); |  1603                                   (double)total_sse); | 
|  2235 } |  1604 } | 
|  2236  |  1605  | 
|  2237 static void generate_psnr_packet(VP9_COMP *cpi) { |  1606 static void generate_psnr_packet(VP9_COMP *cpi) { | 
|  2238   struct vpx_codec_cx_pkt pkt; |  1607   struct vpx_codec_cx_pkt pkt; | 
|  2239   int i; |  1608   int i; | 
|  2240   PSNR_STATS psnr; |  1609   PSNR_STATS psnr; | 
|  2241   calc_psnr(cpi->Source, cpi->common.frame_to_show, &psnr); |  1610   calc_psnr(cpi->Source, cpi->common.frame_to_show, &psnr); | 
|  2242   for (i = 0; i < 4; ++i) { |  1611   for (i = 0; i < 4; ++i) { | 
|  2243     pkt.data.psnr.samples[i] = psnr.samples[i]; |  1612     pkt.data.psnr.samples[i] = psnr.samples[i]; | 
|  2244     pkt.data.psnr.sse[i] = psnr.sse[i]; |  1613     pkt.data.psnr.sse[i] = psnr.sse[i]; | 
|  2245     pkt.data.psnr.psnr[i] = psnr.psnr[i]; |  1614     pkt.data.psnr.psnr[i] = psnr.psnr[i]; | 
|  2246   } |  1615   } | 
|  2247   pkt.kind = VPX_CODEC_PSNR_PKT; |  1616   pkt.kind = VPX_CODEC_PSNR_PKT; | 
|  2248   vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt); |  1617   vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt); | 
|  2249 } |  1618 } | 
|  2250  |  1619  | 
|  2251 int vp9_use_as_reference(VP9_PTR ptr, int ref_frame_flags) { |  1620 int vp9_use_as_reference(VP9_COMP *cpi, int ref_frame_flags) { | 
|  2252   VP9_COMP *cpi = (VP9_COMP *)(ptr); |  | 
|  2253  |  | 
|  2254   if (ref_frame_flags > 7) |  1621   if (ref_frame_flags > 7) | 
|  2255     return -1; |  1622     return -1; | 
|  2256  |  1623  | 
|  2257   cpi->ref_frame_flags = ref_frame_flags; |  1624   cpi->ref_frame_flags = ref_frame_flags; | 
|  2258   return 0; |  1625   return 0; | 
|  2259 } |  1626 } | 
|  2260  |  1627  | 
|  2261 int vp9_update_reference(VP9_PTR ptr, int ref_frame_flags) { |  1628 void vp9_update_reference(VP9_COMP *cpi, int ref_frame_flags) { | 
|  2262   VP9_COMP *cpi = (VP9_COMP *)(ptr); |  1629   cpi->ext_refresh_golden_frame = (ref_frame_flags & VP9_GOLD_FLAG) != 0; | 
|  2263  |  1630   cpi->ext_refresh_alt_ref_frame = (ref_frame_flags & VP9_ALT_FLAG) != 0; | 
|  2264   if (ref_frame_flags > 7) |  1631   cpi->ext_refresh_last_frame = (ref_frame_flags & VP9_LAST_FLAG) != 0; | 
|  2265     return -1; |  | 
|  2266  |  | 
|  2267   cpi->ext_refresh_golden_frame = 0; |  | 
|  2268   cpi->ext_refresh_alt_ref_frame = 0; |  | 
|  2269   cpi->ext_refresh_last_frame   = 0; |  | 
|  2270  |  | 
|  2271   if (ref_frame_flags & VP9_LAST_FLAG) |  | 
|  2272     cpi->ext_refresh_last_frame = 1; |  | 
|  2273  |  | 
|  2274   if (ref_frame_flags & VP9_GOLD_FLAG) |  | 
|  2275     cpi->ext_refresh_golden_frame = 1; |  | 
|  2276  |  | 
|  2277   if (ref_frame_flags & VP9_ALT_FLAG) |  | 
|  2278     cpi->ext_refresh_alt_ref_frame = 1; |  | 
|  2279  |  | 
|  2280   cpi->ext_refresh_frame_flags_pending = 1; |  1632   cpi->ext_refresh_frame_flags_pending = 1; | 
|  2281   return 0; |  | 
|  2282 } |  1633 } | 
|  2283  |  1634  | 
|  2284 static YV12_BUFFER_CONFIG *get_vp9_ref_frame_buffer(VP9_COMP *cpi, |  1635 static YV12_BUFFER_CONFIG *get_vp9_ref_frame_buffer(VP9_COMP *cpi, | 
|  2285                                 VP9_REFFRAME ref_frame_flag) { |  1636                                 VP9_REFFRAME ref_frame_flag) { | 
|  2286   MV_REFERENCE_FRAME ref_frame = NONE; |  1637   MV_REFERENCE_FRAME ref_frame = NONE; | 
|  2287   if (ref_frame_flag == VP9_LAST_FLAG) |  1638   if (ref_frame_flag == VP9_LAST_FLAG) | 
|  2288     ref_frame = LAST_FRAME; |  1639     ref_frame = LAST_FRAME; | 
|  2289   else if (ref_frame_flag == VP9_GOLD_FLAG) |  1640   else if (ref_frame_flag == VP9_GOLD_FLAG) | 
|  2290     ref_frame = GOLDEN_FRAME; |  1641     ref_frame = GOLDEN_FRAME; | 
|  2291   else if (ref_frame_flag == VP9_ALT_FLAG) |  1642   else if (ref_frame_flag == VP9_ALT_FLAG) | 
|  2292     ref_frame = ALTREF_FRAME; |  1643     ref_frame = ALTREF_FRAME; | 
|  2293  |  1644  | 
|  2294   return ref_frame == NONE ? NULL : get_ref_frame_buffer(cpi, ref_frame); |  1645   return ref_frame == NONE ? NULL : get_ref_frame_buffer(cpi, ref_frame); | 
|  2295 } |  1646 } | 
|  2296  |  1647  | 
|  2297 int vp9_copy_reference_enc(VP9_PTR ptr, VP9_REFFRAME ref_frame_flag, |  1648 int vp9_copy_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag, | 
|  2298                            YV12_BUFFER_CONFIG *sd) { |  1649                            YV12_BUFFER_CONFIG *sd) { | 
|  2299   VP9_COMP *const cpi = (VP9_COMP *)ptr; |  | 
|  2300   YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag); |  1650   YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag); | 
|  2301   if (cfg) { |  1651   if (cfg) { | 
|  2302     vp8_yv12_copy_frame(cfg, sd); |  1652     vp8_yv12_copy_frame(cfg, sd); | 
|  2303     return 0; |  1653     return 0; | 
|  2304   } else { |  1654   } else { | 
|  2305     return -1; |  1655     return -1; | 
|  2306   } |  1656   } | 
|  2307 } |  1657 } | 
|  2308  |  1658  | 
|  2309 int vp9_get_reference_enc(VP9_PTR ptr, int index, YV12_BUFFER_CONFIG **fb) { |  1659 int vp9_get_reference_enc(VP9_COMP *cpi, int index, YV12_BUFFER_CONFIG **fb) { | 
|  2310   VP9_COMP *cpi = (VP9_COMP *)ptr; |  | 
|  2311   VP9_COMMON *cm = &cpi->common; |  1660   VP9_COMMON *cm = &cpi->common; | 
|  2312  |  1661  | 
|  2313   if (index < 0 || index >= REF_FRAMES) |  1662   if (index < 0 || index >= REF_FRAMES) | 
|  2314     return -1; |  1663     return -1; | 
|  2315  |  1664  | 
|  2316   *fb = &cm->frame_bufs[cm->ref_frame_map[index]].buf; |  1665   *fb = &cm->frame_bufs[cm->ref_frame_map[index]].buf; | 
|  2317   return 0; |  1666   return 0; | 
|  2318 } |  1667 } | 
|  2319  |  1668  | 
|  2320 int vp9_set_reference_enc(VP9_PTR ptr, VP9_REFFRAME ref_frame_flag, |  1669 int vp9_set_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag, | 
|  2321                           YV12_BUFFER_CONFIG *sd) { |  1670                           YV12_BUFFER_CONFIG *sd) { | 
|  2322   VP9_COMP *cpi = (VP9_COMP *)ptr; |  | 
|  2323   YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag); |  1671   YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag); | 
|  2324   if (cfg) { |  1672   if (cfg) { | 
|  2325     vp8_yv12_copy_frame(sd, cfg); |  1673     vp8_yv12_copy_frame(sd, cfg); | 
|  2326     return 0; |  1674     return 0; | 
|  2327   } else { |  1675   } else { | 
|  2328     return -1; |  1676     return -1; | 
|  2329   } |  1677   } | 
|  2330 } |  1678 } | 
|  2331  |  1679  | 
|  2332 int vp9_update_entropy(VP9_PTR comp, int update) { |  1680 int vp9_update_entropy(VP9_COMP * cpi, int update) { | 
|  2333   ((VP9_COMP *)comp)->ext_refresh_frame_context = update; |  1681   cpi->ext_refresh_frame_context = update; | 
|  2334   ((VP9_COMP *)comp)->ext_refresh_frame_context_pending = 1; |  1682   cpi->ext_refresh_frame_context_pending = 1; | 
|  2335   return 0; |  1683   return 0; | 
|  2336 } |  1684 } | 
|  2337  |  1685  | 
|  2338  |  1686  | 
|  2339 #ifdef OUTPUT_YUV_SRC |  1687 #ifdef OUTPUT_YUV_SRC | 
|  2340 void vp9_write_yuv_frame(YV12_BUFFER_CONFIG *s) { |  1688 void vp9_write_yuv_frame(YV12_BUFFER_CONFIG *s) { | 
|  2341   uint8_t *src = s->y_buffer; |  1689   uint8_t *src = s->y_buffer; | 
|  2342   int h = s->y_height; |  1690   int h = s->y_height; | 
|  2343  |  1691  | 
|  2344   do { |  1692   do { | 
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2525   yframe = fopen(filename, "wb"); |  1873   yframe = fopen(filename, "wb"); | 
|  2526  |  1874  | 
|  2527   for (i = 0; i < frame->uv_height; i++) |  1875   for (i = 0; i < frame->uv_height; i++) | 
|  2528     fwrite(frame->v_buffer + i * frame->uv_stride, |  1876     fwrite(frame->v_buffer + i * frame->uv_stride, | 
|  2529            frame->uv_width, 1, yframe); |  1877            frame->uv_width, 1, yframe); | 
|  2530  |  1878  | 
|  2531   fclose(yframe); |  1879   fclose(yframe); | 
|  2532 } |  1880 } | 
|  2533 #endif |  1881 #endif | 
|  2534  |  1882  | 
|  2535 static double compute_edge_pixel_proportion(YV12_BUFFER_CONFIG *frame) { |  | 
|  2536 #define EDGE_THRESH 128 |  | 
|  2537   int i, j; |  | 
|  2538   int num_edge_pels = 0; |  | 
|  2539   int num_pels = (frame->y_height - 2) * (frame->y_width - 2); |  | 
|  2540   uint8_t *prev = frame->y_buffer + 1; |  | 
|  2541   uint8_t *curr = frame->y_buffer + 1 + frame->y_stride; |  | 
|  2542   uint8_t *next = frame->y_buffer + 1 + 2 * frame->y_stride; |  | 
|  2543   for (i = 1; i < frame->y_height - 1; i++) { |  | 
|  2544     for (j = 1; j < frame->y_width - 1; j++) { |  | 
|  2545       /* Sobel hor and ver gradients */ |  | 
|  2546       int v = 2 * (curr[1] - curr[-1]) + (prev[1] - prev[-1]) + |  | 
|  2547               (next[1] - next[-1]); |  | 
|  2548       int h = 2 * (prev[0] - next[0]) + (prev[1] - next[1]) + |  | 
|  2549               (prev[-1] - next[-1]); |  | 
|  2550       h = (h < 0 ? -h : h); |  | 
|  2551       v = (v < 0 ? -v : v); |  | 
|  2552       if (h > EDGE_THRESH || v > EDGE_THRESH) |  | 
|  2553         num_edge_pels++; |  | 
|  2554       curr++; |  | 
|  2555       prev++; |  | 
|  2556       next++; |  | 
|  2557     } |  | 
|  2558     curr += frame->y_stride - frame->y_width + 2; |  | 
|  2559     prev += frame->y_stride - frame->y_width + 2; |  | 
|  2560     next += frame->y_stride - frame->y_width + 2; |  | 
|  2561   } |  | 
|  2562   return (double)num_edge_pels / num_pels; |  | 
|  2563 } |  | 
|  2564  |  | 
|  2565 // Function to test for conditions that indicate we should loop |  1883 // Function to test for conditions that indicate we should loop | 
|  2566 // back and recode a frame. |  1884 // back and recode a frame. | 
|  2567 static int recode_loop_test(const VP9_COMP *cpi, |  1885 static int recode_loop_test(const VP9_COMP *cpi, | 
|  2568                             int high_limit, int low_limit, |  1886                             int high_limit, int low_limit, | 
|  2569                             int q, int maxq, int minq) { |  1887                             int q, int maxq, int minq) { | 
|  2570   const VP9_COMMON *const cm = &cpi->common; |  1888   const VP9_COMMON *const cm = &cpi->common; | 
|  2571   const RATE_CONTROL *const rc = &cpi->rc; |  1889   const RATE_CONTROL *const rc = &cpi->rc; | 
|  2572   int force_recode = 0; |  1890   int force_recode = 0; | 
|  2573  |  1891  | 
|  2574   // Special case trap if maximum allowed frame size exceeded. |  1892   // Special case trap if maximum allowed frame size exceeded. | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
|  2591       // below the automatically set cq level. |  1909       // below the automatically set cq level. | 
|  2592       if (q > cpi->cq_target_quality && |  1910       if (q > cpi->cq_target_quality && | 
|  2593           rc->projected_frame_size < ((rc->this_frame_target * 7) >> 3)) { |  1911           rc->projected_frame_size < ((rc->this_frame_target * 7) >> 3)) { | 
|  2594         force_recode = 1; |  1912         force_recode = 1; | 
|  2595       } |  1913       } | 
|  2596     } |  1914     } | 
|  2597   } |  1915   } | 
|  2598   return force_recode; |  1916   return force_recode; | 
|  2599 } |  1917 } | 
|  2600  |  1918  | 
|  2601 static void update_reference_frames(VP9_COMP * const cpi) { |  1919 void vp9_update_reference_frames(VP9_COMP *cpi) { | 
|  2602   VP9_COMMON * const cm = &cpi->common; |  1920   VP9_COMMON * const cm = &cpi->common; | 
|  2603  |  1921  | 
|  2604   // At this point the new frame has been encoded. |  1922   // At this point the new frame has been encoded. | 
|  2605   // If any buffer copy / swapping is signaled it should be done here. |  1923   // If any buffer copy / swapping is signaled it should be done here. | 
|  2606   if (cm->frame_type == KEY_FRAME) { |  1924   if (cm->frame_type == KEY_FRAME) { | 
|  2607     ref_cnt_fb(cm->frame_bufs, |  1925     ref_cnt_fb(cm->frame_bufs, | 
|  2608                &cm->ref_frame_map[cpi->gld_fb_idx], cm->new_fb_idx); |  1926                &cm->ref_frame_map[cpi->gld_fb_idx], cm->new_fb_idx); | 
|  2609     ref_cnt_fb(cm->frame_bufs, |  1927     ref_cnt_fb(cm->frame_bufs, | 
|  2610                &cm->ref_frame_map[cpi->alt_fb_idx], cm->new_fb_idx); |  1928                &cm->ref_frame_map[cpi->alt_fb_idx], cm->new_fb_idx); | 
|  2611   } |  1929   } | 
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2662   struct loopfilter *lf = &cm->lf; |  1980   struct loopfilter *lf = &cm->lf; | 
|  2663   if (xd->lossless) { |  1981   if (xd->lossless) { | 
|  2664       lf->filter_level = 0; |  1982       lf->filter_level = 0; | 
|  2665   } else { |  1983   } else { | 
|  2666     struct vpx_usec_timer timer; |  1984     struct vpx_usec_timer timer; | 
|  2667  |  1985  | 
|  2668     vp9_clear_system_state(); |  1986     vp9_clear_system_state(); | 
|  2669  |  1987  | 
|  2670     vpx_usec_timer_start(&timer); |  1988     vpx_usec_timer_start(&timer); | 
|  2671  |  1989  | 
|  2672     vp9_pick_filter_level(cpi->Source, cpi, cpi->sf.use_fast_lpf_pick); |  1990     vp9_pick_filter_level(cpi->Source, cpi, cpi->sf.lpf_pick); | 
|  2673  |  1991  | 
|  2674     vpx_usec_timer_mark(&timer); |  1992     vpx_usec_timer_mark(&timer); | 
|  2675     cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer); |  1993     cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer); | 
|  2676   } |  1994   } | 
|  2677  |  1995  | 
|  2678   if (lf->filter_level > 0) { |  1996   if (lf->filter_level > 0) { | 
|  2679     vp9_set_alt_lf_level(cpi, lf->filter_level); |  | 
|  2680     vp9_loop_filter_frame(cm, xd, lf->filter_level, 0, 0); |  1997     vp9_loop_filter_frame(cm, xd, lf->filter_level, 0, 0); | 
|  2681   } |  1998   } | 
|  2682  |  1999  | 
|  2683   vp9_extend_frame_inner_borders(cm->frame_to_show); |  2000   vp9_extend_frame_inner_borders(cm->frame_to_show); | 
|  2684 } |  2001 } | 
|  2685  |  2002  | 
|  2686 static void scale_references(VP9_COMP *cpi) { |  2003 void vp9_scale_references(VP9_COMP *cpi) { | 
|  2687   VP9_COMMON *cm = &cpi->common; |  2004   VP9_COMMON *cm = &cpi->common; | 
|  2688   MV_REFERENCE_FRAME ref_frame; |  2005   MV_REFERENCE_FRAME ref_frame; | 
|  2689  |  2006  | 
|  2690   for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) { |  2007   for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) { | 
|  2691     const int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)]; |  2008     const int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)]; | 
|  2692     YV12_BUFFER_CONFIG *const ref = &cm->frame_bufs[idx].buf; |  2009     YV12_BUFFER_CONFIG *const ref = &cm->frame_bufs[idx].buf; | 
|  2693  |  2010  | 
|  2694     if (ref->y_crop_width != cm->width || |  2011     if (ref->y_crop_width != cm->width || | 
|  2695         ref->y_crop_height != cm->height) { |  2012         ref->y_crop_height != cm->height) { | 
|  2696       const int new_fb = get_free_fb(cm); |  2013       const int new_fb = get_free_fb(cm); | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2738 } |  2055 } | 
|  2739  |  2056  | 
|  2740 #if 0 && CONFIG_INTERNAL_STATS |  2057 #if 0 && CONFIG_INTERNAL_STATS | 
|  2741 static void output_frame_level_debug_stats(VP9_COMP *cpi) { |  2058 static void output_frame_level_debug_stats(VP9_COMP *cpi) { | 
|  2742   VP9_COMMON *const cm = &cpi->common; |  2059   VP9_COMMON *const cm = &cpi->common; | 
|  2743   FILE *const f = fopen("tmp.stt", cm->current_video_frame ? "a" : "w"); |  2060   FILE *const f = fopen("tmp.stt", cm->current_video_frame ? "a" : "w"); | 
|  2744   int recon_err; |  2061   int recon_err; | 
|  2745  |  2062  | 
|  2746   vp9_clear_system_state(); |  2063   vp9_clear_system_state(); | 
|  2747  |  2064  | 
|  2748   recon_err = vp9_calc_ss_err(cpi->Source, get_frame_new_buffer(cm)); |  2065   recon_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm)); | 
|  2749  |  2066  | 
|  2750   if (cpi->twopass.total_left_stats.coded_error != 0.0) |  2067   if (cpi->twopass.total_left_stats.coded_error != 0.0) | 
|  2751     fprintf(f, "%10u %10d %10d %10d %10d %10d " |  2068     fprintf(f, "%10u %10d %10d %10d %10d %10d " | 
|  2752         "%10"PRId64" %10"PRId64" %10d " |  2069         "%10"PRId64" %10"PRId64" %10d " | 
|  2753         "%7.2lf %7.2lf %7.2lf %7.2lf %7.2lf" |  2070         "%7.2lf %7.2lf %7.2lf %7.2lf %7.2lf" | 
|  2754         "%6d %6d %5d %5d %5d " |  2071         "%6d %6d %5d %5d %5d " | 
|  2755         "%10"PRId64" %10.3lf" |  2072         "%10"PRId64" %10.3lf" | 
|  2756         "%10lf %8u %10d %10d %10d\n", |  2073         "%10lf %8u %10d %10d %10d\n", | 
|  2757         cpi->common.current_video_frame, cpi->rc.this_frame_target, |  2074         cpi->common.current_video_frame, cpi->rc.this_frame_target, | 
|  2758         cpi->rc.projected_frame_size, |  2075         cpi->rc.projected_frame_size, | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2794   } |  2111   } | 
|  2795 } |  2112 } | 
|  2796 #endif |  2113 #endif | 
|  2797  |  2114  | 
|  2798 static void encode_without_recode_loop(VP9_COMP *cpi, |  2115 static void encode_without_recode_loop(VP9_COMP *cpi, | 
|  2799                                        size_t *size, |  2116                                        size_t *size, | 
|  2800                                        uint8_t *dest, |  2117                                        uint8_t *dest, | 
|  2801                                        int q) { |  2118                                        int q) { | 
|  2802   VP9_COMMON *const cm = &cpi->common; |  2119   VP9_COMMON *const cm = &cpi->common; | 
|  2803   vp9_clear_system_state(); |  2120   vp9_clear_system_state(); | 
|  2804   vp9_set_quantizer(cpi, q); |  2121   vp9_set_quantizer(cm, q); | 
|  2805  |  2122  | 
|  2806   // Set up entropy context depending on frame type. The decoder mandates |  2123   // Set up entropy context depending on frame type. The decoder mandates | 
|  2807   // the use of the default context, index 0, for keyframes and inter |  2124   // the use of the default context, index 0, for keyframes and inter | 
|  2808   // frames where the error_resilient_mode or intra_only flag is set. For |  2125   // frames where the error_resilient_mode or intra_only flag is set. For | 
|  2809   // other inter-frames the encoder currently uses only two contexts; |  2126   // other inter-frames the encoder currently uses only two contexts; | 
|  2810   // context 1 for ALTREF frames and context 0 for the others. |  2127   // context 1 for ALTREF frames and context 0 for the others. | 
|  2811   if (cm->frame_type == KEY_FRAME) { |  2128   if (cm->frame_type == KEY_FRAME) { | 
|  2812     vp9_setup_key_frame(cpi); |  2129     setup_key_frame(cpi); | 
|  2813   } else { |  2130   } else { | 
|  2814     if (!cm->intra_only && !cm->error_resilient_mode && !cpi->use_svc) { |  2131     if (!cm->intra_only && !cm->error_resilient_mode && !cpi->use_svc) | 
|  2815       cpi->common.frame_context_idx = cpi->refresh_alt_ref_frame; |  2132       cm->frame_context_idx = cpi->refresh_alt_ref_frame; | 
|  2816     } |  2133  | 
|  2817     vp9_setup_inter_frame(cpi); |  2134     setup_inter_frame(cm); | 
|  2818   } |  2135   } | 
|  2819   // Variance adaptive and in frame q adjustment experiments are mutually |  2136   // Variance adaptive and in frame q adjustment experiments are mutually | 
|  2820   // exclusive. |  2137   // exclusive. | 
|  2821   if (cpi->oxcf.aq_mode == VARIANCE_AQ) { |  2138   if (cpi->oxcf.aq_mode == VARIANCE_AQ) { | 
|  2822     vp9_vaq_frame_setup(cpi); |  2139     vp9_vaq_frame_setup(cpi); | 
|  2823   } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) { |  2140   } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) { | 
|  2824     setup_in_frame_q_adj(cpi); |  2141     vp9_setup_in_frame_q_adj(cpi); | 
 |  2142   } else if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) { | 
 |  2143     vp9_cyclic_refresh_setup(cpi); | 
|  2825   } |  2144   } | 
|  2826   // transform / motion compensation build reconstruction frame |  2145   // transform / motion compensation build reconstruction frame | 
|  2827   vp9_encode_frame(cpi); |  2146   vp9_encode_frame(cpi); | 
|  2828  |  2147  | 
|  2829   // Update the skip mb flag probabilities based on the distribution |  2148   // Update the skip mb flag probabilities based on the distribution | 
|  2830   // seen in the last encoder iteration. |  2149   // seen in the last encoder iteration. | 
|  2831   // update_base_skip_probs(cpi); |  2150   // update_base_skip_probs(cpi); | 
|  2832   vp9_clear_system_state(); |  2151   vp9_clear_system_state(); | 
|  2833 } |  2152 } | 
|  2834  |  2153  | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
|  2849   int frame_under_shoot_limit; |  2168   int frame_under_shoot_limit; | 
|  2850  |  2169  | 
|  2851   // Decide frame size bounds |  2170   // Decide frame size bounds | 
|  2852   vp9_rc_compute_frame_size_bounds(cpi, rc->this_frame_target, |  2171   vp9_rc_compute_frame_size_bounds(cpi, rc->this_frame_target, | 
|  2853                                    &frame_under_shoot_limit, |  2172                                    &frame_under_shoot_limit, | 
|  2854                                    &frame_over_shoot_limit); |  2173                                    &frame_over_shoot_limit); | 
|  2855  |  2174  | 
|  2856   do { |  2175   do { | 
|  2857     vp9_clear_system_state(); |  2176     vp9_clear_system_state(); | 
|  2858  |  2177  | 
|  2859     vp9_set_quantizer(cpi, q); |  2178     vp9_set_quantizer(cm, q); | 
|  2860  |  2179  | 
|  2861     if (loop_count == 0) { |  2180     if (loop_count == 0) { | 
|  2862       // Set up entropy context depending on frame type. The decoder mandates |  2181       // Set up entropy context depending on frame type. The decoder mandates | 
|  2863       // the use of the default context, index 0, for keyframes and inter |  2182       // the use of the default context, index 0, for keyframes and inter | 
|  2864       // frames where the error_resilient_mode or intra_only flag is set. For |  2183       // frames where the error_resilient_mode or intra_only flag is set. For | 
|  2865       // other inter-frames the encoder currently uses only two contexts; |  2184       // other inter-frames the encoder currently uses only two contexts; | 
|  2866       // context 1 for ALTREF frames and context 0 for the others. |  2185       // context 1 for ALTREF frames and context 0 for the others. | 
|  2867       if (cm->frame_type == KEY_FRAME) { |  2186       if (cm->frame_type == KEY_FRAME) { | 
|  2868         vp9_setup_key_frame(cpi); |  2187         setup_key_frame(cpi); | 
|  2869       } else { |  2188       } else { | 
|  2870         if (!cm->intra_only && !cm->error_resilient_mode && !cpi->use_svc) { |  2189         if (!cm->intra_only && !cm->error_resilient_mode && !cpi->use_svc) | 
|  2871           cpi->common.frame_context_idx = cpi->refresh_alt_ref_frame; |  2190           cpi->common.frame_context_idx = cpi->refresh_alt_ref_frame; | 
|  2872         } |  2191  | 
|  2873         vp9_setup_inter_frame(cpi); |  2192         setup_inter_frame(cm); | 
|  2874       } |  2193       } | 
|  2875     } |  2194     } | 
|  2876  |  2195  | 
|  2877     // Variance adaptive and in frame q adjustment experiments are mutually |  2196     // Variance adaptive and in frame q adjustment experiments are mutually | 
|  2878     // exclusive. |  2197     // exclusive. | 
|  2879     if (cpi->oxcf.aq_mode == VARIANCE_AQ) { |  2198     if (cpi->oxcf.aq_mode == VARIANCE_AQ) { | 
|  2880       vp9_vaq_frame_setup(cpi); |  2199       vp9_vaq_frame_setup(cpi); | 
|  2881     } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) { |  2200     } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) { | 
|  2882       setup_in_frame_q_adj(cpi); |  2201       vp9_setup_in_frame_q_adj(cpi); | 
|  2883     } |  2202     } | 
|  2884  |  2203  | 
|  2885     // transform / motion compensation build reconstruction frame |  2204     // transform / motion compensation build reconstruction frame | 
|  2886     vp9_encode_frame(cpi); |  2205     vp9_encode_frame(cpi); | 
|  2887  |  2206  | 
|  2888     // Update the skip mb flag probabilities based on the distribution |  2207     // Update the skip mb flag probabilities based on the distribution | 
|  2889     // seen in the last encoder iteration. |  2208     // seen in the last encoder iteration. | 
|  2890     // update_base_skip_probs(cpi); |  2209     // update_base_skip_probs(cpi); | 
|  2891  |  2210  | 
|  2892     vp9_clear_system_state(); |  2211     vp9_clear_system_state(); | 
|  2893  |  2212  | 
|  2894     // Dummy pack of the bitstream using up to date stats to get an |  2213     // Dummy pack of the bitstream using up to date stats to get an | 
|  2895     // accurate estimate of output frame size to determine if we need |  2214     // accurate estimate of output frame size to determine if we need | 
|  2896     // to recode. |  2215     // to recode. | 
|  2897     if (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF) { |  2216     if (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF) { | 
|  2898       vp9_save_coding_context(cpi); |  2217       save_coding_context(cpi); | 
|  2899       cpi->dummy_packing = 1; |  2218       cpi->dummy_packing = 1; | 
|  2900       if (!cpi->sf.use_nonrd_pick_mode) |  2219       if (!cpi->sf.use_nonrd_pick_mode) | 
|  2901         vp9_pack_bitstream(cpi, dest, size); |  2220         vp9_pack_bitstream(cpi, dest, size); | 
|  2902  |  2221  | 
|  2903       rc->projected_frame_size = (int)(*size) << 3; |  2222       rc->projected_frame_size = (int)(*size) << 3; | 
|  2904       vp9_restore_coding_context(cpi); |  2223       restore_coding_context(cpi); | 
|  2905  |  2224  | 
|  2906       if (frame_over_shoot_limit == 0) |  2225       if (frame_over_shoot_limit == 0) | 
|  2907         frame_over_shoot_limit = 1; |  2226         frame_over_shoot_limit = 1; | 
|  2908     } |  2227     } | 
|  2909  |  2228  | 
|  2910     if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) { |  2229     if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) { | 
|  2911       loop = 0; |  2230       loop = 0; | 
|  2912     } else { |  2231     } else { | 
|  2913       if ((cm->frame_type == KEY_FRAME) && |  2232       if ((cm->frame_type == KEY_FRAME) && | 
|  2914            rc->this_key_frame_forced && |  2233            rc->this_key_frame_forced && | 
|  2915            (rc->projected_frame_size < rc->max_frame_bandwidth)) { |  2234            (rc->projected_frame_size < rc->max_frame_bandwidth)) { | 
|  2916         int last_q = q; |  2235         int last_q = q; | 
|  2917         int kf_err = vp9_calc_ss_err(cpi->Source, get_frame_new_buffer(cm)); |  2236         int kf_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm)); | 
|  2918  |  2237  | 
|  2919         int high_err_target = cpi->ambient_err; |  2238         int high_err_target = cpi->ambient_err; | 
|  2920         int low_err_target = cpi->ambient_err >> 1; |  2239         int low_err_target = cpi->ambient_err >> 1; | 
|  2921  |  2240  | 
|  2922         // Prevent possible divide by zero error below for perfect KF |  2241         // Prevent possible divide by zero error below for perfect KF | 
|  2923         kf_err += !kf_err; |  2242         kf_err += !kf_err; | 
|  2924  |  2243  | 
|  2925         // The key frame is not good enough or we can afford |  2244         // The key frame is not good enough or we can afford | 
|  2926         // to make it better without undue risk of popping. |  2245         // to make it better without undue risk of popping. | 
|  2927         if ((kf_err > high_err_target && |  2246         if ((kf_err > high_err_target && | 
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3111  |  2430  | 
|  3112   /* Scale the source buffer, if required. */ |  2431   /* Scale the source buffer, if required. */ | 
|  3113   if (cm->mi_cols * MI_SIZE != cpi->un_scaled_source->y_width || |  2432   if (cm->mi_cols * MI_SIZE != cpi->un_scaled_source->y_width || | 
|  3114       cm->mi_rows * MI_SIZE != cpi->un_scaled_source->y_height) { |  2433       cm->mi_rows * MI_SIZE != cpi->un_scaled_source->y_height) { | 
|  3115     scale_and_extend_frame_nonnormative(cpi->un_scaled_source, |  2434     scale_and_extend_frame_nonnormative(cpi->un_scaled_source, | 
|  3116                                         &cpi->scaled_source); |  2435                                         &cpi->scaled_source); | 
|  3117     cpi->Source = &cpi->scaled_source; |  2436     cpi->Source = &cpi->scaled_source; | 
|  3118   } else { |  2437   } else { | 
|  3119     cpi->Source = cpi->un_scaled_source; |  2438     cpi->Source = cpi->un_scaled_source; | 
|  3120   } |  2439   } | 
|  3121   scale_references(cpi); |  2440  | 
 |  2441   // Scale the last source buffer, if required. | 
 |  2442   if (cpi->unscaled_last_source != NULL) { | 
 |  2443     if (cm->mi_cols * MI_SIZE != cpi->unscaled_last_source->y_width || | 
 |  2444         cm->mi_rows * MI_SIZE != cpi->unscaled_last_source->y_height) { | 
 |  2445       scale_and_extend_frame_nonnormative(cpi->unscaled_last_source, | 
 |  2446                                           &cpi->scaled_last_source); | 
 |  2447       cpi->Last_Source = &cpi->scaled_last_source; | 
 |  2448     } else { | 
 |  2449       cpi->Last_Source = cpi->unscaled_last_source; | 
 |  2450     } | 
 |  2451   } | 
 |  2452  | 
 |  2453   vp9_scale_references(cpi); | 
|  3122  |  2454  | 
|  3123   vp9_clear_system_state(); |  2455   vp9_clear_system_state(); | 
|  3124  |  2456  | 
|  3125   // Enable or disable mode based tweaking of the zbin. |  2457   // Enable or disable mode based tweaking of the zbin. | 
|  3126   // For 2 pass only used where GF/ARF prediction quality |  2458   // For 2 pass only used where GF/ARF prediction quality | 
|  3127   // is above a threshold. |  2459   // is above a threshold. | 
|  3128   cpi->zbin_mode_boost = 0; |  2460   cpi->zbin_mode_boost = 0; | 
|  3129   cpi->zbin_mode_boost_enabled = 0; |  2461   cpi->zbin_mode_boost_enabled = 0; | 
|  3130  |  2462  | 
|  3131   // Current default encoder behavior for the altref sign bias. |  2463   // Current default encoder behavior for the altref sign bias. | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
|  3148         // in the previous frame, capped by the default max_mv_magnitude based |  2480         // in the previous frame, capped by the default max_mv_magnitude based | 
|  3149         // on resolution. |  2481         // on resolution. | 
|  3150         cpi->mv_step_param = vp9_init_search_range(cpi, MIN(max_mv_def, 2 * |  2482         cpi->mv_step_param = vp9_init_search_range(cpi, MIN(max_mv_def, 2 * | 
|  3151                                  cpi->max_mv_magnitude)); |  2483                                  cpi->max_mv_magnitude)); | 
|  3152       cpi->max_mv_magnitude = 0; |  2484       cpi->max_mv_magnitude = 0; | 
|  3153     } |  2485     } | 
|  3154   } |  2486   } | 
|  3155  |  2487  | 
|  3156   // Set various flags etc to special state if it is a key frame. |  2488   // Set various flags etc to special state if it is a key frame. | 
|  3157   if (frame_is_intra_only(cm)) { |  2489   if (frame_is_intra_only(cm)) { | 
|  3158     vp9_setup_key_frame(cpi); |  2490     setup_key_frame(cpi); | 
|  3159     // Reset the loop filter deltas and segmentation map. |  2491     // Reset the loop filter deltas and segmentation map. | 
|  3160     vp9_reset_segment_features(&cm->seg); |  2492     vp9_reset_segment_features(&cm->seg); | 
|  3161  |  2493  | 
|  3162     // If segmentation is enabled force a map update for key frames. |  2494     // If segmentation is enabled force a map update for key frames. | 
|  3163     if (seg->enabled) { |  2495     if (seg->enabled) { | 
|  3164       seg->update_map = 1; |  2496       seg->update_map = 1; | 
|  3165       seg->update_data = 1; |  2497       seg->update_data = 1; | 
|  3166     } |  2498     } | 
|  3167  |  2499  | 
|  3168     // The alternate reference frame cannot be active for a key frame. |  2500     // The alternate reference frame cannot be active for a key frame. | 
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3230         break; |  2562         break; | 
|  3231     } |  2563     } | 
|  3232     vp9_denoise(cpi->Source, cpi->Source, l); |  2564     vp9_denoise(cpi->Source, cpi->Source, l); | 
|  3233   } |  2565   } | 
|  3234 #endif |  2566 #endif | 
|  3235  |  2567  | 
|  3236 #ifdef OUTPUT_YUV_SRC |  2568 #ifdef OUTPUT_YUV_SRC | 
|  3237   vp9_write_yuv_frame(cpi->Source); |  2569   vp9_write_yuv_frame(cpi->Source); | 
|  3238 #endif |  2570 #endif | 
|  3239  |  2571  | 
 |  2572   set_speed_features(cpi); | 
 |  2573  | 
|  3240   // Decide q and q bounds. |  2574   // Decide q and q bounds. | 
|  3241   q = vp9_rc_pick_q_and_bounds(cpi, &bottom_index, &top_index); |  2575   q = vp9_rc_pick_q_and_bounds(cpi, &bottom_index, &top_index); | 
|  3242  |  2576  | 
|  3243   if (!frame_is_intra_only(cm)) { |  2577   if (!frame_is_intra_only(cm)) { | 
|  3244     cm->interp_filter = DEFAULT_INTERP_FILTER; |  2578     cm->interp_filter = DEFAULT_INTERP_FILTER; | 
|  3245     /* TODO: Decide this more intelligently */ |  2579     /* TODO: Decide this more intelligently */ | 
|  3246     set_high_precision_mv(cpi, q < HIGH_PRECISION_MV_QTHRESH); |  2580     set_high_precision_mv(cpi, q < HIGH_PRECISION_MV_QTHRESH); | 
|  3247   } |  2581   } | 
|  3248  |  2582  | 
|  3249   if (cpi->sf.recode_loop == DISALLOW_RECODE) { |  2583   if (cpi->sf.recode_loop == DISALLOW_RECODE) { | 
|  3250     encode_without_recode_loop(cpi, size, dest, q); |  2584     encode_without_recode_loop(cpi, size, dest, q); | 
|  3251   } else { |  2585   } else { | 
|  3252     encode_with_recode_loop(cpi, size, dest, q, bottom_index, top_index); |  2586     encode_with_recode_loop(cpi, size, dest, q, bottom_index, top_index); | 
|  3253   } |  2587   } | 
|  3254  |  2588  | 
|  3255   // Special case code to reduce pulsing when key frames are forced at a |  2589   // Special case code to reduce pulsing when key frames are forced at a | 
|  3256   // fixed interval. Note the reconstruction error if it is the frame before |  2590   // fixed interval. Note the reconstruction error if it is the frame before | 
|  3257   // the force key frame |  2591   // the force key frame | 
|  3258   if (cpi->rc.next_key_frame_forced && cpi->rc.frames_to_key == 1) { |  2592   if (cpi->rc.next_key_frame_forced && cpi->rc.frames_to_key == 1) { | 
|  3259     cpi->ambient_err = vp9_calc_ss_err(cpi->Source, get_frame_new_buffer(cm)); |  2593     cpi->ambient_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm)); | 
|  3260   } |  2594   } | 
|  3261  |  2595  | 
|  3262   // If the encoder forced a KEY_FRAME decision |  2596   // If the encoder forced a KEY_FRAME decision | 
|  3263   if (cm->frame_type == KEY_FRAME) |  2597   if (cm->frame_type == KEY_FRAME) | 
|  3264     cpi->refresh_last_frame = 1; |  2598     cpi->refresh_last_frame = 1; | 
|  3265  |  2599  | 
|  3266   cm->frame_to_show = get_frame_new_buffer(cm); |  2600   cm->frame_to_show = get_frame_new_buffer(cm); | 
|  3267  |  2601  | 
|  3268 #if WRITE_RECON_BUFFER |  2602 #if WRITE_RECON_BUFFER | 
|  3269   if (cm->show_frame) |  2603   if (cm->show_frame) | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
|  3287 #endif |  2621 #endif | 
|  3288  |  2622  | 
|  3289   // build the bitstream |  2623   // build the bitstream | 
|  3290   cpi->dummy_packing = 0; |  2624   cpi->dummy_packing = 0; | 
|  3291   vp9_pack_bitstream(cpi, dest, size); |  2625   vp9_pack_bitstream(cpi, dest, size); | 
|  3292  |  2626  | 
|  3293   if (cm->seg.update_map) |  2627   if (cm->seg.update_map) | 
|  3294     update_reference_segmentation_map(cpi); |  2628     update_reference_segmentation_map(cpi); | 
|  3295  |  2629  | 
|  3296   release_scaled_references(cpi); |  2630   release_scaled_references(cpi); | 
|  3297   update_reference_frames(cpi); |  2631   vp9_update_reference_frames(cpi); | 
|  3298  |  2632  | 
|  3299   for (t = TX_4X4; t <= TX_32X32; t++) |  2633   for (t = TX_4X4; t <= TX_32X32; t++) | 
|  3300     full_to_model_counts(cm->counts.coef[t], cpi->coef_counts[t]); |  2634     full_to_model_counts(cm->counts.coef[t], cpi->coef_counts[t]); | 
|  3301  |  2635  | 
|  3302   if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode) |  2636   if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode) | 
|  3303     vp9_adapt_coef_probs(cm); |  2637     vp9_adapt_coef_probs(cm); | 
|  3304  |  2638  | 
|  3305   if (!frame_is_intra_only(cm)) { |  2639   if (!frame_is_intra_only(cm)) { | 
|  3306     if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode) { |  2640     if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode) { | 
|  3307       vp9_adapt_mode_probs(cm); |  2641       vp9_adapt_mode_probs(cm); | 
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3364  |  2698  | 
|  3365   // keep track of the last coded dimensions |  2699   // keep track of the last coded dimensions | 
|  3366   cm->last_width = cm->width; |  2700   cm->last_width = cm->width; | 
|  3367   cm->last_height = cm->height; |  2701   cm->last_height = cm->height; | 
|  3368  |  2702  | 
|  3369   // reset to normal state now that we are done. |  2703   // reset to normal state now that we are done. | 
|  3370   if (!cm->show_existing_frame) |  2704   if (!cm->show_existing_frame) | 
|  3371     cm->last_show_frame = cm->show_frame; |  2705     cm->last_show_frame = cm->show_frame; | 
|  3372  |  2706  | 
|  3373   if (cm->show_frame) { |  2707   if (cm->show_frame) { | 
|  3374     // current mip will be the prev_mip for the next frame |  2708     vp9_swap_mi_and_prev_mi(cm); | 
|  3375     MODE_INFO *temp = cm->prev_mip; |  | 
|  3376     MODE_INFO **temp2 = cm->prev_mi_grid_base; |  | 
|  3377     cm->prev_mip = cm->mip; |  | 
|  3378     cm->mip = temp; |  | 
|  3379     cm->prev_mi_grid_base = cm->mi_grid_base; |  | 
|  3380     cm->mi_grid_base = temp2; |  | 
|  3381  |  | 
|  3382     // update the upper left visible macroblock ptrs |  | 
|  3383     cm->mi = cm->mip + cm->mode_info_stride + 1; |  | 
|  3384     cm->mi_grid_visible = cm->mi_grid_base + cm->mode_info_stride + 1; |  | 
|  3385  |  | 
|  3386     cpi->mb.e_mbd.mi_8x8 = cm->mi_grid_visible; |  | 
|  3387     cpi->mb.e_mbd.mi_8x8[0] = cm->mi; |  | 
|  3388  |  2709  | 
|  3389     // Don't increment frame counters if this was an altref buffer |  2710     // Don't increment frame counters if this was an altref buffer | 
|  3390     // update not a real frame |  2711     // update not a real frame | 
|  3391     ++cm->current_video_frame; |  2712     ++cm->current_video_frame; | 
 |  2713     if (cpi->use_svc) | 
 |  2714       vp9_inc_frame_in_layer(&cpi->svc); | 
|  3392   } |  2715   } | 
|  3393  |  | 
|  3394   // restore prev_mi |  | 
|  3395   cm->prev_mi = cm->prev_mip + cm->mode_info_stride + 1; |  | 
|  3396   cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mode_info_stride + 1; |  | 
|  3397 } |  2716 } | 
|  3398  |  2717  | 
|  3399 static void SvcEncode(VP9_COMP *cpi, size_t *size, uint8_t *dest, |  2718 static void SvcEncode(VP9_COMP *cpi, size_t *size, uint8_t *dest, | 
|  3400                       unsigned int *frame_flags) { |  2719                       unsigned int *frame_flags) { | 
|  3401   vp9_rc_get_svc_params(cpi); |  2720   vp9_rc_get_svc_params(cpi); | 
|  3402   encode_frame_to_data_rate(cpi, size, dest, frame_flags); |  2721   encode_frame_to_data_rate(cpi, size, dest, frame_flags); | 
|  3403 } |  2722 } | 
|  3404  |  2723  | 
|  3405 static void Pass0Encode(VP9_COMP *cpi, size_t *size, uint8_t *dest, |  2724 static void Pass0Encode(VP9_COMP *cpi, size_t *size, uint8_t *dest, | 
|  3406                         unsigned int *frame_flags) { |  2725                         unsigned int *frame_flags) { | 
|  3407   if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) { |  2726   if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) { | 
|  3408     vp9_rc_get_one_pass_cbr_params(cpi); |  2727     vp9_rc_get_one_pass_cbr_params(cpi); | 
|  3409   } else { |  2728   } else { | 
|  3410     vp9_rc_get_one_pass_vbr_params(cpi); |  2729     vp9_rc_get_one_pass_vbr_params(cpi); | 
|  3411   } |  2730   } | 
|  3412   encode_frame_to_data_rate(cpi, size, dest, frame_flags); |  2731   encode_frame_to_data_rate(cpi, size, dest, frame_flags); | 
|  3413 } |  2732 } | 
|  3414  |  2733  | 
|  3415 static void Pass1Encode(VP9_COMP *cpi, size_t *size, uint8_t *dest, |  2734 static void Pass1Encode(VP9_COMP *cpi, size_t *size, uint8_t *dest, | 
|  3416                         unsigned int *frame_flags) { |  2735                         unsigned int *frame_flags) { | 
|  3417   (void) size; |  2736   (void) size; | 
|  3418   (void) dest; |  2737   (void) dest; | 
|  3419   (void) frame_flags; |  2738   (void) frame_flags; | 
|  3420  |  2739  | 
|  3421   vp9_rc_get_first_pass_params(cpi); |  2740   vp9_rc_get_first_pass_params(cpi); | 
|  3422   vp9_set_quantizer(cpi, find_fp_qindex()); |  2741   vp9_set_quantizer(&cpi->common, find_fp_qindex()); | 
|  3423   vp9_first_pass(cpi); |  2742   vp9_first_pass(cpi); | 
|  3424 } |  2743 } | 
|  3425  |  2744  | 
|  3426 static void Pass2Encode(VP9_COMP *cpi, size_t *size, |  2745 static void Pass2Encode(VP9_COMP *cpi, size_t *size, | 
|  3427                         uint8_t *dest, unsigned int *frame_flags) { |  2746                         uint8_t *dest, unsigned int *frame_flags) { | 
|  3428   cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED; |  2747   cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED; | 
|  3429  |  2748  | 
|  3430   vp9_rc_get_second_pass_params(cpi); |  2749   vp9_rc_get_second_pass_params(cpi); | 
|  3431   encode_frame_to_data_rate(cpi, size, dest, frame_flags); |  2750   encode_frame_to_data_rate(cpi, size, dest, frame_flags); | 
|  3432  |  2751  | 
|  3433   vp9_twopass_postencode_update(cpi, *size); |  2752   vp9_twopass_postencode_update(cpi); | 
|  3434 } |  2753 } | 
|  3435  |  2754  | 
|  3436 static void check_initial_width(VP9_COMP *cpi, int subsampling_x, |  2755 static void check_initial_width(VP9_COMP *cpi, int subsampling_x, | 
|  3437                                 int subsampling_y) { |  2756                                 int subsampling_y) { | 
|  3438   VP9_COMMON *const cm = &cpi->common; |  2757   VP9_COMMON *const cm = &cpi->common; | 
|  3439  |  2758  | 
|  3440   if (!cpi->initial_width) { |  2759   if (!cpi->initial_width) { | 
|  3441     cm->subsampling_x = subsampling_x; |  2760     cm->subsampling_x = subsampling_x; | 
|  3442     cm->subsampling_y = subsampling_y; |  2761     cm->subsampling_y = subsampling_y; | 
|  3443     alloc_raw_frame_buffers(cpi); |  2762     alloc_raw_frame_buffers(cpi); | 
|  3444     cpi->initial_width = cm->width; |  2763     cpi->initial_width = cm->width; | 
|  3445     cpi->initial_height = cm->height; |  2764     cpi->initial_height = cm->height; | 
|  3446   } |  2765   } | 
|  3447 } |  2766 } | 
|  3448  |  2767  | 
|  3449  |  2768  | 
|  3450 int vp9_receive_raw_frame(VP9_PTR ptr, unsigned int frame_flags, |  2769 int vp9_receive_raw_frame(VP9_COMP *cpi, unsigned int frame_flags, | 
|  3451                           YV12_BUFFER_CONFIG *sd, int64_t time_stamp, |  2770                           YV12_BUFFER_CONFIG *sd, int64_t time_stamp, | 
|  3452                           int64_t end_time) { |  2771                           int64_t end_time) { | 
|  3453   VP9_COMP *cpi = (VP9_COMP *)ptr; |  | 
|  3454   VP9_COMMON *cm = &cpi->common; |  2772   VP9_COMMON *cm = &cpi->common; | 
|  3455   struct vpx_usec_timer timer; |  2773   struct vpx_usec_timer timer; | 
|  3456   int res = 0; |  2774   int res = 0; | 
|  3457   const int subsampling_x = sd->uv_width  < sd->y_width; |  2775   const int subsampling_x = sd->uv_width  < sd->y_width; | 
|  3458   const int subsampling_y = sd->uv_height < sd->y_height; |  2776   const int subsampling_y = sd->uv_height < sd->y_height; | 
|  3459  |  2777  | 
|  3460   check_initial_width(cpi, subsampling_x, subsampling_y); |  2778   check_initial_width(cpi, subsampling_x, subsampling_y); | 
|  3461   vpx_usec_timer_start(&timer); |  2779   vpx_usec_timer_start(&timer); | 
|  3462   if (vp9_lookahead_push(cpi->lookahead, |  2780   if (vp9_lookahead_push(cpi->lookahead, | 
|  3463                          sd, time_stamp, end_time, frame_flags)) |  2781                          sd, time_stamp, end_time, frame_flags)) | 
|  3464     res = -1; |  2782     res = -1; | 
|  3465   vpx_usec_timer_mark(&timer); |  2783   vpx_usec_timer_mark(&timer); | 
|  3466   cpi->time_receive_data += vpx_usec_timer_elapsed(&timer); |  2784   cpi->time_receive_data += vpx_usec_timer_elapsed(&timer); | 
|  3467  |  2785  | 
|  3468   if (cm->version == 0 && (subsampling_x != 1 || subsampling_y != 1)) { |  2786   if (cm->profile == PROFILE_0 && (subsampling_x != 1 || subsampling_y != 1)) { | 
|  3469     vpx_internal_error(&cm->error, VPX_CODEC_INVALID_PARAM, |  2787     vpx_internal_error(&cm->error, VPX_CODEC_INVALID_PARAM, | 
|  3470                        "Non-4:2:0 color space requires profile >= 1"); |  2788                        "Non-4:2:0 color space requires profile >= 1"); | 
|  3471     res = -1; |  2789     res = -1; | 
|  3472   } |  2790   } | 
|  3473  |  2791  | 
|  3474   return res; |  2792   return res; | 
|  3475 } |  2793 } | 
|  3476  |  2794  | 
|  3477  |  2795  | 
|  3478 static int frame_is_reference(const VP9_COMP *cpi) { |  2796 static int frame_is_reference(const VP9_COMP *cpi) { | 
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3526       avg_duration *= (interval - avg_duration + this_duration); |  2844       avg_duration *= (interval - avg_duration + this_duration); | 
|  3527       avg_duration /= interval; |  2845       avg_duration /= interval; | 
|  3528  |  2846  | 
|  3529       vp9_new_framerate(cpi, 10000000.0 / avg_duration); |  2847       vp9_new_framerate(cpi, 10000000.0 / avg_duration); | 
|  3530     } |  2848     } | 
|  3531   } |  2849   } | 
|  3532   cpi->last_time_stamp_seen = cpi->source->ts_start; |  2850   cpi->last_time_stamp_seen = cpi->source->ts_start; | 
|  3533   cpi->last_end_time_stamp_seen = cpi->source->ts_end; |  2851   cpi->last_end_time_stamp_seen = cpi->source->ts_end; | 
|  3534 } |  2852 } | 
|  3535  |  2853  | 
|  3536 int vp9_get_compressed_data(VP9_PTR ptr, unsigned int *frame_flags, |  2854 int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags, | 
|  3537                             size_t *size, uint8_t *dest, |  2855                             size_t *size, uint8_t *dest, | 
|  3538                             int64_t *time_stamp, int64_t *time_end, int flush) { |  2856                             int64_t *time_stamp, int64_t *time_end, int flush) { | 
|  3539   VP9_COMP *cpi = (VP9_COMP *) ptr; |  2857   VP9_COMMON *const cm = &cpi->common; | 
|  3540   VP9_COMMON *cm = &cpi->common; |  2858   MACROBLOCKD *const xd = &cpi->mb.e_mbd; | 
|  3541   MACROBLOCKD *xd = &cpi->mb.e_mbd; |  2859   RATE_CONTROL *const rc = &cpi->rc; | 
|  3542   struct vpx_usec_timer  cmptimer; |  2860   struct vpx_usec_timer  cmptimer; | 
|  3543   YV12_BUFFER_CONFIG *force_src_buffer = NULL; |  2861   YV12_BUFFER_CONFIG *force_src_buffer = NULL; | 
|  3544   MV_REFERENCE_FRAME ref_frame; |  2862   MV_REFERENCE_FRAME ref_frame; | 
|  3545  |  2863  | 
|  3546   if (!cpi) |  2864   if (!cpi) | 
|  3547     return -1; |  2865     return -1; | 
|  3548  |  2866  | 
 |  2867   if (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2) { | 
 |  2868     vp9_restore_layer_context(cpi); | 
 |  2869   } | 
 |  2870  | 
|  3549   vpx_usec_timer_start(&cmptimer); |  2871   vpx_usec_timer_start(&cmptimer); | 
|  3550  |  2872  | 
|  3551   cpi->source = NULL; |  2873   cpi->source = NULL; | 
 |  2874   cpi->last_source = NULL; | 
|  3552  |  2875  | 
|  3553   set_high_precision_mv(cpi, ALTREF_HIGH_PRECISION_MV); |  2876   set_high_precision_mv(cpi, ALTREF_HIGH_PRECISION_MV); | 
|  3554  |  2877  | 
|  3555   // Normal defaults |  2878   // Normal defaults | 
|  3556   cm->reset_frame_context = 0; |  2879   cm->reset_frame_context = 0; | 
|  3557   cm->refresh_frame_context = 1; |  2880   cm->refresh_frame_context = 1; | 
|  3558   cpi->refresh_last_frame = 1; |  2881   cpi->refresh_last_frame = 1; | 
|  3559   cpi->refresh_golden_frame = 0; |  2882   cpi->refresh_golden_frame = 0; | 
|  3560   cpi->refresh_alt_ref_frame = 0; |  2883   cpi->refresh_alt_ref_frame = 0; | 
|  3561  |  2884  | 
|  3562   // Should we code an alternate reference frame. |  2885   // Should we code an alternate reference frame. | 
|  3563   if (cpi->oxcf.play_alternate && cpi->rc.source_alt_ref_pending) { |  2886   if (cpi->oxcf.play_alternate && rc->source_alt_ref_pending) { | 
|  3564     int frames_to_arf; |  2887     int frames_to_arf; | 
|  3565  |  2888  | 
|  3566 #if CONFIG_MULTIPLE_ARF |  2889 #if CONFIG_MULTIPLE_ARF | 
|  3567     assert(!cpi->multi_arf_enabled || |  2890     assert(!cpi->multi_arf_enabled || | 
|  3568            cpi->frame_coding_order[cpi->sequence_number] < 0); |  2891            cpi->frame_coding_order[cpi->sequence_number] < 0); | 
|  3569  |  2892  | 
|  3570     if (cpi->multi_arf_enabled && (cpi->pass == 2)) |  2893     if (cpi->multi_arf_enabled && (cpi->pass == 2)) | 
|  3571       frames_to_arf = (-cpi->frame_coding_order[cpi->sequence_number]) |  2894       frames_to_arf = (-cpi->frame_coding_order[cpi->sequence_number]) | 
|  3572           - cpi->next_frame_in_order; |  2895           - cpi->next_frame_in_order; | 
|  3573     else |  2896     else | 
|  3574 #endif |  2897 #endif | 
|  3575       frames_to_arf = cpi->rc.frames_till_gf_update_due; |  2898       frames_to_arf = rc->frames_till_gf_update_due; | 
|  3576  |  2899  | 
|  3577     assert(frames_to_arf <= cpi->rc.frames_to_key); |  2900     assert(frames_to_arf <= rc->frames_to_key); | 
|  3578  |  2901  | 
|  3579     if ((cpi->source = vp9_lookahead_peek(cpi->lookahead, frames_to_arf))) { |  2902     if ((cpi->source = vp9_lookahead_peek(cpi->lookahead, frames_to_arf))) { | 
|  3580 #if CONFIG_MULTIPLE_ARF |  2903 #if CONFIG_MULTIPLE_ARF | 
|  3581       cpi->alt_ref_source[cpi->arf_buffered] = cpi->source; |  2904       cpi->alt_ref_source[cpi->arf_buffered] = cpi->source; | 
|  3582 #else |  2905 #else | 
|  3583       cpi->alt_ref_source = cpi->source; |  2906       cpi->alt_ref_source = cpi->source; | 
|  3584 #endif |  2907 #endif | 
|  3585  |  2908  | 
|  3586       if (cpi->oxcf.arnr_max_frames > 0) { |  2909       if (cpi->oxcf.arnr_max_frames > 0) { | 
|  3587         // Produce the filtered ARF frame. |  2910         // Produce the filtered ARF frame. | 
|  3588         // TODO(agrange) merge these two functions. |  2911         // TODO(agrange) merge these two functions. | 
|  3589         vp9_configure_arnr_filter(cpi, frames_to_arf, cpi->rc.gfu_boost); |  2912         vp9_configure_arnr_filter(cpi, frames_to_arf, rc->gfu_boost); | 
|  3590         vp9_temporal_filter_prepare(cpi, frames_to_arf); |  2913         vp9_temporal_filter_prepare(cpi, frames_to_arf); | 
|  3591         vp9_extend_frame_borders(&cpi->alt_ref_buffer); |  2914         vp9_extend_frame_borders(&cpi->alt_ref_buffer); | 
|  3592         force_src_buffer = &cpi->alt_ref_buffer; |  2915         force_src_buffer = &cpi->alt_ref_buffer; | 
|  3593       } |  2916       } | 
|  3594  |  2917  | 
|  3595       cm->show_frame = 0; |  2918       cm->show_frame = 0; | 
|  3596       cpi->refresh_alt_ref_frame = 1; |  2919       cpi->refresh_alt_ref_frame = 1; | 
|  3597       cpi->refresh_golden_frame = 0; |  2920       cpi->refresh_golden_frame = 0; | 
|  3598       cpi->refresh_last_frame = 0; |  2921       cpi->refresh_last_frame = 0; | 
|  3599       cpi->rc.is_src_frame_alt_ref = 0; |  2922       rc->is_src_frame_alt_ref = 0; | 
|  3600  |  2923  | 
|  3601 #if CONFIG_MULTIPLE_ARF |  2924 #if CONFIG_MULTIPLE_ARF | 
|  3602       if (!cpi->multi_arf_enabled) |  2925       if (!cpi->multi_arf_enabled) | 
|  3603 #endif |  2926 #endif | 
|  3604         cpi->rc.source_alt_ref_pending = 0; |  2927         rc->source_alt_ref_pending = 0; | 
|  3605     } else { |  2928     } else { | 
|  3606       cpi->rc.source_alt_ref_pending = 0; |  2929       rc->source_alt_ref_pending = 0; | 
|  3607     } |  2930     } | 
|  3608   } |  2931   } | 
|  3609  |  2932  | 
|  3610   if (!cpi->source) { |  2933   if (!cpi->source) { | 
|  3611 #if CONFIG_MULTIPLE_ARF |  2934 #if CONFIG_MULTIPLE_ARF | 
|  3612     int i; |  2935     int i; | 
|  3613 #endif |  2936 #endif | 
 |  2937  | 
 |  2938     // Get last frame source. | 
 |  2939     if (cm->current_video_frame > 0) { | 
 |  2940       if ((cpi->last_source = vp9_lookahead_peek(cpi->lookahead, -1)) == NULL) | 
 |  2941         return -1; | 
 |  2942     } | 
 |  2943  | 
|  3614     if ((cpi->source = vp9_lookahead_pop(cpi->lookahead, flush))) { |  2944     if ((cpi->source = vp9_lookahead_pop(cpi->lookahead, flush))) { | 
|  3615       cm->show_frame = 1; |  2945       cm->show_frame = 1; | 
|  3616       cm->intra_only = 0; |  2946       cm->intra_only = 0; | 
|  3617  |  2947  | 
|  3618 #if CONFIG_MULTIPLE_ARF |  2948 #if CONFIG_MULTIPLE_ARF | 
|  3619       // Is this frame the ARF overlay. |  2949       // Is this frame the ARF overlay. | 
|  3620       cpi->rc.is_src_frame_alt_ref = 0; |  2950       rc->is_src_frame_alt_ref = 0; | 
|  3621       for (i = 0; i < cpi->arf_buffered; ++i) { |  2951       for (i = 0; i < cpi->arf_buffered; ++i) { | 
|  3622         if (cpi->source == cpi->alt_ref_source[i]) { |  2952         if (cpi->source == cpi->alt_ref_source[i]) { | 
|  3623           cpi->rc.is_src_frame_alt_ref = 1; |  2953           rc->is_src_frame_alt_ref = 1; | 
|  3624           cpi->refresh_golden_frame = 1; |  2954           cpi->refresh_golden_frame = 1; | 
|  3625           break; |  2955           break; | 
|  3626         } |  2956         } | 
|  3627       } |  2957       } | 
|  3628 #else |  2958 #else | 
|  3629       cpi->rc.is_src_frame_alt_ref = cpi->alt_ref_source |  2959       rc->is_src_frame_alt_ref = cpi->alt_ref_source && | 
|  3630           && (cpi->source == cpi->alt_ref_source); |  2960                                  (cpi->source == cpi->alt_ref_source); | 
|  3631 #endif |  2961 #endif | 
|  3632       if (cpi->rc.is_src_frame_alt_ref) { |  2962       if (rc->is_src_frame_alt_ref) { | 
|  3633         // Current frame is an ARF overlay frame. |  2963         // Current frame is an ARF overlay frame. | 
|  3634 #if CONFIG_MULTIPLE_ARF |  2964 #if CONFIG_MULTIPLE_ARF | 
|  3635         cpi->alt_ref_source[i] = NULL; |  2965         cpi->alt_ref_source[i] = NULL; | 
|  3636 #else |  2966 #else | 
|  3637         cpi->alt_ref_source = NULL; |  2967         cpi->alt_ref_source = NULL; | 
|  3638 #endif |  2968 #endif | 
|  3639         // Don't refresh the last buffer for an ARF overlay frame. It will |  2969         // Don't refresh the last buffer for an ARF overlay frame. It will | 
|  3640         // become the GF so preserve last as an alternative prediction option. |  2970         // become the GF so preserve last as an alternative prediction option. | 
|  3641         cpi->refresh_last_frame = 0; |  2971         cpi->refresh_last_frame = 0; | 
|  3642       } |  2972       } | 
|  3643 #if CONFIG_MULTIPLE_ARF |  2973 #if CONFIG_MULTIPLE_ARF | 
|  3644       ++cpi->next_frame_in_order; |  2974       ++cpi->next_frame_in_order; | 
|  3645 #endif |  2975 #endif | 
|  3646     } |  2976     } | 
|  3647   } |  2977   } | 
|  3648  |  2978  | 
|  3649   if (cpi->source) { |  2979   if (cpi->source) { | 
|  3650     cpi->un_scaled_source = cpi->Source = force_src_buffer ? force_src_buffer |  2980     cpi->un_scaled_source = cpi->Source = force_src_buffer ? force_src_buffer | 
|  3651                                                            : &cpi->source->img; |  2981                                                            : &cpi->source->img; | 
 |  2982  | 
 |  2983   if (cpi->last_source != NULL) { | 
 |  2984     cpi->unscaled_last_source = &cpi->last_source->img; | 
 |  2985   } else { | 
 |  2986     cpi->unscaled_last_source = NULL; | 
 |  2987   } | 
 |  2988  | 
|  3652     *time_stamp = cpi->source->ts_start; |  2989     *time_stamp = cpi->source->ts_start; | 
|  3653     *time_end = cpi->source->ts_end; |  2990     *time_end = cpi->source->ts_end; | 
|  3654     *frame_flags = cpi->source->flags; |  2991     *frame_flags = cpi->source->flags; | 
|  3655  |  2992  | 
|  3656 #if CONFIG_MULTIPLE_ARF |  2993 #if CONFIG_MULTIPLE_ARF | 
|  3657     if ((cm->frame_type != KEY_FRAME) && (cpi->pass == 2)) |  2994     if (cm->frame_type != KEY_FRAME && cpi->pass == 2) | 
|  3658       cpi->rc.source_alt_ref_pending = is_next_frame_arf(cpi); |  2995       rc->source_alt_ref_pending = is_next_frame_arf(cpi); | 
|  3659 #endif |  2996 #endif | 
|  3660   } else { |  2997   } else { | 
|  3661     *size = 0; |  2998     *size = 0; | 
|  3662     if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done) { |  2999     if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done) { | 
|  3663       vp9_end_first_pass(cpi);    /* get last stats packet */ |  3000       vp9_end_first_pass(cpi);    /* get last stats packet */ | 
|  3664       cpi->twopass.first_pass_done = 1; |  3001       cpi->twopass.first_pass_done = 1; | 
|  3665     } |  3002     } | 
|  3666     return -1; |  3003     return -1; | 
|  3667   } |  3004   } | 
|  3668  |  3005  | 
|  3669   if (cpi->source->ts_start < cpi->first_time_stamp_ever) { |  3006   if (cpi->source->ts_start < cpi->first_time_stamp_ever) { | 
|  3670     cpi->first_time_stamp_ever = cpi->source->ts_start; |  3007     cpi->first_time_stamp_ever = cpi->source->ts_start; | 
|  3671     cpi->last_end_time_stamp_seen = cpi->source->ts_start; |  3008     cpi->last_end_time_stamp_seen = cpi->source->ts_start; | 
|  3672   } |  3009   } | 
|  3673  |  3010  | 
|  3674   // adjust frame rates based on timestamps given |  3011   // adjust frame rates based on timestamps given | 
|  3675   if (cm->show_frame) { |  3012   if (cm->show_frame) { | 
|  3676     adjust_frame_rate(cpi); |  3013     adjust_frame_rate(cpi); | 
|  3677   } |  3014   } | 
|  3678  |  3015  | 
|  3679   if (cpi->svc.number_temporal_layers > 1 && |  3016   if (cpi->svc.number_temporal_layers > 1 && | 
|  3680       cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) { |  3017       cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) { | 
|  3681     update_layer_framerate(cpi); |  3018     vp9_update_temporal_layer_framerate(cpi); | 
|  3682     restore_layer_context(cpi); |  3019     vp9_restore_layer_context(cpi); | 
|  3683   } |  3020   } | 
|  3684  |  3021  | 
|  3685   // start with a 0 size frame |  3022   // start with a 0 size frame | 
|  3686   *size = 0; |  3023   *size = 0; | 
|  3687  |  3024  | 
|  3688   // Clear down mmx registers |  3025   // Clear down mmx registers | 
|  3689   vp9_clear_system_state(); |  3026   vp9_clear_system_state(); | 
|  3690  |  3027  | 
|  3691   /* find a free buffer for the new frame, releasing the reference previously |  3028   /* find a free buffer for the new frame, releasing the reference previously | 
|  3692    * held. |  3029    * held. | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
|  3721     ref_buf->idx = idx; |  3058     ref_buf->idx = idx; | 
|  3722     vp9_setup_scale_factors_for_frame(&ref_buf->sf, |  3059     vp9_setup_scale_factors_for_frame(&ref_buf->sf, | 
|  3723                                       buf->y_crop_width, buf->y_crop_height, |  3060                                       buf->y_crop_width, buf->y_crop_height, | 
|  3724                                       cm->width, cm->height); |  3061                                       cm->width, cm->height); | 
|  3725  |  3062  | 
|  3726     if (vp9_is_scaled(&ref_buf->sf)) |  3063     if (vp9_is_scaled(&ref_buf->sf)) | 
|  3727       vp9_extend_frame_borders(buf); |  3064       vp9_extend_frame_borders(buf); | 
|  3728   } |  3065   } | 
|  3729  |  3066  | 
|  3730   set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME); |  3067   set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME); | 
|  3731   xd->interp_kernel = vp9_get_interp_kernel( |  | 
|  3732       DEFAULT_INTERP_FILTER == SWITCHABLE ? EIGHTTAP : DEFAULT_INTERP_FILTER); |  | 
|  3733  |  3068  | 
|  3734   if (cpi->oxcf.aq_mode == VARIANCE_AQ) { |  3069   if (cpi->oxcf.aq_mode == VARIANCE_AQ) { | 
|  3735     vp9_vaq_init(); |  3070     vp9_vaq_init(); | 
|  3736   } |  3071   } | 
|  3737  |  3072  | 
|  3738   if (cpi->use_svc) { |  3073   if (cpi->pass == 1 && | 
 |  3074       (!cpi->use_svc || cpi->svc.number_temporal_layers == 1)) { | 
 |  3075     Pass1Encode(cpi, size, dest, frame_flags); | 
 |  3076   } else if (cpi->pass == 2 && | 
 |  3077       (!cpi->use_svc || cpi->svc.number_temporal_layers == 1)) { | 
 |  3078     Pass2Encode(cpi, size, dest, frame_flags); | 
 |  3079   } else if (cpi->use_svc) { | 
|  3739     SvcEncode(cpi, size, dest, frame_flags); |  3080     SvcEncode(cpi, size, dest, frame_flags); | 
|  3740   } else if (cpi->pass == 1) { |  | 
|  3741     Pass1Encode(cpi, size, dest, frame_flags); |  | 
|  3742   } else if (cpi->pass == 2) { |  | 
|  3743     Pass2Encode(cpi, size, dest, frame_flags); |  | 
|  3744   } else { |  3081   } else { | 
|  3745     // One pass encode |  3082     // One pass encode | 
|  3746     Pass0Encode(cpi, size, dest, frame_flags); |  3083     Pass0Encode(cpi, size, dest, frame_flags); | 
|  3747   } |  3084   } | 
|  3748  |  3085  | 
|  3749   if (cm->refresh_frame_context) |  3086   if (cm->refresh_frame_context) | 
|  3750     cm->frame_contexts[cm->frame_context_idx] = cm->fc; |  3087     cm->frame_contexts[cm->frame_context_idx] = cm->fc; | 
|  3751  |  3088  | 
|  3752   // Frame was dropped, release scaled references. |  3089   // Frame was dropped, release scaled references. | 
|  3753   if (*size == 0) { |  3090   if (*size == 0) { | 
|  3754     release_scaled_references(cpi); |  3091     release_scaled_references(cpi); | 
|  3755   } |  3092   } | 
|  3756  |  3093  | 
|  3757   if (*size > 0) { |  3094   if (*size > 0) { | 
|  3758     cpi->droppable = !frame_is_reference(cpi); |  3095     cpi->droppable = !frame_is_reference(cpi); | 
|  3759   } |  3096   } | 
|  3760  |  3097  | 
|  3761   // Save layer specific state. |  3098   // Save layer specific state. | 
|  3762   if (cpi->svc.number_temporal_layers > 1 && |  3099   if ((cpi->svc.number_temporal_layers > 1 && | 
|  3763       cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) { |  3100       cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) || | 
|  3764     save_layer_context(cpi); |  3101       (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2)) { | 
 |  3102     vp9_save_layer_context(cpi); | 
|  3765   } |  3103   } | 
|  3766  |  3104  | 
|  3767   vpx_usec_timer_mark(&cmptimer); |  3105   vpx_usec_timer_mark(&cmptimer); | 
|  3768   cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer); |  3106   cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer); | 
|  3769  |  3107  | 
|  3770   if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame) |  3108   if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame) | 
|  3771     generate_psnr_packet(cpi); |  3109     generate_psnr_packet(cpi); | 
|  3772  |  3110  | 
|  3773 #if CONFIG_INTERNAL_STATS |  3111 #if CONFIG_INTERNAL_STATS | 
|  3774  |  3112  | 
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3839         cpi->total_ssimg_v += v; |  3177         cpi->total_ssimg_v += v; | 
|  3840         cpi->total_ssimg_all += frame_all; |  3178         cpi->total_ssimg_all += frame_all; | 
|  3841       } |  3179       } | 
|  3842     } |  3180     } | 
|  3843   } |  3181   } | 
|  3844  |  3182  | 
|  3845 #endif |  3183 #endif | 
|  3846   return 0; |  3184   return 0; | 
|  3847 } |  3185 } | 
|  3848  |  3186  | 
|  3849 int vp9_get_preview_raw_frame(VP9_PTR comp, YV12_BUFFER_CONFIG *dest, |  3187 int vp9_get_preview_raw_frame(VP9_COMP *cpi, YV12_BUFFER_CONFIG *dest, | 
|  3850                               vp9_ppflags_t *flags) { |  3188                               vp9_ppflags_t *flags) { | 
|  3851   VP9_COMP *cpi = (VP9_COMP *)comp; |  | 
|  3852   VP9_COMMON *cm = &cpi->common; |  3189   VP9_COMMON *cm = &cpi->common; | 
|  3853  |  3190  | 
|  3854   if (!cm->show_frame) { |  3191   if (!cm->show_frame) { | 
|  3855     return -1; |  3192     return -1; | 
|  3856   } else { |  3193   } else { | 
|  3857     int ret; |  3194     int ret; | 
|  3858 #if CONFIG_VP9_POSTPROC |  3195 #if CONFIG_VP9_POSTPROC | 
|  3859     ret = vp9_post_proc_frame(cm, dest, flags); |  3196     ret = vp9_post_proc_frame(cm, dest, flags); | 
|  3860 #else |  3197 #else | 
|  3861  |  3198  | 
|  3862     if (cm->frame_to_show) { |  3199     if (cm->frame_to_show) { | 
|  3863       *dest = *cm->frame_to_show; |  3200       *dest = *cm->frame_to_show; | 
|  3864       dest->y_width = cm->width; |  3201       dest->y_width = cm->width; | 
|  3865       dest->y_height = cm->height; |  3202       dest->y_height = cm->height; | 
|  3866       dest->uv_width = cm->width >> cm->subsampling_x; |  3203       dest->uv_width = cm->width >> cm->subsampling_x; | 
|  3867       dest->uv_height = cm->height >> cm->subsampling_y; |  3204       dest->uv_height = cm->height >> cm->subsampling_y; | 
|  3868       ret = 0; |  3205       ret = 0; | 
|  3869     } else { |  3206     } else { | 
|  3870       ret = -1; |  3207       ret = -1; | 
|  3871     } |  3208     } | 
|  3872  |  3209  | 
|  3873 #endif  // !CONFIG_VP9_POSTPROC |  3210 #endif  // !CONFIG_VP9_POSTPROC | 
|  3874     vp9_clear_system_state(); |  3211     vp9_clear_system_state(); | 
|  3875     return ret; |  3212     return ret; | 
|  3876   } |  3213   } | 
|  3877 } |  3214 } | 
|  3878  |  3215  | 
|  3879 int vp9_set_roimap(VP9_PTR comp, unsigned char *map, unsigned int rows, |  3216 int vp9_set_roimap(VP9_COMP *cpi, unsigned char *map, unsigned int rows, | 
|  3880                    unsigned int cols, int delta_q[MAX_SEGMENTS], |  3217                    unsigned int cols, int delta_q[MAX_SEGMENTS], | 
|  3881                    int delta_lf[MAX_SEGMENTS], |  3218                    int delta_lf[MAX_SEGMENTS], | 
|  3882                    unsigned int threshold[MAX_SEGMENTS]) { |  3219                    unsigned int threshold[MAX_SEGMENTS]) { | 
|  3883   VP9_COMP *cpi = (VP9_COMP *) comp; |  | 
|  3884   signed char feature_data[SEG_LVL_MAX][MAX_SEGMENTS]; |  3220   signed char feature_data[SEG_LVL_MAX][MAX_SEGMENTS]; | 
|  3885   struct segmentation *seg = &cpi->common.seg; |  3221   struct segmentation *seg = &cpi->common.seg; | 
|  3886   int i; |  3222   int i; | 
|  3887  |  3223  | 
|  3888   if (cpi->common.mb_rows != rows || cpi->common.mb_cols != cols) |  3224   if (cpi->common.mb_rows != rows || cpi->common.mb_cols != cols) | 
|  3889     return -1; |  3225     return -1; | 
|  3890  |  3226  | 
|  3891   if (!map) { |  3227   if (!map) { | 
|  3892     vp9_disable_segmentation(seg); |  3228     vp9_disable_segmentation(seg); | 
|  3893     return 0; |  3229     return 0; | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
|  3919       vp9_disable_segfeature(seg, i, SEG_LVL_ALT_LF); |  3255       vp9_disable_segfeature(seg, i, SEG_LVL_ALT_LF); | 
|  3920   } |  3256   } | 
|  3921  |  3257  | 
|  3922   // Initialize the feature data structure |  3258   // Initialize the feature data structure | 
|  3923   // SEGMENT_DELTADATA    0, SEGMENT_ABSDATA      1 |  3259   // SEGMENT_DELTADATA    0, SEGMENT_ABSDATA      1 | 
|  3924   vp9_set_segment_data(seg, &feature_data[0][0], SEGMENT_DELTADATA); |  3260   vp9_set_segment_data(seg, &feature_data[0][0], SEGMENT_DELTADATA); | 
|  3925  |  3261  | 
|  3926   return 0; |  3262   return 0; | 
|  3927 } |  3263 } | 
|  3928  |  3264  | 
|  3929 int vp9_set_active_map(VP9_PTR comp, unsigned char *map, |  3265 int vp9_set_active_map(VP9_COMP *cpi, unsigned char *map, | 
|  3930                        unsigned int rows, unsigned int cols) { |  3266                        unsigned int rows, unsigned int cols) { | 
|  3931   VP9_COMP *cpi = (VP9_COMP *) comp; |  | 
|  3932  |  | 
|  3933   if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols) { |  3267   if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols) { | 
|  3934     if (map) { |  3268     if (map) { | 
|  3935       vpx_memcpy(cpi->active_map, map, rows * cols); |  3269       vpx_memcpy(cpi->active_map, map, rows * cols); | 
|  3936       cpi->active_map_enabled = 1; |  3270       cpi->active_map_enabled = 1; | 
|  3937     } else { |  3271     } else { | 
|  3938       cpi->active_map_enabled = 0; |  3272       cpi->active_map_enabled = 0; | 
|  3939     } |  3273     } | 
|  3940  |  3274  | 
|  3941     return 0; |  3275     return 0; | 
|  3942   } else { |  3276   } else { | 
|  3943     // cpi->active_map_enabled = 0; |  3277     // cpi->active_map_enabled = 0; | 
|  3944     return -1; |  3278     return -1; | 
|  3945   } |  3279   } | 
|  3946 } |  3280 } | 
|  3947  |  3281  | 
|  3948 int vp9_set_internal_size(VP9_PTR comp, |  3282 int vp9_set_internal_size(VP9_COMP *cpi, | 
|  3949                           VPX_SCALING horiz_mode, VPX_SCALING vert_mode) { |  3283                           VPX_SCALING horiz_mode, VPX_SCALING vert_mode) { | 
|  3950   VP9_COMP *cpi = (VP9_COMP *) comp; |  | 
|  3951   VP9_COMMON *cm = &cpi->common; |  3284   VP9_COMMON *cm = &cpi->common; | 
|  3952   int hr = 0, hs = 0, vr = 0, vs = 0; |  3285   int hr = 0, hs = 0, vr = 0, vs = 0; | 
|  3953  |  3286  | 
|  3954   if (horiz_mode > ONETWO || vert_mode > ONETWO) |  3287   if (horiz_mode > ONETWO || vert_mode > ONETWO) | 
|  3955     return -1; |  3288     return -1; | 
|  3956  |  3289  | 
|  3957   Scale2Ratio(horiz_mode, &hr, &hs); |  3290   Scale2Ratio(horiz_mode, &hr, &hs); | 
|  3958   Scale2Ratio(vert_mode, &vr, &vs); |  3291   Scale2Ratio(vert_mode, &vr, &vs); | 
|  3959  |  3292  | 
|  3960   // always go to the next whole number |  3293   // always go to the next whole number | 
|  3961   cm->width = (hs - 1 + cpi->oxcf.width * hr) / hs; |  3294   cm->width = (hs - 1 + cpi->oxcf.width * hr) / hs; | 
|  3962   cm->height = (vs - 1 + cpi->oxcf.height * vr) / vs; |  3295   cm->height = (vs - 1 + cpi->oxcf.height * vr) / vs; | 
|  3963  |  3296  | 
|  3964   assert(cm->width <= cpi->initial_width); |  3297   assert(cm->width <= cpi->initial_width); | 
|  3965   assert(cm->height <= cpi->initial_height); |  3298   assert(cm->height <= cpi->initial_height); | 
|  3966   update_frame_size(cpi); |  3299   update_frame_size(cpi); | 
|  3967   return 0; |  3300   return 0; | 
|  3968 } |  3301 } | 
|  3969  |  3302  | 
|  3970 int vp9_set_size_literal(VP9_PTR comp, unsigned int width, |  3303 int vp9_set_size_literal(VP9_COMP *cpi, unsigned int width, | 
|  3971                          unsigned int height) { |  3304                          unsigned int height) { | 
|  3972   VP9_COMP *cpi = (VP9_COMP *)comp; |  | 
|  3973   VP9_COMMON *cm = &cpi->common; |  3305   VP9_COMMON *cm = &cpi->common; | 
|  3974  |  3306  | 
|  3975   check_initial_width(cpi, 1, 1); |  3307   check_initial_width(cpi, 1, 1); | 
|  3976  |  3308  | 
|  3977   if (width) { |  3309   if (width) { | 
|  3978     cm->width = width; |  3310     cm->width = width; | 
|  3979     if (cm->width * 5 < cpi->initial_width) { |  3311     if (cm->width * 5 < cpi->initial_width) { | 
|  3980       cm->width = cpi->initial_width / 5 + 1; |  3312       cm->width = cpi->initial_width / 5 + 1; | 
|  3981       printf("Warning: Desired width too small, changed to %d\n", cm->width); |  3313       printf("Warning: Desired width too small, changed to %d\n", cm->width); | 
|  3982     } |  3314     } | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
|  3997       printf("Warning: Desired height too large, changed to %d\n", cm->height); |  3329       printf("Warning: Desired height too large, changed to %d\n", cm->height); | 
|  3998     } |  3330     } | 
|  3999   } |  3331   } | 
|  4000  |  3332  | 
|  4001   assert(cm->width <= cpi->initial_width); |  3333   assert(cm->width <= cpi->initial_width); | 
|  4002   assert(cm->height <= cpi->initial_height); |  3334   assert(cm->height <= cpi->initial_height); | 
|  4003   update_frame_size(cpi); |  3335   update_frame_size(cpi); | 
|  4004   return 0; |  3336   return 0; | 
|  4005 } |  3337 } | 
|  4006  |  3338  | 
|  4007 void vp9_set_svc(VP9_PTR comp, int use_svc) { |  3339 void vp9_set_svc(VP9_COMP *cpi, int use_svc) { | 
|  4008   VP9_COMP *cpi = (VP9_COMP *)comp; |  | 
|  4009   cpi->use_svc = use_svc; |  3340   cpi->use_svc = use_svc; | 
|  4010   return; |  3341   return; | 
|  4011 } |  3342 } | 
|  4012  |  3343  | 
|  4013 int vp9_calc_ss_err(const YV12_BUFFER_CONFIG *source, |  3344 int vp9_get_y_sse(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b) { | 
|  4014                     const YV12_BUFFER_CONFIG *reference) { |  3345   assert(a->y_crop_width == b->y_crop_width); | 
|  4015   int i, j; |  3346   assert(a->y_crop_height == b->y_crop_height); | 
|  4016   int total = 0; |  | 
|  4017  |  3347  | 
|  4018   const uint8_t *src = source->y_buffer; |  3348   return (int)get_sse(a->y_buffer, a->y_stride, b->y_buffer, b->y_stride, | 
|  4019   const uint8_t *ref = reference->y_buffer; |  3349                       a->y_crop_width, a->y_crop_height); | 
|  4020  |  | 
|  4021   // Loop through the Y plane raw and reconstruction data summing |  | 
|  4022   // (square differences) |  | 
|  4023   for (i = 0; i < source->y_height; i += 16) { |  | 
|  4024     for (j = 0; j < source->y_width; j += 16) { |  | 
|  4025       unsigned int sse; |  | 
|  4026       total += vp9_mse16x16(src + j, source->y_stride, |  | 
|  4027                             ref + j, reference->y_stride, &sse); |  | 
|  4028     } |  | 
|  4029  |  | 
|  4030     src += 16 * source->y_stride; |  | 
|  4031     ref += 16 * reference->y_stride; |  | 
|  4032   } |  | 
|  4033  |  | 
|  4034   return total; |  | 
|  4035 } |  3350 } | 
|  4036  |  3351  | 
|  4037  |  3352  | 
|  4038 int vp9_get_quantizer(VP9_PTR c) { |  3353 int vp9_get_quantizer(VP9_COMP *cpi) { | 
|  4039   return ((VP9_COMP *)c)->common.base_qindex; |  3354   return cpi->common.base_qindex; | 
|  4040 } |  3355 } | 
| OLD | NEW |