xref: /aosp_15_r20/external/webrtc/test/frame_forwarder.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker #include "test/frame_forwarder.h"
11*d9f75844SAndroid Build Coastguard Worker 
12*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
15*d9f75844SAndroid Build Coastguard Worker namespace test {
16*d9f75844SAndroid Build Coastguard Worker 
FrameForwarder()17*d9f75844SAndroid Build Coastguard Worker FrameForwarder::FrameForwarder() : sink_(nullptr) {}
~FrameForwarder()18*d9f75844SAndroid Build Coastguard Worker FrameForwarder::~FrameForwarder() {}
19*d9f75844SAndroid Build Coastguard Worker 
IncomingCapturedFrame(const VideoFrame & video_frame)20*d9f75844SAndroid Build Coastguard Worker void FrameForwarder::IncomingCapturedFrame(const VideoFrame& video_frame) {
21*d9f75844SAndroid Build Coastguard Worker   MutexLock lock(&mutex_);
22*d9f75844SAndroid Build Coastguard Worker   if (sink_)
23*d9f75844SAndroid Build Coastguard Worker     sink_->OnFrame(video_frame);
24*d9f75844SAndroid Build Coastguard Worker }
25*d9f75844SAndroid Build Coastguard Worker 
AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame> * sink,const rtc::VideoSinkWants & wants)26*d9f75844SAndroid Build Coastguard Worker void FrameForwarder::AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
27*d9f75844SAndroid Build Coastguard Worker                                      const rtc::VideoSinkWants& wants) {
28*d9f75844SAndroid Build Coastguard Worker   MutexLock lock(&mutex_);
29*d9f75844SAndroid Build Coastguard Worker   AddOrUpdateSinkLocked(sink, wants);
30*d9f75844SAndroid Build Coastguard Worker }
31*d9f75844SAndroid Build Coastguard Worker 
AddOrUpdateSinkLocked(rtc::VideoSinkInterface<VideoFrame> * sink,const rtc::VideoSinkWants & wants)32*d9f75844SAndroid Build Coastguard Worker void FrameForwarder::AddOrUpdateSinkLocked(
33*d9f75844SAndroid Build Coastguard Worker     rtc::VideoSinkInterface<VideoFrame>* sink,
34*d9f75844SAndroid Build Coastguard Worker     const rtc::VideoSinkWants& wants) {
35*d9f75844SAndroid Build Coastguard Worker   RTC_DCHECK(!sink_ || sink_ == sink);
36*d9f75844SAndroid Build Coastguard Worker   sink_ = sink;
37*d9f75844SAndroid Build Coastguard Worker   sink_wants_ = wants;
38*d9f75844SAndroid Build Coastguard Worker }
39*d9f75844SAndroid Build Coastguard Worker 
RemoveSink(rtc::VideoSinkInterface<VideoFrame> * sink)40*d9f75844SAndroid Build Coastguard Worker void FrameForwarder::RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) {
41*d9f75844SAndroid Build Coastguard Worker   MutexLock lock(&mutex_);
42*d9f75844SAndroid Build Coastguard Worker   RTC_DCHECK_EQ(sink, sink_);
43*d9f75844SAndroid Build Coastguard Worker   sink_ = nullptr;
44*d9f75844SAndroid Build Coastguard Worker }
45*d9f75844SAndroid Build Coastguard Worker 
sink_wants() const46*d9f75844SAndroid Build Coastguard Worker rtc::VideoSinkWants FrameForwarder::sink_wants() const {
47*d9f75844SAndroid Build Coastguard Worker   MutexLock lock(&mutex_);
48*d9f75844SAndroid Build Coastguard Worker   return sink_wants_;
49*d9f75844SAndroid Build Coastguard Worker }
50*d9f75844SAndroid Build Coastguard Worker 
sink_wants_locked() const51*d9f75844SAndroid Build Coastguard Worker rtc::VideoSinkWants FrameForwarder::sink_wants_locked() const {
52*d9f75844SAndroid Build Coastguard Worker   return sink_wants_;
53*d9f75844SAndroid Build Coastguard Worker }
54*d9f75844SAndroid Build Coastguard Worker 
has_sinks() const55*d9f75844SAndroid Build Coastguard Worker bool FrameForwarder::has_sinks() const {
56*d9f75844SAndroid Build Coastguard Worker   MutexLock lock(&mutex_);
57*d9f75844SAndroid Build Coastguard Worker   return sink_ != nullptr;
58*d9f75844SAndroid Build Coastguard Worker }
59*d9f75844SAndroid Build Coastguard Worker 
60*d9f75844SAndroid Build Coastguard Worker }  // namespace test
61*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
62