ref: 90a65c2064c20728ee689381628221036b56491f
parent: 65f9ded3951f4ae7bda634e308862d5fd3bea730
author: angiebird <angiebird@google.com>
date: Tue Oct 29 08:13:41 EDT 2019
Add vp9_get_encoder_config / vp9_get_frame_info Change-Id: Id5c8b2d69a36d218ec04cd504868ce0efebf6b69
--- 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) {
--- a/vp9/common/vp9_alloccommon.h
+++ b/vp9/common/vp9_alloccommon.h
@@ -33,6 +33,11 @@
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);
--- 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 @@
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);
--- 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 @@
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 @@
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 @@
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;
+}
--- /dev/null
+++ b/vp9/vp9_cx_iface.h
@@ -1,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_
--- a/vp9/vp9cx.mk
+++ b/vp9/vp9cx.mk
@@ -16,6 +16,7 @@
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
--- a/vpx/vpx_encoder.h
+++ b/vpx/vpx_encoder.h
@@ -221,11 +221,11 @@
} 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 {