| /* |
| * Copyright 2019 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #ifndef PC_VIDEO_RTP_TRACK_SOURCE_H_ |
| #define PC_VIDEO_RTP_TRACK_SOURCE_H_ |
| |
| #include <vector> |
| |
| #include "api/sequence_checker.h" |
| #include "api/video/recordable_encoded_frame.h" |
| #include "api/video/video_frame.h" |
| #include "api/video/video_sink_interface.h" |
| #include "api/video/video_source_interface.h" |
| #include "media/base/video_broadcaster.h" |
| #include "pc/video_track_source.h" |
| #include "rtc_base/synchronization/mutex.h" |
| #include "rtc_base/system/no_unique_address.h" |
| #include "rtc_base/thread_annotations.h" |
| |
| namespace webrtc { |
| |
| // Video track source in use by VideoRtpReceiver |
| class VideoRtpTrackSource : public VideoTrackSource { |
| public: |
| class Callback { |
| public: |
| virtual ~Callback() = default; |
| |
| // Called when a keyframe should be generated |
| virtual void OnGenerateKeyFrame() = 0; |
| |
| // Called when the implementor should eventually start to serve encoded |
| // frames using BroadcastEncodedFrameBuffer. |
| // The implementor should cause a keyframe to be eventually generated. |
| virtual void OnEncodedSinkEnabled(bool enable) = 0; |
| }; |
| |
| explicit VideoRtpTrackSource(Callback* callback); |
| |
| VideoRtpTrackSource(const VideoRtpTrackSource&) = delete; |
| VideoRtpTrackSource& operator=(const VideoRtpTrackSource&) = delete; |
| |
| // Call before the object implementing Callback finishes it's destructor. No |
| // more callbacks will be fired after completion. Must be called on the |
| // worker thread |
| void ClearCallback(); |
| |
| // Call to broadcast an encoded frame to registered sinks. |
| // This method can be called on any thread or queue. |
| void BroadcastRecordableEncodedFrame( |
| const RecordableEncodedFrame& frame) const; |
| |
| // VideoTrackSource |
| rtc::VideoSourceInterface<VideoFrame>* source() override; |
| rtc::VideoSinkInterface<VideoFrame>* sink(); |
| |
| // Returns true. This method can be called on any thread. |
| bool SupportsEncodedOutput() const override; |
| |
| // Generates a key frame. Must be called on the worker thread. |
| void GenerateKeyFrame() override; |
| |
| // Adds an encoded sink. Must be called on the worker thread. |
| void AddEncodedSink( |
| rtc::VideoSinkInterface<RecordableEncodedFrame>* sink) override; |
| |
| // Removes an encoded sink. Must be called on the worker thread. |
| void RemoveEncodedSink( |
| rtc::VideoSinkInterface<RecordableEncodedFrame>* sink) override; |
| |
| private: |
| RTC_NO_UNIQUE_ADDRESS SequenceChecker worker_sequence_checker_; |
| // `broadcaster_` is needed since the decoder can only handle one sink. |
| // It might be better if the decoder can handle multiple sinks and consider |
| // the VideoSinkWants. |
| rtc::VideoBroadcaster broadcaster_; |
| mutable Mutex mu_; |
| std::vector<rtc::VideoSinkInterface<RecordableEncodedFrame>*> encoded_sinks_ |
| RTC_GUARDED_BY(mu_); |
| Callback* callback_ RTC_GUARDED_BY(worker_sequence_checker_); |
| }; |
| |
| } // namespace webrtc |
| |
| #endif // PC_VIDEO_RTP_TRACK_SOURCE_H_ |