#include "video/rtp_video_stream_receiver2.h"
#include <algorithm>
#include <limits>
#include <memory>
#include <utility>
#include <vector>
#include "absl/algorithm/container.h"
#include "absl/memory/memory.h"
#include "absl/types/optional.h"
#include "api/video/video_codec_type.h"
#include "media/base/media_constants.h"
#include "modules/pacing/packet_router.h"
#include "modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
#include "modules/rtp_rtcp/include/receive_statistics.h"
#include "modules/rtp_rtcp/include/rtp_cvo.h"
#include "modules/rtp_rtcp/source/create_video_rtp_depacketizer.h"
#include "modules/rtp_rtcp/source/frame_object.h"
#include "modules/rtp_rtcp/source/rtp_dependency_descriptor_extension.h"
#include "modules/rtp_rtcp/source/rtp_format.h"
#include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor.h"
#include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor_extension.h"
#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "modules/rtp_rtcp/source/rtp_rtcp_config.h"
#include "modules/rtp_rtcp/source/ulpfec_receiver.h"
#include "modules/rtp_rtcp/source/video_rtp_depacketizer.h"
#include "modules/rtp_rtcp/source/video_rtp_depacketizer_raw.h"
#include "modules/video_coding/h264_sprop_parameter_sets.h"
#include "modules/video_coding/h264_sps_pps_tracker.h"
#include "modules/video_coding/nack_requester.h"
#include "modules/video_coding/packet_buffer.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
#include "rtc_base/strings/string_builder.h"
#include "system_wrappers/include/metrics.h"
#include "system_wrappers/include/ntp_time.h"
namespace webrtc {
namespace {
constexpr int kPacketBufferStartSize = …;
constexpr int kPacketBufferMaxSize = …;
constexpr int kMaxPacketAgeToNack = …;
int PacketBufferMaxSize(const FieldTrialsView& field_trials) { … }
std::unique_ptr<ModuleRtpRtcpImpl2> CreateRtpRtcpModule(
const Environment& env,
ReceiveStatistics* receive_statistics,
Transport* outgoing_transport,
RtcpRttStats* rtt_stats,
RtcpPacketTypeCounterObserver* rtcp_packet_type_counter_observer,
RtcpCnameCallback* rtcp_cname_callback,
bool non_sender_rtt_measurement,
uint32_t local_ssrc) { … }
std::unique_ptr<NackRequester> MaybeConstructNackModule(
const Environment& env,
TaskQueueBase* current_queue,
NackPeriodicProcessor* nack_periodic_processor,
const NackConfig& nack,
NackSender* nack_sender,
KeyFrameRequestSender* keyframe_request_sender) { … }
std::unique_ptr<UlpfecReceiver> MaybeConstructUlpfecReceiver(
uint32_t remote_ssrc,
int red_payload_type,
int ulpfec_payload_type,
RecoveredPacketReceiver* callback,
Clock* clock) { … }
static const int kPacketLogIntervalMs = …;
}
RtpVideoStreamReceiver2::RtcpFeedbackBuffer::RtcpFeedbackBuffer(
KeyFrameRequestSender* key_frame_request_sender,
NackSender* nack_sender,
LossNotificationSender* loss_notification_sender)
: … { … }
void RtpVideoStreamReceiver2::RtcpFeedbackBuffer::RequestKeyFrame() { … }
void RtpVideoStreamReceiver2::RtcpFeedbackBuffer::SendNack(
const std::vector<uint16_t>& sequence_numbers,
bool buffering_allowed) { … }
void RtpVideoStreamReceiver2::RtcpFeedbackBuffer::SendLossNotification(
uint16_t last_decoded_seq_num,
uint16_t last_received_seq_num,
bool decodability_flag,
bool buffering_allowed) { … }
void RtpVideoStreamReceiver2::RtcpFeedbackBuffer::SendBufferedRtcpFeedback() { … }
void RtpVideoStreamReceiver2::RtcpFeedbackBuffer::ClearLossNotificationState() { … }
RtpVideoStreamReceiver2::RtpVideoStreamReceiver2(
const Environment& env,
TaskQueueBase* current_queue,
Transport* transport,
RtcpRttStats* rtt_stats,
PacketRouter* packet_router,
const VideoReceiveStreamInterface::Config* config,
ReceiveStatistics* rtp_receive_statistics,
RtcpPacketTypeCounterObserver* rtcp_packet_type_counter_observer,
RtcpCnameCallback* rtcp_cname_callback,
NackPeriodicProcessor* nack_periodic_processor,
OnCompleteFrameCallback* complete_frame_callback,
scoped_refptr<FrameDecryptorInterface> frame_decryptor,
scoped_refptr<FrameTransformerInterface> frame_transformer)
: … { … }
RtpVideoStreamReceiver2::~RtpVideoStreamReceiver2() { … }
void RtpVideoStreamReceiver2::AddReceiveCodec(
uint8_t payload_type,
VideoCodecType video_codec,
const webrtc::CodecParameterMap& codec_params,
bool raw_payload) { … }
void RtpVideoStreamReceiver2::RemoveReceiveCodecs() { … }
absl::optional<Syncable::Info> RtpVideoStreamReceiver2::GetSyncInfo() const { … }
RtpVideoStreamReceiver2::ParseGenericDependenciesResult
RtpVideoStreamReceiver2::ParseGenericDependenciesExtension(
const RtpPacketReceived& rtp_packet,
RTPVideoHeader* video_header) { … }
bool RtpVideoStreamReceiver2::OnReceivedPayloadData(
rtc::CopyOnWriteBuffer codec_payload,
const RtpPacketReceived& rtp_packet,
const RTPVideoHeader& video,
int times_nacked) { … }
void RtpVideoStreamReceiver2::OnRecoveredPacket(
const RtpPacketReceived& packet) { … }
void RtpVideoStreamReceiver2::OnRtpPacket(const RtpPacketReceived& packet) { … }
void RtpVideoStreamReceiver2::RequestKeyFrame() { … }
void RtpVideoStreamReceiver2::SendNack(
const std::vector<uint16_t>& sequence_numbers,
bool ) { … }
void RtpVideoStreamReceiver2::SendLossNotification(
uint16_t last_decoded_seq_num,
uint16_t last_received_seq_num,
bool decodability_flag,
bool buffering_allowed) { … }
bool RtpVideoStreamReceiver2::IsDecryptable() const { … }
void RtpVideoStreamReceiver2::OnInsertedPacket(
video_coding::PacketBuffer::InsertResult result) { … }
void RtpVideoStreamReceiver2::OnAssembledFrame(
std::unique_ptr<RtpFrameObject> frame) { … }
void RtpVideoStreamReceiver2::OnCompleteFrames(
RtpFrameReferenceFinder::ReturnVector frames) { … }
void RtpVideoStreamReceiver2::OnDecryptedFrame(
std::unique_ptr<RtpFrameObject> frame) { … }
void RtpVideoStreamReceiver2::OnDecryptionStatusChange(
FrameDecryptorInterface::Status status) { … }
void RtpVideoStreamReceiver2::SetFrameDecryptor(
rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor) { … }
void RtpVideoStreamReceiver2::SetDepacketizerToDecoderFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) { … }
void RtpVideoStreamReceiver2::UpdateRtt(int64_t max_rtt_ms) { … }
void RtpVideoStreamReceiver2::OnLocalSsrcChange(uint32_t local_ssrc) { … }
void RtpVideoStreamReceiver2::SetRtcpMode(RtcpMode mode) { … }
void RtpVideoStreamReceiver2::SetReferenceTimeReport(bool enabled) { … }
void RtpVideoStreamReceiver2::SetPacketSink(
RtpPacketSinkInterface* packet_sink) { … }
void RtpVideoStreamReceiver2::SetLossNotificationEnabled(bool enabled) { … }
void RtpVideoStreamReceiver2::SetNackHistory(TimeDelta history) { … }
int RtpVideoStreamReceiver2::ulpfec_payload_type() const { … }
int RtpVideoStreamReceiver2::red_payload_type() const { … }
void RtpVideoStreamReceiver2::SetProtectionPayloadTypes(
int red_payload_type,
int ulpfec_payload_type) { … }
absl::optional<int64_t> RtpVideoStreamReceiver2::LastReceivedPacketMs() const { … }
absl::optional<uint32_t>
RtpVideoStreamReceiver2::LastReceivedFrameRtpTimestamp() const { … }
absl::optional<int64_t> RtpVideoStreamReceiver2::LastReceivedKeyframePacketMs()
const { … }
absl::optional<RtpRtcpInterface::SenderReportStats>
RtpVideoStreamReceiver2::GetSenderReportStats() const { … }
void RtpVideoStreamReceiver2::ManageFrame(
std::unique_ptr<RtpFrameObject> frame) { … }
void RtpVideoStreamReceiver2::ReceivePacket(const RtpPacketReceived& packet) { … }
void RtpVideoStreamReceiver2::ParseAndHandleEncapsulatingHeader(
const RtpPacketReceived& packet) { … }
void RtpVideoStreamReceiver2::NotifyReceiverOfEmptyPacket(uint16_t seq_num) { … }
bool RtpVideoStreamReceiver2::DeliverRtcp(const uint8_t* rtcp_packet,
size_t rtcp_packet_length) { … }
void RtpVideoStreamReceiver2::FrameContinuous(int64_t picture_id) { … }
void RtpVideoStreamReceiver2::FrameDecoded(int64_t picture_id) { … }
void RtpVideoStreamReceiver2::SignalNetworkState(NetworkState state) { … }
void RtpVideoStreamReceiver2::StartReceive() { … }
void RtpVideoStreamReceiver2::StopReceive() { … }
void RtpVideoStreamReceiver2::InsertSpsPpsIntoTracker(uint8_t payload_type) { … }
void RtpVideoStreamReceiver2::UpdatePacketReceiveTimestamps(
const RtpPacketReceived& packet,
bool is_keyframe) { … }
}