/* * 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