Move ownership of PlayoutDelayOracle

Moved from RtpSender to RtpSenderVideo, since currently the
PlayoutDelay extension is used for video only, and configured via
RTPVideoHeader.

Bug: webrtc:7135
Change-Id: Idfcc90cefea83e40a4e79164d7914cdcd50e41fe
Reviewed-on: https://webrtc-review.googlesource.com/c/120357
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Niels Moller <nisse@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26484}
This commit is contained in:
Niels Möller
2019-01-31 08:56:26 +01:00
committed by Commit Bot
parent 82ac240040
commit 6893f3c6f0
4 changed files with 37 additions and 43 deletions

View File

@ -23,7 +23,6 @@
#include "modules/remote_bitrate_estimator/test/bwe_test_logging.h"
#include "modules/rtp_rtcp/include/rtp_cvo.h"
#include "modules/rtp_rtcp/source/byte_io.h"
#include "modules/rtp_rtcp/source/playout_delay_oracle.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_to_send.h"
@ -344,7 +343,6 @@ bool RTPSender::SendOutgoingData(FrameType frame_type,
const RTPVideoHeader* rtp_header,
uint32_t* transport_frame_id_out,
int64_t expected_retransmission_time_ms) {
uint32_t ssrc;
uint16_t sequence_number;
uint32_t rtp_timestamp;
{
@ -352,7 +350,6 @@ bool RTPSender::SendOutgoingData(FrameType frame_type,
rtc::CritScope lock(&send_critsect_);
RTC_DCHECK(ssrc_);
ssrc = *ssrc_;
sequence_number = sequence_number_;
rtp_timestamp = timestamp_offset_ + capture_timestamp;
if (transport_frame_id_out)
@ -388,20 +385,6 @@ bool RTPSender::SendOutgoingData(FrameType frame_type,
if (frame_type == kEmptyFrame)
return true;
if (rtp_header) {
// TODO(nisse): This way of using PlayoutDelayOracle is a bit awkward. The
// intended way to use it is to call PlayoutDelayToSend at the place where
// the extension is written into the packet, and OnSentPacket later, after
// the final allocation of the sequence number. But currently the
// extension is set in AllocatePacket, where the RTPVideoHeader isn't
// available, so it always calls PlayoutDelayToSend with {-1,-1}. Hence,
// we have to use OnSentPacket early, and record both contents of the
// extension and the sequence number.
playout_delay_oracle_.OnSentPacket(
sequence_number,
playout_delay_oracle_.PlayoutDelayToSend(rtp_header->playout_delay));
}
result = video_->SendVideo(frame_type, payload_type, rtp_timestamp,
capture_time_ms, payload_data, payload_size,
fragmentation, rtp_header,
@ -675,8 +658,7 @@ void RTPSender::OnReceivedRtcpReportBlocks(
for (const RTCPReportBlock& report_block : report_blocks) {
if (ssrc == report_block.source_ssrc) {
playout_delay_oracle_.OnReceivedAck(
report_block.extended_highest_sequence_number);
video_->OnReceivedAck(report_block.extended_highest_sequence_number);
}
}
}
@ -1075,11 +1057,7 @@ std::unique_ptr<RtpPacketToSend> RTPSender::AllocatePacket() const {
packet->ReserveExtension<AbsoluteSendTime>();
packet->ReserveExtension<TransmissionOffset>();
packet->ReserveExtension<TransportSequenceNumber>();
absl::optional<PlayoutDelay> playout_delay =
playout_delay_oracle_.PlayoutDelayToSend({-1, -1});
if (playout_delay) {
packet->SetExtension<PlayoutDelayLimits>(*playout_delay);
}
if (!mid_.empty()) {
// This is a no-op if the MID header extension is not registered.
packet->SetExtension<RtpMid>(mid_);

View File

@ -25,7 +25,6 @@
#include "modules/rtp_rtcp/include/flexfec_sender.h"
#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
#include "modules/rtp_rtcp/source/playout_delay_oracle.h"
#include "modules/rtp_rtcp/source/rtp_packet_history.h"
#include "modules/rtp_rtcp/source/rtp_rtcp_config.h"
#include "rtc_base/constructor_magic.h"
@ -183,6 +182,7 @@ class RTPSender {
absl::optional<uint32_t> FlexfecSsrc() const;
// Sends packet to |transport_| or to the pacer, depending on configuration.
bool SendToNetwork(std::unique_ptr<RtpPacketToSend> packet,
StorageType storage,
RtpPacketSender::Priority priority);
@ -239,6 +239,7 @@ class RTPSender {
std::unique_ptr<RtpPacketToSend> BuildRtxPacket(
const RtpPacketToSend& packet);
// Sends packet on to |transport_|, leaving the RTP module.
bool SendPacketToNetwork(const RtpPacketToSend& packet,
const PacketOptions& options,
const PacedPacketInfo& pacing_info);
@ -286,11 +287,6 @@ class RTPSender {
RtpHeaderExtensionMap rtp_header_extension_map_
RTC_GUARDED_BY(send_critsect_);
// Tracks the current request for playout delay limits from application
// and decides whether the current RTP frame should include the playout
// delay extension on header.
PlayoutDelayOracle playout_delay_oracle_;
RtpPacketHistory packet_history_;
// TODO(brandtr): Remove |flexfec_packet_history_| when the FlexfecSender
// is hooked up to the PacedSender.

View File

@ -53,6 +53,7 @@ void BuildRedPayload(const RtpPacketToSend& media_packet,
}
void AddRtpHeaderExtensions(const RTPVideoHeader& video_header,
const absl::optional<PlayoutDelay>& playout_delay,
FrameType frame_type,
bool set_video_rotation,
bool set_color_space,
@ -78,6 +79,10 @@ void AddRtpHeaderExtensions(const RTPVideoHeader& video_header,
video_header.video_timing.flags != VideoSendTiming::kInvalid)
packet->SetExtension<VideoTimingExtension>(video_header.video_timing);
// If transmitted, add to all packets; ack logic depends on this.
if (playout_delay) {
packet->SetExtension<PlayoutDelayLimits>(*playout_delay);
}
if (video_header.generic) {
RtpGenericFrameDescriptor generic_descriptor;
generic_descriptor.SetFirstPacketInSubFrame(first_packet);
@ -378,6 +383,9 @@ bool RTPSenderVideo::SendVideo(FrameType frame_type,
int32_t retransmission_settings;
bool set_video_rotation;
bool set_color_space = false;
const absl::optional<PlayoutDelay> playout_delay =
playout_delay_oracle_.PlayoutDelayToSend(video_header->playout_delay);
{
rtc::CritScope cs(&crit_);
// According to
@ -441,19 +449,18 @@ bool RTPSenderVideo::SendVideo(FrameType frame_type,
auto middle_packet = absl::make_unique<RtpPacketToSend>(*single_packet);
auto last_packet = absl::make_unique<RtpPacketToSend>(*single_packet);
// Simplest way to estimate how much extensions would occupy is to set them.
AddRtpHeaderExtensions(*video_header, frame_type, set_video_rotation,
set_color_space, /*first=*/true, /*last=*/true,
single_packet.get());
AddRtpHeaderExtensions(*video_header, frame_type, set_video_rotation,
set_color_space, /*first=*/true, /*last=*/false,
first_packet.get());
AddRtpHeaderExtensions(*video_header, frame_type, set_video_rotation,
set_color_space, /*first=*/false, /*last=*/false,
middle_packet.get());
AddRtpHeaderExtensions(*video_header, frame_type, set_video_rotation,
set_color_space, /*first=*/false, /*last=*/true,
last_packet.get());
AddRtpHeaderExtensions(*video_header, playout_delay, frame_type,
set_video_rotation, set_color_space, /*first=*/true,
/*last=*/true, single_packet.get());
AddRtpHeaderExtensions(*video_header, playout_delay, frame_type,
set_video_rotation, set_color_space, /*first=*/true,
/*last=*/false, first_packet.get());
AddRtpHeaderExtensions(*video_header, playout_delay, frame_type,
set_video_rotation, set_color_space, /*first=*/false,
/*last=*/false, middle_packet.get());
AddRtpHeaderExtensions(*video_header, playout_delay, frame_type,
set_video_rotation, set_color_space, /*first=*/false,
/*last=*/true, last_packet.get());
RTC_DCHECK_GT(packet_capacity, single_packet->headers_size());
RTC_DCHECK_GT(packet_capacity, first_packet->headers_size());
RTC_DCHECK_GT(packet_capacity, middle_packet->headers_size());
@ -582,6 +589,10 @@ bool RTPSenderVideo::SendVideo(FrameType frame_type,
return false;
packetized_payload_size += packet->payload_size();
if (i == 0) {
playout_delay_oracle_.OnSentPacket(packet->SequenceNumber(),
playout_delay);
}
// No FEC protection for upper temporal layers, if used.
bool protect_packet = temporal_id == 0 || temporal_id == kNoTemporalIdx;

View File

@ -19,6 +19,7 @@
#include "common_types.h" // NOLINT(build/include)
#include "modules/rtp_rtcp/include/flexfec_sender.h"
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
#include "modules/rtp_rtcp/source/playout_delay_oracle.h"
#include "modules/rtp_rtcp/source/rtp_rtcp_config.h"
#include "modules/rtp_rtcp/source/rtp_sender.h"
#include "modules/rtp_rtcp/source/ulpfec_generator.h"
@ -71,6 +72,10 @@ class RTPSenderVideo {
uint32_t FecOverheadRate() const;
uint32_t PacketizationOverheadBps() const;
void OnReceivedAck(int64_t extended_highest_sequence_number) {
playout_delay_oracle_.OnReceivedAck(extended_highest_sequence_number);
}
protected:
static uint8_t GetTemporalId(const RTPVideoHeader& header);
StorageType GetStorageType(uint8_t temporal_id,
@ -135,6 +140,10 @@ class RTPSenderVideo {
VideoRotation last_rotation_ RTC_GUARDED_BY(crit_);
absl::optional<ColorSpace> last_color_space_ RTC_GUARDED_BY(crit_);
bool transmit_color_space_next_frame_ RTC_GUARDED_BY(crit_);
// Tracks the current request for playout delay limits from application
// and decides whether the current RTP frame should include the playout
// delay extension on header.
PlayoutDelayOracle playout_delay_oracle_;
// RED/ULPFEC.
int red_payload_type_ RTC_GUARDED_BY(crit_);