xref: /aosp_15_r20/external/webrtc/video/rtp_video_stream_receiver2.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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