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

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

Issue 11974002: libvpx: Pull from upstream (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 7 years, 11 months 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_firstpass.h ('k') | source/libvpx/vp9/encoder/vp9_lookahead.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
11 #include "math.h" 11 #include "math.h"
12 #include "limits.h" 12 #include "limits.h"
13 #include "vp9/encoder/vp9_block.h" 13 #include "vp9/encoder/vp9_block.h"
14 #include "vp9/encoder/vp9_onyx_int.h" 14 #include "vp9/encoder/vp9_onyx_int.h"
15 #include "vp9/encoder/vp9_variance.h" 15 #include "vp9/encoder/vp9_variance.h"
16 #include "vp9/encoder/vp9_encodeintra.h" 16 #include "vp9/encoder/vp9_encodeintra.h"
17 #include "vp9/common/vp9_setupintrarecon.h" 17 #include "vp9/common/vp9_setupintrarecon.h"
18 #include "vp9/encoder/vp9_mcomp.h" 18 #include "vp9/encoder/vp9_mcomp.h"
19 #include "vp9/encoder/vp9_firstpass.h" 19 #include "vp9/encoder/vp9_firstpass.h"
20 #include "vpx_scale/vpxscale.h" 20 #include "vpx_scale/vpx_scale.h"
21 #include "vp9/encoder/vp9_encodeframe.h" 21 #include "vp9/encoder/vp9_encodeframe.h"
22 #include "vp9/encoder/vp9_encodemb.h" 22 #include "vp9/encoder/vp9_encodemb.h"
23 #include "vp9/common/vp9_extend.h" 23 #include "vp9/common/vp9_extend.h"
24 #include "vp9/common/vp9_systemdependent.h" 24 #include "vp9/common/vp9_systemdependent.h"
25 #include "vpx_mem/vpx_mem.h" 25 #include "vpx_mem/vpx_mem.h"
26 #include "vp9/common/vp9_swapyv12buffer.h" 26 #include "vp9/common/vp9_swapyv12buffer.h"
27 #include <stdio.h> 27 #include <stdio.h>
28 #include "vp9/encoder/vp9_quantize.h" 28 #include "vp9/encoder/vp9_quantize.h"
29 #include "vp9/encoder/vp9_rdopt.h" 29 #include "vp9/encoder/vp9_rdopt.h"
30 #include "vp9/encoder/vp9_ratectrl.h" 30 #include "vp9/encoder/vp9_ratectrl.h"
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 , 289 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 ,
290 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 , 290 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 ,
291 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 , 291 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 ,
292 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 , 292 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 ,
293 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 293 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000
294 }; 294 };
295 295
296 static double simple_weight(YV12_BUFFER_CONFIG *source) { 296 static double simple_weight(YV12_BUFFER_CONFIG *source) {
297 int i, j; 297 int i, j;
298 298
299 unsigned char *src = source->y_buffer; 299 uint8_t *src = source->y_buffer;
300 double sum_weights = 0.0; 300 double sum_weights = 0.0;
301 301
302 // Loop throught the Y plane raw examining levels and creating a weight for th e image 302 // Loop throught the Y plane raw examining levels and creating a weight for th e image
303 i = source->y_height; 303 i = source->y_height;
304 do { 304 do {
305 j = source->y_width; 305 j = source->y_width;
306 do { 306 do {
307 sum_weights += weight_table[ *src]; 307 sum_weights += weight_table[ *src];
308 src++; 308 src++;
309 } while (--j); 309 } while (--j);
(...skipping 28 matching lines...) Expand all
338 338
339 void vp9_end_first_pass(VP9_COMP *cpi) { 339 void vp9_end_first_pass(VP9_COMP *cpi) {
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 BLOCK *b = &x->block[0]; 345 BLOCK *b = &x->block[0];
346 BLOCKD *d = &x->e_mbd.block[0]; 346 BLOCKD *d = &x->e_mbd.block[0];
347 347
348 unsigned char *src_ptr = (*(b->base_src) + b->src); 348 uint8_t *src_ptr = (*(b->base_src) + b->src);
349 int src_stride = b->src_stride; 349 int src_stride = b->src_stride;
350 unsigned char *ref_ptr; 350 uint8_t *ref_ptr;
351 int ref_stride = d->pre_stride; 351 int ref_stride = d->pre_stride;
352 352
353 // Set up pointers for this macro block recon buffer 353 // Set up pointers for this macro block recon buffer
354 xd->pre.y_buffer = recon_buffer->y_buffer + recon_yoffset; 354 xd->pre.y_buffer = recon_buffer->y_buffer + recon_yoffset;
355 355
356 ref_ptr = (unsigned char *)(*(d->base_pre) + d->pre); 356 ref_ptr = (uint8_t *)(*(d->base_pre) + d->pre);
357 357
358 vp9_mse16x16(src_ptr, src_stride, ref_ptr, ref_stride, 358 vp9_mse16x16(src_ptr, src_stride, ref_ptr, ref_stride,
359 (unsigned int *)(best_motion_err)); 359 (unsigned int *)(best_motion_err));
360 } 360 }
361 361
362 static void first_pass_motion_search(VP9_COMP *cpi, MACROBLOCK *x, 362 static void first_pass_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
363 int_mv *ref_mv, MV *best_mv, 363 int_mv *ref_mv, MV *best_mv,
364 YV12_BUFFER_CONFIG *recon_buffer, 364 YV12_BUFFER_CONFIG *recon_buffer,
365 int *best_motion_err, int recon_yoffset) { 365 int *best_motion_err, int recon_yoffset) {
366 MACROBLOCKD *const xd = &x->e_mbd; 366 MACROBLOCKD *const xd = &x->e_mbd;
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) { 509 for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) {
510 int this_error; 510 int this_error;
511 int gf_motion_error = INT_MAX; 511 int gf_motion_error = INT_MAX;
512 int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row); 512 int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row);
513 513
514 xd->dst.y_buffer = new_yv12->y_buffer + recon_yoffset; 514 xd->dst.y_buffer = new_yv12->y_buffer + recon_yoffset;
515 xd->dst.u_buffer = new_yv12->u_buffer + recon_uvoffset; 515 xd->dst.u_buffer = new_yv12->u_buffer + recon_uvoffset;
516 xd->dst.v_buffer = new_yv12->v_buffer + recon_uvoffset; 516 xd->dst.v_buffer = new_yv12->v_buffer + recon_uvoffset;
517 xd->left_available = (mb_col != 0); 517 xd->left_available = (mb_col != 0);
518 518
519 #if !CONFIG_SUPERBLOCKS
520 // Copy current mb to a buffer
521 vp9_copy_mem16x16(x->src.y_buffer, x->src.y_stride, x->thismb, 16);
522 #endif
523
524 // do intra 16x16 prediction 519 // do intra 16x16 prediction
525 this_error = vp9_encode_intra(cpi, x, use_dc_pred); 520 this_error = vp9_encode_intra(cpi, x, use_dc_pred);
526 521
527 // "intrapenalty" below deals with situations where the intra and inter er ror scores are very low (eg a plain black frame) 522 // "intrapenalty" below deals with situations where the intra and inter er ror scores are very low (eg a plain black frame)
528 // 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. 523 // 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.
529 // When the error score is very low this causes us to pick all or lots of INTRA modes and throw lots of key frames. 524 // When the error score is very low this causes us to pick all or lots of INTRA modes and throw lots of key frames.
530 // This penalty adds a cost matching that of a 0,0 mv to the intra case. 525 // This penalty adds a cost matching that of a 0,0 mv to the intra case.
531 this_error += intrapenalty; 526 this_error += intrapenalty;
532 527
533 // Cumulative intra error total 528 // Cumulative intra error total
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
792 // Estimate a cost per mb attributable to overheads such as the coding of 787 // Estimate a cost per mb attributable to overheads such as the coding of
793 // modes and motion vectors. 788 // modes and motion vectors.
794 // Currently simplistic in its assumptions for testing. 789 // Currently simplistic in its assumptions for testing.
795 // 790 //
796 791
797 792
798 static double bitcost(double prob) { 793 static double bitcost(double prob) {
799 return -(log(prob) / log(2.0)); 794 return -(log(prob) / log(2.0));
800 } 795 }
801 796
802 static long long estimate_modemvcost(VP9_COMP *cpi, 797 static int64_t estimate_modemvcost(VP9_COMP *cpi,
803 FIRSTPASS_STATS *fpstats) { 798 FIRSTPASS_STATS *fpstats) {
799 #if 0
804 int mv_cost; 800 int mv_cost;
805 int mode_cost; 801 int mode_cost;
806 802
807 double av_pct_inter = fpstats->pcnt_inter / fpstats->count; 803 double av_pct_inter = fpstats->pcnt_inter / fpstats->count;
808 double av_pct_motion = fpstats->pcnt_motion / fpstats->count; 804 double av_pct_motion = fpstats->pcnt_motion / fpstats->count;
809 double av_intra = (1.0 - av_pct_inter); 805 double av_intra = (1.0 - av_pct_inter);
810 806
811 double zz_cost; 807 double zz_cost;
812 double motion_cost; 808 double motion_cost;
813 double intra_cost; 809 double intra_cost;
814 810
815 zz_cost = bitcost(av_pct_inter - av_pct_motion); 811 zz_cost = bitcost(av_pct_inter - av_pct_motion);
816 motion_cost = bitcost(av_pct_motion); 812 motion_cost = bitcost(av_pct_motion);
817 intra_cost = bitcost(av_intra); 813 intra_cost = bitcost(av_intra);
818 814
819 // Estimate of extra bits per mv overhead for mbs 815 // Estimate of extra bits per mv overhead for mbs
820 // << 9 is the normalization to the (bits * 512) used in vp9_bits_per_mb 816 // << 9 is the normalization to the (bits * 512) used in vp9_bits_per_mb
821 mv_cost = ((int)(fpstats->new_mv_count / fpstats->count) * 8) << 9; 817 mv_cost = ((int)(fpstats->new_mv_count / fpstats->count) * 8) << 9;
822 818
823 // Crude estimate of overhead cost from modes 819 // Crude estimate of overhead cost from modes
824 // << 9 is the normalization to (bits * 512) used in vp9_bits_per_mb 820 // << 9 is the normalization to (bits * 512) used in vp9_bits_per_mb
825 mode_cost = 821 mode_cost =
826 (int)((((av_pct_inter - av_pct_motion) * zz_cost) + 822 (int)((((av_pct_inter - av_pct_motion) * zz_cost) +
827 (av_pct_motion * motion_cost) + 823 (av_pct_motion * motion_cost) +
828 (av_intra * intra_cost)) * cpi->common.MBs) << 9; 824 (av_intra * intra_cost)) * cpi->common.MBs) << 9;
829 825
830 // return mv_cost + mode_cost; 826 // return mv_cost + mode_cost;
831 // TODO PGW Fix overhead costs for extended Q range 827 // TODO PGW Fix overhead costs for extended Q range
828 #endif
832 return 0; 829 return 0;
833 } 830 }
834 831
835 static double calc_correction_factor(double err_per_mb, 832 static double calc_correction_factor(double err_per_mb,
836 double err_divisor, 833 double err_divisor,
837 double pt_low, 834 double pt_low,
838 double pt_high, 835 double pt_high,
839 int Q) { 836 int Q) {
840 double power_term; 837 double power_term;
841 double error_term = err_per_mb / err_divisor; 838 double error_term = err_per_mb / err_divisor;
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after
1226 1223
1227 // Function to test for a condition where a complex transition is followed 1224 // Function to test for a condition where a complex transition is followed
1228 // by a static section. For example in slide shows where there is a fade 1225 // by a static section. For example in slide shows where there is a fade
1229 // between slides. This is to help with more optimal kf and gf positioning. 1226 // between slides. This is to help with more optimal kf and gf positioning.
1230 static int detect_transition_to_still( 1227 static int detect_transition_to_still(
1231 VP9_COMP *cpi, 1228 VP9_COMP *cpi,
1232 int frame_interval, 1229 int frame_interval,
1233 int still_interval, 1230 int still_interval,
1234 double loop_decay_rate, 1231 double loop_decay_rate,
1235 double last_decay_rate) { 1232 double last_decay_rate) {
1236 BOOL trans_to_still = FALSE; 1233 int trans_to_still = FALSE;
1237 1234
1238 // Break clause to detect very still sections after motion 1235 // Break clause to detect very still sections after motion
1239 // For example a static image after a fade or other transition 1236 // For example a static image after a fade or other transition
1240 // instead of a clean scene cut. 1237 // instead of a clean scene cut.
1241 if ((frame_interval > MIN_GF_INTERVAL) && 1238 if ((frame_interval > MIN_GF_INTERVAL) &&
1242 (loop_decay_rate >= 0.999) && 1239 (loop_decay_rate >= 0.999) &&
1243 (last_decay_rate < 0.9)) { 1240 (last_decay_rate < 0.9)) {
1244 int j; 1241 int j;
1245 FIRSTPASS_STATS *position = cpi->twopass.stats_in; 1242 FIRSTPASS_STATS *position = cpi->twopass.stats_in;
1246 FIRSTPASS_STATS tmp_next_frame; 1243 FIRSTPASS_STATS tmp_next_frame;
(...skipping 17 matching lines...) Expand all
1264 if (j == still_interval) 1261 if (j == still_interval)
1265 trans_to_still = TRUE; 1262 trans_to_still = TRUE;
1266 } 1263 }
1267 1264
1268 return trans_to_still; 1265 return trans_to_still;
1269 } 1266 }
1270 1267
1271 // This function detects a flash through the high relative pcnt_second_ref 1268 // This function detects a flash through the high relative pcnt_second_ref
1272 // score in the frame following a flash frame. The offset passed in should 1269 // score in the frame following a flash frame. The offset passed in should
1273 // reflect this 1270 // reflect this
1274 static BOOL detect_flash(VP9_COMP *cpi, int offset) { 1271 static int detect_flash(VP9_COMP *cpi, int offset) {
1275 FIRSTPASS_STATS next_frame; 1272 FIRSTPASS_STATS next_frame;
1276 1273
1277 BOOL flash_detected = FALSE; 1274 int flash_detected = FALSE;
1278 1275
1279 // Read the frame data. 1276 // Read the frame data.
1280 // The return is FALSE (no flash detected) if not a valid frame 1277 // The return is FALSE (no flash detected) if not a valid frame
1281 if (read_frame_stats(cpi, &next_frame, offset) != EOF) { 1278 if (read_frame_stats(cpi, &next_frame, offset) != EOF) {
1282 // What we are looking for here is a situation where there is a 1279 // What we are looking for here is a situation where there is a
1283 // brief break in prediction (such as a flash) but subsequent frames 1280 // brief break in prediction (such as a flash) but subsequent frames
1284 // are reasonably well predicted by an earlier (pre flash) frame. 1281 // are reasonably well predicted by an earlier (pre flash) frame.
1285 // The recovery after a flash is indicated by a high pcnt_second_ref 1282 // The recovery after a flash is indicated by a high pcnt_second_ref
1286 // comapred to pcnt_inter. 1283 // comapred to pcnt_inter.
1287 if ((next_frame.pcnt_second_ref > next_frame.pcnt_inter) && 1284 if ((next_frame.pcnt_second_ref > next_frame.pcnt_inter) &&
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
1379 FIRSTPASS_STATS this_frame; 1376 FIRSTPASS_STATS this_frame;
1380 1377
1381 int i; 1378 int i;
1382 double boost_score = 0.0; 1379 double boost_score = 0.0;
1383 double mv_ratio_accumulator = 0.0; 1380 double mv_ratio_accumulator = 0.0;
1384 double decay_accumulator = 1.0; 1381 double decay_accumulator = 1.0;
1385 double this_frame_mv_in_out = 0.0; 1382 double this_frame_mv_in_out = 0.0;
1386 double mv_in_out_accumulator = 0.0; 1383 double mv_in_out_accumulator = 0.0;
1387 double abs_mv_in_out_accumulator = 0.0; 1384 double abs_mv_in_out_accumulator = 0.0;
1388 int arf_boost; 1385 int arf_boost;
1389 BOOL flash_detected = FALSE; 1386 int flash_detected = FALSE;
1390 1387
1391 // Search forward from the proposed arf/next gf position 1388 // Search forward from the proposed arf/next gf position
1392 for (i = 0; i < f_frames; i++) { 1389 for (i = 0; i < f_frames; i++) {
1393 if (read_frame_stats(cpi, &this_frame, (i + offset)) == EOF) 1390 if (read_frame_stats(cpi, &this_frame, (i + offset)) == EOF)
1394 break; 1391 break;
1395 1392
1396 // Update the motion related elements to the boost calculation 1393 // Update the motion related elements to the boost calculation
1397 accumulate_frame_motion_stats(cpi, &this_frame, 1394 accumulate_frame_motion_stats(cpi, &this_frame,
1398 &this_frame_mv_in_out, &mv_in_out_accumulator, 1395 &this_frame_mv_in_out, &mv_in_out_accumulator,
1399 &abs_mv_in_out_accumulator, &mv_ratio_accumula tor); 1396 &abs_mv_in_out_accumulator, &mv_ratio_accumula tor);
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
1534 double mv_in_out_accumulator = 0.0; 1531 double mv_in_out_accumulator = 0.0;
1535 double abs_mv_in_out_accumulator = 0.0; 1532 double abs_mv_in_out_accumulator = 0.0;
1536 1533
1537 int max_bits = frame_max_bits(cpi); // Max for a single frame 1534 int max_bits = frame_max_bits(cpi); // Max for a single frame
1538 1535
1539 unsigned int allow_alt_ref = 1536 unsigned int allow_alt_ref =
1540 cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames; 1537 cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames;
1541 1538
1542 int f_boost = 0; 1539 int f_boost = 0;
1543 int b_boost = 0; 1540 int b_boost = 0;
1544 BOOL flash_detected; 1541 int flash_detected;
1545 1542
1546 cpi->twopass.gf_group_bits = 0; 1543 cpi->twopass.gf_group_bits = 0;
1547 1544
1548 vp9_clear_system_state(); // __asm emms; 1545 vp9_clear_system_state(); // __asm emms;
1549 1546
1550 start_pos = cpi->twopass.stats_in; 1547 start_pos = cpi->twopass.stats_in;
1551 1548
1552 vpx_memset(&next_frame, 0, sizeof(next_frame)); // assure clean 1549 vpx_memset(&next_frame, 0, sizeof(next_frame)); // assure clean
1553 1550
1554 // Load stats for the current frame. 1551 // Load stats for the current frame.
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
1944 return ret_val; 1941 return ret_val;
1945 } 1942 }
1946 1943
1947 void vp9_second_pass(VP9_COMP *cpi) { 1944 void vp9_second_pass(VP9_COMP *cpi) {
1948 int tmp_q; 1945 int tmp_q;
1949 int frames_left = (int)(cpi->twopass.total_stats->count - cpi->common.current_ video_frame); 1946 int frames_left = (int)(cpi->twopass.total_stats->count - cpi->common.current_ video_frame);
1950 1947
1951 FIRSTPASS_STATS this_frame; 1948 FIRSTPASS_STATS this_frame;
1952 FIRSTPASS_STATS this_frame_copy; 1949 FIRSTPASS_STATS this_frame_copy;
1953 1950
1954 double this_frame_error;
1955 double this_frame_intra_error; 1951 double this_frame_intra_error;
1956 double this_frame_coded_error; 1952 double this_frame_coded_error;
1957 1953
1958 FIRSTPASS_STATS *start_pos;
1959
1960 int overhead_bits; 1954 int overhead_bits;
1961 1955
1962 if (!cpi->twopass.stats_in) { 1956 if (!cpi->twopass.stats_in) {
1963 return; 1957 return;
1964 } 1958 }
1965 1959
1966 vp9_clear_system_state(); 1960 vp9_clear_system_state();
1967 1961
1968 vpx_memset(&this_frame, 0, sizeof(FIRSTPASS_STATS)); 1962 vpx_memset(&this_frame, 0, sizeof(FIRSTPASS_STATS));
1969 1963
1970 if (EOF == input_stats(cpi, &this_frame)) 1964 if (EOF == input_stats(cpi, &this_frame))
1971 return; 1965 return;
1972 1966
1973 this_frame_error = this_frame.ssim_weighted_pred_err;
1974 this_frame_intra_error = this_frame.intra_error; 1967 this_frame_intra_error = this_frame.intra_error;
1975 this_frame_coded_error = this_frame.coded_error; 1968 this_frame_coded_error = this_frame.coded_error;
1976 1969
1977 start_pos = cpi->twopass.stats_in;
1978
1979 // keyframe and section processing ! 1970 // keyframe and section processing !
1980 if (cpi->twopass.frames_to_key == 0) { 1971 if (cpi->twopass.frames_to_key == 0) {
1981 // Define next KF group and assign bits to it 1972 // Define next KF group and assign bits to it
1982 vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame)); 1973 vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
1983 find_next_key_frame(cpi, &this_frame_copy); 1974 find_next_key_frame(cpi, &this_frame_copy);
1984 } 1975 }
1985 1976
1986 // Is this a GF / ARF (Note that a KF is always also a GF) 1977 // Is this a GF / ARF (Note that a KF is always also a GF)
1987 if (cpi->frames_till_gf_update_due == 0) { 1978 if (cpi->frames_till_gf_update_due == 0) {
1988 // Define next gf group and assign bits to it 1979 // Define next gf group and assign bits to it
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
2093 adjust_active_maxq(cpi->active_worst_quality, tmp_q); 2084 adjust_active_maxq(cpi->active_worst_quality, tmp_q);
2094 } 2085 }
2095 2086
2096 cpi->twopass.frames_to_key--; 2087 cpi->twopass.frames_to_key--;
2097 2088
2098 // Update the total stats remaining sturcture 2089 // Update the total stats remaining sturcture
2099 subtract_stats(cpi->twopass.total_left_stats, &this_frame); 2090 subtract_stats(cpi->twopass.total_left_stats, &this_frame);
2100 } 2091 }
2101 2092
2102 2093
2103 static BOOL test_candidate_kf(VP9_COMP *cpi, FIRSTPASS_STATS *last_frame, FIRST PASS_STATS *this_frame, FIRSTPASS_STATS *next_frame) { 2094 static int test_candidate_kf(VP9_COMP *cpi,
2104 BOOL is_viable_kf = FALSE; 2095 FIRSTPASS_STATS *last_frame,
2096 FIRSTPASS_STATS *this_frame,
2097 FIRSTPASS_STATS *next_frame) {
2098 int is_viable_kf = FALSE;
2105 2099
2106 // Does the frame satisfy the primary criteria of a key frame 2100 // Does the frame satisfy the primary criteria of a key frame
2107 // If so, then examine how well it predicts subsequent frames 2101 // If so, then examine how well it predicts subsequent frames
2108 if ((this_frame->pcnt_second_ref < 0.10) && 2102 if ((this_frame->pcnt_second_ref < 0.10) &&
2109 (next_frame->pcnt_second_ref < 0.10) && 2103 (next_frame->pcnt_second_ref < 0.10) &&
2110 ((this_frame->pcnt_inter < 0.05) || 2104 ((this_frame->pcnt_inter < 0.05) ||
2111 ( 2105 (
2112 ((this_frame->pcnt_inter - this_frame->pcnt_neutral) < .35) && 2106 ((this_frame->pcnt_inter - this_frame->pcnt_neutral) < .35) &&
2113 ((this_frame->intra_error / DOUBLE_DIVIDE_CHECK(this_frame->coded_error )) < 2.5) && 2107 ((this_frame->intra_error / DOUBLE_DIVIDE_CHECK(this_frame->coded_error )) < 2.5) &&
2114 ((fabs(last_frame->coded_error - this_frame->coded_error) / DOUBLE_DIVI DE_CHECK(this_frame->coded_error) > .40) || 2108 ((fabs(last_frame->coded_error - this_frame->coded_error) / DOUBLE_DIVI DE_CHECK(this_frame->coded_error) > .40) ||
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
2518 cpi->output_frame_rate); 2512 cpi->output_frame_rate);
2519 } 2513 }
2520 2514
2521 // Note the total error score of the kf group minus the key frame itself 2515 // Note the total error score of the kf group minus the key frame itself
2522 cpi->twopass.kf_group_error_left = (int)(kf_group_err - kf_mod_err); 2516 cpi->twopass.kf_group_error_left = (int)(kf_group_err - kf_mod_err);
2523 2517
2524 // Adjust the count of total modified error left. 2518 // Adjust the count of total modified error left.
2525 // The count of bits left is adjusted elsewhere based on real coded frame size s 2519 // The count of bits left is adjusted elsewhere based on real coded frame size s
2526 cpi->twopass.modified_error_left -= kf_group_err; 2520 cpi->twopass.modified_error_left -= kf_group_err;
2527 } 2521 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_firstpass.h ('k') | source/libvpx/vp9/encoder/vp9_lookahead.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698