From: angiebird Date: Tue, 29 Oct 2019 19:13:41 +0000 (-0700) Subject: Add vp9_get_encoder_config / vp9_get_frame_info X-Git-Tag: v1.8.2~60^2~5 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=90a65c2064c20728ee689381628221036b56491f;p=libvpx Add vp9_get_encoder_config / vp9_get_frame_info Change-Id: Id5c8b2d69a36d218ec04cd504868ce0efebf6b69 --- diff --git a/vp9/common/vp9_alloccommon.c b/vp9/common/vp9_alloccommon.c index 7345e259b..5702dca71 100644 --- a/vp9/common/vp9_alloccommon.c +++ b/vp9/common/vp9_alloccommon.c @@ -17,17 +17,26 @@ #include "vp9/common/vp9_entropymv.h" #include "vp9/common/vp9_onyxc_int.h" -void vp9_set_mb_mi(VP9_COMMON *cm, int width, int height) { +void vp9_set_mi_size(int *mi_rows, int *mi_cols, int *mi_stride, int width, + int height) { const int aligned_width = ALIGN_POWER_OF_TWO(width, MI_SIZE_LOG2); const int aligned_height = ALIGN_POWER_OF_TWO(height, MI_SIZE_LOG2); + *mi_cols = aligned_width >> MI_SIZE_LOG2; + *mi_rows = aligned_height >> MI_SIZE_LOG2; + *mi_stride = calc_mi_size(*mi_cols); +} - cm->mi_cols = aligned_width >> MI_SIZE_LOG2; - cm->mi_rows = aligned_height >> MI_SIZE_LOG2; - cm->mi_stride = calc_mi_size(cm->mi_cols); +void vp9_set_mb_size(int *mb_rows, int *mb_cols, int *mb_num, int mi_rows, + int mi_cols) { + *mb_cols = (mi_cols + 1) >> 1; + *mb_rows = (mi_rows + 1) >> 1; + *mb_num = (*mb_rows) * (*mb_cols); +} - cm->mb_cols = (cm->mi_cols + 1) >> 1; - cm->mb_rows = (cm->mi_rows + 1) >> 1; - cm->MBs = cm->mb_rows * cm->mb_cols; +void vp9_set_mb_mi(VP9_COMMON *cm, int width, int height) { + vp9_set_mi_size(&cm->mi_rows, &cm->mi_cols, &cm->mi_stride, width, height); + vp9_set_mb_size(&cm->mb_rows, &cm->mb_cols, &cm->MBs, cm->mi_rows, + cm->mi_cols); } static int alloc_seg_map(VP9_COMMON *cm, int seg_map_size) { diff --git a/vp9/common/vp9_alloccommon.h b/vp9/common/vp9_alloccommon.h index 8900038ea..90cbb093d 100644 --- a/vp9/common/vp9_alloccommon.h +++ b/vp9/common/vp9_alloccommon.h @@ -33,6 +33,11 @@ void vp9_free_postproc_buffers(struct VP9Common *cm); int vp9_alloc_state_buffers(struct VP9Common *cm, int width, int height); void vp9_free_state_buffers(struct VP9Common *cm); +void vp9_set_mi_size(int *mi_rows, int *mi_cols, int *mi_stride, int width, + int height); +void vp9_set_mb_size(int *mb_rows, int *mb_cols, int *mb_num, int mi_rows, + int mi_cols); + void vp9_set_mb_mi(struct VP9Common *cm, int width, int height); void vp9_swap_current_and_last_seg_map(struct VP9Common *cm); diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index 970e7dbeb..d091a79b8 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -80,6 +80,7 @@ #include "vp9/encoder/vp9_speed_features.h" #include "vp9/encoder/vp9_svc_layercontext.h" #include "vp9/encoder/vp9_temporal_filter.h" +#include "vp9/vp9_cx_iface.h" #define AM_SEGMENT_ID_INACTIVE 7 #define AM_SEGMENT_ID_ACTIVE 0 @@ -2196,7 +2197,7 @@ VP9_COMP *vp9_create_compressor(VP9EncoderConfig *oxcf, cpi->force_update_segmentation = 0; init_config(cpi, oxcf); - init_frame_info(&cpi->frame_info, cm); + cpi->frame_info = vp9_get_frame_info(oxcf); vp9_rc_init(&cpi->oxcf, oxcf->pass, &cpi->rc); diff --git a/vp9/vp9_cx_iface.c b/vp9/vp9_cx_iface.c index 1842f2da4..d1cf5e7a3 100644 --- a/vp9/vp9_cx_iface.c +++ b/vp9/vp9_cx_iface.c @@ -20,10 +20,12 @@ #include "./vpx_version.h" #include "vp9/encoder/vp9_encoder.h" #include "vpx/vp8cx.h" +#include "vp9/common/vp9_alloccommon.h" #include "vp9/encoder/vp9_firstpass.h" +#include "vp9/vp9_cx_iface.h" #include "vp9/vp9_iface_common.h" -struct vp9_extracfg { +typedef struct vp9_extracfg { int cpu_used; // available cpu percentage in 1/16 unsigned int enable_auto_alt_ref; unsigned int noise_sensitivity; @@ -55,7 +57,7 @@ struct vp9_extracfg { int render_height; unsigned int row_mt; unsigned int motion_vector_unit_test; -}; +} vp9_extracfg; static struct vp9_extracfg default_extra_cfg = { 0, // cpu_used @@ -1765,7 +1767,7 @@ static vpx_codec_enc_cfg_map_t encoder_usage_cfg_map[] = { VPX_VBR, // rc_end_usage { NULL, 0 }, // rc_twopass_stats_in { NULL, 0 }, // rc_firstpass_mb_stats_in - 256, // rc_target_bandwidth + 256, // rc_target_bitrate 0, // rc_min_quantizer 63, // rc_max_quantizer 25, // rc_undershoot_pct @@ -1831,3 +1833,54 @@ CODEC_INTERFACE(vpx_codec_vp9_cx) = { NULL // vpx_codec_enc_mr_get_mem_loc_fn_t } }; + +static vpx_codec_enc_cfg_t get_enc_cfg(int frame_width, int frame_height, + int target_bitrate, + vpx_enc_pass enc_pass) { + vpx_codec_enc_cfg_t enc_cfg = encoder_usage_cfg_map[0].cfg; + enc_cfg.g_w = frame_width; + enc_cfg.g_h = frame_height; + enc_cfg.rc_target_bitrate = target_bitrate; + enc_cfg.g_pass = enc_pass; + // Use the same default setting as the one used in vpxenc.c + // The default unit time for the encoder is 1/1000 s. + enc_cfg.g_timebase.num = 1; + enc_cfg.g_timebase.den = 1000; + return enc_cfg; +} + +static vp9_extracfg get_extra_cfg() { + vp9_extracfg extra_cfg = default_extra_cfg; + // TODO(angiebird) figure out whether we can modify default_extra_cfg + // directly. + extra_cfg.tile_columns = 0; + extra_cfg.frame_parallel_decoding_mode = 0; + return extra_cfg; +} + +VP9EncoderConfig vp9_get_encoder_config(int frame_width, int frame_height, + int target_bitrate, + vpx_enc_pass enc_pass) { + VP9EncoderConfig oxcf; + vp9_extracfg extra_cfg = get_extra_cfg(); + vpx_codec_enc_cfg_t enc_cfg = + get_enc_cfg(frame_width, frame_height, target_bitrate, enc_pass); + set_encoder_config(&oxcf, &enc_cfg, &extra_cfg); + return oxcf; +} + +FRAME_INFO vp9_get_frame_info(const VP9EncoderConfig *oxcf) { + FRAME_INFO frame_info; + int dummy; + frame_info.frame_width = oxcf->width; + frame_info.frame_height = oxcf->height; + frame_info.render_frame_width = oxcf->width; + frame_info.render_frame_height = oxcf->height; + frame_info.bit_depth = oxcf->bit_depth; + vp9_set_mi_size(&frame_info.mi_rows, &frame_info.mi_cols, &dummy, + frame_info.frame_width, frame_info.frame_height); + vp9_set_mb_size(&frame_info.mb_rows, &frame_info.mb_cols, &frame_info.num_mbs, + frame_info.mi_rows, frame_info.mi_cols); + // TODO(angiebird): Figure out how to get subsampling_x/y here + return frame_info; +} diff --git a/vp9/vp9_cx_iface.h b/vp9/vp9_cx_iface.h new file mode 100644 index 000000000..74c6ff331 --- /dev/null +++ b/vp9/vp9_cx_iface.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2019 The WebM project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef VPX_VP9_VP9_CX_IFACE_H_ +#define VPX_VP9_VP9_CX_IFACE_H_ +#include "vp9/encoder/vp9_encoder.h" +#include "vp9/common/vp9_onyxc_int.h" + +#ifdef __cplusplus +extern "C" { +#endif + +VP9EncoderConfig vp9_get_encoder_config(int frame_width, int frame_height, + int target_bitrate, + vpx_enc_pass enc_pass); +FRAME_INFO vp9_get_frame_info(const VP9EncoderConfig *oxcf); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // VPX_VP9_VP9_CX_IFACE_H_ diff --git a/vp9/vp9cx.mk b/vp9/vp9cx.mk index 829ab888c..666f22882 100644 --- a/vp9/vp9cx.mk +++ b/vp9/vp9cx.mk @@ -16,6 +16,7 @@ VP9_CX_SRCS_REMOVE-yes += $(VP9_COMMON_SRCS_REMOVE-yes) VP9_CX_SRCS_REMOVE-no += $(VP9_COMMON_SRCS_REMOVE-no) VP9_CX_SRCS-yes += vp9_cx_iface.c +VP9_CX_SRCS-yes += vp9_cx_iface.h VP9_CX_SRCS-yes += encoder/vp9_bitstream.c VP9_CX_SRCS-yes += encoder/vp9_context_tree.c diff --git a/vpx/vpx_encoder.h b/vpx/vpx_encoder.h index c18de703f..0cd077688 100644 --- a/vpx/vpx_encoder.h +++ b/vpx/vpx_encoder.h @@ -221,11 +221,11 @@ typedef struct vpx_rational { } vpx_rational_t; /**< alias for struct vpx_rational */ /*!\brief Multi-pass Encoding Pass */ -enum vpx_enc_pass { +typedef enum vpx_enc_pass { VPX_RC_ONE_PASS, /**< Single pass mode */ VPX_RC_FIRST_PASS, /**< First pass of multi-pass mode */ VPX_RC_LAST_PASS /**< Final pass of multi-pass mode */ -}; +} vpx_enc_pass; /*!\brief Rate control mode */ enum vpx_rc_mode {