onyx_int.h 19.1 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5 6
 *  that can be found in the LICENSE file in the root of the source
 *  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.
John Koleszar's avatar
John Koleszar committed
9 10 11
 */


12 13
#ifndef VP8_ENCODER_ONYX_INT_H_
#define VP8_ENCODER_ONYX_INT_H_
John Koleszar's avatar
John Koleszar committed
14 15

#include <stdio.h>
16
#include "vpx_config.h"
John Koleszar's avatar
John Koleszar committed
17
#include "vp8/common/onyx.h"
John Koleszar's avatar
John Koleszar committed
18 19
#include "treewriter.h"
#include "tokenize.h"
John Koleszar's avatar
John Koleszar committed
20
#include "vp8/common/onyxc_int.h"
21
#include "vp8/common/variance.h"
John Koleszar's avatar
John Koleszar committed
22 23
#include "encodemb.h"
#include "quantize.h"
John Koleszar's avatar
John Koleszar committed
24 25
#include "vp8/common/entropy.h"
#include "vp8/common/threading.h"
John Koleszar's avatar
John Koleszar committed
26
#include "vpx_ports/mem.h"
27
#include "vpx/internal/vpx_codec_internal.h"
Johann's avatar
Johann committed
28
#include "vpx/vp8.h"
John Koleszar's avatar
John Koleszar committed
29
#include "mcomp.h"
John Koleszar's avatar
John Koleszar committed
30
#include "vp8/common/findnearmv.h"
John Koleszar's avatar
John Koleszar committed
31
#include "lookahead.h"
32 33 34
#if CONFIG_TEMPORAL_DENOISING
#include "vp8/encoder/denoising.h"
#endif
John Koleszar's avatar
John Koleszar committed
35

36 37 38 39
#ifdef __cplusplus
extern "C" {
#endif

John Koleszar's avatar
John Koleszar committed
40 41 42 43 44 45 46 47 48 49
#define MIN_GF_INTERVAL             4
#define DEFAULT_GF_INTERVAL         7

#define KEY_FRAME_CONTEXT 5

#define MAX_LAG_BUFFERS (CONFIG_REALTIME_ONLY? 1 : 25)

#define AF_THRESH   25
#define AF_THRESH2  100
#define ARF_DECAY_THRESH 12
50

John Koleszar's avatar
John Koleszar committed
51 52 53 54

#define MIN_THRESHMULT  32
#define MAX_THRESHMULT  512

55 56
#define GF_ZEROMV_ZBIN_BOOST 12
#define LF_ZEROMV_ZBIN_BOOST 6
57
#define MV_ZBIN_BOOST        4
John Koleszar's avatar
John Koleszar committed
58 59
#define ZBIN_OQ_MAX 192

60
#if !(CONFIG_REALTIME_ONLY)
John Koleszar's avatar
John Koleszar committed
61
#define VP8_TEMPORAL_ALT_REF 1
62
#endif
John Koleszar's avatar
John Koleszar committed
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106

typedef struct
{
    int kf_indicated;
    unsigned int frames_since_key;
    unsigned int frames_since_golden;
    int filter_level;
    int frames_till_gf_update_due;
    int recent_ref_frame_usage[MAX_REF_FRAMES];

    MV_CONTEXT mvc[2];
    int mvcosts[2][MVvals+1];

#ifdef MODE_STATS
    int y_modes[5];
    int uv_modes[4];
    int b_modes[10];
    int inter_y_modes[10];
    int inter_uv_modes[4];
    int inter_b_modes[10];
#endif

    vp8_prob ymode_prob[4], uv_mode_prob[3];   /* interframe intra mode probs */
    vp8_prob kf_ymode_prob[4], kf_uv_mode_prob[3];   /* keyframe "" */

    int ymode_count[5], uv_mode_count[4];  /* intra MB type cts this frame */

    int count_mb_ref_frame_usage[MAX_REF_FRAMES];

    int this_frame_percent_intra;
    int last_frame_percent_intra;


} CODING_CONTEXT;

typedef struct
{
    double frame;
    double intra_error;
    double coded_error;
    double ssim_weighted_pred_err;
    double pcnt_inter;
    double pcnt_motion;
    double pcnt_second_ref;
Paul Wilkins's avatar
Paul Wilkins committed
107
    double pcnt_neutral;
John Koleszar's avatar
John Koleszar committed
108 109 110 111 112 113 114
    double MVr;
    double mvr_abs;
    double MVc;
    double mvc_abs;
    double MVrv;
    double MVcv;
    double mv_in_out_count;
Paul Wilkins's avatar
Paul Wilkins committed
115
    double new_mv_count;
John Koleszar's avatar
John Koleszar committed
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
    double duration;
    double count;
}
FIRSTPASS_STATS;

typedef struct
{
    int frames_so_far;
    double frame_intra_error;
    double frame_coded_error;
    double frame_pcnt_inter;
    double frame_pcnt_motion;
    double frame_mvr;
    double frame_mvr_abs;
    double frame_mvc;
    double frame_mvc_abs;

} ONEPASS_FRAMESTATS;


typedef enum
{
138
    THR_ZERO1          = 0,
John Koleszar's avatar
John Koleszar committed
139 140
    THR_DC             = 1,

141 142
    THR_NEAREST1       = 2,
    THR_NEAR1          = 3,
John Koleszar's avatar
John Koleszar committed
143

144 145
    THR_ZERO2          = 4,
    THR_NEAREST2       = 5,
John Koleszar's avatar
John Koleszar committed
146

147 148
    THR_ZERO3          = 6,
    THR_NEAREST3       = 7,
John Koleszar's avatar
John Koleszar committed
149

150 151
    THR_NEAR2          = 8,
    THR_NEAR3          = 9,
John Koleszar's avatar
John Koleszar committed
152 153 154 155 156

    THR_V_PRED         = 10,
    THR_H_PRED         = 11,
    THR_TM             = 12,

157 158 159
    THR_NEW1           = 13,
    THR_NEW2           = 14,
    THR_NEW3           = 15,
John Koleszar's avatar
John Koleszar committed
160

161 162 163
    THR_SPLIT1         = 16,
    THR_SPLIT2         = 17,
    THR_SPLIT3         = 18,
John Koleszar's avatar
John Koleszar committed
164

165
    THR_B_PRED         = 19
John Koleszar's avatar
John Koleszar committed
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
}
THR_MODES;

typedef enum
{
    DIAMOND = 0,
    NSTEP = 1,
    HEX = 2
} SEARCH_METHODS;

typedef struct
{
    int RD;
    SEARCH_METHODS search_method;
    int improved_quant;
    int improved_dct;
    int auto_filter;
    int recode_loop;
    int iterative_sub_pixel;
    int half_pixel_search;
    int quarter_pixel_search;
    int thresh_mult[MAX_MODES];
    int max_step_search_steps;
    int first_step;
    int optimize_coefficients;

192
    int use_fastquant_for_pick;
193
    int no_skip_block4x4_search;
194
    int improved_mv_pred;
195

John Koleszar's avatar
John Koleszar committed
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
} SPEED_FEATURES;

typedef struct
{
    MACROBLOCK  mb;
    int segment_counts[MAX_MB_SEGMENTS];
    int totalrate;
} MB_ROW_COMP;

typedef struct
{
    TOKENEXTRA *start;
    TOKENEXTRA *stop;
} TOKENLIST;

typedef struct
{
    int ithread;
    void *ptr1;
    void *ptr2;
} ENCODETHREAD_DATA;
typedef struct
{
    int ithread;
    void *ptr1;
} LPFTHREAD_DATA;

223 224 225 226 227 228 229 230 231 232
enum
{
    BLOCK_16X8,
    BLOCK_8X16,
    BLOCK_8X8,
    BLOCK_4X4,
    BLOCK_16X16,
    BLOCK_MAX_SEGMENTS
};

233 234
typedef struct
{
John Koleszar's avatar
John Koleszar committed
235
    /* Layer configuration */
James Zern's avatar
James Zern committed
236
    double framerate;
237 238
    int target_bandwidth;

John Koleszar's avatar
John Koleszar committed
239
    /* Layer specific coding parameters */
240 241 242 243 244 245
    int64_t starting_buffer_level;
    int64_t optimal_buffer_level;
    int64_t maximum_buffer_size;
    int64_t starting_buffer_level_in_ms;
    int64_t optimal_buffer_level_in_ms;
    int64_t maximum_buffer_size_in_ms;
246 247 248

    int avg_frame_size_for_layer;

249 250
    int64_t buffer_level;
    int64_t bits_off_target;
251

John Koleszar's avatar
John Koleszar committed
252
    int64_t total_actual_bits;
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
    int total_target_vs_actual;

    int worst_quality;
    int active_worst_quality;
    int best_quality;
    int active_best_quality;

    int ni_av_qi;
    int ni_tot_qi;
    int ni_frames;
    int avg_frame_qindex;

    double rate_correction_factor;
    double key_frame_rate_correction_factor;
    double gf_rate_correction_factor;

    int zbin_over_quant;

    int inter_frame_target;
John Koleszar's avatar
John Koleszar committed
272
    int64_t total_byte_count;
273 274 275 276 277 278 279 280 281

    int filter_level;

    int last_frame_percent_intra;

    int count_mb_ref_frame_usage[MAX_REF_FRAMES];

} LAYER_CONTEXT;

282
typedef struct VP8_COMP
John Koleszar's avatar
John Koleszar committed
283 284
{

285
    DECLARE_ALIGNED(16, short, Y1quant[QINDEX_RANGE][16]);
286
    DECLARE_ALIGNED(16, short, Y1quant_shift[QINDEX_RANGE][16]);
287 288 289 290
    DECLARE_ALIGNED(16, short, Y1zbin[QINDEX_RANGE][16]);
    DECLARE_ALIGNED(16, short, Y1round[QINDEX_RANGE][16]);

    DECLARE_ALIGNED(16, short, Y2quant[QINDEX_RANGE][16]);
291
    DECLARE_ALIGNED(16, short, Y2quant_shift[QINDEX_RANGE][16]);
292 293 294 295
    DECLARE_ALIGNED(16, short, Y2zbin[QINDEX_RANGE][16]);
    DECLARE_ALIGNED(16, short, Y2round[QINDEX_RANGE][16]);

    DECLARE_ALIGNED(16, short, UVquant[QINDEX_RANGE][16]);
296
    DECLARE_ALIGNED(16, short, UVquant_shift[QINDEX_RANGE][16]);
297 298
    DECLARE_ALIGNED(16, short, UVzbin[QINDEX_RANGE][16]);
    DECLARE_ALIGNED(16, short, UVround[QINDEX_RANGE][16]);
John Koleszar's avatar
John Koleszar committed
299 300 301 302

    DECLARE_ALIGNED(16, short, zrun_zbin_boost_y1[QINDEX_RANGE][16]);
    DECLARE_ALIGNED(16, short, zrun_zbin_boost_y2[QINDEX_RANGE][16]);
    DECLARE_ALIGNED(16, short, zrun_zbin_boost_uv[QINDEX_RANGE][16]);
303 304 305
    DECLARE_ALIGNED(16, short, Y1quant_fast[QINDEX_RANGE][16]);
    DECLARE_ALIGNED(16, short, Y2quant_fast[QINDEX_RANGE][16]);
    DECLARE_ALIGNED(16, short, UVquant_fast[QINDEX_RANGE][16]);
John Koleszar's avatar
John Koleszar committed
306 307 308 309


    MACROBLOCK mb;
    VP8_COMMON common;
John Koleszar's avatar
John Koleszar committed
310
    vp8_writer bc[9]; /* one boolcoder for each partition */
John Koleszar's avatar
John Koleszar committed
311 312 313

    VP8_CONFIG oxcf;

John Koleszar's avatar
John Koleszar committed
314 315 316
    struct lookahead_ctx    *lookahead;
    struct lookahead_entry  *source;
    struct lookahead_entry  *alt_ref_source;
317
    struct lookahead_entry  *last_source;
John Koleszar's avatar
John Koleszar committed
318

John Koleszar's avatar
John Koleszar committed
319 320 321
    YV12_BUFFER_CONFIG *Source;
    YV12_BUFFER_CONFIG *un_scaled_source;
    YV12_BUFFER_CONFIG scaled_source;
322
    YV12_BUFFER_CONFIG *last_frame_unscaled_source;
John Koleszar's avatar
John Koleszar committed
323

324
    unsigned int frames_till_alt_ref_frame;
John Koleszar's avatar
John Koleszar committed
325 326 327 328 329 330
    /* frame in src_buffers has been identified to be encoded as an alt ref */
    int source_alt_ref_pending;
    /* an alt ref frame has been encoded and is usable */
    int source_alt_ref_active;
    /* source of frame to encode is an exact copy of an alt ref frame */
    int is_src_frame_alt_ref;
Fritz Koenig's avatar
Fritz Koenig committed
331

John Koleszar's avatar
John Koleszar committed
332 333 334 335 336 337
    /* golden frame same as last frame ( short circuit gold searches) */
    int gold_is_last;
    /* Alt reference frame same as last ( short circuit altref search) */
    int alt_is_last;
    /* don't do both alt and gold search ( just do gold). */
    int gold_is_alt;
John Koleszar's avatar
John Koleszar committed
338

339
    YV12_BUFFER_CONFIG pick_lf_lvl_frame;
John Koleszar's avatar
John Koleszar committed
340 341 342 343 344 345 346

    TOKENEXTRA *tok;
    unsigned int tok_count;


    unsigned int frames_since_key;
    unsigned int key_frame_frequency;
347 348
    unsigned int this_key_frame_forced;
    unsigned int next_key_frame_forced;
John Koleszar's avatar
John Koleszar committed
349

John Koleszar's avatar
John Koleszar committed
350
    /* Ambient reconstruction err target for force key frames */
351 352
    int ambient_err;

John Koleszar's avatar
John Koleszar committed
353 354 355 356 357 358 359 360 361
    unsigned int mode_check_freq[MAX_MODES];

    int rd_baseline_thresh[MAX_MODES];

    int RDMULT;
    int RDDIV ;

    CODING_CONTEXT coding_context;

John Koleszar's avatar
John Koleszar committed
362
    /* Rate targetting variables */
363 364
    int64_t last_prediction_error;
    int64_t last_intra_error;
John Koleszar's avatar
John Koleszar committed
365 366 367

    int this_frame_target;
    int projected_frame_size;
John Koleszar's avatar
John Koleszar committed
368
    int last_q[2];                   /* Separate values for Intra/Inter */
John Koleszar's avatar
John Koleszar committed
369 370 371 372 373

    double rate_correction_factor;
    double key_frame_rate_correction_factor;
    double gf_rate_correction_factor;

374
    unsigned int frames_since_golden;
John Koleszar's avatar
John Koleszar committed
375 376 377 378 379 380 381 382
    /* Count down till next GF */
    int frames_till_gf_update_due;

    /* GF interval chosen when we coded the last GF */
    int current_gf_interval;

    /* Total bits overspent becasue of GF boost (cumulative) */
    int gf_overspend_bits;
John Koleszar's avatar
John Koleszar committed
383

John Koleszar's avatar
John Koleszar committed
384 385 386 387
    /* Used in the few frames following a GF to recover the extra bits
     * spent in that GF
     */
    int non_gf_bitrate_adjustment;
John Koleszar's avatar
John Koleszar committed
388

John Koleszar's avatar
John Koleszar committed
389 390
    /* Extra bits spent on key frames that need to be recovered */
    int kf_overspend_bits;
John Koleszar's avatar
John Koleszar committed
391

John Koleszar's avatar
John Koleszar committed
392 393
    /* Current number of bit s to try and recover on each inter frame. */
    int kf_bitrate_adjustment;
John Koleszar's avatar
John Koleszar committed
394 395
    int max_gf_interval;
    int baseline_gf_interval;
John Koleszar's avatar
John Koleszar committed
396
    int active_arnr_frames;
John Koleszar's avatar
John Koleszar committed
397

398
    int64_t key_frame_count;
John Koleszar's avatar
John Koleszar committed
399
    int prior_key_frame_distance[KEY_FRAME_CONTEXT];
John Koleszar's avatar
John Koleszar committed
400 401 402 403 404 405
    /* Current section per frame bandwidth target */
    int per_frame_bandwidth;
    /* Average frame size target for clip */
    int av_per_frame_bandwidth;
    /* Minimum allocation that should be used for any frame */
    int min_frame_bandwidth;
John Koleszar's avatar
John Koleszar committed
406
    int inter_frame_target;
James Zern's avatar
James Zern committed
407
    double output_framerate;
408 409 410
    int64_t last_time_stamp_seen;
    int64_t last_end_time_stamp_seen;
    int64_t first_time_stamp_ever;
John Koleszar's avatar
John Koleszar committed
411 412 413 414 415 416

    int ni_av_qi;
    int ni_tot_qi;
    int ni_frames;
    int avg_frame_qindex;

417
    int64_t total_byte_count;
John Koleszar's avatar
John Koleszar committed
418 419 420

    int buffered_mode;

James Zern's avatar
James Zern committed
421 422
    double framerate;
    double ref_framerate;
423
    int64_t buffer_level;
424
    int64_t bits_off_target;
John Koleszar's avatar
John Koleszar committed
425 426 427 428 429 430 431

    int rolling_target_bits;
    int rolling_actual_bits;

    int long_rolling_target_bits;
    int long_rolling_actual_bits;

432
    int64_t total_actual_bits;
John Koleszar's avatar
John Koleszar committed
433
    int total_target_vs_actual; /* debug stats */
John Koleszar's avatar
John Koleszar committed
434 435 436 437 438 439

    int worst_quality;
    int active_worst_quality;
    int best_quality;
    int active_best_quality;

Paul Wilkins's avatar
CQ Mode  
Paul Wilkins committed
440
    int cq_target_quality;
441

John Koleszar's avatar
John Koleszar committed
442 443
    int drop_frames_allowed; /* Are we permitted to drop frames? */
    int drop_frame;          /* Drop this frame? */
John Koleszar's avatar
John Koleszar committed
444

445
    vp8_prob frame_coef_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
446 447
    char update_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];

448
    unsigned int frame_branch_ct [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES][2];
John Koleszar's avatar
John Koleszar committed
449 450 451 452 453 454 455

    int gfu_boost;
    int kf_boost;
    int last_boost;

    int target_bandwidth;
    struct vpx_codec_pkt_list  *output_pkt_list;
456

John Koleszar's avatar
John Koleszar committed
457
#if 0
John Koleszar's avatar
John Koleszar committed
458
    /* Experimental code for lagged and one pass */
John Koleszar's avatar
John Koleszar committed
459 460 461 462 463 464 465
    ONEPASS_FRAMESTATS one_pass_frame_stats[MAX_LAG_BUFFERS];
    int one_pass_frame_index;
#endif

    int decimation_factor;
    int decimation_count;

John Koleszar's avatar
John Koleszar committed
466 467 468
    /* for real time encoding */
    int avg_encode_time;     /* microsecond */
    int avg_pick_mode_time;  /* microsecond */
John Koleszar's avatar
John Koleszar committed
469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493
    int Speed;
    int compressor_speed;

    int auto_gold;
    int auto_adjust_gold_quantizer;
    int auto_worst_q;
    int cpu_used;
    int pass;


    int prob_intra_coded;
    int prob_last_coded;
    int prob_gf_coded;
    int prob_skip_false;
    int last_skip_false_probs[3];
    int last_skip_probs_q[3];
    int recent_ref_frame_usage[MAX_REF_FRAMES];

    int this_frame_percent_intra;
    int last_frame_percent_intra;

    int ref_frame_flags;

    SPEED_FEATURES sf;

494 495 496
    /* Count ZEROMV on all reference frames. */
    int zeromv_count;
    int lf_zeromv_pct;
John Koleszar's avatar
John Koleszar committed
497 498

    unsigned char *segmentation_map;
John Koleszar's avatar
John Koleszar committed
499 500
    signed char segment_feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
    int  segment_encode_breakout[MAX_MB_SEGMENTS];
John Koleszar's avatar
John Koleszar committed
501 502 503

    unsigned char *active_map;
    unsigned int active_map_enabled;
John Koleszar's avatar
John Koleszar committed
504 505 506 507 508

    /* Video conferencing cyclic refresh mode flags. This is a mode
     * designed to clean up the background over time in live encoding
     * scenarious. It uses segmentation.
     */
John Koleszar's avatar
John Koleszar committed
509 510 511 512 513
    int cyclic_refresh_mode_enabled;
    int cyclic_refresh_mode_max_mbs_perframe;
    int cyclic_refresh_mode_index;
    int cyclic_refresh_q;
    signed char *cyclic_refresh_map;
514 515
    // Count on how many (consecutive) times a macroblock uses ZER0MV_LAST.
    unsigned char *consec_zero_last;
Marco's avatar
Marco committed
516 517 518
    // Counter that is reset when a block is checked for a mode-bias against
    // ZEROMV_LASTREF.
    unsigned char *consec_zero_last_mvbias;
John Koleszar's avatar
John Koleszar committed
519

520 521 522
    // Frame counter for the temporal pattern. Counter is rest when the temporal
    // layers are changed dynamically (run-time change).
    unsigned int temporal_pattern_counter;
Marco's avatar
Marco committed
523 524 525 526 527
    // Temporal layer id.
    int temporal_layer_id;

    // Measure of average squared difference between source and denoised signal.
    int mse_source_denoised;
528

529
#if CONFIG_MULTITHREAD
John Koleszar's avatar
John Koleszar committed
530
    /* multithread data */
Attila Nagy's avatar
Attila Nagy committed
531 532
    int * mt_current_mb_col;
    int mt_sync_range;
John Koleszar's avatar
John Koleszar committed
533 534
    int b_multi_threaded;
    int encoding_thread_count;
535
    int b_lpf_running;
John Koleszar's avatar
John Koleszar committed
536 537

    pthread_t *h_encoding_thread;
538 539
    pthread_t h_filter_thread;

John Koleszar's avatar
John Koleszar committed
540 541
    MB_ROW_COMP *mb_row_ei;
    ENCODETHREAD_DATA *en_thread_data;
542
    LPFTHREAD_DATA lpf_thread_data;
John Koleszar's avatar
John Koleszar committed
543

John Koleszar's avatar
John Koleszar committed
544
    /* events */
Attila Nagy's avatar
Attila Nagy committed
545 546
    sem_t *h_event_start_encoding;
    sem_t h_event_end_encoding;
547 548
    sem_t h_event_start_lpf;
    sem_t h_event_end_lpf;
John Koleszar's avatar
John Koleszar committed
549 550 551
#endif

    TOKENLIST *tplist;
552
    unsigned int partition_sz[MAX_PARTITIONS];
553 554
    unsigned char *partition_d[MAX_PARTITIONS];
    unsigned char *partition_d_end[MAX_PARTITIONS];
John Koleszar's avatar
John Koleszar committed
555 556 557 558


    fractional_mv_step_fp *find_fractional_mv_step;
    vp8_full_search_fn_t full_search_sad;
559
    vp8_refining_search_fn_t refining_search_sad;
John Koleszar's avatar
John Koleszar committed
560
    vp8_diamond_search_fn_t diamond_search_sad;
561
    vp8_variance_fn_ptr_t fn_ptr[BLOCK_MAX_SEGMENTS];
562 563 564 565
    uint64_t time_receive_data;
    uint64_t time_compress_data;
    uint64_t time_pick_lpf;
    uint64_t time_encode_mb_row;
John Koleszar's avatar
John Koleszar committed
566 567 568

    int base_skip_false_prob[128];

569 570 571 572 573
    FRAME_CONTEXT lfc_n; /* last frame entropy */
    FRAME_CONTEXT lfc_a; /* last alt ref entropy */
    FRAME_CONTEXT lfc_g; /* last gold ref entropy */


574 575 576 577 578 579
    struct twopass_rc
    {
        unsigned int section_intra_rating;
        double section_max_qfactor;
        unsigned int next_iiratio;
        unsigned int this_iiratio;
580 581
        FIRSTPASS_STATS total_stats;
        FIRSTPASS_STATS this_frame_stats;
582
        FIRSTPASS_STATS *stats_in, *stats_in_end, *stats_in_start;
583
        FIRSTPASS_STATS total_left_stats;
584
        int first_pass_done;
585 586
        int64_t bits_left;
        int64_t clip_bits_total;
587 588 589 590 591 592 593 594 595 596 597 598
        double avg_iiratio;
        double modified_error_total;
        double modified_error_used;
        double modified_error_left;
        double kf_intra_err_min;
        double gf_intra_err_min;
        int frames_to_key;
        int maxq_max_limit;
        int maxq_min_limit;
        int gf_decay_rate;
        int static_scene_max_gf_interval;
        int kf_bits;
John Koleszar's avatar
John Koleszar committed
599 600 601
        /* Remaining error from uncoded frames in a gf group. */
        int gf_group_error_left;
        /* Projected total bits available for a key frame group of frames */
602
        int64_t kf_group_bits;
John Koleszar's avatar
John Koleszar committed
603
        /* Error score of frames still to be coded in kf group */
604
        int64_t kf_group_error_left;
John Koleszar's avatar
John Koleszar committed
605
        /* Projected Bits available for a group including 1 GF or ARF */
James Zern's avatar
James Zern committed
606
        int64_t gf_group_bits;
John Koleszar's avatar
John Koleszar committed
607 608
        /* Bits for the golden frame or ARF */
        int gf_bits;
609
        int alt_extra_bits;
610 611
        double est_max_qcorrection_factor;
    } twopass;
John Koleszar's avatar
John Koleszar committed
612 613

#if VP8_TEMPORAL_ALT_REF
John Koleszar's avatar
John Koleszar committed
614
    YV12_BUFFER_CONFIG alt_ref_buffer;
615 616
    YV12_BUFFER_CONFIG *frames[MAX_LAG_BUFFERS];
    int fixed_divide[512];
John Koleszar's avatar
John Koleszar committed
617 618
#endif

619
#if CONFIG_INTERNAL_STATS
John Koleszar's avatar
John Koleszar committed
620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644
    int    count;
    double total_y;
    double total_u;
    double total_v;
    double total ;
    double total_sq_error;
    double totalp_y;
    double totalp_u;
    double totalp_v;
    double totalp;
    double total_sq_error2;
    int    bytes;
    double summed_quality;
    double summed_weights;
    unsigned int tot_recode_hits;


    double total_ssimg_y;
    double total_ssimg_u;
    double total_ssimg_v;
    double total_ssimg_all;

    int b_calculate_ssimg;
#endif
    int b_calculate_psnr;
645

John Koleszar's avatar
John Koleszar committed
646
    /* Per MB activity measurement */
647 648
    unsigned int activity_avg;
    unsigned int * mb_activity_map;
649

John Koleszar's avatar
John Koleszar committed
650 651 652
    /* Record of which MBs still refer to last golden frame either
     * directly or through 0,0
     */
653
    unsigned char *gf_active_flags;
654 655
    int gf_active_count;

656 657
    int output_partition;

John Koleszar's avatar
John Koleszar committed
658
    /* Store last frame's MV info for next frame MV prediction */
659 660 661
    int_mv *lfmv;
    int *lf_ref_frame_sign_bias;
    int *lf_ref_frame;
662

John Koleszar's avatar
John Koleszar committed
663 664
    /* force next frame to intra when kf_auto says so */
    int force_next_frame_intra;
665

John Koleszar's avatar
John Koleszar committed
666
    int droppable;
667

668 669 670 671
#if CONFIG_TEMPORAL_DENOISING
    VP8_DENOISER denoiser;
#endif

John Koleszar's avatar
John Koleszar committed
672
    /* Coding layer state variables */
673
    unsigned int current_layer;
674 675 676 677 678 679 680 681 682 683 684 685 686 687 688
    LAYER_CONTEXT layer_context[VPX_TS_MAX_LAYERS];

    int64_t frames_in_layer[VPX_TS_MAX_LAYERS];
    int64_t bytes_in_layer[VPX_TS_MAX_LAYERS];
    double sum_psnr[VPX_TS_MAX_LAYERS];
    double sum_psnr_p[VPX_TS_MAX_LAYERS];
    double total_error2[VPX_TS_MAX_LAYERS];
    double total_error2_p[VPX_TS_MAX_LAYERS];
    double sum_ssim[VPX_TS_MAX_LAYERS];
    double sum_weights[VPX_TS_MAX_LAYERS];

    double total_ssimg_y_in_layer[VPX_TS_MAX_LAYERS];
    double total_ssimg_u_in_layer[VPX_TS_MAX_LAYERS];
    double total_ssimg_v_in_layer[VPX_TS_MAX_LAYERS];
    double total_ssimg_all_in_layer[VPX_TS_MAX_LAYERS];
689

Yunqing Wang's avatar
Yunqing Wang committed
690 691 692
#if CONFIG_MULTI_RES_ENCODING
    /* Number of MBs per row at lower-resolution level */
    int    mr_low_res_mb_cols;
693 694
    /* Indicate if lower-res mv info is available */
    unsigned char  mr_low_res_mv_avail;
695
#endif
696 697
    /* The frame number of each reference frames */
    unsigned int current_ref_frames[MAX_REF_FRAMES];
Marco's avatar
Marco committed
698
    // Closest reference frame to current frame.
699
    MV_REFERENCE_FRAME closest_reference_frame;
Yunqing Wang's avatar
Yunqing Wang committed
700

701 702 703 704 705 706 707 708 709 710 711
    struct rd_costs_struct
    {
        int mvcosts[2][MVvals+1];
        int mvsadcosts[2][MVfpvals+1];
        int mbmode_cost[2][MB_MODE_COUNT];
        int intra_uv_mode_cost[2][MB_MODE_COUNT];
        int bmode_costs[10][10][10];
        int inter_bmode_costs[B_MODE_COUNT];
        int token_costs[BLOCK_TYPES][COEF_BANDS]
        [PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS];
    } rd_costs;
John Koleszar's avatar
John Koleszar committed
712 713
} VP8_COMP;

Scott LaVarnway's avatar
Scott LaVarnway committed
714 715
void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest,
                        unsigned char *dest_end, unsigned long *size);
John Koleszar's avatar
John Koleszar committed
716

717
void vp8_tokenize_mb(VP8_COMP *, MACROBLOCK *, TOKENEXTRA **);
John Koleszar's avatar
John Koleszar committed
718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736

void vp8_set_speed_features(VP8_COMP *cpi);

#if CONFIG_DEBUG
#define CHECK_MEM_ERROR(lval,expr) do {\
        lval = (expr); \
        if(!lval) \
            vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,\
                               "Failed to allocate "#lval" at %s:%d", \
                               __FILE__,__LINE__);\
    } while(0)
#else
#define CHECK_MEM_ERROR(lval,expr) do {\
        lval = (expr); \
        if(!lval) \
            vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,\
                               "Failed to allocate "#lval);\
    } while(0)
#endif
737 738 739 740
#ifdef __cplusplus
}  // extern "C"
#endif

741
#endif  // VP8_ENCODER_ONYX_INT_H_