1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* 21184aebb761cbeac9124c37189a80a1a58f04b6bhkuang * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * 4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Use of this source code is governed by a BSD-style license 5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * that can be found in the LICENSE file in the root of the source 6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * tree. An additional intellectual property rights grant can be found 7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * in the file PATENTS. All contributing project authors may 8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * be found in the AUTHORS file in the root of the source tree. 9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <math.h> 125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stdio.h> 135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <limits.h> 145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "./vpx_config.h" 165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "./vpx_scale_rtcd.h" 17b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vpx/internal/vpx_psnr.h" 18b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vpx_ports/vpx_timer.h" 19ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/common/vp9_alloccommon.h" 21ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_filter.h" 225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/common/vp9_idct.h" 235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if CONFIG_VP9_POSTPROC 245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/common/vp9_postproc.h" 255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif 26ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_reconinter.h" 27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_systemdependent.h" 285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/common/vp9_tile_common.h" 29b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 306ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#include "vp9/encoder/vp9_aq_complexity.h" 316ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#include "vp9/encoder/vp9_aq_cyclicrefresh.h" 326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#include "vp9/encoder/vp9_aq_variance.h" 33b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/encoder/vp9_bitstream.h" 34a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian#include "vp9/encoder/vp9_encodeframe.h" 35b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/encoder/vp9_encodemv.h" 36ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/encoder/vp9_firstpass.h" 375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/encoder/vp9_mbgraph.h" 385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/encoder/vp9_onyx_int.h" 395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/encoder/vp9_picklpf.h" 40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/encoder/vp9_ratectrl.h" 41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/encoder/vp9_rdopt.h" 425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/encoder/vp9_segmentation.h" 436ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#include "vp9/encoder/vp9_speed_features.h" 446ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#if CONFIG_INTERNAL_STATS 456ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#include "vp9/encoder/vp9_ssim.h" 466ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#endif 47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/encoder/vp9_temporal_filter.h" 48b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/encoder/vp9_resize.h" 49a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian#include "vp9/encoder/vp9_svc_layercontext.h" 50a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian 51b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_coef_tree_initialize(); 52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define DEFAULT_INTERP_FILTER SWITCHABLE 54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define SHARP_FILTER_QTHRESH 0 /* Q threshold for 8-tap sharp filter */ 56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define ALTREF_HIGH_PRECISION_MV 1 // Whether to use high precision mv 585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // for altref computation. 595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define HIGH_PRECISION_MV_QTHRESH 200 // Q threshold for high precision 605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // mv. Choose a very high value for 615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // now so that HIGH_PRECISION is always 625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // chosen. 63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 64b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// Max rate target for 1080P and below encodes under normal circumstances 65b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// (1920 * 1080 / (16 * 16)) * MAX_MB_RATE bits per MB 66b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define MAX_MB_RATE 250 67b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define MAXRATE_1080P 2025000 68b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 69ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// #define OUTPUT_YUV_REC 70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 71ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef OUTPUT_YUV_SRC 72ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangFILE *yuv_file; 73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 74ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef OUTPUT_YUV_REC 75ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangFILE *yuv_rec_file; 76ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 77ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 78ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if 0 79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangFILE *framepsnr; 80ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangFILE *kf_list; 81ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangFILE *keyfile; 82ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 83ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 84b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_init_quantizer(VP9_COMP *cpi); 85ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 86b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic INLINE void Scale2Ratio(VPX_SCALING mode, int *hr, int *hs) { 8791037db265ecdd914a26e056cf69207b4f50924ehkuang switch (mode) { 8891037db265ecdd914a26e056cf69207b4f50924ehkuang case NORMAL: 8991037db265ecdd914a26e056cf69207b4f50924ehkuang *hr = 1; 9091037db265ecdd914a26e056cf69207b4f50924ehkuang *hs = 1; 9191037db265ecdd914a26e056cf69207b4f50924ehkuang break; 9291037db265ecdd914a26e056cf69207b4f50924ehkuang case FOURFIVE: 9391037db265ecdd914a26e056cf69207b4f50924ehkuang *hr = 4; 9491037db265ecdd914a26e056cf69207b4f50924ehkuang *hs = 5; 9591037db265ecdd914a26e056cf69207b4f50924ehkuang break; 9691037db265ecdd914a26e056cf69207b4f50924ehkuang case THREEFIVE: 9791037db265ecdd914a26e056cf69207b4f50924ehkuang *hr = 3; 9891037db265ecdd914a26e056cf69207b4f50924ehkuang *hs = 5; 9991037db265ecdd914a26e056cf69207b4f50924ehkuang break; 10091037db265ecdd914a26e056cf69207b4f50924ehkuang case ONETWO: 10191037db265ecdd914a26e056cf69207b4f50924ehkuang *hr = 1; 10291037db265ecdd914a26e056cf69207b4f50924ehkuang *hs = 2; 10391037db265ecdd914a26e056cf69207b4f50924ehkuang break; 10491037db265ecdd914a26e056cf69207b4f50924ehkuang default: 10591037db265ecdd914a26e056cf69207b4f50924ehkuang *hr = 1; 10691037db265ecdd914a26e056cf69207b4f50924ehkuang *hs = 1; 10791037db265ecdd914a26e056cf69207b4f50924ehkuang assert(0); 10891037db265ecdd914a26e056cf69207b4f50924ehkuang break; 10991037db265ecdd914a26e056cf69207b4f50924ehkuang } 11091037db265ecdd914a26e056cf69207b4f50924ehkuang} 11191037db265ecdd914a26e056cf69207b4f50924ehkuang 112b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void set_high_precision_mv(VP9_COMP *cpi, int allow_high_precision_mv) { 1135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang MACROBLOCK *const mb = &cpi->mb; 114b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->common.allow_high_precision_mv = allow_high_precision_mv; 1155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (cpi->common.allow_high_precision_mv) { 116ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mb->mvcost = mb->nmvcost_hp; 117ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mb->mvsadcost = mb->nmvsadcost_hp; 118ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 119ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mb->mvcost = mb->nmvcost; 120ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mb->mvsadcost = mb->nmvsadcost; 121ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 122ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 123ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1246ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic void setup_key_frame(VP9_COMP *cpi) { 1256ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_setup_past_independence(&cpi->common); 1266ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 1276ac915abcdb404a00d927fe6308a47fcf09d9519hkuang // All buffers are implicitly updated on key frames. 1286ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->refresh_golden_frame = 1; 1296ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->refresh_alt_ref_frame = 1; 1306ac915abcdb404a00d927fe6308a47fcf09d9519hkuang} 1316ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 1326ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic void setup_inter_frame(VP9_COMMON *cm) { 1336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (cm->error_resilient_mode || cm->intra_only) 1346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_setup_past_independence(cm); 1356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 1366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang assert(cm->frame_context_idx < FRAME_CONTEXTS); 1376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->fc = cm->frame_contexts[cm->frame_context_idx]; 1386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang} 1396ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 140ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_initialize_enc() { 141ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang static int init_done = 0; 142ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!init_done) { 1446ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_init_neighbors(); 1456ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_init_quant_tables(); 1466ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 147b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_coef_tree_initialize(); 148ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_tokenize_initialize(); 149ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_init_me_luts(); 150b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_rc_init_minq_luts(); 151b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_entropy_mv_init(); 152b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_entropy_mode_init(); 153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang init_done = 1; 154ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 156ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 157ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void dealloc_compressor_data(VP9_COMP *cpi) { 158b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_COMMON *const cm = &cpi->common; 1596ac915abcdb404a00d927fe6308a47fcf09d9519hkuang int i; 160b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 161ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Delete sementation map 162ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_free(cpi->segmentation_map); 163b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->segmentation_map = NULL; 164b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_free(cm->last_frame_seg_map); 165b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->last_frame_seg_map = NULL; 166ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_free(cpi->coding_context.last_frame_seg_map_copy); 167b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->coding_context.last_frame_seg_map_copy = NULL; 168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 169b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_free(cpi->complexity_map); 1706ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->complexity_map = NULL; 1716ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 1726ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_cyclic_refresh_free(cpi->cyclic_refresh); 1736ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->cyclic_refresh = NULL; 1746ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 175ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_free(cpi->active_map); 1766ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->active_map = NULL; 177ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 178b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_free_frame_buffers(cm); 179ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 180ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_free_frame_buffer(&cpi->last_frame_uf); 181ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_free_frame_buffer(&cpi->scaled_source); 1826ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_free_frame_buffer(&cpi->scaled_last_source); 183ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_free_frame_buffer(&cpi->alt_ref_buffer); 184ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_lookahead_destroy(cpi->lookahead); 185ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 186ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_free(cpi->tok); 187ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->tok = 0; 188ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 189ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Activity mask based per mb zbin adjustments 190ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_free(cpi->mb_activity_map); 191ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->mb_activity_map = 0; 192ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_free(cpi->mb_norm_activity_map); 193ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->mb_norm_activity_map = 0; 194ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1956ac915abcdb404a00d927fe6308a47fcf09d9519hkuang for (i = 0; i < cpi->svc.number_spatial_layers; ++i) { 1966ac915abcdb404a00d927fe6308a47fcf09d9519hkuang LAYER_CONTEXT *const lc = &cpi->svc.layer_context[i]; 1976ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vpx_free(lc->rc_twopass_stats_in.buf); 1986ac915abcdb404a00d927fe6308a47fcf09d9519hkuang lc->rc_twopass_stats_in.buf = NULL; 1996ac915abcdb404a00d927fe6308a47fcf09d9519hkuang lc->rc_twopass_stats_in.sz = 0; 200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 201ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 202ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2036ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic void save_coding_context(VP9_COMP *cpi) { 2046ac915abcdb404a00d927fe6308a47fcf09d9519hkuang CODING_CONTEXT *const cc = &cpi->coding_context; 2056ac915abcdb404a00d927fe6308a47fcf09d9519hkuang VP9_COMMON *cm = &cpi->common; 206b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2076ac915abcdb404a00d927fe6308a47fcf09d9519hkuang // Stores a snapshot of key state variables which can subsequently be 2086ac915abcdb404a00d927fe6308a47fcf09d9519hkuang // restored with a call to vp9_restore_coding_context. These functions are 2096ac915abcdb404a00d927fe6308a47fcf09d9519hkuang // intended for use in a re-code loop in vp9_compress_frame where the 2106ac915abcdb404a00d927fe6308a47fcf09d9519hkuang // quantizer value is adjusted between loop iterations. 2116ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_copy(cc->nmvjointcost, cpi->mb.nmvjointcost); 2126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_copy(cc->nmvcosts, cpi->mb.nmvcosts); 2136ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_copy(cc->nmvcosts_hp, cpi->mb.nmvcosts_hp); 214b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2156ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_copy(cc->segment_pred_probs, cm->seg.pred_probs); 216b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2176ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vpx_memcpy(cpi->coding_context.last_frame_seg_map_copy, 2186ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->last_frame_seg_map, (cm->mi_rows * cm->mi_cols)); 219b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2206ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_copy(cc->last_ref_lf_deltas, cm->lf.last_ref_deltas); 2216ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_copy(cc->last_mode_lf_deltas, cm->lf.last_mode_deltas); 222b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2236ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cc->fc = cm->fc; 2246ac915abcdb404a00d927fe6308a47fcf09d9519hkuang} 225b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2266ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic void restore_coding_context(VP9_COMP *cpi) { 2276ac915abcdb404a00d927fe6308a47fcf09d9519hkuang CODING_CONTEXT *const cc = &cpi->coding_context; 2286ac915abcdb404a00d927fe6308a47fcf09d9519hkuang VP9_COMMON *cm = &cpi->common; 229b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2306ac915abcdb404a00d927fe6308a47fcf09d9519hkuang // Restore key state variables to the snapshot state stored in the 2316ac915abcdb404a00d927fe6308a47fcf09d9519hkuang // previous call to vp9_save_coding_context. 2326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_copy(cpi->mb.nmvjointcost, cc->nmvjointcost); 2336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_copy(cpi->mb.nmvcosts, cc->nmvcosts); 2346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_copy(cpi->mb.nmvcosts_hp, cc->nmvcosts_hp); 235b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_copy(cm->seg.pred_probs, cc->segment_pred_probs); 237b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vpx_memcpy(cm->last_frame_seg_map, 2396ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->coding_context.last_frame_seg_map_copy, 2406ac915abcdb404a00d927fe6308a47fcf09d9519hkuang (cm->mi_rows * cm->mi_cols)); 241b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2426ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_copy(cm->lf.last_ref_deltas, cc->last_ref_lf_deltas); 2436ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_copy(cm->lf.last_mode_deltas, cc->last_mode_lf_deltas); 244b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2456ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->fc = cc->fc; 246b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 2476ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 248ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void configure_static_seg_features(VP9_COMP *cpi) { 249b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_COMMON *const cm = &cpi->common; 250a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian const RATE_CONTROL *const rc = &cpi->rc; 251b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct segmentation *const seg = &cm->seg; 252ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 253a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian int high_q = (int)(rc->avg_q > 48.0); 254ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int qi_delta; 255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 256ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Disable and clear down for KF 257ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->frame_type == KEY_FRAME) { 258ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Clear down the global segmentation map 259ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols); 260f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang seg->update_map = 0; 261f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang seg->update_data = 0; 262ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->static_mb_pct = 0; 263ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 264ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Disable segmentation 265b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_disable_segmentation(seg); 266ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 267ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Clear down the segment features. 268f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_clearall_segfeatures(seg); 269ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else if (cpi->refresh_alt_ref_frame) { 270ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // If this is an alt ref frame 271ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Clear down the global segmentation map 272ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols); 273f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang seg->update_map = 0; 274f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang seg->update_data = 0; 275ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->static_mb_pct = 0; 276ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 277ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Disable segmentation and individual segment features by default 278b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_disable_segmentation(seg); 279f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_clearall_segfeatures(seg); 280ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 281ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Scan frames from current to arf frame. 282ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // This function re-enables segmentation if appropriate. 283ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_update_mbgraph_stats(cpi); 284ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 285ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // If segmentation was enabled set those features needed for the 286ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // arf itself. 287f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang if (seg->enabled) { 288f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang seg->update_map = 1; 289f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang seg->update_data = 1; 290ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2916ac915abcdb404a00d927fe6308a47fcf09d9519hkuang qi_delta = vp9_compute_qdelta(rc, rc->avg_q, rc->avg_q * 0.875); 292a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta - 2); 293f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2); 294ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 295f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q); 296f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF); 297ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 298ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Where relevant assume segment data is delta data 299f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang seg->abs_delta = SEGMENT_DELTADATA; 300ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 301f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang } else if (seg->enabled) { 302ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // All other frames if segmentation has been enabled 303ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 304ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // First normal frame in a valid gf or alt ref group 305a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian if (rc->frames_since_golden == 0) { 306ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Set up segment features for normal frames in an arf group 307a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian if (rc->source_alt_ref_active) { 308f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang seg->update_map = 0; 309f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang seg->update_data = 1; 310f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang seg->abs_delta = SEGMENT_DELTADATA; 311ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang qi_delta = vp9_compute_qdelta(rc, rc->avg_q, rc->avg_q * 1.125); 313a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta + 2); 314f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q); 315ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 316f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2); 317f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF); 318ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 319ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Segment coding disabled for compred testing 320ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (high_q || (cpi->static_mb_pct == 100)) { 321f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_set_segdata(seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME); 322f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME); 323f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP); 324ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 325ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 326ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Disable segmentation and clear down features if alt ref 327ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // is not active for this group 328ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 329b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_disable_segmentation(seg); 330ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 331ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols); 332ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 333f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang seg->update_map = 0; 334f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang seg->update_data = 0; 335ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 336f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_clearall_segfeatures(seg); 337ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 338a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian } else if (rc->is_src_frame_alt_ref) { 339ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Special case where we are coding over the top of a previous 340ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // alt ref frame. 341ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Segment coding disabled for compred testing 342ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 343ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Enable ref frame features for segment 0 as well 344f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_enable_segfeature(seg, 0, SEG_LVL_REF_FRAME); 345f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME); 346ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 347ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // All mbs should use ALTREF_FRAME 348f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_clear_segdata(seg, 0, SEG_LVL_REF_FRAME); 349f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_set_segdata(seg, 0, SEG_LVL_REF_FRAME, ALTREF_FRAME); 350f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_clear_segdata(seg, 1, SEG_LVL_REF_FRAME); 351f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_set_segdata(seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME); 352ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 353ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Skip all MBs if high Q (0,0 mv and skip coeffs) 354ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (high_q) { 3555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vp9_enable_segfeature(seg, 0, SEG_LVL_SKIP); 3565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP); 357ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 35891037db265ecdd914a26e056cf69207b4f50924ehkuang // Enable data update 359f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang seg->update_data = 1; 360ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 361ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // All other frames. 362ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 363ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // No updates.. leave things as they are. 364f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang seg->update_map = 0; 365f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang seg->update_data = 0; 366ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 367ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 368ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 369ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 370ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// DEBUG: Print out the segment id of each MB in the current frame. 371ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void print_seg_map(VP9_COMP *cpi) { 372ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *cm = &cpi->common; 373ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int row, col; 374ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int map_index = 0; 375ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FILE *statsfile = fopen("segmap.stt", "a"); 376ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 377ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(statsfile, "%10d\n", cm->current_video_frame); 378ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 379ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (row = 0; row < cpi->common.mi_rows; row++) { 380ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (col = 0; col < cpi->common.mi_cols; col++) { 381ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(statsfile, "%10d", cpi->segmentation_map[map_index]); 382ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang map_index++; 383ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 384ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(statsfile, "\n"); 385ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 386ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(statsfile, "\n"); 387ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 388ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fclose(statsfile); 389ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 390ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 391ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void update_reference_segmentation_map(VP9_COMP *cpi) { 392ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *const cm = &cpi->common; 393b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian MODE_INFO **mi_8x8_ptr = cm->mi_grid_visible; 394b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint8_t *cache_ptr = cm->last_frame_seg_map; 395ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int row, col; 396ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 397ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (row = 0; row < cm->mi_rows; row++) { 398b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian MODE_INFO **mi_8x8 = mi_8x8_ptr; 399b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint8_t *cache = cache_ptr; 4001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (col = 0; col < cm->mi_cols; col++, mi_8x8++, cache++) 4011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cache[0] = mi_8x8[0]->mbmi.segment_id; 4026ac915abcdb404a00d927fe6308a47fcf09d9519hkuang mi_8x8_ptr += cm->mi_stride; 403ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cache_ptr += cm->mi_cols; 404ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 405ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 406b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic int is_slowest_mode(int mode) { 407b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return (mode == MODE_SECONDPASS_BEST || mode == MODE_BESTQUALITY); 408ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 409ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 410b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void set_rd_speed_thresholds(VP9_COMP *cpi) { 411ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 412ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 413ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Set baseline threshold values 414ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < MAX_MODES; ++i) 4156ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[i] = is_slowest_mode(cpi->oxcf.mode) ? -500 : 0; 4166ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 4176ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_NEARESTMV] = 0; 4186ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_NEARESTG] = 0; 4196ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_NEARESTA] = 0; 4206ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 4216ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_DC] += 1000; 4226ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 4236ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_NEWMV] += 1000; 4246ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_NEWA] += 1000; 4256ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_NEWG] += 1000; 4266ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 4276ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_NEARMV] += 1000; 4286ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_NEARA] += 1000; 4296ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_COMP_NEARESTLA] += 1000; 4306ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_COMP_NEARESTGA] += 1000; 4316ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 4326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_TM] += 1000; 4336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 4346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_COMP_NEARLA] += 1500; 4356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_COMP_NEWLA] += 2000; 4366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_NEARG] += 1000; 4376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_COMP_NEARGA] += 1500; 4386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_COMP_NEWGA] += 2000; 4396ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 4406ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_ZEROMV] += 2000; 4416ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_ZEROG] += 2000; 4426ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_ZEROA] += 2000; 4436ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_COMP_ZEROLA] += 2500; 4446ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_COMP_ZEROGA] += 2500; 4456ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 4466ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_H_PRED] += 2000; 4476ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_V_PRED] += 2000; 4486ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_D45_PRED ] += 2500; 4496ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_D135_PRED] += 2500; 4506ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_D117_PRED] += 2500; 4516ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_D153_PRED] += 2500; 4526ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_D207_PRED] += 2500; 4536ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_D63_PRED] += 2500; 45491037db265ecdd914a26e056cf69207b4f50924ehkuang 455ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* disable frame modes if flags not set */ 456ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!(cpi->ref_frame_flags & VP9_LAST_FLAG)) { 4576ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_NEWMV ] = INT_MAX; 4586ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_NEARESTMV] = INT_MAX; 4596ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_ZEROMV ] = INT_MAX; 4606ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_NEARMV ] = INT_MAX; 461ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 462ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG)) { 4636ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_NEARESTG ] = INT_MAX; 4646ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_ZEROG ] = INT_MAX; 4656ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_NEARG ] = INT_MAX; 4666ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_NEWG ] = INT_MAX; 467ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 468ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!(cpi->ref_frame_flags & VP9_ALT_FLAG)) { 4696ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_NEARESTA ] = INT_MAX; 4706ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_ZEROA ] = INT_MAX; 4716ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_NEARA ] = INT_MAX; 4726ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_NEWA ] = INT_MAX; 473ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 474ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 475ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) != 476ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (VP9_LAST_FLAG | VP9_ALT_FLAG)) { 4776ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_COMP_ZEROLA ] = INT_MAX; 4786ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_COMP_NEARESTLA] = INT_MAX; 4796ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_COMP_NEARLA ] = INT_MAX; 4806ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_COMP_NEWLA ] = INT_MAX; 481ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 482ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) != 483ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (VP9_GOLD_FLAG | VP9_ALT_FLAG)) { 4846ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_COMP_ZEROGA ] = INT_MAX; 4856ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_COMP_NEARESTGA] = INT_MAX; 4866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_COMP_NEARGA ] = INT_MAX; 4876ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult[THR_COMP_NEWGA ] = INT_MAX; 488ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 4895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang} 4905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 491b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) { 4926ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const SPEED_FEATURES *const sf = &cpi->sf; 4935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int i; 4945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 4955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang for (i = 0; i < MAX_REFS; ++i) 4966ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult_sub8x8[i] = is_slowest_mode(cpi->oxcf.mode) ? -500 : 0; 49791037db265ecdd914a26e056cf69207b4f50924ehkuang 4986ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult_sub8x8[THR_LAST] += 2500; 4996ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult_sub8x8[THR_GOLD] += 2500; 5006ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult_sub8x8[THR_ALTR] += 2500; 5016ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult_sub8x8[THR_INTRA] += 2500; 5026ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult_sub8x8[THR_COMP_LA] += 4500; 5036ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult_sub8x8[THR_COMP_GA] += 4500; 50491037db265ecdd914a26e056cf69207b4f50924ehkuang 5055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // Check for masked out split cases. 5066ac915abcdb404a00d927fe6308a47fcf09d9519hkuang for (i = 0; i < MAX_REFS; i++) 5075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (sf->disable_split_mask & (1 << i)) 5086ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult_sub8x8[i] = INT_MAX; 5095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 5105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // disable mode test if frame flag is not set 5115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (!(cpi->ref_frame_flags & VP9_LAST_FLAG)) 5126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult_sub8x8[THR_LAST] = INT_MAX; 5135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG)) 5146ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult_sub8x8[THR_GOLD] = INT_MAX; 5155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (!(cpi->ref_frame_flags & VP9_ALT_FLAG)) 5166ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult_sub8x8[THR_ALTR] = INT_MAX; 5175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) != 5185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang (VP9_LAST_FLAG | VP9_ALT_FLAG)) 5196ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult_sub8x8[THR_COMP_LA] = INT_MAX; 5205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) != 5215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang (VP9_GOLD_FLAG | VP9_ALT_FLAG)) 5226ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->rd_thresh_mult_sub8x8[THR_COMP_GA] = INT_MAX; 523ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 524ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 5256ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic void set_speed_features(VP9_COMP *cpi) { 526b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#if CONFIG_INTERNAL_STATS 5276ac915abcdb404a00d927fe6308a47fcf09d9519hkuang int i; 5285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang for (i = 0; i < MAX_MODES; ++i) 529ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->mode_chosen_counts[i] = 0; 530b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 531ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 5326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_set_speed_features(cpi); 533ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 534ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Set rd thresholds based on mode and speed setting 535b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian set_rd_speed_thresholds(cpi); 536b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian set_rd_speed_thresholds_sub8x8(cpi); 537ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 5385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cpi->mb.fwd_txm4x4 = vp9_fdct4x4; 5395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (cpi->oxcf.lossless || cpi->mb.e_mbd.lossless) { 5405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cpi->mb.fwd_txm4x4 = vp9_fwht4x4; 5415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 542ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 543ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 544ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void alloc_raw_frame_buffers(VP9_COMP *cpi) { 545ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *cm = &cpi->common; 546b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const VP9_CONFIG *oxcf = &cpi->oxcf; 547ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 548b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->lookahead = vp9_lookahead_init(oxcf->width, oxcf->height, 549ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->subsampling_x, cm->subsampling_y, 550b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian oxcf->lag_in_frames); 551ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!cpi->lookahead) 552b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, 553ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang "Failed to allocate lag buffers"); 554ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 555ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (vp9_realloc_frame_buffer(&cpi->alt_ref_buffer, 556b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian oxcf->width, oxcf->height, 557ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->subsampling_x, cm->subsampling_y, 558b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL)) 559b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, 560ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang "Failed to allocate altref buffer"); 561ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 562ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 563ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_alloc_compressor_data(VP9_COMP *cpi) { 564ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *cm = &cpi->common; 565ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 566ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (vp9_alloc_frame_buffers(cm, cm->width, cm->height)) 567b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, 568ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang "Failed to allocate frame buffers"); 569ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 570ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (vp9_alloc_frame_buffer(&cpi->last_frame_uf, 571ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->width, cm->height, 572ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->subsampling_x, cm->subsampling_y, 573b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_ENC_BORDER_IN_PIXELS)) 574b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, 575ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang "Failed to allocate last frame buffer"); 576ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 577ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (vp9_alloc_frame_buffer(&cpi->scaled_source, 578ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->width, cm->height, 579ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->subsampling_x, cm->subsampling_y, 580b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_ENC_BORDER_IN_PIXELS)) 581b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, 582ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang "Failed to allocate scaled source buffer"); 583ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 5846ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (vp9_alloc_frame_buffer(&cpi->scaled_last_source, 5856ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->width, cm->height, 5866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->subsampling_x, cm->subsampling_y, 5876ac915abcdb404a00d927fe6308a47fcf09d9519hkuang VP9_ENC_BORDER_IN_PIXELS)) 5886ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, 5896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang "Failed to allocate scaled last source buffer"); 5906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 591ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_free(cpi->tok); 592ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 593ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang { 594ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int tokens = get_token_alloc(cm->mb_rows, cm->mb_cols); 595ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 59691037db265ecdd914a26e056cf69207b4f50924ehkuang CHECK_MEM_ERROR(cm, cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok))); 597ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 598ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 599ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_free(cpi->mb_activity_map); 60091037db265ecdd914a26e056cf69207b4f50924ehkuang CHECK_MEM_ERROR(cm, cpi->mb_activity_map, 601ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_calloc(sizeof(unsigned int), 602ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->mb_rows * cm->mb_cols)); 603ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 604ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_free(cpi->mb_norm_activity_map); 60591037db265ecdd914a26e056cf69207b4f50924ehkuang CHECK_MEM_ERROR(cm, cpi->mb_norm_activity_map, 606ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_calloc(sizeof(unsigned int), 607ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->mb_rows * cm->mb_cols)); 608ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 609ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 610ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 611ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void update_frame_size(VP9_COMP *cpi) { 6126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang VP9_COMMON *const cm = &cpi->common; 6136ac915abcdb404a00d927fe6308a47fcf09d9519hkuang MACROBLOCKD *const xd = &cpi->mb.e_mbd; 614ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 615ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_update_frame_size(cm); 616ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 617ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Update size of buffers local to this frame 618ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (vp9_realloc_frame_buffer(&cpi->last_frame_uf, 619ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->width, cm->height, 620ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->subsampling_x, cm->subsampling_y, 621b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL)) 622b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, 623ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang "Failed to reallocate last frame buffer"); 624ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 625ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (vp9_realloc_frame_buffer(&cpi->scaled_source, 626ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->width, cm->height, 627ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->subsampling_x, cm->subsampling_y, 628b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL)) 629b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, 630ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang "Failed to reallocate scaled source buffer"); 631ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 6326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (vp9_realloc_frame_buffer(&cpi->scaled_last_source, 6336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->width, cm->height, 6346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->subsampling_x, cm->subsampling_y, 6356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL)) 6366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, 6376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang "Failed to reallocate scaled last source buffer"); 6386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 639ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang { 640ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int y_stride = cpi->scaled_source.y_stride; 641ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 642ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->sf.search_method == NSTEP) { 643ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_init3smotion_compensation(&cpi->mb, y_stride); 644ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else if (cpi->sf.search_method == DIAMOND) { 645ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_init_dsmotion_compensation(&cpi->mb, y_stride); 646ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 647ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 6485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 6496ac915abcdb404a00d927fe6308a47fcf09d9519hkuang init_macroblockd(cm, xd); 650ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 651ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 652ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// Table that converts 0-63 Q range values passed in outside to the Qindex 653ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// range used internally. 654a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianconst int q_trans[] = { 655ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 0, 4, 8, 12, 16, 20, 24, 28, 656ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 32, 36, 40, 44, 48, 52, 56, 60, 657ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 64, 68, 72, 76, 80, 84, 88, 92, 658ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 96, 100, 104, 108, 112, 116, 120, 124, 659ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 128, 132, 136, 140, 144, 148, 152, 156, 660ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 160, 164, 168, 172, 176, 180, 184, 188, 661ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 192, 196, 200, 204, 208, 212, 216, 220, 662ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 224, 228, 232, 236, 240, 244, 249, 255, 663ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}; 664ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 665ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vp9_reverse_trans(int x) { 666ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 667ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 668ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < 64; i++) 669ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (q_trans[i] >= x) 670ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return i; 671ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 672ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 63; 673ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}; 674b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 67591037db265ecdd914a26e056cf69207b4f50924ehkuangvoid vp9_new_framerate(VP9_COMP *cpi, double framerate) { 676b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_COMMON *const cm = &cpi->common; 677b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian RATE_CONTROL *const rc = &cpi->rc; 678b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_CONFIG *const oxcf = &cpi->oxcf; 679b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int vbr_max_bits; 680ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 681b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian oxcf->framerate = framerate < 0.1 ? 30 : framerate; 6825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cpi->output_framerate = cpi->oxcf.framerate; 683b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian rc->av_per_frame_bandwidth = (int)(oxcf->target_bandwidth / 6846ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->output_framerate); 685b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian rc->min_frame_bandwidth = (int)(rc->av_per_frame_bandwidth * 6866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang oxcf->two_pass_vbrmin_section / 100); 687b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 688b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian rc->min_frame_bandwidth = MAX(rc->min_frame_bandwidth, FRAME_OVERHEAD_BITS); 689b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 690b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // A maximum bitrate for a frame is defined. 691b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // The baseline for this aligns with HW implementations that 692b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // can support decode of 1080P content up to a bitrate of MAX_MB_RATE bits 693b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // per 16x16 MB (averaged over a frame). However this limit is extended if 694b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // a very high rate is given on the command line or the the rate cannnot 695b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // be acheived because of a user specificed max q (e.g. when the user 696b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // specifies lossless encode. 697b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // 698b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vbr_max_bits = (int)(((int64_t)rc->av_per_frame_bandwidth * 699b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian oxcf->two_pass_vbrmax_section) / 100); 700b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian rc->max_frame_bandwidth = MAX(MAX((cm->MBs * MAX_MB_RATE), MAXRATE_1080P), 701b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vbr_max_bits); 702ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 703ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Set Maximum gf/arf interval 704b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian rc->max_gf_interval = 16; 705ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 706ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Extended interval for genuinely static scenes 707b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian rc->static_scene_max_gf_interval = cpi->key_frame_frequency >> 1; 708ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 709ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Special conditions when alt ref frame enabled in lagged compress mode 710b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (oxcf->play_alternate && oxcf->lag_in_frames) { 711b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (rc->max_gf_interval > oxcf->lag_in_frames - 1) 712b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian rc->max_gf_interval = oxcf->lag_in_frames - 1; 713ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 714b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (rc->static_scene_max_gf_interval > oxcf->lag_in_frames - 1) 715b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian rc->static_scene_max_gf_interval = oxcf->lag_in_frames - 1; 716ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 717ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 718b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (rc->max_gf_interval > rc->static_scene_max_gf_interval) 719b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian rc->max_gf_interval = rc->static_scene_max_gf_interval; 720ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 721ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 722a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianint64_t vp9_rescale(int64_t val, int64_t num, int denom) { 723ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int64_t llnum = num; 724ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int64_t llden = denom; 725ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int64_t llval = val; 726ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 727ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return (llval * llnum / llden); 728ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 729ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 730ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void set_tile_limits(VP9_COMP *cpi) { 731ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *const cm = &cpi->common; 732ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 73391037db265ecdd914a26e056cf69207b4f50924ehkuang int min_log2_tile_cols, max_log2_tile_cols; 73491037db265ecdd914a26e056cf69207b4f50924ehkuang vp9_get_tile_n_bits(cm->mi_cols, &min_log2_tile_cols, &max_log2_tile_cols); 735ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 73691037db265ecdd914a26e056cf69207b4f50924ehkuang cm->log2_tile_cols = clamp(cpi->oxcf.tile_columns, 73791037db265ecdd914a26e056cf69207b4f50924ehkuang min_log2_tile_cols, max_log2_tile_cols); 73891037db265ecdd914a26e056cf69207b4f50924ehkuang cm->log2_tile_rows = cpi->oxcf.tile_rows; 739ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 740ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 741b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void init_config(struct VP9_COMP *cpi, VP9_CONFIG *oxcf) { 742ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *const cm = &cpi->common; 743ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 744ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 745ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->oxcf = *oxcf; 746ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 7476ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->profile = oxcf->profile; 7486ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->bit_depth = oxcf->bit_depth; 749ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 750ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->width = oxcf->width; 751ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->height = oxcf->height; 752ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->subsampling_x = 0; 753ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->subsampling_y = 0; 754ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_alloc_compressor_data(cpi); 755ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 756b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Spatial scalability. 757b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->svc.number_spatial_layers = oxcf->ss_number_layers; 758b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Temporal scalability. 759b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->svc.number_temporal_layers = oxcf->ts_number_layers; 760b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 7616ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if ((cpi->svc.number_temporal_layers > 1 && 7626ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) || 7636ac915abcdb404a00d927fe6308a47fcf09d9519hkuang (cpi->svc.number_spatial_layers > 1 && 7646ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->oxcf.mode == MODE_SECONDPASS_BEST)) { 765a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vp9_init_layer_context(cpi); 766b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 767b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 768ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // change includes all joint functionality 769b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_change_config(cpi, oxcf); 770ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 771ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->static_mb_pct = 0; 772ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 773ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->lst_fb_idx = 0; 774ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->gld_fb_idx = 1; 775ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->alt_fb_idx = 2; 776ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 777ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang set_tile_limits(cpi); 778ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 779ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->fixed_divide[0] = 0; 780ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 1; i < 512; i++) 781ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->fixed_divide[i] = 0x80000 / i; 782ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 783ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 7846ac915abcdb404a00d927fe6308a47fcf09d9519hkuangvoid vp9_change_config(struct VP9_COMP *cpi, const VP9_CONFIG *oxcf) { 785ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *const cm = &cpi->common; 7866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang RATE_CONTROL *const rc = &cpi->rc; 787ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 7886ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (cm->profile != oxcf->profile) 7896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->profile = oxcf->profile; 7906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->bit_depth = oxcf->bit_depth; 791ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 7926ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (cm->profile <= PROFILE_1) 7936ac915abcdb404a00d927fe6308a47fcf09d9519hkuang assert(cm->bit_depth == BITS_8); 7946ac915abcdb404a00d927fe6308a47fcf09d9519hkuang else 7956ac915abcdb404a00d927fe6308a47fcf09d9519hkuang assert(cm->bit_depth > BITS_8); 796ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 797ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->oxcf = *oxcf; 798ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 799b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->oxcf.cpu_used == -6) 800b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->oxcf.play_alternate = 0; 801b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 802b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian switch (cpi->oxcf.mode) { 803ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Real time and one pass deprecated in test code base 8045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang case MODE_GOODQUALITY: 8055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cpi->pass = 0; 8065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cpi->oxcf.cpu_used = clamp(cpi->oxcf.cpu_used, -5, 5); 8075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang break; 8085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 809b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian case MODE_BESTQUALITY: 810b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->pass = 0; 811b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian break; 812b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 813ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case MODE_FIRSTPASS: 814ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->pass = 1; 815ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 816ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 817ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case MODE_SECONDPASS: 818ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->pass = 2; 819ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->oxcf.cpu_used = clamp(cpi->oxcf.cpu_used, -5, 5); 820ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 821ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 822ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case MODE_SECONDPASS_BEST: 823ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->pass = 2; 824b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian break; 825b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 826b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian case MODE_REALTIME: 827b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->pass = 0; 828ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 829ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 830ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 831ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->oxcf.lossless = oxcf->lossless; 8326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (cpi->oxcf.lossless) { 8336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang // In lossless mode, make sure right quantizer range and correct transform 8346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang // is set. 8356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->oxcf.worst_allowed_q = 0; 8366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->oxcf.best_allowed_q = 0; 8376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->mb.e_mbd.itxm_add = vp9_iwht4x4_add; 8386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang } else { 8396ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->mb.e_mbd.itxm_add = vp9_idct4x4_add; 8406ac915abcdb404a00d927fe6308a47fcf09d9519hkuang } 8416ac915abcdb404a00d927fe6308a47fcf09d9519hkuang rc->baseline_gf_interval = DEFAULT_GF_INTERVAL; 842ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->ref_frame_flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG; 843ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 844ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->refresh_golden_frame = 0; 845ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->refresh_last_frame = 1; 846ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->refresh_frame_context = 1; 847ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->reset_frame_context = 0; 848ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 849b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_reset_segment_features(&cm->seg); 850b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian set_high_precision_mv(cpi, 0); 851ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 852ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang { 853ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 854ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 85591037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < MAX_SEGMENTS; i++) 856ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout; 857ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 858b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->encode_breakout = cpi->oxcf.encode_breakout; 859ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 860ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // local file playback mode == really big buffer 861ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK) { 862ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->oxcf.starting_buffer_level = 60000; 863ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->oxcf.optimal_buffer_level = 60000; 864ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->oxcf.maximum_buffer_size = 240000; 865ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 866ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 867ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Convert target bandwidth from Kbit/s to Bit/s 868ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->oxcf.target_bandwidth *= 1000; 869ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 870a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cpi->oxcf.starting_buffer_level = 871a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vp9_rescale(cpi->oxcf.starting_buffer_level, 872a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cpi->oxcf.target_bandwidth, 1000); 873ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 874ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Set or reset optimal and maximum buffer levels. 875ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->oxcf.optimal_buffer_level == 0) 876ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8; 877ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 878a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cpi->oxcf.optimal_buffer_level = 879a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vp9_rescale(cpi->oxcf.optimal_buffer_level, 880a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cpi->oxcf.target_bandwidth, 1000); 881ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 882ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->oxcf.maximum_buffer_size == 0) 883ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8; 884ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 885a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cpi->oxcf.maximum_buffer_size = 886a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vp9_rescale(cpi->oxcf.maximum_buffer_size, 887a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cpi->oxcf.target_bandwidth, 1000); 888b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Under a configuration change, where maximum_buffer_size may change, 889b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // keep buffer level clipped to the maximum allowed buffer size. 8906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang rc->bits_off_target = MIN(rc->bits_off_target, cpi->oxcf.maximum_buffer_size); 8916ac915abcdb404a00d927fe6308a47fcf09d9519hkuang rc->buffer_level = MIN(rc->buffer_level, cpi->oxcf.maximum_buffer_size); 892ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 893ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Set up frame rate and related parameters rate control values. 89491037db265ecdd914a26e056cf69207b4f50924ehkuang vp9_new_framerate(cpi, cpi->oxcf.framerate); 895ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 896ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Set absolute upper and lower quality limits 8976ac915abcdb404a00d927fe6308a47fcf09d9519hkuang rc->worst_quality = cpi->oxcf.worst_allowed_q; 8986ac915abcdb404a00d927fe6308a47fcf09d9519hkuang rc->best_quality = cpi->oxcf.best_allowed_q; 899ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 900ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // active values should only be modified if out of new range 901ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 902ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->cq_target_quality = cpi->oxcf.cq_level; 903ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 904b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->interp_filter = DEFAULT_INTERP_FILTER; 905ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 906ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->display_width = cpi->oxcf.width; 907ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->display_height = cpi->oxcf.height; 908ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 909ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs) 910b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->oxcf.sharpness = MIN(7, cpi->oxcf.sharpness); 911ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 912b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->common.lf.sharpness_level = cpi->oxcf.sharpness; 913ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 914ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->initial_width) { 915ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Increasing the size of the frame beyond the first seen frame, or some 916b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // otherwise signaled maximum size, is not supported. 917ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // TODO(jkoleszar): exit gracefully. 918ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang assert(cm->width <= cpi->initial_width); 919ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang assert(cm->height <= cpi->initial_height); 920ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 921ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang update_frame_size(cpi); 922ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 9236ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if ((cpi->svc.number_temporal_layers > 1 && 9246ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) || 9256ac915abcdb404a00d927fe6308a47fcf09d9519hkuang (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2)) { 926a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vp9_update_layer_context_change_config(cpi, 927a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian (int)cpi->oxcf.target_bandwidth); 928ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 929ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 930b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->speed = abs(cpi->oxcf.cpu_used); 931ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 932b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Limit on lag buffers as these are not currently dynamically allocated. 933b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS) 934ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS; 935ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 936ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF 937ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_zero(cpi->alt_ref_source); 938ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else 939ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->alt_ref_source = NULL; 940ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 9416ac915abcdb404a00d927fe6308a47fcf09d9519hkuang rc->is_src_frame_alt_ref = 0; 942ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 943ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if 0 944ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Experimental RD Code 945ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->frame_distortion = 0; 946ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->last_frame_distortion = 0; 947ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 948ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 949ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang set_tile_limits(cpi); 950b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 951b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->ext_refresh_frame_flags_pending = 0; 952b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->ext_refresh_frame_context_pending = 0; 953ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 954ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 955ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define M_LOG2_E 0.693147180559945309417 956ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define log2f(x) (log (x) / (float) M_LOG2_E) 957ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 958ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void cal_nmvjointsadcost(int *mvjointsadcost) { 959ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mvjointsadcost[0] = 600; 960ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mvjointsadcost[1] = 300; 961ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mvjointsadcost[2] = 300; 9626ac915abcdb404a00d927fe6308a47fcf09d9519hkuang mvjointsadcost[3] = 300; 963ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 964ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 965ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void cal_nmvsadcosts(int *mvsadcost[2]) { 966ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i = 1; 967ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 968ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mvsadcost[0][0] = 0; 969ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mvsadcost[1][0] = 0; 970ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 971ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang do { 972ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang double z = 256 * (2 * (log2f(8 * i) + .6)); 973ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mvsadcost[0][i] = (int)z; 974ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mvsadcost[1][i] = (int)z; 975ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mvsadcost[0][-i] = (int)z; 976ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mvsadcost[1][-i] = (int)z; 977ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } while (++i <= MV_MAX); 978ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 979ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 980ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void cal_nmvsadcosts_hp(int *mvsadcost[2]) { 981ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i = 1; 982ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 983ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mvsadcost[0][0] = 0; 984ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mvsadcost[1][0] = 0; 985ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 986ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang do { 987ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang double z = 256 * (2 * (log2f(8 * i) + .6)); 988ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mvsadcost[0][i] = (int)z; 989ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mvsadcost[1][i] = (int)z; 990ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mvsadcost[0][-i] = (int)z; 991ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mvsadcost[1][-i] = (int)z; 992ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } while (++i <= MV_MAX); 993ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 994ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 9959b35249446b07f40ac5fcc3205f2c048616efacchkuangstatic void alloc_mode_context(VP9_COMMON *cm, int num_4x4_blk, 9969b35249446b07f40ac5fcc3205f2c048616efacchkuang PICK_MODE_CONTEXT *ctx) { 9979b35249446b07f40ac5fcc3205f2c048616efacchkuang int num_pix = num_4x4_blk << 4; 9989b35249446b07f40ac5fcc3205f2c048616efacchkuang int i, k; 9999b35249446b07f40ac5fcc3205f2c048616efacchkuang ctx->num_4x4_blk = num_4x4_blk; 1000b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 10019b35249446b07f40ac5fcc3205f2c048616efacchkuang CHECK_MEM_ERROR(cm, ctx->zcoeff_blk, 10029b35249446b07f40ac5fcc3205f2c048616efacchkuang vpx_calloc(num_4x4_blk, sizeof(uint8_t))); 10039b35249446b07f40ac5fcc3205f2c048616efacchkuang for (i = 0; i < MAX_MB_PLANE; ++i) { 10049b35249446b07f40ac5fcc3205f2c048616efacchkuang for (k = 0; k < 3; ++k) { 10059b35249446b07f40ac5fcc3205f2c048616efacchkuang CHECK_MEM_ERROR(cm, ctx->coeff[i][k], 10069b35249446b07f40ac5fcc3205f2c048616efacchkuang vpx_memalign(16, num_pix * sizeof(int16_t))); 10079b35249446b07f40ac5fcc3205f2c048616efacchkuang CHECK_MEM_ERROR(cm, ctx->qcoeff[i][k], 10089b35249446b07f40ac5fcc3205f2c048616efacchkuang vpx_memalign(16, num_pix * sizeof(int16_t))); 10099b35249446b07f40ac5fcc3205f2c048616efacchkuang CHECK_MEM_ERROR(cm, ctx->dqcoeff[i][k], 10109b35249446b07f40ac5fcc3205f2c048616efacchkuang vpx_memalign(16, num_pix * sizeof(int16_t))); 10119b35249446b07f40ac5fcc3205f2c048616efacchkuang CHECK_MEM_ERROR(cm, ctx->eobs[i][k], 10129b35249446b07f40ac5fcc3205f2c048616efacchkuang vpx_memalign(16, num_pix * sizeof(uint16_t))); 10139b35249446b07f40ac5fcc3205f2c048616efacchkuang ctx->coeff_pbuf[i][k] = ctx->coeff[i][k]; 10149b35249446b07f40ac5fcc3205f2c048616efacchkuang ctx->qcoeff_pbuf[i][k] = ctx->qcoeff[i][k]; 10159b35249446b07f40ac5fcc3205f2c048616efacchkuang ctx->dqcoeff_pbuf[i][k] = ctx->dqcoeff[i][k]; 10169b35249446b07f40ac5fcc3205f2c048616efacchkuang ctx->eobs_pbuf[i][k] = ctx->eobs[i][k]; 10179b35249446b07f40ac5fcc3205f2c048616efacchkuang } 10189b35249446b07f40ac5fcc3205f2c048616efacchkuang } 10199b35249446b07f40ac5fcc3205f2c048616efacchkuang} 10209b35249446b07f40ac5fcc3205f2c048616efacchkuang 10219b35249446b07f40ac5fcc3205f2c048616efacchkuangstatic void free_mode_context(PICK_MODE_CONTEXT *ctx) { 10229b35249446b07f40ac5fcc3205f2c048616efacchkuang int i, k; 10239b35249446b07f40ac5fcc3205f2c048616efacchkuang vpx_free(ctx->zcoeff_blk); 10249b35249446b07f40ac5fcc3205f2c048616efacchkuang ctx->zcoeff_blk = 0; 10259b35249446b07f40ac5fcc3205f2c048616efacchkuang for (i = 0; i < MAX_MB_PLANE; ++i) { 10269b35249446b07f40ac5fcc3205f2c048616efacchkuang for (k = 0; k < 3; ++k) { 10279b35249446b07f40ac5fcc3205f2c048616efacchkuang vpx_free(ctx->coeff[i][k]); 10289b35249446b07f40ac5fcc3205f2c048616efacchkuang ctx->coeff[i][k] = 0; 10299b35249446b07f40ac5fcc3205f2c048616efacchkuang vpx_free(ctx->qcoeff[i][k]); 10309b35249446b07f40ac5fcc3205f2c048616efacchkuang ctx->qcoeff[i][k] = 0; 10319b35249446b07f40ac5fcc3205f2c048616efacchkuang vpx_free(ctx->dqcoeff[i][k]); 10329b35249446b07f40ac5fcc3205f2c048616efacchkuang ctx->dqcoeff[i][k] = 0; 10339b35249446b07f40ac5fcc3205f2c048616efacchkuang vpx_free(ctx->eobs[i][k]); 10349b35249446b07f40ac5fcc3205f2c048616efacchkuang ctx->eobs[i][k] = 0; 10359b35249446b07f40ac5fcc3205f2c048616efacchkuang } 10369b35249446b07f40ac5fcc3205f2c048616efacchkuang } 10379b35249446b07f40ac5fcc3205f2c048616efacchkuang} 10389b35249446b07f40ac5fcc3205f2c048616efacchkuang 10395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void init_pick_mode_context(VP9_COMP *cpi) { 10405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int i; 10419b35249446b07f40ac5fcc3205f2c048616efacchkuang VP9_COMMON *const cm = &cpi->common; 10429b35249446b07f40ac5fcc3205f2c048616efacchkuang MACROBLOCK *const x = &cpi->mb; 10439b35249446b07f40ac5fcc3205f2c048616efacchkuang 10445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang for (i = 0; i < BLOCK_SIZES; ++i) { 10455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang const int num_4x4_w = num_4x4_blocks_wide_lookup[i]; 10465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang const int num_4x4_h = num_4x4_blocks_high_lookup[i]; 10475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang const int num_4x4_blk = MAX(4, num_4x4_w * num_4x4_h); 10485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (i < BLOCK_16X16) { 10499b35249446b07f40ac5fcc3205f2c048616efacchkuang for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) { 10509b35249446b07f40ac5fcc3205f2c048616efacchkuang for (x->mb_index = 0; x->mb_index < 4; ++x->mb_index) { 10519b35249446b07f40ac5fcc3205f2c048616efacchkuang for (x->b_index = 0; x->b_index < 16 / num_4x4_blk; ++x->b_index) { 10525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang PICK_MODE_CONTEXT *ctx = get_block_context(x, i); 10539b35249446b07f40ac5fcc3205f2c048616efacchkuang alloc_mode_context(cm, num_4x4_blk, ctx); 10545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 10555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 10565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 10575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } else if (i < BLOCK_32X32) { 10589b35249446b07f40ac5fcc3205f2c048616efacchkuang for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) { 10599b35249446b07f40ac5fcc3205f2c048616efacchkuang for (x->mb_index = 0; x->mb_index < 64 / num_4x4_blk; ++x->mb_index) { 10605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang PICK_MODE_CONTEXT *ctx = get_block_context(x, i); 10615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ctx->num_4x4_blk = num_4x4_blk; 10629b35249446b07f40ac5fcc3205f2c048616efacchkuang alloc_mode_context(cm, num_4x4_blk, ctx); 10635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 10645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 10655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } else if (i < BLOCK_64X64) { 10669b35249446b07f40ac5fcc3205f2c048616efacchkuang for (x->sb_index = 0; x->sb_index < 256 / num_4x4_blk; ++x->sb_index) { 10675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang PICK_MODE_CONTEXT *ctx = get_block_context(x, i); 10685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ctx->num_4x4_blk = num_4x4_blk; 10699b35249446b07f40ac5fcc3205f2c048616efacchkuang alloc_mode_context(cm, num_4x4_blk, ctx); 10705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 10715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } else { 10725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang PICK_MODE_CONTEXT *ctx = get_block_context(x, i); 10735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ctx->num_4x4_blk = num_4x4_blk; 10749b35249446b07f40ac5fcc3205f2c048616efacchkuang alloc_mode_context(cm, num_4x4_blk, ctx); 10755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 10765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 10775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang} 10785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 10795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void free_pick_mode_context(MACROBLOCK *x) { 10805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int i; 10815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 10825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang for (i = 0; i < BLOCK_SIZES; ++i) { 10835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang const int num_4x4_w = num_4x4_blocks_wide_lookup[i]; 10845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang const int num_4x4_h = num_4x4_blocks_high_lookup[i]; 10855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang const int num_4x4_blk = MAX(4, num_4x4_w * num_4x4_h); 10865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (i < BLOCK_16X16) { 10879b35249446b07f40ac5fcc3205f2c048616efacchkuang for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) { 10889b35249446b07f40ac5fcc3205f2c048616efacchkuang for (x->mb_index = 0; x->mb_index < 4; ++x->mb_index) { 10899b35249446b07f40ac5fcc3205f2c048616efacchkuang for (x->b_index = 0; x->b_index < 16 / num_4x4_blk; ++x->b_index) { 10905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang PICK_MODE_CONTEXT *ctx = get_block_context(x, i); 10919b35249446b07f40ac5fcc3205f2c048616efacchkuang free_mode_context(ctx); 10925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 10935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 10945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 10955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } else if (i < BLOCK_32X32) { 10969b35249446b07f40ac5fcc3205f2c048616efacchkuang for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) { 10979b35249446b07f40ac5fcc3205f2c048616efacchkuang for (x->mb_index = 0; x->mb_index < 64 / num_4x4_blk; ++x->mb_index) { 10985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang PICK_MODE_CONTEXT *ctx = get_block_context(x, i); 10999b35249446b07f40ac5fcc3205f2c048616efacchkuang free_mode_context(ctx); 11005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 11015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 11025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } else if (i < BLOCK_64X64) { 11039b35249446b07f40ac5fcc3205f2c048616efacchkuang for (x->sb_index = 0; x->sb_index < 256 / num_4x4_blk; ++x->sb_index) { 11045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang PICK_MODE_CONTEXT *ctx = get_block_context(x, i); 11059b35249446b07f40ac5fcc3205f2c048616efacchkuang free_mode_context(ctx); 11065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 11075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } else { 11085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang PICK_MODE_CONTEXT *ctx = get_block_context(x, i); 11099b35249446b07f40ac5fcc3205f2c048616efacchkuang free_mode_context(ctx); 11105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 11115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 11125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang} 11135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 1114b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh VenkatasubramanianVP9_COMP *vp9_create_compressor(VP9_CONFIG *oxcf) { 11151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int i, j; 1116a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian VP9_COMP *const cpi = vpx_memalign(32, sizeof(VP9_COMP)); 1117a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian VP9_COMMON *const cm = cpi != NULL ? &cpi->common : NULL; 1118ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1119b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (!cm) 1120b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return NULL; 1121ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1122f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_zero(*cpi); 1123ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1124ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (setjmp(cm->error.jmp)) { 1125b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->error.setjmp = 0; 1126b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_remove_compressor(cpi); 1127ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 0; 1128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1129ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 113091037db265ecdd914a26e056cf69207b4f50924ehkuang cm->error.setjmp = 1; 1131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 113291037db265ecdd914a26e056cf69207b4f50924ehkuang CHECK_MEM_ERROR(cm, cpi->mb.ss, vpx_calloc(sizeof(search_site), 113391037db265ecdd914a26e056cf69207b4f50924ehkuang (MAX_MVSEARCH_STEPS * 8) + 1)); 1134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1135b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_rtcd(); 1136ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1137b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->use_svc = 0; 1138ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1139b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian init_config(cpi, oxcf); 11406ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_rc_init(&cpi->oxcf, cpi->pass, &cpi->rc); 11415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang init_pick_mode_context(cpi); 11425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 1143b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->current_video_frame = 0; 1144ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1145ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Set reference frame sign bias for ALTREF frame to 1 (for now) 114691037db265ecdd914a26e056cf69207b4f50924ehkuang cm->ref_frame_sign_bias[ALTREF_FRAME] = 1; 1147ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1148ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->gold_is_last = 0; 1149b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->alt_is_last = 0; 1150b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->gold_is_alt = 0; 11511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1152ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Create the encoder segmentation map and set all entries to 0 115391037db265ecdd914a26e056cf69207b4f50924ehkuang CHECK_MEM_ERROR(cm, cpi->segmentation_map, 115491037db265ecdd914a26e056cf69207b4f50924ehkuang vpx_calloc(cm->mi_rows * cm->mi_cols, 1)); 1155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1156b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Create a complexity map used for rd adjustment 1157b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian CHECK_MEM_ERROR(cm, cpi->complexity_map, 1158b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_calloc(cm->mi_rows * cm->mi_cols, 1)); 1159b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1160a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian // Create a map used for cyclic background refresh. 11616ac915abcdb404a00d927fe6308a47fcf09d9519hkuang CHECK_MEM_ERROR(cm, cpi->cyclic_refresh, 11626ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_cyclic_refresh_alloc(cm->mi_rows, cm->mi_cols)); 1163b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1164ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // And a place holder structure is the coding context 1165ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // for use if we want to save and restore it 116691037db265ecdd914a26e056cf69207b4f50924ehkuang CHECK_MEM_ERROR(cm, cpi->coding_context.last_frame_seg_map_copy, 116791037db265ecdd914a26e056cf69207b4f50924ehkuang vpx_calloc(cm->mi_rows * cm->mi_cols, 1)); 1168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 116991037db265ecdd914a26e056cf69207b4f50924ehkuang CHECK_MEM_ERROR(cm, cpi->active_map, vpx_calloc(cm->MBs, 1)); 117091037db265ecdd914a26e056cf69207b4f50924ehkuang vpx_memset(cpi->active_map, 1, cm->MBs); 1171ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->active_map_enabled = 0; 1172ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1173ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < (sizeof(cpi->mbgraph_stats) / 1174ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang sizeof(cpi->mbgraph_stats[0])); i++) { 117591037db265ecdd914a26e056cf69207b4f50924ehkuang CHECK_MEM_ERROR(cm, cpi->mbgraph_stats[i].mb_stats, 117691037db265ecdd914a26e056cf69207b4f50924ehkuang vpx_calloc(cm->MBs * 117791037db265ecdd914a26e056cf69207b4f50924ehkuang sizeof(*cpi->mbgraph_stats[i].mb_stats), 1)); 1178ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1179ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1180ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /*Initialize the feed-forward activity masking.*/ 1181ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->activity_avg = 90 << 12; 1182ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->key_frame_frequency = cpi->oxcf.key_freq; 1183ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->refresh_alt_ref_frame = 0; 1184ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1185ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF 1186ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Turn multiple ARF usage on/off. This is a quick hack for the initial test 1187ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // version. It should eventually be set via the codec API. 1188ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->multi_arf_enabled = 1; 1189ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1190ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->multi_arf_enabled) { 1191ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->sequence_number = 0; 1192ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->frame_coding_order_period = 0; 1193ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_zero(cpi->frame_coding_order); 1194ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_zero(cpi->arf_buffer_idx); 1195ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1196ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 1197ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1198ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS; 1199ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_INTERNAL_STATS 1200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->b_calculate_ssimg = 0; 1201ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1202ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->count = 0; 1203ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->bytes = 0; 1204ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1205ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->b_calculate_psnr) { 1206ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->total_y = 0.0; 1207ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->total_u = 0.0; 1208ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->total_v = 0.0; 1209ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->total = 0.0; 1210b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->total_sq_error = 0; 1211b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->total_samples = 0; 1212b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1213ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->totalp_y = 0.0; 1214ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->totalp_u = 0.0; 1215ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->totalp_v = 0.0; 1216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->totalp = 0.0; 1217b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->totalp_sq_error = 0; 1218b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->totalp_samples = 0; 1219b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->tot_recode_hits = 0; 1221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->summed_quality = 0; 1222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->summed_weights = 0; 1223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->summedp_quality = 0; 1224ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->summedp_weights = 0; 1225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->b_calculate_ssimg) { 1228ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->total_ssimg_y = 0; 1229ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->total_ssimg_u = 0; 1230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->total_ssimg_v = 0; 1231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->total_ssimg_all = 0; 1232ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1233ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1234ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 1235ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1236ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->first_time_stamp_ever = INT64_MAX; 1237ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1238ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cal_nmvjointsadcost(cpi->mb.nmvjointsadcost); 1239ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->mb.nmvcost[0] = &cpi->mb.nmvcosts[0][MV_MAX]; 1240ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->mb.nmvcost[1] = &cpi->mb.nmvcosts[1][MV_MAX]; 1241ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->mb.nmvsadcost[0] = &cpi->mb.nmvsadcosts[0][MV_MAX]; 1242ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->mb.nmvsadcost[1] = &cpi->mb.nmvsadcosts[1][MV_MAX]; 1243ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cal_nmvsadcosts(cpi->mb.nmvsadcost); 1244ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1245ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->mb.nmvcost_hp[0] = &cpi->mb.nmvcosts_hp[0][MV_MAX]; 1246ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->mb.nmvcost_hp[1] = &cpi->mb.nmvcosts_hp[1][MV_MAX]; 1247ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->mb.nmvsadcost_hp[0] = &cpi->mb.nmvsadcosts_hp[0][MV_MAX]; 1248ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->mb.nmvsadcost_hp[1] = &cpi->mb.nmvsadcosts_hp[1][MV_MAX]; 1249ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cal_nmvsadcosts_hp(cpi->mb.nmvsadcost_hp); 1250ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1251ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef OUTPUT_YUV_SRC 1252ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang yuv_file = fopen("bd.yuv", "ab"); 1253ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 1254ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef OUTPUT_YUV_REC 1255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang yuv_rec_file = fopen("rec.yuv", "wb"); 1256ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 1257ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1258ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if 0 1259ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang framepsnr = fopen("framepsnr.stt", "a"); 1260ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang kf_list = fopen("kf_list.stt", "w"); 1261ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 1262ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1263ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->output_pkt_list = oxcf->output_pkt_list; 1264ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1265b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED; 12661184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1267ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->pass == 1) { 1268ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_init_first_pass(cpi); 1269ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else if (cpi->pass == 2) { 1270b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const size_t packet_sz = sizeof(FIRSTPASS_STATS); 1271b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz); 1272ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 12736ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (cpi->svc.number_spatial_layers > 1 12746ac915abcdb404a00d927fe6308a47fcf09d9519hkuang && cpi->svc.number_temporal_layers == 1) { 12756ac915abcdb404a00d927fe6308a47fcf09d9519hkuang FIRSTPASS_STATS *const stats = oxcf->two_pass_stats_in.buf; 12766ac915abcdb404a00d927fe6308a47fcf09d9519hkuang FIRSTPASS_STATS *stats_copy[VPX_SS_MAX_LAYERS] = {0}; 12776ac915abcdb404a00d927fe6308a47fcf09d9519hkuang int i; 12786ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 12796ac915abcdb404a00d927fe6308a47fcf09d9519hkuang for (i = 0; i < oxcf->ss_number_layers; ++i) { 12806ac915abcdb404a00d927fe6308a47fcf09d9519hkuang FIRSTPASS_STATS *const last_packet_for_layer = 12816ac915abcdb404a00d927fe6308a47fcf09d9519hkuang &stats[packets - oxcf->ss_number_layers + i]; 12826ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const int layer_id = (int)last_packet_for_layer->spatial_layer_id; 12836ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const int packets_in_layer = (int)last_packet_for_layer->count + 1; 12846ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (layer_id >= 0 && layer_id < oxcf->ss_number_layers) { 12856ac915abcdb404a00d927fe6308a47fcf09d9519hkuang LAYER_CONTEXT *const lc = &cpi->svc.layer_context[layer_id]; 12866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 12876ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vpx_free(lc->rc_twopass_stats_in.buf); 12886ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 12896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang lc->rc_twopass_stats_in.sz = packets_in_layer * packet_sz; 12906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang CHECK_MEM_ERROR(cm, lc->rc_twopass_stats_in.buf, 12916ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vpx_malloc(lc->rc_twopass_stats_in.sz)); 12926ac915abcdb404a00d927fe6308a47fcf09d9519hkuang lc->twopass.stats_in_start = lc->rc_twopass_stats_in.buf; 12936ac915abcdb404a00d927fe6308a47fcf09d9519hkuang lc->twopass.stats_in = lc->twopass.stats_in_start; 12946ac915abcdb404a00d927fe6308a47fcf09d9519hkuang lc->twopass.stats_in_end = lc->twopass.stats_in_start 12956ac915abcdb404a00d927fe6308a47fcf09d9519hkuang + packets_in_layer - 1; 12966ac915abcdb404a00d927fe6308a47fcf09d9519hkuang stats_copy[layer_id] = lc->rc_twopass_stats_in.buf; 12976ac915abcdb404a00d927fe6308a47fcf09d9519hkuang } 12986ac915abcdb404a00d927fe6308a47fcf09d9519hkuang } 12996ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 13006ac915abcdb404a00d927fe6308a47fcf09d9519hkuang for (i = 0; i < packets; ++i) { 13016ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const int layer_id = (int)stats[i].spatial_layer_id; 13026ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (layer_id >= 0 && layer_id < oxcf->ss_number_layers 13036ac915abcdb404a00d927fe6308a47fcf09d9519hkuang && stats_copy[layer_id] != NULL) { 13046ac915abcdb404a00d927fe6308a47fcf09d9519hkuang *stats_copy[layer_id] = stats[i]; 13056ac915abcdb404a00d927fe6308a47fcf09d9519hkuang ++stats_copy[layer_id]; 13066ac915abcdb404a00d927fe6308a47fcf09d9519hkuang } 13076ac915abcdb404a00d927fe6308a47fcf09d9519hkuang } 13086ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 13096ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_init_second_pass_spatial_svc(cpi); 13106ac915abcdb404a00d927fe6308a47fcf09d9519hkuang } else { 13116ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf; 13126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->twopass.stats_in = cpi->twopass.stats_in_start; 13136ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->twopass.stats_in_end = &cpi->twopass.stats_in[packets - 1]; 13146ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 13156ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_init_second_pass(cpi); 13166ac915abcdb404a00d927fe6308a47fcf09d9519hkuang } 1317ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1318ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 13196ac915abcdb404a00d927fe6308a47fcf09d9519hkuang set_speed_features(cpi); 1320ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 13211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Default rd threshold factors for mode selection 13225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang for (i = 0; i < BLOCK_SIZES; ++i) { 13231184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (j = 0; j < MAX_MODES; ++j) 13241184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cpi->rd_thresh_freq_fact[i][j] = 32; 13255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang for (j = 0; j < MAX_REFS; ++j) 13265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cpi->rd_thresh_freq_sub8x8[i][j] = 32; 13275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 1328ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 132991037db265ecdd914a26e056cf69207b4f50924ehkuang#define BFP(BT, SDF, SDAF, VF, SVF, SVAF, SVFHH, SVFHV, SVFHHV, \ 133091037db265ecdd914a26e056cf69207b4f50924ehkuang SDX3F, SDX8F, SDX4DF)\ 1331ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->fn_ptr[BT].sdf = SDF; \ 133291037db265ecdd914a26e056cf69207b4f50924ehkuang cpi->fn_ptr[BT].sdaf = SDAF; \ 1333ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->fn_ptr[BT].vf = VF; \ 1334ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->fn_ptr[BT].svf = SVF; \ 1335ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->fn_ptr[BT].svaf = SVAF; \ 1336ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->fn_ptr[BT].svf_halfpix_h = SVFHH; \ 1337ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->fn_ptr[BT].svf_halfpix_v = SVFHV; \ 1338ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->fn_ptr[BT].svf_halfpix_hv = SVFHHV; \ 1339ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->fn_ptr[BT].sdx3f = SDX3F; \ 1340ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->fn_ptr[BT].sdx8f = SDX8F; \ 1341ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->fn_ptr[BT].sdx4df = SDX4DF; 1342ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 134391037db265ecdd914a26e056cf69207b4f50924ehkuang BFP(BLOCK_32X16, vp9_sad32x16, vp9_sad32x16_avg, 134491037db265ecdd914a26e056cf69207b4f50924ehkuang vp9_variance32x16, vp9_sub_pixel_variance32x16, 1345ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sub_pixel_avg_variance32x16, NULL, NULL, 1346ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang NULL, NULL, NULL, 1347ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sad32x16x4d) 1348ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 134991037db265ecdd914a26e056cf69207b4f50924ehkuang BFP(BLOCK_16X32, vp9_sad16x32, vp9_sad16x32_avg, 135091037db265ecdd914a26e056cf69207b4f50924ehkuang vp9_variance16x32, vp9_sub_pixel_variance16x32, 1351ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sub_pixel_avg_variance16x32, NULL, NULL, 1352ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang NULL, NULL, NULL, 1353ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sad16x32x4d) 1354ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 135591037db265ecdd914a26e056cf69207b4f50924ehkuang BFP(BLOCK_64X32, vp9_sad64x32, vp9_sad64x32_avg, 135691037db265ecdd914a26e056cf69207b4f50924ehkuang vp9_variance64x32, vp9_sub_pixel_variance64x32, 1357ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sub_pixel_avg_variance64x32, NULL, NULL, 1358ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang NULL, NULL, NULL, 1359ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sad64x32x4d) 1360ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 136191037db265ecdd914a26e056cf69207b4f50924ehkuang BFP(BLOCK_32X64, vp9_sad32x64, vp9_sad32x64_avg, 136291037db265ecdd914a26e056cf69207b4f50924ehkuang vp9_variance32x64, vp9_sub_pixel_variance32x64, 1363ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sub_pixel_avg_variance32x64, NULL, NULL, 1364ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang NULL, NULL, NULL, 1365ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sad32x64x4d) 1366ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 136791037db265ecdd914a26e056cf69207b4f50924ehkuang BFP(BLOCK_32X32, vp9_sad32x32, vp9_sad32x32_avg, 136891037db265ecdd914a26e056cf69207b4f50924ehkuang vp9_variance32x32, vp9_sub_pixel_variance32x32, 1369ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sub_pixel_avg_variance32x32, vp9_variance_halfpixvar32x32_h, 1370ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_variance_halfpixvar32x32_v, 1371ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_variance_halfpixvar32x32_hv, vp9_sad32x32x3, vp9_sad32x32x8, 1372ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sad32x32x4d) 1373ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 137491037db265ecdd914a26e056cf69207b4f50924ehkuang BFP(BLOCK_64X64, vp9_sad64x64, vp9_sad64x64_avg, 137591037db265ecdd914a26e056cf69207b4f50924ehkuang vp9_variance64x64, vp9_sub_pixel_variance64x64, 1376ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sub_pixel_avg_variance64x64, vp9_variance_halfpixvar64x64_h, 1377ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_variance_halfpixvar64x64_v, 1378ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_variance_halfpixvar64x64_hv, vp9_sad64x64x3, vp9_sad64x64x8, 1379ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sad64x64x4d) 1380ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 138191037db265ecdd914a26e056cf69207b4f50924ehkuang BFP(BLOCK_16X16, vp9_sad16x16, vp9_sad16x16_avg, 138291037db265ecdd914a26e056cf69207b4f50924ehkuang vp9_variance16x16, vp9_sub_pixel_variance16x16, 1383ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sub_pixel_avg_variance16x16, vp9_variance_halfpixvar16x16_h, 1384ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_variance_halfpixvar16x16_v, 1385ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_variance_halfpixvar16x16_hv, vp9_sad16x16x3, vp9_sad16x16x8, 1386ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sad16x16x4d) 1387ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 138891037db265ecdd914a26e056cf69207b4f50924ehkuang BFP(BLOCK_16X8, vp9_sad16x8, vp9_sad16x8_avg, 138991037db265ecdd914a26e056cf69207b4f50924ehkuang vp9_variance16x8, vp9_sub_pixel_variance16x8, 1390ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sub_pixel_avg_variance16x8, NULL, NULL, NULL, 1391ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sad16x8x3, vp9_sad16x8x8, vp9_sad16x8x4d) 1392ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 139391037db265ecdd914a26e056cf69207b4f50924ehkuang BFP(BLOCK_8X16, vp9_sad8x16, vp9_sad8x16_avg, 139491037db265ecdd914a26e056cf69207b4f50924ehkuang vp9_variance8x16, vp9_sub_pixel_variance8x16, 1395ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sub_pixel_avg_variance8x16, NULL, NULL, NULL, 1396ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sad8x16x3, vp9_sad8x16x8, vp9_sad8x16x4d) 1397ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 139891037db265ecdd914a26e056cf69207b4f50924ehkuang BFP(BLOCK_8X8, vp9_sad8x8, vp9_sad8x8_avg, 139991037db265ecdd914a26e056cf69207b4f50924ehkuang vp9_variance8x8, vp9_sub_pixel_variance8x8, 1400ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sub_pixel_avg_variance8x8, NULL, NULL, NULL, 1401ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sad8x8x3, vp9_sad8x8x8, vp9_sad8x8x4d) 1402ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 140391037db265ecdd914a26e056cf69207b4f50924ehkuang BFP(BLOCK_8X4, vp9_sad8x4, vp9_sad8x4_avg, 140491037db265ecdd914a26e056cf69207b4f50924ehkuang vp9_variance8x4, vp9_sub_pixel_variance8x4, 1405ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sub_pixel_avg_variance8x4, NULL, NULL, 1406ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang NULL, NULL, vp9_sad8x4x8, 1407ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sad8x4x4d) 1408ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 140991037db265ecdd914a26e056cf69207b4f50924ehkuang BFP(BLOCK_4X8, vp9_sad4x8, vp9_sad4x8_avg, 141091037db265ecdd914a26e056cf69207b4f50924ehkuang vp9_variance4x8, vp9_sub_pixel_variance4x8, 1411ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sub_pixel_avg_variance4x8, NULL, NULL, 1412ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang NULL, NULL, vp9_sad4x8x8, 1413ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sad4x8x4d) 1414ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 141591037db265ecdd914a26e056cf69207b4f50924ehkuang BFP(BLOCK_4X4, vp9_sad4x4, vp9_sad4x4_avg, 141691037db265ecdd914a26e056cf69207b4f50924ehkuang vp9_variance4x4, vp9_sub_pixel_variance4x4, 1417ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sub_pixel_avg_variance4x4, NULL, NULL, NULL, 1418ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sad4x4x3, vp9_sad4x4x8, vp9_sad4x4x4d) 1419ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1420ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->full_search_sad = vp9_full_search_sad; 1421ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->diamond_search_sad = vp9_diamond_search_sad; 1422ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->refining_search_sad = vp9_refining_search_sad; 1423ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1424ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* vp9_init_quantizer() is first called here. Add check in 1425ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * vp9_frame_init_quantizer() so that vp9_init_quantizer is only 1426ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * called later when needed. This will avoid unnecessary calls of 1427ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * vp9_init_quantizer() for every frame. 1428ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 1429ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_init_quantizer(cpi); 1430ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 14311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vp9_loop_filter_init(cm); 1432ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1433b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->error.setjmp = 0; 1434ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1435b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_zero(cpi->common.counts.uv_mode); 1436ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 14371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#ifdef MODE_TEST_HIT_STATS 14385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vp9_zero(cpi->mode_test_hits); 14391184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#endif 14401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1441b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return cpi; 1442ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 1443ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1444b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_remove_compressor(VP9_COMP *cpi) { 1445ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 1446ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1447ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!cpi) 1448ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return; 1449ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1450ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi && (cpi->common.current_video_frame > 0)) { 1451ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_INTERNAL_STATS 1452ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1453ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_clear_system_state(); 1454ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1455ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // printf("\n8x8-4x4:%d-%d\n", cpi->t8x8_count, cpi->t4x4_count); 1456ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->pass != 1) { 1457ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FILE *f = fopen("opsnr.stt", "a"); 1458ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang double time_encoded = (cpi->last_end_time_stamp_seen 1459ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang - cpi->first_time_stamp_ever) / 10000000.000; 14605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang double total_encode_time = (cpi->time_receive_data + 14615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cpi->time_compress_data) / 1000.000; 14625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang double dr = (double)cpi->bytes * (double) 8 / (double)1000 14635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang / time_encoded; 1464ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1465ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->b_calculate_psnr) { 1466b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const double total_psnr = 1467b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_sse_to_psnr((double)cpi->total_samples, 255.0, 1468b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian (double)cpi->total_sq_error); 1469b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const double totalp_psnr = 1470b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_sse_to_psnr((double)cpi->totalp_samples, 255.0, 1471b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian (double)cpi->totalp_sq_error); 1472b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const double total_ssim = 100 * pow(cpi->summed_quality / 1473b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->summed_weights, 8.0); 1474b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const double totalp_ssim = 100 * pow(cpi->summedp_quality / 1475b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->summedp_weights, 8.0); 1476ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1477ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\t" 1478ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang "VPXSSIM\tVPSSIMP\t Time(ms)\n"); 1479ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(f, "%7.2f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%8.0f\n", 1480ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang dr, cpi->total / cpi->count, total_psnr, 1481b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->totalp / cpi->count, totalp_psnr, total_ssim, totalp_ssim, 1482ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang total_encode_time); 1483ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1484ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1485ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->b_calculate_ssimg) { 1486ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(f, "BitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t Time(ms)\n"); 1487ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(f, "%7.2f\t%6.4f\t%6.4f\t%6.4f\t%6.4f\t%8.0f\n", dr, 14885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cpi->total_ssimg_y / cpi->count, 14895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cpi->total_ssimg_u / cpi->count, 14905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cpi->total_ssimg_v / cpi->count, 14915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cpi->total_ssimg_all / cpi->count, total_encode_time); 1492ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1493ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1494ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fclose(f); 1495ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1496ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1497ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 1498ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 14991184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#ifdef MODE_TEST_HIT_STATS 15001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (cpi->pass != 1) { 15011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang double norm_per_pixel_mode_tests = 0; 15021184aebb761cbeac9124c37189a80a1a58f04b6bhkuang double norm_counts[BLOCK_SIZES]; 15031184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int i; 15041184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int sb64_per_frame; 15051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int norm_factors[BLOCK_SIZES] = 15061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang {256, 128, 128, 64, 32, 32, 16, 8, 8, 4, 2, 2, 1}; 15071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang FILE *f = fopen("mode_hit_stats.stt", "a"); 15081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 15091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // On average, how many mode tests do we do 15101184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (i = 0; i < BLOCK_SIZES; ++i) { 15111184aebb761cbeac9124c37189a80a1a58f04b6bhkuang norm_counts[i] = (double)cpi->mode_test_hits[i] / 15121184aebb761cbeac9124c37189a80a1a58f04b6bhkuang (double)norm_factors[i]; 15131184aebb761cbeac9124c37189a80a1a58f04b6bhkuang norm_per_pixel_mode_tests += norm_counts[i]; 15141184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 15151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Convert to a number per 64x64 and per frame 15161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang sb64_per_frame = ((cpi->common.height + 63) / 64) * 15171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ((cpi->common.width + 63) / 64); 15181184aebb761cbeac9124c37189a80a1a58f04b6bhkuang norm_per_pixel_mode_tests = 15191184aebb761cbeac9124c37189a80a1a58f04b6bhkuang norm_per_pixel_mode_tests / 15201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang (double)(cpi->common.current_video_frame * sb64_per_frame); 15211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 15221184aebb761cbeac9124c37189a80a1a58f04b6bhkuang fprintf(f, "%6.4f\n", norm_per_pixel_mode_tests); 15231184aebb761cbeac9124c37189a80a1a58f04b6bhkuang fclose(f); 15241184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 15251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#endif 15261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1527ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if 0 1528ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang { 1529ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000); 1530ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang printf("\n_frames recive_data encod_mb_row compress_frame Total\n"); 1531f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang printf("%6d %10ld %10ld %10ld %10ld\n", cpi->common.current_video_frame, 1532f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang cpi->time_receive_data / 1000, cpi->time_encode_sb_row / 1000, 1533f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang cpi->time_compress_data / 1000, 1534f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang (cpi->time_receive_data + cpi->time_compress_data) / 1000); 1535ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1536ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 1537ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1538ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 15395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang free_pick_mode_context(&cpi->mb); 1540ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang dealloc_compressor_data(cpi); 1541ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_free(cpi->mb.ss); 1542ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_free(cpi->tok); 1543ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 15445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang for (i = 0; i < sizeof(cpi->mbgraph_stats) / 15455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang sizeof(cpi->mbgraph_stats[0]); ++i) { 1546ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_free(cpi->mbgraph_stats[i].mb_stats); 1547ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1548ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1549ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_remove_common(&cpi->common); 1550ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_free(cpi); 1551ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1552ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef OUTPUT_YUV_SRC 1553ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fclose(yuv_file); 1554ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 1555ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef OUTPUT_YUV_REC 1556ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fclose(yuv_rec_file); 1557ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 1558ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1559ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if 0 1560ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1561ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (keyfile) 1562ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fclose(keyfile); 1563ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1564ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (framepsnr) 1565ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fclose(framepsnr); 1566ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1567ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (kf_list) 1568ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fclose(kf_list); 1569ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1570ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 1571ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 15726ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic int64_t get_sse(const uint8_t *a, int a_stride, 15736ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const uint8_t *b, int b_stride, 15746ac915abcdb404a00d927fe6308a47fcf09d9519hkuang int width, int height) { 15756ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const int dw = width % 16; 15766ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const int dh = height % 16; 15776ac915abcdb404a00d927fe6308a47fcf09d9519hkuang int64_t total_sse = 0; 15786ac915abcdb404a00d927fe6308a47fcf09d9519hkuang unsigned int sse = 0; 15796ac915abcdb404a00d927fe6308a47fcf09d9519hkuang int sum = 0; 15806ac915abcdb404a00d927fe6308a47fcf09d9519hkuang int x, y; 15816ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 15826ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (dw > 0) { 15836ac915abcdb404a00d927fe6308a47fcf09d9519hkuang variance(&a[width - dw], a_stride, &b[width - dw], b_stride, 15846ac915abcdb404a00d927fe6308a47fcf09d9519hkuang dw, height, &sse, &sum); 15856ac915abcdb404a00d927fe6308a47fcf09d9519hkuang total_sse += sse; 15866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang } 1587ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 15886ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (dh > 0) { 15896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang variance(&a[(height - dh) * a_stride], a_stride, 15906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang &b[(height - dh) * b_stride], b_stride, 15916ac915abcdb404a00d927fe6308a47fcf09d9519hkuang width - dw, dh, &sse, &sum); 15926ac915abcdb404a00d927fe6308a47fcf09d9519hkuang total_sse += sse; 15936ac915abcdb404a00d927fe6308a47fcf09d9519hkuang } 1594ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 15956ac915abcdb404a00d927fe6308a47fcf09d9519hkuang for (y = 0; y < height / 16; ++y) { 15966ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const uint8_t *pa = a; 15976ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const uint8_t *pb = b; 15986ac915abcdb404a00d927fe6308a47fcf09d9519hkuang for (x = 0; x < width / 16; ++x) { 15996ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_mse16x16(pa, a_stride, pb, b_stride, &sse); 1600ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang total_sse += sse; 1601ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 16026ac915abcdb404a00d927fe6308a47fcf09d9519hkuang pa += 16; 16036ac915abcdb404a00d927fe6308a47fcf09d9519hkuang pb += 16; 1604ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1605ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 16066ac915abcdb404a00d927fe6308a47fcf09d9519hkuang a += 16 * a_stride; 16076ac915abcdb404a00d927fe6308a47fcf09d9519hkuang b += 16 * b_stride; 1608ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1609ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1610ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return total_sse; 1611ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 1612ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1613b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef struct { 1614b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian double psnr[4]; // total/y/u/v 1615b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint64_t sse[4]; // total/y/u/v 1616b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint32_t samples[4]; // total/y/u/v 1617b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} PSNR_STATS; 1618b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1619b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void calc_psnr(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b, 1620b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian PSNR_STATS *psnr) { 1621b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int widths[3] = {a->y_width, a->uv_width, a->uv_width }; 1622b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int heights[3] = {a->y_height, a->uv_height, a->uv_height}; 1623b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const uint8_t *a_planes[3] = {a->y_buffer, a->u_buffer, a->v_buffer }; 1624b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int a_strides[3] = {a->y_stride, a->uv_stride, a->uv_stride}; 1625b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const uint8_t *b_planes[3] = {b->y_buffer, b->u_buffer, b->v_buffer }; 1626b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int b_strides[3] = {b->y_stride, b->uv_stride, b->uv_stride}; 1627b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int i; 1628b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint64_t total_sse = 0; 1629b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint32_t total_samples = 0; 1630ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1631b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (i = 0; i < 3; ++i) { 1632b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int w = widths[i]; 1633b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int h = heights[i]; 1634b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const uint32_t samples = w * h; 16356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const uint64_t sse = get_sse(a_planes[i], a_strides[i], 16366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang b_planes[i], b_strides[i], 16376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang w, h); 1638b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian psnr->sse[1 + i] = sse; 1639b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian psnr->samples[1 + i] = samples; 1640b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian psnr->psnr[1 + i] = vpx_sse_to_psnr(samples, 255.0, (double)sse); 1641ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1642b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian total_sse += sse; 1643b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian total_samples += samples; 1644b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 1645ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1646b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian psnr->sse[0] = total_sse; 1647b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian psnr->samples[0] = total_samples; 1648b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian psnr->psnr[0] = vpx_sse_to_psnr((double)total_samples, 255.0, 1649b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian (double)total_sse); 1650ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 1651ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1652b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void generate_psnr_packet(VP9_COMP *cpi) { 1653b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct vpx_codec_cx_pkt pkt; 1654b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int i; 1655b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian PSNR_STATS psnr; 1656b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian calc_psnr(cpi->Source, cpi->common.frame_to_show, &psnr); 1657b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (i = 0; i < 4; ++i) { 1658b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian pkt.data.psnr.samples[i] = psnr.samples[i]; 1659b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian pkt.data.psnr.sse[i] = psnr.sse[i]; 1660b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian pkt.data.psnr.psnr[i] = psnr.psnr[i]; 1661b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 1662b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian pkt.kind = VPX_CODEC_PSNR_PKT; 1663b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt); 1664b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 1665ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1666b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_use_as_reference(VP9_COMP *cpi, int ref_frame_flags) { 1667ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (ref_frame_flags > 7) 1668ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1; 1669ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1670ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->ref_frame_flags = ref_frame_flags; 1671ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 0; 1672ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 1673ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1674a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianvoid vp9_update_reference(VP9_COMP *cpi, int ref_frame_flags) { 1675a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cpi->ext_refresh_golden_frame = (ref_frame_flags & VP9_GOLD_FLAG) != 0; 1676a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cpi->ext_refresh_alt_ref_frame = (ref_frame_flags & VP9_ALT_FLAG) != 0; 1677a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cpi->ext_refresh_last_frame = (ref_frame_flags & VP9_LAST_FLAG) != 0; 1678b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->ext_refresh_frame_flags_pending = 1; 1679ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 1680ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1681b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic YV12_BUFFER_CONFIG *get_vp9_ref_frame_buffer(VP9_COMP *cpi, 1682b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_REFFRAME ref_frame_flag) { 1683b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian MV_REFERENCE_FRAME ref_frame = NONE; 1684ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (ref_frame_flag == VP9_LAST_FLAG) 1685b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian ref_frame = LAST_FRAME; 1686ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (ref_frame_flag == VP9_GOLD_FLAG) 1687b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian ref_frame = GOLDEN_FRAME; 1688ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (ref_frame_flag == VP9_ALT_FLAG) 1689b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian ref_frame = ALTREF_FRAME; 1690ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1691b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return ref_frame == NONE ? NULL : get_ref_frame_buffer(cpi, ref_frame); 1692b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 1693ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1694b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_copy_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag, 1695b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian YV12_BUFFER_CONFIG *sd) { 1696b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag); 1697b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cfg) { 1698b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp8_yv12_copy_frame(cfg, sd); 1699b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return 0; 1700b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else { 1701b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return -1; 1702b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 1703ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 1704ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1705b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_get_reference_enc(VP9_COMP *cpi, int index, YV12_BUFFER_CONFIG **fb) { 1706ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *cm = &cpi->common; 1707ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1708b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (index < 0 || index >= REF_FRAMES) 1709ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1; 1710ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1711b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *fb = &cm->frame_bufs[cm->ref_frame_map[index]].buf; 1712ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 0; 1713ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 1714ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1715b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_set_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag, 1716ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang YV12_BUFFER_CONFIG *sd) { 1717b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag); 1718b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cfg) { 1719b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp8_yv12_copy_frame(sd, cfg); 1720b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return 0; 1721b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else { 1722ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1; 1723b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 1724ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 1725b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1726b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_update_entropy(VP9_COMP * cpi, int update) { 1727b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->ext_refresh_frame_context = update; 1728b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->ext_refresh_frame_context_pending = 1; 1729ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 0; 1730ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 1731ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1732ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1733ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef OUTPUT_YUV_SRC 1734ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_write_yuv_frame(YV12_BUFFER_CONFIG *s) { 1735ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang uint8_t *src = s->y_buffer; 1736ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int h = s->y_height; 1737ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1738ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang do { 1739ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fwrite(src, s->y_width, 1, yuv_file); 1740ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src += s->y_stride; 1741ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } while (--h); 1742ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1743ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src = s->u_buffer; 1744ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang h = s->uv_height; 1745ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1746ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang do { 1747ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fwrite(src, s->uv_width, 1, yuv_file); 1748ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src += s->uv_stride; 1749ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } while (--h); 1750ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1751ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src = s->v_buffer; 1752ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang h = s->uv_height; 1753ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1754ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang do { 1755ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fwrite(src, s->uv_width, 1, yuv_file); 1756ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src += s->uv_stride; 1757ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } while (--h); 1758ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 1759ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 1760ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1761ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef OUTPUT_YUV_REC 1762ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_write_yuv_rec_frame(VP9_COMMON *cm) { 1763ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang YV12_BUFFER_CONFIG *s = cm->frame_to_show; 1764ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang uint8_t *src = s->y_buffer; 1765ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int h = cm->height; 1766ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1767ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang do { 1768ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fwrite(src, s->y_width, 1, yuv_rec_file); 1769ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src += s->y_stride; 1770ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } while (--h); 1771ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1772ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src = s->u_buffer; 1773ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang h = s->uv_height; 1774ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1775ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang do { 1776ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fwrite(src, s->uv_width, 1, yuv_rec_file); 1777ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src += s->uv_stride; 1778ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } while (--h); 1779ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1780ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src = s->v_buffer; 1781ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang h = s->uv_height; 1782ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1783ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang do { 1784ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fwrite(src, s->uv_width, 1, yuv_rec_file); 1785ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src += s->uv_stride; 1786ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } while (--h); 1787ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1788ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_ALPHA 1789ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (s->alpha_buffer) { 1790ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src = s->alpha_buffer; 1791ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang h = s->alpha_height; 1792ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang do { 1793ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fwrite(src, s->alpha_width, 1, yuv_rec_file); 1794ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src += s->alpha_stride; 1795ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } while (--h); 1796ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1797ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 1798ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1799ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fflush(yuv_rec_file); 1800ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 1801ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 1802ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1803b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void scale_and_extend_frame_nonnormative(YV12_BUFFER_CONFIG *src_fb, 1804b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian YV12_BUFFER_CONFIG *dst_fb) { 1805b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int in_w = src_fb->y_crop_width; 1806b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int in_h = src_fb->y_crop_height; 1807b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int out_w = dst_fb->y_crop_width; 1808b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int out_h = dst_fb->y_crop_height; 1809b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int in_w_uv = src_fb->uv_crop_width; 1810b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int in_h_uv = src_fb->uv_crop_height; 1811b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int out_w_uv = dst_fb->uv_crop_width; 1812b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int out_h_uv = dst_fb->uv_crop_height; 1813b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int i; 1814b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1815b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint8_t *srcs[4] = {src_fb->y_buffer, src_fb->u_buffer, src_fb->v_buffer, 1816b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian src_fb->alpha_buffer}; 1817b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int src_strides[4] = {src_fb->y_stride, src_fb->uv_stride, src_fb->uv_stride, 1818b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian src_fb->alpha_stride}; 1819b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1820b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint8_t *dsts[4] = {dst_fb->y_buffer, dst_fb->u_buffer, dst_fb->v_buffer, 1821b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian dst_fb->alpha_buffer}; 1822b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int dst_strides[4] = {dst_fb->y_stride, dst_fb->uv_stride, dst_fb->uv_stride, 1823b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian dst_fb->alpha_stride}; 1824b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1825b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (i = 0; i < MAX_MB_PLANE; ++i) { 1826b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (i == 0 || i == 3) { 1827b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Y and alpha planes 1828b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_resize_plane(srcs[i], in_h, in_w, src_strides[i], 1829b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian dsts[i], out_h, out_w, dst_strides[i]); 1830b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else { 1831b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Chroma planes 1832b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_resize_plane(srcs[i], in_h_uv, in_w_uv, src_strides[i], 1833b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian dsts[i], out_h_uv, out_w_uv, dst_strides[i]); 1834b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 1835b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 1836b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp8_yv12_extend_frame_borders(dst_fb); 1837b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 1838b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1839ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void scale_and_extend_frame(YV12_BUFFER_CONFIG *src_fb, 1840ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang YV12_BUFFER_CONFIG *dst_fb) { 1841ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int in_w = src_fb->y_crop_width; 1842ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int in_h = src_fb->y_crop_height; 1843ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int out_w = dst_fb->y_crop_width; 1844ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int out_h = dst_fb->y_crop_height; 1845ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int x, y, i; 1846ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1847ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang uint8_t *srcs[4] = {src_fb->y_buffer, src_fb->u_buffer, src_fb->v_buffer, 1848ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src_fb->alpha_buffer}; 1849ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int src_strides[4] = {src_fb->y_stride, src_fb->uv_stride, src_fb->uv_stride, 1850ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src_fb->alpha_stride}; 1851ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1852ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang uint8_t *dsts[4] = {dst_fb->y_buffer, dst_fb->u_buffer, dst_fb->v_buffer, 1853ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang dst_fb->alpha_buffer}; 1854ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int dst_strides[4] = {dst_fb->y_stride, dst_fb->uv_stride, dst_fb->uv_stride, 1855ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang dst_fb->alpha_stride}; 1856ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1857ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (y = 0; y < out_h; y += 16) { 1858ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (x = 0; x < out_w; x += 16) { 1859ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < MAX_MB_PLANE; ++i) { 1860b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int factor = (i == 0 || i == 3 ? 1 : 2); 1861ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int x_q4 = x * (16 / factor) * in_w / out_w; 1862ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int y_q4 = y * (16 / factor) * in_h / out_h; 1863ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int src_stride = src_strides[i]; 1864ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int dst_stride = dst_strides[i]; 1865ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang uint8_t *src = srcs[i] + y / factor * in_h / out_h * src_stride + 1866ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x / factor * in_w / out_w; 1867ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang uint8_t *dst = dsts[i] + y / factor * dst_stride + x / factor; 1868ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1869ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_convolve8(src, src_stride, dst, dst_stride, 1870ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sub_pel_filters_8[x_q4 & 0xf], 16 * in_w / out_w, 1871ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_sub_pel_filters_8[y_q4 & 0xf], 16 * in_h / out_h, 1872ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 16 / factor, 16 / factor); 1873ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1874ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1875ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1876ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1877ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp8_yv12_extend_frame_borders(dst_fb); 1878ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 1879ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1880ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic int find_fp_qindex() { 1881ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 1882ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1883ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < QINDEX_RANGE; i++) { 1884ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (vp9_convert_qindex_to_q(i) >= 30.0) { 1885ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 1886ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1887ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1888ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1889ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (i == QINDEX_RANGE) 1890ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang i--; 1891ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1892ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return i; 1893ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 1894ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1895ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define WRITE_RECON_BUFFER 0 1896ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if WRITE_RECON_BUFFER 1897ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame) { 1898ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FILE *yframe; 1899ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 1900ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang char filename[255]; 1901ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 19025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang snprintf(filename, sizeof(filename), "cx\\y%04d.raw", this_frame); 1903ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang yframe = fopen(filename, "wb"); 1904ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1905ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < frame->y_height; i++) 1906ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fwrite(frame->y_buffer + i * frame->y_stride, 1907ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang frame->y_width, 1, yframe); 1908ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1909ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fclose(yframe); 19105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang snprintf(filename, sizeof(filename), "cx\\u%04d.raw", this_frame); 1911ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang yframe = fopen(filename, "wb"); 1912ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1913ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < frame->uv_height; i++) 1914ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fwrite(frame->u_buffer + i * frame->uv_stride, 1915ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang frame->uv_width, 1, yframe); 1916ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1917ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fclose(yframe); 19185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang snprintf(filename, sizeof(filename), "cx\\v%04d.raw", this_frame); 1919ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang yframe = fopen(filename, "wb"); 1920ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1921ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < frame->uv_height; i++) 1922ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fwrite(frame->v_buffer + i * frame->uv_stride, 1923ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang frame->uv_width, 1, yframe); 1924ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1925ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fclose(yframe); 1926ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 1927ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 1928ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1929ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// Function to test for conditions that indicate we should loop 1930ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// back and recode a frame. 1931b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic int recode_loop_test(const VP9_COMP *cpi, 1932ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int high_limit, int low_limit, 1933ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int q, int maxq, int minq) { 1934b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const VP9_COMMON *const cm = &cpi->common; 1935b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const RATE_CONTROL *const rc = &cpi->rc; 1936ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int force_recode = 0; 1937ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1938b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Special case trap if maximum allowed frame size exceeded. 1939b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (rc->projected_frame_size > rc->max_frame_bandwidth) { 1940b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian force_recode = 1; 1941b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1942b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Is frame recode allowed. 1943b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Yes if either recode mode 1 is selected or mode 2 is selected 1944b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // and the frame is a key frame, golden frame or alt_ref_frame 1945b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else if ((cpi->sf.recode_loop == ALLOW_RECODE) || 1946b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian ((cpi->sf.recode_loop == ALLOW_RECODE_KFARFGF) && 1947b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian (cm->frame_type == KEY_FRAME || 1948b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame))) { 1949ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // General over and under shoot tests 1950b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if ((rc->projected_frame_size > high_limit && q < maxq) || 1951b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian (rc->projected_frame_size < low_limit && q > minq)) { 1952ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang force_recode = 1; 19535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) { 19545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // Deal with frame undershoot and whether or not we are 19555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // below the automatically set cq level. 1956ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (q > cpi->cq_target_quality && 1957b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian rc->projected_frame_size < ((rc->this_frame_target * 7) >> 3)) { 1958ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang force_recode = 1; 1959ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1960ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1961ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1962ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return force_recode; 1963ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 1964ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1965a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianvoid vp9_update_reference_frames(VP9_COMP *cpi) { 1966ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON * const cm = &cpi->common; 1967ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1968ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // At this point the new frame has been encoded. 1969ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // If any buffer copy / swapping is signaled it should be done here. 1970ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->frame_type == KEY_FRAME) { 1971b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian ref_cnt_fb(cm->frame_bufs, 1972ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang &cm->ref_frame_map[cpi->gld_fb_idx], cm->new_fb_idx); 1973b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian ref_cnt_fb(cm->frame_bufs, 1974ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang &cm->ref_frame_map[cpi->alt_fb_idx], cm->new_fb_idx); 1975ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1976ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF 1977ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (!cpi->multi_arf_enabled && cpi->refresh_golden_frame && 1978ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang !cpi->refresh_alt_ref_frame) { 1979ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else 19801184aebb761cbeac9124c37189a80a1a58f04b6bhkuang else if (cpi->refresh_golden_frame && !cpi->refresh_alt_ref_frame && 19811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang !cpi->use_svc) { 1982ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 1983ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Preserve the previously existing golden frame and update the frame in 1984ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * the alt ref slot instead. This is highly specific to the current use of 1985ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * alt-ref as a forward reference, and this needs to be generalized as 1986ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * other uses are implemented (like RTC/temporal scaling) 1987ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * 1988ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * The update to the buffer in the alt ref slot was signaled in 1989ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * vp9_pack_bitstream(), now swap the buffer pointers so that it's treated 1990ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * as the golden frame next time. 1991ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 1992ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int tmp; 1993ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1994b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian ref_cnt_fb(cm->frame_bufs, 1995ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang &cm->ref_frame_map[cpi->alt_fb_idx], cm->new_fb_idx); 1996ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1997ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tmp = cpi->alt_fb_idx; 1998ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->alt_fb_idx = cpi->gld_fb_idx; 1999ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->gld_fb_idx = tmp; 2000ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { /* For non key/golden frames */ 2001ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->refresh_alt_ref_frame) { 2002ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int arf_idx = cpi->alt_fb_idx; 2003ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF 2004ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->multi_arf_enabled) { 2005ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang arf_idx = cpi->arf_buffer_idx[cpi->sequence_number + 1]; 2006ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2007ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 2008b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian ref_cnt_fb(cm->frame_bufs, 2009ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang &cm->ref_frame_map[arf_idx], cm->new_fb_idx); 2010ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2011ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2012ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->refresh_golden_frame) { 2013b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian ref_cnt_fb(cm->frame_bufs, 2014ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang &cm->ref_frame_map[cpi->gld_fb_idx], cm->new_fb_idx); 2015ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2016ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2017ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2018ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->refresh_last_frame) { 2019b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian ref_cnt_fb(cm->frame_bufs, 2020ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang &cm->ref_frame_map[cpi->lst_fb_idx], cm->new_fb_idx); 2021ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2022ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 2023ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2024ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) { 202591037db265ecdd914a26e056cf69207b4f50924ehkuang MACROBLOCKD *xd = &cpi->mb.e_mbd; 20261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang struct loopfilter *lf = &cm->lf; 202791037db265ecdd914a26e056cf69207b4f50924ehkuang if (xd->lossless) { 2028f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang lf->filter_level = 0; 2029ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 2030ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct vpx_usec_timer timer; 2031ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2032ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_clear_system_state(); 2033ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2034ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_usec_timer_start(&timer); 2035ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 20366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_pick_filter_level(cpi->Source, cpi, cpi->sf.lpf_pick); 2037ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2038ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_usec_timer_mark(&timer); 2039ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer); 2040ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2041ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2042f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang if (lf->filter_level > 0) { 20431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vp9_loop_filter_frame(cm, xd, lf->filter_level, 0, 0); 2044ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2045ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2046b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_extend_frame_inner_borders(cm->frame_to_show); 2047ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 2048ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2049a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianvoid vp9_scale_references(VP9_COMP *cpi) { 2050ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *cm = &cpi->common; 2051b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian MV_REFERENCE_FRAME ref_frame; 2052ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2053b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) { 2054b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)]; 2055b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian YV12_BUFFER_CONFIG *const ref = &cm->frame_bufs[idx].buf; 2056ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2057ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (ref->y_crop_width != cm->width || 2058ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ref->y_crop_height != cm->height) { 2059b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int new_fb = get_free_fb(cm); 2060b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_realloc_frame_buffer(&cm->frame_bufs[new_fb].buf, 2061ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->width, cm->height, 2062ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->subsampling_x, cm->subsampling_y, 2063b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL); 2064b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian scale_and_extend_frame(ref, &cm->frame_bufs[new_fb].buf); 2065b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->scaled_ref_idx[ref_frame - 1] = new_fb; 2066ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 2067b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->scaled_ref_idx[ref_frame - 1] = idx; 2068b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->frame_bufs[idx].ref_count++; 2069ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2070ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2071ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 2072ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2073ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void release_scaled_references(VP9_COMP *cpi) { 2074ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *cm = &cpi->common; 2075ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 2076ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2077ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < 3; i++) 2078b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->frame_bufs[cpi->scaled_ref_idx[i]].ref_count--; 2079ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 2080ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 208191037db265ecdd914a26e056cf69207b4f50924ehkuangstatic void full_to_model_count(unsigned int *model_count, 208291037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned int *full_count) { 208391037db265ecdd914a26e056cf69207b4f50924ehkuang int n; 208491037db265ecdd914a26e056cf69207b4f50924ehkuang model_count[ZERO_TOKEN] = full_count[ZERO_TOKEN]; 208591037db265ecdd914a26e056cf69207b4f50924ehkuang model_count[ONE_TOKEN] = full_count[ONE_TOKEN]; 208691037db265ecdd914a26e056cf69207b4f50924ehkuang model_count[TWO_TOKEN] = full_count[TWO_TOKEN]; 2087b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (n = THREE_TOKEN; n < EOB_TOKEN; ++n) 208891037db265ecdd914a26e056cf69207b4f50924ehkuang model_count[TWO_TOKEN] += full_count[n]; 2089b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian model_count[EOB_MODEL_TOKEN] = full_count[EOB_TOKEN]; 209091037db265ecdd914a26e056cf69207b4f50924ehkuang} 209191037db265ecdd914a26e056cf69207b4f50924ehkuang 2092b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void full_to_model_counts(vp9_coeff_count_model *model_count, 2093b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_coeff_count *full_count) { 209491037db265ecdd914a26e056cf69207b4f50924ehkuang int i, j, k, l; 2095b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2096b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (i = 0; i < PLANE_TYPES; ++i) 209791037db265ecdd914a26e056cf69207b4f50924ehkuang for (j = 0; j < REF_TYPES; ++j) 209891037db265ecdd914a26e056cf69207b4f50924ehkuang for (k = 0; k < COEF_BANDS; ++k) 2099b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) 210091037db265ecdd914a26e056cf69207b4f50924ehkuang full_to_model_count(model_count[i][j][k][l], full_count[i][j][k][l]); 210191037db265ecdd914a26e056cf69207b4f50924ehkuang} 210291037db265ecdd914a26e056cf69207b4f50924ehkuang 21035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if 0 && CONFIG_INTERNAL_STATS 21045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void output_frame_level_debug_stats(VP9_COMP *cpi) { 21055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang VP9_COMMON *const cm = &cpi->common; 21065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang FILE *const f = fopen("tmp.stt", cm->current_video_frame ? "a" : "w"); 21075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int recon_err; 210891037db265ecdd914a26e056cf69207b4f50924ehkuang 2109b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_clear_system_state(); 2110ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 21116ac915abcdb404a00d927fe6308a47fcf09d9519hkuang recon_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm)); 21125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 21135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (cpi->twopass.total_left_stats.coded_error != 0.0) 2114b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian fprintf(f, "%10u %10d %10d %10d %10d %10d " 2115b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian "%10"PRId64" %10"PRId64" %10d " 2116b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian "%7.2lf %7.2lf %7.2lf %7.2lf %7.2lf" 2117b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian "%6d %6d %5d %5d %5d " 2118b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian "%10"PRId64" %10.3lf" 2119b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian "%10lf %8u %10d %10d %10d\n", 2120b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->common.current_video_frame, cpi->rc.this_frame_target, 2121b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->rc.projected_frame_size, 2122b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->rc.projected_frame_size / cpi->common.MBs, 2123b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian (cpi->rc.projected_frame_size - cpi->rc.this_frame_target), 2124b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->rc.total_target_vs_actual, 2125b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian (cpi->oxcf.starting_buffer_level - cpi->rc.bits_off_target), 2126b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->rc.total_actual_bits, cm->base_qindex, 21275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vp9_convert_qindex_to_q(cm->base_qindex), 21285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang (double)vp9_dc_quant(cm->base_qindex, 0) / 4.0, 2129b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->rc.avg_q, 2130b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_convert_qindex_to_q(cpi->rc.ni_av_qi), 21315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vp9_convert_qindex_to_q(cpi->cq_target_quality), 21325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cpi->refresh_last_frame, cpi->refresh_golden_frame, 2133b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->refresh_alt_ref_frame, cm->frame_type, cpi->rc.gfu_boost, 2134b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->twopass.bits_left, 21355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cpi->twopass.total_left_stats.coded_error, 2136b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->twopass.bits_left / 21375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang (1 + cpi->twopass.total_left_stats.coded_error), 2138b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->tot_recode_hits, recon_err, cpi->rc.kf_boost, 2139b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->twopass.kf_zeromotion_pct); 214091037db265ecdd914a26e056cf69207b4f50924ehkuang 21415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang fclose(f); 2142ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 21435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (0) { 21445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang FILE *const fmodes = fopen("Modes.stt", "a"); 21455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int i; 2146ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 21475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang fprintf(fmodes, "%6d:%1d:%1d:%1d ", cpi->common.current_video_frame, 21485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->frame_type, cpi->refresh_golden_frame, 21495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cpi->refresh_alt_ref_frame); 2150ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 21515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang for (i = 0; i < MAX_MODES; ++i) 21525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang fprintf(fmodes, "%5d ", cpi->mode_chosen_counts[i]); 2153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 21545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang fprintf(fmodes, "\n"); 2155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 21565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang fclose(fmodes); 2157ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 21585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang} 21595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif 2160ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2161b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void encode_without_recode_loop(VP9_COMP *cpi, 2162b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian size_t *size, 2163b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint8_t *dest, 2164b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int q) { 21655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang VP9_COMMON *const cm = &cpi->common; 2166b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_clear_system_state(); 21676ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_set_quantizer(cm, q); 2168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2169b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Set up entropy context depending on frame type. The decoder mandates 2170b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // the use of the default context, index 0, for keyframes and inter 2171b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // frames where the error_resilient_mode or intra_only flag is set. For 2172b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // other inter-frames the encoder currently uses only two contexts; 2173b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // context 1 for ALTREF frames and context 0 for the others. 2174b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cm->frame_type == KEY_FRAME) { 21756ac915abcdb404a00d927fe6308a47fcf09d9519hkuang setup_key_frame(cpi); 2176ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 21776ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (!cm->intra_only && !cm->error_resilient_mode && !cpi->use_svc) 21786ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->frame_context_idx = cpi->refresh_alt_ref_frame; 21796ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 21806ac915abcdb404a00d927fe6308a47fcf09d9519hkuang setup_inter_frame(cm); 2181ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2182b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Variance adaptive and in frame q adjustment experiments are mutually 2183b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // exclusive. 2184b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->oxcf.aq_mode == VARIANCE_AQ) { 2185b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_vaq_frame_setup(cpi); 2186b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) { 21876ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_setup_in_frame_q_adj(cpi); 2188a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian } else if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) { 21896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_cyclic_refresh_setup(cpi); 2190ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2191b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // transform / motion compensation build reconstruction frame 2192b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_encode_frame(cpi); 2193ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2194b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Update the skip mb flag probabilities based on the distribution 2195b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // seen in the last encoder iteration. 2196b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // update_base_skip_probs(cpi); 2197b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_clear_system_state(); 21985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang} 21995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 2200b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void encode_with_recode_loop(VP9_COMP *cpi, 2201b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian size_t *size, 2202b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint8_t *dest, 2203b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int q, 2204b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int bottom_index, 2205b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int top_index) { 2206b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_COMMON *const cm = &cpi->common; 2207b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian RATE_CONTROL *const rc = &cpi->rc; 2208b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int loop_count = 0; 22095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int loop = 0; 22105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int overshoot_seen = 0; 22115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int undershoot_seen = 0; 2212b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int q_low = bottom_index, q_high = top_index; 2213b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int frame_over_shoot_limit; 2214b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int frame_under_shoot_limit; 22155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 2216b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Decide frame size bounds 2217b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_rc_compute_frame_size_bounds(cpi, rc->this_frame_target, 2218b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian &frame_under_shoot_limit, 2219b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian &frame_over_shoot_limit); 2220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang do { 2222b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_clear_system_state(); 2223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 22246ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_set_quantizer(cm, q); 2225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (loop_count == 0) { 22275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // Set up entropy context depending on frame type. The decoder mandates 22285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // the use of the default context, index 0, for keyframes and inter 22295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // frames where the error_resilient_mode or intra_only flag is set. For 22305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // other inter-frames the encoder currently uses only two contexts; 22315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // context 1 for ALTREF frames and context 0 for the others. 2232ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->frame_type == KEY_FRAME) { 22336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang setup_key_frame(cpi); 2234ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 22356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (!cm->intra_only && !cm->error_resilient_mode && !cpi->use_svc) 22365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cpi->common.frame_context_idx = cpi->refresh_alt_ref_frame; 22376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 22386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang setup_inter_frame(cm); 2239ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2240ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2241ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2242b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Variance adaptive and in frame q adjustment experiments are mutually 2243b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // exclusive. 2244b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->oxcf.aq_mode == VARIANCE_AQ) { 2245b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_vaq_frame_setup(cpi); 2246b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) { 22476ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_setup_in_frame_q_adj(cpi); 22485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 22495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 2250ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // transform / motion compensation build reconstruction frame 2251ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_encode_frame(cpi); 2252ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2253ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Update the skip mb flag probabilities based on the distribution 2254ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // seen in the last encoder iteration. 2255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // update_base_skip_probs(cpi); 2256ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2257b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_clear_system_state(); 2258ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2259ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Dummy pack of the bitstream using up to date stats to get an 2260ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // accurate estimate of output frame size to determine if we need 2261ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // to recode. 2262b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF) { 22636ac915abcdb404a00d927fe6308a47fcf09d9519hkuang save_coding_context(cpi); 2264b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->dummy_packing = 1; 2265b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (!cpi->sf.use_nonrd_pick_mode) 2266b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_pack_bitstream(cpi, dest, size); 2267b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2268b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian rc->projected_frame_size = (int)(*size) << 3; 22696ac915abcdb404a00d927fe6308a47fcf09d9519hkuang restore_coding_context(cpi); 2270ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2271b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (frame_over_shoot_limit == 0) 2272b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian frame_over_shoot_limit = 1; 2273b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2274ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 22751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) { 22761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang loop = 0; 22771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } else { 2278b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if ((cm->frame_type == KEY_FRAME) && 2279b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian rc->this_key_frame_forced && 2280b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian (rc->projected_frame_size < rc->max_frame_bandwidth)) { 22811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int last_q = q; 22826ac915abcdb404a00d927fe6308a47fcf09d9519hkuang int kf_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm)); 22831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 22841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int high_err_target = cpi->ambient_err; 22851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int low_err_target = cpi->ambient_err >> 1; 22861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 22871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Prevent possible divide by zero error below for perfect KF 22881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang kf_err += !kf_err; 22891184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 22901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // The key frame is not good enough or we can afford 22911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // to make it better without undue risk of popping. 22921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if ((kf_err > high_err_target && 2293b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian rc->projected_frame_size <= frame_over_shoot_limit) || 22941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang (kf_err > low_err_target && 2295b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian rc->projected_frame_size <= frame_under_shoot_limit)) { 22961184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Lower q_high 22971184aebb761cbeac9124c37189a80a1a58f04b6bhkuang q_high = q > q_low ? q - 1 : q_low; 22981184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 22991184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Adjust Q 23001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang q = (q * high_err_target) / kf_err; 23011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang q = MIN(q, (q_high + q_low) >> 1); 23021184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } else if (kf_err < low_err_target && 2303b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian rc->projected_frame_size >= frame_under_shoot_limit) { 23041184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // The key frame is much better than the previous frame 23051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Raise q_low 23061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang q_low = q < q_high ? q + 1 : q_high; 23071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 23081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Adjust Q 23091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang q = (q * low_err_target) / kf_err; 23101184aebb761cbeac9124c37189a80a1a58f04b6bhkuang q = MIN(q, (q_high + q_low + 1) >> 1); 23111184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 2312ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 23131184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Clamp Q to upper and lower limits: 23141184aebb761cbeac9124c37189a80a1a58f04b6bhkuang q = clamp(q, q_low, q_high); 23151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 23161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang loop = q != last_q; 23171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } else if (recode_loop_test( 23181184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cpi, frame_over_shoot_limit, frame_under_shoot_limit, 2319b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian q, MAX(q_high, top_index), bottom_index)) { 23201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Is the projected frame size out of range and are we allowed 23211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // to attempt to recode. 23221184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int last_q = q; 23231184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int retries = 0; 23241184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 23251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Frame size out of permitted range: 23261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Update correction factor & compute new Q to try... 23271184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 23281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Frame is too large 2329b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (rc->projected_frame_size > rc->this_frame_target) { 2330b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Special case if the projected size is > the max allowed. 2331b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (rc->projected_frame_size >= rc->max_frame_bandwidth) 2332b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian q_high = rc->worst_quality; 2333b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 23341184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Raise Qlow as to at least the current value 23351184aebb761cbeac9124c37189a80a1a58f04b6bhkuang q_low = q < q_high ? q + 1 : q_high; 23361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 23371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (undershoot_seen || loop_count > 1) { 23381184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Update rate_correction_factor unless 2339b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_rc_update_rate_correction_factors(cpi, 1); 23401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 23411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang q = (q_high + q_low + 1) / 2; 23421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } else { 23431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Update rate_correction_factor unless 2344b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_rc_update_rate_correction_factors(cpi, 0); 2345ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2346b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian q = vp9_rc_regulate_q(cpi, rc->this_frame_target, 2347b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian bottom_index, MAX(q_high, top_index)); 2348ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 23491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang while (q < q_low && retries < 10) { 2350b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_rc_update_rate_correction_factors(cpi, 0); 2351b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian q = vp9_rc_regulate_q(cpi, rc->this_frame_target, 2352b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian bottom_index, MAX(q_high, top_index)); 23531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang retries++; 23541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 23551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 2356ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 23571184aebb761cbeac9124c37189a80a1a58f04b6bhkuang overshoot_seen = 1; 2358ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 23591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Frame is too small 23601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang q_high = q > q_low ? q - 1 : q_low; 23611184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 23621184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (overshoot_seen || loop_count > 1) { 2363b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_rc_update_rate_correction_factors(cpi, 1); 23641184aebb761cbeac9124c37189a80a1a58f04b6bhkuang q = (q_high + q_low) / 2; 23651184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } else { 2366b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_rc_update_rate_correction_factors(cpi, 0); 2367b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian q = vp9_rc_regulate_q(cpi, rc->this_frame_target, 2368b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian bottom_index, top_index); 23691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Special case reset for qlow for constrained quality. 23701184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // This should only trigger where there is very substantial 23711184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // undershoot on a frame and the auto cq level is above 23721184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // the user passsed in value. 2373b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY && 2374b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian q < q_low) { 23751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang q_low = q; 23761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 2377ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 23781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang while (q > q_high && retries < 10) { 2379b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_rc_update_rate_correction_factors(cpi, 0); 2380b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian q = vp9_rc_regulate_q(cpi, rc->this_frame_target, 2381b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian bottom_index, top_index); 23821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang retries++; 23831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 2384ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2385ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 23861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang undershoot_seen = 1; 2387ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2388ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 23891184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Clamp Q to upper and lower limits: 23901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang q = clamp(q, q_low, q_high); 2391ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 23921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang loop = q != last_q; 23931184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } else { 23941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang loop = 0; 23951184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 2396ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2397ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2398b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Special case for overlay frame. 2399b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (rc->is_src_frame_alt_ref && 2400b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian rc->projected_frame_size < rc->max_frame_bandwidth) 2401ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang loop = 0; 2402ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2403ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (loop) { 2404ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang loop_count++; 2405ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2406ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_INTERNAL_STATS 2407ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->tot_recode_hits++; 2408ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 2409ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2410ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } while (loop); 2411b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 2412b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2413b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void get_ref_frame_flags(VP9_COMP *cpi) { 2414b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->refresh_last_frame & cpi->refresh_golden_frame) 2415b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->gold_is_last = 1; 2416b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian else if (cpi->refresh_last_frame ^ cpi->refresh_golden_frame) 2417b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->gold_is_last = 0; 2418b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2419b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->refresh_last_frame & cpi->refresh_alt_ref_frame) 2420b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->alt_is_last = 1; 2421b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian else if (cpi->refresh_last_frame ^ cpi->refresh_alt_ref_frame) 2422b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->alt_is_last = 0; 2423b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2424b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->refresh_alt_ref_frame & cpi->refresh_golden_frame) 2425b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->gold_is_alt = 1; 2426b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian else if (cpi->refresh_alt_ref_frame ^ cpi->refresh_golden_frame) 2427b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->gold_is_alt = 0; 2428b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2429b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->ref_frame_flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG; 2430b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2431b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->gold_is_last) 2432b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->ref_frame_flags &= ~VP9_GOLD_FLAG; 2433b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2434b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->rc.frames_till_gf_update_due == INT_MAX) 2435b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->ref_frame_flags &= ~VP9_GOLD_FLAG; 2436b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2437b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->alt_is_last) 2438b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->ref_frame_flags &= ~VP9_ALT_FLAG; 2439b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2440b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->gold_is_alt) 2441b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->ref_frame_flags &= ~VP9_ALT_FLAG; 2442b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 2443b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2444b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void set_ext_overrides(VP9_COMP *cpi) { 2445b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Overrides the defaults with the externally supplied values with 2446b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // vp9_update_reference() and vp9_update_entropy() calls 2447b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Note: The overrides are valid only for the next frame passed 2448b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // to encode_frame_to_data_rate() function 2449b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->ext_refresh_frame_context_pending) { 2450b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->common.refresh_frame_context = cpi->ext_refresh_frame_context; 2451b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->ext_refresh_frame_context_pending = 0; 2452b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2453b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->ext_refresh_frame_flags_pending) { 2454b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->refresh_last_frame = cpi->ext_refresh_last_frame; 2455b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->refresh_golden_frame = cpi->ext_refresh_golden_frame; 2456b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->refresh_alt_ref_frame = cpi->ext_refresh_alt_ref_frame; 2457b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->ext_refresh_frame_flags_pending = 0; 2458b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2459b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 2460b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2461b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void encode_frame_to_data_rate(VP9_COMP *cpi, 2462b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian size_t *size, 2463b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint8_t *dest, 2464b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int *frame_flags) { 2465b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_COMMON *const cm = &cpi->common; 2466b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian TX_SIZE t; 2467b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int q; 2468b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int top_index; 2469b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int bottom_index; 2470b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2471b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const SPEED_FEATURES *const sf = &cpi->sf; 2472b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const unsigned int max_mv_def = MIN(cm->width, cm->height); 2473b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct segmentation *const seg = &cm->seg; 2474b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2475b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian set_ext_overrides(cpi); 2476b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2477b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian /* Scale the source buffer, if required. */ 2478b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cm->mi_cols * MI_SIZE != cpi->un_scaled_source->y_width || 2479b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->mi_rows * MI_SIZE != cpi->un_scaled_source->y_height) { 2480b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian scale_and_extend_frame_nonnormative(cpi->un_scaled_source, 2481b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian &cpi->scaled_source); 2482b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->Source = &cpi->scaled_source; 2483b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else { 2484b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->Source = cpi->un_scaled_source; 2485b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 24866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 24876ac915abcdb404a00d927fe6308a47fcf09d9519hkuang // Scale the last source buffer, if required. 24886ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (cpi->unscaled_last_source != NULL) { 24896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (cm->mi_cols * MI_SIZE != cpi->unscaled_last_source->y_width || 24906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->mi_rows * MI_SIZE != cpi->unscaled_last_source->y_height) { 24916ac915abcdb404a00d927fe6308a47fcf09d9519hkuang scale_and_extend_frame_nonnormative(cpi->unscaled_last_source, 24926ac915abcdb404a00d927fe6308a47fcf09d9519hkuang &cpi->scaled_last_source); 24936ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->Last_Source = &cpi->scaled_last_source; 24946ac915abcdb404a00d927fe6308a47fcf09d9519hkuang } else { 24956ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->Last_Source = cpi->unscaled_last_source; 24966ac915abcdb404a00d927fe6308a47fcf09d9519hkuang } 24976ac915abcdb404a00d927fe6308a47fcf09d9519hkuang } 24986ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 2499a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vp9_scale_references(cpi); 2500b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2501b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_clear_system_state(); 2502b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2503b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Enable or disable mode based tweaking of the zbin. 2504b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // For 2 pass only used where GF/ARF prediction quality 2505b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // is above a threshold. 2506b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->zbin_mode_boost = 0; 2507b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->zbin_mode_boost_enabled = 0; 2508b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2509b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Current default encoder behavior for the altref sign bias. 2510b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->ref_frame_sign_bias[ALTREF_FRAME] = cpi->rc.source_alt_ref_active; 2511b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2512b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Set default state for segment based loop filter update flags. 2513b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->lf.mode_ref_delta_update = 0; 2514b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2515b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Initialize cpi->mv_step_param to default based on max resolution. 2516b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->mv_step_param = vp9_init_search_range(cpi, max_mv_def); 2517b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Initialize cpi->max_mv_magnitude and cpi->mv_step_param if appropriate. 2518b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (sf->auto_mv_step_size) { 2519b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (frame_is_intra_only(cm)) { 2520b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Initialize max_mv_magnitude for use in the first INTER frame 2521b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // after a key/intra-only frame. 2522b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->max_mv_magnitude = max_mv_def; 2523b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else { 2524b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cm->show_frame) 2525b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Allow mv_steps to correspond to twice the max mv magnitude found 2526b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // in the previous frame, capped by the default max_mv_magnitude based 2527b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // on resolution. 2528b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->mv_step_param = vp9_init_search_range(cpi, MIN(max_mv_def, 2 * 2529b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->max_mv_magnitude)); 2530b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->max_mv_magnitude = 0; 2531b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2532b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2533b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2534b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Set various flags etc to special state if it is a key frame. 2535b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (frame_is_intra_only(cm)) { 25366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang setup_key_frame(cpi); 2537b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Reset the loop filter deltas and segmentation map. 2538b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_reset_segment_features(&cm->seg); 2539b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2540b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // If segmentation is enabled force a map update for key frames. 2541b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (seg->enabled) { 2542b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian seg->update_map = 1; 2543b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian seg->update_data = 1; 2544b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2545b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2546b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // The alternate reference frame cannot be active for a key frame. 2547b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->rc.source_alt_ref_active = 0; 2548b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2549b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->error_resilient_mode = (cpi->oxcf.error_resilient_mode != 0); 2550b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->frame_parallel_decoding_mode = 2551b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian (cpi->oxcf.frame_parallel_decoding_mode != 0); 2552b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2553b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // By default, encoder assumes decoder can use prev_mi. 2554b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->coding_use_prev_mi = 1; 2555b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cm->error_resilient_mode) { 2556b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->coding_use_prev_mi = 0; 2557b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->frame_parallel_decoding_mode = 1; 2558b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->reset_frame_context = 0; 2559b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->refresh_frame_context = 0; 2560b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else if (cm->intra_only) { 2561b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Only reset the current context. 2562b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->reset_frame_context = 2; 2563b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2564b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2565b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2566b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Configure experimental use of segmentation for enhanced coding of 2567b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // static regions if indicated. 2568b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Only allowed in second pass of two pass (as requires lagged coding) 2569b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // and if the relevant speed feature flag is set. 2570b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->pass == 2 && cpi->sf.static_segmentation) 2571b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian configure_static_seg_features(cpi); 2572b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2573b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // For 1 pass CBR, check if we are dropping this frame. 2574b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Never drop on key frame. 2575b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->pass == 0 && 2576b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER && 2577b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->frame_type != KEY_FRAME) { 2578b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (vp9_rc_drop_frame(cpi)) { 2579b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_rc_postencode_update_drop_frame(cpi); 2580b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian ++cm->current_video_frame; 2581b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return; 2582b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2583b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2584b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2585b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_clear_system_state(); 2586b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2587b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_zero(cpi->rd_tx_select_threshes); 2588b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2589b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#if CONFIG_VP9_POSTPROC 2590b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->oxcf.noise_sensitivity > 0) { 2591b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int l = 0; 2592b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian switch (cpi->oxcf.noise_sensitivity) { 2593b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian case 1: 2594b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian l = 20; 2595b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian break; 2596b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian case 2: 2597b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian l = 40; 2598b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian break; 2599b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian case 3: 2600b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian l = 60; 2601b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian break; 2602b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian case 4: 2603b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian case 5: 2604b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian l = 100; 2605b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian break; 2606b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian case 6: 2607b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian l = 150; 2608b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian break; 2609b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2610b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_denoise(cpi->Source, cpi->Source, l); 2611b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2612b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 2613b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2614b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef OUTPUT_YUV_SRC 2615b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_write_yuv_frame(cpi->Source); 2616b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 2617b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 26186ac915abcdb404a00d927fe6308a47fcf09d9519hkuang set_speed_features(cpi); 26196ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 2620b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Decide q and q bounds. 2621b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian q = vp9_rc_pick_q_and_bounds(cpi, &bottom_index, &top_index); 2622b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2623b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (!frame_is_intra_only(cm)) { 2624b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->interp_filter = DEFAULT_INTERP_FILTER; 2625b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian /* TODO: Decide this more intelligently */ 2626b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian set_high_precision_mv(cpi, q < HIGH_PRECISION_MV_QTHRESH); 2627b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2628b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2629b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->sf.recode_loop == DISALLOW_RECODE) { 2630b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian encode_without_recode_loop(cpi, size, dest, q); 2631b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else { 2632b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian encode_with_recode_loop(cpi, size, dest, q, bottom_index, top_index); 2633b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2634ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2635ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Special case code to reduce pulsing when key frames are forced at a 2636ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // fixed interval. Note the reconstruction error if it is the frame before 2637ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // the force key frame 2638b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->rc.next_key_frame_forced && cpi->rc.frames_to_key == 1) { 26396ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->ambient_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm)); 2640ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2641ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2642b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // If the encoder forced a KEY_FRAME decision 2643ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->frame_type == KEY_FRAME) 2644ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->refresh_last_frame = 1; 2645ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 26465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->frame_to_show = get_frame_new_buffer(cm); 2647ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2648ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if WRITE_RECON_BUFFER 2649ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->show_frame) 2650ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang write_cx_frame_to_file(cm->frame_to_show, 2651ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->current_video_frame); 2652ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 2653ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang write_cx_frame_to_file(cm->frame_to_show, 2654ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->current_video_frame + 1000); 2655ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 2656ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2657ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Pick the loop filter level for the frame. 2658ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang loopfilter_frame(cpi, cm); 2659ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2660ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if WRITE_RECON_BUFFER 2661ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->show_frame) 2662ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang write_cx_frame_to_file(cm->frame_to_show, 2663ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->current_video_frame + 2000); 2664ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 2665ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang write_cx_frame_to_file(cm->frame_to_show, 2666ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->current_video_frame + 3000); 2667ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 2668ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2669ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // build the bitstream 2670ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->dummy_packing = 0; 2671ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_pack_bitstream(cpi, dest, size); 2672ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 26731184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (cm->seg.update_map) 2674ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang update_reference_segmentation_map(cpi); 2675ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2676ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang release_scaled_references(cpi); 2677a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vp9_update_reference_frames(cpi); 2678ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2679ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (t = TX_4X4; t <= TX_32X32; t++) 2680b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian full_to_model_counts(cm->counts.coef[t], cpi->coef_counts[t]); 2681ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2682b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode) 2683b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_adapt_coef_probs(cm); 2684ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2685b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (!frame_is_intra_only(cm)) { 2686b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode) { 2687b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_adapt_mode_probs(cm); 2688b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_adapt_mv_probs(cm, cm->allow_high_precision_mv); 2689b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2690ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2691ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2692ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if 0 26935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang output_frame_level_debug_stats(cpi); 2694ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 2695ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->refresh_golden_frame == 1) 2696b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->frame_flags |= FRAMEFLAGS_GOLDEN; 2697ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 2698b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->frame_flags &= ~FRAMEFLAGS_GOLDEN; 2699ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2700ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->refresh_alt_ref_frame == 1) 2701b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->frame_flags |= FRAMEFLAGS_ALTREF; 2702ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 2703b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->frame_flags &= ~FRAMEFLAGS_ALTREF; 2704ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2705b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian get_ref_frame_flags(cpi); 2706ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2707b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_rc_postencode_update(cpi, *size); 2708ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2709ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->frame_type == KEY_FRAME) { 2710ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Tell the caller that the frame was coded as a key frame 2711ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *frame_flags = cm->frame_flags | FRAMEFLAGS_KEY; 2712ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2713ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF 2714ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Reset the sequence number. 2715ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->multi_arf_enabled) { 2716ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->sequence_number = 0; 2717ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->frame_coding_order_period = cpi->new_frame_coding_order_period; 2718ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->new_frame_coding_order_period = -1; 2719ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2720ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 2721ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 2722ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *frame_flags = cm->frame_flags&~FRAMEFLAGS_KEY; 2723ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2724ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF 2725ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Increment position in the coded frame sequence. */ 2726ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->multi_arf_enabled) { 2727ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ++cpi->sequence_number; 2728ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->sequence_number >= cpi->frame_coding_order_period) { 2729ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->sequence_number = 0; 2730ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->frame_coding_order_period = cpi->new_frame_coding_order_period; 2731ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->new_frame_coding_order_period = -1; 2732ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2733ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->this_frame_weight = cpi->arf_weight[cpi->sequence_number]; 2734ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang assert(cpi->this_frame_weight >= 0); 2735ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2736ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 2737ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2738ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 27395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // Clear the one shot update flags for segmentation map and mode/ref loop 27405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // filter deltas. 27411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->seg.update_map = 0; 27421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->seg.update_data = 0; 27431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->lf.mode_ref_delta_update = 0; 2744ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2745ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // keep track of the last coded dimensions 2746ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->last_width = cm->width; 2747ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->last_height = cm->height; 2748ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 274991037db265ecdd914a26e056cf69207b4f50924ehkuang // reset to normal state now that we are done. 2750b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (!cm->show_existing_frame) 2751b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->last_show_frame = cm->show_frame; 2752b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2753ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->show_frame) { 2754a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vp9_swap_mi_and_prev_mi(cm); 27555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 275691037db265ecdd914a26e056cf69207b4f50924ehkuang // Don't increment frame counters if this was an altref buffer 275791037db265ecdd914a26e056cf69207b4f50924ehkuang // update not a real frame 2758ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ++cm->current_video_frame; 27596ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (cpi->use_svc) 27606ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_inc_frame_in_layer(&cpi->svc); 2761ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2762b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 276391037db265ecdd914a26e056cf69207b4f50924ehkuang // restore prev_mi 27646ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->prev_mi = cm->prev_mip + cm->mi_stride + 1; 27656ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mi_stride + 1; 2766ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 2767ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2768b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void SvcEncode(VP9_COMP *cpi, size_t *size, uint8_t *dest, 2769b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int *frame_flags) { 2770b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_rc_get_svc_params(cpi); 2771b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian encode_frame_to_data_rate(cpi, size, dest, frame_flags); 2772b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 2773ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2774b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void Pass0Encode(VP9_COMP *cpi, size_t *size, uint8_t *dest, 2775b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int *frame_flags) { 2776b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) { 2777b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_rc_get_one_pass_cbr_params(cpi); 2778b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else { 2779b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_rc_get_one_pass_vbr_params(cpi); 2780b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2781ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang encode_frame_to_data_rate(cpi, size, dest, frame_flags); 2782b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 2783b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2784b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void Pass1Encode(VP9_COMP *cpi, size_t *size, uint8_t *dest, 2785b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int *frame_flags) { 2786b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian (void) size; 2787b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian (void) dest; 2788b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian (void) frame_flags; 2789b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2790b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_rc_get_first_pass_params(cpi); 27916ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_set_quantizer(&cpi->common, find_fp_qindex()); 2792b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_first_pass(cpi); 2793b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 2794ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2795b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void Pass2Encode(VP9_COMP *cpi, size_t *size, 2796b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint8_t *dest, unsigned int *frame_flags) { 2797b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED; 2798ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2799b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_rc_get_second_pass_params(cpi); 2800b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian encode_frame_to_data_rate(cpi, size, dest, frame_flags); 2801ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 28026ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_twopass_postencode_update(cpi); 2803ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 2804ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2805b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void check_initial_width(VP9_COMP *cpi, int subsampling_x, 2806b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int subsampling_y) { 2807b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_COMMON *const cm = &cpi->common; 2808b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2809ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!cpi->initial_width) { 2810b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->subsampling_x = subsampling_x; 2811b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->subsampling_y = subsampling_y; 2812ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang alloc_raw_frame_buffers(cpi); 2813ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->initial_width = cm->width; 2814ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->initial_height = cm->height; 2815ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 28161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang} 28171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 28181184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 2819b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_receive_raw_frame(VP9_COMP *cpi, unsigned int frame_flags, 28201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang YV12_BUFFER_CONFIG *sd, int64_t time_stamp, 28211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int64_t end_time) { 2822b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_COMMON *cm = &cpi->common; 2823b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct vpx_usec_timer timer; 2824b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int res = 0; 2825b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int subsampling_x = sd->uv_width < sd->y_width; 2826b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int subsampling_y = sd->uv_height < sd->y_height; 28271184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 2828b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian check_initial_width(cpi, subsampling_x, subsampling_y); 2829ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_usec_timer_start(&timer); 2830b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (vp9_lookahead_push(cpi->lookahead, 2831b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian sd, time_stamp, end_time, frame_flags)) 2832ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang res = -1; 2833ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_usec_timer_mark(&timer); 2834ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->time_receive_data += vpx_usec_timer_elapsed(&timer); 2835ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 28366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (cm->profile == PROFILE_0 && (subsampling_x != 1 || subsampling_y != 1)) { 2837b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_internal_error(&cm->error, VPX_CODEC_INVALID_PARAM, 2838b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian "Non-4:2:0 color space requires profile >= 1"); 2839b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian res = -1; 2840b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2841b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2842ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return res; 2843ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 2844ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2845ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2846ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic int frame_is_reference(const VP9_COMP *cpi) { 2847ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const VP9_COMMON *cm = &cpi->common; 2848ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2849ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return cm->frame_type == KEY_FRAME || 2850ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->refresh_last_frame || 2851ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->refresh_golden_frame || 2852ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->refresh_alt_ref_frame || 2853ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->refresh_frame_context || 28541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->lf.mode_ref_delta_update || 28551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->seg.update_map || 28561184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->seg.update_data; 2857ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 2858ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2859ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF 2860ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint is_next_frame_arf(VP9_COMP *cpi) { 2861ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Negative entry in frame_coding_order indicates an ARF at this position. 2862ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return cpi->frame_coding_order[cpi->sequence_number + 1] < 0 ? 1 : 0; 2863ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 2864ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 2865ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2866b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid adjust_frame_rate(VP9_COMP *cpi) { 2867b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int64_t this_duration; 2868b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int step = 0; 2869b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2870b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->source->ts_start == cpi->first_time_stamp_ever) { 2871b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian this_duration = cpi->source->ts_end - cpi->source->ts_start; 2872b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian step = 1; 2873b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else { 2874b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int64_t last_duration = cpi->last_end_time_stamp_seen 2875b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian - cpi->last_time_stamp_seen; 2876b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2877b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen; 2878b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2879b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // do a step update if the duration changes by 10% 2880b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (last_duration) 2881b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian step = (int)((this_duration - last_duration) * 10 / last_duration); 2882b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2883b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2884b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (this_duration) { 2885b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (step) { 2886b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_new_framerate(cpi, 10000000.0 / this_duration); 2887b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else { 2888b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Average this frame's rate into the last second's average 2889b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // frame rate. If we haven't seen 1 second yet, then average 2890b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // over the whole interval seen. 2891b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const double interval = MIN((double)(cpi->source->ts_end 2892b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian - cpi->first_time_stamp_ever), 10000000.0); 2893b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian double avg_duration = 10000000.0 / cpi->oxcf.framerate; 2894b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian avg_duration *= (interval - avg_duration + this_duration); 2895b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian avg_duration /= interval; 2896b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2897b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_new_framerate(cpi, 10000000.0 / avg_duration); 2898b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2899b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 2900b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->last_time_stamp_seen = cpi->source->ts_start; 2901b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->last_end_time_stamp_seen = cpi->source->ts_end; 2902b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 2903b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2904b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags, 2905b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian size_t *size, uint8_t *dest, 2906ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int64_t *time_stamp, int64_t *time_end, int flush) { 29076ac915abcdb404a00d927fe6308a47fcf09d9519hkuang VP9_COMMON *const cm = &cpi->common; 29086ac915abcdb404a00d927fe6308a47fcf09d9519hkuang MACROBLOCKD *const xd = &cpi->mb.e_mbd; 29096ac915abcdb404a00d927fe6308a47fcf09d9519hkuang RATE_CONTROL *const rc = &cpi->rc; 2910ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct vpx_usec_timer cmptimer; 2911b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian YV12_BUFFER_CONFIG *force_src_buffer = NULL; 2912b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian MV_REFERENCE_FRAME ref_frame; 2913ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2914ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!cpi) 2915ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1; 2916ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 29176ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2) { 29186ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_restore_layer_context(cpi); 29196ac915abcdb404a00d927fe6308a47fcf09d9519hkuang } 29206ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 2921ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_usec_timer_start(&cmptimer); 2922ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2923ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->source = NULL; 29246ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->last_source = NULL; 2925ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2926b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian set_high_precision_mv(cpi, ALTREF_HIGH_PRECISION_MV); 2927b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2928b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Normal defaults 2929b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->reset_frame_context = 0; 2930b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->refresh_frame_context = 1; 2931b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->refresh_last_frame = 1; 2932b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->refresh_golden_frame = 0; 2933b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->refresh_alt_ref_frame = 0; 2934ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2935ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Should we code an alternate reference frame. 29366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (cpi->oxcf.play_alternate && rc->source_alt_ref_pending) { 2937ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int frames_to_arf; 2938ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2939ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF 2940ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang assert(!cpi->multi_arf_enabled || 2941ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->frame_coding_order[cpi->sequence_number] < 0); 2942ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2943ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->multi_arf_enabled && (cpi->pass == 2)) 2944ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang frames_to_arf = (-cpi->frame_coding_order[cpi->sequence_number]) 2945b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian - cpi->next_frame_in_order; 2946ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 2947ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 29486ac915abcdb404a00d927fe6308a47fcf09d9519hkuang frames_to_arf = rc->frames_till_gf_update_due; 2949ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 29506ac915abcdb404a00d927fe6308a47fcf09d9519hkuang assert(frames_to_arf <= rc->frames_to_key); 2951ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2952ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if ((cpi->source = vp9_lookahead_peek(cpi->lookahead, frames_to_arf))) { 2953ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF 2954ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->alt_ref_source[cpi->arf_buffered] = cpi->source; 2955ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else 2956ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->alt_ref_source = cpi->source; 2957ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 2958ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2959ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->oxcf.arnr_max_frames > 0) { 2960ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Produce the filtered ARF frame. 2961ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // TODO(agrange) merge these two functions. 29626ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_configure_arnr_filter(cpi, frames_to_arf, rc->gfu_boost); 2963ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_temporal_filter_prepare(cpi, frames_to_arf); 2964b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_extend_frame_borders(&cpi->alt_ref_buffer); 2965ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang force_src_buffer = &cpi->alt_ref_buffer; 2966ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2967ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2968ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->show_frame = 0; 2969ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->refresh_alt_ref_frame = 1; 2970ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->refresh_golden_frame = 0; 2971ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->refresh_last_frame = 0; 29726ac915abcdb404a00d927fe6308a47fcf09d9519hkuang rc->is_src_frame_alt_ref = 0; 2973ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2974ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF 2975ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!cpi->multi_arf_enabled) 2976ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 29776ac915abcdb404a00d927fe6308a47fcf09d9519hkuang rc->source_alt_ref_pending = 0; 2978b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else { 29796ac915abcdb404a00d927fe6308a47fcf09d9519hkuang rc->source_alt_ref_pending = 0; 2980ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2981ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2982ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2983ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!cpi->source) { 2984ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF 2985ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 2986ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 29876ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 29886ac915abcdb404a00d927fe6308a47fcf09d9519hkuang // Get last frame source. 29896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (cm->current_video_frame > 0) { 29906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if ((cpi->last_source = vp9_lookahead_peek(cpi->lookahead, -1)) == NULL) 29916ac915abcdb404a00d927fe6308a47fcf09d9519hkuang return -1; 29926ac915abcdb404a00d927fe6308a47fcf09d9519hkuang } 29936ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 2994ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if ((cpi->source = vp9_lookahead_pop(cpi->lookahead, flush))) { 2995ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->show_frame = 1; 29965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->intra_only = 0; 2997ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2998ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF 2999ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Is this frame the ARF overlay. 30006ac915abcdb404a00d927fe6308a47fcf09d9519hkuang rc->is_src_frame_alt_ref = 0; 3001ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < cpi->arf_buffered; ++i) { 3002ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->source == cpi->alt_ref_source[i]) { 30036ac915abcdb404a00d927fe6308a47fcf09d9519hkuang rc->is_src_frame_alt_ref = 1; 3004ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->refresh_golden_frame = 1; 3005ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 3006ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3007ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3008ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else 30096ac915abcdb404a00d927fe6308a47fcf09d9519hkuang rc->is_src_frame_alt_ref = cpi->alt_ref_source && 30106ac915abcdb404a00d927fe6308a47fcf09d9519hkuang (cpi->source == cpi->alt_ref_source); 3011ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 30126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (rc->is_src_frame_alt_ref) { 3013ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Current frame is an ARF overlay frame. 3014ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF 3015ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->alt_ref_source[i] = NULL; 3016ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else 3017ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->alt_ref_source = NULL; 3018ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 3019ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Don't refresh the last buffer for an ARF overlay frame. It will 3020ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // become the GF so preserve last as an alternative prediction option. 3021ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->refresh_last_frame = 0; 3022ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3023ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF 3024ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ++cpi->next_frame_in_order; 3025ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 3026ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3027ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3028ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3029ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->source) { 3030ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->un_scaled_source = cpi->Source = force_src_buffer ? force_src_buffer 3031ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang : &cpi->source->img; 30326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 30336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (cpi->last_source != NULL) { 30346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->unscaled_last_source = &cpi->last_source->img; 30356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang } else { 30366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->unscaled_last_source = NULL; 30376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang } 30386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 3039ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *time_stamp = cpi->source->ts_start; 3040ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *time_end = cpi->source->ts_end; 3041ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *frame_flags = cpi->source->flags; 3042ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3043ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF 30446ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (cm->frame_type != KEY_FRAME && cpi->pass == 2) 30456ac915abcdb404a00d927fe6308a47fcf09d9519hkuang rc->source_alt_ref_pending = is_next_frame_arf(cpi); 3046ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 3047ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 3048ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *size = 0; 3049ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done) { 3050ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_end_first_pass(cpi); /* get last stats packet */ 3051ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->twopass.first_pass_done = 1; 3052ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3053ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1; 3054ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3055ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3056ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->source->ts_start < cpi->first_time_stamp_ever) { 3057ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->first_time_stamp_ever = cpi->source->ts_start; 3058ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->last_end_time_stamp_seen = cpi->source->ts_start; 3059ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3060ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3061ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // adjust frame rates based on timestamps given 3062b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cm->show_frame) { 3063b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian adjust_frame_rate(cpi); 3064b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 3065ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3066b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->svc.number_temporal_layers > 1 && 3067b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) { 30686ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_update_temporal_layer_framerate(cpi); 3069a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vp9_restore_layer_context(cpi); 3070ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3071ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3072ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // start with a 0 size frame 3073ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *size = 0; 3074ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3075ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Clear down mmx registers 3076b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_clear_system_state(); 3077ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3078ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* find a free buffer for the new frame, releasing the reference previously 3079ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * held. 3080ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 3081b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->frame_bufs[cm->new_fb_idx].ref_count--; 3082ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->new_fb_idx = get_free_fb(cm); 3083ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3084ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF 3085ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Set up the correct ARF frame. */ 3086ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->refresh_alt_ref_frame) { 3087ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ++cpi->arf_buffered; 3088ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3089ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) && 3090ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (cpi->pass == 2)) { 3091ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->alt_fb_idx = cpi->arf_buffer_idx[cpi->sequence_number]; 3092ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3093ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 3094ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3095ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->frame_flags = *frame_flags; 3096ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3097ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Reset the frame pointers to the current frame size 30985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vp9_realloc_frame_buffer(get_frame_new_buffer(cm), 3099ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->width, cm->height, 3100ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->subsampling_x, cm->subsampling_y, 3101b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL); 3102ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3103b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) { 3104b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)]; 3105b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian YV12_BUFFER_CONFIG *const buf = &cm->frame_bufs[idx].buf; 3106b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian RefBuffer *const ref_buf = &cm->frame_refs[ref_frame - 1]; 3107b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian ref_buf->buf = buf; 3108b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian ref_buf->idx = idx; 3109b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_setup_scale_factors_for_frame(&ref_buf->sf, 3110b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian buf->y_crop_width, buf->y_crop_height, 3111b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->width, cm->height); 3112ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3113b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (vp9_is_scaled(&ref_buf->sf)) 3114b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_extend_frame_borders(buf); 3115b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 3116b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 3117b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME); 3118ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3119b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cpi->oxcf.aq_mode == VARIANCE_AQ) { 3120b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_vaq_init(); 31215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 31225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 3123a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian if (cpi->pass == 1 && 3124a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian (!cpi->use_svc || cpi->svc.number_temporal_layers == 1)) { 3125ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang Pass1Encode(cpi, size, dest, frame_flags); 31266ac915abcdb404a00d927fe6308a47fcf09d9519hkuang } else if (cpi->pass == 2 && 31276ac915abcdb404a00d927fe6308a47fcf09d9519hkuang (!cpi->use_svc || cpi->svc.number_temporal_layers == 1)) { 3128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang Pass2Encode(cpi, size, dest, frame_flags); 3129a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian } else if (cpi->use_svc) { 3130a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian SvcEncode(cpi, size, dest, frame_flags); 3131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 3132b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // One pass encode 3133b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian Pass0Encode(cpi, size, dest, frame_flags); 3134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3136ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->refresh_frame_context) 3137ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->frame_contexts[cm->frame_context_idx] = cm->fc; 3138ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3139b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Frame was dropped, release scaled references. 3140b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (*size == 0) { 3141b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian release_scaled_references(cpi); 3142b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 3143b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 3144ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (*size > 0) { 3145ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->droppable = !frame_is_reference(cpi); 3146b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 3147ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3148b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Save layer specific state. 31496ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if ((cpi->svc.number_temporal_layers > 1 && 31506ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) || 31516ac915abcdb404a00d927fe6308a47fcf09d9519hkuang (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2)) { 3152a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vp9_save_layer_context(cpi); 3153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3154ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_usec_timer_mark(&cmptimer); 3156ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer); 3157ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3158ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame) 3159ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang generate_psnr_packet(cpi); 3160ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3161ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_INTERNAL_STATS 3162ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3163ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->pass != 1) { 3164b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->bytes += (int)(*size); 3165ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3166ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->show_frame) { 3167ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->count++; 3168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3169ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->b_calculate_psnr) { 3170b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian YV12_BUFFER_CONFIG *orig = cpi->Source; 3171b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show; 3172b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer; 3173b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian PSNR_STATS psnr; 3174b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian calc_psnr(orig, recon, &psnr); 3175b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 3176b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->total += psnr.psnr[0]; 3177b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->total_y += psnr.psnr[1]; 3178b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->total_u += psnr.psnr[2]; 3179b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->total_v += psnr.psnr[3]; 3180b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->total_sq_error += psnr.sse[0]; 3181b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->total_samples += psnr.samples[0]; 3182b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 3183ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang { 3184b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian PSNR_STATS psnr2; 3185b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian double frame_ssim2 = 0, weight = 0; 31861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#if CONFIG_VP9_POSTPROC 3187ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_deblock(cm->frame_to_show, &cm->post_proc_buffer, 31881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->lf.filter_level * 10 / 6); 3189ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 3190ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_clear_system_state(); 3191ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3192b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian calc_psnr(orig, pp, &psnr2); 3193ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3194b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->totalp += psnr2.psnr[0]; 3195b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->totalp_y += psnr2.psnr[1]; 3196b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->totalp_u += psnr2.psnr[2]; 3197b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->totalp_v += psnr2.psnr[3]; 3198b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->totalp_sq_error += psnr2.sse[0]; 3199b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cpi->totalp_samples += psnr2.samples[0]; 3200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3201b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian frame_ssim2 = vp9_calc_ssim(orig, recon, 1, &weight); 3202ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3203ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->summed_quality += frame_ssim2 * weight; 3204ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->summed_weights += weight; 3205ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3206b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian frame_ssim2 = vp9_calc_ssim(orig, &cm->post_proc_buffer, 1, &weight); 3207ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3208ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->summedp_quality += frame_ssim2 * weight; 3209ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->summedp_weights += weight; 3210ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if 0 3211ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang { 3212ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FILE *f = fopen("q_used.stt", "a"); 3213ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(f, "%5d : Y%f7.3:U%f7.3:V%f7.3:F%f7.3:S%7.3f\n", 3214ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->common.current_video_frame, y2, u2, v2, 3215ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang frame_psnr2, frame_ssim2); 3216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fclose(f); 3217ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3218ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 3219ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->b_calculate_ssimg) { 3223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang double y, u, v, frame_all; 3224b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian frame_all = vp9_calc_ssimg(cpi->Source, cm->frame_to_show, &y, &u, &v); 3225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->total_ssimg_y += y; 3226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->total_ssimg_u += u; 3227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->total_ssimg_v += v; 3228ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->total_ssimg_all += frame_all; 3229ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3232ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3233ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 3234ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 0; 3235ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 3236ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3237b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_get_preview_raw_frame(VP9_COMP *cpi, YV12_BUFFER_CONFIG *dest, 3238ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_ppflags_t *flags) { 3239b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_COMMON *cm = &cpi->common; 3240ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3241b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (!cm->show_frame) { 3242ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1; 32435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } else { 3244ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int ret; 32451184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#if CONFIG_VP9_POSTPROC 3246b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian ret = vp9_post_proc_frame(cm, dest, flags); 3247ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else 3248ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3249b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (cm->frame_to_show) { 3250b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *dest = *cm->frame_to_show; 3251b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian dest->y_width = cm->width; 3252b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian dest->y_height = cm->height; 3253b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian dest->uv_width = cm->width >> cm->subsampling_x; 3254b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian dest->uv_height = cm->height >> cm->subsampling_y; 3255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ret = 0; 3256ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 3257ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ret = -1; 3258ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3259ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 32601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#endif // !CONFIG_VP9_POSTPROC 3261ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_clear_system_state(); 3262ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return ret; 3263ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3264ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 3265ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3266b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_set_roimap(VP9_COMP *cpi, unsigned char *map, unsigned int rows, 326791037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned int cols, int delta_q[MAX_SEGMENTS], 326891037db265ecdd914a26e056cf69207b4f50924ehkuang int delta_lf[MAX_SEGMENTS], 326991037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned int threshold[MAX_SEGMENTS]) { 327091037db265ecdd914a26e056cf69207b4f50924ehkuang signed char feature_data[SEG_LVL_MAX][MAX_SEGMENTS]; 32711184aebb761cbeac9124c37189a80a1a58f04b6bhkuang struct segmentation *seg = &cpi->common.seg; 3272ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 3273ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3274ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cpi->common.mb_rows != rows || cpi->common.mb_cols != cols) 3275ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1; 3276ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3277ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!map) { 3278b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_disable_segmentation(seg); 3279ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 0; 3280ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3281ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3282ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Set the segmentation Map 3283b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_set_segmentation_map(cpi, map); 3284ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3285ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Activate segmentation. 3286b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_enable_segmentation(seg); 3287ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 32881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Set up the quant, LF and breakout threshold segment data 328991037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < MAX_SEGMENTS; i++) { 3290ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang feature_data[SEG_LVL_ALT_Q][i] = delta_q[i]; 3291ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang feature_data[SEG_LVL_ALT_LF][i] = delta_lf[i]; 3292ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->segment_encode_breakout[i] = threshold[i]; 3293ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3294ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3295ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Enable the loop and quant changes in the feature mask 329691037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < MAX_SEGMENTS; i++) { 3297ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (delta_q[i]) 3298f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_enable_segfeature(seg, i, SEG_LVL_ALT_Q); 3299ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 3300f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_disable_segfeature(seg, i, SEG_LVL_ALT_Q); 3301ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3302ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (delta_lf[i]) 3303f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_enable_segfeature(seg, i, SEG_LVL_ALT_LF); 3304ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 3305f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_disable_segfeature(seg, i, SEG_LVL_ALT_LF); 3306ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3307ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 33081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Initialize the feature data structure 3309ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // SEGMENT_DELTADATA 0, SEGMENT_ABSDATA 1 3310b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_set_segment_data(seg, &feature_data[0][0], SEGMENT_DELTADATA); 3311ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3312ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 0; 3313ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 3314ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3315b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_set_active_map(VP9_COMP *cpi, unsigned char *map, 3316ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int rows, unsigned int cols) { 3317ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols) { 3318ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (map) { 3319ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_memcpy(cpi->active_map, map, rows * cols); 3320ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->active_map_enabled = 1; 3321ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 3322ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cpi->active_map_enabled = 0; 3323ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3324ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3325ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 0; 3326ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 3327ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // cpi->active_map_enabled = 0; 3328ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1; 3329ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3330ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 3331ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3332b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_set_internal_size(VP9_COMP *cpi, 3333ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VPX_SCALING horiz_mode, VPX_SCALING vert_mode) { 3334ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *cm = &cpi->common; 3335ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int hr = 0, hs = 0, vr = 0, vs = 0; 3336ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3337ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (horiz_mode > ONETWO || vert_mode > ONETWO) 3338ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1; 3339ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3340ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang Scale2Ratio(horiz_mode, &hr, &hs); 3341ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang Scale2Ratio(vert_mode, &vr, &vs); 3342ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3343ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // always go to the next whole number 3344ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->width = (hs - 1 + cpi->oxcf.width * hr) / hs; 3345ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->height = (vs - 1 + cpi->oxcf.height * vr) / vs; 3346ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3347ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang assert(cm->width <= cpi->initial_width); 3348ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang assert(cm->height <= cpi->initial_height); 3349ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang update_frame_size(cpi); 3350ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 0; 3351ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 3352ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3353b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_set_size_literal(VP9_COMP *cpi, unsigned int width, 33541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang unsigned int height) { 33551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang VP9_COMMON *cm = &cpi->common; 33561184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 3357b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian check_initial_width(cpi, 1, 1); 33581184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 33591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (width) { 33601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->width = width; 33611184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (cm->width * 5 < cpi->initial_width) { 33621184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->width = cpi->initial_width / 5 + 1; 3363b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian printf("Warning: Desired width too small, changed to %d\n", cm->width); 33641184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 33651184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (cm->width > cpi->initial_width) { 33661184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->width = cpi->initial_width; 3367b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian printf("Warning: Desired width too large, changed to %d\n", cm->width); 33681184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 33691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 33701184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 33711184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (height) { 33721184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->height = height; 33731184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (cm->height * 5 < cpi->initial_height) { 33741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->height = cpi->initial_height / 5 + 1; 3375b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian printf("Warning: Desired height too small, changed to %d\n", cm->height); 33761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 33771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (cm->height > cpi->initial_height) { 33781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->height = cpi->initial_height; 3379b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian printf("Warning: Desired height too large, changed to %d\n", cm->height); 33801184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 33811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 33821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 33831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang assert(cm->width <= cpi->initial_width); 33841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang assert(cm->height <= cpi->initial_height); 33851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang update_frame_size(cpi); 33861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang return 0; 33871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang} 33881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 3389b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_set_svc(VP9_COMP *cpi, int use_svc) { 33901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cpi->use_svc = use_svc; 33911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang return; 33921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang} 3393ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 33946ac915abcdb404a00d927fe6308a47fcf09d9519hkuangint vp9_get_y_sse(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b) { 33956ac915abcdb404a00d927fe6308a47fcf09d9519hkuang assert(a->y_crop_width == b->y_crop_width); 33966ac915abcdb404a00d927fe6308a47fcf09d9519hkuang assert(a->y_crop_height == b->y_crop_height); 3397ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 33986ac915abcdb404a00d927fe6308a47fcf09d9519hkuang return (int)get_sse(a->y_buffer, a->y_stride, b->y_buffer, b->y_stride, 33996ac915abcdb404a00d927fe6308a47fcf09d9519hkuang a->y_crop_width, a->y_crop_height); 3400ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 3401ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3402ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3403b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_get_quantizer(VP9_COMP *cpi) { 3404b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return cpi->common.base_qindex; 3405ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 3406