2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
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.
11 #ifndef VP9_ENCODER_VP9_ENCODER_H_
12 #define VP9_ENCODER_VP9_ENCODER_H_
16 #include "./vpx_config.h"
17 #include "vpx/internal/vpx_codec_internal.h"
18 #include "vpx/vp8cx.h"
19 #include "vpx_util/vpx_thread.h"
21 #include "vp9/common/vp9_alloccommon.h"
22 #include "vp9/common/vp9_ppflags.h"
23 #include "vp9/common/vp9_entropymode.h"
24 #include "vp9/common/vp9_thread_common.h"
25 #include "vp9/common/vp9_onyxc_int.h"
27 #include "vp9/encoder/vp9_aq_cyclicrefresh.h"
28 #include "vp9/encoder/vp9_context_tree.h"
29 #include "vp9/encoder/vp9_encodemb.h"
30 #include "vp9/encoder/vp9_firstpass.h"
31 #include "vp9/encoder/vp9_lookahead.h"
32 #include "vp9/encoder/vp9_mbgraph.h"
33 #include "vp9/encoder/vp9_mcomp.h"
34 #include "vp9/encoder/vp9_quantize.h"
35 #include "vp9/encoder/vp9_ratectrl.h"
36 #include "vp9/encoder/vp9_rd.h"
37 #if CONFIG_INTERNAL_STATS
38 #include "vp9/encoder/vp9_ssim.h"
40 #include "vp9/encoder/vp9_speed_features.h"
41 #include "vp9/encoder/vp9_svc_layercontext.h"
42 #include "vp9/encoder/vp9_tokenize.h"
43 #include "vpx_dsp/variance.h"
45 #if CONFIG_VP9_TEMPORAL_DENOISING
46 #include "vp9/encoder/vp9_denoiser.h"
54 int nmvjointcost
[MV_JOINTS
];
55 int nmvcosts
[2][MV_VALS
];
56 int nmvcosts_hp
[2][MV_VALS
];
58 vp9_prob segment_pred_probs
[PREDICTION_PROBS
];
60 unsigned char *last_frame_seg_map_copy
;
62 // 0 = Intra, Last, GF, ARF
63 signed char last_ref_lf_deltas
[MAX_REF_LF_DELTAS
];
65 signed char last_mode_lf_deltas
[MAX_MODE_LF_DELTAS
];
72 // encode_breakout is disabled.
73 ENCODE_BREAKOUT_DISABLED
= 0,
74 // encode_breakout is enabled.
75 ENCODE_BREAKOUT_ENABLED
= 1,
76 // encode_breakout is enabled with small max_thresh limit.
77 ENCODE_BREAKOUT_LIMITED
= 2
78 } ENCODE_BREAKOUT_TYPE
;
88 // Good Quality Fast Encoding. The encoder balances quality with the amount of
89 // time it takes to encode the output. Speed setting controls how fast.
92 // The encoder places priority on the quality of the output over encoding
93 // speed. The output is compressed at the highest possible quality. This
94 // option takes the longest amount of time to encode. Speed setting ignored.
97 // Realtime/Live Encoding. This mode is optimized for realtime encoding (for
98 // example, capturing a television signal or feed from a live camera). Speed
99 // setting controls how fast.
104 FRAMEFLAGS_KEY
= 1 << 0,
105 FRAMEFLAGS_GOLDEN
= 1 << 1,
106 FRAMEFLAGS_ALTREF
= 1 << 2,
113 CYCLIC_REFRESH_AQ
= 3,
114 AQ_MODE_COUNT
// This should always be the last member of the enum
118 RESIZE_NONE
= 0, // No frame resizing allowed (except for SVC).
119 RESIZE_FIXED
= 1, // All frames are coded at the specified dimension.
120 RESIZE_DYNAMIC
= 2 // Coded size of each frame is determined by the codec.
123 typedef struct VP9EncoderConfig
{
124 BITSTREAM_PROFILE profile
;
125 vpx_bit_depth_t bit_depth
; // Codec bit-depth.
126 int width
; // width of data passed to the compressor
127 int height
; // height of data passed to the compressor
128 unsigned int input_bit_depth
; // Input bit depth.
129 double init_framerate
; // set to passed in framerate
130 int64_t target_bandwidth
; // bandwidth to be used in kilobits per second
132 int noise_sensitivity
; // pre processing blur: recommendation 0
133 int sharpness
; // sharpening output: recommendation 0:
135 // maximum allowed bitrate for any intra frame in % of bitrate target.
136 unsigned int rc_max_intra_bitrate_pct
;
137 // maximum allowed bitrate for any inter frame in % of bitrate target.
138 unsigned int rc_max_inter_bitrate_pct
;
139 // percent of rate boost for golden frame in CBR mode.
140 unsigned int gf_cbr_boost_pct
;
145 // Key Framing Operations
146 int auto_key
; // autodetect cut scenes and set the keyframes
147 int key_freq
; // maximum distance to key frame.
149 int lag_in_frames
; // how many frames lag before we start encoding
151 // ----------------------------------------------------------------
152 // DATARATE CONTROL OPTIONS
154 // vbr, cbr, constrained quality or constant quality
155 enum vpx_rc_mode rc_mode
;
157 // buffer targeting aggressiveness
161 // buffering parameters
162 int64_t starting_buffer_level_ms
;
163 int64_t optimal_buffer_level_ms
;
164 int64_t maximum_buffer_size_ms
;
166 // Frame drop threshold.
167 int drop_frames_water_mark
;
169 // controlling quality
174 AQ_MODE aq_mode
; // Adaptive Quantization mode
176 // Internal frame size scaling.
177 RESIZE_TYPE resize_mode
;
178 int scaled_frame_width
;
179 int scaled_frame_height
;
181 // Enable feature to reduce the frame quantization every x frames.
182 int frame_periodic_boost
;
184 // two pass datarate control
185 int two_pass_vbrbias
; // two pass datarate control tweaks
186 int two_pass_vbrmin_section
;
187 int two_pass_vbrmax_section
;
188 // END DATARATE CONTROL OPTIONS
189 // ----------------------------------------------------------------
191 // Spatial and temporal scalability.
192 int ss_number_layers
; // Number of spatial layers.
193 int ts_number_layers
; // Number of temporal layers.
194 // Bitrate allocation for spatial layers.
195 int layer_target_bitrate
[VPX_MAX_LAYERS
];
196 int ss_target_bitrate
[VPX_SS_MAX_LAYERS
];
197 int ss_enable_auto_arf
[VPX_SS_MAX_LAYERS
];
198 // Bitrate allocation (CBR mode) and framerate factor, for temporal layers.
199 int ts_rate_decimator
[VPX_TS_MAX_LAYERS
];
203 int encode_breakout
; // early breakout : for video conf recommend 800
205 /* Bitfield defining the error resiliency features to enable.
206 * Can provide decodable frames after losses in previous
207 * frames and decodable partitions after losses in the same frame.
209 unsigned int error_resilient_mode
;
211 /* Bitfield defining the parallel decoding mode where the
212 * decoding in successive frames may be conducted in parallel
213 * just by decoding the frame headers.
215 unsigned int frame_parallel_decoding_mode
;
228 vpx_fixed_buf_t two_pass_stats_in
;
229 struct vpx_codec_pkt_list
*output_pkt_list
;
231 #if CONFIG_FP_MB_STATS
232 vpx_fixed_buf_t firstpass_mb_stats_in
;
236 vp9e_tune_content content
;
237 #if CONFIG_VP9_HIGHBITDEPTH
238 int use_highbitdepth
;
240 vpx_color_space_t color_space
;
241 VP9E_TEMPORAL_LAYERING_MODE temporal_layering_mode
;
244 static INLINE
int is_lossless_requested(const VP9EncoderConfig
*cfg
) {
245 return cfg
->best_allowed_q
== 0 && cfg
->worst_allowed_q
== 0;
248 // TODO(jingning) All spatially adaptive variables should go to TileDataEnc.
249 typedef struct TileDataEnc
{
251 int thresh_freq_fact
[BLOCK_SIZES
][MAX_MODES
];
252 int mode_map
[BLOCK_SIZES
][MAX_MODES
];
255 typedef struct RD_COUNTS
{
256 vp9_coeff_count coef_counts
[TX_SIZES
][PLANE_TYPES
];
257 int64_t comp_pred_diff
[REFERENCE_MODES
];
258 int64_t tx_select_diff
[TX_MODES
];
259 int64_t filter_diff
[SWITCHABLE_FILTER_CONTEXTS
];
262 typedef struct ThreadData
{
265 FRAME_COUNTS
*counts
;
267 PICK_MODE_CONTEXT
*leaf_tree
;
272 struct EncWorkerData
;
274 typedef struct ActiveMap
{
287 typedef struct IMAGE_STAT
{
292 typedef struct VP9_COMP
{
295 MB_MODE_INFO_EXT
*mbmi_ext_base
;
296 DECLARE_ALIGNED(16, int16_t, y_dequant
[QINDEX_RANGE
][8]);
297 DECLARE_ALIGNED(16, int16_t, uv_dequant
[QINDEX_RANGE
][8]);
299 VP9EncoderConfig oxcf
;
300 struct lookahead_ctx
*lookahead
;
301 struct lookahead_entry
*alt_ref_source
;
303 YV12_BUFFER_CONFIG
*Source
;
304 YV12_BUFFER_CONFIG
*Last_Source
; // NULL for first frame and alt_ref frames
305 YV12_BUFFER_CONFIG
*un_scaled_source
;
306 YV12_BUFFER_CONFIG scaled_source
;
307 YV12_BUFFER_CONFIG
*unscaled_last_source
;
308 YV12_BUFFER_CONFIG scaled_last_source
;
310 TileDataEnc
*tile_data
;
311 int allocated_tiles
; // Keep track of memory allocated for tiles.
313 // For a still frame, this flag is set to 1 to skip partition search.
314 int partition_search_skippable_frame
;
316 int scaled_ref_idx
[MAX_REF_FRAMES
];
321 int refresh_last_frame
;
322 int refresh_golden_frame
;
323 int refresh_alt_ref_frame
;
325 int ext_refresh_frame_flags_pending
;
326 int ext_refresh_last_frame
;
327 int ext_refresh_golden_frame
;
328 int ext_refresh_alt_ref_frame
;
330 int ext_refresh_frame_context_pending
;
331 int ext_refresh_frame_context
;
333 YV12_BUFFER_CONFIG last_frame_uf
;
335 TOKENEXTRA
*tile_tok
[4][1 << 6];
336 unsigned int tok_count
[4][1 << 6];
338 // Ambient reconstruction err target for force key frames
343 CODING_CONTEXT coding_context
;
348 int *nmvsadcosts_hp
[2];
350 int64_t last_time_stamp_seen
;
351 int64_t last_end_time_stamp_seen
;
352 int64_t first_time_stamp_ever
;
357 int interp_filter_selected
[MAX_REF_FRAMES
][SWITCHABLE
];
359 struct vpx_codec_pkt_list
*output_pkt_list
;
361 MBGRAPH_FRAME_STATS mbgraph_stats
[MAX_LAG_BUFFERS
];
362 int mbgraph_n_frames
; // number of frames filled in the above
363 int static_mb_pct
; // % forced skip mbs by segmentation
368 unsigned int max_mv_magnitude
;
371 int allow_comp_inter_inter
;
373 // Default value is 1. From first pass stats, encode_breakout may be disabled.
374 ENCODE_BREAKOUT_TYPE allow_encode_breakout
;
376 // Get threshold from external input. A suggested threshold is 800 for HD
377 // clips, and 300 for < HD clips.
380 unsigned char *segmentation_map
;
382 // segment threashold for encode breakout
383 int segment_encode_breakout
[MAX_SEGMENTS
];
385 CYCLIC_REFRESH
*cyclic_refresh
;
386 ActiveMap active_map
;
388 fractional_mv_step_fp
*find_fractional_mv_step
;
389 vp9_full_search_fn_t full_search_sad
;
390 vp9_diamond_search_fn_t diamond_search_sad
;
391 vp9_variance_fn_ptr_t fn_ptr
[BLOCK_SIZES
];
392 uint64_t time_receive_data
;
393 uint64_t time_compress_data
;
394 uint64_t time_pick_lpf
;
395 uint64_t time_encode_sb_row
;
397 #if CONFIG_FP_MB_STATS
403 YV12_BUFFER_CONFIG alt_ref_buffer
;
406 #if CONFIG_INTERNAL_STATS
407 unsigned int mode_chosen_counts
[MAX_MODES
];
410 uint64_t total_sq_error
;
411 uint64_t total_samples
;
414 uint64_t totalp_sq_error
;
415 uint64_t totalp_samples
;
418 double total_blockiness
;
419 double worst_blockiness
;
422 double summed_quality
;
423 double summed_weights
;
424 double summedp_quality
;
425 double summedp_weights
;
426 unsigned int tot_recode_hits
;
433 int b_calculate_ssimg
;
434 int b_calculate_blockiness
;
436 int b_calculate_consistency
;
438 double total_inconsistency
;
439 double worst_consistency
;
443 int b_calculate_psnr
;
449 int initial_mbs
; // Number of MBs in the full-size frame; to be used to
450 // normalize the firstpass stats. This will differ from the
451 // number of MBs in the current frame when the frame is
458 // Store frame variance info in SOURCE_VAR_BASED_PARTITION search type.
459 diff
*source_diff_var
;
460 // The threshold used in SOURCE_VAR_BASED_PARTITION search type.
461 unsigned int source_var_thresh
;
462 int frames_till_next_var_check
;
466 search_site_config ss_cfg
;
468 int mbmode_cost
[INTRA_MODES
];
469 unsigned int inter_mode_cost
[INTER_MODE_CONTEXTS
][INTER_MODES
];
470 int intra_uv_mode_cost
[FRAME_TYPES
][INTRA_MODES
];
471 int y_mode_costs
[INTRA_MODES
][INTRA_MODES
][INTRA_MODES
];
472 int switchable_interp_costs
[SWITCHABLE_FILTER_CONTEXTS
][SWITCHABLE_FILTERS
];
473 int partition_cost
[PARTITION_CONTEXTS
][PARTITION_TYPES
];
475 int multi_arf_allowed
;
476 int multi_arf_enabled
;
477 int multi_arf_last_grp_enabled
;
479 #if CONFIG_VP9_TEMPORAL_DENOISING
480 VP9_DENOISER denoiser
;
485 int resize_scale_num
;
486 int resize_scale_den
;
488 int resize_buffer_underflow
;
491 // VAR_BASED_PARTITION thresholds
492 // 0 - threshold_64x64; 1 - threshold_32x32;
493 // 2 - threshold_16x16; 3 - vbp_threshold_8x8;
494 int64_t vbp_thresholds
[4];
495 int64_t vbp_threshold_minmax
;
496 int64_t vbp_threshold_sad
;
497 BLOCK_SIZE vbp_bsize_min
;
502 struct EncWorkerData
*tile_thr_data
;
503 VP9LfSync lf_row_sync
;
506 void vp9_initialize_enc(void);
508 struct VP9_COMP
*vp9_create_compressor(VP9EncoderConfig
*oxcf
,
509 BufferPool
*const pool
);
510 void vp9_remove_compressor(VP9_COMP
*cpi
);
512 void vp9_change_config(VP9_COMP
*cpi
, const VP9EncoderConfig
*oxcf
);
514 // receive a frames worth of data. caller can assume that a copy of this
515 // frame is made and not just a copy of the pointer..
516 int vp9_receive_raw_frame(VP9_COMP
*cpi
, unsigned int frame_flags
,
517 YV12_BUFFER_CONFIG
*sd
, int64_t time_stamp
,
518 int64_t end_time_stamp
);
520 int vp9_get_compressed_data(VP9_COMP
*cpi
, unsigned int *frame_flags
,
521 size_t *size
, uint8_t *dest
,
522 int64_t *time_stamp
, int64_t *time_end
, int flush
);
524 int vp9_get_preview_raw_frame(VP9_COMP
*cpi
, YV12_BUFFER_CONFIG
*dest
,
525 vp9_ppflags_t
*flags
);
527 int vp9_use_as_reference(VP9_COMP
*cpi
, int ref_frame_flags
);
529 void vp9_update_reference(VP9_COMP
*cpi
, int ref_frame_flags
);
531 int vp9_copy_reference_enc(VP9_COMP
*cpi
, VP9_REFFRAME ref_frame_flag
,
532 YV12_BUFFER_CONFIG
*sd
);
534 int vp9_set_reference_enc(VP9_COMP
*cpi
, VP9_REFFRAME ref_frame_flag
,
535 YV12_BUFFER_CONFIG
*sd
);
537 int vp9_update_entropy(VP9_COMP
*cpi
, int update
);
539 int vp9_set_active_map(VP9_COMP
*cpi
, unsigned char *map
, int rows
, int cols
);
541 int vp9_get_active_map(VP9_COMP
*cpi
, unsigned char *map
, int rows
, int cols
);
543 int vp9_set_internal_size(VP9_COMP
*cpi
,
544 VPX_SCALING horiz_mode
, VPX_SCALING vert_mode
);
546 int vp9_set_size_literal(VP9_COMP
*cpi
, unsigned int width
,
547 unsigned int height
);
549 void vp9_set_svc(VP9_COMP
*cpi
, int use_svc
);
551 int vp9_get_quantizer(struct VP9_COMP
*cpi
);
553 static INLINE
int frame_is_kf_gf_arf(const VP9_COMP
*cpi
) {
554 return frame_is_intra_only(&cpi
->common
) ||
555 cpi
->refresh_alt_ref_frame
||
556 (cpi
->refresh_golden_frame
&& !cpi
->rc
.is_src_frame_alt_ref
);
559 static INLINE
int get_ref_frame_map_idx(const VP9_COMP
*cpi
,
560 MV_REFERENCE_FRAME ref_frame
) {
561 if (ref_frame
== LAST_FRAME
) {
562 return cpi
->lst_fb_idx
;
563 } else if (ref_frame
== GOLDEN_FRAME
) {
564 return cpi
->gld_fb_idx
;
566 return cpi
->alt_fb_idx
;
570 static INLINE
int get_ref_frame_buf_idx(const VP9_COMP
*const cpi
,
572 const VP9_COMMON
*const cm
= &cpi
->common
;
573 const int map_idx
= get_ref_frame_map_idx(cpi
, ref_frame
);
574 return (map_idx
!= INVALID_IDX
) ? cm
->ref_frame_map
[map_idx
] : INVALID_IDX
;
577 static INLINE YV12_BUFFER_CONFIG
*get_ref_frame_buffer(
578 VP9_COMP
*cpi
, MV_REFERENCE_FRAME ref_frame
) {
579 VP9_COMMON
*const cm
= &cpi
->common
;
580 const int buf_idx
= get_ref_frame_buf_idx(cpi
, ref_frame
);
582 buf_idx
!= INVALID_IDX
? &cm
->buffer_pool
->frame_bufs
[buf_idx
].buf
: NULL
;
585 static INLINE
int get_token_alloc(int mb_rows
, int mb_cols
) {
586 // TODO(JBB): double check we can't exceed this token count if we have a
587 // 32x32 transform crossing a boundary at a multiple of 16.
588 // mb_rows, cols are in units of 16 pixels. We assume 3 planes all at full
589 // resolution. We assume up to 1 token per pixel, and then allow
591 return mb_rows
* mb_cols
* (16 * 16 * 3 + 4);
594 // Get the allocated token size for a tile. It does the same calculation as in
595 // the frame token allocation.
596 static INLINE
int allocated_tokens(TileInfo tile
) {
597 int tile_mb_rows
= (tile
.mi_row_end
- tile
.mi_row_start
+ 1) >> 1;
598 int tile_mb_cols
= (tile
.mi_col_end
- tile
.mi_col_start
+ 1) >> 1;
600 return get_token_alloc(tile_mb_rows
, tile_mb_cols
);
603 int64_t vp9_get_y_sse(const YV12_BUFFER_CONFIG
*a
, const YV12_BUFFER_CONFIG
*b
);
604 #if CONFIG_VP9_HIGHBITDEPTH
605 int64_t vp9_highbd_get_y_sse(const YV12_BUFFER_CONFIG
*a
,
606 const YV12_BUFFER_CONFIG
*b
);
607 #endif // CONFIG_VP9_HIGHBITDEPTH
609 void vp9_alloc_compressor_data(VP9_COMP
*cpi
);
611 void vp9_scale_references(VP9_COMP
*cpi
);
613 void vp9_update_reference_frames(VP9_COMP
*cpi
);
615 void vp9_set_high_precision_mv(VP9_COMP
*cpi
, int allow_high_precision_mv
);
617 YV12_BUFFER_CONFIG
*vp9_scale_if_required(VP9_COMMON
*cm
,
618 YV12_BUFFER_CONFIG
*unscaled
,
619 YV12_BUFFER_CONFIG
*scaled
);
621 void vp9_apply_encoding_flags(VP9_COMP
*cpi
, vpx_enc_frame_flags_t flags
);
623 static INLINE
int is_two_pass_svc(const struct VP9_COMP
*const cpi
) {
624 return cpi
->use_svc
&& cpi
->oxcf
.pass
!= 0;
627 static INLINE
int is_one_pass_cbr_svc(const struct VP9_COMP
*const cpi
) {
628 return (cpi
->use_svc
&& cpi
->oxcf
.pass
== 0);
631 static INLINE
int is_altref_enabled(const VP9_COMP
*const cpi
) {
632 return cpi
->oxcf
.mode
!= REALTIME
&& cpi
->oxcf
.lag_in_frames
> 0 &&
633 (cpi
->oxcf
.enable_auto_arf
&&
634 (!is_two_pass_svc(cpi
) ||
635 cpi
->oxcf
.ss_enable_auto_arf
[cpi
->svc
.spatial_layer_id
]));
638 static INLINE
void set_ref_ptrs(VP9_COMMON
*cm
, MACROBLOCKD
*xd
,
639 MV_REFERENCE_FRAME ref0
,
640 MV_REFERENCE_FRAME ref1
) {
641 xd
->block_refs
[0] = &cm
->frame_refs
[ref0
>= LAST_FRAME
? ref0
- LAST_FRAME
643 xd
->block_refs
[1] = &cm
->frame_refs
[ref1
>= LAST_FRAME
? ref1
- LAST_FRAME
647 static INLINE
int get_chessboard_index(const int frame_index
) {
648 return frame_index
& 0x1;
651 static INLINE
int *cond_cost_list(const struct VP9_COMP
*cpi
, int *cost_list
) {
652 return cpi
->sf
.mv
.subpel_search_method
!= SUBPEL_TREE
? cost_list
: NULL
;
655 void vp9_new_framerate(VP9_COMP
*cpi
, double framerate
);
657 #define LAYER_IDS_TO_IDX(sl, tl, num_tl) ((sl) * (num_tl) + (tl))
663 #endif // VP9_ENCODER_VP9_ENCODER_H_