| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 vp9_free_frame_buffer(&cm->frame_bufs[i].buf); | 102 vp9_free_frame_buffer(&cm->frame_bufs[i].buf); |
| 103 | 103 |
| 104 if (cm->frame_bufs[i].ref_count > 0 && | 104 if (cm->frame_bufs[i].ref_count > 0 && |
| 105 cm->frame_bufs[i].raw_frame_buffer.data != NULL) { | 105 cm->frame_bufs[i].raw_frame_buffer.data != NULL) { |
| 106 cm->release_fb_cb(cm->cb_priv, &cm->frame_bufs[i].raw_frame_buffer); | 106 cm->release_fb_cb(cm->cb_priv, &cm->frame_bufs[i].raw_frame_buffer); |
| 107 cm->frame_bufs[i].ref_count = 0; | 107 cm->frame_bufs[i].ref_count = 0; |
| 108 } | 108 } |
| 109 } | 109 } |
| 110 | 110 |
| 111 vp9_free_frame_buffer(&cm->post_proc_buffer); | 111 vp9_free_frame_buffer(&cm->post_proc_buffer); |
| 112 } |
| 112 | 113 |
| 114 void vp9_free_context_buffers(VP9_COMMON *cm) { |
| 113 free_mi(cm); | 115 free_mi(cm); |
| 114 | 116 |
| 115 vpx_free(cm->last_frame_seg_map); | 117 vpx_free(cm->last_frame_seg_map); |
| 116 cm->last_frame_seg_map = NULL; | 118 cm->last_frame_seg_map = NULL; |
| 117 | 119 |
| 118 vpx_free(cm->above_context); | 120 vpx_free(cm->above_context); |
| 119 cm->above_context = NULL; | 121 cm->above_context = NULL; |
| 120 | 122 |
| 121 vpx_free(cm->above_seg_context); | 123 vpx_free(cm->above_seg_context); |
| 122 cm->above_seg_context = NULL; | 124 cm->above_seg_context = NULL; |
| 123 } | 125 } |
| 124 | 126 |
| 125 int vp9_resize_frame_buffers(VP9_COMMON *cm, int width, int height) { | 127 int vp9_resize_frame_buffers(VP9_COMMON *cm, int width, int height) { |
| 126 const int aligned_width = ALIGN_POWER_OF_TWO(width, MI_SIZE_LOG2); | 128 const int aligned_width = ALIGN_POWER_OF_TWO(width, MI_SIZE_LOG2); |
| 127 const int aligned_height = ALIGN_POWER_OF_TWO(height, MI_SIZE_LOG2); | 129 const int aligned_height = ALIGN_POWER_OF_TWO(height, MI_SIZE_LOG2); |
| 130 #if CONFIG_INTERNAL_STATS || CONFIG_VP9_POSTPROC |
| 128 const int ss_x = cm->subsampling_x; | 131 const int ss_x = cm->subsampling_x; |
| 129 const int ss_y = cm->subsampling_y; | 132 const int ss_y = cm->subsampling_y; |
| 130 | 133 |
| 134 // TODO(agrange): this should be conditionally allocated. |
| 131 if (vp9_realloc_frame_buffer(&cm->post_proc_buffer, width, height, ss_x, ss_y, | 135 if (vp9_realloc_frame_buffer(&cm->post_proc_buffer, width, height, ss_x, ss_y, |
| 132 VP9_DEC_BORDER_IN_PIXELS, NULL, NULL, NULL) < 0) | 136 VP9_DEC_BORDER_IN_PIXELS, NULL, NULL, NULL) < 0) |
| 133 goto fail; | 137 goto fail; |
| 138 #endif |
| 134 | 139 |
| 135 set_mb_mi(cm, aligned_width, aligned_height); | 140 set_mb_mi(cm, aligned_width, aligned_height); |
| 136 | 141 |
| 137 free_mi(cm); | 142 free_mi(cm); |
| 138 if (alloc_mi(cm, cm->mi_stride * (cm->mi_rows + MI_BLOCK_SIZE))) | 143 if (alloc_mi(cm, cm->mi_stride * (cm->mi_rows + MI_BLOCK_SIZE))) |
| 139 goto fail; | 144 goto fail; |
| 140 | 145 |
| 141 setup_mi(cm); | 146 setup_mi(cm); |
| 142 | 147 |
| 143 // Create the segmentation map structure and set to 0. | 148 // Create the segmentation map structure and set to 0. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 158 cm->above_seg_context = | 163 cm->above_seg_context = |
| 159 (PARTITION_CONTEXT *)vpx_calloc(mi_cols_aligned_to_sb(cm->mi_cols), | 164 (PARTITION_CONTEXT *)vpx_calloc(mi_cols_aligned_to_sb(cm->mi_cols), |
| 160 sizeof(*cm->above_seg_context)); | 165 sizeof(*cm->above_seg_context)); |
| 161 if (!cm->above_seg_context) | 166 if (!cm->above_seg_context) |
| 162 goto fail; | 167 goto fail; |
| 163 | 168 |
| 164 return 0; | 169 return 0; |
| 165 | 170 |
| 166 fail: | 171 fail: |
| 167 vp9_free_frame_buffers(cm); | 172 vp9_free_frame_buffers(cm); |
| 173 vp9_free_context_buffers(cm); |
| 174 return 1; |
| 175 } |
| 176 |
| 177 static void init_frame_bufs(VP9_COMMON *cm) { |
| 178 int i; |
| 179 |
| 180 cm->new_fb_idx = FRAME_BUFFERS - 1; |
| 181 cm->frame_bufs[cm->new_fb_idx].ref_count = 1; |
| 182 |
| 183 for (i = 0; i < REF_FRAMES; ++i) { |
| 184 cm->ref_frame_map[i] = i; |
| 185 cm->frame_bufs[i].ref_count = 1; |
| 186 } |
| 187 } |
| 188 |
| 189 int vp9_alloc_frame_buffers(VP9_COMMON *cm, int width, int height) { |
| 190 int i; |
| 191 const int ss_x = cm->subsampling_x; |
| 192 const int ss_y = cm->subsampling_y; |
| 193 |
| 194 vp9_free_frame_buffers(cm); |
| 195 |
| 196 for (i = 0; i < FRAME_BUFFERS; ++i) { |
| 197 cm->frame_bufs[i].ref_count = 0; |
| 198 if (vp9_alloc_frame_buffer(&cm->frame_bufs[i].buf, width, height, |
| 199 ss_x, ss_y, VP9_ENC_BORDER_IN_PIXELS) < 0) |
| 200 goto fail; |
| 201 } |
| 202 |
| 203 init_frame_bufs(cm); |
| 204 |
| 205 #if CONFIG_INTERNAL_STATS || CONFIG_VP9_POSTPROC |
| 206 if (vp9_alloc_frame_buffer(&cm->post_proc_buffer, width, height, ss_x, ss_y, |
| 207 VP9_ENC_BORDER_IN_PIXELS) < 0) |
| 208 goto fail; |
| 209 #endif |
| 210 |
| 211 return 0; |
| 212 |
| 213 fail: |
| 214 vp9_free_frame_buffers(cm); |
| 168 return 1; | 215 return 1; |
| 169 } | 216 } |
| 170 | 217 |
| 171 int vp9_alloc_frame_buffers(VP9_COMMON *cm, int width, int height) { | 218 int vp9_alloc_context_buffers(VP9_COMMON *cm, int width, int height) { |
| 172 const int aligned_width = ALIGN_POWER_OF_TWO(width, MI_SIZE_LOG2); | 219 const int aligned_width = ALIGN_POWER_OF_TWO(width, MI_SIZE_LOG2); |
| 173 const int aligned_height = ALIGN_POWER_OF_TWO(height, MI_SIZE_LOG2); | 220 const int aligned_height = ALIGN_POWER_OF_TWO(height, MI_SIZE_LOG2); |
| 174 const int ss_x = cm->subsampling_x; | |
| 175 const int ss_y = cm->subsampling_y; | |
| 176 int i; | |
| 177 | 221 |
| 178 vp9_free_frame_buffers(cm); | 222 vp9_free_context_buffers(cm); |
| 179 | |
| 180 for (i = 0; i < FRAME_BUFFERS; i++) { | |
| 181 cm->frame_bufs[i].ref_count = 0; | |
| 182 if (vp9_alloc_frame_buffer(&cm->frame_bufs[i].buf, width, height, | |
| 183 ss_x, ss_y, VP9_ENC_BORDER_IN_PIXELS) < 0) | |
| 184 goto fail; | |
| 185 } | |
| 186 | |
| 187 cm->new_fb_idx = FRAME_BUFFERS - 1; | |
| 188 cm->frame_bufs[cm->new_fb_idx].ref_count = 1; | |
| 189 | |
| 190 for (i = 0; i < REF_FRAMES; i++) { | |
| 191 cm->ref_frame_map[i] = i; | |
| 192 cm->frame_bufs[i].ref_count = 1; | |
| 193 } | |
| 194 | |
| 195 if (vp9_alloc_frame_buffer(&cm->post_proc_buffer, width, height, ss_x, ss_y, | |
| 196 VP9_ENC_BORDER_IN_PIXELS) < 0) | |
| 197 goto fail; | |
| 198 | 223 |
| 199 set_mb_mi(cm, aligned_width, aligned_height); | 224 set_mb_mi(cm, aligned_width, aligned_height); |
| 200 | 225 |
| 201 if (alloc_mi(cm, cm->mi_stride * (cm->mi_rows + MI_BLOCK_SIZE))) | 226 if (alloc_mi(cm, cm->mi_stride * (cm->mi_rows + MI_BLOCK_SIZE))) |
| 202 goto fail; | 227 goto fail; |
| 203 | 228 |
| 204 setup_mi(cm); | 229 setup_mi(cm); |
| 205 | 230 |
| 206 // Create the segmentation map structure and set to 0. | 231 // Create the segmentation map structure and set to 0. |
| 207 cm->last_frame_seg_map = (uint8_t *)vpx_calloc(cm->mi_rows * cm->mi_cols, 1); | 232 cm->last_frame_seg_map = (uint8_t *)vpx_calloc(cm->mi_rows * cm->mi_cols, 1); |
| 208 if (!cm->last_frame_seg_map) | 233 if (!cm->last_frame_seg_map) |
| 209 goto fail; | 234 goto fail; |
| 210 | 235 |
| 211 cm->above_context = | 236 cm->above_context = |
| 212 (ENTROPY_CONTEXT *)vpx_calloc(2 * mi_cols_aligned_to_sb(cm->mi_cols) * | 237 (ENTROPY_CONTEXT *)vpx_calloc(2 * mi_cols_aligned_to_sb(cm->mi_cols) * |
| 213 MAX_MB_PLANE, | 238 MAX_MB_PLANE, |
| 214 sizeof(*cm->above_context)); | 239 sizeof(*cm->above_context)); |
| 215 if (!cm->above_context) | 240 if (!cm->above_context) |
| 216 goto fail; | 241 goto fail; |
| 217 | 242 |
| 218 cm->above_seg_context = | 243 cm->above_seg_context = |
| 219 (PARTITION_CONTEXT *)vpx_calloc(mi_cols_aligned_to_sb(cm->mi_cols), | 244 (PARTITION_CONTEXT *)vpx_calloc(mi_cols_aligned_to_sb(cm->mi_cols), |
| 220 sizeof(*cm->above_seg_context)); | 245 sizeof(*cm->above_seg_context)); |
| 221 if (!cm->above_seg_context) | 246 if (!cm->above_seg_context) |
| 222 goto fail; | 247 goto fail; |
| 223 | 248 |
| 224 return 0; | 249 return 0; |
| 225 | 250 |
| 226 fail: | 251 fail: |
| 227 vp9_free_frame_buffers(cm); | 252 vp9_free_context_buffers(cm); |
| 228 return 1; | 253 return 1; |
| 229 } | 254 } |
| 230 | 255 |
| 231 void vp9_remove_common(VP9_COMMON *cm) { | 256 void vp9_remove_common(VP9_COMMON *cm) { |
| 232 vp9_free_frame_buffers(cm); | 257 vp9_free_frame_buffers(cm); |
| 258 vp9_free_context_buffers(cm); |
| 233 vp9_free_internal_frame_buffers(&cm->int_frame_buffers); | 259 vp9_free_internal_frame_buffers(&cm->int_frame_buffers); |
| 234 } | 260 } |
| 235 | 261 |
| 236 void vp9_update_frame_size(VP9_COMMON *cm) { | 262 void vp9_update_frame_size(VP9_COMMON *cm) { |
| 237 const int aligned_width = ALIGN_POWER_OF_TWO(cm->width, MI_SIZE_LOG2); | 263 const int aligned_width = ALIGN_POWER_OF_TWO(cm->width, MI_SIZE_LOG2); |
| 238 const int aligned_height = ALIGN_POWER_OF_TWO(cm->height, MI_SIZE_LOG2); | 264 const int aligned_height = ALIGN_POWER_OF_TWO(cm->height, MI_SIZE_LOG2); |
| 239 | 265 |
| 240 set_mb_mi(cm, aligned_width, aligned_height); | 266 set_mb_mi(cm, aligned_width, aligned_height); |
| 241 setup_mi(cm); | 267 setup_mi(cm); |
| 242 | 268 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 256 cm->prev_mip = cm->mip_array[cm->prev_mi_idx]; | 282 cm->prev_mip = cm->mip_array[cm->prev_mi_idx]; |
| 257 cm->mi_grid_base = cm->mi_grid_base_array[cm->mi_idx]; | 283 cm->mi_grid_base = cm->mi_grid_base_array[cm->mi_idx]; |
| 258 cm->prev_mi_grid_base = cm->mi_grid_base_array[cm->prev_mi_idx]; | 284 cm->prev_mi_grid_base = cm->mi_grid_base_array[cm->prev_mi_idx]; |
| 259 | 285 |
| 260 // Update the upper left visible macroblock ptrs. | 286 // Update the upper left visible macroblock ptrs. |
| 261 cm->mi = cm->mip + cm->mi_stride + 1; | 287 cm->mi = cm->mip + cm->mi_stride + 1; |
| 262 cm->prev_mi = cm->prev_mip + cm->mi_stride + 1; | 288 cm->prev_mi = cm->prev_mip + cm->mi_stride + 1; |
| 263 cm->mi_grid_visible = cm->mi_grid_base + cm->mi_stride + 1; | 289 cm->mi_grid_visible = cm->mi_grid_base + cm->mi_stride + 1; |
| 264 cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mi_stride + 1; | 290 cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mi_stride + 1; |
| 265 } | 291 } |
| OLD | NEW |