libaom AV1 encoder wrapper cleanup.
Bug: none Change-Id: Ia62ab4653a1c95e7a609d767d76f7e7c64c0e751 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/236843 Commit-Queue: Philip Eliasson <philipel@webrtc.org> Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/main@{#35292}
This commit is contained in:
@ -618,7 +618,7 @@ int32_t LibaomAv1Encoder::Encode(
|
|||||||
|
|
||||||
const size_t num_spatial_layers =
|
const size_t num_spatial_layers =
|
||||||
svc_params_ ? svc_params_->number_spatial_layers : 1;
|
svc_params_ ? svc_params_->number_spatial_layers : 1;
|
||||||
size_t next_layer_frame_index = 0;
|
auto next_layer_frame = layer_frames.begin();
|
||||||
for (size_t i = 0; i < num_spatial_layers; ++i) {
|
for (size_t i = 0; i < num_spatial_layers; ++i) {
|
||||||
// The libaom AV1 encoder requires that `aom_codec_encode` is called for
|
// The libaom AV1 encoder requires that `aom_codec_encode` is called for
|
||||||
// every spatial layer, even if the configured bitrate for that layer is
|
// every spatial layer, even if the configured bitrate for that layer is
|
||||||
@ -626,17 +626,16 @@ int32_t LibaomAv1Encoder::Encode(
|
|||||||
absl::optional<ScalableVideoController::LayerFrameConfig>
|
absl::optional<ScalableVideoController::LayerFrameConfig>
|
||||||
non_encoded_layer_frame;
|
non_encoded_layer_frame;
|
||||||
ScalableVideoController::LayerFrameConfig* layer_frame;
|
ScalableVideoController::LayerFrameConfig* layer_frame;
|
||||||
if (next_layer_frame_index < layer_frames.size() &&
|
if (next_layer_frame != layer_frames.end() &&
|
||||||
layer_frames[next_layer_frame_index].SpatialId() ==
|
next_layer_frame->SpatialId() == static_cast<int>(i)) {
|
||||||
static_cast<int>(i)) {
|
layer_frame = &*next_layer_frame;
|
||||||
layer_frame = &layer_frames[next_layer_frame_index];
|
++next_layer_frame;
|
||||||
next_layer_frame_index++;
|
|
||||||
} else {
|
} else {
|
||||||
// For layers that are not encoded only the spatial id matters.
|
// For layers that are not encoded only the spatial id matters.
|
||||||
non_encoded_layer_frame.emplace().S(i);
|
non_encoded_layer_frame.emplace().S(i);
|
||||||
layer_frame = &*non_encoded_layer_frame;
|
layer_frame = &*non_encoded_layer_frame;
|
||||||
}
|
}
|
||||||
const bool end_of_picture = (next_layer_frame_index == layer_frames.size());
|
const bool end_of_picture = (next_layer_frame == layer_frames.end());
|
||||||
|
|
||||||
aom_enc_frame_flags_t flags =
|
aom_enc_frame_flags_t flags =
|
||||||
layer_frame->IsKeyframe() ? AOM_EFLAG_FORCE_KF : 0;
|
layer_frame->IsKeyframe() ? AOM_EFLAG_FORCE_KF : 0;
|
||||||
@ -727,7 +726,7 @@ int32_t LibaomAv1Encoder::Encode(
|
|||||||
codec_specific_info.end_of_picture = end_of_picture;
|
codec_specific_info.end_of_picture = end_of_picture;
|
||||||
bool is_keyframe = layer_frame->IsKeyframe();
|
bool is_keyframe = layer_frame->IsKeyframe();
|
||||||
codec_specific_info.generic_frame_info =
|
codec_specific_info.generic_frame_info =
|
||||||
svc_controller_->OnEncodeDone(std::move(*layer_frame));
|
svc_controller_->OnEncodeDone(*layer_frame);
|
||||||
if (is_keyframe && codec_specific_info.generic_frame_info) {
|
if (is_keyframe && codec_specific_info.generic_frame_info) {
|
||||||
codec_specific_info.template_structure =
|
codec_specific_info.template_structure =
|
||||||
svc_controller_->DependencyStructure();
|
svc_controller_->DependencyStructure();
|
||||||
@ -768,9 +767,16 @@ void LibaomAv1Encoder::SetRates(const RateControlParameters& parameters) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The bitrates caluclated internally in libaom when `AV1E_SET_SVC_PARAMS` is
|
||||||
|
// called depends on the currently configured `rc_target_bitrate`. If the
|
||||||
|
// total target bitrate is not updated first a division by zero could happen.
|
||||||
svc_controller_->OnRatesUpdated(parameters.bitrate);
|
svc_controller_->OnRatesUpdated(parameters.bitrate);
|
||||||
cfg_.rc_target_bitrate = parameters.bitrate.get_sum_kbps();
|
cfg_.rc_target_bitrate = parameters.bitrate.get_sum_kbps();
|
||||||
aom_codec_err_t error_code = aom_codec_enc_config_set(&ctx_, &cfg_);
|
aom_codec_err_t error_code = aom_codec_enc_config_set(&ctx_, &cfg_);
|
||||||
|
if (error_code != AOM_CODEC_OK) {
|
||||||
|
RTC_LOG(LS_WARNING) << "Error configuring encoder, error code: "
|
||||||
|
<< error_code;
|
||||||
|
}
|
||||||
|
|
||||||
if (SvcEnabled()) {
|
if (SvcEnabled()) {
|
||||||
for (int sid = 0; sid < svc_params_->number_spatial_layers; ++sid) {
|
for (int sid = 0; sid < svc_params_->number_spatial_layers; ++sid) {
|
||||||
@ -793,10 +799,6 @@ void LibaomAv1Encoder::SetRates(const RateControlParameters& parameters) {
|
|||||||
// Set frame rate to closest integer value.
|
// Set frame rate to closest integer value.
|
||||||
encoder_settings_.maxFramerate =
|
encoder_settings_.maxFramerate =
|
||||||
static_cast<uint32_t>(parameters.framerate_fps + 0.5);
|
static_cast<uint32_t>(parameters.framerate_fps + 0.5);
|
||||||
if (error_code != AOM_CODEC_OK) {
|
|
||||||
RTC_LOG(LS_WARNING) << "Error configuring encoder, error code: "
|
|
||||||
<< error_code;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VideoEncoder::EncoderInfo LibaomAv1Encoder::GetEncoderInfo() const {
|
VideoEncoder::EncoderInfo LibaomAv1Encoder::GetEncoderInfo() const {
|
||||||
|
|||||||
Reference in New Issue
Block a user