1 /* 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3 * 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 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 12 #ifndef __INC_VP8_INT_H 13 #define __INC_VP8_INT_H 14 15 #include <stdio.h> 16 #include "vpx_ports/config.h" 17 #include "onyx.h" 18 #include "treewriter.h" 19 #include "tokenize.h" 20 #include "onyxc_int.h" 21 #include "preproc.h" 22 #include "variance.h" 23 #include "dct.h" 24 #include "encodemb.h" 25 #include "quantize.h" 26 #include "entropy.h" 27 #include "threading.h" 28 #include "vpx_ports/mem.h" 29 #include "vpx/internal/vpx_codec_internal.h" 30 #include "mcomp.h" 31 32 //#define SPEEDSTATS 1 33 #define MIN_GF_INTERVAL 4 34 #define DEFAULT_GF_INTERVAL 7 35 36 #define KEY_FRAME_CONTEXT 5 37 38 #define MAX_LAG_BUFFERS (CONFIG_REALTIME_ONLY? 1 : 25) 39 40 #define AF_THRESH 25 41 #define AF_THRESH2 100 42 #define ARF_DECAY_THRESH 12 43 #define MAX_MODES 20 44 45 #define MIN_THRESHMULT 32 46 #define MAX_THRESHMULT 512 47 48 #define GF_ZEROMV_ZBIN_BOOST 24 49 #define ZBIN_OQ_MAX 192 50 51 #define VP8_TEMPORAL_ALT_REF 1 52 53 typedef struct 54 { 55 int kf_indicated; 56 unsigned int frames_since_key; 57 unsigned int frames_since_golden; 58 int filter_level; 59 int frames_till_gf_update_due; 60 int recent_ref_frame_usage[MAX_REF_FRAMES]; 61 62 MV_CONTEXT mvc[2]; 63 int mvcosts[2][MVvals+1]; 64 65 #ifdef MODE_STATS 66 // Stats 67 int y_modes[5]; 68 int uv_modes[4]; 69 int b_modes[10]; 70 int inter_y_modes[10]; 71 int inter_uv_modes[4]; 72 int inter_b_modes[10]; 73 #endif 74 75 vp8_prob ymode_prob[4], uv_mode_prob[3]; /* interframe intra mode probs */ 76 vp8_prob kf_ymode_prob[4], kf_uv_mode_prob[3]; /* keyframe "" */ 77 78 int ymode_count[5], uv_mode_count[4]; /* intra MB type cts this frame */ 79 80 int count_mb_ref_frame_usage[MAX_REF_FRAMES]; 81 82 int this_frame_percent_intra; 83 int last_frame_percent_intra; 84 85 86 } CODING_CONTEXT; 87 88 typedef struct 89 { 90 double frame; 91 double intra_error; 92 double coded_error; 93 double ssim_weighted_pred_err; 94 double pcnt_inter; 95 double pcnt_motion; 96 double pcnt_second_ref; 97 double MVr; 98 double mvr_abs; 99 double MVc; 100 double mvc_abs; 101 double MVrv; 102 double MVcv; 103 double mv_in_out_count; 104 double duration; 105 double count; 106 } 107 FIRSTPASS_STATS; 108 109 typedef struct 110 { 111 int frames_so_far; 112 double frame_intra_error; 113 double frame_coded_error; 114 double frame_pcnt_inter; 115 double frame_pcnt_motion; 116 double frame_mvr; 117 double frame_mvr_abs; 118 double frame_mvc; 119 double frame_mvc_abs; 120 121 } ONEPASS_FRAMESTATS; 122 123 124 typedef enum 125 { 126 THR_ZEROMV = 0, 127 THR_DC = 1, 128 129 THR_NEARESTMV = 2, 130 THR_NEARMV = 3, 131 132 THR_ZEROG = 4, 133 THR_NEARESTG = 5, 134 135 THR_ZEROA = 6, 136 THR_NEARESTA = 7, 137 138 THR_NEARG = 8, 139 THR_NEARA = 9, 140 141 THR_V_PRED = 10, 142 THR_H_PRED = 11, 143 THR_TM = 12, 144 145 THR_NEWMV = 13, 146 THR_NEWG = 14, 147 THR_NEWA = 15, 148 149 THR_SPLITMV = 16, 150 THR_SPLITG = 17, 151 THR_SPLITA = 18, 152 153 THR_B_PRED = 19, 154 } 155 THR_MODES; 156 157 typedef enum 158 { 159 DIAMOND = 0, 160 NSTEP = 1, 161 HEX = 2 162 } SEARCH_METHODS; 163 164 typedef struct 165 { 166 int RD; 167 SEARCH_METHODS search_method; 168 int improved_quant; 169 int improved_dct; 170 int auto_filter; 171 int recode_loop; 172 int iterative_sub_pixel; 173 int half_pixel_search; 174 int quarter_pixel_search; 175 int thresh_mult[MAX_MODES]; 176 int full_freq[2]; 177 int min_fs_radius; 178 int max_fs_radius; 179 int max_step_search_steps; 180 int first_step; 181 int optimize_coefficients; 182 183 } SPEED_FEATURES; 184 185 typedef struct 186 { 187 MACROBLOCK mb; 188 int mb_row; 189 TOKENEXTRA *tp; 190 int segment_counts[MAX_MB_SEGMENTS]; 191 int totalrate; 192 int current_mb_col; 193 } MB_ROW_COMP; 194 195 typedef struct 196 { 197 TOKENEXTRA *start; 198 TOKENEXTRA *stop; 199 } TOKENLIST; 200 201 typedef struct 202 { 203 int ithread; 204 void *ptr1; 205 void *ptr2; 206 } ENCODETHREAD_DATA; 207 typedef struct 208 { 209 int ithread; 210 void *ptr1; 211 } LPFTHREAD_DATA; 212 213 typedef struct 214 { 215 INT64 source_time_stamp; 216 INT64 source_end_time_stamp; 217 218 DECLARE_ALIGNED(16, YV12_BUFFER_CONFIG, source_buffer); 219 unsigned int source_frame_flags; 220 } SOURCE_SAMPLE; 221 222 typedef struct VP8_ENCODER_RTCD 223 { 224 VP8_COMMON_RTCD *common; 225 vp8_variance_rtcd_vtable_t variance; 226 vp8_fdct_rtcd_vtable_t fdct; 227 vp8_encodemb_rtcd_vtable_t encodemb; 228 vp8_quantize_rtcd_vtable_t quantize; 229 vp8_search_rtcd_vtable_t search; 230 } VP8_ENCODER_RTCD; 231 232 enum 233 { 234 BLOCK_16X8, 235 BLOCK_8X16, 236 BLOCK_8X8, 237 BLOCK_4X4, 238 BLOCK_16X16, 239 BLOCK_MAX_SEGMENTS 240 }; 241 242 typedef struct 243 { 244 245 DECLARE_ALIGNED(16, short, Y1quant[QINDEX_RANGE][16]); 246 DECLARE_ALIGNED(16, short, Y1quant_shift[QINDEX_RANGE][16]); 247 DECLARE_ALIGNED(16, short, Y1zbin[QINDEX_RANGE][16]); 248 DECLARE_ALIGNED(16, short, Y1round[QINDEX_RANGE][16]); 249 250 DECLARE_ALIGNED(16, short, Y2quant[QINDEX_RANGE][16]); 251 DECLARE_ALIGNED(16, short, Y2quant_shift[QINDEX_RANGE][16]); 252 DECLARE_ALIGNED(16, short, Y2zbin[QINDEX_RANGE][16]); 253 DECLARE_ALIGNED(16, short, Y2round[QINDEX_RANGE][16]); 254 255 DECLARE_ALIGNED(16, short, UVquant[QINDEX_RANGE][16]); 256 DECLARE_ALIGNED(16, short, UVquant_shift[QINDEX_RANGE][16]); 257 DECLARE_ALIGNED(16, short, UVzbin[QINDEX_RANGE][16]); 258 DECLARE_ALIGNED(16, short, UVround[QINDEX_RANGE][16]); 259 260 DECLARE_ALIGNED(16, short, zrun_zbin_boost_y1[QINDEX_RANGE][16]); 261 DECLARE_ALIGNED(16, short, zrun_zbin_boost_y2[QINDEX_RANGE][16]); 262 DECLARE_ALIGNED(16, short, zrun_zbin_boost_uv[QINDEX_RANGE][16]); 263 264 265 MACROBLOCK mb; 266 VP8_COMMON common; 267 vp8_writer bc, bc2; 268 // bool_writer *bc2; 269 270 VP8_CONFIG oxcf; 271 272 YV12_BUFFER_CONFIG *Source; 273 YV12_BUFFER_CONFIG *un_scaled_source; 274 INT64 source_time_stamp; 275 INT64 source_end_time_stamp; 276 unsigned int source_frame_flags; 277 YV12_BUFFER_CONFIG scaled_source; 278 279 int source_buffer_count; 280 int source_encode_index; 281 int source_alt_ref_pending; 282 int source_alt_ref_active; 283 284 int last_alt_ref_sei; 285 int is_src_frame_alt_ref; 286 int is_next_src_alt_ref; 287 288 int gold_is_last; // golden frame same as last frame ( short circuit gold searches) 289 int alt_is_last; // Alt reference frame same as last ( short circuit altref search) 290 int gold_is_alt; // don't do both alt and gold search ( just do gold). 291 292 //int refresh_alt_ref_frame; 293 SOURCE_SAMPLE src_buffer[MAX_LAG_BUFFERS]; 294 295 YV12_BUFFER_CONFIG last_frame_uf; 296 297 char *Dest; 298 299 TOKENEXTRA *tok; 300 unsigned int tok_count; 301 302 303 unsigned int frames_since_key; 304 unsigned int key_frame_frequency; 305 unsigned int next_key; 306 307 unsigned int mode_check_freq[MAX_MODES]; 308 unsigned int mode_test_hit_counts[MAX_MODES]; 309 unsigned int mode_chosen_counts[MAX_MODES]; 310 unsigned int mbs_tested_so_far; 311 312 unsigned int check_freq[2]; 313 unsigned int do_full[2]; 314 315 int rd_thresh_mult[MAX_MODES]; 316 int rd_baseline_thresh[MAX_MODES]; 317 int rd_threshes[MAX_MODES]; 318 int mvcostbase; 319 int mvcostmultiplier; 320 int subseqblockweight; 321 int errthresh; 322 323 int RDMULT; 324 int RDDIV ; 325 326 TOKENEXTRA *rdtok; 327 vp8_writer rdbc; 328 int intra_mode_costs[10]; 329 330 331 CODING_CONTEXT coding_context; 332 333 // Rate targetting variables 334 long long prediction_error; 335 long long last_prediction_error; 336 long long intra_error; 337 long long last_intra_error; 338 long long last_auto_filter_prediction_error; 339 340 #if 0 341 // Experimental RD code 342 long long frame_distortion; 343 long long last_frame_distortion; 344 #endif 345 346 int last_mb_distortion; 347 348 int frames_since_auto_filter; 349 350 int this_frame_target; 351 int projected_frame_size; 352 int last_q[2]; // Separate values for Intra/Inter 353 int target_bits_per_mb; 354 355 double rate_correction_factor; 356 double key_frame_rate_correction_factor; 357 double gf_rate_correction_factor; 358 double est_max_qcorrection_factor; 359 360 int frames_till_gf_update_due; // Count down till next GF 361 int current_gf_interval; // GF interval chosen when we coded the last GF 362 363 int gf_overspend_bits; // Total bits overspent becasue of GF boost (cumulative) 364 365 int gf_group_bits; // Projected Bits available for a group of frames including 1 GF or ARF 366 int gf_bits; // Bits for the golden frame or ARF - 2 pass only 367 int mid_gf_extra_bits; // A few extra bits for the frame half way between two gfs. 368 369 // Projected total bits available for a key frame group of frames 370 long long kf_group_bits; 371 372 // Error score of frames still to be coded in kf group 373 long long kf_group_error_left; 374 375 // Bits for the key frame in a key frame group - 2 pass only 376 int kf_bits; 377 378 int non_gf_bitrate_adjustment; // Used in the few frames following a GF to recover the extra bits spent in that GF 379 int initial_gf_use; // percentage use of gf 2 frames after gf 380 381 int gf_group_error_left; // Remaining error from uncoded frames in a gf group. Two pass use only 382 383 int kf_overspend_bits; // Extra bits spent on key frames that need to be recovered on inter frames 384 int kf_bitrate_adjustment; // Current number of bit s to try and recover on each inter frame. 385 int max_gf_interval; 386 int baseline_gf_interval; 387 int gf_decay_rate; 388 int active_arnr_frames; // <= cpi->oxcf.arnr_max_frames 389 390 INT64 key_frame_count; 391 INT64 tot_key_frame_bits; 392 int prior_key_frame_size[KEY_FRAME_CONTEXT]; 393 int prior_key_frame_distance[KEY_FRAME_CONTEXT]; 394 int per_frame_bandwidth; // Current section per frame bandwidth target 395 int av_per_frame_bandwidth; // Average frame size target for clip 396 int min_frame_bandwidth; // Minimum allocation that should be used for any frame 397 int last_key_frame_size; 398 int intra_frame_target; 399 int inter_frame_target; 400 double output_frame_rate; 401 long long last_time_stamp_seen; 402 long long first_time_stamp_ever; 403 404 int ni_av_qi; 405 int ni_tot_qi; 406 int ni_frames; 407 int avg_frame_qindex; 408 409 int zbin_over_quant; 410 int zbin_mode_boost; 411 int zbin_mode_boost_enabled; 412 413 INT64 total_byte_count; 414 415 int buffered_mode; 416 417 int buffer_level; 418 int bits_off_target; 419 420 int rolling_target_bits; 421 int rolling_actual_bits; 422 423 int long_rolling_target_bits; 424 int long_rolling_actual_bits; 425 426 long long total_actual_bits; 427 int total_target_vs_actual; // debug stats 428 429 int worst_quality; 430 int active_worst_quality; 431 int best_quality; 432 int active_best_quality; 433 434 int drop_frames_allowed; // Are we permitted to drop frames? 435 int drop_frame; // Drop this frame? 436 int drop_count; // How many frames have we dropped? 437 int max_drop_count; // How many frames should we drop? 438 int max_consec_dropped_frames; // Limit number of consecutive frames that can be dropped. 439 440 441 int ymode_count [VP8_YMODES]; /* intra MB type cts this frame */ 442 int uv_mode_count[VP8_UV_MODES]; /* intra MB type cts this frame */ 443 444 unsigned int MVcount [2] [MVvals]; /* (row,col) MV cts this frame */ 445 446 unsigned int coef_counts [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coef_tokens]; /* for this frame */ 447 //DECLARE_ALIGNED(16, int, coef_counts_backup [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coef_tokens]); //not used any more 448 //save vp8_tree_probs_from_distribution result for each frame to avoid repeat calculation 449 vp8_prob frame_coef_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coef_tokens-1]; 450 unsigned int frame_branch_ct [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coef_tokens-1][2]; 451 452 /* Second compressed data partition contains coefficient data. */ 453 454 unsigned char *output_partition2; 455 size_t output_partition2size; 456 457 pre_proc_instance ppi; 458 459 int frames_to_key; 460 int gfu_boost; 461 int kf_boost; 462 int last_boost; 463 double total_error_left; 464 double total_intra_error_left; 465 double total_coded_error_left; 466 double start_tot_err_left; 467 double min_error; 468 469 double modified_total_error_left; 470 double avg_iiratio; 471 472 int target_bandwidth; 473 long long bits_left; 474 FIRSTPASS_STATS *total_stats; 475 FIRSTPASS_STATS *this_frame_stats; 476 FIRSTPASS_STATS *stats_in, *stats_in_end; 477 struct vpx_codec_pkt_list *output_pkt_list; 478 int first_pass_done; 479 unsigned char *fp_motion_map; 480 481 unsigned char *fp_motion_map_stats, *fp_motion_map_stats_save; 482 483 #if 0 484 // Experimental code for lagged and one pass 485 ONEPASS_FRAMESTATS one_pass_frame_stats[MAX_LAG_BUFFERS]; 486 int one_pass_frame_index; 487 #endif 488 489 int decimation_factor; 490 int decimation_count; 491 492 // for real time encoding 493 int avg_encode_time; //microsecond 494 int avg_pick_mode_time; //microsecond 495 int Speed; 496 unsigned int cpu_freq; //Mhz 497 int compressor_speed; 498 499 int interquantizer; 500 int auto_gold; 501 int auto_adjust_gold_quantizer; 502 int goldquantizer; 503 int goldfreq; 504 int auto_adjust_key_quantizer; 505 int keyquantizer; 506 int auto_worst_q; 507 int filter_type; 508 int cpu_used; 509 int chroma_boost; 510 int horiz_scale; 511 int vert_scale; 512 int pass; 513 514 515 int prob_intra_coded; 516 int prob_last_coded; 517 int prob_gf_coded; 518 int prob_skip_false; 519 int last_skip_false_probs[3]; 520 int last_skip_probs_q[3]; 521 int recent_ref_frame_usage[MAX_REF_FRAMES]; 522 523 int count_mb_ref_frame_usage[MAX_REF_FRAMES]; 524 int this_frame_percent_intra; 525 int last_frame_percent_intra; 526 527 int last_key_frame_q; 528 int last_kffilt_lvl; 529 530 int ref_frame_flags; 531 532 int exp[512]; 533 534 SPEED_FEATURES sf; 535 int error_bins[1024]; 536 537 int inter_lvl; 538 int intra_lvl; 539 int motion_lvl; 540 int motion_speed; 541 int motion_var; 542 unsigned int next_iiratio; 543 unsigned int this_iiratio; 544 int this_frame_modified_error; 545 546 double norm_intra_err_per_mb; 547 double norm_inter_err_per_mb; 548 double norm_iidiff_per_mb; 549 550 int last_best_mode_index; // Record of mode index chosen for previous macro block. 551 int last_auto_filt_val; 552 int last_auto_filt_q; 553 554 // Data used for real time conferencing mode to help determine if it would be good to update the gf 555 int inter_zz_count; 556 int gf_bad_count; 557 int gf_update_recommended; 558 int skip_true_count; 559 int skip_false_count; 560 561 int alt_qcount; 562 563 int ready_for_new_frame; 564 565 unsigned char *segmentation_map; 566 signed char segment_feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS]; // Segment data (can be deltas or absolute values) 567 int segment_encode_breakout[MAX_MB_SEGMENTS]; // segment threashold for encode breakout 568 569 unsigned char *active_map; 570 unsigned int active_map_enabled; 571 // Video conferencing cyclic refresh mode flags etc 572 // This is a mode designed to clean up the background over time in live encoding scenarious. It uses segmentation 573 int cyclic_refresh_mode_enabled; 574 int cyclic_refresh_mode_max_mbs_perframe; 575 int cyclic_refresh_mode_index; 576 int cyclic_refresh_q; 577 signed char *cyclic_refresh_map; 578 579 // multithread data 580 int current_mb_col_main; 581 int processor_core_count; 582 int b_multi_threaded; 583 int encoding_thread_count; 584 585 #if CONFIG_MULTITHREAD 586 pthread_t *h_encoding_thread; 587 #endif 588 MB_ROW_COMP *mb_row_ei; 589 ENCODETHREAD_DATA *en_thread_data; 590 591 #if CONFIG_MULTITHREAD 592 //events 593 sem_t *h_event_mbrencoding; 594 sem_t h_event_main; 595 #endif 596 597 TOKENLIST *tplist; 598 // end of multithread data 599 600 601 fractional_mv_step_fp *find_fractional_mv_step; 602 vp8_full_search_fn_t full_search_sad; 603 vp8_diamond_search_fn_t diamond_search_sad; 604 vp8_variance_fn_ptr_t fn_ptr[BLOCK_MAX_SEGMENTS]; 605 unsigned int time_receive_data; 606 unsigned int time_compress_data; 607 unsigned int time_pick_lpf; 608 unsigned int time_encode_mb_row; 609 610 unsigned int tempdata1; 611 unsigned int tempdata2; 612 613 int base_skip_false_prob[128]; 614 unsigned int section_is_low_motion; 615 unsigned int section_benefits_from_aggresive_q; 616 unsigned int section_is_fast_motion; 617 unsigned int section_intra_rating; 618 619 double section_max_qfactor; 620 621 622 #if CONFIG_RUNTIME_CPU_DETECT 623 VP8_ENCODER_RTCD rtcd; 624 #endif 625 #if VP8_TEMPORAL_ALT_REF 626 SOURCE_SAMPLE alt_ref_buffer; 627 YV12_BUFFER_CONFIG *frames[MAX_LAG_BUFFERS]; 628 int fixed_divide[512]; 629 #endif 630 // Flag to indicate temporal filter method 631 int use_weighted_temporal_filter; 632 633 #if CONFIG_PSNR 634 int count; 635 double total_y; 636 double total_u; 637 double total_v; 638 double total ; 639 double total_sq_error; 640 double totalp_y; 641 double totalp_u; 642 double totalp_v; 643 double totalp; 644 double total_sq_error2; 645 int bytes; 646 double summed_quality; 647 double summed_weights; 648 unsigned int tot_recode_hits; 649 650 651 double total_ssimg_y; 652 double total_ssimg_u; 653 double total_ssimg_v; 654 double total_ssimg_all; 655 656 int b_calculate_ssimg; 657 #endif 658 int b_calculate_psnr; 659 660 661 unsigned char *gf_active_flags; // Record of which MBs still refer to last golden frame either directly or through 0,0 662 int gf_active_count; 663 664 665 } VP8_COMP; 666 667 void control_data_rate(VP8_COMP *cpi); 668 669 void vp8_encode_frame(VP8_COMP *cpi); 670 671 void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned long *size); 672 673 int rd_cost_intra_mb(MACROBLOCKD *x); 674 675 void vp8_tokenize_mb(VP8_COMP *, MACROBLOCKD *, TOKENEXTRA **); 676 677 void vp8_set_speed_features(VP8_COMP *cpi); 678 679 #if CONFIG_DEBUG 680 #define CHECK_MEM_ERROR(lval,expr) do {\ 681 lval = (expr); \ 682 if(!lval) \ 683 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,\ 684 "Failed to allocate "#lval" at %s:%d", \ 685 __FILE__,__LINE__);\ 686 } while(0) 687 #else 688 #define CHECK_MEM_ERROR(lval,expr) do {\ 689 lval = (expr); \ 690 if(!lval) \ 691 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,\ 692 "Failed to allocate "#lval);\ 693 } while(0) 694 #endif 695 #endif 696