| Index: remoting/protocol/webrtc_video_stream.cc
|
| diff --git a/remoting/protocol/webrtc_video_stream.cc b/remoting/protocol/webrtc_video_stream.cc
|
| index 50c6ddd2e4d2521ee05b540951739604949c27e6..0b7e8621882e728a35c8561c92336d4e977e4270 100644
|
| --- a/remoting/protocol/webrtc_video_stream.cc
|
| +++ b/remoting/protocol/webrtc_video_stream.cc
|
| @@ -5,28 +5,71 @@
|
| #include "remoting/protocol/webrtc_video_stream.h"
|
|
|
| #include "base/logging.h"
|
| +#include "remoting/protocol/webrtc_video_capturer_adapter.h"
|
| #include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h"
|
| #include "third_party/libjingle/source/talk/app/webrtc/peerconnectioninterface.h"
|
| +#include "third_party/libjingle/source/talk/app/webrtc/test/fakeconstraints.h"
|
| #include "third_party/libjingle/source/talk/app/webrtc/videosourceinterface.h"
|
|
|
| namespace remoting {
|
| namespace protocol {
|
|
|
| -WebrtcVideoStream::WebrtcVideoStream(
|
| - rtc::scoped_refptr<webrtc::PeerConnectionInterface> connection,
|
| - rtc::scoped_refptr<webrtc::MediaStreamInterface> stream)
|
| - : connection_(connection), stream_(stream) {}
|
| +const char kStreamLabel[] = "screen_stream";
|
| +const char kVideoLabel[] = "screen_video";
|
| +
|
| +WebrtcVideoStream::WebrtcVideoStream() {}
|
|
|
| WebrtcVideoStream::~WebrtcVideoStream() {
|
| - for (const auto& track : stream_->GetVideoTracks()) {
|
| - track->GetSource()->Stop();
|
| - stream_->RemoveTrack(track.get());
|
| + if (stream_) {
|
| + for (const auto& track : stream_->GetVideoTracks()) {
|
| + track->GetSource()->Stop();
|
| + stream_->RemoveTrack(track.get());
|
| + }
|
| + connection_->RemoveStream(stream_.get());
|
| }
|
| - connection_->RemoveStream(stream_.get());
|
| +
|
| + // MediaStream may still outlive WebrtcVideoStream because it's
|
| + // ref-counted. Reset SizeCallback to make sure it won't be called again.
|
| + if (capturer_adapter_)
|
| + capturer_adapter_->SetSizeCallback(SizeCallback());
|
| +}
|
| +
|
| +bool WebrtcVideoStream::Start(
|
| + scoped_ptr<webrtc::DesktopCapturer> desktop_capturer,
|
| + scoped_refptr<webrtc::PeerConnectionInterface> connection,
|
| + scoped_refptr<webrtc::PeerConnectionFactoryInterface>
|
| + peer_connection_factory) {
|
| + scoped_ptr<WebrtcVideoCapturerAdapter> capturer_adapter(
|
| + new WebrtcVideoCapturerAdapter(std::move(desktop_capturer)));
|
| + capturer_adapter_ = capturer_adapter_->GetWeakPtr();
|
| +
|
| + connection_ = connection;
|
| +
|
| + // Set video stream constraints.
|
| + webrtc::FakeConstraints video_constraints;
|
| + video_constraints.AddMandatory(
|
| + webrtc::MediaConstraintsInterface::kMinFrameRate, 5);
|
| +
|
| + rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track =
|
| + peer_connection_factory->CreateVideoTrack(
|
| + kVideoLabel, peer_connection_factory->CreateVideoSource(
|
| + capturer_adapter.release(), &video_constraints));
|
| +
|
| + stream_ = peer_connection_factory->CreateLocalMediaStream(kStreamLabel);
|
| +
|
| + if (!stream_->AddTrack(video_track.get()) ||
|
| + !connection_->AddStream(stream_.get())) {
|
| + stream_ = nullptr;
|
| + connection_ = nullptr;
|
| + return false;
|
| + }
|
| +
|
| + return true;
|
| }
|
|
|
| void WebrtcVideoStream::Pause(bool pause) {
|
| - NOTIMPLEMENTED();
|
| + if (capturer_adapter_)
|
| + capturer_adapter_->Pause(pause);
|
| }
|
|
|
| void WebrtcVideoStream::OnInputEventReceived(int64_t event_timestamp) {
|
| @@ -42,7 +85,8 @@ void WebrtcVideoStream::SetLosslessColor(bool want_lossless) {
|
| }
|
|
|
| void WebrtcVideoStream::SetSizeCallback(const SizeCallback& size_callback) {
|
| - NOTIMPLEMENTED();
|
| + if (capturer_adapter_)
|
| + capturer_adapter_->SetSizeCallback(size_callback);
|
| }
|
|
|
| } // namespace protocol
|
|
|