Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(798)

Unified Diff: media/gpu/vt_video_encode_accelerator_mac.cc

Issue 2008583002: Fix BitrateAdjuster issues in VTVideoEncodeAccelerator (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2743
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/gpu/vt_video_encode_accelerator_mac.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/gpu/vt_video_encode_accelerator_mac.cc
diff --git a/media/gpu/vt_video_encode_accelerator_mac.cc b/media/gpu/vt_video_encode_accelerator_mac.cc
index fbe174cffcc077d0cc43c4f2a9d8f58123ca41c7..6b21e51c0d3060141e7b6795b0a54ce5197323ec 100644
--- a/media/gpu/vt_video_encode_accelerator_mac.cc
+++ b/media/gpu/vt_video_encode_accelerator_mac.cc
@@ -72,7 +72,8 @@ struct VTVideoEncodeAccelerator::BitstreamBufferRef {
// conditions, 0.95 seems to give us better overall bitrate over long periods
// of time.
VTVideoEncodeAccelerator::VTVideoEncodeAccelerator()
- : bitrate_adjuster_(webrtc::Clock::GetRealTimeClock(), .5, .95),
+ : target_bitrate_(0),
+ bitrate_adjuster_(webrtc::Clock::GetRealTimeClock(), .5, .95),
client_task_runner_(base::ThreadTaskRunnerHandle::Get()),
encoder_thread_("VTEncoderThread"),
encoder_task_weak_factory_(this) {
@@ -163,7 +164,7 @@ bool VTVideoEncodeAccelerator::Initialize(
client_ = client_ptr_factory_->GetWeakPtr();
input_visible_size_ = input_visible_size;
frame_rate_ = kMaxFrameRateNumerator / kMaxFrameRateDenominator;
- target_bitrate_ = initial_bitrate;
+ initial_bitrate_ = initial_bitrate;
bitstream_buffer_size_ = input_visible_size.GetArea();
if (!encoder_thread_.Start()) {
@@ -283,8 +284,7 @@ void VTVideoEncodeAccelerator::EncodeTask(
new InProgressFrameEncode(frame->timestamp(), ref_time));
// Update the bitrate if needed.
- RequestEncodingParametersChangeTask(bitrate_adjuster_.GetAdjustedBitrateBps(),
- frame_rate_);
+ SetAdjustedBitrate(bitrate_adjuster_.GetAdjustedBitrateBps());
// We can pass the ownership of |request| to the encode callback if
// successful. Otherwise let it fall out of scope.
@@ -326,36 +326,41 @@ void VTVideoEncodeAccelerator::RequestEncodingParametersChangeTask(
return;
}
- bool rv;
if (framerate != static_cast<uint32_t>(frame_rate_)) {
- frame_rate_ = framerate > 1 ? framerate : 1;
media::video_toolbox::SessionPropertySetter session_property_setter(
compression_session_, videotoolbox_glue_);
- rv = session_property_setter.Set(
+ session_property_setter.Set(
videotoolbox_glue_->kVTCompressionPropertyKey_ExpectedFrameRate(),
frame_rate_);
- DLOG_IF(ERROR, !rv)
- << "Couldn't change frame rate parameters of encode session.";
}
- if (bitrate != static_cast<uint32_t>(adjusted_bitrate_)) {
- target_bitrate_ = bitrate > 1 ? bitrate : 1;
+ if (bitrate != static_cast<uint32_t>(target_bitrate_) && bitrate > 0) {
+ target_bitrate_ = bitrate;
bitrate_adjuster_.SetTargetBitrateBps(target_bitrate_);
- adjusted_bitrate_ = bitrate_adjuster_.GetAdjustedBitrateBps();
- media::video_toolbox::SessionPropertySetter session_property_setter(
- compression_session_, videotoolbox_glue_);
- rv = session_property_setter.Set(
- videotoolbox_glue_->kVTCompressionPropertyKey_AverageBitRate(),
- adjusted_bitrate_);
- rv &= session_property_setter.Set(
- videotoolbox_glue_->kVTCompressionPropertyKey_DataRateLimits(),
- media::video_toolbox::ArrayWithIntegerAndFloat(
- adjusted_bitrate_ / kBitsPerByte, 1.0f));
- DLOG_IF(ERROR, !rv)
- << "Couldn't change bitrate parameters of encode session.";
+ SetAdjustedBitrate(bitrate_adjuster_.GetAdjustedBitrateBps());
}
}
+void VTVideoEncodeAccelerator::SetAdjustedBitrate(int32_t bitrate) {
+ DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread());
+
+ if (bitrate == encoder_set_bitrate_)
+ return;
+
+ encoder_set_bitrate_ = bitrate;
+ media::video_toolbox::SessionPropertySetter session_property_setter(
+ compression_session_, videotoolbox_glue_);
+ bool rv = session_property_setter.Set(
+ videotoolbox_glue_->kVTCompressionPropertyKey_AverageBitRate(),
+ encoder_set_bitrate_);
+ rv &= session_property_setter.Set(
+ videotoolbox_glue_->kVTCompressionPropertyKey_DataRateLimits(),
+ media::video_toolbox::ArrayWithIntegerAndFloat(
+ encoder_set_bitrate_ / kBitsPerByte, 1.0f));
+ DLOG_IF(ERROR, !rv)
+ << "Couldn't change bitrate parameters of encode session.";
+}
+
void VTVideoEncodeAccelerator::DestroyTask() {
DCHECK(thread_checker_.CalledOnValidThread() ||
(encoder_thread_.IsRunning() &&
@@ -497,7 +502,7 @@ bool VTVideoEncodeAccelerator::ResetCompressionSession() {
const bool configure_rv = ConfigureCompressionSession();
if (configure_rv)
- RequestEncodingParametersChange(target_bitrate_, frame_rate_);
+ RequestEncodingParametersChange(initial_bitrate_, frame_rate_);
return configure_rv;
}
« no previous file with comments | « media/gpu/vt_video_encode_accelerator_mac.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698