blob: 6e749b052652e4366b25b3fdc7ef04bbc8aa7a55 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:361/*
kjellanderb24317b2016-02-10 15:54:432 * Copyright 2011 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:363 *
kjellanderb24317b2016-02-10 15:54:434 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org28e20752013-07-10 00:45:369 */
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:1310
Jonas Olssona4d87372019-07-05 17:08:3311#include "pc/video_track.h"
12
Steve Anton36b29d12017-10-30 16:57:4213#include <string>
Tommi816134a2021-05-24 14:54:4114#include <utility>
Yves Gerey3e707812018-11-28 15:47:4915#include <vector>
Steve Anton36b29d12017-10-30 16:57:4216
Yves Gerey3e707812018-11-28 15:47:4917#include "api/notifier.h"
Artem Titovd15a5752021-02-10 13:31:2418#include "api/sequence_checker.h"
Yves Gerey3e707812018-11-28 15:47:4919#include "rtc_base/checks.h"
20#include "rtc_base/location.h"
Tomas Gunnarssondfd69c22022-02-15 12:56:5021#include "rtc_base/logging.h"
Steve Anton10542f22019-01-11 17:11:0022#include "rtc_base/ref_counted_object.h"
henrike@webrtc.org28e20752013-07-10 00:45:3623
henrike@webrtc.org28e20752013-07-10 00:45:3624namespace webrtc {
25
Tomas Gunnarssone7b4c132022-02-14 11:03:2926VideoTrack::VideoTrack(const std::string& label,
27 VideoTrackSourceInterface* video_source,
28 rtc::Thread* worker_thread)
henrike@webrtc.org28e20752013-07-10 00:45:3629 : MediaStreamTrack<VideoTrackInterface>(label),
perkj773be362017-08-01 06:22:0130 worker_thread_(worker_thread),
Tomas Gunnarssone7b4c132022-02-14 11:03:2931 video_source_(video_source),
pbos5214a0a2016-12-16 23:39:1132 content_hint_(ContentHint::kNone) {
Tommi816134a2021-05-24 14:54:4133 RTC_DCHECK_RUN_ON(&signaling_thread_);
34 // Detach the thread checker for VideoSourceBaseGuarded since we'll make calls
35 // to VideoSourceBaseGuarded on the worker thread, but we're currently on the
36 // signaling thread.
37 source_sequence_.Detach();
perkjc8f952d2016-03-23 07:33:5638 video_source_->RegisterObserver(this);
henrike@webrtc.org28e20752013-07-10 00:45:3639}
40
41VideoTrack::~VideoTrack() {
Tommi816134a2021-05-24 14:54:4142 RTC_DCHECK_RUN_ON(&signaling_thread_);
perkjc8f952d2016-03-23 07:33:5643 video_source_->UnregisterObserver(this);
henrike@webrtc.org28e20752013-07-10 00:45:3644}
45
46std::string VideoTrack::kind() const {
deadbeeffac06552015-11-25 19:26:0147 return kVideoKind;
henrike@webrtc.org28e20752013-07-10 00:45:3648}
49
nisse5b68ab52016-04-07 14:45:5450// AddOrUpdateSink and RemoveSink should be called on the worker
51// thread.
nisseacd935b2016-11-11 11:55:1352void VideoTrack::AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
53 const rtc::VideoSinkWants& wants) {
Tommi816134a2021-05-24 14:54:4154 RTC_DCHECK_RUN_ON(worker_thread_);
55 VideoSourceBaseGuarded::AddOrUpdateSink(sink, wants);
perkjd6c39542016-03-17 09:35:2356 rtc::VideoSinkWants modified_wants = wants;
Tomas Gunnarsson250c31d2022-02-14 22:48:4157 modified_wants.black_frames = !enabled_w_;
Tomas Gunnarssone7b4c132022-02-14 11:03:2958 video_source_->AddOrUpdateSink(sink, modified_wants);
henrike@webrtc.org28e20752013-07-10 00:45:3659}
60
nisseacd935b2016-11-11 11:55:1361void VideoTrack::RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) {
Tommi816134a2021-05-24 14:54:4162 RTC_DCHECK_RUN_ON(worker_thread_);
63 VideoSourceBaseGuarded::RemoveSink(sink);
Tomas Gunnarssone7b4c132022-02-14 11:03:2964 video_source_->RemoveSink(sink);
henrike@webrtc.org28e20752013-07-10 00:45:3665}
66
Markus Handelldbef2bd2021-12-22 09:47:2767void VideoTrack::RequestRefreshFrame() {
68 RTC_DCHECK_RUN_ON(worker_thread_);
Tomas Gunnarssone7b4c132022-02-14 11:03:2969 video_source_->RequestRefreshFrame();
Markus Handelldbef2bd2021-12-22 09:47:2770}
71
Tommi816134a2021-05-24 14:54:4172VideoTrackSourceInterface* VideoTrack::GetSource() const {
73 // Callable from any thread.
74 return video_source_.get();
75}
76
pbos5214a0a2016-12-16 23:39:1177VideoTrackInterface::ContentHint VideoTrack::content_hint() const {
Tomas Gunnarssondfd69c22022-02-15 12:56:5078 RTC_DCHECK_RUN_ON(&signaling_thread_);
pbos5214a0a2016-12-16 23:39:1179 return content_hint_;
80}
81
82void VideoTrack::set_content_hint(ContentHint hint) {
Tomas Gunnarssondfd69c22022-02-15 12:56:5083 RTC_DCHECK_RUN_ON(&signaling_thread_);
pbos5214a0a2016-12-16 23:39:1184 if (content_hint_ == hint)
85 return;
86 content_hint_ = hint;
87 Notifier<VideoTrackInterface>::FireOnChanged();
88}
89
henrike@webrtc.org28e20752013-07-10 00:45:3690bool VideoTrack::set_enabled(bool enable) {
Tomas Gunnarsson250c31d2022-02-14 22:48:4191 RTC_DCHECK_RUN_ON(&signaling_thread_);
92
93 bool ret = MediaStreamTrack<VideoTrackInterface>::set_enabled(enable);
94
95 worker_thread_->Invoke<void>(RTC_FROM_HERE, [&]() {
96 RTC_DCHECK_RUN_ON(worker_thread_);
97 enabled_w_ = enable;
98 for (auto& sink_pair : sink_pairs()) {
99 rtc::VideoSinkWants modified_wants = sink_pair.wants;
100 modified_wants.black_frames = !enable;
101 video_source_->AddOrUpdateSink(sink_pair.sink, modified_wants);
102 }
103 });
104
105 return ret;
henrike@webrtc.org28e20752013-07-10 00:45:36106}
107
Tommi816134a2021-05-24 14:54:41108bool VideoTrack::enabled() const {
Tomas Gunnarsson250c31d2022-02-14 22:48:41109 if (worker_thread_->IsCurrent()) {
110 RTC_DCHECK_RUN_ON(worker_thread_);
111 return enabled_w_;
112 }
113 RTC_DCHECK_RUN_ON(&signaling_thread_);
Tommi816134a2021-05-24 14:54:41114 return MediaStreamTrack<VideoTrackInterface>::enabled();
115}
116
117MediaStreamTrackInterface::TrackState VideoTrack::state() const {
Tomas Gunnarssone7b4c132022-02-14 11:03:29118 RTC_DCHECK_RUN_ON(worker_thread_);
Tommi816134a2021-05-24 14:54:41119 return MediaStreamTrack<VideoTrackInterface>::state();
120}
121
perkjc8f952d2016-03-23 07:33:56122void VideoTrack::OnChanged() {
Tommi816134a2021-05-24 14:54:41123 RTC_DCHECK_RUN_ON(&signaling_thread_);
Tomas Gunnarssondfd69c22022-02-15 12:56:50124 rtc::Thread::ScopedDisallowBlockingCalls no_blocking_calls;
125 MediaSourceInterface::SourceState state = video_source_->state();
126 set_state(state == MediaSourceInterface::kEnded ? kEnded : kLive);
perkjc8f952d2016-03-23 07:33:56127}
128
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52129rtc::scoped_refptr<VideoTrack> VideoTrack::Create(
nissedb25d2e2016-02-26 09:24:58130 const std::string& id,
perkj773be362017-08-01 06:22:01131 VideoTrackSourceInterface* source,
132 rtc::Thread* worker_thread) {
Tomas Gunnarssone7b4c132022-02-14 11:03:29133 return rtc::make_ref_counted<VideoTrack>(id, source, worker_thread);
henrike@webrtc.org28e20752013-07-10 00:45:36134}
135
136} // namespace webrtc