| 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 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 output_stats(cpi, cpi->output_pkt_list, &cpi->twopass.total_stats); | 340 output_stats(cpi, cpi->output_pkt_list, &cpi->twopass.total_stats); |
| 341 } | 341 } |
| 342 | 342 |
| 343 static void zz_motion_search(VP9_COMP *cpi, MACROBLOCK *x, YV12_BUFFER_CONFIG *r
econ_buffer, int *best_motion_err, int recon_yoffset) { | 343 static void zz_motion_search(VP9_COMP *cpi, MACROBLOCK *x, YV12_BUFFER_CONFIG *r
econ_buffer, int *best_motion_err, int recon_yoffset) { |
| 344 MACROBLOCKD *const xd = &x->e_mbd; | 344 MACROBLOCKD *const xd = &x->e_mbd; |
| 345 | 345 |
| 346 // Set up pointers for this macro block recon buffer | 346 // Set up pointers for this macro block recon buffer |
| 347 xd->plane[0].pre[0].buf = recon_buffer->y_buffer + recon_yoffset; | 347 xd->plane[0].pre[0].buf = recon_buffer->y_buffer + recon_yoffset; |
| 348 | 348 |
| 349 switch (xd->mode_info_context->mbmi.sb_type) { | 349 switch (xd->mode_info_context->mbmi.sb_type) { |
| 350 case BLOCK_SIZE_SB8X8: | 350 case BLOCK_8X8: |
| 351 vp9_mse8x8(x->plane[0].src.buf, x->plane[0].src.stride, | 351 vp9_mse8x8(x->plane[0].src.buf, x->plane[0].src.stride, |
| 352 xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride, | 352 xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride, |
| 353 (unsigned int *)(best_motion_err)); | 353 (unsigned int *)(best_motion_err)); |
| 354 break; | 354 break; |
| 355 case BLOCK_SIZE_SB16X8: | 355 case BLOCK_16X8: |
| 356 vp9_mse16x8(x->plane[0].src.buf, x->plane[0].src.stride, | 356 vp9_mse16x8(x->plane[0].src.buf, x->plane[0].src.stride, |
| 357 xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride, | 357 xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride, |
| 358 (unsigned int *)(best_motion_err)); | 358 (unsigned int *)(best_motion_err)); |
| 359 break; | 359 break; |
| 360 case BLOCK_SIZE_SB8X16: | 360 case BLOCK_8X16: |
| 361 vp9_mse8x16(x->plane[0].src.buf, x->plane[0].src.stride, | 361 vp9_mse8x16(x->plane[0].src.buf, x->plane[0].src.stride, |
| 362 xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride, | 362 xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride, |
| 363 (unsigned int *)(best_motion_err)); | 363 (unsigned int *)(best_motion_err)); |
| 364 break; | 364 break; |
| 365 default: | 365 default: |
| 366 vp9_mse16x16(x->plane[0].src.buf, x->plane[0].src.stride, | 366 vp9_mse16x16(x->plane[0].src.buf, x->plane[0].src.stride, |
| 367 xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride, | 367 xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride, |
| 368 (unsigned int *)(best_motion_err)); | 368 (unsigned int *)(best_motion_err)); |
| 369 break; | 369 break; |
| 370 } | 370 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 396 while ((quart_frm << sr) < MAX_FULL_PEL_VAL) | 396 while ((quart_frm << sr) < MAX_FULL_PEL_VAL) |
| 397 sr++; | 397 sr++; |
| 398 if (sr) | 398 if (sr) |
| 399 sr--; | 399 sr--; |
| 400 | 400 |
| 401 step_param += sr; | 401 step_param += sr; |
| 402 further_steps -= sr; | 402 further_steps -= sr; |
| 403 | 403 |
| 404 // override the default variance function to use MSE | 404 // override the default variance function to use MSE |
| 405 switch (xd->mode_info_context->mbmi.sb_type) { | 405 switch (xd->mode_info_context->mbmi.sb_type) { |
| 406 case BLOCK_SIZE_SB8X8: | 406 case BLOCK_8X8: |
| 407 v_fn_ptr.vf = vp9_mse8x8; | 407 v_fn_ptr.vf = vp9_mse8x8; |
| 408 break; | 408 break; |
| 409 case BLOCK_SIZE_SB16X8: | 409 case BLOCK_16X8: |
| 410 v_fn_ptr.vf = vp9_mse16x8; | 410 v_fn_ptr.vf = vp9_mse16x8; |
| 411 break; | 411 break; |
| 412 case BLOCK_SIZE_SB8X16: | 412 case BLOCK_8X16: |
| 413 v_fn_ptr.vf = vp9_mse8x16; | 413 v_fn_ptr.vf = vp9_mse8x16; |
| 414 break; | 414 break; |
| 415 default: | 415 default: |
| 416 v_fn_ptr.vf = vp9_mse16x16; | 416 v_fn_ptr.vf = vp9_mse16x16; |
| 417 break; | 417 break; |
| 418 } | 418 } |
| 419 | 419 |
| 420 // Set up pointers for this macro block recon buffer | 420 // Set up pointers for this macro block recon buffer |
| 421 xd->plane[0].pre[0].buf = recon_buffer->y_buffer + recon_yoffset; | 421 xd->plane[0].pre[0].buf = recon_buffer->y_buffer + recon_yoffset; |
| 422 | 422 |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 int gf_motion_error = INT_MAX; | 542 int gf_motion_error = INT_MAX; |
| 543 int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row); | 543 int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row); |
| 544 | 544 |
| 545 xd->plane[0].dst.buf = new_yv12->y_buffer + recon_yoffset; | 545 xd->plane[0].dst.buf = new_yv12->y_buffer + recon_yoffset; |
| 546 xd->plane[1].dst.buf = new_yv12->u_buffer + recon_uvoffset; | 546 xd->plane[1].dst.buf = new_yv12->u_buffer + recon_uvoffset; |
| 547 xd->plane[2].dst.buf = new_yv12->v_buffer + recon_uvoffset; | 547 xd->plane[2].dst.buf = new_yv12->v_buffer + recon_uvoffset; |
| 548 xd->left_available = (mb_col != 0); | 548 xd->left_available = (mb_col != 0); |
| 549 | 549 |
| 550 if (mb_col * 2 + 1 < cm->mi_cols) { | 550 if (mb_col * 2 + 1 < cm->mi_cols) { |
| 551 if (mb_row * 2 + 1 < cm->mi_rows) { | 551 if (mb_row * 2 + 1 < cm->mi_rows) { |
| 552 xd->mode_info_context->mbmi.sb_type = BLOCK_SIZE_MB16X16; | 552 xd->mode_info_context->mbmi.sb_type = BLOCK_16X16; |
| 553 } else { | 553 } else { |
| 554 xd->mode_info_context->mbmi.sb_type = BLOCK_SIZE_SB16X8; | 554 xd->mode_info_context->mbmi.sb_type = BLOCK_16X8; |
| 555 } | 555 } |
| 556 } else { | 556 } else { |
| 557 if (mb_row * 2 + 1 < cm->mi_rows) { | 557 if (mb_row * 2 + 1 < cm->mi_rows) { |
| 558 xd->mode_info_context->mbmi.sb_type = BLOCK_SIZE_SB8X16; | 558 xd->mode_info_context->mbmi.sb_type = BLOCK_8X16; |
| 559 } else { | 559 } else { |
| 560 xd->mode_info_context->mbmi.sb_type = BLOCK_SIZE_SB8X8; | 560 xd->mode_info_context->mbmi.sb_type = BLOCK_8X8; |
| 561 } | 561 } |
| 562 } | 562 } |
| 563 xd->mode_info_context->mbmi.ref_frame[0] = INTRA_FRAME; | 563 xd->mode_info_context->mbmi.ref_frame[0] = INTRA_FRAME; |
| 564 set_mi_row_col(cm, xd, | 564 set_mi_row_col(cm, xd, |
| 565 mb_row << 1, | 565 mb_row << 1, |
| 566 1 << mi_height_log2(xd->mode_info_context->mbmi.sb_type), | 566 1 << mi_height_log2(xd->mode_info_context->mbmi.sb_type), |
| 567 mb_col << 1, | 567 mb_col << 1, |
| 568 1 << mi_height_log2(xd->mode_info_context->mbmi.sb_type)); | 568 1 << mi_height_log2(xd->mode_info_context->mbmi.sb_type)); |
| 569 | 569 |
| 570 // do intra 16x16 prediction | 570 // do intra 16x16 prediction |
| 571 this_error = vp9_encode_intra(cpi, x, use_dc_pred); | 571 this_error = vp9_encode_intra(x, use_dc_pred); |
| 572 | 572 |
| 573 // "intrapenalty" below deals with situations where the intra and inter er
ror scores are very low (eg a plain black frame) | 573 // "intrapenalty" below deals with situations where the intra and inter er
ror scores are very low (eg a plain black frame) |
| 574 // We do not have special cases in first pass for 0,0 and nearest etc so a
ll inter modes carry an overhead cost estimate fot the mv. | 574 // We do not have special cases in first pass for 0,0 and nearest etc so a
ll inter modes carry an overhead cost estimate fot the mv. |
| 575 // When the error score is very low this causes us to pick all or lots of
INTRA modes and throw lots of key frames. | 575 // When the error score is very low this causes us to pick all or lots of
INTRA modes and throw lots of key frames. |
| 576 // This penalty adds a cost matching that of a 0,0 mv to the intra case. | 576 // This penalty adds a cost matching that of a 0,0 mv to the intra case. |
| 577 this_error += intrapenalty; | 577 this_error += intrapenalty; |
| 578 | 578 |
| 579 // Cumulative intra error total | 579 // Cumulative intra error total |
| 580 intra_error += (int64_t)this_error; | 580 intra_error += (int64_t)this_error; |
| 581 | 581 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 660 mv.as_mv.row <<= 3; | 660 mv.as_mv.row <<= 3; |
| 661 mv.as_mv.col <<= 3; | 661 mv.as_mv.col <<= 3; |
| 662 this_error = motion_error; | 662 this_error = motion_error; |
| 663 vp9_set_mbmode_and_mvs(x, NEWMV, &mv); | 663 vp9_set_mbmode_and_mvs(x, NEWMV, &mv); |
| 664 xd->mode_info_context->mbmi.txfm_size = TX_4X4; | 664 xd->mode_info_context->mbmi.txfm_size = TX_4X4; |
| 665 xd->mode_info_context->mbmi.ref_frame[0] = LAST_FRAME; | 665 xd->mode_info_context->mbmi.ref_frame[0] = LAST_FRAME; |
| 666 xd->mode_info_context->mbmi.ref_frame[1] = NONE; | 666 xd->mode_info_context->mbmi.ref_frame[1] = NONE; |
| 667 vp9_build_inter_predictors_sby(xd, mb_row << 1, | 667 vp9_build_inter_predictors_sby(xd, mb_row << 1, |
| 668 mb_col << 1, | 668 mb_col << 1, |
| 669 xd->mode_info_context->mbmi.sb_type); | 669 xd->mode_info_context->mbmi.sb_type); |
| 670 vp9_encode_sby(cm, x, xd->mode_info_context->mbmi.sb_type); | 670 vp9_encode_sby(x, xd->mode_info_context->mbmi.sb_type); |
| 671 sum_mvr += mv.as_mv.row; | 671 sum_mvr += mv.as_mv.row; |
| 672 sum_mvr_abs += abs(mv.as_mv.row); | 672 sum_mvr_abs += abs(mv.as_mv.row); |
| 673 sum_mvc += mv.as_mv.col; | 673 sum_mvc += mv.as_mv.col; |
| 674 sum_mvc_abs += abs(mv.as_mv.col); | 674 sum_mvc_abs += abs(mv.as_mv.col); |
| 675 sum_mvrs += mv.as_mv.row * mv.as_mv.row; | 675 sum_mvrs += mv.as_mv.row * mv.as_mv.row; |
| 676 sum_mvcs += mv.as_mv.col * mv.as_mv.col; | 676 sum_mvcs += mv.as_mv.col * mv.as_mv.col; |
| 677 intercount++; | 677 intercount++; |
| 678 | 678 |
| 679 best_ref_mv.as_int = mv.as_int; | 679 best_ref_mv.as_int = mv.as_int; |
| 680 | 680 |
| (...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1275 if (next_frame.pcnt_second_ref > next_frame.pcnt_inter && | 1275 if (next_frame.pcnt_second_ref > next_frame.pcnt_inter && |
| 1276 next_frame.pcnt_second_ref >= 0.5) | 1276 next_frame.pcnt_second_ref >= 0.5) |
| 1277 flash_detected = 1; | 1277 flash_detected = 1; |
| 1278 } | 1278 } |
| 1279 | 1279 |
| 1280 return flash_detected; | 1280 return flash_detected; |
| 1281 } | 1281 } |
| 1282 | 1282 |
| 1283 // Update the motion related elements to the GF arf boost calculation | 1283 // Update the motion related elements to the GF arf boost calculation |
| 1284 static void accumulate_frame_motion_stats( | 1284 static void accumulate_frame_motion_stats( |
| 1285 VP9_COMP *cpi, | |
| 1286 FIRSTPASS_STATS *this_frame, | 1285 FIRSTPASS_STATS *this_frame, |
| 1287 double *this_frame_mv_in_out, | 1286 double *this_frame_mv_in_out, |
| 1288 double *mv_in_out_accumulator, | 1287 double *mv_in_out_accumulator, |
| 1289 double *abs_mv_in_out_accumulator, | 1288 double *abs_mv_in_out_accumulator, |
| 1290 double *mv_ratio_accumulator) { | 1289 double *mv_ratio_accumulator) { |
| 1291 // double this_frame_mv_in_out; | 1290 // double this_frame_mv_in_out; |
| 1292 double this_frame_mvr_ratio; | 1291 double this_frame_mvr_ratio; |
| 1293 double this_frame_mvc_ratio; | 1292 double this_frame_mvc_ratio; |
| 1294 double motion_pct; | 1293 double motion_pct; |
| 1295 | 1294 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1370 double abs_mv_in_out_accumulator = 0.0; | 1369 double abs_mv_in_out_accumulator = 0.0; |
| 1371 int arf_boost; | 1370 int arf_boost; |
| 1372 int flash_detected = 0; | 1371 int flash_detected = 0; |
| 1373 | 1372 |
| 1374 // Search forward from the proposed arf/next gf position | 1373 // Search forward from the proposed arf/next gf position |
| 1375 for (i = 0; i < f_frames; i++) { | 1374 for (i = 0; i < f_frames; i++) { |
| 1376 if (read_frame_stats(cpi, &this_frame, (i + offset)) == EOF) | 1375 if (read_frame_stats(cpi, &this_frame, (i + offset)) == EOF) |
| 1377 break; | 1376 break; |
| 1378 | 1377 |
| 1379 // Update the motion related elements to the boost calculation | 1378 // Update the motion related elements to the boost calculation |
| 1380 accumulate_frame_motion_stats(cpi, &this_frame, | 1379 accumulate_frame_motion_stats(&this_frame, |
| 1381 &this_frame_mv_in_out, &mv_in_out_accumulator, | 1380 &this_frame_mv_in_out, &mv_in_out_accumulator, |
| 1382 &abs_mv_in_out_accumulator, &mv_ratio_accumula
tor); | 1381 &abs_mv_in_out_accumulator, &mv_ratio_accumula
tor); |
| 1383 | 1382 |
| 1384 // We want to discount the flash frame itself and the recovery | 1383 // We want to discount the flash frame itself and the recovery |
| 1385 // frame that follows as both will have poor scores. | 1384 // frame that follows as both will have poor scores. |
| 1386 flash_detected = detect_flash(cpi, (i + offset)) || | 1385 flash_detected = detect_flash(cpi, (i + offset)) || |
| 1387 detect_flash(cpi, (i + offset + 1)); | 1386 detect_flash(cpi, (i + offset + 1)); |
| 1388 | 1387 |
| 1389 // Cumulative effect of prediction quality decay | 1388 // Cumulative effect of prediction quality decay |
| 1390 if (!flash_detected) { | 1389 if (!flash_detected) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1406 this_frame_mv_in_out = 0.0; | 1405 this_frame_mv_in_out = 0.0; |
| 1407 mv_in_out_accumulator = 0.0; | 1406 mv_in_out_accumulator = 0.0; |
| 1408 abs_mv_in_out_accumulator = 0.0; | 1407 abs_mv_in_out_accumulator = 0.0; |
| 1409 | 1408 |
| 1410 // Search backward towards last gf position | 1409 // Search backward towards last gf position |
| 1411 for (i = -1; i >= -b_frames; i--) { | 1410 for (i = -1; i >= -b_frames; i--) { |
| 1412 if (read_frame_stats(cpi, &this_frame, (i + offset)) == EOF) | 1411 if (read_frame_stats(cpi, &this_frame, (i + offset)) == EOF) |
| 1413 break; | 1412 break; |
| 1414 | 1413 |
| 1415 // Update the motion related elements to the boost calculation | 1414 // Update the motion related elements to the boost calculation |
| 1416 accumulate_frame_motion_stats(cpi, &this_frame, | 1415 accumulate_frame_motion_stats(&this_frame, |
| 1417 &this_frame_mv_in_out, &mv_in_out_accumulator, | 1416 &this_frame_mv_in_out, &mv_in_out_accumulator, |
| 1418 &abs_mv_in_out_accumulator, &mv_ratio_accumula
tor); | 1417 &abs_mv_in_out_accumulator, &mv_ratio_accumula
tor); |
| 1419 | 1418 |
| 1420 // We want to discount the the flash frame itself and the recovery | 1419 // We want to discount the the flash frame itself and the recovery |
| 1421 // frame that follows as both will have poor scores. | 1420 // frame that follows as both will have poor scores. |
| 1422 flash_detected = detect_flash(cpi, (i + offset)) || | 1421 flash_detected = detect_flash(cpi, (i + offset)) || |
| 1423 detect_flash(cpi, (i + offset + 1)); | 1422 detect_flash(cpi, (i + offset + 1)); |
| 1424 | 1423 |
| 1425 // Cumulative effect of prediction quality decay | 1424 // Cumulative effect of prediction quality decay |
| 1426 if (!flash_detected) { | 1425 if (!flash_detected) { |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1574 for (i = 0; i < cpi->new_frame_coding_order_period; ++i) { | 1573 for (i = 0; i < cpi->new_frame_coding_order_period; ++i) { |
| 1575 printf("%4d ", cpi->arf_weight[i]); | 1574 printf("%4d ", cpi->arf_weight[i]); |
| 1576 } | 1575 } |
| 1577 printf("\n"); | 1576 printf("\n"); |
| 1578 #endif | 1577 #endif |
| 1579 } | 1578 } |
| 1580 #endif | 1579 #endif |
| 1581 | 1580 |
| 1582 // Analyse and define a gf/arf group. | 1581 // Analyse and define a gf/arf group. |
| 1583 static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { | 1582 static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { |
| 1584 FIRSTPASS_STATS next_frame; | 1583 FIRSTPASS_STATS next_frame = { 0 }; |
| 1585 FIRSTPASS_STATS *start_pos; | 1584 FIRSTPASS_STATS *start_pos; |
| 1586 int i; | 1585 int i; |
| 1587 double boost_score = 0.0; | 1586 double boost_score = 0.0; |
| 1588 double old_boost_score = 0.0; | 1587 double old_boost_score = 0.0; |
| 1589 double gf_group_err = 0.0; | 1588 double gf_group_err = 0.0; |
| 1590 double gf_first_frame_err = 0.0; | 1589 double gf_first_frame_err = 0.0; |
| 1591 double mod_frame_err = 0.0; | 1590 double mod_frame_err = 0.0; |
| 1592 | 1591 |
| 1593 double mv_ratio_accumulator = 0.0; | 1592 double mv_ratio_accumulator = 0.0; |
| 1594 double decay_accumulator = 1.0; | 1593 double decay_accumulator = 1.0; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1610 int b_boost = 0; | 1609 int b_boost = 0; |
| 1611 int flash_detected; | 1610 int flash_detected; |
| 1612 int active_max_gf_interval; | 1611 int active_max_gf_interval; |
| 1613 | 1612 |
| 1614 cpi->twopass.gf_group_bits = 0; | 1613 cpi->twopass.gf_group_bits = 0; |
| 1615 | 1614 |
| 1616 vp9_clear_system_state(); // __asm emms; | 1615 vp9_clear_system_state(); // __asm emms; |
| 1617 | 1616 |
| 1618 start_pos = cpi->twopass.stats_in; | 1617 start_pos = cpi->twopass.stats_in; |
| 1619 | 1618 |
| 1620 vpx_memset(&next_frame, 0, sizeof(next_frame)); // assure clean | |
| 1621 | |
| 1622 // Load stats for the current frame. | 1619 // Load stats for the current frame. |
| 1623 mod_frame_err = calculate_modified_err(cpi, this_frame); | 1620 mod_frame_err = calculate_modified_err(cpi, this_frame); |
| 1624 | 1621 |
| 1625 // Note the error of the frame at the start of the group (this will be | 1622 // Note the error of the frame at the start of the group (this will be |
| 1626 // the GF frame error if we code a normal gf | 1623 // the GF frame error if we code a normal gf |
| 1627 gf_first_frame_err = mod_frame_err; | 1624 gf_first_frame_err = mod_frame_err; |
| 1628 | 1625 |
| 1629 // Special treatment if the current frame is a key frame (which is also | 1626 // Special treatment if the current frame is a key frame (which is also |
| 1630 // a gf). If it is then its error score (and hence bit allocation) need | 1627 // a gf). If it is then its error score (and hence bit allocation) need |
| 1631 // to be subtracted out from the calculation for the GF group | 1628 // to be subtracted out from the calculation for the GF group |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1658 gf_group_err += mod_frame_err; | 1655 gf_group_err += mod_frame_err; |
| 1659 | 1656 |
| 1660 if (EOF == input_stats(cpi, &next_frame)) | 1657 if (EOF == input_stats(cpi, &next_frame)) |
| 1661 break; | 1658 break; |
| 1662 | 1659 |
| 1663 // Test for the case where there is a brief flash but the prediction | 1660 // Test for the case where there is a brief flash but the prediction |
| 1664 // quality back to an earlier frame is then restored. | 1661 // quality back to an earlier frame is then restored. |
| 1665 flash_detected = detect_flash(cpi, 0); | 1662 flash_detected = detect_flash(cpi, 0); |
| 1666 | 1663 |
| 1667 // Update the motion related elements to the boost calculation | 1664 // Update the motion related elements to the boost calculation |
| 1668 accumulate_frame_motion_stats(cpi, &next_frame, | 1665 accumulate_frame_motion_stats(&next_frame, |
| 1669 &this_frame_mv_in_out, &mv_in_out_accumulator, | 1666 &this_frame_mv_in_out, &mv_in_out_accumulator, |
| 1670 &abs_mv_in_out_accumulator, &mv_ratio_accumula
tor); | 1667 &abs_mv_in_out_accumulator, &mv_ratio_accumula
tor); |
| 1671 | 1668 |
| 1672 // Cumulative effect of prediction quality decay | 1669 // Cumulative effect of prediction quality decay |
| 1673 if (!flash_detected) { | 1670 if (!flash_detected) { |
| 1674 last_loop_decay_rate = loop_decay_rate; | 1671 last_loop_decay_rate = loop_decay_rate; |
| 1675 loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame); | 1672 loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame); |
| 1676 decay_accumulator = decay_accumulator * loop_decay_rate; | 1673 decay_accumulator = decay_accumulator * loop_decay_rate; |
| 1677 | 1674 |
| 1678 // Monitor for static sections. | 1675 // Monitor for static sections. |
| (...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2132 tmp_q = estimate_max_q( | 2129 tmp_q = estimate_max_q( |
| 2133 cpi, | 2130 cpi, |
| 2134 &cpi->twopass.total_left_stats, | 2131 &cpi->twopass.total_left_stats, |
| 2135 (int)(cpi->twopass.bits_left / frames_left)); | 2132 (int)(cpi->twopass.bits_left / frames_left)); |
| 2136 | 2133 |
| 2137 // Make a damped adjustment to active max Q | 2134 // Make a damped adjustment to active max Q |
| 2138 cpi->active_worst_quality = | 2135 cpi->active_worst_quality = |
| 2139 adjust_active_maxq(cpi->active_worst_quality, tmp_q); | 2136 adjust_active_maxq(cpi->active_worst_quality, tmp_q); |
| 2140 } | 2137 } |
| 2141 #endif | 2138 #endif |
| 2142 | 2139 vp9_zero(this_frame); |
| 2143 vpx_memset(&this_frame, 0, sizeof(FIRSTPASS_STATS)); | |
| 2144 if (EOF == input_stats(cpi, &this_frame)) | 2140 if (EOF == input_stats(cpi, &this_frame)) |
| 2145 return; | 2141 return; |
| 2146 | 2142 |
| 2147 this_frame_intra_error = this_frame.intra_error; | 2143 this_frame_intra_error = this_frame.intra_error; |
| 2148 this_frame_coded_error = this_frame.coded_error; | 2144 this_frame_coded_error = this_frame.coded_error; |
| 2149 | 2145 |
| 2150 // keyframe and section processing ! | 2146 // keyframe and section processing ! |
| 2151 if (cpi->twopass.frames_to_key == 0) { | 2147 if (cpi->twopass.frames_to_key == 0) { |
| 2152 // Define next KF group and assign bits to it | 2148 // Define next KF group and assign bits to it |
| 2153 this_frame_copy = this_frame; | 2149 this_frame_copy = this_frame; |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2311 double zero_motion_accumulator = 1.0; | 2307 double zero_motion_accumulator = 1.0; |
| 2312 double boost_score = 0; | 2308 double boost_score = 0; |
| 2313 double loop_decay_rate; | 2309 double loop_decay_rate; |
| 2314 | 2310 |
| 2315 double kf_mod_err = 0.0; | 2311 double kf_mod_err = 0.0; |
| 2316 double kf_group_err = 0.0; | 2312 double kf_group_err = 0.0; |
| 2317 double kf_group_intra_err = 0.0; | 2313 double kf_group_intra_err = 0.0; |
| 2318 double kf_group_coded_err = 0.0; | 2314 double kf_group_coded_err = 0.0; |
| 2319 double recent_loop_decay[8] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; | 2315 double recent_loop_decay[8] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; |
| 2320 | 2316 |
| 2321 vpx_memset(&next_frame, 0, sizeof(next_frame)); // assure clean | 2317 vp9_zero(next_frame); |
| 2322 | 2318 |
| 2323 vp9_clear_system_state(); // __asm emms; | 2319 vp9_clear_system_state(); // __asm emms; |
| 2324 start_position = cpi->twopass.stats_in; | 2320 start_position = cpi->twopass.stats_in; |
| 2325 | 2321 |
| 2326 cpi->common.frame_type = KEY_FRAME; | 2322 cpi->common.frame_type = KEY_FRAME; |
| 2327 | 2323 |
| 2328 // is this a forced key frame by interval | 2324 // is this a forced key frame by interval |
| 2329 cpi->this_key_frame_forced = cpi->next_key_frame_forced; | 2325 cpi->this_key_frame_forced = cpi->next_key_frame_forced; |
| 2330 | 2326 |
| 2331 // Clear the alt ref active flag as this can never be active on a key frame | 2327 // Clear the alt ref active flag as this can never be active on a key frame |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2626 cpi->output_framerate); | 2622 cpi->output_framerate); |
| 2627 } | 2623 } |
| 2628 | 2624 |
| 2629 // Note the total error score of the kf group minus the key frame itself | 2625 // Note the total error score of the kf group minus the key frame itself |
| 2630 cpi->twopass.kf_group_error_left = (int)(kf_group_err - kf_mod_err); | 2626 cpi->twopass.kf_group_error_left = (int)(kf_group_err - kf_mod_err); |
| 2631 | 2627 |
| 2632 // Adjust the count of total modified error left. | 2628 // Adjust the count of total modified error left. |
| 2633 // The count of bits left is adjusted elsewhere based on real coded frame size
s | 2629 // The count of bits left is adjusted elsewhere based on real coded frame size
s |
| 2634 cpi->twopass.modified_error_left -= kf_group_err; | 2630 cpi->twopass.modified_error_left -= kf_group_err; |
| 2635 } | 2631 } |
| OLD | NEW |