diff options
Diffstat (limited to 'third_party/libwebrtc/pc/video_rtp_track_source.h')
-rw-r--r-- | third_party/libwebrtc/pc/video_rtp_track_source.h | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/third_party/libwebrtc/pc/video_rtp_track_source.h b/third_party/libwebrtc/pc/video_rtp_track_source.h new file mode 100644 index 0000000000..a9e43f6667 --- /dev/null +++ b/third_party/libwebrtc/pc/video_rtp_track_source.h @@ -0,0 +1,92 @@ +/* + * 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_ |