Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Side by Side Diff: source/libvpx/vp9/encoder/vp9_encoder.c

Issue 756673003: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_encoder.h ('k') | source/libvpx/vp9/encoder/vp9_firstpass.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 if (!cpi->use_svc) 127 if (!cpi->use_svc)
128 cm->frame_context_idx = cpi->refresh_alt_ref_frame; 128 cm->frame_context_idx = cpi->refresh_alt_ref_frame;
129 } 129 }
130 130
131 if (cm->frame_type == KEY_FRAME) { 131 if (cm->frame_type == KEY_FRAME) {
132 if (!is_two_pass_svc(cpi)) 132 if (!is_two_pass_svc(cpi))
133 cpi->refresh_golden_frame = 1; 133 cpi->refresh_golden_frame = 1;
134 cpi->refresh_alt_ref_frame = 1; 134 cpi->refresh_alt_ref_frame = 1;
135 vp9_zero(cpi->interp_filter_selected); 135 vp9_zero(cpi->interp_filter_selected);
136 } else { 136 } else {
137 cm->fc = cm->frame_contexts[cm->frame_context_idx]; 137 *cm->fc = cm->frame_contexts[cm->frame_context_idx];
138 vp9_zero(cpi->interp_filter_selected[0]); 138 vp9_zero(cpi->interp_filter_selected[0]);
139 } 139 }
140 } 140 }
141 141
142 static void vp9_enc_setup_mi(VP9_COMMON *cm) {
143 int i;
144 cm->mi = cm->mip + cm->mi_stride + 1;
145 vpx_memset(cm->mip, 0, cm->mi_stride * (cm->mi_rows + 1) * sizeof(*cm->mip));
146 cm->prev_mi = cm->prev_mip + cm->mi_stride + 1;
147 // Clear top border row
148 vpx_memset(cm->prev_mip, 0, sizeof(*cm->prev_mip) * cm->mi_stride);
149 // Clear left border column
150 for (i = 1; i < cm->mi_rows + 1; ++i)
151 vpx_memset(&cm->prev_mip[i * cm->mi_stride], 0, sizeof(*cm->prev_mip));
152 }
153
154 static int vp9_enc_alloc_mi(VP9_COMMON *cm, int mi_size) {
155 cm->mip = vpx_calloc(mi_size, sizeof(*cm->mip));
156 if (!cm->mip)
157 return 1;
158 cm->prev_mip = vpx_calloc(mi_size, sizeof(*cm->prev_mip));
159 if (!cm->prev_mip)
160 return 1;
161 cm->mi_alloc_size = mi_size;
162 return 0;
163 }
164
165 static void vp9_enc_free_mi(VP9_COMMON *cm) {
166 vpx_free(cm->mip);
167 cm->mip = NULL;
168 vpx_free(cm->prev_mip);
169 cm->prev_mip = NULL;
170 }
171
172 static void vp9_swap_mi_and_prev_mi(VP9_COMMON *cm) {
173 // Current mip will be the prev_mip for the next frame.
174 MODE_INFO *temp = cm->prev_mip;
175 cm->prev_mip = cm->mip;
176 cm->mip = temp;
177
178 // Update the upper left visible macroblock ptrs.
179 cm->mi = cm->mip + cm->mi_stride + 1;
180 cm->prev_mi = cm->prev_mip + cm->mi_stride + 1;
181 }
182
142 void vp9_initialize_enc() { 183 void vp9_initialize_enc() {
143 static int init_done = 0; 184 static int init_done = 0;
144 185
145 if (!init_done) { 186 if (!init_done) {
146 vp9_rtcd(); 187 vp9_rtcd();
147 vp9_init_intra_predictors(); 188 vp9_init_intra_predictors();
148 vp9_coef_tree_initialize(); 189 vp9_coef_tree_initialize();
149 vp9_tokenize_initialize(); 190 vp9_tokenize_initialize();
150 vp9_init_me_luts(); 191 vp9_init_me_luts();
151 vp9_rc_init_minq_luts(); 192 vp9_rc_init_minq_luts();
152 vp9_entropy_mv_init(); 193 vp9_entropy_mv_init();
153 vp9_entropy_mode_init(); 194 vp9_entropy_mode_init();
154 vp9_temporal_filter_init(); 195 vp9_temporal_filter_init();
155 init_done = 1; 196 init_done = 1;
156 } 197 }
157 } 198 }
158 199
159 static void dealloc_compressor_data(VP9_COMP *cpi) { 200 static void dealloc_compressor_data(VP9_COMP *cpi) {
160 VP9_COMMON *const cm = &cpi->common; 201 VP9_COMMON *const cm = &cpi->common;
161 int i; 202 int i;
162 203
204 vpx_free(cpi->tile_data);
205 cpi->tile_data = NULL;
206
163 // Delete sementation map 207 // Delete sementation map
164 vpx_free(cpi->segmentation_map); 208 vpx_free(cpi->segmentation_map);
165 cpi->segmentation_map = NULL; 209 cpi->segmentation_map = NULL;
166 vpx_free(cm->last_frame_seg_map); 210 vpx_free(cm->last_frame_seg_map);
167 cm->last_frame_seg_map = NULL; 211 cm->last_frame_seg_map = NULL;
168 vpx_free(cpi->coding_context.last_frame_seg_map_copy); 212 vpx_free(cpi->coding_context.last_frame_seg_map_copy);
169 cpi->coding_context.last_frame_seg_map_copy = NULL; 213 cpi->coding_context.last_frame_seg_map_copy = NULL;
170 214
171 vpx_free(cpi->complexity_map); 215 vpx_free(cpi->complexity_map);
172 cpi->complexity_map = NULL; 216 cpi->complexity_map = NULL;
(...skipping 11 matching lines...) Expand all
184 vpx_free(cpi->nmvsadcosts[0]); 228 vpx_free(cpi->nmvsadcosts[0]);
185 vpx_free(cpi->nmvsadcosts[1]); 229 vpx_free(cpi->nmvsadcosts[1]);
186 cpi->nmvsadcosts[0] = NULL; 230 cpi->nmvsadcosts[0] = NULL;
187 cpi->nmvsadcosts[1] = NULL; 231 cpi->nmvsadcosts[1] = NULL;
188 232
189 vpx_free(cpi->nmvsadcosts_hp[0]); 233 vpx_free(cpi->nmvsadcosts_hp[0]);
190 vpx_free(cpi->nmvsadcosts_hp[1]); 234 vpx_free(cpi->nmvsadcosts_hp[1]);
191 cpi->nmvsadcosts_hp[0] = NULL; 235 cpi->nmvsadcosts_hp[0] = NULL;
192 cpi->nmvsadcosts_hp[1] = NULL; 236 cpi->nmvsadcosts_hp[1] = NULL;
193 237
238 vpx_free(cpi->frame_counts);
239 cpi->frame_counts = NULL;
240
194 vp9_cyclic_refresh_free(cpi->cyclic_refresh); 241 vp9_cyclic_refresh_free(cpi->cyclic_refresh);
195 cpi->cyclic_refresh = NULL; 242 cpi->cyclic_refresh = NULL;
196 243
197 vp9_free_ref_frame_buffers(cm); 244 vp9_free_ref_frame_buffers(cm);
198 vp9_free_context_buffers(cm); 245 vp9_free_context_buffers(cm);
199 246
200 vp9_free_frame_buffer(&cpi->last_frame_uf); 247 vp9_free_frame_buffer(&cpi->last_frame_uf);
201 vp9_free_frame_buffer(&cpi->scaled_source); 248 vp9_free_frame_buffer(&cpi->scaled_source);
202 vp9_free_frame_buffer(&cpi->scaled_last_source); 249 vp9_free_frame_buffer(&cpi->scaled_last_source);
203 vp9_free_frame_buffer(&cpi->alt_ref_buffer); 250 vp9_free_frame_buffer(&cpi->alt_ref_buffer);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 MV_VALS * sizeof(*cpi->nmvcosts_hp[1])); 297 MV_VALS * sizeof(*cpi->nmvcosts_hp[1]));
251 298
252 vp9_copy(cc->segment_pred_probs, cm->seg.pred_probs); 299 vp9_copy(cc->segment_pred_probs, cm->seg.pred_probs);
253 300
254 vpx_memcpy(cpi->coding_context.last_frame_seg_map_copy, 301 vpx_memcpy(cpi->coding_context.last_frame_seg_map_copy,
255 cm->last_frame_seg_map, (cm->mi_rows * cm->mi_cols)); 302 cm->last_frame_seg_map, (cm->mi_rows * cm->mi_cols));
256 303
257 vp9_copy(cc->last_ref_lf_deltas, cm->lf.last_ref_deltas); 304 vp9_copy(cc->last_ref_lf_deltas, cm->lf.last_ref_deltas);
258 vp9_copy(cc->last_mode_lf_deltas, cm->lf.last_mode_deltas); 305 vp9_copy(cc->last_mode_lf_deltas, cm->lf.last_mode_deltas);
259 306
260 cc->fc = cm->fc; 307 cc->fc = *cm->fc;
261 } 308 }
262 309
263 static void restore_coding_context(VP9_COMP *cpi) { 310 static void restore_coding_context(VP9_COMP *cpi) {
264 CODING_CONTEXT *const cc = &cpi->coding_context; 311 CODING_CONTEXT *const cc = &cpi->coding_context;
265 VP9_COMMON *cm = &cpi->common; 312 VP9_COMMON *cm = &cpi->common;
266 313
267 // Restore key state variables to the snapshot state stored in the 314 // Restore key state variables to the snapshot state stored in the
268 // previous call to vp9_save_coding_context. 315 // previous call to vp9_save_coding_context.
269 vp9_copy(cpi->mb.nmvjointcost, cc->nmvjointcost); 316 vp9_copy(cpi->mb.nmvjointcost, cc->nmvjointcost);
270 317
271 vpx_memcpy(cpi->nmvcosts[0], cc->nmvcosts[0], 318 vpx_memcpy(cpi->nmvcosts[0], cc->nmvcosts[0],
272 MV_VALS * sizeof(*cc->nmvcosts[0])); 319 MV_VALS * sizeof(*cc->nmvcosts[0]));
273 vpx_memcpy(cpi->nmvcosts[1], cc->nmvcosts[1], 320 vpx_memcpy(cpi->nmvcosts[1], cc->nmvcosts[1],
274 MV_VALS * sizeof(*cc->nmvcosts[1])); 321 MV_VALS * sizeof(*cc->nmvcosts[1]));
275 vpx_memcpy(cpi->nmvcosts_hp[0], cc->nmvcosts_hp[0], 322 vpx_memcpy(cpi->nmvcosts_hp[0], cc->nmvcosts_hp[0],
276 MV_VALS * sizeof(*cc->nmvcosts_hp[0])); 323 MV_VALS * sizeof(*cc->nmvcosts_hp[0]));
277 vpx_memcpy(cpi->nmvcosts_hp[1], cc->nmvcosts_hp[1], 324 vpx_memcpy(cpi->nmvcosts_hp[1], cc->nmvcosts_hp[1],
278 MV_VALS * sizeof(*cc->nmvcosts_hp[1])); 325 MV_VALS * sizeof(*cc->nmvcosts_hp[1]));
279 326
280 vp9_copy(cm->seg.pred_probs, cc->segment_pred_probs); 327 vp9_copy(cm->seg.pred_probs, cc->segment_pred_probs);
281 328
282 vpx_memcpy(cm->last_frame_seg_map, 329 vpx_memcpy(cm->last_frame_seg_map,
283 cpi->coding_context.last_frame_seg_map_copy, 330 cpi->coding_context.last_frame_seg_map_copy,
284 (cm->mi_rows * cm->mi_cols)); 331 (cm->mi_rows * cm->mi_cols));
285 332
286 vp9_copy(cm->lf.last_ref_deltas, cc->last_ref_lf_deltas); 333 vp9_copy(cm->lf.last_ref_deltas, cc->last_ref_lf_deltas);
287 vp9_copy(cm->lf.last_mode_deltas, cc->last_mode_lf_deltas); 334 vp9_copy(cm->lf.last_mode_deltas, cc->last_mode_lf_deltas);
288 335
289 cm->fc = cc->fc; 336 *cm->fc = cc->fc;
290 } 337 }
291 338
292 static void configure_static_seg_features(VP9_COMP *cpi) { 339 static void configure_static_seg_features(VP9_COMP *cpi) {
293 VP9_COMMON *const cm = &cpi->common; 340 VP9_COMMON *const cm = &cpi->common;
294 const RATE_CONTROL *const rc = &cpi->rc; 341 const RATE_CONTROL *const rc = &cpi->rc;
295 struct segmentation *const seg = &cm->seg; 342 struct segmentation *const seg = &cm->seg;
296 343
297 int high_q = (int)(rc->avg_q > 48.0); 344 int high_q = (int)(rc->avg_q > 48.0);
298 int qi_delta; 345 int qi_delta;
299 346
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 vp9_alloc_compressor_data(cpi); 617 vp9_alloc_compressor_data(cpi);
571 618
572 // Spatial scalability. 619 // Spatial scalability.
573 cpi->svc.number_spatial_layers = oxcf->ss_number_layers; 620 cpi->svc.number_spatial_layers = oxcf->ss_number_layers;
574 // Temporal scalability. 621 // Temporal scalability.
575 cpi->svc.number_temporal_layers = oxcf->ts_number_layers; 622 cpi->svc.number_temporal_layers = oxcf->ts_number_layers;
576 623
577 if ((cpi->svc.number_temporal_layers > 1 && cpi->oxcf.rc_mode == VPX_CBR) || 624 if ((cpi->svc.number_temporal_layers > 1 && cpi->oxcf.rc_mode == VPX_CBR) ||
578 ((cpi->svc.number_temporal_layers > 1 || 625 ((cpi->svc.number_temporal_layers > 1 ||
579 cpi->svc.number_spatial_layers > 1) && 626 cpi->svc.number_spatial_layers > 1) &&
580 cpi->oxcf.pass == 2)) { 627 cpi->oxcf.pass != 1)) {
581 vp9_init_layer_context(cpi); 628 vp9_init_layer_context(cpi);
582 } 629 }
583 630
584 // change includes all joint functionality 631 // change includes all joint functionality
585 vp9_change_config(cpi, oxcf); 632 vp9_change_config(cpi, oxcf);
586 633
587 cpi->static_mb_pct = 0; 634 cpi->static_mb_pct = 0;
588 cpi->ref_frame_flags = 0; 635 cpi->ref_frame_flags = 0;
589 636
590 init_buffer_indices(cpi); 637 init_buffer_indices(cpi);
(...skipping 680 matching lines...) Expand 10 before | Expand all | Expand 10 after
1271 // TODO(jkoleszar): exit gracefully. 1318 // TODO(jkoleszar): exit gracefully.
1272 assert(cm->width <= cpi->initial_width); 1319 assert(cm->width <= cpi->initial_width);
1273 assert(cm->height <= cpi->initial_height); 1320 assert(cm->height <= cpi->initial_height);
1274 } 1321 }
1275 update_frame_size(cpi); 1322 update_frame_size(cpi);
1276 1323
1277 if ((cpi->svc.number_temporal_layers > 1 && 1324 if ((cpi->svc.number_temporal_layers > 1 &&
1278 cpi->oxcf.rc_mode == VPX_CBR) || 1325 cpi->oxcf.rc_mode == VPX_CBR) ||
1279 ((cpi->svc.number_temporal_layers > 1 || 1326 ((cpi->svc.number_temporal_layers > 1 ||
1280 cpi->svc.number_spatial_layers > 1) && 1327 cpi->svc.number_spatial_layers > 1) &&
1281 cpi->oxcf.pass == 2)) { 1328 cpi->oxcf.pass != 1)) {
1282 vp9_update_layer_context_change_config(cpi, 1329 vp9_update_layer_context_change_config(cpi,
1283 (int)cpi->oxcf.target_bandwidth); 1330 (int)cpi->oxcf.target_bandwidth);
1284 } 1331 }
1285 1332
1286 cpi->alt_ref_source = NULL; 1333 cpi->alt_ref_source = NULL;
1287 rc->is_src_frame_alt_ref = 0; 1334 rc->is_src_frame_alt_ref = 0;
1288 1335
1289 #if 0 1336 #if 0
1290 // Experimental RD Code 1337 // Experimental RD Code
1291 cpi->frame_distortion = 0; 1338 cpi->frame_distortion = 0;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1350 double z = 256 * (2 * (log2f(8 * i) + .6)); 1397 double z = 256 * (2 * (log2f(8 * i) + .6));
1351 mvsadcost[0][i] = (int)z; 1398 mvsadcost[0][i] = (int)z;
1352 mvsadcost[1][i] = (int)z; 1399 mvsadcost[1][i] = (int)z;
1353 mvsadcost[0][-i] = (int)z; 1400 mvsadcost[0][-i] = (int)z;
1354 mvsadcost[1][-i] = (int)z; 1401 mvsadcost[1][-i] = (int)z;
1355 } while (++i <= MV_MAX); 1402 } while (++i <= MV_MAX);
1356 } 1403 }
1357 1404
1358 1405
1359 VP9_COMP *vp9_create_compressor(VP9EncoderConfig *oxcf) { 1406 VP9_COMP *vp9_create_compressor(VP9EncoderConfig *oxcf) {
1360 unsigned int i, j; 1407 unsigned int i;
1361 VP9_COMP *const cpi = vpx_memalign(32, sizeof(VP9_COMP)); 1408 VP9_COMP *const cpi = vpx_memalign(32, sizeof(VP9_COMP));
1362 VP9_COMMON *const cm = cpi != NULL ? &cpi->common : NULL; 1409 VP9_COMMON *const cm = cpi != NULL ? &cpi->common : NULL;
1363 1410
1364 if (!cm) 1411 if (!cm)
1365 return NULL; 1412 return NULL;
1366 1413
1367 vp9_zero(*cpi); 1414 vp9_zero(*cpi);
1368 1415
1369 if (setjmp(cm->error.jmp)) { 1416 if (setjmp(cm->error.jmp)) {
1370 cm->error.setjmp = 0; 1417 cm->error.setjmp = 0;
1371 vp9_remove_compressor(cpi); 1418 vp9_remove_compressor(cpi);
1372 return 0; 1419 return 0;
1373 } 1420 }
1374 1421
1375 cm->error.setjmp = 1; 1422 cm->error.setjmp = 1;
1423 cm->alloc_mi = vp9_enc_alloc_mi;
1424 cm->free_mi = vp9_enc_free_mi;
1425 cm->setup_mi = vp9_enc_setup_mi;
1426
1427 CHECK_MEM_ERROR(cm, cm->fc,
1428 (FRAME_CONTEXT *)vpx_calloc(1, sizeof(*cm->fc)));
1429 CHECK_MEM_ERROR(cm, cm->frame_contexts,
1430 (FRAME_CONTEXT *)vpx_calloc(FRAME_CONTEXTS,
1431 sizeof(*cm->frame_contexts)));
1376 1432
1377 cpi->use_svc = 0; 1433 cpi->use_svc = 0;
1378 1434
1379 init_config(cpi, oxcf); 1435 init_config(cpi, oxcf);
1380 vp9_rc_init(&cpi->oxcf, oxcf->pass, &cpi->rc); 1436 vp9_rc_init(&cpi->oxcf, oxcf->pass, &cpi->rc);
1381 1437
1382 cm->current_video_frame = 0; 1438 cm->current_video_frame = 0;
1383 cpi->partition_search_skippable_frame = 0; 1439 cpi->partition_search_skippable_frame = 0;
1440 cpi->tile_data = NULL;
1384 1441
1385 // Create the encoder segmentation map and set all entries to 0 1442 // Create the encoder segmentation map and set all entries to 0
1386 CHECK_MEM_ERROR(cm, cpi->segmentation_map, 1443 CHECK_MEM_ERROR(cm, cpi->segmentation_map,
1387 vpx_calloc(cm->mi_rows * cm->mi_cols, 1)); 1444 vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
1388 1445
1389 // Create a complexity map used for rd adjustment 1446 // Create a complexity map used for rd adjustment
1390 CHECK_MEM_ERROR(cm, cpi->complexity_map, 1447 CHECK_MEM_ERROR(cm, cpi->complexity_map,
1391 vpx_calloc(cm->mi_rows * cm->mi_cols, 1)); 1448 vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
1392 1449
1393 // Create a map used for cyclic background refresh. 1450 // Create a map used for cyclic background refresh.
(...skipping 15 matching lines...) Expand all
1409 vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts_hp[1]))); 1466 vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts_hp[1])));
1410 CHECK_MEM_ERROR(cm, cpi->nmvsadcosts[0], 1467 CHECK_MEM_ERROR(cm, cpi->nmvsadcosts[0],
1411 vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts[0]))); 1468 vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts[0])));
1412 CHECK_MEM_ERROR(cm, cpi->nmvsadcosts[1], 1469 CHECK_MEM_ERROR(cm, cpi->nmvsadcosts[1],
1413 vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts[1]))); 1470 vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts[1])));
1414 CHECK_MEM_ERROR(cm, cpi->nmvsadcosts_hp[0], 1471 CHECK_MEM_ERROR(cm, cpi->nmvsadcosts_hp[0],
1415 vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts_hp[0]))); 1472 vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts_hp[0])));
1416 CHECK_MEM_ERROR(cm, cpi->nmvsadcosts_hp[1], 1473 CHECK_MEM_ERROR(cm, cpi->nmvsadcosts_hp[1],
1417 vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts_hp[1]))); 1474 vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts_hp[1])));
1418 1475
1476 CHECK_MEM_ERROR(cm, cpi->frame_counts, vpx_calloc(1,
1477 sizeof(*cpi->frame_counts)));
1478
1419 for (i = 0; i < (sizeof(cpi->mbgraph_stats) / 1479 for (i = 0; i < (sizeof(cpi->mbgraph_stats) /
1420 sizeof(cpi->mbgraph_stats[0])); i++) { 1480 sizeof(cpi->mbgraph_stats[0])); i++) {
1421 CHECK_MEM_ERROR(cm, cpi->mbgraph_stats[i].mb_stats, 1481 CHECK_MEM_ERROR(cm, cpi->mbgraph_stats[i].mb_stats,
1422 vpx_calloc(cm->MBs * 1482 vpx_calloc(cm->MBs *
1423 sizeof(*cpi->mbgraph_stats[i].mb_stats), 1)); 1483 sizeof(*cpi->mbgraph_stats[i].mb_stats), 1));
1424 } 1484 }
1425 1485
1426 #if CONFIG_FP_MB_STATS 1486 #if CONFIG_FP_MB_STATS
1427 cpi->use_fp_mb_stats = 0; 1487 cpi->use_fp_mb_stats = 0;
1428 if (cpi->use_fp_mb_stats) { 1488 if (cpi->use_fp_mb_stats) {
1429 // a place holder used to store the first pass mb stats in the first pass 1489 // a place holder used to store the first pass mb stats in the first pass
1430 CHECK_MEM_ERROR(cm, cpi->twopass.frame_mb_stats_buf, 1490 CHECK_MEM_ERROR(cm, cpi->twopass.frame_mb_stats_buf,
1431 vpx_calloc(cm->MBs * sizeof(uint8_t), 1)); 1491 vpx_calloc(cm->MBs * sizeof(uint8_t), 1));
1432 } else { 1492 } else {
1433 cpi->twopass.frame_mb_stats_buf = NULL; 1493 cpi->twopass.frame_mb_stats_buf = NULL;
1434 } 1494 }
1435 #endif 1495 #endif
1436 1496
1437 cpi->refresh_alt_ref_frame = 0; 1497 cpi->refresh_alt_ref_frame = 0;
1438
1439 // Note that at the moment multi_arf will not work with svc.
1440 // For the current check in all the execution paths are defaulted to 0
1441 // pending further tuning and testing. The code is left in place here
1442 // as a place holder in regard to the required paths.
1443 cpi->multi_arf_last_grp_enabled = 0; 1498 cpi->multi_arf_last_grp_enabled = 0;
1444 if (oxcf->pass == 2) {
1445 if (cpi->use_svc) {
1446 cpi->multi_arf_allowed = 0;
1447 cpi->multi_arf_enabled = 0;
1448 } else {
1449 // Disable by default for now.
1450 cpi->multi_arf_allowed = 0;
1451 cpi->multi_arf_enabled = 0;
1452 }
1453 } else {
1454 cpi->multi_arf_allowed = 0;
1455 cpi->multi_arf_enabled = 0;
1456 }
1457 1499
1458 cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS; 1500 cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
1459 #if CONFIG_INTERNAL_STATS 1501 #if CONFIG_INTERNAL_STATS
1460 cpi->b_calculate_ssimg = 0; 1502 cpi->b_calculate_ssimg = 0;
1461 1503
1462 cpi->count = 0; 1504 cpi->count = 0;
1463 cpi->bytes = 0; 1505 cpi->bytes = 0;
1464 1506
1465 if (cpi->b_calculate_psnr) { 1507 if (cpi->b_calculate_psnr) {
1466 cpi->total_y = 0.0; 1508 cpi->total_y = 0.0;
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
1582 #endif 1624 #endif
1583 1625
1584 cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf; 1626 cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf;
1585 cpi->twopass.stats_in = cpi->twopass.stats_in_start; 1627 cpi->twopass.stats_in = cpi->twopass.stats_in_start;
1586 cpi->twopass.stats_in_end = &cpi->twopass.stats_in[packets - 1]; 1628 cpi->twopass.stats_in_end = &cpi->twopass.stats_in[packets - 1];
1587 1629
1588 vp9_init_second_pass(cpi); 1630 vp9_init_second_pass(cpi);
1589 } 1631 }
1590 } 1632 }
1591 1633
1592 vp9_set_speed_features(cpi); 1634 vp9_set_speed_features_framesize_independent(cpi);
1635 vp9_set_speed_features_framesize_dependent(cpi);
1593 1636
1594 // Allocate memory to store variances for a frame. 1637 // Allocate memory to store variances for a frame.
1595 CHECK_MEM_ERROR(cm, cpi->source_diff_var, 1638 CHECK_MEM_ERROR(cm, cpi->source_diff_var,
1596 vpx_calloc(cm->MBs, sizeof(diff))); 1639 vpx_calloc(cm->MBs, sizeof(diff)));
1597 cpi->source_var_thresh = 0; 1640 cpi->source_var_thresh = 0;
1598 cpi->frames_till_next_var_check = 0; 1641 cpi->frames_till_next_var_check = 0;
1599 1642
1600 // Default rd threshold factors for mode selection
1601 for (i = 0; i < BLOCK_SIZES; ++i) {
1602 for (j = 0; j < MAX_MODES; ++j) {
1603 cpi->rd.thresh_freq_fact[i][j] = 32;
1604 cpi->rd.mode_map[i][j] = j;
1605 }
1606 }
1607
1608 #define BFP(BT, SDF, SDAF, VF, SVF, SVAF, SDX3F, SDX8F, SDX4DF)\ 1643 #define BFP(BT, SDF, SDAF, VF, SVF, SVAF, SDX3F, SDX8F, SDX4DF)\
1609 cpi->fn_ptr[BT].sdf = SDF; \ 1644 cpi->fn_ptr[BT].sdf = SDF; \
1610 cpi->fn_ptr[BT].sdaf = SDAF; \ 1645 cpi->fn_ptr[BT].sdaf = SDAF; \
1611 cpi->fn_ptr[BT].vf = VF; \ 1646 cpi->fn_ptr[BT].vf = VF; \
1612 cpi->fn_ptr[BT].svf = SVF; \ 1647 cpi->fn_ptr[BT].svf = SVF; \
1613 cpi->fn_ptr[BT].svaf = SVAF; \ 1648 cpi->fn_ptr[BT].svaf = SVAF; \
1614 cpi->fn_ptr[BT].sdx3f = SDX3F; \ 1649 cpi->fn_ptr[BT].sdx3f = SDX3F; \
1615 cpi->fn_ptr[BT].sdx8f = SDX8F; \ 1650 cpi->fn_ptr[BT].sdx8f = SDX8F; \
1616 cpi->fn_ptr[BT].sdx4df = SDX4DF; 1651 cpi->fn_ptr[BT].sdx4df = SDX4DF;
1617 1652
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1686 vp9_init_quantizer(cpi); 1721 vp9_init_quantizer(cpi);
1687 1722
1688 vp9_loop_filter_init(cm); 1723 vp9_loop_filter_init(cm);
1689 1724
1690 cm->error.setjmp = 0; 1725 cm->error.setjmp = 0;
1691 1726
1692 return cpi; 1727 return cpi;
1693 } 1728 }
1694 1729
1695 void vp9_remove_compressor(VP9_COMP *cpi) { 1730 void vp9_remove_compressor(VP9_COMP *cpi) {
1731 VP9_COMMON *const cm = &cpi->common;
1696 unsigned int i; 1732 unsigned int i;
1697 1733
1698 if (!cpi) 1734 if (!cpi)
1699 return; 1735 return;
1700 1736
1701 if (cpi && (cpi->common.current_video_frame > 0)) { 1737 if (cpi && (cm->current_video_frame > 0)) {
1702 #if CONFIG_INTERNAL_STATS 1738 #if CONFIG_INTERNAL_STATS
1703 1739
1704 vp9_clear_system_state(); 1740 vp9_clear_system_state();
1705 1741
1706 // printf("\n8x8-4x4:%d-%d\n", cpi->t8x8_count, cpi->t4x4_count); 1742 // printf("\n8x8-4x4:%d-%d\n", cpi->t8x8_count, cpi->t4x4_count);
1707 if (cpi->oxcf.pass != 1) { 1743 if (cpi->oxcf.pass != 1) {
1708 FILE *f = fopen("opsnr.stt", "a"); 1744 FILE *f = fopen("opsnr.stt", "a");
1709 double time_encoded = (cpi->last_end_time_stamp_seen 1745 double time_encoded = (cpi->last_end_time_stamp_seen
1710 - cpi->first_time_stamp_ever) / 10000000.000; 1746 - cpi->first_time_stamp_ever) / 10000000.000;
1711 double total_encode_time = (cpi->time_receive_data + 1747 double total_encode_time = (cpi->time_receive_data +
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1774 vpx_free(cpi->mbgraph_stats[i].mb_stats); 1810 vpx_free(cpi->mbgraph_stats[i].mb_stats);
1775 } 1811 }
1776 1812
1777 #if CONFIG_FP_MB_STATS 1813 #if CONFIG_FP_MB_STATS
1778 if (cpi->use_fp_mb_stats) { 1814 if (cpi->use_fp_mb_stats) {
1779 vpx_free(cpi->twopass.frame_mb_stats_buf); 1815 vpx_free(cpi->twopass.frame_mb_stats_buf);
1780 cpi->twopass.frame_mb_stats_buf = NULL; 1816 cpi->twopass.frame_mb_stats_buf = NULL;
1781 } 1817 }
1782 #endif 1818 #endif
1783 1819
1784 vp9_remove_common(&cpi->common); 1820 vp9_remove_common(cm);
1785 vpx_free(cpi); 1821 vpx_free(cpi);
1786 1822
1787 #if CONFIG_VP9_TEMPORAL_DENOISING 1823 #if CONFIG_VP9_TEMPORAL_DENOISING
1788 #ifdef OUTPUT_YUV_DENOISED 1824 #ifdef OUTPUT_YUV_DENOISED
1789 fclose(yuv_denoised_file); 1825 fclose(yuv_denoised_file);
1790 #endif 1826 #endif
1791 #endif 1827 #endif
1792 #ifdef OUTPUT_YUV_REC 1828 #ifdef OUTPUT_YUV_REC
1793 fclose(yuv_rec_file); 1829 fclose(yuv_rec_file);
1794 #endif 1830 #endif
(...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after
2265 } 2301 }
2266 2302
2267 vp9_extend_frame_borders(dst); 2303 vp9_extend_frame_borders(dst);
2268 } 2304 }
2269 2305
2270 // Function to test for conditions that indicate we should loop 2306 // Function to test for conditions that indicate we should loop
2271 // back and recode a frame. 2307 // back and recode a frame.
2272 static int recode_loop_test(const VP9_COMP *cpi, 2308 static int recode_loop_test(const VP9_COMP *cpi,
2273 int high_limit, int low_limit, 2309 int high_limit, int low_limit,
2274 int q, int maxq, int minq) { 2310 int q, int maxq, int minq) {
2275 const VP9_COMMON *const cm = &cpi->common;
2276 const RATE_CONTROL *const rc = &cpi->rc; 2311 const RATE_CONTROL *const rc = &cpi->rc;
2277 const VP9EncoderConfig *const oxcf = &cpi->oxcf; 2312 const VP9EncoderConfig *const oxcf = &cpi->oxcf;
2278 int force_recode = 0; 2313 int force_recode = 0;
2279 2314
2280 // Special case trap if maximum allowed frame size exceeded. 2315 // Special case trap if maximum allowed frame size exceeded.
2281 if (rc->projected_frame_size > rc->max_frame_bandwidth) { 2316 if (rc->projected_frame_size > rc->max_frame_bandwidth) {
2282 force_recode = 1; 2317 force_recode = 1;
2283 2318
2284 // Is frame recode allowed. 2319 // Is frame recode allowed.
2285 // Yes if either recode mode 1 is selected or mode 2 is selected 2320 // Yes if either recode mode 1 is selected or mode 2 is selected
2286 // and the frame is a key frame, golden frame or alt_ref_frame 2321 // and the frame is a key frame, golden frame or alt_ref_frame
2287 } else if ((cpi->sf.recode_loop == ALLOW_RECODE) || 2322 } else if ((cpi->sf.recode_loop == ALLOW_RECODE) ||
2288 ((cpi->sf.recode_loop == ALLOW_RECODE_KFARFGF) && 2323 ((cpi->sf.recode_loop == ALLOW_RECODE_KFARFGF) &&
2289 (cm->frame_type == KEY_FRAME || 2324 frame_is_kf_gf_arf(cpi))) {
2290 cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame))) {
2291 // General over and under shoot tests 2325 // General over and under shoot tests
2292 if ((rc->projected_frame_size > high_limit && q < maxq) || 2326 if ((rc->projected_frame_size > high_limit && q < maxq) ||
2293 (rc->projected_frame_size < low_limit && q > minq)) { 2327 (rc->projected_frame_size < low_limit && q > minq)) {
2294 force_recode = 1; 2328 force_recode = 1;
2295 } else if (cpi->oxcf.rc_mode == VPX_CQ) { 2329 } else if (cpi->oxcf.rc_mode == VPX_CQ) {
2296 // Deal with frame undershoot and whether or not we are 2330 // Deal with frame undershoot and whether or not we are
2297 // below the automatically set cq level. 2331 // below the automatically set cq level.
2298 if (q > oxcf->cq_level && 2332 if (q > oxcf->cq_level &&
2299 rc->projected_frame_size < ((rc->this_frame_target * 7) >> 3)) { 2333 rc->projected_frame_size < ((rc->this_frame_target * 7) >> 3)) {
2300 force_recode = 1; 2334 force_recode = 1;
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
2409 2443
2410 vp9_extend_frame_inner_borders(cm->frame_to_show); 2444 vp9_extend_frame_inner_borders(cm->frame_to_show);
2411 } 2445 }
2412 2446
2413 void vp9_scale_references(VP9_COMP *cpi) { 2447 void vp9_scale_references(VP9_COMP *cpi) {
2414 VP9_COMMON *cm = &cpi->common; 2448 VP9_COMMON *cm = &cpi->common;
2415 MV_REFERENCE_FRAME ref_frame; 2449 MV_REFERENCE_FRAME ref_frame;
2416 const VP9_REFFRAME ref_mask[3] = {VP9_LAST_FLAG, VP9_GOLD_FLAG, VP9_ALT_FLAG}; 2450 const VP9_REFFRAME ref_mask[3] = {VP9_LAST_FLAG, VP9_GOLD_FLAG, VP9_ALT_FLAG};
2417 2451
2418 for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) { 2452 for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
2419 const int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)]; 2453 // Need to convert from VP9_REFFRAME to index into ref_mask (subtract 1).
2420 const YV12_BUFFER_CONFIG *const ref = &cm->frame_bufs[idx].buf; 2454 if (cpi->ref_frame_flags & ref_mask[ref_frame - 1]) {
2455 const int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)];
2456 const YV12_BUFFER_CONFIG *const ref = &cm->frame_bufs[idx].buf;
2421 2457
2422 // Need to convert from VP9_REFFRAME to index into ref_mask (subtract 1).
2423 if ((cpi->ref_frame_flags & ref_mask[ref_frame - 1]) &&
2424 (ref->y_crop_width != cm->width || ref->y_crop_height != cm->height)) {
2425 const int new_fb = get_free_fb(cm);
2426 vp9_realloc_frame_buffer(&cm->frame_bufs[new_fb].buf,
2427 cm->width, cm->height,
2428 cm->subsampling_x, cm->subsampling_y,
2429 #if CONFIG_VP9_HIGHBITDEPTH 2458 #if CONFIG_VP9_HIGHBITDEPTH
2430 cm->use_highbitdepth, 2459 if (ref->y_crop_width != cm->width || ref->y_crop_height != cm->height) {
2460 const int new_fb = get_free_fb(cm);
2461 cm->cur_frame = &cm->frame_bufs[new_fb];
2462 vp9_realloc_frame_buffer(&cm->frame_bufs[new_fb].buf,
2463 cm->width, cm->height,
2464 cm->subsampling_x, cm->subsampling_y,
2465 cm->use_highbitdepth,
2466 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL);
2467 scale_and_extend_frame(ref, &cm->frame_bufs[new_fb].buf,
2468 (int)cm->bit_depth);
2469 #else
2470 if (ref->y_crop_width != cm->width || ref->y_crop_height != cm->height) {
2471 const int new_fb = get_free_fb(cm);
2472 vp9_realloc_frame_buffer(&cm->frame_bufs[new_fb].buf,
2473 cm->width, cm->height,
2474 cm->subsampling_x, cm->subsampling_y,
2475 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL);
2476 scale_and_extend_frame(ref, &cm->frame_bufs[new_fb].buf);
2431 #endif // CONFIG_VP9_HIGHBITDEPTH 2477 #endif // CONFIG_VP9_HIGHBITDEPTH
2432 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL); 2478 cpi->scaled_ref_idx[ref_frame - 1] = new_fb;
2433 #if CONFIG_VP9_HIGHBITDEPTH 2479 if (cm->frame_bufs[new_fb].mvs == NULL ||
2434 scale_and_extend_frame(ref, &cm->frame_bufs[new_fb].buf, 2480 cm->frame_bufs[new_fb].mi_rows < cm->mi_rows ||
2435 (int)cm->bit_depth); 2481 cm->frame_bufs[new_fb].mi_cols < cm->mi_cols) {
2436 #else 2482 cm->frame_bufs[new_fb].mvs =
2437 scale_and_extend_frame(ref, &cm->frame_bufs[new_fb].buf); 2483 (MV_REF *)vpx_calloc(cm->mi_rows * cm->mi_cols,
2438 #endif // CONFIG_VP9_HIGHBITDEPTH 2484 sizeof(*cm->frame_bufs[new_fb].mvs));
2439 cpi->scaled_ref_idx[ref_frame - 1] = new_fb; 2485 cm->frame_bufs[new_fb].mi_rows = cm->mi_rows;
2486 cm->frame_bufs[new_fb].mi_cols = cm->mi_cols;
2487 }
2488 } else {
2489 cpi->scaled_ref_idx[ref_frame - 1] = idx;
2490 ++cm->frame_bufs[idx].ref_count;
2491 }
2440 } else { 2492 } else {
2441 cpi->scaled_ref_idx[ref_frame - 1] = idx; 2493 cpi->scaled_ref_idx[ref_frame - 1] = INVALID_REF_BUFFER_IDX;
2442 cm->frame_bufs[idx].ref_count++;
2443 } 2494 }
2444 } 2495 }
2445 } 2496 }
2446 2497
2447 static void release_scaled_references(VP9_COMP *cpi) { 2498 static void release_scaled_references(VP9_COMP *cpi) {
2448 VP9_COMMON *cm = &cpi->common; 2499 VP9_COMMON *cm = &cpi->common;
2449 int i; 2500 int i;
2450 2501 for (i = 0; i < MAX_REF_FRAMES; ++i) {
2451 for (i = 0; i < 3; i++) 2502 const int idx = cpi->scaled_ref_idx[i];
2452 cm->frame_bufs[cpi->scaled_ref_idx[i]].ref_count--; 2503 RefCntBuffer *const buf =
2504 idx != INVALID_REF_BUFFER_IDX ? &cm->frame_bufs[idx] : NULL;
2505 if (buf != NULL) {
2506 --buf->ref_count;
2507 cpi->scaled_ref_idx[i] = INVALID_REF_BUFFER_IDX;
2508 }
2509 }
2453 } 2510 }
2454 2511
2455 static void full_to_model_count(unsigned int *model_count, 2512 static void full_to_model_count(unsigned int *model_count,
2456 unsigned int *full_count) { 2513 unsigned int *full_count) {
2457 int n; 2514 int n;
2458 model_count[ZERO_TOKEN] = full_count[ZERO_TOKEN]; 2515 model_count[ZERO_TOKEN] = full_count[ZERO_TOKEN];
2459 model_count[ONE_TOKEN] = full_count[ONE_TOKEN]; 2516 model_count[ONE_TOKEN] = full_count[ONE_TOKEN];
2460 model_count[TWO_TOKEN] = full_count[TWO_TOKEN]; 2517 model_count[TWO_TOKEN] = full_count[TWO_TOKEN];
2461 for (n = THREE_TOKEN; n < EOB_TOKEN; ++n) 2518 for (n = THREE_TOKEN; n < EOB_TOKEN; ++n)
2462 model_count[TWO_TOKEN] += full_count[n]; 2519 model_count[TWO_TOKEN] += full_count[n];
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2527 for (i = 0; i < MAX_MODES; ++i) 2584 for (i = 0; i < MAX_MODES; ++i)
2528 fprintf(fmodes, "%5d ", cpi->mode_chosen_counts[i]); 2585 fprintf(fmodes, "%5d ", cpi->mode_chosen_counts[i]);
2529 2586
2530 fprintf(fmodes, "\n"); 2587 fprintf(fmodes, "\n");
2531 2588
2532 fclose(fmodes); 2589 fclose(fmodes);
2533 } 2590 }
2534 } 2591 }
2535 #endif 2592 #endif
2536 2593
2537 static void encode_without_recode_loop(VP9_COMP *cpi, 2594 static void set_mv_search_params(VP9_COMP *cpi) {
2538 int q) { 2595 const VP9_COMMON *const cm = &cpi->common;
2596 const unsigned int max_mv_def = MIN(cm->width, cm->height);
2597
2598 // Default based on max resolution.
2599 cpi->mv_step_param = vp9_init_search_range(max_mv_def);
2600
2601 if (cpi->sf.mv.auto_mv_step_size) {
2602 if (frame_is_intra_only(cm)) {
2603 // Initialize max_mv_magnitude for use in the first INTER frame
2604 // after a key/intra-only frame.
2605 cpi->max_mv_magnitude = max_mv_def;
2606 } else {
2607 if (cm->show_frame) {
2608 // Allow mv_steps to correspond to twice the max mv magnitude found
2609 // in the previous frame, capped by the default max_mv_magnitude based
2610 // on resolution.
2611 cpi->mv_step_param =
2612 vp9_init_search_range(MIN(max_mv_def, 2 * cpi->max_mv_magnitude));
2613 }
2614 cpi->max_mv_magnitude = 0;
2615 }
2616 }
2617 }
2618
2619 static void set_size_independent_vars(VP9_COMP *cpi) {
2620 vp9_set_speed_features_framesize_independent(cpi);
2621 vp9_set_rd_speed_thresholds(cpi);
2622 vp9_set_rd_speed_thresholds_sub8x8(cpi);
2623 cpi->common.interp_filter = cpi->sf.default_interp_filter;
2624 }
2625
2626 static void set_size_dependent_vars(VP9_COMP *cpi, int *q,
2627 int *bottom_index, int *top_index) {
2539 VP9_COMMON *const cm = &cpi->common; 2628 VP9_COMMON *const cm = &cpi->common;
2629 const VP9EncoderConfig *const oxcf = &cpi->oxcf;
2630
2631 // Setup variables that depend on the dimensions of the frame.
2632 vp9_set_speed_features_framesize_dependent(cpi);
2633
2634 // Decide q and q bounds.
2635 *q = vp9_rc_pick_q_and_bounds(cpi, bottom_index, top_index);
2636
2637 if (!frame_is_intra_only(cm)) {
2638 vp9_set_high_precision_mv(cpi, (*q) < HIGH_PRECISION_MV_QTHRESH);
2639 }
2640
2641 // Configure experimental use of segmentation for enhanced coding of
2642 // static regions if indicated.
2643 // Only allowed in the second pass of a two pass encode, as it requires
2644 // lagged coding, and if the relevant speed feature flag is set.
2645 if (oxcf->pass == 2 && cpi->sf.static_segmentation)
2646 configure_static_seg_features(cpi);
2647
2648 #if CONFIG_VP9_POSTPROC
2649 if (oxcf->noise_sensitivity > 0) {
2650 int l = 0;
2651 switch (oxcf->noise_sensitivity) {
2652 case 1:
2653 l = 20;
2654 break;
2655 case 2:
2656 l = 40;
2657 break;
2658 case 3:
2659 l = 60;
2660 break;
2661 case 4:
2662 case 5:
2663 l = 100;
2664 break;
2665 case 6:
2666 l = 150;
2667 break;
2668 }
2669 vp9_denoise(cpi->Source, cpi->Source, l);
2670 }
2671 #endif // CONFIG_VP9_POSTPROC
2672 }
2673
2674 static void init_motion_estimation(VP9_COMP *cpi) {
2675 int y_stride = cpi->scaled_source.y_stride;
2676
2677 if (cpi->sf.mv.search_method == NSTEP) {
2678 vp9_init3smotion_compensation(&cpi->ss_cfg, y_stride);
2679 } else if (cpi->sf.mv.search_method == DIAMOND) {
2680 vp9_init_dsmotion_compensation(&cpi->ss_cfg, y_stride);
2681 }
2682 }
2683
2684 void set_frame_size(VP9_COMP *cpi) {
2685 int ref_frame;
2686 VP9_COMMON *const cm = &cpi->common;
2687 const VP9EncoderConfig *const oxcf = &cpi->oxcf;
2688 MACROBLOCKD *const xd = &cpi->mb.e_mbd;
2689
2690 if (oxcf->pass == 2 &&
2691 cm->current_video_frame == 0 &&
2692 oxcf->resize_mode == RESIZE_FIXED &&
2693 oxcf->rc_mode == VPX_VBR) {
2694 // Internal scaling is triggered on the first frame.
2695 vp9_set_size_literal(cpi, oxcf->scaled_frame_width,
2696 oxcf->scaled_frame_height);
2697 }
2698
2699 if ((oxcf->pass == 2) &&
2700 (!cpi->use_svc ||
2701 (is_two_pass_svc(cpi) &&
2702 cpi->svc.encode_empty_frame_state != ENCODING))) {
2703 vp9_set_target_rate(cpi);
2704 }
2705
2706 // Reset the frame pointers to the current frame size.
2707 vp9_realloc_frame_buffer(get_frame_new_buffer(cm),
2708 cm->width, cm->height,
2709 cm->subsampling_x, cm->subsampling_y,
2710 #if CONFIG_VP9_HIGHBITDEPTH
2711 cm->use_highbitdepth,
2712 #endif
2713 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL);
2714
2715 alloc_util_frame_buffers(cpi);
2716 init_motion_estimation(cpi);
2717
2718 for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
2719 const int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)];
2720 YV12_BUFFER_CONFIG *const buf = &cm->frame_bufs[idx].buf;
2721 RefBuffer *const ref_buf = &cm->frame_refs[ref_frame - 1];
2722 ref_buf->buf = buf;
2723 ref_buf->idx = idx;
2724 #if CONFIG_VP9_HIGHBITDEPTH
2725 vp9_setup_scale_factors_for_frame(&ref_buf->sf,
2726 buf->y_crop_width, buf->y_crop_height,
2727 cm->width, cm->height,
2728 (buf->flags & YV12_FLAG_HIGHBITDEPTH) ?
2729 1 : 0);
2730 #else
2731 vp9_setup_scale_factors_for_frame(&ref_buf->sf,
2732 buf->y_crop_width, buf->y_crop_height,
2733 cm->width, cm->height);
2734 #endif // CONFIG_VP9_HIGHBITDEPTH
2735 if (vp9_is_scaled(&ref_buf->sf))
2736 vp9_extend_frame_borders(buf);
2737 }
2738
2739 set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME);
2740 }
2741
2742 static void encode_without_recode_loop(VP9_COMP *cpi) {
2743 VP9_COMMON *const cm = &cpi->common;
2744 int q, bottom_index, top_index; // Dummy variables.
2745
2540 vp9_clear_system_state(); 2746 vp9_clear_system_state();
2747
2748 set_frame_size(cpi);
2749
2750 cpi->Source = vp9_scale_if_required(cm, cpi->un_scaled_source,
2751 &cpi->scaled_source);
2752
2753 if (cpi->unscaled_last_source != NULL)
2754 cpi->Last_Source = vp9_scale_if_required(cm, cpi->unscaled_last_source,
2755 &cpi->scaled_last_source);
2756
2757 if (frame_is_intra_only(cm) == 0) {
2758 vp9_scale_references(cpi);
2759 }
2760
2761 set_size_independent_vars(cpi);
2762 set_size_dependent_vars(cpi, &q, &bottom_index, &top_index);
2763
2541 vp9_set_quantizer(cm, q); 2764 vp9_set_quantizer(cm, q);
2542 setup_frame(cpi); 2765 setup_frame(cpi);
2543 // Variance adaptive and in frame q adjustment experiments are mutually 2766 // Variance adaptive and in frame q adjustment experiments are mutually
2544 // exclusive. 2767 // exclusive.
2545 if (cpi->oxcf.aq_mode == VARIANCE_AQ) { 2768 if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
2546 vp9_vaq_frame_setup(cpi); 2769 vp9_vaq_frame_setup(cpi);
2547 } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) { 2770 } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) {
2548 vp9_setup_in_frame_q_adj(cpi); 2771 vp9_setup_in_frame_q_adj(cpi);
2549 } else if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) { 2772 } else if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
2550 vp9_cyclic_refresh_setup(cpi); 2773 vp9_cyclic_refresh_setup(cpi);
2551 } 2774 }
2552 // transform / motion compensation build reconstruction frame 2775 // transform / motion compensation build reconstruction frame
2553 vp9_encode_frame(cpi); 2776 vp9_encode_frame(cpi);
2554 2777
2555 // Update the skip mb flag probabilities based on the distribution 2778 // Update the skip mb flag probabilities based on the distribution
2556 // seen in the last encoder iteration. 2779 // seen in the last encoder iteration.
2557 // update_base_skip_probs(cpi); 2780 // update_base_skip_probs(cpi);
2558 vp9_clear_system_state(); 2781 vp9_clear_system_state();
2559 } 2782 }
2560 2783
2561 static void encode_with_recode_loop(VP9_COMP *cpi, 2784 static void encode_with_recode_loop(VP9_COMP *cpi,
2562 size_t *size, 2785 size_t *size,
2563 uint8_t *dest, 2786 uint8_t *dest) {
2564 int q,
2565 int bottom_index,
2566 int top_index) {
2567 VP9_COMMON *const cm = &cpi->common; 2787 VP9_COMMON *const cm = &cpi->common;
2568 RATE_CONTROL *const rc = &cpi->rc; 2788 RATE_CONTROL *const rc = &cpi->rc;
2789 int bottom_index, top_index;
2569 int loop_count = 0; 2790 int loop_count = 0;
2570 int loop = 0; 2791 int loop = 0;
2571 int overshoot_seen = 0; 2792 int overshoot_seen = 0;
2572 int undershoot_seen = 0; 2793 int undershoot_seen = 0;
2573 int q_low = bottom_index, q_high = top_index;
2574 int frame_over_shoot_limit; 2794 int frame_over_shoot_limit;
2575 int frame_under_shoot_limit; 2795 int frame_under_shoot_limit;
2796 int q = 0, q_low = 0, q_high = 0;
2797 int frame_size_changed = 0;
2576 2798
2577 // Decide frame size bounds 2799 set_size_independent_vars(cpi);
2578 vp9_rc_compute_frame_size_bounds(cpi, rc->this_frame_target,
2579 &frame_under_shoot_limit,
2580 &frame_over_shoot_limit);
2581 2800
2582 do { 2801 do {
2583 vp9_clear_system_state(); 2802 vp9_clear_system_state();
2584 2803
2804 set_frame_size(cpi);
2805
2806 if (loop_count == 0 || frame_size_changed != 0) {
2807 set_size_dependent_vars(cpi, &q, &bottom_index, &top_index);
2808 q_low = bottom_index;
2809 q_high = top_index;
2810
2811 // TODO(agrange) Scale cpi->max_mv_magnitude if frame-size has changed.
2812 set_mv_search_params(cpi);
2813 }
2814
2815 // Decide frame size bounds
2816 vp9_rc_compute_frame_size_bounds(cpi, rc->this_frame_target,
2817 &frame_under_shoot_limit,
2818 &frame_over_shoot_limit);
2819
2820 cpi->Source = vp9_scale_if_required(cm, cpi->un_scaled_source,
2821 &cpi->scaled_source);
2822
2823 if (cpi->unscaled_last_source != NULL)
2824 cpi->Last_Source = vp9_scale_if_required(cm, cpi->unscaled_last_source,
2825 &cpi->scaled_last_source);
2826
2827 if (frame_is_intra_only(cm) == 0) {
2828 if (loop_count > 0) {
2829 release_scaled_references(cpi);
2830 }
2831 vp9_scale_references(cpi);
2832 }
2833
2585 vp9_set_quantizer(cm, q); 2834 vp9_set_quantizer(cm, q);
2586 2835
2587 if (loop_count == 0) 2836 if (loop_count == 0)
2588 setup_frame(cpi); 2837 setup_frame(cpi);
2589 2838
2590 // Variance adaptive and in frame q adjustment experiments are mutually 2839 // Variance adaptive and in frame q adjustment experiments are mutually
2591 // exclusive. 2840 // exclusive.
2592 if (cpi->oxcf.aq_mode == VARIANCE_AQ) { 2841 if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
2593 vp9_vaq_frame_setup(cpi); 2842 vp9_vaq_frame_setup(cpi);
2594 } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) { 2843 } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) {
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
2771 static int get_ref_frame_flags(const VP9_COMP *cpi) { 3020 static int get_ref_frame_flags(const VP9_COMP *cpi) {
2772 const int *const map = cpi->common.ref_frame_map; 3021 const int *const map = cpi->common.ref_frame_map;
2773 const int gold_is_last = map[cpi->gld_fb_idx] == map[cpi->lst_fb_idx]; 3022 const int gold_is_last = map[cpi->gld_fb_idx] == map[cpi->lst_fb_idx];
2774 const int alt_is_last = map[cpi->alt_fb_idx] == map[cpi->lst_fb_idx]; 3023 const int alt_is_last = map[cpi->alt_fb_idx] == map[cpi->lst_fb_idx];
2775 const int gold_is_alt = map[cpi->gld_fb_idx] == map[cpi->alt_fb_idx]; 3024 const int gold_is_alt = map[cpi->gld_fb_idx] == map[cpi->alt_fb_idx];
2776 int flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG; 3025 int flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG;
2777 3026
2778 if (gold_is_last) 3027 if (gold_is_last)
2779 flags &= ~VP9_GOLD_FLAG; 3028 flags &= ~VP9_GOLD_FLAG;
2780 3029
2781 if (cpi->rc.frames_till_gf_update_due == INT_MAX && !is_two_pass_svc(cpi)) 3030 if (cpi->rc.frames_till_gf_update_due == INT_MAX &&
3031 (cpi->svc.number_temporal_layers == 1 &&
3032 cpi->svc.number_spatial_layers == 1))
2782 flags &= ~VP9_GOLD_FLAG; 3033 flags &= ~VP9_GOLD_FLAG;
2783 3034
2784 if (alt_is_last) 3035 if (alt_is_last)
2785 flags &= ~VP9_ALT_FLAG; 3036 flags &= ~VP9_ALT_FLAG;
2786 3037
2787 if (gold_is_alt) 3038 if (gold_is_alt)
2788 flags &= ~VP9_ALT_FLAG; 3039 flags &= ~VP9_ALT_FLAG;
2789 3040
2790 return flags; 3041 return flags;
2791 } 3042 }
(...skipping 24 matching lines...) Expand all
2816 scale_and_extend_frame_nonnormative(unscaled, scaled, (int)cm->bit_depth); 3067 scale_and_extend_frame_nonnormative(unscaled, scaled, (int)cm->bit_depth);
2817 #else 3068 #else
2818 scale_and_extend_frame_nonnormative(unscaled, scaled); 3069 scale_and_extend_frame_nonnormative(unscaled, scaled);
2819 #endif // CONFIG_VP9_HIGHBITDEPTH 3070 #endif // CONFIG_VP9_HIGHBITDEPTH
2820 return scaled; 3071 return scaled;
2821 } else { 3072 } else {
2822 return unscaled; 3073 return unscaled;
2823 } 3074 }
2824 } 3075 }
2825 3076
2826 static int is_skippable_frame(const VP9_COMP *cpi) {
2827 // If the current frame does not have non-zero motion vector detected in the
2828 // first pass, and so do its previous and forward frames, then this frame
2829 // can be skipped for partition check, and the partition size is assigned
2830 // according to the variance
2831 const SVC *const svc = &cpi->svc;
2832 const TWO_PASS *const twopass = is_two_pass_svc(cpi) ?
2833 &svc->layer_context[svc->spatial_layer_id].twopass : &cpi->twopass;
2834
2835 return (!frame_is_intra_only(&cpi->common) &&
2836 twopass->stats_in - 2 > twopass->stats_in_start &&
2837 twopass->stats_in < twopass->stats_in_end &&
2838 (twopass->stats_in - 1)->pcnt_inter - (twopass->stats_in - 1)->pcnt_motion
2839 == 1 &&
2840 (twopass->stats_in - 2)->pcnt_inter - (twopass->stats_in - 2)->pcnt_motion
2841 == 1 &&
2842 twopass->stats_in->pcnt_inter - twopass->stats_in->pcnt_motion == 1);
2843 }
2844
2845 static void set_arf_sign_bias(VP9_COMP *cpi) { 3077 static void set_arf_sign_bias(VP9_COMP *cpi) {
2846 VP9_COMMON *const cm = &cpi->common; 3078 VP9_COMMON *const cm = &cpi->common;
2847 int arf_sign_bias; 3079 int arf_sign_bias;
2848 3080
2849 if ((cpi->oxcf.pass == 2) && cpi->multi_arf_allowed) { 3081 if ((cpi->oxcf.pass == 2) && cpi->multi_arf_allowed) {
2850 const GF_GROUP *const gf_group = &cpi->twopass.gf_group; 3082 const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
2851 arf_sign_bias = cpi->rc.source_alt_ref_active && 3083 arf_sign_bias = cpi->rc.source_alt_ref_active &&
2852 (!cpi->refresh_alt_ref_frame || 3084 (!cpi->refresh_alt_ref_frame ||
2853 (gf_group->rf_level[gf_group->index] == GF_ARF_LOW)); 3085 (gf_group->rf_level[gf_group->index] == GF_ARF_LOW));
2854 } else { 3086 } else {
2855 arf_sign_bias = 3087 arf_sign_bias =
2856 (cpi->rc.source_alt_ref_active && !cpi->refresh_alt_ref_frame); 3088 (cpi->rc.source_alt_ref_active && !cpi->refresh_alt_ref_frame);
2857 } 3089 }
2858 cm->ref_frame_sign_bias[ALTREF_FRAME] = arf_sign_bias; 3090 cm->ref_frame_sign_bias[ALTREF_FRAME] = arf_sign_bias;
2859 } 3091 }
2860 3092
2861 static void set_mv_search_params(VP9_COMP *cpi) {
2862 const VP9_COMMON *const cm = &cpi->common;
2863 const unsigned int max_mv_def = MIN(cm->width, cm->height);
2864
2865 // Default based on max resolution.
2866 cpi->mv_step_param = vp9_init_search_range(max_mv_def);
2867
2868 if (cpi->sf.mv.auto_mv_step_size) {
2869 if (frame_is_intra_only(cm)) {
2870 // Initialize max_mv_magnitude for use in the first INTER frame
2871 // after a key/intra-only frame.
2872 cpi->max_mv_magnitude = max_mv_def;
2873 } else {
2874 if (cm->show_frame)
2875 // Allow mv_steps to correspond to twice the max mv magnitude found
2876 // in the previous frame, capped by the default max_mv_magnitude based
2877 // on resolution.
2878 cpi->mv_step_param =
2879 vp9_init_search_range(MIN(max_mv_def, 2 * cpi->max_mv_magnitude));
2880 cpi->max_mv_magnitude = 0;
2881 }
2882 }
2883 }
2884
2885
2886 int setup_interp_filter_search_mask(VP9_COMP *cpi) { 3093 int setup_interp_filter_search_mask(VP9_COMP *cpi) {
2887 INTERP_FILTER ifilter; 3094 INTERP_FILTER ifilter;
2888 int ref_total[MAX_REF_FRAMES] = {0}; 3095 int ref_total[MAX_REF_FRAMES] = {0};
2889 MV_REFERENCE_FRAME ref; 3096 MV_REFERENCE_FRAME ref;
2890 int mask = 0; 3097 int mask = 0;
2891 if (cpi->common.last_frame_type == KEY_FRAME || 3098 if (cpi->common.last_frame_type == KEY_FRAME ||
2892 cpi->refresh_alt_ref_frame) 3099 cpi->refresh_alt_ref_frame)
2893 return mask; 3100 return mask;
2894 for (ref = LAST_FRAME; ref <= ALTREF_FRAME; ++ref) 3101 for (ref = LAST_FRAME; ref <= ALTREF_FRAME; ++ref)
2895 for (ifilter = EIGHTTAP; ifilter <= EIGHTTAP_SHARP; ++ifilter) 3102 for (ifilter = EIGHTTAP; ifilter <= EIGHTTAP_SHARP; ++ifilter)
(...skipping 14 matching lines...) Expand all
2910 } 3117 }
2911 3118
2912 static void encode_frame_to_data_rate(VP9_COMP *cpi, 3119 static void encode_frame_to_data_rate(VP9_COMP *cpi,
2913 size_t *size, 3120 size_t *size,
2914 uint8_t *dest, 3121 uint8_t *dest,
2915 unsigned int *frame_flags) { 3122 unsigned int *frame_flags) {
2916 VP9_COMMON *const cm = &cpi->common; 3123 VP9_COMMON *const cm = &cpi->common;
2917 const VP9EncoderConfig *const oxcf = &cpi->oxcf; 3124 const VP9EncoderConfig *const oxcf = &cpi->oxcf;
2918 struct segmentation *const seg = &cm->seg; 3125 struct segmentation *const seg = &cm->seg;
2919 TX_SIZE t; 3126 TX_SIZE t;
2920 int q;
2921 int top_index;
2922 int bottom_index;
2923 3127
2924 set_ext_overrides(cpi); 3128 set_ext_overrides(cpi);
2925 3129
2926 cpi->Source = vp9_scale_if_required(cm, cpi->un_scaled_source,
2927 &cpi->scaled_source);
2928
2929 if (cpi->unscaled_last_source != NULL)
2930 cpi->Last_Source = vp9_scale_if_required(cm, cpi->unscaled_last_source,
2931 &cpi->scaled_last_source);
2932
2933 vp9_scale_references(cpi);
2934
2935 vp9_clear_system_state(); 3130 vp9_clear_system_state();
2936 3131
2937 // Enable or disable mode based tweaking of the zbin. 3132 // Enable or disable mode based tweaking of the zbin.
2938 // For 2 pass only used where GF/ARF prediction quality 3133 // For 2 pass only used where GF/ARF prediction quality
2939 // is above a threshold. 3134 // is above a threshold.
2940 cpi->zbin_mode_boost = 0; 3135 cpi->zbin_mode_boost = 0;
2941 cpi->zbin_mode_boost_enabled = 0; 3136 cpi->zbin_mode_boost_enabled = 0;
2942 3137
2943 // Set the arf sign bias for this frame. 3138 // Set the arf sign bias for this frame.
2944 set_arf_sign_bias(cpi); 3139 set_arf_sign_bias(cpi);
2945 3140
2946 // Set default state for segment based loop filter update flags. 3141 // Set default state for segment based loop filter update flags.
2947 cm->lf.mode_ref_delta_update = 0; 3142 cm->lf.mode_ref_delta_update = 0;
2948 3143
2949 set_mv_search_params(cpi);
2950
2951 if (cpi->oxcf.pass == 2 && 3144 if (cpi->oxcf.pass == 2 &&
2952 cpi->sf.adaptive_interp_filter_search) 3145 cpi->sf.adaptive_interp_filter_search)
2953 cpi->sf.interp_filter_search_mask = 3146 cpi->sf.interp_filter_search_mask =
2954 setup_interp_filter_search_mask(cpi); 3147 setup_interp_filter_search_mask(cpi);
2955 3148
2956
2957 // Set various flags etc to special state if it is a key frame. 3149 // Set various flags etc to special state if it is a key frame.
2958 if (frame_is_intra_only(cm)) { 3150 if (frame_is_intra_only(cm)) {
2959 // Reset the loop filter deltas and segmentation map. 3151 // Reset the loop filter deltas and segmentation map.
2960 vp9_reset_segment_features(&cm->seg); 3152 vp9_reset_segment_features(&cm->seg);
2961 3153
2962 // If segmentation is enabled force a map update for key frames. 3154 // If segmentation is enabled force a map update for key frames.
2963 if (seg->enabled) { 3155 if (seg->enabled) {
2964 seg->update_map = 1; 3156 seg->update_map = 1;
2965 seg->update_data = 1; 3157 seg->update_data = 1;
2966 } 3158 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
3006 if (cpi->svc.layer_context[0].frames_from_key_frame == 1 << i) { 3198 if (cpi->svc.layer_context[0].frames_from_key_frame == 1 << i) {
3007 cm->frame_parallel_decoding_mode = 1; 3199 cm->frame_parallel_decoding_mode = 1;
3008 break; 3200 break;
3009 } 3201 }
3010 } 3202 }
3011 if (i == cpi->svc.number_temporal_layers) 3203 if (i == cpi->svc.number_temporal_layers)
3012 cm->frame_parallel_decoding_mode = 0; 3204 cm->frame_parallel_decoding_mode = 0;
3013 } 3205 }
3014 } 3206 }
3015 3207
3016 // Configure experimental use of segmentation for enhanced coding of
3017 // static regions if indicated.
3018 // Only allowed in second pass of two pass (as requires lagged coding)
3019 // and if the relevant speed feature flag is set.
3020 if (oxcf->pass == 2 && cpi->sf.static_segmentation)
3021 configure_static_seg_features(cpi);
3022
3023 // Check if the current frame is skippable for the partition search in the
3024 // second pass according to the first pass stats
3025 if (cpi->sf.allow_partition_search_skip && oxcf->pass == 2 &&
3026 (!cpi->use_svc || is_two_pass_svc(cpi))) {
3027 cpi->partition_search_skippable_frame = is_skippable_frame(cpi);
3028 }
3029
3030 // For 1 pass CBR, check if we are dropping this frame. 3208 // For 1 pass CBR, check if we are dropping this frame.
3031 // Never drop on key frame. 3209 // Never drop on key frame.
3032 if (oxcf->pass == 0 && 3210 if (oxcf->pass == 0 &&
3033 oxcf->rc_mode == VPX_CBR && 3211 oxcf->rc_mode == VPX_CBR &&
3034 cm->frame_type != KEY_FRAME) { 3212 cm->frame_type != KEY_FRAME) {
3035 if (vp9_rc_drop_frame(cpi)) { 3213 if (vp9_rc_drop_frame(cpi)) {
3036 vp9_rc_postencode_update_drop_frame(cpi); 3214 vp9_rc_postencode_update_drop_frame(cpi);
3037 ++cm->current_video_frame; 3215 ++cm->current_video_frame;
3038 return; 3216 return;
3039 } 3217 }
3040 } 3218 }
3041 3219
3042 vp9_clear_system_state(); 3220 vp9_clear_system_state();
3043 3221
3044 #if CONFIG_VP9_POSTPROC
3045 if (oxcf->noise_sensitivity > 0) {
3046 int l = 0;
3047 switch (oxcf->noise_sensitivity) {
3048 case 1:
3049 l = 20;
3050 break;
3051 case 2:
3052 l = 40;
3053 break;
3054 case 3:
3055 l = 60;
3056 break;
3057 case 4:
3058 case 5:
3059 l = 100;
3060 break;
3061 case 6:
3062 l = 150;
3063 break;
3064 }
3065 vp9_denoise(cpi->Source, cpi->Source, l);
3066 }
3067 #endif
3068
3069 #if CONFIG_INTERNAL_STATS 3222 #if CONFIG_INTERNAL_STATS
3070 { 3223 {
3071 int i; 3224 int i;
3072 for (i = 0; i < MAX_MODES; ++i) 3225 for (i = 0; i < MAX_MODES; ++i)
3073 cpi->mode_chosen_counts[i] = 0; 3226 cpi->mode_chosen_counts[i] = 0;
3074 } 3227 }
3075 #endif 3228 #endif
3076 3229
3077 vp9_set_speed_features(cpi);
3078
3079 vp9_set_rd_speed_thresholds(cpi);
3080 vp9_set_rd_speed_thresholds_sub8x8(cpi);
3081
3082 // Decide q and q bounds.
3083 q = vp9_rc_pick_q_and_bounds(cpi, &bottom_index, &top_index);
3084
3085 if (!frame_is_intra_only(cm)) {
3086 cm->interp_filter = cpi->sf.default_interp_filter;
3087 /* TODO: Decide this more intelligently */
3088 vp9_set_high_precision_mv(cpi, q < HIGH_PRECISION_MV_QTHRESH);
3089 }
3090
3091 if (cpi->sf.recode_loop == DISALLOW_RECODE) { 3230 if (cpi->sf.recode_loop == DISALLOW_RECODE) {
3092 encode_without_recode_loop(cpi, q); 3231 encode_without_recode_loop(cpi);
3093 } else { 3232 } else {
3094 encode_with_recode_loop(cpi, size, dest, q, bottom_index, top_index); 3233 encode_with_recode_loop(cpi, size, dest);
3095 } 3234 }
3096 3235
3097 #if CONFIG_VP9_TEMPORAL_DENOISING 3236 #if CONFIG_VP9_TEMPORAL_DENOISING
3098 #ifdef OUTPUT_YUV_DENOISED 3237 #ifdef OUTPUT_YUV_DENOISED
3099 if (oxcf->noise_sensitivity > 0) { 3238 if (oxcf->noise_sensitivity > 0) {
3100 vp9_write_yuv_frame_420(&cpi->denoiser.running_avg_y[INTRA_FRAME], 3239 vp9_write_yuv_frame_420(&cpi->denoiser.running_avg_y[INTRA_FRAME],
3101 yuv_denoised_file); 3240 yuv_denoised_file);
3102 } 3241 }
3103 #endif 3242 #endif
3104 #endif 3243 #endif
(...skipping 24 matching lines...) Expand all
3129 3268
3130 // Pick the loop filter level for the frame. 3269 // Pick the loop filter level for the frame.
3131 loopfilter_frame(cpi, cm); 3270 loopfilter_frame(cpi, cm);
3132 3271
3133 // build the bitstream 3272 // build the bitstream
3134 vp9_pack_bitstream(cpi, dest, size); 3273 vp9_pack_bitstream(cpi, dest, size);
3135 3274
3136 if (cm->seg.update_map) 3275 if (cm->seg.update_map)
3137 update_reference_segmentation_map(cpi); 3276 update_reference_segmentation_map(cpi);
3138 3277
3139 release_scaled_references(cpi); 3278 if (frame_is_intra_only(cm) == 0) {
3279 release_scaled_references(cpi);
3280 }
3140 vp9_update_reference_frames(cpi); 3281 vp9_update_reference_frames(cpi);
3141 3282
3142 for (t = TX_4X4; t <= TX_32X32; t++) 3283 for (t = TX_4X4; t <= TX_32X32; t++)
3143 full_to_model_counts(cm->counts.coef[t], cpi->coef_counts[t]); 3284 full_to_model_counts(cm->counts.coef[t], cpi->frame_counts->coef_counts[t]);
3144 3285
3145 if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode) 3286 if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode)
3146 vp9_adapt_coef_probs(cm); 3287 vp9_adapt_coef_probs(cm);
3147 3288
3148 if (!frame_is_intra_only(cm)) { 3289 if (!frame_is_intra_only(cm)) {
3149 if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode) { 3290 if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode) {
3150 vp9_adapt_mode_probs(cm); 3291 vp9_adapt_mode_probs(cm);
3151 vp9_adapt_mv_probs(cm, cm->allow_high_precision_mv); 3292 vp9_adapt_mv_probs(cm, cm->allow_high_precision_mv);
3152 } 3293 }
3153 } 3294 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
3189 // keep track of the last coded dimensions 3330 // keep track of the last coded dimensions
3190 cm->last_width = cm->width; 3331 cm->last_width = cm->width;
3191 cm->last_height = cm->height; 3332 cm->last_height = cm->height;
3192 3333
3193 // reset to normal state now that we are done. 3334 // reset to normal state now that we are done.
3194 if (!cm->show_existing_frame) 3335 if (!cm->show_existing_frame)
3195 cm->last_show_frame = cm->show_frame; 3336 cm->last_show_frame = cm->show_frame;
3196 3337
3197 if (cm->show_frame) { 3338 if (cm->show_frame) {
3198 vp9_swap_mi_and_prev_mi(cm); 3339 vp9_swap_mi_and_prev_mi(cm);
3199
3200 // Don't increment frame counters if this was an altref buffer 3340 // Don't increment frame counters if this was an altref buffer
3201 // update not a real frame 3341 // update not a real frame
3202 ++cm->current_video_frame; 3342 ++cm->current_video_frame;
3203 if (cpi->use_svc) 3343 if (cpi->use_svc)
3204 vp9_inc_frame_in_layer(cpi); 3344 vp9_inc_frame_in_layer(cpi);
3205 } 3345 }
3346 cm->prev_frame = cm->cur_frame;
3206 3347
3207 if (is_two_pass_svc(cpi)) 3348 if (is_two_pass_svc(cpi))
3208 cpi->svc.layer_context[cpi->svc.spatial_layer_id].last_frame_type = 3349 cpi->svc.layer_context[cpi->svc.spatial_layer_id].last_frame_type =
3209 cm->frame_type; 3350 cm->frame_type;
3210 } 3351 }
3211 3352
3212 static void SvcEncode(VP9_COMP *cpi, size_t *size, uint8_t *dest, 3353 static void SvcEncode(VP9_COMP *cpi, size_t *size, uint8_t *dest,
3213 unsigned int *frame_flags) { 3354 unsigned int *frame_flags) {
3214 vp9_rc_get_svc_params(cpi); 3355 vp9_rc_get_svc_params(cpi);
3215 encode_frame_to_data_rate(cpi, size, dest, frame_flags); 3356 encode_frame_to_data_rate(cpi, size, dest, frame_flags);
(...skipping 11 matching lines...) Expand all
3227 3368
3228 static void Pass2Encode(VP9_COMP *cpi, size_t *size, 3369 static void Pass2Encode(VP9_COMP *cpi, size_t *size,
3229 uint8_t *dest, unsigned int *frame_flags) { 3370 uint8_t *dest, unsigned int *frame_flags) {
3230 cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED; 3371 cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
3231 encode_frame_to_data_rate(cpi, size, dest, frame_flags); 3372 encode_frame_to_data_rate(cpi, size, dest, frame_flags);
3232 3373
3233 if (!(is_two_pass_svc(cpi) && cpi->svc.encode_empty_frame_state == ENCODING)) 3374 if (!(is_two_pass_svc(cpi) && cpi->svc.encode_empty_frame_state == ENCODING))
3234 vp9_twopass_postencode_update(cpi); 3375 vp9_twopass_postencode_update(cpi);
3235 } 3376 }
3236 3377
3237 static void init_motion_estimation(VP9_COMP *cpi) {
3238 int y_stride = cpi->scaled_source.y_stride;
3239
3240 if (cpi->sf.mv.search_method == NSTEP) {
3241 vp9_init3smotion_compensation(&cpi->ss_cfg, y_stride);
3242 } else if (cpi->sf.mv.search_method == DIAMOND) {
3243 vp9_init_dsmotion_compensation(&cpi->ss_cfg, y_stride);
3244 }
3245 }
3246
3247 static void check_initial_width(VP9_COMP *cpi, 3378 static void check_initial_width(VP9_COMP *cpi,
3248 #if CONFIG_VP9_HIGHBITDEPTH 3379 #if CONFIG_VP9_HIGHBITDEPTH
3249 int use_highbitdepth, 3380 int use_highbitdepth,
3250 #endif 3381 #endif
3251 int subsampling_x, int subsampling_y) { 3382 int subsampling_x, int subsampling_y) {
3252 VP9_COMMON *const cm = &cpi->common; 3383 VP9_COMMON *const cm = &cpi->common;
3253 3384
3254 if (!cpi->initial_width) { 3385 if (!cpi->initial_width) {
3255 cm->subsampling_x = subsampling_x; 3386 cm->subsampling_x = subsampling_x;
3256 cm->subsampling_y = subsampling_y; 3387 cm->subsampling_y = subsampling_y;
3257 #if CONFIG_VP9_HIGHBITDEPTH 3388 #if CONFIG_VP9_HIGHBITDEPTH
3258 cm->use_highbitdepth = use_highbitdepth; 3389 cm->use_highbitdepth = use_highbitdepth;
3259 #endif 3390 #endif
3260 3391
3261 alloc_raw_frame_buffers(cpi); 3392 alloc_raw_frame_buffers(cpi);
3262 alloc_ref_frame_buffers(cpi); 3393 alloc_ref_frame_buffers(cpi);
3263 alloc_util_frame_buffers(cpi); 3394 alloc_util_frame_buffers(cpi);
3264 3395
3265 init_motion_estimation(cpi); 3396 init_motion_estimation(cpi); // TODO(agrange) This can be removed.
3266 3397
3267 cpi->initial_width = cm->width; 3398 cpi->initial_width = cm->width;
3268 cpi->initial_height = cm->height; 3399 cpi->initial_height = cm->height;
3400 cpi->initial_mbs = cm->MBs;
3269 } 3401 }
3270 } 3402 }
3271 3403
3272 3404
3273 int vp9_receive_raw_frame(VP9_COMP *cpi, unsigned int frame_flags, 3405 int vp9_receive_raw_frame(VP9_COMP *cpi, unsigned int frame_flags,
3274 YV12_BUFFER_CONFIG *sd, int64_t time_stamp, 3406 YV12_BUFFER_CONFIG *sd, int64_t time_stamp,
3275 int64_t end_time) { 3407 int64_t end_time) {
3276 VP9_COMMON *cm = &cpi->common; 3408 VP9_COMMON *cm = &cpi->common;
3277 struct vpx_usec_timer timer; 3409 struct vpx_usec_timer timer;
3278 int res = 0; 3410 int res = 0;
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
3400 // become the GF so preserve last as an alternative prediction option. 3532 // become the GF so preserve last as an alternative prediction option.
3401 cpi->refresh_last_frame = 0; 3533 cpi->refresh_last_frame = 0;
3402 } 3534 }
3403 } 3535 }
3404 3536
3405 int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags, 3537 int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags,
3406 size_t *size, uint8_t *dest, 3538 size_t *size, uint8_t *dest,
3407 int64_t *time_stamp, int64_t *time_end, int flush) { 3539 int64_t *time_stamp, int64_t *time_end, int flush) {
3408 const VP9EncoderConfig *const oxcf = &cpi->oxcf; 3540 const VP9EncoderConfig *const oxcf = &cpi->oxcf;
3409 VP9_COMMON *const cm = &cpi->common; 3541 VP9_COMMON *const cm = &cpi->common;
3410 MACROBLOCKD *const xd = &cpi->mb.e_mbd;
3411 RATE_CONTROL *const rc = &cpi->rc; 3542 RATE_CONTROL *const rc = &cpi->rc;
3412 struct vpx_usec_timer cmptimer; 3543 struct vpx_usec_timer cmptimer;
3413 YV12_BUFFER_CONFIG *force_src_buffer = NULL; 3544 YV12_BUFFER_CONFIG *force_src_buffer = NULL;
3414 struct lookahead_entry *last_source = NULL; 3545 struct lookahead_entry *last_source = NULL;
3415 struct lookahead_entry *source = NULL; 3546 struct lookahead_entry *source = NULL;
3416 MV_REFERENCE_FRAME ref_frame;
3417 int arf_src_index; 3547 int arf_src_index;
3548 int i;
3418 3549
3419 if (is_two_pass_svc(cpi)) { 3550 if (is_two_pass_svc(cpi)) {
3420 #if CONFIG_SPATIAL_SVC 3551 #if CONFIG_SPATIAL_SVC
3421 vp9_svc_start_frame(cpi); 3552 vp9_svc_start_frame(cpi);
3422 // Use a small empty frame instead of a real frame 3553 // Use a small empty frame instead of a real frame
3423 if (cpi->svc.encode_empty_frame_state == ENCODING) 3554 if (cpi->svc.encode_empty_frame_state == ENCODING)
3424 source = &cpi->svc.empty_frame; 3555 source = &cpi->svc.empty_frame;
3425 #endif 3556 #endif
3426 if (oxcf->pass == 2) 3557 if (oxcf->pass == 2)
3427 vp9_restore_layer_context(cpi); 3558 vp9_restore_layer_context(cpi);
3428 } 3559 }
3429 3560
3430 vpx_usec_timer_start(&cmptimer); 3561 vpx_usec_timer_start(&cmptimer);
3431 3562
3432 vp9_set_high_precision_mv(cpi, ALTREF_HIGH_PRECISION_MV); 3563 vp9_set_high_precision_mv(cpi, ALTREF_HIGH_PRECISION_MV);
3433 3564
3565 // Is multi-arf enabled.
3566 // Note that at the moment multi_arf is only configured for 2 pass VBR and
3567 // will not work properly with svc.
3568 if ((oxcf->pass == 2) && !cpi->use_svc &&
3569 (cpi->oxcf.enable_auto_arf > 1))
3570 cpi->multi_arf_allowed = 1;
3571 else
3572 cpi->multi_arf_allowed = 0;
3573
3434 // Normal defaults 3574 // Normal defaults
3435 cm->reset_frame_context = 0; 3575 cm->reset_frame_context = 0;
3436 cm->refresh_frame_context = 1; 3576 cm->refresh_frame_context = 1;
3437 cpi->refresh_last_frame = 1; 3577 cpi->refresh_last_frame = 1;
3438 cpi->refresh_golden_frame = 0; 3578 cpi->refresh_golden_frame = 0;
3439 cpi->refresh_alt_ref_frame = 0; 3579 cpi->refresh_alt_ref_frame = 0;
3440 3580
3441 // Should we encode an arf frame. 3581 // Should we encode an arf frame.
3442 arf_src_index = get_arf_src_index(cpi); 3582 arf_src_index = get_arf_src_index(cpi);
3443 3583
3444 // Skip alt frame if we encode the empty frame 3584 // Skip alt frame if we encode the empty frame
3445 if (is_two_pass_svc(cpi) && source != NULL) 3585 if (is_two_pass_svc(cpi) && source != NULL)
3446 arf_src_index = 0; 3586 arf_src_index = 0;
3447 3587
3448 if (arf_src_index) { 3588 if (arf_src_index) {
3449 assert(arf_src_index <= rc->frames_to_key); 3589 assert(arf_src_index <= rc->frames_to_key);
3450 3590
3451 if ((source = vp9_lookahead_peek(cpi->lookahead, arf_src_index)) != NULL) { 3591 if ((source = vp9_lookahead_peek(cpi->lookahead, arf_src_index)) != NULL) {
3452 cpi->alt_ref_source = source; 3592 cpi->alt_ref_source = source;
3453 3593
3454 #if CONFIG_SPATIAL_SVC 3594 #if CONFIG_SPATIAL_SVC
3455 if (is_two_pass_svc(cpi) && cpi->svc.spatial_layer_id > 0) { 3595 if (is_two_pass_svc(cpi) && cpi->svc.spatial_layer_id > 0) {
3456 int i; 3596 int i;
3457 // Reference a hidden frame from a lower layer 3597 // Reference a hidden frame from a lower layer
3458 for (i = cpi->svc.spatial_layer_id - 1; i >= 0; --i) { 3598 for (i = cpi->svc.spatial_layer_id - 1; i >= 0; --i) {
3459 if (oxcf->ss_play_alternate[i]) { 3599 if (oxcf->ss_enable_auto_arf[i]) {
3460 cpi->gld_fb_idx = cpi->svc.layer_context[i].alt_ref_idx; 3600 cpi->gld_fb_idx = cpi->svc.layer_context[i].alt_ref_idx;
3461 break; 3601 break;
3462 } 3602 }
3463 } 3603 }
3464 } 3604 }
3465 cpi->svc.layer_context[cpi->svc.spatial_layer_id].has_alt_frame = 1; 3605 cpi->svc.layer_context[cpi->svc.spatial_layer_id].has_alt_frame = 1;
3466 #endif 3606 #endif
3467 3607
3468 if (oxcf->arnr_max_frames > 0) { 3608 if (oxcf->arnr_max_frames > 0) {
3469 // Produce the filtered ARF frame. 3609 // Produce the filtered ARF frame.
(...skipping 23 matching lines...) Expand all
3493 // Read in the source frame. 3633 // Read in the source frame.
3494 #if CONFIG_SPATIAL_SVC 3634 #if CONFIG_SPATIAL_SVC
3495 if (is_two_pass_svc(cpi)) 3635 if (is_two_pass_svc(cpi))
3496 source = vp9_svc_lookahead_pop(cpi, cpi->lookahead, flush); 3636 source = vp9_svc_lookahead_pop(cpi, cpi->lookahead, flush);
3497 else 3637 else
3498 #endif 3638 #endif
3499 source = vp9_lookahead_pop(cpi->lookahead, flush); 3639 source = vp9_lookahead_pop(cpi->lookahead, flush);
3500 if (source != NULL) { 3640 if (source != NULL) {
3501 cm->show_frame = 1; 3641 cm->show_frame = 1;
3502 cm->intra_only = 0; 3642 cm->intra_only = 0;
3643 // if the flags indicate intra frame, but if the current picture is for
3644 // non-zero spatial layer, it should not be an intra picture.
3645 // TODO(Won Kap): this needs to change if per-layer intra frame is
3646 // allowed.
3647 if ((source->flags | VPX_EFLAG_FORCE_KF) && cpi->svc.spatial_layer_id) {
3648 source->flags &= ~(unsigned int)(VPX_EFLAG_FORCE_KF);
3649 }
3503 3650
3504 // Check to see if the frame should be encoded as an arf overlay. 3651 // Check to see if the frame should be encoded as an arf overlay.
3505 check_src_altref(cpi, source); 3652 check_src_altref(cpi, source);
3506 } 3653 }
3507 } 3654 }
3508 3655
3509 if (source) { 3656 if (source) {
3510 cpi->un_scaled_source = cpi->Source = force_src_buffer ? force_src_buffer 3657 cpi->un_scaled_source = cpi->Source = force_src_buffer ? force_src_buffer
3511 : &source->img; 3658 : &source->img;
3512 3659
(...skipping 24 matching lines...) Expand all
3537 if (cm->show_frame) { 3684 if (cm->show_frame) {
3538 adjust_frame_rate(cpi, source); 3685 adjust_frame_rate(cpi, source);
3539 } 3686 }
3540 3687
3541 if (cpi->svc.number_temporal_layers > 1 && 3688 if (cpi->svc.number_temporal_layers > 1 &&
3542 oxcf->rc_mode == VPX_CBR) { 3689 oxcf->rc_mode == VPX_CBR) {
3543 vp9_update_temporal_layer_framerate(cpi); 3690 vp9_update_temporal_layer_framerate(cpi);
3544 vp9_restore_layer_context(cpi); 3691 vp9_restore_layer_context(cpi);
3545 } 3692 }
3546 3693
3547 // start with a 0 size frame 3694 // Find a free buffer for the new frame, releasing the reference previously
3548 *size = 0; 3695 // held.
3549
3550 /* find a free buffer for the new frame, releasing the reference previously
3551 * held.
3552 */
3553 cm->frame_bufs[cm->new_fb_idx].ref_count--; 3696 cm->frame_bufs[cm->new_fb_idx].ref_count--;
3554 cm->new_fb_idx = get_free_fb(cm); 3697 cm->new_fb_idx = get_free_fb(cm);
3555 3698 cm->cur_frame = &cm->frame_bufs[cm->new_fb_idx];
3556 // For two pass encodes analyse the first pass stats and determine
3557 // the bit allocation and other parameters for this frame / group of frames.
3558 if ((oxcf->pass == 2) &&
3559 (!cpi->use_svc ||
3560 (is_two_pass_svc(cpi) &&
3561 cpi->svc.encode_empty_frame_state != ENCODING))) {
3562 vp9_rc_get_second_pass_params(cpi);
3563 }
3564 3699
3565 if (!cpi->use_svc && cpi->multi_arf_allowed) { 3700 if (!cpi->use_svc && cpi->multi_arf_allowed) {
3566 if (cm->frame_type == KEY_FRAME) { 3701 if (cm->frame_type == KEY_FRAME) {
3567 init_buffer_indices(cpi); 3702 init_buffer_indices(cpi);
3568 } else if (oxcf->pass == 2) { 3703 } else if (oxcf->pass == 2) {
3569 const GF_GROUP *const gf_group = &cpi->twopass.gf_group; 3704 const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
3570 cpi->alt_fb_idx = gf_group->arf_ref_idx[gf_group->index]; 3705 cpi->alt_fb_idx = gf_group->arf_ref_idx[gf_group->index];
3571 } 3706 }
3572 } 3707 }
3573 3708
3709 // Start with a 0 size frame.
3710 *size = 0;
3711
3574 cpi->frame_flags = *frame_flags; 3712 cpi->frame_flags = *frame_flags;
3575 3713
3576 if (oxcf->pass == 2 && 3714 if ((oxcf->pass == 2) &&
3577 cm->current_video_frame == 0 && 3715 (!cpi->use_svc ||
3578 oxcf->allow_spatial_resampling && 3716 (is_two_pass_svc(cpi) &&
3579 oxcf->rc_mode == VPX_VBR) { 3717 cpi->svc.encode_empty_frame_state != ENCODING))) {
3580 // Internal scaling is triggered on the first frame. 3718 vp9_rc_get_second_pass_params(cpi);
3581 vp9_set_size_literal(cpi, oxcf->scaled_frame_width, 3719 } else {
3582 oxcf->scaled_frame_height); 3720 set_frame_size(cpi);
3583 } 3721 }
3584 3722
3585 // Reset the frame pointers to the current frame size 3723 for (i = 0; i < MAX_REF_FRAMES; ++i)
3586 vp9_realloc_frame_buffer(get_frame_new_buffer(cm), 3724 cpi->scaled_ref_idx[i] = INVALID_REF_BUFFER_IDX;
3587 cm->width, cm->height,
3588 cm->subsampling_x, cm->subsampling_y,
3589 #if CONFIG_VP9_HIGHBITDEPTH
3590 cm->use_highbitdepth,
3591 #endif
3592 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL);
3593
3594 alloc_util_frame_buffers(cpi);
3595 init_motion_estimation(cpi);
3596
3597 for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
3598 const int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)];
3599 YV12_BUFFER_CONFIG *const buf = &cm->frame_bufs[idx].buf;
3600 RefBuffer *const ref_buf = &cm->frame_refs[ref_frame - 1];
3601 ref_buf->buf = buf;
3602 ref_buf->idx = idx;
3603 #if CONFIG_VP9_HIGHBITDEPTH
3604 vp9_setup_scale_factors_for_frame(&ref_buf->sf,
3605 buf->y_crop_width, buf->y_crop_height,
3606 cm->width, cm->height,
3607 (buf->flags & YV12_FLAG_HIGHBITDEPTH) ?
3608 1 : 0);
3609 #else
3610 vp9_setup_scale_factors_for_frame(&ref_buf->sf,
3611 buf->y_crop_width, buf->y_crop_height,
3612 cm->width, cm->height);
3613 #endif // CONFIG_VP9_HIGHBITDEPTH
3614 if (vp9_is_scaled(&ref_buf->sf))
3615 vp9_extend_frame_borders(buf);
3616 }
3617
3618 set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME);
3619
3620 if (oxcf->aq_mode == VARIANCE_AQ) {
3621 vp9_vaq_init();
3622 }
3623 3725
3624 if (oxcf->pass == 1 && 3726 if (oxcf->pass == 1 &&
3625 (!cpi->use_svc || is_two_pass_svc(cpi))) { 3727 (!cpi->use_svc || is_two_pass_svc(cpi))) {
3626 const int lossless = is_lossless_requested(oxcf); 3728 const int lossless = is_lossless_requested(oxcf);
3627 #if CONFIG_VP9_HIGHBITDEPTH 3729 #if CONFIG_VP9_HIGHBITDEPTH
3628 if (cpi->oxcf.use_highbitdepth) 3730 if (cpi->oxcf.use_highbitdepth)
3629 cpi->mb.fwd_txm4x4 = lossless ? vp9_highbd_fwht4x4 : vp9_highbd_fdct4x4; 3731 cpi->mb.fwd_txm4x4 = lossless ? vp9_highbd_fwht4x4 : vp9_highbd_fdct4x4;
3630 else 3732 else
3631 cpi->mb.fwd_txm4x4 = lossless ? vp9_fwht4x4 : vp9_fdct4x4; 3733 cpi->mb.fwd_txm4x4 = lossless ? vp9_fwht4x4 : vp9_fdct4x4;
3632 cpi->mb.highbd_itxm_add = lossless ? vp9_highbd_iwht4x4_add : 3734 cpi->mb.highbd_itxm_add = lossless ? vp9_highbd_iwht4x4_add :
3633 vp9_highbd_idct4x4_add; 3735 vp9_highbd_idct4x4_add;
3634 #else 3736 #else
3635 cpi->mb.fwd_txm4x4 = lossless ? vp9_fwht4x4 : vp9_fdct4x4; 3737 cpi->mb.fwd_txm4x4 = lossless ? vp9_fwht4x4 : vp9_fdct4x4;
3636 #endif // CONFIG_VP9_HIGHBITDEPTH 3738 #endif // CONFIG_VP9_HIGHBITDEPTH
3637 cpi->mb.itxm_add = lossless ? vp9_iwht4x4_add : vp9_idct4x4_add; 3739 cpi->mb.itxm_add = lossless ? vp9_iwht4x4_add : vp9_idct4x4_add;
3638 vp9_first_pass(cpi, source); 3740 vp9_first_pass(cpi, source);
3639 } else if (oxcf->pass == 2 && 3741 } else if (oxcf->pass == 2 &&
3640 (!cpi->use_svc || is_two_pass_svc(cpi))) { 3742 (!cpi->use_svc || is_two_pass_svc(cpi))) {
3641 Pass2Encode(cpi, size, dest, frame_flags); 3743 Pass2Encode(cpi, size, dest, frame_flags);
3642 } else if (cpi->use_svc) { 3744 } else if (cpi->use_svc) {
3643 SvcEncode(cpi, size, dest, frame_flags); 3745 SvcEncode(cpi, size, dest, frame_flags);
3644 } else { 3746 } else {
3645 // One pass encode 3747 // One pass encode
3646 Pass0Encode(cpi, size, dest, frame_flags); 3748 Pass0Encode(cpi, size, dest, frame_flags);
3647 } 3749 }
3648 3750
3649 if (cm->refresh_frame_context) 3751 if (cm->refresh_frame_context)
3650 cm->frame_contexts[cm->frame_context_idx] = cm->fc; 3752 cm->frame_contexts[cm->frame_context_idx] = *cm->fc;
3651 3753
3652 // Frame was dropped, release scaled references. 3754 // No frame encoded, or frame was dropped, release scaled references.
3653 if (*size == 0) { 3755 if ((*size == 0) && (frame_is_intra_only(cm) == 0)) {
3654 release_scaled_references(cpi); 3756 release_scaled_references(cpi);
3655 } 3757 }
3656 3758
3657 if (*size > 0) { 3759 if (*size > 0) {
3658 cpi->droppable = !frame_is_reference(cpi); 3760 cpi->droppable = !frame_is_reference(cpi);
3659 } 3761 }
3660 3762
3661 // Save layer specific state. 3763 // Save layer specific state.
3662 if ((cpi->svc.number_temporal_layers > 1 && 3764 if ((cpi->svc.number_temporal_layers > 1 &&
3663 oxcf->rc_mode == VPX_CBR) || 3765 oxcf->rc_mode == VPX_CBR) ||
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
3988 if (flags & VP8_EFLAG_NO_UPD_ARF) 4090 if (flags & VP8_EFLAG_NO_UPD_ARF)
3989 upd ^= VP9_ALT_FLAG; 4091 upd ^= VP9_ALT_FLAG;
3990 4092
3991 vp9_update_reference(cpi, upd); 4093 vp9_update_reference(cpi, upd);
3992 } 4094 }
3993 4095
3994 if (flags & VP8_EFLAG_NO_UPD_ENTROPY) { 4096 if (flags & VP8_EFLAG_NO_UPD_ENTROPY) {
3995 vp9_update_entropy(cpi, 0); 4097 vp9_update_entropy(cpi, 0);
3996 } 4098 }
3997 } 4099 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_encoder.h ('k') | source/libvpx/vp9/encoder/vp9_firstpass.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698