#include <limits.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "./vpx_config.h"
#include "vpx/vpx_encoder.h"
#include "vpx/vpx_ext_ratectrl.h"
#include "vpx_dsp/psnr.h"
#include "vpx_ports/static_assert.h"
#include "vpx_ports/system_state.h"
#include "vpx_util/vpx_timestamp.h"
#include "vpx/internal/vpx_codec_internal.h"
#include "./vpx_version.h"
#include "vp9/encoder/vp9_encoder.h"
#include "vp9/encoder/vp9_ethread.h"
#include "vpx/vp8cx.h"
#include "vp9/common/vp9_alloccommon.h"
#include "vp9/common/vp9_scale.h"
#include "vp9/vp9_cx_iface.h"
#include "vp9/encoder/vp9_firstpass.h"
#include "vp9/encoder/vp9_lookahead.h"
#include "vp9/vp9_cx_iface.h"
#include "vp9/vp9_iface_common.h"
#include "vpx/vpx_tpl.h"
vp9_extracfg;
static struct vp9_extracfg default_extra_cfg = …;
struct vpx_codec_alg_priv { … };
static vpx_codec_err_t update_error_state(
vpx_codec_alg_priv_t *ctx, const struct vpx_internal_error_info *error) { … }
#undef ERROR
#define ERROR(str) …
#define RANGE_CHECK(p, memb, lo, hi) …
#define RANGE_CHECK_HI(p, memb, hi) …
#define RANGE_CHECK_LO(p, memb, lo) …
#define RANGE_CHECK_BOOL(p, memb) …
static vpx_codec_err_t validate_config(vpx_codec_alg_priv_t *ctx,
const vpx_codec_enc_cfg_t *cfg,
const struct vp9_extracfg *extra_cfg) { … }
static vpx_codec_err_t validate_img(vpx_codec_alg_priv_t *ctx,
const vpx_image_t *img) { … }
static int get_image_bps(const vpx_image_t *img) { … }
static void config_target_level(VP9EncoderConfig *oxcf) { … }
static vpx_rational64_t get_g_timebase_in_ts(vpx_rational_t g_timebase) { … }
static vpx_codec_err_t set_encoder_config(
VP9EncoderConfig *oxcf, vpx_codec_enc_cfg_t *cfg,
const struct vp9_extracfg *extra_cfg) { … }
static vpx_codec_err_t set_twopass_params_from_config(
const vpx_codec_enc_cfg_t *const cfg, struct VP9_COMP *cpi) { … }
static vpx_codec_err_t encoder_set_config(vpx_codec_alg_priv_t *ctx,
const vpx_codec_enc_cfg_t *cfg) { … }
static vpx_codec_err_t ctrl_get_quantizer(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_get_quantizer64(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_get_quantizer_svc_layers(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_get_loopfilter_level(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t update_extra_cfg(vpx_codec_alg_priv_t *ctx,
const struct vp9_extracfg *extra_cfg) { … }
static vpx_codec_err_t ctrl_set_cpuused(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_enable_auto_alt_ref(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_noise_sensitivity(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_sharpness(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_static_thresh(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_tile_columns(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_tile_rows(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_tpl_model(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_keyframe_filtering(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_arnr_max_frames(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_arnr_strength(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_arnr_type(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_tuning(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_cq_level(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_rc_max_intra_bitrate_pct(
vpx_codec_alg_priv_t *ctx, va_list args) { … }
static vpx_codec_err_t ctrl_set_rc_max_inter_bitrate_pct(
vpx_codec_alg_priv_t *ctx, va_list args) { … }
static vpx_codec_err_t ctrl_set_rc_gf_cbr_boost_pct(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_lossless(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_frame_parallel_decoding_mode(
vpx_codec_alg_priv_t *ctx, va_list args) { … }
static vpx_codec_err_t ctrl_set_aq_mode(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_alt_ref_aq(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_min_gf_interval(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_max_gf_interval(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_frame_periodic_boost(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_target_level(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_row_mt(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_rtc_external_ratectrl(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_enable_motion_vector_unit_test(
vpx_codec_alg_priv_t *ctx, va_list args) { … }
static vpx_codec_err_t ctrl_get_level(vpx_codec_alg_priv_t *ctx, va_list args) { … }
static vpx_codec_err_t encoder_init(vpx_codec_ctx_t *ctx,
vpx_codec_priv_enc_mr_cfg_t *data) { … }
static vpx_codec_err_t encoder_destroy(vpx_codec_alg_priv_t *ctx) { … }
static vpx_codec_err_t pick_quickcompress_mode(vpx_codec_alg_priv_t *ctx,
unsigned long duration,
vpx_enc_deadline_t deadline) { … }
static int write_superframe_index(vpx_codec_alg_priv_t *ctx) { … }
static vpx_codec_frame_flags_t get_frame_pkt_flags(const VP9_COMP *cpi,
unsigned int lib_flags) { … }
static INLINE vpx_codec_cx_pkt_t get_psnr_pkt(const PSNR_STATS *psnr) { … }
#if !CONFIG_REALTIME_ONLY
static INLINE vpx_codec_cx_pkt_t
get_first_pass_stats_pkt(FIRSTPASS_STATS *stats) {
vpx_codec_cx_pkt_t pkt;
pkt.kind = VPX_CODEC_STATS_PKT;
pkt.data.twopass_stats.buf = stats;
pkt.data.twopass_stats.sz = sizeof(*stats);
return pkt;
}
#endif
const size_t kMinCompressedSize = …;
static vpx_codec_err_t encoder_encode(vpx_codec_alg_priv_t *ctx,
const vpx_image_t *img,
vpx_codec_pts_t pts_val,
unsigned long duration,
vpx_enc_frame_flags_t enc_flags,
vpx_enc_deadline_t deadline) { … }
static const vpx_codec_cx_pkt_t *encoder_get_cxdata(vpx_codec_alg_priv_t *ctx,
vpx_codec_iter_t *iter) { … }
static vpx_codec_err_t ctrl_set_reference(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_copy_reference(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_get_reference(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_previewpp(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_fixed_buf_t *encoder_get_global_headers(vpx_codec_alg_priv_t *ctx) { … }
static vpx_image_t *encoder_get_preview(vpx_codec_alg_priv_t *ctx) { … }
static vpx_codec_err_t ctrl_set_roi_map(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_active_map(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_get_active_map(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_scale_mode(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_svc(vpx_codec_alg_priv_t *ctx, va_list args) { … }
static vpx_codec_err_t ctrl_set_svc_layer_id(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_get_svc_layer_id(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_svc_parameters(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_get_svc_ref_frame_config(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_svc_ref_frame_config(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_svc_inter_layer_pred(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_svc_frame_drop_layer(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_svc_gf_temporal_ref(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_svc_spatial_layer_sync(
vpx_codec_alg_priv_t *ctx, va_list args) { … }
static vpx_codec_err_t ctrl_set_delta_q_uv(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_register_cx_callback(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_tune_content(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_color_space(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_color_range(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_render_size(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_postencode_drop(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_disable_overshoot_maxq_cbr(
vpx_codec_alg_priv_t *ctx, va_list args) { … }
static vpx_codec_err_t ctrl_set_disable_loopfilter(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_external_rate_control(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_err_t ctrl_set_quantizer_one_pass(vpx_codec_alg_priv_t *ctx,
va_list args) { … }
static vpx_codec_ctrl_fn_map_t encoder_ctrl_maps[] = …;
static vpx_codec_enc_cfg_map_t encoder_usage_cfg_map[] = …;
#ifndef VERSION_STRING
#define VERSION_STRING
#endif
CODEC_INTERFACE(vpx_codec_vp9_cx) = …;
static vpx_codec_enc_cfg_t get_enc_cfg(int frame_width, int frame_height,
vpx_rational_t frame_rate,
int target_bitrate,
vpx_enc_pass enc_pass) { … }
static vp9_extracfg get_extra_cfg(void) { … }
VP9EncoderConfig vp9_get_encoder_config(int frame_width, int frame_height,
vpx_rational_t frame_rate,
int target_bitrate, int encode_speed,
int target_level,
vpx_enc_pass enc_pass) { … }
#define DUMP_STRUCT_VALUE(fp, structure, value) …
void vp9_dump_encoder_config(const VP9EncoderConfig *oxcf, FILE *fp) { … }
FRAME_INFO vp9_get_frame_info(const VP9EncoderConfig *oxcf) { … }
void vp9_set_first_pass_stats(VP9EncoderConfig *oxcf,
const vpx_fixed_buf_t *stats) { … }