blob: cc05408ca8434ca73e58af3ecbd9519ea411be58 [file] [log] [blame]
// Copyright (c) 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/renderer/media/remote_media_stream_track_adapter.h"
#include "content/renderer/media/media_stream_audio_source.h"
#include "content/renderer/media/media_stream_video_track.h"
#include "content/renderer/media/webrtc/media_stream_remote_video_source.h"
#include "content/renderer/media/webrtc/peer_connection_remote_audio_source.h"
#include "content/renderer/media/webrtc/track_observer.h"
namespace content {
RemoteVideoTrackAdapter::RemoteVideoTrackAdapter(
const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
webrtc::VideoTrackInterface* webrtc_track)
: RemoteMediaStreamTrackAdapter(main_thread, webrtc_track) {
std::unique_ptr<TrackObserver> observer(
new TrackObserver(main_thread, observed_track().get()));
// Here, we use base::Unretained() to avoid a circular reference.
web_initialize_ = base::Bind(
&RemoteVideoTrackAdapter::InitializeWebVideoTrack, base::Unretained(this),
base::Passed(&observer), observed_track()->enabled());
}
RemoteVideoTrackAdapter::~RemoteVideoTrackAdapter() {
DCHECK(main_thread_->BelongsToCurrentThread());
if (initialized()) {
static_cast<MediaStreamRemoteVideoSource*>(
web_track()->Source().GetExtraData())
->OnSourceTerminated();
}
}
void RemoteVideoTrackAdapter::InitializeWebVideoTrack(
std::unique_ptr<TrackObserver> observer,
bool enabled) {
DCHECK(main_thread_->BelongsToCurrentThread());
std::unique_ptr<MediaStreamRemoteVideoSource> video_source(
new MediaStreamRemoteVideoSource(std::move(observer)));
InitializeWebTrack(blink::WebMediaStreamSource::kTypeVideo);
web_track()->Source().SetExtraData(video_source.get());
MediaStreamVideoTrack* media_stream_track = new MediaStreamVideoTrack(
video_source.release(), MediaStreamVideoSource::ConstraintsCallback(),
enabled);
web_track()->SetTrackData(media_stream_track);
}
RemoteAudioTrackAdapter::RemoteAudioTrackAdapter(
const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
webrtc::AudioTrackInterface* webrtc_track)
: RemoteMediaStreamTrackAdapter(main_thread, webrtc_track),
#if DCHECK_IS_ON()
unregistered_(false),
#endif
state_(observed_track()->state()) {
// TODO(tommi): Use TrackObserver instead.
observed_track()->RegisterObserver(this);
// Here, we use base::Unretained() to avoid a circular reference.
web_initialize_ =
base::Bind(&RemoteAudioTrackAdapter::InitializeWebAudioTrack,
base::Unretained(this));
}
RemoteAudioTrackAdapter::~RemoteAudioTrackAdapter() {
#if DCHECK_IS_ON()
DCHECK(unregistered_);
#endif
}
void RemoteAudioTrackAdapter::Unregister() {
#if DCHECK_IS_ON()
DCHECK(!unregistered_);
unregistered_ = true;
#endif
observed_track()->UnregisterObserver(this);
}
void RemoteAudioTrackAdapter::InitializeWebAudioTrack() {
InitializeWebTrack(blink::WebMediaStreamSource::kTypeAudio);
MediaStreamAudioSource* const source =
new PeerConnectionRemoteAudioSource(observed_track().get());
web_track()->Source().SetExtraData(source); // Takes ownership.
source->ConnectToTrack(*(web_track()));
}
void RemoteAudioTrackAdapter::OnChanged() {
main_thread_->PostTask(
FROM_HERE, base::BindOnce(&RemoteAudioTrackAdapter::OnChangedOnMainThread,
this, observed_track()->state()));
}
void RemoteAudioTrackAdapter::OnChangedOnMainThread(
webrtc::MediaStreamTrackInterface::TrackState state) {
DCHECK(main_thread_->BelongsToCurrentThread());
if (state == state_ || !initialized())
return;
state_ = state;
switch (state) {
case webrtc::MediaStreamTrackInterface::kLive:
web_track()->Source().SetReadyState(
blink::WebMediaStreamSource::kReadyStateLive);
break;
case webrtc::MediaStreamTrackInterface::kEnded:
web_track()->Source().SetReadyState(
blink::WebMediaStreamSource::kReadyStateEnded);
break;
default:
NOTREACHED();
break;
}
}
} // namespace content