1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2020 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 11*d9f75844SAndroid Build Coastguard Worker #ifndef VIDEO_VIDEO_RECEIVE_STREAM2_H_ 12*d9f75844SAndroid Build Coastguard Worker #define VIDEO_VIDEO_RECEIVE_STREAM2_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <map> 15*d9f75844SAndroid Build Coastguard Worker #include <memory> 16*d9f75844SAndroid Build Coastguard Worker #include <string> 17*d9f75844SAndroid Build Coastguard Worker #include <vector> 18*d9f75844SAndroid Build Coastguard Worker 19*d9f75844SAndroid Build Coastguard Worker #include "api/sequence_checker.h" 20*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/pending_task_safety_flag.h" 21*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/task_queue_factory.h" 22*d9f75844SAndroid Build Coastguard Worker #include "api/units/time_delta.h" 23*d9f75844SAndroid Build Coastguard Worker #include "api/units/timestamp.h" 24*d9f75844SAndroid Build Coastguard Worker #include "api/video/recordable_encoded_frame.h" 25*d9f75844SAndroid Build Coastguard Worker #include "call/call.h" 26*d9f75844SAndroid Build Coastguard Worker #include "call/rtp_packet_sink_interface.h" 27*d9f75844SAndroid Build Coastguard Worker #include "call/syncable.h" 28*d9f75844SAndroid Build Coastguard Worker #include "call/video_receive_stream.h" 29*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/source_tracker.h" 30*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/nack_requester.h" 31*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/video_receiver2.h" 32*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/system/no_unique_address.h" 33*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/task_queue.h" 34*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/thread_annotations.h" 35*d9f75844SAndroid Build Coastguard Worker #include "system_wrappers/include/clock.h" 36*d9f75844SAndroid Build Coastguard Worker #include "video/receive_statistics_proxy2.h" 37*d9f75844SAndroid Build Coastguard Worker #include "video/rtp_streams_synchronizer2.h" 38*d9f75844SAndroid Build Coastguard Worker #include "video/rtp_video_stream_receiver2.h" 39*d9f75844SAndroid Build Coastguard Worker #include "video/transport_adapter.h" 40*d9f75844SAndroid Build Coastguard Worker #include "video/video_stream_buffer_controller.h" 41*d9f75844SAndroid Build Coastguard Worker #include "video/video_stream_decoder2.h" 42*d9f75844SAndroid Build Coastguard Worker 43*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 44*d9f75844SAndroid Build Coastguard Worker 45*d9f75844SAndroid Build Coastguard Worker class RtpStreamReceiverInterface; 46*d9f75844SAndroid Build Coastguard Worker class RtpStreamReceiverControllerInterface; 47*d9f75844SAndroid Build Coastguard Worker class RtxReceiveStream; 48*d9f75844SAndroid Build Coastguard Worker class VCMTiming; 49*d9f75844SAndroid Build Coastguard Worker 50*d9f75844SAndroid Build Coastguard Worker constexpr TimeDelta kMaxWaitForKeyFrame = TimeDelta::Millis(200); 51*d9f75844SAndroid Build Coastguard Worker constexpr TimeDelta kMaxWaitForFrame = TimeDelta::Seconds(3); 52*d9f75844SAndroid Build Coastguard Worker 53*d9f75844SAndroid Build Coastguard Worker namespace internal { 54*d9f75844SAndroid Build Coastguard Worker 55*d9f75844SAndroid Build Coastguard Worker class CallStats; 56*d9f75844SAndroid Build Coastguard Worker 57*d9f75844SAndroid Build Coastguard Worker // Utility struct for grabbing metadata from a VideoFrame and processing it 58*d9f75844SAndroid Build Coastguard Worker // asynchronously without needing the actual frame data. 59*d9f75844SAndroid Build Coastguard Worker // Additionally the caller can bundle information from the current clock 60*d9f75844SAndroid Build Coastguard Worker // when the metadata is captured, for accurate reporting and not needing 61*d9f75844SAndroid Build Coastguard Worker // multiple calls to clock->Now(). 62*d9f75844SAndroid Build Coastguard Worker struct VideoFrameMetaData { VideoFrameMetaDataVideoFrameMetaData63*d9f75844SAndroid Build Coastguard Worker VideoFrameMetaData(const webrtc::VideoFrame& frame, Timestamp now) 64*d9f75844SAndroid Build Coastguard Worker : rtp_timestamp(frame.timestamp()), 65*d9f75844SAndroid Build Coastguard Worker timestamp_us(frame.timestamp_us()), 66*d9f75844SAndroid Build Coastguard Worker ntp_time_ms(frame.ntp_time_ms()), 67*d9f75844SAndroid Build Coastguard Worker width(frame.width()), 68*d9f75844SAndroid Build Coastguard Worker height(frame.height()), 69*d9f75844SAndroid Build Coastguard Worker decode_timestamp(now) {} 70*d9f75844SAndroid Build Coastguard Worker render_time_msVideoFrameMetaData71*d9f75844SAndroid Build Coastguard Worker int64_t render_time_ms() const { 72*d9f75844SAndroid Build Coastguard Worker return timestamp_us / rtc::kNumMicrosecsPerMillisec; 73*d9f75844SAndroid Build Coastguard Worker } 74*d9f75844SAndroid Build Coastguard Worker 75*d9f75844SAndroid Build Coastguard Worker const uint32_t rtp_timestamp; 76*d9f75844SAndroid Build Coastguard Worker const int64_t timestamp_us; 77*d9f75844SAndroid Build Coastguard Worker const int64_t ntp_time_ms; 78*d9f75844SAndroid Build Coastguard Worker const int width; 79*d9f75844SAndroid Build Coastguard Worker const int height; 80*d9f75844SAndroid Build Coastguard Worker 81*d9f75844SAndroid Build Coastguard Worker const Timestamp decode_timestamp; 82*d9f75844SAndroid Build Coastguard Worker }; 83*d9f75844SAndroid Build Coastguard Worker 84*d9f75844SAndroid Build Coastguard Worker class VideoReceiveStream2 85*d9f75844SAndroid Build Coastguard Worker : public webrtc::VideoReceiveStreamInterface, 86*d9f75844SAndroid Build Coastguard Worker public rtc::VideoSinkInterface<VideoFrame>, 87*d9f75844SAndroid Build Coastguard Worker public RtpVideoStreamReceiver2::OnCompleteFrameCallback, 88*d9f75844SAndroid Build Coastguard Worker public Syncable, 89*d9f75844SAndroid Build Coastguard Worker public CallStatsObserver, 90*d9f75844SAndroid Build Coastguard Worker public FrameSchedulingReceiver { 91*d9f75844SAndroid Build Coastguard Worker public: 92*d9f75844SAndroid Build Coastguard Worker // The maximum number of buffered encoded frames when encoded output is 93*d9f75844SAndroid Build Coastguard Worker // configured. 94*d9f75844SAndroid Build Coastguard Worker static constexpr size_t kBufferedEncodedFramesMaxSize = 60; 95*d9f75844SAndroid Build Coastguard Worker 96*d9f75844SAndroid Build Coastguard Worker VideoReceiveStream2(TaskQueueFactory* task_queue_factory, 97*d9f75844SAndroid Build Coastguard Worker Call* call, 98*d9f75844SAndroid Build Coastguard Worker int num_cpu_cores, 99*d9f75844SAndroid Build Coastguard Worker PacketRouter* packet_router, 100*d9f75844SAndroid Build Coastguard Worker VideoReceiveStreamInterface::Config config, 101*d9f75844SAndroid Build Coastguard Worker CallStats* call_stats, 102*d9f75844SAndroid Build Coastguard Worker Clock* clock, 103*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<VCMTiming> timing, 104*d9f75844SAndroid Build Coastguard Worker NackPeriodicProcessor* nack_periodic_processor, 105*d9f75844SAndroid Build Coastguard Worker DecodeSynchronizer* decode_sync, 106*d9f75844SAndroid Build Coastguard Worker RtcEventLog* event_log); 107*d9f75844SAndroid Build Coastguard Worker // Destruction happens on the worker thread. Prior to destruction the caller 108*d9f75844SAndroid Build Coastguard Worker // must ensure that a registration with the transport has been cleared. See 109*d9f75844SAndroid Build Coastguard Worker // `RegisterWithTransport` for details. 110*d9f75844SAndroid Build Coastguard Worker // TODO(tommi): As a further improvement to this, performing the full 111*d9f75844SAndroid Build Coastguard Worker // destruction on the network thread could be made the default. 112*d9f75844SAndroid Build Coastguard Worker ~VideoReceiveStream2() override; 113*d9f75844SAndroid Build Coastguard Worker 114*d9f75844SAndroid Build Coastguard Worker // Called on `packet_sequence_checker_` to register/unregister with the 115*d9f75844SAndroid Build Coastguard Worker // network transport. 116*d9f75844SAndroid Build Coastguard Worker void RegisterWithTransport( 117*d9f75844SAndroid Build Coastguard Worker RtpStreamReceiverControllerInterface* receiver_controller); 118*d9f75844SAndroid Build Coastguard Worker // If registration has previously been done (via `RegisterWithTransport`) then 119*d9f75844SAndroid Build Coastguard Worker // `UnregisterFromTransport` must be called prior to destruction, on the 120*d9f75844SAndroid Build Coastguard Worker // network thread. 121*d9f75844SAndroid Build Coastguard Worker void UnregisterFromTransport(); 122*d9f75844SAndroid Build Coastguard Worker 123*d9f75844SAndroid Build Coastguard Worker // Accessor for the a/v sync group. This value may change and the caller 124*d9f75844SAndroid Build Coastguard Worker // must be on the packet delivery thread. 125*d9f75844SAndroid Build Coastguard Worker const std::string& sync_group() const; 126*d9f75844SAndroid Build Coastguard Worker 127*d9f75844SAndroid Build Coastguard Worker // Getters for const remote SSRC values that won't change throughout the 128*d9f75844SAndroid Build Coastguard Worker // object's lifetime. remote_ssrc()129*d9f75844SAndroid Build Coastguard Worker uint32_t remote_ssrc() const { return config_.rtp.remote_ssrc; } rtx_ssrc()130*d9f75844SAndroid Build Coastguard Worker uint32_t rtx_ssrc() const { return config_.rtp.rtx_ssrc; } 131*d9f75844SAndroid Build Coastguard Worker 132*d9f75844SAndroid Build Coastguard Worker void SignalNetworkState(NetworkState state); 133*d9f75844SAndroid Build Coastguard Worker bool DeliverRtcp(const uint8_t* packet, size_t length); 134*d9f75844SAndroid Build Coastguard Worker 135*d9f75844SAndroid Build Coastguard Worker void SetSync(Syncable* audio_syncable); 136*d9f75844SAndroid Build Coastguard Worker 137*d9f75844SAndroid Build Coastguard Worker // Updates the `rtp_video_stream_receiver_`'s `local_ssrc` when the default 138*d9f75844SAndroid Build Coastguard Worker // sender has been created, changed or removed. 139*d9f75844SAndroid Build Coastguard Worker void SetLocalSsrc(uint32_t local_ssrc); 140*d9f75844SAndroid Build Coastguard Worker 141*d9f75844SAndroid Build Coastguard Worker // Implements webrtc::VideoReceiveStreamInterface. 142*d9f75844SAndroid Build Coastguard Worker void Start() override; 143*d9f75844SAndroid Build Coastguard Worker void Stop() override; 144*d9f75844SAndroid Build Coastguard Worker 145*d9f75844SAndroid Build Coastguard Worker void SetRtpExtensions(std::vector<RtpExtension> extensions) override; 146*d9f75844SAndroid Build Coastguard Worker RtpHeaderExtensionMap GetRtpExtensionMap() const override; 147*d9f75844SAndroid Build Coastguard Worker bool transport_cc() const override; 148*d9f75844SAndroid Build Coastguard Worker void SetTransportCc(bool transport_cc) override; 149*d9f75844SAndroid Build Coastguard Worker void SetRtcpMode(RtcpMode mode) override; 150*d9f75844SAndroid Build Coastguard Worker void SetFlexFecProtection(RtpPacketSinkInterface* flexfec_sink) override; 151*d9f75844SAndroid Build Coastguard Worker void SetLossNotificationEnabled(bool enabled) override; 152*d9f75844SAndroid Build Coastguard Worker void SetNackHistory(TimeDelta history) override; 153*d9f75844SAndroid Build Coastguard Worker void SetProtectionPayloadTypes(int red_payload_type, 154*d9f75844SAndroid Build Coastguard Worker int ulpfec_payload_type) override; 155*d9f75844SAndroid Build Coastguard Worker void SetRtcpXr(Config::Rtp::RtcpXr rtcp_xr) override; 156*d9f75844SAndroid Build Coastguard Worker void SetAssociatedPayloadTypes( 157*d9f75844SAndroid Build Coastguard Worker std::map<int, int> associated_payload_types) override; 158*d9f75844SAndroid Build Coastguard Worker 159*d9f75844SAndroid Build Coastguard Worker webrtc::VideoReceiveStreamInterface::Stats GetStats() const override; 160*d9f75844SAndroid Build Coastguard Worker 161*d9f75844SAndroid Build Coastguard Worker // SetBaseMinimumPlayoutDelayMs and GetBaseMinimumPlayoutDelayMs are called 162*d9f75844SAndroid Build Coastguard Worker // from webrtc/api level and requested by user code. For e.g. blink/js layer 163*d9f75844SAndroid Build Coastguard Worker // in Chromium. 164*d9f75844SAndroid Build Coastguard Worker bool SetBaseMinimumPlayoutDelayMs(int delay_ms) override; 165*d9f75844SAndroid Build Coastguard Worker int GetBaseMinimumPlayoutDelayMs() const override; 166*d9f75844SAndroid Build Coastguard Worker 167*d9f75844SAndroid Build Coastguard Worker void SetFrameDecryptor( 168*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor) override; 169*d9f75844SAndroid Build Coastguard Worker void SetDepacketizerToDecoderFrameTransformer( 170*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) override; 171*d9f75844SAndroid Build Coastguard Worker 172*d9f75844SAndroid Build Coastguard Worker // Implements rtc::VideoSinkInterface<VideoFrame>. 173*d9f75844SAndroid Build Coastguard Worker void OnFrame(const VideoFrame& video_frame) override; 174*d9f75844SAndroid Build Coastguard Worker 175*d9f75844SAndroid Build Coastguard Worker // Implements RtpVideoStreamReceiver2::OnCompleteFrameCallback. 176*d9f75844SAndroid Build Coastguard Worker void OnCompleteFrame(std::unique_ptr<EncodedFrame> frame) override; 177*d9f75844SAndroid Build Coastguard Worker 178*d9f75844SAndroid Build Coastguard Worker // Implements CallStatsObserver::OnRttUpdate 179*d9f75844SAndroid Build Coastguard Worker void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) override; 180*d9f75844SAndroid Build Coastguard Worker 181*d9f75844SAndroid Build Coastguard Worker // Implements Syncable. 182*d9f75844SAndroid Build Coastguard Worker uint32_t id() const override; 183*d9f75844SAndroid Build Coastguard Worker absl::optional<Syncable::Info> GetInfo() const override; 184*d9f75844SAndroid Build Coastguard Worker bool GetPlayoutRtpTimestamp(uint32_t* rtp_timestamp, 185*d9f75844SAndroid Build Coastguard Worker int64_t* time_ms) const override; 186*d9f75844SAndroid Build Coastguard Worker void SetEstimatedPlayoutNtpTimestampMs(int64_t ntp_timestamp_ms, 187*d9f75844SAndroid Build Coastguard Worker int64_t time_ms) override; 188*d9f75844SAndroid Build Coastguard Worker 189*d9f75844SAndroid Build Coastguard Worker // SetMinimumPlayoutDelay is only called by A/V sync. 190*d9f75844SAndroid Build Coastguard Worker bool SetMinimumPlayoutDelay(int delay_ms) override; 191*d9f75844SAndroid Build Coastguard Worker 192*d9f75844SAndroid Build Coastguard Worker std::vector<webrtc::RtpSource> GetSources() const override; 193*d9f75844SAndroid Build Coastguard Worker 194*d9f75844SAndroid Build Coastguard Worker RecordingState SetAndGetRecordingState(RecordingState state, 195*d9f75844SAndroid Build Coastguard Worker bool generate_key_frame) override; 196*d9f75844SAndroid Build Coastguard Worker void GenerateKeyFrame() override; 197*d9f75844SAndroid Build Coastguard Worker 198*d9f75844SAndroid Build Coastguard Worker private: 199*d9f75844SAndroid Build Coastguard Worker // FrameSchedulingReceiver implementation. 200*d9f75844SAndroid Build Coastguard Worker // Called on packet sequence. 201*d9f75844SAndroid Build Coastguard Worker void OnEncodedFrame(std::unique_ptr<EncodedFrame> frame) override; 202*d9f75844SAndroid Build Coastguard Worker // Called on packet sequence. 203*d9f75844SAndroid Build Coastguard Worker void OnDecodableFrameTimeout(TimeDelta wait) override; 204*d9f75844SAndroid Build Coastguard Worker 205*d9f75844SAndroid Build Coastguard Worker void CreateAndRegisterExternalDecoder(const Decoder& decoder); 206*d9f75844SAndroid Build Coastguard Worker 207*d9f75844SAndroid Build Coastguard Worker struct DecodeFrameResult { 208*d9f75844SAndroid Build Coastguard Worker // True if the decoder returned code WEBRTC_VIDEO_CODEC_OK_REQUEST_KEYFRAME, 209*d9f75844SAndroid Build Coastguard Worker // or if the decoder failed and a keyframe is required. When true, a 210*d9f75844SAndroid Build Coastguard Worker // keyframe request should be sent even if a keyframe request was sent 211*d9f75844SAndroid Build Coastguard Worker // recently. 212*d9f75844SAndroid Build Coastguard Worker bool force_request_key_frame; 213*d9f75844SAndroid Build Coastguard Worker 214*d9f75844SAndroid Build Coastguard Worker // The picture id of the frame that was decoded, or nullopt if the frame was 215*d9f75844SAndroid Build Coastguard Worker // not decoded. 216*d9f75844SAndroid Build Coastguard Worker absl::optional<int64_t> decoded_frame_picture_id; 217*d9f75844SAndroid Build Coastguard Worker 218*d9f75844SAndroid Build Coastguard Worker // True if the next frame decoded must be a keyframe. This value will set 219*d9f75844SAndroid Build Coastguard Worker // the value of `keyframe_required_`, which will force the frame buffer to 220*d9f75844SAndroid Build Coastguard Worker // drop all frames that are not keyframes. 221*d9f75844SAndroid Build Coastguard Worker bool keyframe_required; 222*d9f75844SAndroid Build Coastguard Worker }; 223*d9f75844SAndroid Build Coastguard Worker 224*d9f75844SAndroid Build Coastguard Worker DecodeFrameResult HandleEncodedFrameOnDecodeQueue( 225*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<EncodedFrame> frame, 226*d9f75844SAndroid Build Coastguard Worker bool keyframe_request_is_due, 227*d9f75844SAndroid Build Coastguard Worker bool keyframe_required) RTC_RUN_ON(decode_queue_); 228*d9f75844SAndroid Build Coastguard Worker void UpdatePlayoutDelays() const 229*d9f75844SAndroid Build Coastguard Worker RTC_EXCLUSIVE_LOCKS_REQUIRED(worker_sequence_checker_); 230*d9f75844SAndroid Build Coastguard Worker void RequestKeyFrame(Timestamp now) RTC_RUN_ON(packet_sequence_checker_); 231*d9f75844SAndroid Build Coastguard Worker void HandleKeyFrameGeneration(bool received_frame_is_keyframe, 232*d9f75844SAndroid Build Coastguard Worker Timestamp now, 233*d9f75844SAndroid Build Coastguard Worker bool always_request_key_frame, 234*d9f75844SAndroid Build Coastguard Worker bool keyframe_request_is_due) 235*d9f75844SAndroid Build Coastguard Worker RTC_RUN_ON(packet_sequence_checker_); 236*d9f75844SAndroid Build Coastguard Worker bool IsReceivingKeyFrame(Timestamp timestamp) const 237*d9f75844SAndroid Build Coastguard Worker RTC_RUN_ON(packet_sequence_checker_); 238*d9f75844SAndroid Build Coastguard Worker int DecodeAndMaybeDispatchEncodedFrame(std::unique_ptr<EncodedFrame> frame) 239*d9f75844SAndroid Build Coastguard Worker RTC_RUN_ON(decode_queue_); 240*d9f75844SAndroid Build Coastguard Worker 241*d9f75844SAndroid Build Coastguard Worker void UpdateHistograms(); 242*d9f75844SAndroid Build Coastguard Worker 243*d9f75844SAndroid Build Coastguard Worker RTC_NO_UNIQUE_ADDRESS SequenceChecker worker_sequence_checker_; 244*d9f75844SAndroid Build Coastguard Worker // TODO(bugs.webrtc.org/11993): This checker conceptually represents 245*d9f75844SAndroid Build Coastguard Worker // operations that belong to the network thread. The Call class is currently 246*d9f75844SAndroid Build Coastguard Worker // moving towards handling network packets on the network thread and while 247*d9f75844SAndroid Build Coastguard Worker // that work is ongoing, this checker may in practice represent the worker 248*d9f75844SAndroid Build Coastguard Worker // thread, but still serves as a mechanism of grouping together concepts 249*d9f75844SAndroid Build Coastguard Worker // that belong to the network thread. Once the packets are fully delivered 250*d9f75844SAndroid Build Coastguard Worker // on the network thread, this comment will be deleted. 251*d9f75844SAndroid Build Coastguard Worker RTC_NO_UNIQUE_ADDRESS SequenceChecker packet_sequence_checker_; 252*d9f75844SAndroid Build Coastguard Worker 253*d9f75844SAndroid Build Coastguard Worker TaskQueueFactory* const task_queue_factory_; 254*d9f75844SAndroid Build Coastguard Worker 255*d9f75844SAndroid Build Coastguard Worker TransportAdapter transport_adapter_; 256*d9f75844SAndroid Build Coastguard Worker const VideoReceiveStreamInterface::Config config_; 257*d9f75844SAndroid Build Coastguard Worker const int num_cpu_cores_; 258*d9f75844SAndroid Build Coastguard Worker Call* const call_; 259*d9f75844SAndroid Build Coastguard Worker Clock* const clock_; 260*d9f75844SAndroid Build Coastguard Worker 261*d9f75844SAndroid Build Coastguard Worker CallStats* const call_stats_; 262*d9f75844SAndroid Build Coastguard Worker 263*d9f75844SAndroid Build Coastguard Worker bool decoder_running_ RTC_GUARDED_BY(worker_sequence_checker_) = false; 264*d9f75844SAndroid Build Coastguard Worker bool decoder_stopped_ RTC_GUARDED_BY(decode_queue_) = true; 265*d9f75844SAndroid Build Coastguard Worker 266*d9f75844SAndroid Build Coastguard Worker SourceTracker source_tracker_; 267*d9f75844SAndroid Build Coastguard Worker ReceiveStatisticsProxy stats_proxy_; 268*d9f75844SAndroid Build Coastguard Worker // Shared by media and rtx stream receivers, since the latter has no RtpRtcp 269*d9f75844SAndroid Build Coastguard Worker // module of its own. 270*d9f75844SAndroid Build Coastguard Worker const std::unique_ptr<ReceiveStatistics> rtp_receive_statistics_; 271*d9f75844SAndroid Build Coastguard Worker 272*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<VCMTiming> timing_; // Jitter buffer experiment. 273*d9f75844SAndroid Build Coastguard Worker VideoReceiver2 video_receiver_; 274*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<rtc::VideoSinkInterface<VideoFrame>> incoming_video_stream_; 275*d9f75844SAndroid Build Coastguard Worker RtpVideoStreamReceiver2 rtp_video_stream_receiver_; 276*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<VideoStreamDecoder> video_stream_decoder_; 277*d9f75844SAndroid Build Coastguard Worker RtpStreamsSynchronizer rtp_stream_sync_; 278*d9f75844SAndroid Build Coastguard Worker 279*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<VideoStreamBufferController> buffer_; 280*d9f75844SAndroid Build Coastguard Worker 281*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<RtpStreamReceiverInterface> media_receiver_ 282*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 283*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<RtxReceiveStream> rtx_receive_stream_ 284*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 285*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<RtpStreamReceiverInterface> rtx_receiver_ 286*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 287*d9f75844SAndroid Build Coastguard Worker 288*d9f75844SAndroid Build Coastguard Worker // Whenever we are in an undecodable state (stream has just started or due to 289*d9f75844SAndroid Build Coastguard Worker // a decoding error) we require a keyframe to restart the stream. 290*d9f75844SAndroid Build Coastguard Worker bool keyframe_required_ RTC_GUARDED_BY(packet_sequence_checker_) = true; 291*d9f75844SAndroid Build Coastguard Worker 292*d9f75844SAndroid Build Coastguard Worker // If we have successfully decoded any frame. 293*d9f75844SAndroid Build Coastguard Worker bool frame_decoded_ RTC_GUARDED_BY(decode_queue_) = false; 294*d9f75844SAndroid Build Coastguard Worker 295*d9f75844SAndroid Build Coastguard Worker absl::optional<Timestamp> last_keyframe_request_ 296*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 297*d9f75844SAndroid Build Coastguard Worker 298*d9f75844SAndroid Build Coastguard Worker // Keyframe request intervals are configurable through field trials. 299*d9f75844SAndroid Build Coastguard Worker TimeDelta max_wait_for_keyframe_ RTC_GUARDED_BY(packet_sequence_checker_); 300*d9f75844SAndroid Build Coastguard Worker TimeDelta max_wait_for_frame_ RTC_GUARDED_BY(packet_sequence_checker_); 301*d9f75844SAndroid Build Coastguard Worker 302*d9f75844SAndroid Build Coastguard Worker // All of them tries to change current min_playout_delay on `timing_` but 303*d9f75844SAndroid Build Coastguard Worker // source of the change request is different in each case. Among them the 304*d9f75844SAndroid Build Coastguard Worker // biggest delay is used. -1 means use default value from the `timing_`. 305*d9f75844SAndroid Build Coastguard Worker // 306*d9f75844SAndroid Build Coastguard Worker // Minimum delay as decided by the RTP playout delay extension. 307*d9f75844SAndroid Build Coastguard Worker absl::optional<TimeDelta> frame_minimum_playout_delay_ 308*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(worker_sequence_checker_); 309*d9f75844SAndroid Build Coastguard Worker // Minimum delay as decided by the setLatency function in "webrtc/api". 310*d9f75844SAndroid Build Coastguard Worker absl::optional<TimeDelta> base_minimum_playout_delay_ 311*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(worker_sequence_checker_); 312*d9f75844SAndroid Build Coastguard Worker // Minimum delay as decided by the A/V synchronization feature. 313*d9f75844SAndroid Build Coastguard Worker absl::optional<TimeDelta> syncable_minimum_playout_delay_ 314*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(worker_sequence_checker_); 315*d9f75844SAndroid Build Coastguard Worker 316*d9f75844SAndroid Build Coastguard Worker // Maximum delay as decided by the RTP playout delay extension. 317*d9f75844SAndroid Build Coastguard Worker absl::optional<TimeDelta> frame_maximum_playout_delay_ 318*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(worker_sequence_checker_); 319*d9f75844SAndroid Build Coastguard Worker 320*d9f75844SAndroid Build Coastguard Worker // Function that is triggered with encoded frames, if not empty. 321*d9f75844SAndroid Build Coastguard Worker std::function<void(const RecordableEncodedFrame&)> 322*d9f75844SAndroid Build Coastguard Worker encoded_frame_buffer_function_ RTC_GUARDED_BY(decode_queue_); 323*d9f75844SAndroid Build Coastguard Worker // Set to true while we're requesting keyframes but not yet received one. 324*d9f75844SAndroid Build Coastguard Worker bool keyframe_generation_requested_ RTC_GUARDED_BY(packet_sequence_checker_) = 325*d9f75844SAndroid Build Coastguard Worker false; 326*d9f75844SAndroid Build Coastguard Worker // Lock to avoid unnecessary per-frame idle wakeups in the code. 327*d9f75844SAndroid Build Coastguard Worker webrtc::Mutex pending_resolution_mutex_; 328*d9f75844SAndroid Build Coastguard Worker // Signal from decode queue to OnFrame callback to fill pending_resolution_. 329*d9f75844SAndroid Build Coastguard Worker // absl::nullopt - no resolution needed. 0x0 - next OnFrame to fill with 330*d9f75844SAndroid Build Coastguard Worker // received resolution. Not 0x0 - OnFrame has filled a resolution. 331*d9f75844SAndroid Build Coastguard Worker absl::optional<RecordableEncodedFrame::EncodedResolution> pending_resolution_ 332*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(pending_resolution_mutex_); 333*d9f75844SAndroid Build Coastguard Worker // Buffered encoded frames held while waiting for decoded resolution. 334*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<EncodedFrame>> buffered_encoded_frames_ 335*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(decode_queue_); 336*d9f75844SAndroid Build Coastguard Worker 337*d9f75844SAndroid Build Coastguard Worker // Defined last so they are destroyed before all other members. 338*d9f75844SAndroid Build Coastguard Worker rtc::TaskQueue decode_queue_; 339*d9f75844SAndroid Build Coastguard Worker 340*d9f75844SAndroid Build Coastguard Worker // Used to signal destruction to potentially pending tasks. 341*d9f75844SAndroid Build Coastguard Worker ScopedTaskSafety task_safety_; 342*d9f75844SAndroid Build Coastguard Worker }; 343*d9f75844SAndroid Build Coastguard Worker 344*d9f75844SAndroid Build Coastguard Worker } // namespace internal 345*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 346*d9f75844SAndroid Build Coastguard Worker 347*d9f75844SAndroid Build Coastguard Worker #endif // VIDEO_VIDEO_RECEIVE_STREAM2_H_ 348