Break VP8 temporal_layers dependency on libvpx.
This is in preparation for https://webrtc-review.googlesource.com/c/src/+/36340 With these changes we can avoid some strange #ifdefs in the code that uses temporal layers. Bug: webrtc:7925 Change-Id: I472210738ccc9f73812b8863951befeabec56f15 Reviewed-on: https://webrtc-review.googlesource.com/41280 Reviewed-by: Erik Språng <sprang@webrtc.org> Commit-Queue: Anders Carlsson <andersc@webrtc.org> Cr-Commit-Position: refs/heads/master@{#21759}
This commit is contained in:
committed by
Commit Bot
parent
a76ef9d0b4
commit
beabdcb498
@ -150,6 +150,55 @@ void GetPostProcParamsFromFieldTrialGroup(
|
||||
*deblock_params = params;
|
||||
}
|
||||
|
||||
static_assert(
|
||||
VP8_TS_MAX_PERIODICITY == VPX_TS_MAX_PERIODICITY,
|
||||
"VP8_TS_MAX_PERIODICITY must be kept in sync with the constant in libvpx.");
|
||||
static_assert(
|
||||
VP8_TS_MAX_LAYERS == VPX_TS_MAX_LAYERS,
|
||||
"VP8_TS_MAX_LAYERS must be kept in sync with the constant in libvpx.");
|
||||
|
||||
static Vp8EncoderConfig GetEncoderConfig(vpx_codec_enc_cfg* vpx_config) {
|
||||
Vp8EncoderConfig config;
|
||||
|
||||
config.ts_number_layers = vpx_config->ts_number_layers;
|
||||
memcpy(config.ts_target_bitrate, vpx_config->ts_target_bitrate,
|
||||
sizeof(unsigned int) * VP8_TS_MAX_LAYERS);
|
||||
memcpy(config.ts_rate_decimator, vpx_config->ts_rate_decimator,
|
||||
sizeof(unsigned int) * VP8_TS_MAX_LAYERS);
|
||||
config.ts_periodicity = vpx_config->ts_periodicity;
|
||||
memcpy(config.ts_layer_id, vpx_config->ts_layer_id,
|
||||
sizeof(unsigned int) * VP8_TS_MAX_PERIODICITY);
|
||||
config.rc_target_bitrate = vpx_config->rc_target_bitrate;
|
||||
config.rc_min_quantizer = vpx_config->rc_min_quantizer;
|
||||
config.rc_max_quantizer = vpx_config->rc_max_quantizer;
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
static void FillInEncoderConfig(vpx_codec_enc_cfg* vpx_config,
|
||||
const Vp8EncoderConfig& config) {
|
||||
vpx_config->ts_number_layers = config.ts_number_layers;
|
||||
memcpy(vpx_config->ts_target_bitrate, config.ts_target_bitrate,
|
||||
sizeof(unsigned int) * VP8_TS_MAX_LAYERS);
|
||||
memcpy(vpx_config->ts_rate_decimator, config.ts_rate_decimator,
|
||||
sizeof(unsigned int) * VP8_TS_MAX_LAYERS);
|
||||
vpx_config->ts_periodicity = config.ts_periodicity;
|
||||
memcpy(vpx_config->ts_layer_id, config.ts_layer_id,
|
||||
sizeof(unsigned int) * VP8_TS_MAX_PERIODICITY);
|
||||
vpx_config->rc_target_bitrate = config.rc_target_bitrate;
|
||||
vpx_config->rc_min_quantizer = config.rc_min_quantizer;
|
||||
vpx_config->rc_max_quantizer = config.rc_max_quantizer;
|
||||
}
|
||||
|
||||
bool UpdateVpxConfiguration(TemporalLayers* temporal_layers,
|
||||
vpx_codec_enc_cfg_t* cfg) {
|
||||
Vp8EncoderConfig config = GetEncoderConfig(cfg);
|
||||
const bool res = temporal_layers->UpdateConfiguration(&config);
|
||||
if (res)
|
||||
FillInEncoderConfig(cfg, config);
|
||||
return res;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
std::unique_ptr<VP8Encoder> VP8Encoder::Create() {
|
||||
@ -298,7 +347,9 @@ int VP8EncoderImpl::SetRateAllocation(const BitrateAllocation& bitrate,
|
||||
SetStreamState(send_stream, stream_idx);
|
||||
|
||||
configurations_[i].rc_target_bitrate = target_bitrate_kbps;
|
||||
temporal_layers_[stream_idx]->UpdateConfiguration(&configurations_[i]);
|
||||
|
||||
UpdateVpxConfiguration(temporal_layers_[stream_idx].get(),
|
||||
&configurations_[i]);
|
||||
|
||||
if (vpx_codec_enc_config_set(&encoders_[i], &configurations_[i])) {
|
||||
return WEBRTC_VIDEO_CODEC_ERROR;
|
||||
@ -530,7 +581,9 @@ int VP8EncoderImpl::InitEncode(const VideoCodec* inst,
|
||||
configurations_[0].rc_target_bitrate = stream_bitrates[stream_idx];
|
||||
temporal_layers_[stream_idx]->OnRatesUpdated(
|
||||
stream_bitrates[stream_idx], inst->maxBitrate, inst->maxFramerate);
|
||||
temporal_layers_[stream_idx]->UpdateConfiguration(&configurations_[0]);
|
||||
UpdateVpxConfiguration(temporal_layers_[stream_idx].get(),
|
||||
&configurations_[0]);
|
||||
|
||||
--stream_idx;
|
||||
for (size_t i = 1; i < encoders_.size(); ++i, --stream_idx) {
|
||||
memcpy(&configurations_[i], &configurations_[0],
|
||||
@ -552,7 +605,8 @@ int VP8EncoderImpl::InitEncode(const VideoCodec* inst,
|
||||
configurations_[i].rc_target_bitrate = stream_bitrates[stream_idx];
|
||||
temporal_layers_[stream_idx]->OnRatesUpdated(
|
||||
stream_bitrates[stream_idx], inst->maxBitrate, inst->maxFramerate);
|
||||
temporal_layers_[stream_idx]->UpdateConfiguration(&configurations_[i]);
|
||||
UpdateVpxConfiguration(temporal_layers_[stream_idx].get(),
|
||||
&configurations_[i]);
|
||||
}
|
||||
|
||||
return InitAndSetControlSettings();
|
||||
@ -797,7 +851,8 @@ int VP8EncoderImpl::Encode(const VideoFrame& frame,
|
||||
// the next update.
|
||||
vpx_codec_enc_cfg_t temp_config;
|
||||
memcpy(&temp_config, &configurations_[i], sizeof(vpx_codec_enc_cfg_t));
|
||||
if (temporal_layers_[stream_idx]->UpdateConfiguration(&temp_config)) {
|
||||
if (UpdateVpxConfiguration(temporal_layers_[stream_idx].get(),
|
||||
&temp_config)) {
|
||||
if (vpx_codec_enc_config_set(&encoders_[i], &temp_config))
|
||||
return WEBRTC_VIDEO_CODEC_ERROR;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user