1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2012 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_RTP_VIDEO_STREAM_RECEIVER2_H_ 12*d9f75844SAndroid Build Coastguard Worker #define VIDEO_RTP_VIDEO_STREAM_RECEIVER2_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 "absl/types/optional.h" 20*d9f75844SAndroid Build Coastguard Worker #include "api/crypto/frame_decryptor_interface.h" 21*d9f75844SAndroid Build Coastguard Worker #include "api/sequence_checker.h" 22*d9f75844SAndroid Build Coastguard Worker #include "api/units/timestamp.h" 23*d9f75844SAndroid Build Coastguard Worker #include "api/video/color_space.h" 24*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_codec_type.h" 25*d9f75844SAndroid Build Coastguard Worker #include "call/rtp_packet_sink_interface.h" 26*d9f75844SAndroid Build Coastguard Worker #include "call/syncable.h" 27*d9f75844SAndroid Build Coastguard Worker #include "call/video_receive_stream.h" 28*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/include/receive_statistics.h" 29*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/include/remote_ntp_time_estimator.h" 30*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/include/rtp_header_extension_map.h" 31*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" 32*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/absolute_capture_time_interpolator.h" 33*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/capture_clock_offset_updater.h" 34*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_dependency_descriptor_extension.h" 35*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_packet_received.h" 36*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_rtcp_impl2.h" 37*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_rtcp_interface.h" 38*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_video_header.h" 39*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/video_rtp_depacketizer.h" 40*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/h264_sps_pps_tracker.h" 41*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/loss_notification_controller.h" 42*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/nack_requester.h" 43*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/packet_buffer.h" 44*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/rtp_frame_reference_finder.h" 45*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/experiments/field_trial_parser.h" 46*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/numerics/sequence_number_util.h" 47*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/system/no_unique_address.h" 48*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/thread_annotations.h" 49*d9f75844SAndroid Build Coastguard Worker #include "video/buffered_frame_decryptor.h" 50*d9f75844SAndroid Build Coastguard Worker #include "video/rtp_video_stream_receiver_frame_transformer_delegate.h" 51*d9f75844SAndroid Build Coastguard Worker #include "video/unique_timestamp_counter.h" 52*d9f75844SAndroid Build Coastguard Worker 53*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 54*d9f75844SAndroid Build Coastguard Worker 55*d9f75844SAndroid Build Coastguard Worker class NackRequester; 56*d9f75844SAndroid Build Coastguard Worker class PacketRouter; 57*d9f75844SAndroid Build Coastguard Worker class ReceiveStatistics; 58*d9f75844SAndroid Build Coastguard Worker class RtcpRttStats; 59*d9f75844SAndroid Build Coastguard Worker class RtpPacketReceived; 60*d9f75844SAndroid Build Coastguard Worker class Transport; 61*d9f75844SAndroid Build Coastguard Worker class UlpfecReceiver; 62*d9f75844SAndroid Build Coastguard Worker 63*d9f75844SAndroid Build Coastguard Worker class RtpVideoStreamReceiver2 : public LossNotificationSender, 64*d9f75844SAndroid Build Coastguard Worker public RecoveredPacketReceiver, 65*d9f75844SAndroid Build Coastguard Worker public RtpPacketSinkInterface, 66*d9f75844SAndroid Build Coastguard Worker public KeyFrameRequestSender, 67*d9f75844SAndroid Build Coastguard Worker public NackSender, 68*d9f75844SAndroid Build Coastguard Worker public OnDecryptedFrameCallback, 69*d9f75844SAndroid Build Coastguard Worker public OnDecryptionStatusChangeCallback, 70*d9f75844SAndroid Build Coastguard Worker public RtpVideoFrameReceiver { 71*d9f75844SAndroid Build Coastguard Worker public: 72*d9f75844SAndroid Build Coastguard Worker // A complete frame is a frame which has received all its packets and all its 73*d9f75844SAndroid Build Coastguard Worker // references are known. 74*d9f75844SAndroid Build Coastguard Worker class OnCompleteFrameCallback { 75*d9f75844SAndroid Build Coastguard Worker public: ~OnCompleteFrameCallback()76*d9f75844SAndroid Build Coastguard Worker virtual ~OnCompleteFrameCallback() {} 77*d9f75844SAndroid Build Coastguard Worker virtual void OnCompleteFrame(std::unique_ptr<EncodedFrame> frame) = 0; 78*d9f75844SAndroid Build Coastguard Worker }; 79*d9f75844SAndroid Build Coastguard Worker 80*d9f75844SAndroid Build Coastguard Worker RtpVideoStreamReceiver2( 81*d9f75844SAndroid Build Coastguard Worker TaskQueueBase* current_queue, 82*d9f75844SAndroid Build Coastguard Worker Clock* clock, 83*d9f75844SAndroid Build Coastguard Worker Transport* transport, 84*d9f75844SAndroid Build Coastguard Worker RtcpRttStats* rtt_stats, 85*d9f75844SAndroid Build Coastguard Worker // The packet router is optional; if provided, the RtpRtcp module for this 86*d9f75844SAndroid Build Coastguard Worker // stream is registered as a candidate for sending REMB and transport 87*d9f75844SAndroid Build Coastguard Worker // feedback. 88*d9f75844SAndroid Build Coastguard Worker PacketRouter* packet_router, 89*d9f75844SAndroid Build Coastguard Worker const VideoReceiveStreamInterface::Config* config, 90*d9f75844SAndroid Build Coastguard Worker ReceiveStatistics* rtp_receive_statistics, 91*d9f75844SAndroid Build Coastguard Worker RtcpPacketTypeCounterObserver* rtcp_packet_type_counter_observer, 92*d9f75844SAndroid Build Coastguard Worker RtcpCnameCallback* rtcp_cname_callback, 93*d9f75844SAndroid Build Coastguard Worker NackPeriodicProcessor* nack_periodic_processor, 94*d9f75844SAndroid Build Coastguard Worker // The KeyFrameRequestSender is optional; if not provided, key frame 95*d9f75844SAndroid Build Coastguard Worker // requests are sent via the internal RtpRtcp module. 96*d9f75844SAndroid Build Coastguard Worker OnCompleteFrameCallback* complete_frame_callback, 97*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor, 98*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<FrameTransformerInterface> frame_transformer, 99*d9f75844SAndroid Build Coastguard Worker const FieldTrialsView& field_trials, 100*d9f75844SAndroid Build Coastguard Worker RtcEventLog* event_log); 101*d9f75844SAndroid Build Coastguard Worker ~RtpVideoStreamReceiver2() override; 102*d9f75844SAndroid Build Coastguard Worker 103*d9f75844SAndroid Build Coastguard Worker void AddReceiveCodec(uint8_t payload_type, 104*d9f75844SAndroid Build Coastguard Worker VideoCodecType video_codec, 105*d9f75844SAndroid Build Coastguard Worker const std::map<std::string, std::string>& codec_params, 106*d9f75844SAndroid Build Coastguard Worker bool raw_payload); 107*d9f75844SAndroid Build Coastguard Worker void RemoveReceiveCodec(uint8_t payload_type); 108*d9f75844SAndroid Build Coastguard Worker 109*d9f75844SAndroid Build Coastguard Worker // Clears state for all receive codecs added via `AddReceiveCodec`. 110*d9f75844SAndroid Build Coastguard Worker void RemoveReceiveCodecs(); 111*d9f75844SAndroid Build Coastguard Worker 112*d9f75844SAndroid Build Coastguard Worker void StartReceive(); 113*d9f75844SAndroid Build Coastguard Worker void StopReceive(); 114*d9f75844SAndroid Build Coastguard Worker 115*d9f75844SAndroid Build Coastguard Worker // Produces the transport-related timestamps; current_delay_ms is left unset. 116*d9f75844SAndroid Build Coastguard Worker absl::optional<Syncable::Info> GetSyncInfo() const; 117*d9f75844SAndroid Build Coastguard Worker 118*d9f75844SAndroid Build Coastguard Worker bool DeliverRtcp(const uint8_t* rtcp_packet, size_t rtcp_packet_length); 119*d9f75844SAndroid Build Coastguard Worker 120*d9f75844SAndroid Build Coastguard Worker void FrameContinuous(int64_t seq_num); 121*d9f75844SAndroid Build Coastguard Worker 122*d9f75844SAndroid Build Coastguard Worker void FrameDecoded(int64_t seq_num); 123*d9f75844SAndroid Build Coastguard Worker 124*d9f75844SAndroid Build Coastguard Worker void SignalNetworkState(NetworkState state); 125*d9f75844SAndroid Build Coastguard Worker 126*d9f75844SAndroid Build Coastguard Worker // Returns number of different frames seen. GetUniqueFramesSeen()127*d9f75844SAndroid Build Coastguard Worker int GetUniqueFramesSeen() const { 128*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(&packet_sequence_checker_); 129*d9f75844SAndroid Build Coastguard Worker return frame_counter_.GetUniqueSeen(); 130*d9f75844SAndroid Build Coastguard Worker } 131*d9f75844SAndroid Build Coastguard Worker 132*d9f75844SAndroid Build Coastguard Worker // Implements RtpPacketSinkInterface. 133*d9f75844SAndroid Build Coastguard Worker void OnRtpPacket(const RtpPacketReceived& packet) override; 134*d9f75844SAndroid Build Coastguard Worker 135*d9f75844SAndroid Build Coastguard Worker // Public only for tests. 136*d9f75844SAndroid Build Coastguard Worker void OnReceivedPayloadData(rtc::CopyOnWriteBuffer codec_payload, 137*d9f75844SAndroid Build Coastguard Worker const RtpPacketReceived& rtp_packet, 138*d9f75844SAndroid Build Coastguard Worker const RTPVideoHeader& video); 139*d9f75844SAndroid Build Coastguard Worker 140*d9f75844SAndroid Build Coastguard Worker // Implements RecoveredPacketReceiver. 141*d9f75844SAndroid Build Coastguard Worker void OnRecoveredPacket(const uint8_t* packet, size_t packet_length) override; 142*d9f75844SAndroid Build Coastguard Worker 143*d9f75844SAndroid Build Coastguard Worker // Send an RTCP keyframe request. 144*d9f75844SAndroid Build Coastguard Worker void RequestKeyFrame() override; 145*d9f75844SAndroid Build Coastguard Worker 146*d9f75844SAndroid Build Coastguard Worker // Implements NackSender. 147*d9f75844SAndroid Build Coastguard Worker void SendNack(const std::vector<uint16_t>& sequence_numbers, 148*d9f75844SAndroid Build Coastguard Worker bool buffering_allowed) override; 149*d9f75844SAndroid Build Coastguard Worker 150*d9f75844SAndroid Build Coastguard Worker // Implements LossNotificationSender. 151*d9f75844SAndroid Build Coastguard Worker void SendLossNotification(uint16_t last_decoded_seq_num, 152*d9f75844SAndroid Build Coastguard Worker uint16_t last_received_seq_num, 153*d9f75844SAndroid Build Coastguard Worker bool decodability_flag, 154*d9f75844SAndroid Build Coastguard Worker bool buffering_allowed) override; 155*d9f75844SAndroid Build Coastguard Worker 156*d9f75844SAndroid Build Coastguard Worker // Returns true if a decryptor is attached and frames can be decrypted. 157*d9f75844SAndroid Build Coastguard Worker // Updated by OnDecryptionStatusChangeCallback. Note this refers to Frame 158*d9f75844SAndroid Build Coastguard Worker // Decryption not SRTP. 159*d9f75844SAndroid Build Coastguard Worker bool IsDecryptable() const; 160*d9f75844SAndroid Build Coastguard Worker 161*d9f75844SAndroid Build Coastguard Worker // Implements OnDecryptedFrameCallback. 162*d9f75844SAndroid Build Coastguard Worker void OnDecryptedFrame(std::unique_ptr<RtpFrameObject> frame) override; 163*d9f75844SAndroid Build Coastguard Worker 164*d9f75844SAndroid Build Coastguard Worker // Implements OnDecryptionStatusChangeCallback. 165*d9f75844SAndroid Build Coastguard Worker void OnDecryptionStatusChange( 166*d9f75844SAndroid Build Coastguard Worker FrameDecryptorInterface::Status status) override; 167*d9f75844SAndroid Build Coastguard Worker 168*d9f75844SAndroid Build Coastguard Worker // Optionally set a frame decryptor after a stream has started. This will not 169*d9f75844SAndroid Build Coastguard Worker // reset the decoder state. 170*d9f75844SAndroid Build Coastguard Worker void SetFrameDecryptor( 171*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor); 172*d9f75844SAndroid Build Coastguard Worker 173*d9f75844SAndroid Build Coastguard Worker // Sets a frame transformer after a stream has started, if no transformer 174*d9f75844SAndroid Build Coastguard Worker // has previously been set. Does not reset the decoder state. 175*d9f75844SAndroid Build Coastguard Worker void SetDepacketizerToDecoderFrameTransformer( 176*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<FrameTransformerInterface> frame_transformer); 177*d9f75844SAndroid Build Coastguard Worker 178*d9f75844SAndroid Build Coastguard Worker // Updates the rtp header extensions at runtime. Must be called on the 179*d9f75844SAndroid Build Coastguard Worker // `packet_sequence_checker_` thread. 180*d9f75844SAndroid Build Coastguard Worker void SetRtpExtensions(const std::vector<RtpExtension>& extensions); 181*d9f75844SAndroid Build Coastguard Worker const RtpHeaderExtensionMap& GetRtpExtensions() const; 182*d9f75844SAndroid Build Coastguard Worker 183*d9f75844SAndroid Build Coastguard Worker // Called by VideoReceiveStreamInterface when stats are updated. 184*d9f75844SAndroid Build Coastguard Worker void UpdateRtt(int64_t max_rtt_ms); 185*d9f75844SAndroid Build Coastguard Worker 186*d9f75844SAndroid Build Coastguard Worker // Called when the local_ssrc is changed to match with a sender. 187*d9f75844SAndroid Build Coastguard Worker void OnLocalSsrcChange(uint32_t local_ssrc); 188*d9f75844SAndroid Build Coastguard Worker 189*d9f75844SAndroid Build Coastguard Worker // Forwards the call to set rtcp_sender_ to the RTCP mode of the rtcp sender. 190*d9f75844SAndroid Build Coastguard Worker void SetRtcpMode(RtcpMode mode); 191*d9f75844SAndroid Build Coastguard Worker 192*d9f75844SAndroid Build Coastguard Worker void SetReferenceTimeReport(bool enabled); 193*d9f75844SAndroid Build Coastguard Worker 194*d9f75844SAndroid Build Coastguard Worker // Sets or clears the callback sink that gets called for RTP packets. Used for 195*d9f75844SAndroid Build Coastguard Worker // packet handlers such as FlexFec. Must be called on the packet delivery 196*d9f75844SAndroid Build Coastguard Worker // thread (same context as `OnRtpPacket` is called on). 197*d9f75844SAndroid Build Coastguard Worker // TODO(bugs.webrtc.org/11993): Packet delivery thread today means `worker 198*d9f75844SAndroid Build Coastguard Worker // thread` but will be `network thread`. 199*d9f75844SAndroid Build Coastguard Worker void SetPacketSink(RtpPacketSinkInterface* packet_sink); 200*d9f75844SAndroid Build Coastguard Worker 201*d9f75844SAndroid Build Coastguard Worker // Turns on/off loss notifications. Must be called on the packet delivery 202*d9f75844SAndroid Build Coastguard Worker // thread. 203*d9f75844SAndroid Build Coastguard Worker void SetLossNotificationEnabled(bool enabled); 204*d9f75844SAndroid Build Coastguard Worker 205*d9f75844SAndroid Build Coastguard Worker void SetNackHistory(TimeDelta history); 206*d9f75844SAndroid Build Coastguard Worker 207*d9f75844SAndroid Build Coastguard Worker int ulpfec_payload_type() const; 208*d9f75844SAndroid Build Coastguard Worker int red_payload_type() const; 209*d9f75844SAndroid Build Coastguard Worker void SetProtectionPayloadTypes(int red_payload_type, int ulpfec_payload_type); 210*d9f75844SAndroid Build Coastguard Worker 211*d9f75844SAndroid Build Coastguard Worker absl::optional<int64_t> LastReceivedPacketMs() const; 212*d9f75844SAndroid Build Coastguard Worker absl::optional<int64_t> LastReceivedKeyframePacketMs() const; 213*d9f75844SAndroid Build Coastguard Worker 214*d9f75844SAndroid Build Coastguard Worker private: 215*d9f75844SAndroid Build Coastguard Worker // Implements RtpVideoFrameReceiver. 216*d9f75844SAndroid Build Coastguard Worker void ManageFrame(std::unique_ptr<RtpFrameObject> frame) override; 217*d9f75844SAndroid Build Coastguard Worker 218*d9f75844SAndroid Build Coastguard Worker void OnCompleteFrames(RtpFrameReferenceFinder::ReturnVector frame) 219*d9f75844SAndroid Build Coastguard Worker RTC_RUN_ON(packet_sequence_checker_); 220*d9f75844SAndroid Build Coastguard Worker 221*d9f75844SAndroid Build Coastguard Worker // Used for buffering RTCP feedback messages and sending them all together. 222*d9f75844SAndroid Build Coastguard Worker // Note: 223*d9f75844SAndroid Build Coastguard Worker // 1. Key frame requests and NACKs are mutually exclusive, with the 224*d9f75844SAndroid Build Coastguard Worker // former taking precedence over the latter. 225*d9f75844SAndroid Build Coastguard Worker // 2. Loss notifications are orthogonal to either. (That is, may be sent 226*d9f75844SAndroid Build Coastguard Worker // alongside either.) 227*d9f75844SAndroid Build Coastguard Worker class RtcpFeedbackBuffer : public KeyFrameRequestSender, 228*d9f75844SAndroid Build Coastguard Worker public NackSender, 229*d9f75844SAndroid Build Coastguard Worker public LossNotificationSender { 230*d9f75844SAndroid Build Coastguard Worker public: 231*d9f75844SAndroid Build Coastguard Worker RtcpFeedbackBuffer(KeyFrameRequestSender* key_frame_request_sender, 232*d9f75844SAndroid Build Coastguard Worker NackSender* nack_sender, 233*d9f75844SAndroid Build Coastguard Worker LossNotificationSender* loss_notification_sender); 234*d9f75844SAndroid Build Coastguard Worker 235*d9f75844SAndroid Build Coastguard Worker ~RtcpFeedbackBuffer() override = default; 236*d9f75844SAndroid Build Coastguard Worker 237*d9f75844SAndroid Build Coastguard Worker // KeyFrameRequestSender implementation. 238*d9f75844SAndroid Build Coastguard Worker void RequestKeyFrame() override; 239*d9f75844SAndroid Build Coastguard Worker 240*d9f75844SAndroid Build Coastguard Worker // NackSender implementation. 241*d9f75844SAndroid Build Coastguard Worker void SendNack(const std::vector<uint16_t>& sequence_numbers, 242*d9f75844SAndroid Build Coastguard Worker bool buffering_allowed) override; 243*d9f75844SAndroid Build Coastguard Worker 244*d9f75844SAndroid Build Coastguard Worker // LossNotificationSender implementation. 245*d9f75844SAndroid Build Coastguard Worker void SendLossNotification(uint16_t last_decoded_seq_num, 246*d9f75844SAndroid Build Coastguard Worker uint16_t last_received_seq_num, 247*d9f75844SAndroid Build Coastguard Worker bool decodability_flag, 248*d9f75844SAndroid Build Coastguard Worker bool buffering_allowed) override; 249*d9f75844SAndroid Build Coastguard Worker 250*d9f75844SAndroid Build Coastguard Worker // Send all RTCP feedback messages buffered thus far. 251*d9f75844SAndroid Build Coastguard Worker void SendBufferedRtcpFeedback(); 252*d9f75844SAndroid Build Coastguard Worker 253*d9f75844SAndroid Build Coastguard Worker void ClearLossNotificationState(); 254*d9f75844SAndroid Build Coastguard Worker 255*d9f75844SAndroid Build Coastguard Worker private: 256*d9f75844SAndroid Build Coastguard Worker // LNTF-related state. 257*d9f75844SAndroid Build Coastguard Worker struct LossNotificationState { LossNotificationStateLossNotificationState258*d9f75844SAndroid Build Coastguard Worker LossNotificationState(uint16_t last_decoded_seq_num, 259*d9f75844SAndroid Build Coastguard Worker uint16_t last_received_seq_num, 260*d9f75844SAndroid Build Coastguard Worker bool decodability_flag) 261*d9f75844SAndroid Build Coastguard Worker : last_decoded_seq_num(last_decoded_seq_num), 262*d9f75844SAndroid Build Coastguard Worker last_received_seq_num(last_received_seq_num), 263*d9f75844SAndroid Build Coastguard Worker decodability_flag(decodability_flag) {} 264*d9f75844SAndroid Build Coastguard Worker 265*d9f75844SAndroid Build Coastguard Worker uint16_t last_decoded_seq_num; 266*d9f75844SAndroid Build Coastguard Worker uint16_t last_received_seq_num; 267*d9f75844SAndroid Build Coastguard Worker bool decodability_flag; 268*d9f75844SAndroid Build Coastguard Worker }; 269*d9f75844SAndroid Build Coastguard Worker 270*d9f75844SAndroid Build Coastguard Worker RTC_NO_UNIQUE_ADDRESS SequenceChecker packet_sequence_checker_; 271*d9f75844SAndroid Build Coastguard Worker KeyFrameRequestSender* const key_frame_request_sender_; 272*d9f75844SAndroid Build Coastguard Worker NackSender* const nack_sender_; 273*d9f75844SAndroid Build Coastguard Worker LossNotificationSender* const loss_notification_sender_; 274*d9f75844SAndroid Build Coastguard Worker 275*d9f75844SAndroid Build Coastguard Worker // Key-frame-request-related state. 276*d9f75844SAndroid Build Coastguard Worker bool request_key_frame_ RTC_GUARDED_BY(packet_sequence_checker_); 277*d9f75844SAndroid Build Coastguard Worker 278*d9f75844SAndroid Build Coastguard Worker // NACK-related state. 279*d9f75844SAndroid Build Coastguard Worker std::vector<uint16_t> nack_sequence_numbers_ 280*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 281*d9f75844SAndroid Build Coastguard Worker 282*d9f75844SAndroid Build Coastguard Worker absl::optional<LossNotificationState> lntf_state_ 283*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 284*d9f75844SAndroid Build Coastguard Worker }; 285*d9f75844SAndroid Build Coastguard Worker enum ParseGenericDependenciesResult { 286*d9f75844SAndroid Build Coastguard Worker kDropPacket, 287*d9f75844SAndroid Build Coastguard Worker kHasGenericDescriptor, 288*d9f75844SAndroid Build Coastguard Worker kNoGenericDescriptor 289*d9f75844SAndroid Build Coastguard Worker }; 290*d9f75844SAndroid Build Coastguard Worker 291*d9f75844SAndroid Build Coastguard Worker // Entry point doing non-stats work for a received packet. Called 292*d9f75844SAndroid Build Coastguard Worker // for the same packet both before and after RED decapsulation. 293*d9f75844SAndroid Build Coastguard Worker void ReceivePacket(const RtpPacketReceived& packet) 294*d9f75844SAndroid Build Coastguard Worker RTC_RUN_ON(packet_sequence_checker_); 295*d9f75844SAndroid Build Coastguard Worker 296*d9f75844SAndroid Build Coastguard Worker // Parses and handles RED headers. 297*d9f75844SAndroid Build Coastguard Worker // This function assumes that it's being called from only one thread. 298*d9f75844SAndroid Build Coastguard Worker void ParseAndHandleEncapsulatingHeader(const RtpPacketReceived& packet) 299*d9f75844SAndroid Build Coastguard Worker RTC_RUN_ON(packet_sequence_checker_); 300*d9f75844SAndroid Build Coastguard Worker void NotifyReceiverOfEmptyPacket(uint16_t seq_num) 301*d9f75844SAndroid Build Coastguard Worker RTC_RUN_ON(packet_sequence_checker_); 302*d9f75844SAndroid Build Coastguard Worker bool IsRedEnabled() const; 303*d9f75844SAndroid Build Coastguard Worker void InsertSpsPpsIntoTracker(uint8_t payload_type) 304*d9f75844SAndroid Build Coastguard Worker RTC_RUN_ON(packet_sequence_checker_); 305*d9f75844SAndroid Build Coastguard Worker void OnInsertedPacket(video_coding::PacketBuffer::InsertResult result) 306*d9f75844SAndroid Build Coastguard Worker RTC_RUN_ON(packet_sequence_checker_); 307*d9f75844SAndroid Build Coastguard Worker ParseGenericDependenciesResult ParseGenericDependenciesExtension( 308*d9f75844SAndroid Build Coastguard Worker const RtpPacketReceived& rtp_packet, 309*d9f75844SAndroid Build Coastguard Worker RTPVideoHeader* video_header) RTC_RUN_ON(packet_sequence_checker_); 310*d9f75844SAndroid Build Coastguard Worker void OnAssembledFrame(std::unique_ptr<RtpFrameObject> frame) 311*d9f75844SAndroid Build Coastguard Worker RTC_RUN_ON(packet_sequence_checker_); 312*d9f75844SAndroid Build Coastguard Worker void UpdatePacketReceiveTimestamps(const RtpPacketReceived& packet, 313*d9f75844SAndroid Build Coastguard Worker bool is_keyframe) 314*d9f75844SAndroid Build Coastguard Worker RTC_RUN_ON(packet_sequence_checker_); 315*d9f75844SAndroid Build Coastguard Worker 316*d9f75844SAndroid Build Coastguard Worker const FieldTrialsView& field_trials_; 317*d9f75844SAndroid Build Coastguard Worker TaskQueueBase* const worker_queue_; 318*d9f75844SAndroid Build Coastguard Worker Clock* const clock_; 319*d9f75844SAndroid Build Coastguard Worker // Ownership of this object lies with VideoReceiveStreamInterface, which owns 320*d9f75844SAndroid Build Coastguard Worker // `this`. 321*d9f75844SAndroid Build Coastguard Worker const VideoReceiveStreamInterface::Config& config_; 322*d9f75844SAndroid Build Coastguard Worker PacketRouter* const packet_router_; 323*d9f75844SAndroid Build Coastguard Worker 324*d9f75844SAndroid Build Coastguard Worker RemoteNtpTimeEstimator ntp_estimator_; 325*d9f75844SAndroid Build Coastguard Worker 326*d9f75844SAndroid Build Coastguard Worker RtpHeaderExtensionMap rtp_header_extensions_ 327*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 328*d9f75844SAndroid Build Coastguard Worker // Set by the field trial WebRTC-ForcePlayoutDelay to override any playout 329*d9f75844SAndroid Build Coastguard Worker // delay that is specified in the received packets. 330*d9f75844SAndroid Build Coastguard Worker FieldTrialOptional<int> forced_playout_delay_max_ms_; 331*d9f75844SAndroid Build Coastguard Worker FieldTrialOptional<int> forced_playout_delay_min_ms_; 332*d9f75844SAndroid Build Coastguard Worker ReceiveStatistics* const rtp_receive_statistics_; 333*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<UlpfecReceiver> ulpfec_receiver_ 334*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 335*d9f75844SAndroid Build Coastguard Worker int red_payload_type_ RTC_GUARDED_BY(packet_sequence_checker_); 336*d9f75844SAndroid Build Coastguard Worker 337*d9f75844SAndroid Build Coastguard Worker RTC_NO_UNIQUE_ADDRESS SequenceChecker worker_task_checker_; 338*d9f75844SAndroid Build Coastguard Worker // TODO(bugs.webrtc.org/11993): This checker conceptually represents 339*d9f75844SAndroid Build Coastguard Worker // operations that belong to the network thread. The Call class is currently 340*d9f75844SAndroid Build Coastguard Worker // moving towards handling network packets on the network thread and while 341*d9f75844SAndroid Build Coastguard Worker // that work is ongoing, this checker may in practice represent the worker 342*d9f75844SAndroid Build Coastguard Worker // thread, but still serves as a mechanism of grouping together concepts 343*d9f75844SAndroid Build Coastguard Worker // that belong to the network thread. Once the packets are fully delivered 344*d9f75844SAndroid Build Coastguard Worker // on the network thread, this comment will be deleted. 345*d9f75844SAndroid Build Coastguard Worker RTC_NO_UNIQUE_ADDRESS SequenceChecker packet_sequence_checker_; 346*d9f75844SAndroid Build Coastguard Worker RtpPacketSinkInterface* packet_sink_ RTC_GUARDED_BY(packet_sequence_checker_); 347*d9f75844SAndroid Build Coastguard Worker bool receiving_ RTC_GUARDED_BY(packet_sequence_checker_); 348*d9f75844SAndroid Build Coastguard Worker int64_t last_packet_log_ms_ RTC_GUARDED_BY(packet_sequence_checker_); 349*d9f75844SAndroid Build Coastguard Worker 350*d9f75844SAndroid Build Coastguard Worker const std::unique_ptr<ModuleRtpRtcpImpl2> rtp_rtcp_; 351*d9f75844SAndroid Build Coastguard Worker 352*d9f75844SAndroid Build Coastguard Worker NackPeriodicProcessor* const nack_periodic_processor_; 353*d9f75844SAndroid Build Coastguard Worker OnCompleteFrameCallback* complete_frame_callback_; 354*d9f75844SAndroid Build Coastguard Worker const KeyFrameReqMethod keyframe_request_method_; 355*d9f75844SAndroid Build Coastguard Worker 356*d9f75844SAndroid Build Coastguard Worker RtcpFeedbackBuffer rtcp_feedback_buffer_; 357*d9f75844SAndroid Build Coastguard Worker // TODO(tommi): Consider absl::optional<NackRequester> instead of unique_ptr 358*d9f75844SAndroid Build Coastguard Worker // since nack is usually configured. 359*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<NackRequester> nack_module_ 360*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 361*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<LossNotificationController> loss_notification_controller_ 362*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 363*d9f75844SAndroid Build Coastguard Worker 364*d9f75844SAndroid Build Coastguard Worker video_coding::PacketBuffer packet_buffer_ 365*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 366*d9f75844SAndroid Build Coastguard Worker UniqueTimestampCounter frame_counter_ 367*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 368*d9f75844SAndroid Build Coastguard Worker SeqNumUnwrapper<uint16_t> frame_id_unwrapper_ 369*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 370*d9f75844SAndroid Build Coastguard Worker 371*d9f75844SAndroid Build Coastguard Worker // Video structure provided in the dependency descriptor in a first packet 372*d9f75844SAndroid Build Coastguard Worker // of a key frame. It is required to parse dependency descriptor in the 373*d9f75844SAndroid Build Coastguard Worker // following delta packets. 374*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<FrameDependencyStructure> video_structure_ 375*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 376*d9f75844SAndroid Build Coastguard Worker // Frame id of the last frame with the attached video structure. 377*d9f75844SAndroid Build Coastguard Worker // absl::nullopt when `video_structure_ == nullptr`; 378*d9f75844SAndroid Build Coastguard Worker absl::optional<int64_t> video_structure_frame_id_ 379*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 380*d9f75844SAndroid Build Coastguard Worker 381*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<RtpFrameReferenceFinder> reference_finder_ 382*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 383*d9f75844SAndroid Build Coastguard Worker absl::optional<VideoCodecType> current_codec_ 384*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 385*d9f75844SAndroid Build Coastguard Worker uint32_t last_assembled_frame_rtp_timestamp_ 386*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 387*d9f75844SAndroid Build Coastguard Worker 388*d9f75844SAndroid Build Coastguard Worker std::map<int64_t, uint16_t> last_seq_num_for_pic_id_ 389*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 390*d9f75844SAndroid Build Coastguard Worker video_coding::H264SpsPpsTracker tracker_ 391*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 392*d9f75844SAndroid Build Coastguard Worker 393*d9f75844SAndroid Build Coastguard Worker // Maps payload id to the depacketizer. 394*d9f75844SAndroid Build Coastguard Worker std::map<uint8_t, std::unique_ptr<VideoRtpDepacketizer>> payload_type_map_ 395*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 396*d9f75844SAndroid Build Coastguard Worker 397*d9f75844SAndroid Build Coastguard Worker // TODO(johan): Remove pt_codec_params_ once 398*d9f75844SAndroid Build Coastguard Worker // https://bugs.chromium.org/p/webrtc/issues/detail?id=6883 is resolved. 399*d9f75844SAndroid Build Coastguard Worker // Maps a payload type to a map of out-of-band supplied codec parameters. 400*d9f75844SAndroid Build Coastguard Worker std::map<uint8_t, std::map<std::string, std::string>> pt_codec_params_ 401*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 402*d9f75844SAndroid Build Coastguard Worker int16_t last_payload_type_ RTC_GUARDED_BY(packet_sequence_checker_) = -1; 403*d9f75844SAndroid Build Coastguard Worker 404*d9f75844SAndroid Build Coastguard Worker bool has_received_frame_ RTC_GUARDED_BY(packet_sequence_checker_); 405*d9f75844SAndroid Build Coastguard Worker 406*d9f75844SAndroid Build Coastguard Worker absl::optional<uint32_t> last_received_rtp_timestamp_ 407*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 408*d9f75844SAndroid Build Coastguard Worker absl::optional<uint32_t> last_received_keyframe_rtp_timestamp_ 409*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 410*d9f75844SAndroid Build Coastguard Worker absl::optional<Timestamp> last_received_rtp_system_time_ 411*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 412*d9f75844SAndroid Build Coastguard Worker absl::optional<Timestamp> last_received_keyframe_rtp_system_time_ 413*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 414*d9f75844SAndroid Build Coastguard Worker 415*d9f75844SAndroid Build Coastguard Worker // Handles incoming encrypted frames and forwards them to the 416*d9f75844SAndroid Build Coastguard Worker // rtp_reference_finder if they are decryptable. 417*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<BufferedFrameDecryptor> buffered_frame_decryptor_ 418*d9f75844SAndroid Build Coastguard Worker RTC_PT_GUARDED_BY(packet_sequence_checker_); 419*d9f75844SAndroid Build Coastguard Worker bool frames_decryptable_ RTC_GUARDED_BY(worker_task_checker_); 420*d9f75844SAndroid Build Coastguard Worker absl::optional<ColorSpace> last_color_space_; 421*d9f75844SAndroid Build Coastguard Worker 422*d9f75844SAndroid Build Coastguard Worker AbsoluteCaptureTimeInterpolator absolute_capture_time_interpolator_ 423*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 424*d9f75844SAndroid Build Coastguard Worker 425*d9f75844SAndroid Build Coastguard Worker CaptureClockOffsetUpdater capture_clock_offset_updater_ 426*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 427*d9f75844SAndroid Build Coastguard Worker 428*d9f75844SAndroid Build Coastguard Worker int64_t last_completed_picture_id_ = 0; 429*d9f75844SAndroid Build Coastguard Worker 430*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<RtpVideoStreamReceiverFrameTransformerDelegate> 431*d9f75844SAndroid Build Coastguard Worker frame_transformer_delegate_; 432*d9f75844SAndroid Build Coastguard Worker 433*d9f75844SAndroid Build Coastguard Worker SeqNumUnwrapper<uint16_t> rtp_seq_num_unwrapper_ 434*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 435*d9f75844SAndroid Build Coastguard Worker std::map<int64_t, RtpPacketInfo> packet_infos_ 436*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 437*d9f75844SAndroid Build Coastguard Worker 438*d9f75844SAndroid Build Coastguard Worker Timestamp next_keyframe_request_for_missing_video_structure_ = 439*d9f75844SAndroid Build Coastguard Worker Timestamp::MinusInfinity(); 440*d9f75844SAndroid Build Coastguard Worker }; 441*d9f75844SAndroid Build Coastguard Worker 442*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 443*d9f75844SAndroid Build Coastguard Worker 444*d9f75844SAndroid Build Coastguard Worker #endif // VIDEO_RTP_VIDEO_STREAM_RECEIVER2_H_ 445