1*fb1b10abSAndroid Build Coastguard Worker /* 2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2020 The WebM project authors. All Rights Reserved. 3*fb1b10abSAndroid Build Coastguard Worker * 4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*fb1b10abSAndroid Build Coastguard Worker */ 10*fb1b10abSAndroid Build Coastguard Worker 11*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_VP9_RATECTRL_RTC_H_ 12*fb1b10abSAndroid Build Coastguard Worker #define VPX_VP9_RATECTRL_RTC_H_ 13*fb1b10abSAndroid Build Coastguard Worker 14*fb1b10abSAndroid Build Coastguard Worker #include <cstdint> 15*fb1b10abSAndroid Build Coastguard Worker #include <cstring> 16*fb1b10abSAndroid Build Coastguard Worker #include <limits> 17*fb1b10abSAndroid Build Coastguard Worker #include <memory> 18*fb1b10abSAndroid Build Coastguard Worker 19*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_encoder.h" 20*fb1b10abSAndroid Build Coastguard Worker #include "vpx/internal/vpx_ratectrl_rtc.h" 21*fb1b10abSAndroid Build Coastguard Worker 22*fb1b10abSAndroid Build Coastguard Worker struct VP9_COMP; 23*fb1b10abSAndroid Build Coastguard Worker 24*fb1b10abSAndroid Build Coastguard Worker namespace libvpx { 25*fb1b10abSAndroid Build Coastguard Worker struct VP9RateControlRtcConfig : public VpxRateControlRtcConfig { VP9RateControlRtcConfigVP9RateControlRtcConfig26*fb1b10abSAndroid Build Coastguard Worker VP9RateControlRtcConfig() { 27*fb1b10abSAndroid Build Coastguard Worker memset(layer_target_bitrate, 0, sizeof(layer_target_bitrate)); 28*fb1b10abSAndroid Build Coastguard Worker memset(ts_rate_decimator, 0, sizeof(ts_rate_decimator)); 29*fb1b10abSAndroid Build Coastguard Worker scaling_factor_num[0] = 1; 30*fb1b10abSAndroid Build Coastguard Worker scaling_factor_den[0] = 1; 31*fb1b10abSAndroid Build Coastguard Worker max_quantizers[0] = max_quantizer; 32*fb1b10abSAndroid Build Coastguard Worker min_quantizers[0] = min_quantizer; 33*fb1b10abSAndroid Build Coastguard Worker } 34*fb1b10abSAndroid Build Coastguard Worker 35*fb1b10abSAndroid Build Coastguard Worker // Number of spatial layers 36*fb1b10abSAndroid Build Coastguard Worker int ss_number_layers = 1; 37*fb1b10abSAndroid Build Coastguard Worker int max_quantizers[VPX_MAX_LAYERS] = {}; 38*fb1b10abSAndroid Build Coastguard Worker int min_quantizers[VPX_MAX_LAYERS] = {}; 39*fb1b10abSAndroid Build Coastguard Worker int scaling_factor_num[VPX_SS_MAX_LAYERS] = {}; 40*fb1b10abSAndroid Build Coastguard Worker int scaling_factor_den[VPX_SS_MAX_LAYERS] = {}; 41*fb1b10abSAndroid Build Coastguard Worker // This is only for SVC for now. 42*fb1b10abSAndroid Build Coastguard Worker int max_consec_drop = std::numeric_limits<int>::max(); 43*fb1b10abSAndroid Build Coastguard Worker }; 44*fb1b10abSAndroid Build Coastguard Worker 45*fb1b10abSAndroid Build Coastguard Worker struct VP9FrameParamsQpRTC { 46*fb1b10abSAndroid Build Coastguard Worker RcFrameType frame_type; 47*fb1b10abSAndroid Build Coastguard Worker int spatial_layer_id; 48*fb1b10abSAndroid Build Coastguard Worker int temporal_layer_id; 49*fb1b10abSAndroid Build Coastguard Worker }; 50*fb1b10abSAndroid Build Coastguard Worker 51*fb1b10abSAndroid Build Coastguard Worker struct VP9SegmentationData { 52*fb1b10abSAndroid Build Coastguard Worker const uint8_t *segmentation_map; 53*fb1b10abSAndroid Build Coastguard Worker size_t segmentation_map_size; 54*fb1b10abSAndroid Build Coastguard Worker const int *delta_q; 55*fb1b10abSAndroid Build Coastguard Worker size_t delta_q_size; 56*fb1b10abSAndroid Build Coastguard Worker }; 57*fb1b10abSAndroid Build Coastguard Worker 58*fb1b10abSAndroid Build Coastguard Worker // This interface allows using VP9 real-time rate control without initializing 59*fb1b10abSAndroid Build Coastguard Worker // the encoder. To use this interface, you need to link with libvpxrc.a. 60*fb1b10abSAndroid Build Coastguard Worker // 61*fb1b10abSAndroid Build Coastguard Worker // #include "vp9/ratectrl_rtc.h" 62*fb1b10abSAndroid Build Coastguard Worker // VP9RateControlRtcConfig cfg; 63*fb1b10abSAndroid Build Coastguard Worker // VP9FrameParamsQpRTC frame_params; 64*fb1b10abSAndroid Build Coastguard Worker // 65*fb1b10abSAndroid Build Coastguard Worker // YourFunctionToInitializeConfig(cfg); 66*fb1b10abSAndroid Build Coastguard Worker // std::unique_ptr<VP9RateControlRTC> rc_api = VP9RateControlRTC::Create(cfg); 67*fb1b10abSAndroid Build Coastguard Worker // // start encoding 68*fb1b10abSAndroid Build Coastguard Worker // while (frame_to_encode) { 69*fb1b10abSAndroid Build Coastguard Worker // if (config_changed) 70*fb1b10abSAndroid Build Coastguard Worker // rc_api->UpdateRateControl(cfg); 71*fb1b10abSAndroid Build Coastguard Worker // YourFunctionToFillFrameParams(frame_params); 72*fb1b10abSAndroid Build Coastguard Worker // rc_api->ComputeQP(frame_params); 73*fb1b10abSAndroid Build Coastguard Worker // YourFunctionToUseQP(rc_api->GetQP()); 74*fb1b10abSAndroid Build Coastguard Worker // YourFunctionToUseLoopfilter(rc_api->GetLoopfilterLevel()); 75*fb1b10abSAndroid Build Coastguard Worker // // After encoding 76*fb1b10abSAndroid Build Coastguard Worker // rc_api->PostEncode(encoded_frame_size, frame_params); 77*fb1b10abSAndroid Build Coastguard Worker // } 78*fb1b10abSAndroid Build Coastguard Worker class VP9RateControlRTC { 79*fb1b10abSAndroid Build Coastguard Worker public: 80*fb1b10abSAndroid Build Coastguard Worker static std::unique_ptr<VP9RateControlRTC> Create( 81*fb1b10abSAndroid Build Coastguard Worker const VP9RateControlRtcConfig &cfg); 82*fb1b10abSAndroid Build Coastguard Worker ~VP9RateControlRTC(); 83*fb1b10abSAndroid Build Coastguard Worker 84*fb1b10abSAndroid Build Coastguard Worker bool UpdateRateControl(const VP9RateControlRtcConfig &rc_cfg); 85*fb1b10abSAndroid Build Coastguard Worker // GetQP() needs to be called after ComputeQP() to get the latest QP 86*fb1b10abSAndroid Build Coastguard Worker int GetQP() const; 87*fb1b10abSAndroid Build Coastguard Worker int GetLoopfilterLevel() const; 88*fb1b10abSAndroid Build Coastguard Worker bool GetSegmentationData(VP9SegmentationData *segmentation_data) const; 89*fb1b10abSAndroid Build Coastguard Worker // ComputeQP computes the QP if the frame is not dropped (kOk return), 90*fb1b10abSAndroid Build Coastguard Worker // otherwise it returns kDrop and subsequent GetQP and PostEncodeUpdate 91*fb1b10abSAndroid Build Coastguard Worker // are not to be called (vp9_rc_postencode_update_drop_frame is already 92*fb1b10abSAndroid Build Coastguard Worker // called via ComputeQP if drop is decided). 93*fb1b10abSAndroid Build Coastguard Worker FrameDropDecision ComputeQP(const VP9FrameParamsQpRTC &frame_params); 94*fb1b10abSAndroid Build Coastguard Worker // Feedback to rate control with the size of current encoded frame 95*fb1b10abSAndroid Build Coastguard Worker void PostEncodeUpdate(uint64_t encoded_frame_size, 96*fb1b10abSAndroid Build Coastguard Worker const VP9FrameParamsQpRTC &frame_params); 97*fb1b10abSAndroid Build Coastguard Worker 98*fb1b10abSAndroid Build Coastguard Worker private: 99*fb1b10abSAndroid Build Coastguard Worker VP9RateControlRTC() = default; 100*fb1b10abSAndroid Build Coastguard Worker bool InitRateControl(const VP9RateControlRtcConfig &cfg); 101*fb1b10abSAndroid Build Coastguard Worker struct VP9_COMP *cpi_ = nullptr; 102*fb1b10abSAndroid Build Coastguard Worker }; 103*fb1b10abSAndroid Build Coastguard Worker 104*fb1b10abSAndroid Build Coastguard Worker } // namespace libvpx 105*fb1b10abSAndroid Build Coastguard Worker 106*fb1b10abSAndroid Build Coastguard Worker #endif // VPX_VP9_RATECTRL_RTC_H_ 107