vp9_alloccommon.c 6.14 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5
6
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
7
 *  in the file PATENTS.  All contributing project authors may
8
 *  be found in the AUTHORS file in the root of the source tree.
John Koleszar's avatar
John Koleszar committed
9
10
11
 */


12
#include "./vpx_config.h"
John Koleszar's avatar
John Koleszar committed
13
#include "vpx_mem/vpx_mem.h"
14

15
#include "vp9/common/vp9_blockd.h"
16
17
#include "vp9/common/vp9_entropymode.h"
#include "vp9/common/vp9_entropymv.h"
18
19
#include "vp9/common/vp9_findnearmv.h"
#include "vp9/common/vp9_onyxc_int.h"
20
#include "vp9/common/vp9_systemdependent.h"
John Koleszar's avatar
John Koleszar committed
21

22
23
void vp9_update_mode_info_border(VP9_COMMON *cm, MODE_INFO *mi) {
  const int stride = cm->mode_info_stride;
John Koleszar's avatar
John Koleszar committed
24
25
26
  int i;

  // Clear down top border row
Dmitry Kovalev's avatar
Dmitry Kovalev committed
27
  vpx_memset(mi, 0, sizeof(MODE_INFO) * stride);
John Koleszar's avatar
John Koleszar committed
28
29

  // Clear left border column
30
  for (i = 1; i < cm->mi_rows + 1; i++)
Dmitry Kovalev's avatar
Dmitry Kovalev committed
31
    vpx_memset(&mi[i * stride], 0, sizeof(MODE_INFO));
32
}
33

34
void vp9_free_frame_buffers(VP9_COMMON *cm) {
John Koleszar's avatar
John Koleszar committed
35
  int i;
36

John Koleszar's avatar
John Koleszar committed
37
  for (i = 0; i < NUM_YV12_BUFFERS; i++)
38
    vp9_free_frame_buffer(&cm->yv12_fb[i]);
39

40
  vp9_free_frame_buffer(&cm->post_proc_buffer);
John Koleszar's avatar
John Koleszar committed
41

42
43
44
  vpx_free(cm->mip);
  vpx_free(cm->prev_mip);
  vpx_free(cm->last_frame_seg_map);
45
46
  vpx_free(cm->mi_grid_base);
  vpx_free(cm->prev_mi_grid_base);
John Koleszar's avatar
John Koleszar committed
47

48
49
50
  cm->mip = NULL;
  cm->prev_mip = NULL;
  cm->last_frame_seg_map = NULL;
51
52
  cm->mi_grid_base = NULL;
  cm->prev_mi_grid_base = NULL;
John Koleszar's avatar
John Koleszar committed
53
54
}

55
static void set_mb_mi(VP9_COMMON *cm, int aligned_width, int aligned_height) {
James Zern's avatar
James Zern committed
56
57
  cm->mi_cols = aligned_width >> MI_SIZE_LOG2;
  cm->mi_rows = aligned_height >> MI_SIZE_LOG2;
58
  cm->mode_info_stride = cm->mi_cols + MI_BLOCK_SIZE;
59
60
61
62

  cm->mb_cols = (cm->mi_cols + 1) >> 1;
  cm->mb_rows = (cm->mi_rows + 1) >> 1;
  cm->MBs = cm->mb_rows * cm->mb_cols;
63
64
65
66
67
}

static void setup_mi(VP9_COMMON *cm) {
  cm->mi = cm->mip + cm->mode_info_stride + 1;
  cm->prev_mi = cm->prev_mip + cm->mode_info_stride + 1;
68
69
  cm->mi_grid_visible = cm->mi_grid_base + cm->mode_info_stride + 1;
  cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mode_info_stride + 1;
70
71
72
73

  vpx_memset(cm->mip, 0,
             cm->mode_info_stride * (cm->mi_rows + 1) * sizeof(MODE_INFO));

74
75
76
  vpx_memset(cm->mi_grid_base, 0,
             cm->mode_info_stride * (cm->mi_rows + 1) *
             sizeof(*cm->mi_grid_base));
77

78
  vp9_update_mode_info_border(cm, cm->mip);
79
80
81
  vp9_update_mode_info_border(cm, cm->prev_mip);
}

82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
int vp9_resize_frame_buffers(VP9_COMMON *cm, int width, int height) {
  const int aligned_width = ALIGN_POWER_OF_TWO(width, MI_SIZE_LOG2);
  const int aligned_height = ALIGN_POWER_OF_TWO(height, MI_SIZE_LOG2);
  const int ss_x = cm->subsampling_x;
  const int ss_y = cm->subsampling_y;
  int mi_size;

  if (vp9_realloc_frame_buffer(&cm->post_proc_buffer, width, height, ss_x, ss_y,
                             VP9BORDERINPIXELS) < 0)
    goto fail;

  set_mb_mi(cm, aligned_width, aligned_height);

  // Allocation
  mi_size = cm->mode_info_stride * (cm->mi_rows + MI_BLOCK_SIZE);

  vpx_free(cm->mip);
  cm->mip = vpx_calloc(mi_size, sizeof(MODE_INFO));
  if (!cm->mip)
    goto fail;

  vpx_free(cm->prev_mip);
  cm->prev_mip = vpx_calloc(mi_size, sizeof(MODE_INFO));
  if (!cm->prev_mip)
    goto fail;

  vpx_free(cm->mi_grid_base);
  cm->mi_grid_base = vpx_calloc(mi_size, sizeof(*cm->mi_grid_base));
  if (!cm->mi_grid_base)
    goto fail;

  vpx_free(cm->prev_mi_grid_base);
  cm->prev_mi_grid_base = vpx_calloc(mi_size, sizeof(*cm->prev_mi_grid_base));
  if (!cm->prev_mi_grid_base)
    goto fail;

  setup_mi(cm);

  // Create the segmentation map structure and set to 0.
  vpx_free(cm->last_frame_seg_map);
  cm->last_frame_seg_map = vpx_calloc(cm->mi_rows * cm->mi_cols, 1);
  if (!cm->last_frame_seg_map)
    goto fail;

  return 0;

 fail:
  vp9_free_frame_buffers(cm);
  return 1;
}

133
int vp9_alloc_frame_buffers(VP9_COMMON *cm, int width, int height) {
134
  int i;
135

James Zern's avatar
James Zern committed
136
137
  const int aligned_width = ALIGN_POWER_OF_TWO(width, MI_SIZE_LOG2);
  const int aligned_height = ALIGN_POWER_OF_TWO(height, MI_SIZE_LOG2);
138
139
  const int ss_x = cm->subsampling_x;
  const int ss_y = cm->subsampling_y;
140
  int mi_size;
John Koleszar's avatar
John Koleszar committed
141

142
  vp9_free_frame_buffers(cm);
John Koleszar's avatar
John Koleszar committed
143

John Koleszar's avatar
John Koleszar committed
144
  for (i = 0; i < NUM_YV12_BUFFERS; i++) {
145
146
    cm->fb_idx_ref_cnt[i] = 0;
    if (vp9_alloc_frame_buffer(&cm->yv12_fb[i], width, height, ss_x, ss_y,
147
148
                               VP9BORDERINPIXELS) < 0)
      goto fail;
John Koleszar's avatar
John Koleszar committed
149
  }
John Koleszar's avatar
John Koleszar committed
150

151
152
  cm->new_fb_idx = NUM_YV12_BUFFERS - 1;
  cm->fb_idx_ref_cnt[cm->new_fb_idx] = 1;
153

154
  for (i = 0; i < ALLOWED_REFS_PER_FRAME; i++)
155
    cm->active_ref_idx[i] = i;
John Koleszar's avatar
John Koleszar committed
156

157
  for (i = 0; i < NUM_REF_FRAMES; i++) {
158
159
    cm->ref_frame_map[i] = i;
    cm->fb_idx_ref_cnt[i] = 1;
160
  }
John Koleszar's avatar
John Koleszar committed
161

162
  if (vp9_alloc_frame_buffer(&cm->post_proc_buffer, width, height, ss_x, ss_y,
163
164
165
                             VP9BORDERINPIXELS) < 0)
    goto fail;

166
  set_mb_mi(cm, aligned_width, aligned_height);
John Koleszar's avatar
John Koleszar committed
167

168
  // Allocation
169
  mi_size = cm->mode_info_stride * (cm->mi_rows + MI_BLOCK_SIZE);
170

171
172
  cm->mip = vpx_calloc(mi_size, sizeof(MODE_INFO));
  if (!cm->mip)
173
    goto fail;
Paul Wilkins's avatar
Paul Wilkins committed
174

175
176
  cm->prev_mip = vpx_calloc(mi_size, sizeof(MODE_INFO));
  if (!cm->prev_mip)
177
    goto fail;
178

179
180
181
182
183
184
185
186
  cm->mi_grid_base = vpx_calloc(mi_size, sizeof(*cm->mi_grid_base));
  if (!cm->mi_grid_base)
    goto fail;

  cm->prev_mi_grid_base = vpx_calloc(mi_size, sizeof(*cm->prev_mi_grid_base));
  if (!cm->prev_mi_grid_base)
    goto fail;

187
  setup_mi(cm);
John Koleszar's avatar
John Koleszar committed
188

189
  // Create the segmentation map structure and set to 0.
190
191
  cm->last_frame_seg_map = vpx_calloc(cm->mi_rows * cm->mi_cols, 1);
  if (!cm->last_frame_seg_map)
192
193
    goto fail;

John Koleszar's avatar
John Koleszar committed
194
  return 0;
195
196

 fail:
197
  vp9_free_frame_buffers(cm);
198
  return 1;
John Koleszar's avatar
John Koleszar committed
199
}
200

201
202
void vp9_create_common(VP9_COMMON *cm) {
  vp9_machine_specific_config(cm);
John Koleszar's avatar
John Koleszar committed
203
204
}

205
206
void vp9_remove_common(VP9_COMMON *cm) {
  vp9_free_frame_buffers(cm);
John Koleszar's avatar
John Koleszar committed
207
208
}

209
void vp9_initialize_common() {
210
  vp9_init_neighbors();
John Koleszar's avatar
John Koleszar committed
211
}
212
213

void vp9_update_frame_size(VP9_COMMON *cm) {
James Zern's avatar
James Zern committed
214
215
  const int aligned_width = ALIGN_POWER_OF_TWO(cm->width, MI_SIZE_LOG2);
  const int aligned_height = ALIGN_POWER_OF_TWO(cm->height, MI_SIZE_LOG2);
216

217
218
  set_mb_mi(cm, aligned_width, aligned_height);
  setup_mi(cm);
John Koleszar's avatar
John Koleszar committed
219

220
221
222
  // Initialize the previous frame segment map to 0.
  if (cm->last_frame_seg_map)
    vpx_memset(cm->last_frame_seg_map, 0, cm->mi_rows * cm->mi_cols);
223
}