| /* |
| * Copyright (c) 2001-2017, Alliance for Open Media. All rights reserved |
| * |
| * This source code is subject to the terms of the BSD 2 Clause License and |
| * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License |
| * was not distributed with this source code in the LICENSE file, you can |
| * obtain it at www.aomedia.org/license/software. If the Alliance for Open |
| * Media Patent License 1.0 was not distributed with this source code in the |
| * PATENTS file, you can obtain it at www.aomedia.org/license/patent. |
| */ |
| |
| #if !defined(_ratectrl_xiph_H) |
| #define _ratectrl_xiph_H (1) |
| |
| #include "av1/encoder/ratectrl.h" |
| #include "aom/internal/aom_codec_internal.h" |
| |
| /*Frame types.*/ |
| #define OD_I_FRAME (0) |
| #define OD_P_FRAME (1) |
| #define OD_GOLDEN_P_FRAME (2) |
| #define OD_ALTREF_P_FRAME (3) |
| |
| #define OD_FRAME_NSUBTYPES (OD_ALTREF_P_FRAME + 1) |
| |
| /* Periodic boost (in between golden frames) strength - lower is more */ |
| #define OD_PERIODIC_BOOST_DIV (10) |
| |
| /* Constants for frame QP modulation <- tweak these |
| * Adjusts how the rate control system decides the quantizers per frame |
| * (sub)type */ |
| #define OD_MQP_I (0.98) |
| #define OD_MQP_P (1.06) |
| #define OD_MQP_GP (0.99) |
| #define OD_MQP_AP (0.92) |
| #define OD_DQP_I (-2) |
| #define OD_DQP_P (0) |
| #define OD_DQP_GP (-2) |
| #define OD_DQP_AP (-2) |
| |
| /*Fractional_coded_quantizer ~= |
| log2(quantizer / (1 << OD_COEFF_SHIFT))*6.307 + 6.235*/ |
| /*Base/scale factor for linear quantizer to fractional coded quantizer |
| conversion (6.307 * 2^12) */ |
| #define OD_LOG_QUANTIZER_BASE_Q12 (0x0064EB) |
| /*Inverse of above scale factor.*/ |
| #define OD_LOG_QUANTIZER_EXP_Q12 (0x000289) |
| /*Offset for linear quantizer to fractional coded quantizer |
| conversion (6.235 * 2^45) */ |
| #define OD_LOG_QUANTIZER_OFFSET_Q45 (0x0000C7851EB851ECLL) |
| |
| #define OD_RC_2PASS_MAGIC (0x53015641) /* [A, V, 1, S] in little endian */ |
| #define OD_RC_2PASS_SUMMARY_SZ (4 + 1 + (4 + 4 + 8) * OD_FRAME_NSUBTYPES) |
| #define OD_RC_2PASS_PACKET_SZ (1 + 4) |
| #define OD_RC_2PASS_MIN (OD_RC_2PASS_PACKET_SZ + OD_RC_2PASS_SUMMARY_SZ) |
| #define OD_RC_2PASS_VERSION (1) |
| |
| /*A 2nd order low-pass Bessel follower. |
| We use this for rate control because it has fast reaction time, but is |
| critically damped.*/ |
| typedef struct od_iir_bessel2 { |
| int32_t c[2]; |
| int64_t g; |
| int32_t x[2]; |
| int32_t y[2]; |
| } od_iir_bessel2; |
| |
| /* The 2-pass metrics associated with a single frame. */ |
| typedef struct od_frame_metrics { |
| /*The log base 2 of the scale factor for this frame in Q24 format.*/ |
| int64_t log_scale; |
| /*The frame type from pass 1.*/ |
| unsigned frame_type : 1; |
| } od_frame_metrics; |
| |
| /*Rate control setup and working state information.*/ |
| typedef struct od_rc_state { |
| /* Image format */ |
| int frame_width; |
| int frame_height; |
| int bit_depth; |
| |
| /* Framerate */ |
| double framerate; |
| /* Keyframe rate */ |
| int keyframe_rate; |
| /* Golden frame period */ |
| int goldenframe_rate; |
| /* Altref frame period */ |
| int altref_rate; |
| /*The target bit-rate in bits per second.*/ |
| int64_t target_bitrate; |
| /* Quality level for non-bitrate-targeting */ |
| int quality; |
| /* Copied from oxcf->frame_periodic_boost */ |
| int periodic_boosts; |
| /* Max Q */ |
| int maxq; |
| /* Min Q */ |
| int minq; |
| /* Quantizer to use for the first pass */ |
| int firstpass_quant; |
| |
| /* 2-pass metrics */ |
| od_frame_metrics cur_metrics; |
| |
| /* 2-pass state */ |
| int64_t scale_sum[OD_FRAME_NSUBTYPES]; |
| int nframes[OD_FRAME_NSUBTYPES]; |
| |
| /* 2-pass bytestream reader/writer context */ |
| uint8_t *twopass_buffer; |
| int twopass_buffer_bytes; |
| |
| /* Pass 1 stats packet storage */ |
| uint8_t firstpass_buffer[OD_RC_2PASS_SUMMARY_SZ]; |
| |
| /* Every state packet from the first pass in a single buffer */ |
| uint8_t *twopass_allframes_buf; |
| size_t twopass_allframes_buf_size; |
| |
| /* Actual returned quantizer */ |
| int target_quantizer; |
| /*The full-precision, unmodulated quantizer upon which |
| our modulated quantizers are based.*/ |
| int base_quantizer; |
| |
| /* Increments by 1 for each frame. */ |
| int64_t cur_frame; |
| |
| /* End of input flag */ |
| int end_of_input; |
| /* Closed GOP flag */ |
| int closed_gop; |
| /*The number of frames over which to distribute the reservoir usage.*/ |
| int reservoir_frame_delay; |
| /*Will we drop frames to meet bitrate target?*/ |
| unsigned char drop_frames; |
| /*Do we respect the maximum reservoir fullness?*/ |
| unsigned char cap_overflow; |
| /*Can the reservoir go negative?*/ |
| unsigned char cap_underflow; |
| /*Two-pass mode state. |
| 0 => 1-pass encoding. |
| 1 => 1st pass of 2-pass encoding. |
| 2 => 2nd pass of 2-pass encoding.*/ |
| int twopass_state; |
| /*The log of the number of pixels in a frame in Q57 format.*/ |
| int64_t log_npixels; |
| /*The target average bits per frame.*/ |
| int64_t bits_per_frame; |
| /*The current bit reservoir fullness (bits available to be used).*/ |
| int64_t reservoir_fullness; |
| /*The target buffer fullness. |
| This is where we'd like to be by the last keyframe the appears in the next |
| buf_delay frames.*/ |
| int64_t reservoir_target; |
| /*The maximum buffer fullness (total size of the buffer).*/ |
| int64_t reservoir_max; |
| /*The log of estimated scale factor for the rate model in Q57 format.*/ |
| int64_t log_scale[OD_FRAME_NSUBTYPES]; |
| /*The exponent used in the rate model in Q8 format.*/ |
| unsigned exp[OD_FRAME_NSUBTYPES]; |
| /*The log of an estimated scale factor used to obtain the real framerate, for |
| VFR sources or, e.g., 12 fps content doubled to 24 fps, etc.*/ |
| int64_t log_drop_scale[OD_FRAME_NSUBTYPES]; |
| /*The total drop count from the previous frame.*/ |
| uint32_t prev_drop_count[OD_FRAME_NSUBTYPES]; |
| /*Second-order lowpass filters to track scale and VFR/drops.*/ |
| od_iir_bessel2 scalefilter[OD_FRAME_NSUBTYPES]; |
| od_iir_bessel2 vfrfilter[OD_FRAME_NSUBTYPES]; |
| int frame_count[OD_FRAME_NSUBTYPES]; |
| int inter_p_delay; |
| int inter_delay_target; |
| /*The total accumulated estimation bias.*/ |
| int64_t rate_bias; |
| } od_rc_state; |
| |
| int od_enc_rc_init(od_rc_state *rc, int64_t bitrate, int delay_ms); |
| |
| int od_enc_rc_select_quantizers_and_lambdas(od_rc_state *rc, |
| int is_golden_frame, |
| int is_altref_frame, int frame_type, |
| int *bottom_idx, int *top_idx); |
| |
| /* Returns 1 if the frame should be dropped */ |
| int od_enc_rc_update_state(od_rc_state *rc, int64_t bits, int is_golden_frame, |
| int is_altref_frame, int frame_type, int droppable); |
| |
| int od_frame_type(od_rc_state *rc, int64_t coding_frame_count, int *is_golden, |
| int *is_altref, int64_t *ip_count); |
| |
| int od_enc_rc_resize(od_rc_state *rc); |
| |
| int od_enc_rc_2pass_out(od_rc_state *rc, struct aom_codec_pkt_list *pkt_list, |
| int summary); |
| |
| int od_enc_rc_2pass_in(od_rc_state *rc); |
| |
| #endif |