blob: bcfcdcbdf9c8a8b32b44760c03755e44be98efbd [file] [log] [blame]
Markus Handell15f2ff42019-11-22 10:34:37 +01001/*
2 * Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
3 *
4 * 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.
9 */
10
11#include "pc/video_rtp_track_source.h"
12
Harald Alvestrand5761e7b2021-01-29 14:45:08 +000013#include <stddef.h>
14
15#include <algorithm>
16
17#include "rtc_base/checks.h"
18
Markus Handell15f2ff42019-11-22 10:34:37 +010019namespace webrtc {
20
Markus Handelld5e2f212019-11-26 09:30:08 +010021VideoRtpTrackSource::VideoRtpTrackSource(Callback* callback)
22 : VideoTrackSource(true /* remote */), callback_(callback) {
23 worker_sequence_checker_.Detach();
24}
25
26void VideoRtpTrackSource::ClearCallback() {
27 RTC_DCHECK_RUN_ON(&worker_sequence_checker_);
28 callback_ = nullptr;
29}
Markus Handell15f2ff42019-11-22 10:34:37 +010030
31rtc::VideoSourceInterface<VideoFrame>* VideoRtpTrackSource::source() {
32 return &broadcaster_;
33}
34rtc::VideoSinkInterface<VideoFrame>* VideoRtpTrackSource::sink() {
35 return &broadcaster_;
36}
37
Markus Handelld5e2f212019-11-26 09:30:08 +010038void VideoRtpTrackSource::BroadcastRecordableEncodedFrame(
39 const RecordableEncodedFrame& frame) const {
Markus Handell6fcd0f82020-07-07 19:08:53 +020040 MutexLock lock(&mu_);
Markus Handelld5e2f212019-11-26 09:30:08 +010041 for (rtc::VideoSinkInterface<RecordableEncodedFrame>* sink : encoded_sinks_) {
42 sink->OnFrame(frame);
43 }
44}
45
46bool VideoRtpTrackSource::SupportsEncodedOutput() const {
47 return true;
48}
49
50void VideoRtpTrackSource::GenerateKeyFrame() {
51 RTC_DCHECK_RUN_ON(&worker_sequence_checker_);
52 if (callback_) {
53 callback_->OnGenerateKeyFrame();
54 }
55}
56
57void VideoRtpTrackSource::AddEncodedSink(
58 rtc::VideoSinkInterface<RecordableEncodedFrame>* sink) {
59 RTC_DCHECK_RUN_ON(&worker_sequence_checker_);
60 RTC_DCHECK(sink);
61 size_t size = 0;
62 {
Markus Handell6fcd0f82020-07-07 19:08:53 +020063 MutexLock lock(&mu_);
Markus Handelld5e2f212019-11-26 09:30:08 +010064 RTC_DCHECK(std::find(encoded_sinks_.begin(), encoded_sinks_.end(), sink) ==
65 encoded_sinks_.end());
66 encoded_sinks_.push_back(sink);
67 size = encoded_sinks_.size();
68 }
69 if (size == 1 && callback_) {
70 callback_->OnEncodedSinkEnabled(true);
71 }
72}
73
74void VideoRtpTrackSource::RemoveEncodedSink(
75 rtc::VideoSinkInterface<RecordableEncodedFrame>* sink) {
76 RTC_DCHECK_RUN_ON(&worker_sequence_checker_);
77 size_t size = 0;
78 {
Markus Handell6fcd0f82020-07-07 19:08:53 +020079 MutexLock lock(&mu_);
Markus Handelld5e2f212019-11-26 09:30:08 +010080 auto it = std::find(encoded_sinks_.begin(), encoded_sinks_.end(), sink);
81 if (it != encoded_sinks_.end()) {
82 encoded_sinks_.erase(it);
83 }
84 size = encoded_sinks_.size();
85 }
86 if (size == 0 && callback_) {
87 callback_->OnEncodedSinkEnabled(false);
88 }
89}
90
Markus Handell15f2ff42019-11-22 10:34:37 +010091} // namespace webrtc