1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* 2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * 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 11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "./vpx_config.h" 12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx_mem/vpx_mem.h" 1391037db265ecdd914a26e056cf69207b4f50924ehkuang 14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_blockd.h" 15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_entropymode.h" 16ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_entropymv.h" 17ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_onyxc_int.h" 18ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_systemdependent.h" 19ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 206ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic void clear_mi_border(const VP9_COMMON *cm, MODE_INFO *mi) { 21ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 22ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 236ac915abcdb404a00d927fe6308a47fcf09d9519hkuang // Top border row 246ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vpx_memset(mi, 0, sizeof(*mi) * cm->mi_stride); 25ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 266ac915abcdb404a00d927fe6308a47fcf09d9519hkuang // Left border column 276ac915abcdb404a00d927fe6308a47fcf09d9519hkuang for (i = 1; i < cm->mi_rows + 1; ++i) 286ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vpx_memset(&mi[i * cm->mi_stride], 0, sizeof(*mi)); 29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 30ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 31ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void set_mb_mi(VP9_COMMON *cm, int aligned_width, int aligned_height) { 321184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->mi_cols = aligned_width >> MI_SIZE_LOG2; 331184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->mi_rows = aligned_height >> MI_SIZE_LOG2; 346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->mi_stride = cm->mi_cols + MI_BLOCK_SIZE; 355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->mb_cols = (cm->mi_cols + 1) >> 1; 375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->mb_rows = (cm->mi_rows + 1) >> 1; 385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->MBs = cm->mb_rows * cm->mb_cols; 39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void setup_mi(VP9_COMMON *cm) { 426ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->mi = cm->mip + cm->mi_stride + 1; 436ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->prev_mi = cm->prev_mip + cm->mi_stride + 1; 446ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->mi_grid_visible = cm->mi_grid_base + cm->mi_stride + 1; 456ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mi_stride + 1; 46ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 476ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vpx_memset(cm->mip, 0, cm->mi_stride * (cm->mi_rows + 1) * sizeof(*cm->mip)); 48ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 496ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vpx_memset(cm->mi_grid_base, 0, cm->mi_stride * (cm->mi_rows + 1) * 506ac915abcdb404a00d927fe6308a47fcf09d9519hkuang sizeof(*cm->mi_grid_base)); 51ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 526ac915abcdb404a00d927fe6308a47fcf09d9519hkuang clear_mi_border(cm, cm->prev_mip); 53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 55a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianstatic int alloc_mi(VP9_COMMON *cm, int mi_size) { 56a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cm->mip = (MODE_INFO *)vpx_calloc(mi_size, sizeof(*cm->mip)); 57a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian if (cm->mip == NULL) 58a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian return 1; 59a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian 60a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cm->prev_mip = (MODE_INFO *)vpx_calloc(mi_size, sizeof(*cm->prev_mip)); 61a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian if (cm->prev_mip == NULL) 62a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian return 1; 63a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian 64a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cm->mi_grid_base = 65a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian (MODE_INFO **)vpx_calloc(mi_size, sizeof(*cm->mi_grid_base)); 66a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian if (cm->mi_grid_base == NULL) 67a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian return 1; 68a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian 69a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cm->prev_mi_grid_base = 70a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian (MODE_INFO **)vpx_calloc(mi_size, sizeof(*cm->prev_mi_grid_base)); 71a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian if (cm->prev_mi_grid_base == NULL) 72a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian return 1; 73a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian 74a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian return 0; 75a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian} 76a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian 77a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianstatic void free_mi(VP9_COMMON *cm) { 78a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vpx_free(cm->mip); 79a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vpx_free(cm->prev_mip); 80a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vpx_free(cm->mi_grid_base); 81a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vpx_free(cm->prev_mi_grid_base); 82a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian 83a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cm->mip = NULL; 84a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cm->prev_mip = NULL; 85a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cm->mi_grid_base = NULL; 86a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cm->prev_mi_grid_base = NULL; 87a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian} 88a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian 89a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianvoid vp9_free_frame_buffers(VP9_COMMON *cm) { 90a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian int i; 91a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian 92a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian for (i = 0; i < FRAME_BUFFERS; ++i) { 93a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vp9_free_frame_buffer(&cm->frame_bufs[i].buf); 94a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian 95a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian if (cm->frame_bufs[i].ref_count > 0 && 96a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cm->frame_bufs[i].raw_frame_buffer.data != NULL) { 97a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cm->release_fb_cb(cm->cb_priv, &cm->frame_bufs[i].raw_frame_buffer); 98a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cm->frame_bufs[i].ref_count = 0; 99a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian } 100a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian } 101a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian 102a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vp9_free_frame_buffer(&cm->post_proc_buffer); 103a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian 104a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian free_mi(cm); 105a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian 106a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian vpx_free(cm->last_frame_seg_map); 107a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cm->last_frame_seg_map = NULL; 1086ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 1096ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vpx_free(cm->above_context); 1106ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->above_context = NULL; 1116ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 1126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vpx_free(cm->above_seg_context); 1136ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->above_seg_context = NULL; 114a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian} 115a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian 1169b35249446b07f40ac5fcc3205f2c048616efacchkuangint vp9_resize_frame_buffers(VP9_COMMON *cm, int width, int height) { 1179b35249446b07f40ac5fcc3205f2c048616efacchkuang const int aligned_width = ALIGN_POWER_OF_TWO(width, MI_SIZE_LOG2); 1189b35249446b07f40ac5fcc3205f2c048616efacchkuang const int aligned_height = ALIGN_POWER_OF_TWO(height, MI_SIZE_LOG2); 1199b35249446b07f40ac5fcc3205f2c048616efacchkuang const int ss_x = cm->subsampling_x; 1209b35249446b07f40ac5fcc3205f2c048616efacchkuang const int ss_y = cm->subsampling_y; 1219b35249446b07f40ac5fcc3205f2c048616efacchkuang 1229b35249446b07f40ac5fcc3205f2c048616efacchkuang if (vp9_realloc_frame_buffer(&cm->post_proc_buffer, width, height, ss_x, ss_y, 123b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_DEC_BORDER_IN_PIXELS, NULL, NULL, NULL) < 0) 1249b35249446b07f40ac5fcc3205f2c048616efacchkuang goto fail; 1259b35249446b07f40ac5fcc3205f2c048616efacchkuang 1269b35249446b07f40ac5fcc3205f2c048616efacchkuang set_mb_mi(cm, aligned_width, aligned_height); 1279b35249446b07f40ac5fcc3205f2c048616efacchkuang 128a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian free_mi(cm); 1296ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (alloc_mi(cm, cm->mi_stride * (cm->mi_rows + MI_BLOCK_SIZE))) 1309b35249446b07f40ac5fcc3205f2c048616efacchkuang goto fail; 1319b35249446b07f40ac5fcc3205f2c048616efacchkuang 1329b35249446b07f40ac5fcc3205f2c048616efacchkuang setup_mi(cm); 1339b35249446b07f40ac5fcc3205f2c048616efacchkuang 1349b35249446b07f40ac5fcc3205f2c048616efacchkuang // Create the segmentation map structure and set to 0. 1359b35249446b07f40ac5fcc3205f2c048616efacchkuang vpx_free(cm->last_frame_seg_map); 136a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cm->last_frame_seg_map = (uint8_t *)vpx_calloc(cm->mi_rows * cm->mi_cols, 1); 1379b35249446b07f40ac5fcc3205f2c048616efacchkuang if (!cm->last_frame_seg_map) 1389b35249446b07f40ac5fcc3205f2c048616efacchkuang goto fail; 1399b35249446b07f40ac5fcc3205f2c048616efacchkuang 1406ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vpx_free(cm->above_context); 1416ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->above_context = 1426ac915abcdb404a00d927fe6308a47fcf09d9519hkuang (ENTROPY_CONTEXT *)vpx_calloc(2 * mi_cols_aligned_to_sb(cm->mi_cols) * 1436ac915abcdb404a00d927fe6308a47fcf09d9519hkuang MAX_MB_PLANE, 1446ac915abcdb404a00d927fe6308a47fcf09d9519hkuang sizeof(*cm->above_context)); 1456ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (!cm->above_context) 1466ac915abcdb404a00d927fe6308a47fcf09d9519hkuang goto fail; 1476ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 1486ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vpx_free(cm->above_seg_context); 1496ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->above_seg_context = 1506ac915abcdb404a00d927fe6308a47fcf09d9519hkuang (PARTITION_CONTEXT *)vpx_calloc(mi_cols_aligned_to_sb(cm->mi_cols), 1516ac915abcdb404a00d927fe6308a47fcf09d9519hkuang sizeof(*cm->above_seg_context)); 1526ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (!cm->above_seg_context) 1536ac915abcdb404a00d927fe6308a47fcf09d9519hkuang goto fail; 1546ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 1559b35249446b07f40ac5fcc3205f2c048616efacchkuang return 0; 1569b35249446b07f40ac5fcc3205f2c048616efacchkuang 1579b35249446b07f40ac5fcc3205f2c048616efacchkuang fail: 1589b35249446b07f40ac5fcc3205f2c048616efacchkuang vp9_free_frame_buffers(cm); 1599b35249446b07f40ac5fcc3205f2c048616efacchkuang return 1; 1609b35249446b07f40ac5fcc3205f2c048616efacchkuang} 1619b35249446b07f40ac5fcc3205f2c048616efacchkuang 1621184aebb761cbeac9124c37189a80a1a58f04b6bhkuangint vp9_alloc_frame_buffers(VP9_COMMON *cm, int width, int height) { 1631184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int aligned_width = ALIGN_POWER_OF_TWO(width, MI_SIZE_LOG2); 1641184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int aligned_height = ALIGN_POWER_OF_TWO(height, MI_SIZE_LOG2); 1651184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int ss_x = cm->subsampling_x; 1661184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int ss_y = cm->subsampling_y; 1676ac915abcdb404a00d927fe6308a47fcf09d9519hkuang int i; 168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vp9_free_frame_buffers(cm); 170ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 171b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (i = 0; i < FRAME_BUFFERS; i++) { 172b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->frame_bufs[i].ref_count = 0; 173b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (vp9_alloc_frame_buffer(&cm->frame_bufs[i].buf, width, height, 174b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian ss_x, ss_y, VP9_ENC_BORDER_IN_PIXELS) < 0) 175ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang goto fail; 176ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 177ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 178b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->new_fb_idx = FRAME_BUFFERS - 1; 179b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->frame_bufs[cm->new_fb_idx].ref_count = 1; 180ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 181b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (i = 0; i < REF_FRAMES; i++) { 1821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->ref_frame_map[i] = i; 183b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian cm->frame_bufs[i].ref_count = 1; 184ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 185ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (vp9_alloc_frame_buffer(&cm->post_proc_buffer, width, height, ss_x, ss_y, 187b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian VP9_ENC_BORDER_IN_PIXELS) < 0) 188ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang goto fail; 189ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang set_mb_mi(cm, aligned_width, aligned_height); 191ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1926ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (alloc_mi(cm, cm->mi_stride * (cm->mi_rows + MI_BLOCK_SIZE))) 1931184aebb761cbeac9124c37189a80a1a58f04b6bhkuang goto fail; 1941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1951184aebb761cbeac9124c37189a80a1a58f04b6bhkuang setup_mi(cm); 196ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1971184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Create the segmentation map structure and set to 0. 198a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cm->last_frame_seg_map = (uint8_t *)vpx_calloc(cm->mi_rows * cm->mi_cols, 1); 1991184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (!cm->last_frame_seg_map) 200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang goto fail; 201ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2026ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->above_context = 2036ac915abcdb404a00d927fe6308a47fcf09d9519hkuang (ENTROPY_CONTEXT *)vpx_calloc(2 * mi_cols_aligned_to_sb(cm->mi_cols) * 2046ac915abcdb404a00d927fe6308a47fcf09d9519hkuang MAX_MB_PLANE, 2056ac915abcdb404a00d927fe6308a47fcf09d9519hkuang sizeof(*cm->above_context)); 2066ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (!cm->above_context) 2076ac915abcdb404a00d927fe6308a47fcf09d9519hkuang goto fail; 2086ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 2096ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->above_seg_context = 2106ac915abcdb404a00d927fe6308a47fcf09d9519hkuang (PARTITION_CONTEXT *)vpx_calloc(mi_cols_aligned_to_sb(cm->mi_cols), 2116ac915abcdb404a00d927fe6308a47fcf09d9519hkuang sizeof(*cm->above_seg_context)); 2126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (!cm->above_seg_context) 2136ac915abcdb404a00d927fe6308a47fcf09d9519hkuang goto fail; 2146ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 215ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 0; 216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 217ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fail: 2181184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vp9_free_frame_buffers(cm); 219ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 1; 220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2221184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_remove_common(VP9_COMMON *cm) { 2231184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vp9_free_frame_buffers(cm); 224b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_free_internal_frame_buffers(&cm->int_frame_buffers); 225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_update_frame_size(VP9_COMMON *cm) { 2281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int aligned_width = ALIGN_POWER_OF_TWO(cm->width, MI_SIZE_LOG2); 2291184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int aligned_height = ALIGN_POWER_OF_TWO(cm->height, MI_SIZE_LOG2); 230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang set_mb_mi(cm, aligned_width, aligned_height); 232ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang setup_mi(cm); 23391037db265ecdd914a26e056cf69207b4f50924ehkuang 2341184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Initialize the previous frame segment map to 0. 2351184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (cm->last_frame_seg_map) 2361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vpx_memset(cm->last_frame_seg_map, 0, cm->mi_rows * cm->mi_cols); 237ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 238a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian 239a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianvoid vp9_swap_mi_and_prev_mi(VP9_COMMON *cm) { 240a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian // Current mip will be the prev_mip for the next frame. 241a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian MODE_INFO *temp = cm->prev_mip; 242a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian MODE_INFO **temp2 = cm->prev_mi_grid_base; 243a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cm->prev_mip = cm->mip; 244a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cm->mip = temp; 245a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cm->prev_mi_grid_base = cm->mi_grid_base; 246a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian cm->mi_grid_base = temp2; 247a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian 248a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian // Update the upper left visible macroblock ptrs. 2496ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->mi = cm->mip + cm->mi_stride + 1; 2506ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->prev_mi = cm->prev_mip + cm->mi_stride + 1; 2516ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->mi_grid_visible = cm->mi_grid_base + cm->mi_stride + 1; 2526ac915abcdb404a00d927fe6308a47fcf09d9519hkuang cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mi_stride + 1; 253a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian} 254