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; |
} |