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
12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "./vpx_config.h"
13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx_mem/vpx_mem.h"
1491037db265ecdd914a26e056cf69207b4f50924ehkuang
15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_blockd.h"
16ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_entropymode.h"
17ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_entropymv.h"
18ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_findnearmv.h"
19ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_onyxc_int.h"
20ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_systemdependent.h"
21ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
22ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_update_mode_info_border(VP9_COMMON *cm, MODE_INFO *mi) {
23ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  const int stride = cm->mode_info_stride;
24ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int i;
25ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
26ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Clear down top border row
27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_memset(mi, 0, sizeof(MODE_INFO) * stride);
28ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Clear left border column
30ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (i = 1; i < cm->mi_rows + 1; i++)
31ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vpx_memset(&mi[i * stride], 0, sizeof(MODE_INFO));
32ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
33ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
341184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_free_frame_buffers(VP9_COMMON *cm) {
35ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int i;
36ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
37ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (i = 0; i < NUM_YV12_BUFFERS; i++)
381184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    vp9_free_frame_buffer(&cm->yv12_fb[i]);
39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  vp9_free_frame_buffer(&cm->post_proc_buffer);
41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  vpx_free(cm->mip);
431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  vpx_free(cm->prev_mip);
441184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  vpx_free(cm->last_frame_seg_map);
451184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  vpx_free(cm->mi_grid_base);
461184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  vpx_free(cm->prev_mi_grid_base);
47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
481184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->mip = NULL;
491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->prev_mip = NULL;
501184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->last_frame_seg_map = NULL;
511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->mi_grid_base = NULL;
521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->prev_mi_grid_base = NULL;
53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void set_mb_mi(VP9_COMMON *cm, int aligned_width, int aligned_height) {
561184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->mi_cols = aligned_width >> MI_SIZE_LOG2;
571184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->mi_rows = aligned_height >> MI_SIZE_LOG2;
5891037db265ecdd914a26e056cf69207b4f50924ehkuang  cm->mode_info_stride = cm->mi_cols + MI_BLOCK_SIZE;
595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  cm->mb_cols = (cm->mi_cols + 1) >> 1;
615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  cm->mb_rows = (cm->mi_rows + 1) >> 1;
625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  cm->MBs = cm->mb_rows * cm->mb_cols;
63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
64ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
65ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void setup_mi(VP9_COMMON *cm) {
66ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cm->mi = cm->mip + cm->mode_info_stride + 1;
67ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cm->prev_mi = cm->prev_mip + cm->mode_info_stride + 1;
681184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->mi_grid_visible = cm->mi_grid_base + cm->mode_info_stride + 1;
691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mode_info_stride + 1;
70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
71ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_memset(cm->mip, 0,
72ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang             cm->mode_info_stride * (cm->mi_rows + 1) * sizeof(MODE_INFO));
73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  vpx_memset(cm->mi_grid_base, 0,
751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang             cm->mode_info_stride * (cm->mi_rows + 1) *
761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang             sizeof(*cm->mi_grid_base));
77ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  vp9_update_mode_info_border(cm, cm->mip);
79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp9_update_mode_info_border(cm, cm->prev_mip);
80ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
81ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
829b35249446b07f40ac5fcc3205f2c048616efacchkuangint vp9_resize_frame_buffers(VP9_COMMON *cm, int width, int height) {
839b35249446b07f40ac5fcc3205f2c048616efacchkuang  const int aligned_width = ALIGN_POWER_OF_TWO(width, MI_SIZE_LOG2);
849b35249446b07f40ac5fcc3205f2c048616efacchkuang  const int aligned_height = ALIGN_POWER_OF_TWO(height, MI_SIZE_LOG2);
859b35249446b07f40ac5fcc3205f2c048616efacchkuang  const int ss_x = cm->subsampling_x;
869b35249446b07f40ac5fcc3205f2c048616efacchkuang  const int ss_y = cm->subsampling_y;
879b35249446b07f40ac5fcc3205f2c048616efacchkuang  int mi_size;
889b35249446b07f40ac5fcc3205f2c048616efacchkuang
899b35249446b07f40ac5fcc3205f2c048616efacchkuang  if (vp9_realloc_frame_buffer(&cm->post_proc_buffer, width, height, ss_x, ss_y,
909b35249446b07f40ac5fcc3205f2c048616efacchkuang                             VP9BORDERINPIXELS) < 0)
919b35249446b07f40ac5fcc3205f2c048616efacchkuang    goto fail;
929b35249446b07f40ac5fcc3205f2c048616efacchkuang
939b35249446b07f40ac5fcc3205f2c048616efacchkuang  set_mb_mi(cm, aligned_width, aligned_height);
949b35249446b07f40ac5fcc3205f2c048616efacchkuang
959b35249446b07f40ac5fcc3205f2c048616efacchkuang  // Allocation
969b35249446b07f40ac5fcc3205f2c048616efacchkuang  mi_size = cm->mode_info_stride * (cm->mi_rows + MI_BLOCK_SIZE);
979b35249446b07f40ac5fcc3205f2c048616efacchkuang
989b35249446b07f40ac5fcc3205f2c048616efacchkuang  vpx_free(cm->mip);
999b35249446b07f40ac5fcc3205f2c048616efacchkuang  cm->mip = vpx_calloc(mi_size, sizeof(MODE_INFO));
1009b35249446b07f40ac5fcc3205f2c048616efacchkuang  if (!cm->mip)
1019b35249446b07f40ac5fcc3205f2c048616efacchkuang    goto fail;
1029b35249446b07f40ac5fcc3205f2c048616efacchkuang
1039b35249446b07f40ac5fcc3205f2c048616efacchkuang  vpx_free(cm->prev_mip);
1049b35249446b07f40ac5fcc3205f2c048616efacchkuang  cm->prev_mip = vpx_calloc(mi_size, sizeof(MODE_INFO));
1059b35249446b07f40ac5fcc3205f2c048616efacchkuang  if (!cm->prev_mip)
1069b35249446b07f40ac5fcc3205f2c048616efacchkuang    goto fail;
1079b35249446b07f40ac5fcc3205f2c048616efacchkuang
1089b35249446b07f40ac5fcc3205f2c048616efacchkuang  vpx_free(cm->mi_grid_base);
1099b35249446b07f40ac5fcc3205f2c048616efacchkuang  cm->mi_grid_base = vpx_calloc(mi_size, sizeof(*cm->mi_grid_base));
1109b35249446b07f40ac5fcc3205f2c048616efacchkuang  if (!cm->mi_grid_base)
1119b35249446b07f40ac5fcc3205f2c048616efacchkuang    goto fail;
1129b35249446b07f40ac5fcc3205f2c048616efacchkuang
1139b35249446b07f40ac5fcc3205f2c048616efacchkuang  vpx_free(cm->prev_mi_grid_base);
1149b35249446b07f40ac5fcc3205f2c048616efacchkuang  cm->prev_mi_grid_base = vpx_calloc(mi_size, sizeof(*cm->prev_mi_grid_base));
1159b35249446b07f40ac5fcc3205f2c048616efacchkuang  if (!cm->prev_mi_grid_base)
1169b35249446b07f40ac5fcc3205f2c048616efacchkuang    goto fail;
1179b35249446b07f40ac5fcc3205f2c048616efacchkuang
1189b35249446b07f40ac5fcc3205f2c048616efacchkuang  setup_mi(cm);
1199b35249446b07f40ac5fcc3205f2c048616efacchkuang
1209b35249446b07f40ac5fcc3205f2c048616efacchkuang  // Create the segmentation map structure and set to 0.
1219b35249446b07f40ac5fcc3205f2c048616efacchkuang  vpx_free(cm->last_frame_seg_map);
1229b35249446b07f40ac5fcc3205f2c048616efacchkuang  cm->last_frame_seg_map = vpx_calloc(cm->mi_rows * cm->mi_cols, 1);
1239b35249446b07f40ac5fcc3205f2c048616efacchkuang  if (!cm->last_frame_seg_map)
1249b35249446b07f40ac5fcc3205f2c048616efacchkuang    goto fail;
1259b35249446b07f40ac5fcc3205f2c048616efacchkuang
1269b35249446b07f40ac5fcc3205f2c048616efacchkuang  return 0;
1279b35249446b07f40ac5fcc3205f2c048616efacchkuang
1289b35249446b07f40ac5fcc3205f2c048616efacchkuang fail:
1299b35249446b07f40ac5fcc3205f2c048616efacchkuang  vp9_free_frame_buffers(cm);
1309b35249446b07f40ac5fcc3205f2c048616efacchkuang  return 1;
1319b35249446b07f40ac5fcc3205f2c048616efacchkuang}
1329b35249446b07f40ac5fcc3205f2c048616efacchkuang
1331184aebb761cbeac9124c37189a80a1a58f04b6bhkuangint vp9_alloc_frame_buffers(VP9_COMMON *cm, int width, int height) {
1345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int i;
135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  const int aligned_width = ALIGN_POWER_OF_TWO(width, MI_SIZE_LOG2);
1371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  const int aligned_height = ALIGN_POWER_OF_TWO(height, MI_SIZE_LOG2);
1381184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  const int ss_x = cm->subsampling_x;
1391184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  const int ss_y = cm->subsampling_y;
14091037db265ecdd914a26e056cf69207b4f50924ehkuang  int mi_size;
141ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  vp9_free_frame_buffers(cm);
143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
144ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (i = 0; i < NUM_YV12_BUFFERS; i++) {
1451184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    cm->fb_idx_ref_cnt[i] = 0;
1461184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    if (vp9_alloc_frame_buffer(&cm->yv12_fb[i], width, height, ss_x, ss_y,
147ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                               VP9BORDERINPIXELS) < 0)
148ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      goto fail;
149ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
150ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->new_fb_idx = NUM_YV12_BUFFERS - 1;
1521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->fb_idx_ref_cnt[cm->new_fb_idx] = 1;
153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
154ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (i = 0; i < ALLOWED_REFS_PER_FRAME; i++)
1551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    cm->active_ref_idx[i] = i;
156ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
157ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (i = 0; i < NUM_REF_FRAMES; i++) {
1581184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    cm->ref_frame_map[i] = i;
1591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    cm->fb_idx_ref_cnt[i] = 1;
160ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
161ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1621184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  if (vp9_alloc_frame_buffer(&cm->post_proc_buffer, width, height, ss_x, ss_y,
163ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                             VP9BORDERINPIXELS) < 0)
164ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    goto fail;
165ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1661184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  set_mb_mi(cm, aligned_width, aligned_height);
167ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Allocation
1691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  mi_size = cm->mode_info_stride * (cm->mi_rows + MI_BLOCK_SIZE);
17091037db265ecdd914a26e056cf69207b4f50924ehkuang
1711184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->mip = vpx_calloc(mi_size, sizeof(MODE_INFO));
1721184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  if (!cm->mip)
173ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    goto fail;
174ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->prev_mip = vpx_calloc(mi_size, sizeof(MODE_INFO));
1761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  if (!cm->prev_mip)
177ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    goto fail;
178ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->mi_grid_base = vpx_calloc(mi_size, sizeof(*cm->mi_grid_base));
1801184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  if (!cm->mi_grid_base)
1811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    goto fail;
1821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
1831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->prev_mi_grid_base = vpx_calloc(mi_size, sizeof(*cm->prev_mi_grid_base));
1841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  if (!cm->prev_mi_grid_base)
1851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    goto fail;
1861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
1871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  setup_mi(cm);
188ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1891184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  // Create the segmentation map structure and set to 0.
1901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->last_frame_seg_map = vpx_calloc(cm->mi_rows * cm->mi_cols, 1);
1911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  if (!cm->last_frame_seg_map)
192ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    goto fail;
193ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
194ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return 0;
195ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
196ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fail:
1971184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  vp9_free_frame_buffers(cm);
198ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return 1;
199ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2011184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_create_common(VP9_COMMON *cm) {
2021184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  vp9_machine_specific_config(cm);
203ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2041184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->tx_mode = ONLY_4X4;
2051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->comp_pred_mode = HYBRID_PREDICTION;
206ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
207ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2081184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_remove_common(VP9_COMMON *cm) {
2091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  vp9_free_frame_buffers(cm);
210ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
211ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
212ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_initialize_common() {
2135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  vp9_init_neighbors();
214ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp9_coef_tree_initialize();
215ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp9_entropy_mode_init();
216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp9_entropy_mv_init();
217ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
218ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
219ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_update_frame_size(VP9_COMMON *cm) {
2201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  const int aligned_width = ALIGN_POWER_OF_TWO(cm->width, MI_SIZE_LOG2);
2211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  const int aligned_height = ALIGN_POWER_OF_TWO(cm->height, MI_SIZE_LOG2);
222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  set_mb_mi(cm, aligned_width, aligned_height);
224ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  setup_mi(cm);
22591037db265ecdd914a26e056cf69207b4f50924ehkuang
2261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  // Initialize the previous frame segment map to 0.
2271184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  if (cm->last_frame_seg_map)
2281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    vpx_memset(cm->last_frame_seg_map, 0, cm->mi_rows * cm->mi_cols);
229ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
230