Chromium Code Reviews| Index: remoting/protocol/webrtc_video_encoder_factory.cc |
| diff --git a/remoting/protocol/webrtc_video_encoder.cc b/remoting/protocol/webrtc_video_encoder_factory.cc |
| similarity index 86% |
| rename from remoting/protocol/webrtc_video_encoder.cc |
| rename to remoting/protocol/webrtc_video_encoder_factory.cc |
| index 39c27ec22d4830c87a3ddf9865d4842b26268470..a2d7f7c3919542ffeb84ad73be56e8493cb77eee 100644 |
| --- a/remoting/protocol/webrtc_video_encoder.cc |
| +++ b/remoting/protocol/webrtc_video_encoder_factory.cc |
| @@ -2,7 +2,7 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| -#include "remoting/protocol/webrtc_video_encoder.h" |
| +#include "remoting/protocol/webrtc_video_encoder_factory.h" |
| #include <algorithm> |
| #include <vector> |
| @@ -44,7 +44,6 @@ int32_t WebRtcVideoEncoder::InitEncode(const webrtc::VideoCodec* codec_settings, |
| } |
| } |
| } |
| - target_bitrate_ = codec_settings->startBitrate; |
| state_ = kInitialized; |
| return WEBRTC_VIDEO_CODEC_OK; |
| } |
| @@ -84,14 +83,14 @@ int32_t WebRtcVideoEncoder::SetChannelParameters(uint32_t packet_loss, |
| int32_t WebRtcVideoEncoder::SetRates(uint32_t bitrate, uint32_t framerate) { |
| VLOG(1) << "WebRtcVideoEncoder::SetRates bitrate:framerate " << bitrate << ":" |
| << framerate; |
| - target_bitrate_ = bitrate; |
| + if (!target_bitrate_cb_.is_null()) |
| + target_bitrate_cb_.Run(bitrate); |
| // framerate is not expected to be valid given we never report captured |
| // frames |
| return WEBRTC_VIDEO_CODEC_OK; |
| } |
| -int WebRtcVideoEncoder::SendEncodedFrame(int64_t capture_timestamp_ms, |
| - std::unique_ptr<VideoPacket> frame) { |
| +int WebRtcVideoEncoder::SendEncodedFrame(std::unique_ptr<VideoPacket> frame) { |
| uint8_t* buffer = |
| reinterpret_cast<uint8_t*>(const_cast<char*>(frame->data().data())); |
| size_t buffer_size = frame->data().size(); |
| @@ -107,8 +106,9 @@ int WebRtcVideoEncoder::SendEncodedFrame(int64_t capture_timestamp_ms, |
| encoded_image._completeFrame = true; |
| encoded_image._frameType = |
| frame->key_frame() ? webrtc::kVideoFrameKey : webrtc::kVideoFrameDelta; |
| - encoded_image.capture_time_ms_ = capture_timestamp_ms; |
| - encoded_image._timeStamp = static_cast<uint32_t>(capture_timestamp_ms * 90); |
| + encoded_image.capture_time_ms_ = frame->capture_time_ms(); |
|
Sergey Ulanov
2016/05/10 00:00:58
VideoPacket::capture_time_ms() returns time it too
Irfan
2016/05/10 16:30:45
Agree that this is abuse of the VideoPacket captur
|
| + encoded_image._timeStamp = |
| + static_cast<uint32_t>(frame->capture_time_ms() * 90); |
|
Sergey Ulanov
2016/05/10 00:00:58
same here. capture_time_ms() is not timestamp
|
| webrtc::CodecSpecificInfo codec_specific_info; |
| memset(&codec_specific_info, 0, sizeof(codec_specific_info)); |
| @@ -144,6 +144,12 @@ void WebRtcVideoEncoder::SetKeyFrameRequestCallback( |
| key_frame_request_ = key_frame_request; |
| } |
| +void WebRtcVideoEncoder::SetTargetBitrateCallback( |
| + const TargetBitrateCallback& target_bitrate_cb) { |
| + base::AutoLock lock(lock_); |
| + target_bitrate_cb_ = target_bitrate_cb; |
| +} |
| + |
| WebRtcVideoEncoderFactory::WebRtcVideoEncoderFactory() { |
| // TODO(isheriff): These do not really affect anything internally |
| // in webrtc. |
| @@ -162,6 +168,7 @@ webrtc::VideoEncoder* WebRtcVideoEncoderFactory::CreateVideoEncoder( |
| WebRtcVideoEncoder* encoder = new WebRtcVideoEncoder(type); |
| base::AutoLock lock(lock_); |
| encoder->SetKeyFrameRequestCallback(key_frame_request_); |
| + encoder->SetTargetBitrateCallback(target_bitrate_cb_); |
| VLOG(1) << "Created " << encoder; |
| encoders_.push_back(base::WrapUnique(encoder)); |
| return encoder; |
| @@ -196,14 +203,12 @@ void WebRtcVideoEncoderFactory::DestroyVideoEncoder( |
| } |
| int WebRtcVideoEncoderFactory::SendEncodedFrame( |
| - int64_t capture_timestamp_ms, |
| std::unique_ptr<VideoPacket> frame) { |
| if (encoders_.size() != 1) { |
| LOG(ERROR) << "Unexpected number of encoders " << encoders_.size(); |
| return -1; |
| } |
| - return encoders_.front()->SendEncodedFrame(capture_timestamp_ms, |
| - std::move(frame)); |
| + return encoders_.front()->SendEncodedFrame(std::move(frame)); |
| } |
| void WebRtcVideoEncoderFactory::SetKeyFrameRequestCallback( |
| @@ -218,4 +223,17 @@ void WebRtcVideoEncoderFactory::SetKeyFrameRequestCallback( |
| << encoders_.size(); |
| } |
| } |
| + |
| +void WebRtcVideoEncoderFactory::SetTargetBitrateCallback( |
| + const TargetBitrateCallback& target_bitrate_cb) { |
| + base::AutoLock lock(lock_); |
| + target_bitrate_cb_ = target_bitrate_cb; |
| + if (encoders_.size() == 1) { |
| + encoders_.front()->SetTargetBitrateCallback(target_bitrate_cb); |
| + } else { |
| + LOG(ERROR) << "Dropping target bitrate request callback with unexpected" |
| + " number of encoders" |
| + << encoders_.size(); |
| + } |
| +} |
| } // namespace remoting |