Line data Source code
1 : /*
2 : * Copyright (c) 2016 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 : #ifndef WEBRTC_MEDIA_BASE_VIDEOBROADCASTER_H_
12 : #define WEBRTC_MEDIA_BASE_VIDEOBROADCASTER_H_
13 :
14 : #include <memory>
15 : #include <utility>
16 : #include <vector>
17 :
18 : #include "webrtc/api/video/video_frame.h"
19 : #include "webrtc/base/criticalsection.h"
20 : #include "webrtc/base/thread_checker.h"
21 : #include "webrtc/media/base/videosinkinterface.h"
22 : #include "webrtc/media/base/videosourcebase.h"
23 :
24 : namespace rtc {
25 :
26 : // VideoBroadcaster broadcast video frames to sinks and combines
27 : // VideoSinkWants from its sinks. It does that by implementing
28 : // rtc::VideoSourceInterface and rtc::VideoSinkInterface.
29 : // Sinks must be added and removed on one and only one thread.
30 : // Video frames can be broadcasted on any thread. I.e VideoBroadcaster::OnFrame
31 : // can be called on any thread.
32 0 : class VideoBroadcaster : public VideoSourceBase,
33 : public VideoSinkInterface<webrtc::VideoFrame> {
34 : public:
35 : VideoBroadcaster();
36 : void AddOrUpdateSink(VideoSinkInterface<webrtc::VideoFrame>* sink,
37 : const VideoSinkWants& wants) override;
38 : void RemoveSink(VideoSinkInterface<webrtc::VideoFrame>* sink) override;
39 :
40 : // Returns true if the next frame will be delivered to at least one sink.
41 : bool frame_wanted() const;
42 :
43 : // Returns VideoSinkWants a source is requested to fulfill. They are
44 : // aggregated by all VideoSinkWants from all sinks.
45 : VideoSinkWants wants() const;
46 :
47 : // This method ensures that if a sink sets rotation_applied == true,
48 : // it will never receive a frame with pending rotation. Our caller
49 : // may pass in frames without precise synchronization with changes
50 : // to the VideoSinkWants.
51 : void OnFrame(const webrtc::VideoFrame& frame) override;
52 :
53 : protected:
54 : void UpdateWants() EXCLUSIVE_LOCKS_REQUIRED(sinks_and_wants_lock_);
55 : const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& GetBlackFrameBuffer(
56 : int width, int height)
57 : EXCLUSIVE_LOCKS_REQUIRED(sinks_and_wants_lock_);
58 :
59 : ThreadChecker thread_checker_;
60 : rtc::CriticalSection sinks_and_wants_lock_;
61 :
62 : VideoSinkWants current_wants_ GUARDED_BY(sinks_and_wants_lock_);
63 : rtc::scoped_refptr<webrtc::VideoFrameBuffer> black_frame_buffer_;
64 : };
65 :
66 : } // namespace rtc
67 :
68 : #endif // WEBRTC_MEDIA_BASE_VIDEOBROADCASTER_H_
|