Chromium Code Reviews| Index: webrtc/modules/rtp_rtcp/source/rtp_header_extensions.cc |
| diff --git a/webrtc/modules/rtp_rtcp/source/rtp_header_extensions.cc b/webrtc/modules/rtp_rtcp/source/rtp_header_extensions.cc |
| index 5e172c4f669c5caa0f081c9a7ef6d5525553f509..4d5baa71317169d3d6bce07c63e801fa3220fe4e 100644 |
| --- a/webrtc/modules/rtp_rtcp/source/rtp_header_extensions.cc |
| +++ b/webrtc/modules/rtp_rtcp/source/rtp_header_extensions.cc |
| @@ -248,7 +248,13 @@ bool VideoContentTypeExtension::Write(uint8_t* data, |
| // Video Timing. |
| // 6 timestamps in milliseconds counted from capture time stored in rtp header: |
| // encode start/finish, packetization complete, pacer exit and reserved for |
| -// modification by the network modification. |
| +// modification by the network modification. |flags| is a bitmask and has the |
| +// following allowed values: |
| +// 0 = Valid data, but no flags available (backwards compatibility) |
| +// 1 = Frame marked as timing frame due to cyclic timer. |
| +// 2 = Frame marked as timing frame due to size being bein an outlier. |
|
danilchap
2017/08/11 12:22:35
bein?
sprang_webrtc
2017/08/11 13:19:05
typo, slightly rephrased.
|
| +// 255 = Invalid. The whole timing frame extension should be ignored. |
|
danilchap
2017/08/11 12:22:36
what is a usecase to use this value on the wire?
i
sprang_webrtc
2017/08/11 13:19:05
This value (255) should not normally be used on th
|
| +// |
| // 0 1 2 3 |
| // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 |
| // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| @@ -258,8 +264,8 @@ bool VideoContentTypeExtension::Write(uint8_t* data, |
| // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| // | ms delta | network timestamp ms delta | network2 time-| |
| // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| -// | stamp ms delta| |
| -// +-+-+-+-+-+-+-+-+ |
| +// | stamp ms delta| flags | |
| +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| constexpr RTPExtensionType VideoTimingExtension::kId; |
| constexpr uint8_t VideoTimingExtension::kValueSizeBytes; |
| @@ -268,47 +274,55 @@ constexpr const char VideoTimingExtension::kUri[]; |
| bool VideoTimingExtension::Parse(rtc::ArrayView<const uint8_t> data, |
| VideoSendTiming* timing) { |
| RTC_DCHECK(timing); |
| - if (data.size() != kValueSizeBytes) |
| + const bool is_old_protocol = data.size() == (kValueSizeBytes - 1); |
|
danilchap
2017/08/11 12:22:35
may be add TODO to remove support for old protocol
sprang_webrtc
2017/08/11 13:19:05
Done.
|
| + |
| + if (!(data.size() == kValueSizeBytes || is_old_protocol)) |
| return false; |
| - timing->encode_start_delta_ms = |
| - ByteReader<uint16_t>::ReadBigEndian(data.data()); |
| + timing->encode_start_delta_ms = ByteReader<uint16_t>::ReadBigEndian( |
| + data.data() + VideoSendTiming::kEncodeStartDeltaIdx); |
| timing->encode_finish_delta_ms = ByteReader<uint16_t>::ReadBigEndian( |
| - data.data() + 2 * VideoSendTiming::kEncodeFinishDeltaIdx); |
| + data.data() + VideoSendTiming::kEncodeFinishDeltaIdx); |
| timing->packetization_finish_delta_ms = ByteReader<uint16_t>::ReadBigEndian( |
| - data.data() + 2 * VideoSendTiming::kPacketizationFinishDeltaIdx); |
| + data.data() + VideoSendTiming::kPacketizationFinishDeltaIdx); |
| timing->pacer_exit_delta_ms = ByteReader<uint16_t>::ReadBigEndian( |
| - data.data() + 2 * VideoSendTiming::kPacerExitDeltaIdx); |
| + data.data() + VideoSendTiming::kPacerExitDeltaIdx); |
| timing->network_timstamp_delta_ms = ByteReader<uint16_t>::ReadBigEndian( |
| - data.data() + 2 * VideoSendTiming::kNetworkTimestampDeltaIdx); |
| + data.data() + VideoSendTiming::kNetworkTimestampDeltaIdx); |
| timing->network2_timstamp_delta_ms = ByteReader<uint16_t>::ReadBigEndian( |
| - data.data() + 2 * VideoSendTiming::kNetwork2TimestampDeltaIdx); |
| - timing->is_timing_frame = true; |
| + data.data() + VideoSendTiming::kNetwork2TimestampDeltaIdx); |
| + timing->flags = is_old_protocol |
| + ? 0 |
| + : ByteReader<uint8_t>::ReadBigEndian( |
| + data.data() + VideoSendTiming::kFLagsIdx); |
| return true; |
| } |
| bool VideoTimingExtension::Write(uint8_t* data, const VideoSendTiming& timing) { |
| - ByteWriter<uint16_t>::WriteBigEndian(data, timing.encode_start_delta_ms); |
| ByteWriter<uint16_t>::WriteBigEndian( |
| - data + 2 * VideoSendTiming::kEncodeFinishDeltaIdx, |
| + data + VideoSendTiming::kEncodeStartDeltaIdx, |
| + timing.encode_start_delta_ms); |
| + ByteWriter<uint16_t>::WriteBigEndian( |
| + data + VideoSendTiming::kEncodeFinishDeltaIdx, |
| timing.encode_finish_delta_ms); |
| ByteWriter<uint16_t>::WriteBigEndian( |
| - data + 2 * VideoSendTiming::kPacketizationFinishDeltaIdx, |
| + data + VideoSendTiming::kPacketizationFinishDeltaIdx, |
| timing.packetization_finish_delta_ms); |
| ByteWriter<uint16_t>::WriteBigEndian( |
| - data + 2 * VideoSendTiming::kPacerExitDeltaIdx, |
| - timing.pacer_exit_delta_ms); |
| + data + VideoSendTiming::kPacerExitDeltaIdx, timing.pacer_exit_delta_ms); |
| ByteWriter<uint16_t>::WriteBigEndian( |
| - data + 2 * VideoSendTiming::kNetworkTimestampDeltaIdx, 0); // reserved |
| + data + VideoSendTiming::kNetworkTimestampDeltaIdx, 0); // reserved |
| ByteWriter<uint16_t>::WriteBigEndian( |
| - data + 2 * VideoSendTiming::kNetwork2TimestampDeltaIdx, 0); // reserved |
| + data + VideoSendTiming::kNetwork2TimestampDeltaIdx, 0); // reserved |
| + ByteWriter<uint8_t>::WriteBigEndian(data + VideoSendTiming::kFLagsIdx, |
| + timing.flags); |
| return true; |
| } |
| bool VideoTimingExtension::Write(uint8_t* data, |
| uint16_t time_delta_ms, |
| uint8_t idx) { |
|
danilchap
2017/08/11 12:22:35
may be rename index to offset
sprang_webrtc
2017/08/11 13:19:05
Done.
|
| - RTC_DCHECK_LT(idx, 6); |
| - ByteWriter<uint16_t>::WriteBigEndian(data + 2 * idx, time_delta_ms); |
| + RTC_DCHECK_LT(idx, kValueSizeBytes); |
|
danilchap
2017/08/11 12:22:36
may be LE(offset, kValueSizeBytes - 2)
since you w
sprang_webrtc
2017/08/11 13:19:05
Good idea. using kValueSizeBytes - sizeof(uint16_t
|
| + ByteWriter<uint16_t>::WriteBigEndian(data + idx, time_delta_ms); |
| return true; |
| } |