1 /* 2 * Copyright 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 #ifndef PC_VIDEO_RTP_TRACK_SOURCE_H_ 12 #define PC_VIDEO_RTP_TRACK_SOURCE_H_ 13 14 #include <vector> 15 16 #include "api/sequence_checker.h" 17 #include "api/video/recordable_encoded_frame.h" 18 #include "api/video/video_frame.h" 19 #include "api/video/video_sink_interface.h" 20 #include "api/video/video_source_interface.h" 21 #include "media/base/video_broadcaster.h" 22 #include "pc/video_track_source.h" 23 #include "rtc_base/synchronization/mutex.h" 24 #include "rtc_base/system/no_unique_address.h" 25 #include "rtc_base/thread_annotations.h" 26 27 namespace webrtc { 28 29 // Video track source in use by VideoRtpReceiver 30 class VideoRtpTrackSource : public VideoTrackSource { 31 public: 32 class Callback { 33 public: 34 virtual ~Callback() = default; 35 36 // Called when a keyframe should be generated 37 virtual void OnGenerateKeyFrame() = 0; 38 39 // Called when the implementor should eventually start to serve encoded 40 // frames using BroadcastEncodedFrameBuffer. 41 // The implementor should cause a keyframe to be eventually generated. 42 virtual void OnEncodedSinkEnabled(bool enable) = 0; 43 }; 44 45 explicit VideoRtpTrackSource(Callback* callback); 46 47 VideoRtpTrackSource(const VideoRtpTrackSource&) = delete; 48 VideoRtpTrackSource& operator=(const VideoRtpTrackSource&) = delete; 49 50 // Call before the object implementing Callback finishes it's destructor. No 51 // more callbacks will be fired after completion. Must be called on the 52 // worker thread 53 void ClearCallback(); 54 55 // Call to broadcast an encoded frame to registered sinks. 56 // This method can be called on any thread or queue. 57 void BroadcastRecordableEncodedFrame( 58 const RecordableEncodedFrame& frame) const; 59 60 // VideoTrackSource 61 rtc::VideoSourceInterface<VideoFrame>* source() override; 62 rtc::VideoSinkInterface<VideoFrame>* sink(); 63 64 // Returns true. This method can be called on any thread. 65 bool SupportsEncodedOutput() const override; 66 67 // Generates a key frame. Must be called on the worker thread. 68 void GenerateKeyFrame() override; 69 70 // Adds an encoded sink. Must be called on the worker thread. 71 void AddEncodedSink( 72 rtc::VideoSinkInterface<RecordableEncodedFrame>* sink) override; 73 74 // Removes an encoded sink. Must be called on the worker thread. 75 void RemoveEncodedSink( 76 rtc::VideoSinkInterface<RecordableEncodedFrame>* sink) override; 77 78 private: 79 RTC_NO_UNIQUE_ADDRESS SequenceChecker worker_sequence_checker_; 80 // `broadcaster_` is needed since the decoder can only handle one sink. 81 // It might be better if the decoder can handle multiple sinks and consider 82 // the VideoSinkWants. 83 rtc::VideoBroadcaster broadcaster_; 84 mutable Mutex mu_; 85 std::vector<rtc::VideoSinkInterface<RecordableEncodedFrame>*> encoded_sinks_ 86 RTC_GUARDED_BY(mu_); 87 Callback* callback_ RTC_GUARDED_BY(worker_sequence_checker_); 88 }; 89 90 } // namespace webrtc 91 92 #endif // PC_VIDEO_RTP_TRACK_SOURCE_H_ 93