diff --git a/api/video/video_timing.h b/api/video/video_timing.h index 745afbcb5e..4cc75dd0b0 100644 --- a/api/video/video_timing.h +++ b/api/video/video_timing.h @@ -29,16 +29,6 @@ struct VideoSendTiming { kInvalid = std::numeric_limits::max() // Invalid, ignore! }; - // Offsets of the fields in the RTP header extension, counting from the first - // byte after the one-byte header. - static constexpr uint8_t kFlagsOffset = 0; - static constexpr uint8_t kEncodeStartDeltaOffset = 1; - static constexpr uint8_t kEncodeFinishDeltaOffset = 3; - static constexpr uint8_t kPacketizationFinishDeltaOffset = 5; - static constexpr uint8_t kPacerExitDeltaOffset = 7; - static constexpr uint8_t kNetworkTimestampDeltaOffset = 9; - static constexpr uint8_t kNetwork2TimestampDeltaOffset = 11; - // Returns |time_ms - base_ms| capped at max 16-bit value. // Used to fill this data structure as per // https://webrtc.org/experiments/rtp-hdrext/video-timing/ extension stores diff --git a/modules/rtp_rtcp/source/rtp_header_extensions.cc b/modules/rtp_rtcp/source/rtp_header_extensions.cc index 800226504a..fefe6c618f 100644 --- a/modules/rtp_rtcp/source/rtp_header_extensions.cc +++ b/modules/rtp_rtcp/source/rtp_header_extensions.cc @@ -454,6 +454,13 @@ bool VideoContentTypeExtension::Write(rtc::ArrayView data, constexpr RTPExtensionType VideoTimingExtension::kId; constexpr uint8_t VideoTimingExtension::kValueSizeBytes; constexpr const char VideoTimingExtension::kUri[]; +constexpr uint8_t VideoTimingExtension::kFlagsOffset; +constexpr uint8_t VideoTimingExtension::kEncodeStartDeltaOffset; +constexpr uint8_t VideoTimingExtension::kEncodeFinishDeltaOffset; +constexpr uint8_t VideoTimingExtension::kPacketizationFinishDeltaOffset; +constexpr uint8_t VideoTimingExtension::kPacerExitDeltaOffset; +constexpr uint8_t VideoTimingExtension::kNetworkTimestampDeltaOffset; +constexpr uint8_t VideoTimingExtension::kNetwork2TimestampDeltaOffset; bool VideoTimingExtension::Parse(rtc::ArrayView data, VideoSendTiming* timing) { @@ -473,42 +480,38 @@ bool VideoTimingExtension::Parse(rtc::ArrayView data, } timing->encode_start_delta_ms = ByteReader::ReadBigEndian( - data.data() + VideoSendTiming::kEncodeStartDeltaOffset - off); + data.data() + kEncodeStartDeltaOffset - off); timing->encode_finish_delta_ms = ByteReader::ReadBigEndian( - data.data() + VideoSendTiming::kEncodeFinishDeltaOffset - off); + data.data() + kEncodeFinishDeltaOffset - off); timing->packetization_finish_delta_ms = ByteReader::ReadBigEndian( - data.data() + VideoSendTiming::kPacketizationFinishDeltaOffset - off); + data.data() + kPacketizationFinishDeltaOffset - off); timing->pacer_exit_delta_ms = ByteReader::ReadBigEndian( - data.data() + VideoSendTiming::kPacerExitDeltaOffset - off); + data.data() + kPacerExitDeltaOffset - off); timing->network_timestamp_delta_ms = ByteReader::ReadBigEndian( - data.data() + VideoSendTiming::kNetworkTimestampDeltaOffset - off); + data.data() + kNetworkTimestampDeltaOffset - off); timing->network2_timestamp_delta_ms = ByteReader::ReadBigEndian( - data.data() + VideoSendTiming::kNetwork2TimestampDeltaOffset - off); + data.data() + kNetwork2TimestampDeltaOffset - off); return true; } bool VideoTimingExtension::Write(rtc::ArrayView data, const VideoSendTiming& timing) { RTC_DCHECK_EQ(data.size(), 1 + 2 * 6); - ByteWriter::WriteBigEndian( - data.data() + VideoSendTiming::kFlagsOffset, timing.flags); + ByteWriter::WriteBigEndian(data.data() + kFlagsOffset, timing.flags); + ByteWriter::WriteBigEndian(data.data() + kEncodeStartDeltaOffset, + timing.encode_start_delta_ms); + ByteWriter::WriteBigEndian(data.data() + kEncodeFinishDeltaOffset, + timing.encode_finish_delta_ms); ByteWriter::WriteBigEndian( - data.data() + VideoSendTiming::kEncodeStartDeltaOffset, - timing.encode_start_delta_ms); - ByteWriter::WriteBigEndian( - data.data() + VideoSendTiming::kEncodeFinishDeltaOffset, - timing.encode_finish_delta_ms); - ByteWriter::WriteBigEndian( - data.data() + VideoSendTiming::kPacketizationFinishDeltaOffset, + data.data() + kPacketizationFinishDeltaOffset, timing.packetization_finish_delta_ms); + ByteWriter::WriteBigEndian(data.data() + kPacerExitDeltaOffset, + timing.pacer_exit_delta_ms); ByteWriter::WriteBigEndian( - data.data() + VideoSendTiming::kPacerExitDeltaOffset, - timing.pacer_exit_delta_ms); - ByteWriter::WriteBigEndian( - data.data() + VideoSendTiming::kNetworkTimestampDeltaOffset, + data.data() + kNetworkTimestampDeltaOffset, timing.network_timestamp_delta_ms); ByteWriter::WriteBigEndian( - data.data() + VideoSendTiming::kNetwork2TimestampDeltaOffset, + data.data() + kNetwork2TimestampDeltaOffset, timing.network2_timestamp_delta_ms); return true; } diff --git a/modules/rtp_rtcp/source/rtp_header_extensions.h b/modules/rtp_rtcp/source/rtp_header_extensions.h index 1cf6b2eda9..f4517bb513 100644 --- a/modules/rtp_rtcp/source/rtp_header_extensions.h +++ b/modules/rtp_rtcp/source/rtp_header_extensions.h @@ -192,6 +192,16 @@ class VideoTimingExtension { static constexpr const char kUri[] = "http://www.webrtc.org/experiments/rtp-hdrext/video-timing"; + // Offsets of the fields in the RTP header extension, counting from the first + // byte after the one-byte header. + static constexpr uint8_t kFlagsOffset = 0; + static constexpr uint8_t kEncodeStartDeltaOffset = 1; + static constexpr uint8_t kEncodeFinishDeltaOffset = 3; + static constexpr uint8_t kPacketizationFinishDeltaOffset = 5; + static constexpr uint8_t kPacerExitDeltaOffset = 7; + static constexpr uint8_t kNetworkTimestampDeltaOffset = 9; + static constexpr uint8_t kNetwork2TimestampDeltaOffset = 11; + static bool Parse(rtc::ArrayView data, VideoSendTiming* timing); static size_t ValueSize(const VideoSendTiming&) { return kValueSizeBytes; } @@ -204,7 +214,7 @@ class VideoTimingExtension { // Writes only single time delta to position idx. static bool Write(rtc::ArrayView data, uint16_t time_delta_ms, - uint8_t idx); + uint8_t offset); }; class FrameMarkingExtension { diff --git a/modules/rtp_rtcp/source/rtp_packet.cc b/modules/rtp_rtcp/source/rtp_packet.cc index 3d86a8c47f..8ca232b5e8 100644 --- a/modules/rtp_rtcp/source/rtp_packet.cc +++ b/modules/rtp_rtcp/source/rtp_packet.cc @@ -15,6 +15,7 @@ #include #include "modules/rtp_rtcp/source/byte_io.h" +#include "modules/rtp_rtcp/source/rtp_header_extensions.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" #include "rtc_base/numerics/safe_conversions.h" @@ -167,10 +168,12 @@ void RtpPacket::ZeroMutableExtensions() { case RTPExtensionType::kRtpExtensionVideoTiming: { // Nullify last entries, starting at pacer delay. // These are set by pacer and SFUs - if (VideoSendTiming::kPacerExitDeltaOffset < extension.length) { - memset(WriteAt(extension.offset + - VideoSendTiming::kPacerExitDeltaOffset), - 0, extension.length - VideoSendTiming::kPacerExitDeltaOffset); + if (VideoTimingExtension::kPacerExitDeltaOffset < extension.length) { + memset( + WriteAt(extension.offset + + VideoTimingExtension::kPacerExitDeltaOffset), + 0, + extension.length - VideoTimingExtension::kPacerExitDeltaOffset); } break; } diff --git a/modules/rtp_rtcp/source/rtp_packet_to_send.h b/modules/rtp_rtcp/source/rtp_packet_to_send.h index b222e406d9..07e6ea8588 100644 --- a/modules/rtp_rtcp/source/rtp_packet_to_send.h +++ b/modules/rtp_rtcp/source/rtp_packet_to_send.h @@ -79,25 +79,25 @@ class RtpPacketToSend : public RtpPacket { void set_packetization_finish_time_ms(int64_t time) { SetExtension( VideoSendTiming::GetDeltaCappedMs(capture_time_ms_, time), - VideoSendTiming::kPacketizationFinishDeltaOffset); + VideoTimingExtension::kPacketizationFinishDeltaOffset); } void set_pacer_exit_time_ms(int64_t time) { SetExtension( VideoSendTiming::GetDeltaCappedMs(capture_time_ms_, time), - VideoSendTiming::kPacerExitDeltaOffset); + VideoTimingExtension::kPacerExitDeltaOffset); } void set_network_time_ms(int64_t time) { SetExtension( VideoSendTiming::GetDeltaCappedMs(capture_time_ms_, time), - VideoSendTiming::kNetworkTimestampDeltaOffset); + VideoTimingExtension::kNetworkTimestampDeltaOffset); } void set_network2_time_ms(int64_t time) { SetExtension( VideoSendTiming::GetDeltaCappedMs(capture_time_ms_, time), - VideoSendTiming::kNetwork2TimestampDeltaOffset); + VideoTimingExtension::kNetwork2TimestampDeltaOffset); } private: