Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(326)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_header_extensions.cc

Issue 3000753002: Add a flags field to video timing extension. (Closed)
Patch Set: Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 241
242 bool VideoContentTypeExtension::Write(uint8_t* data, 242 bool VideoContentTypeExtension::Write(uint8_t* data,
243 VideoContentType content_type) { 243 VideoContentType content_type) {
244 data[0] = static_cast<uint8_t>(content_type); 244 data[0] = static_cast<uint8_t>(content_type);
245 return true; 245 return true;
246 } 246 }
247 247
248 // Video Timing. 248 // Video Timing.
249 // 6 timestamps in milliseconds counted from capture time stored in rtp header: 249 // 6 timestamps in milliseconds counted from capture time stored in rtp header:
250 // encode start/finish, packetization complete, pacer exit and reserved for 250 // encode start/finish, packetization complete, pacer exit and reserved for
251 // modification by the network modification. 251 // modification by the network modification. |flags| is a bitmask and has the
252 // following allowed values:
253 // 0 = Valid data, but no flags available (backwards compatibility)
254 // 1 = Frame marked as timing frame due to cyclic timer.
255 // 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.
256 // 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
257 //
252 // 0 1 2 3 258 // 0 1 2 3
253 // 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 259 // 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
254 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 260 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
255 // | ID | len=11| encode start ms delta | encode finish | 261 // | ID | len=11| encode start ms delta | encode finish |
danilchap 2017/08/11 12:22:35 len=12
sprang_webrtc 2017/08/11 13:19:05 Nice catch.
256 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 262 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
257 // | ms delta | packetizer finish ms delta | pacer exit | 263 // | ms delta | packetizer finish ms delta | pacer exit |
258 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 264 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
259 // | ms delta | network timestamp ms delta | network2 time-| 265 // | ms delta | network timestamp ms delta | network2 time-|
260 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 266 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
261 // | stamp ms delta| 267 // | stamp ms delta| flags |
262 // +-+-+-+-+-+-+-+-+ 268 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
263 269
264 constexpr RTPExtensionType VideoTimingExtension::kId; 270 constexpr RTPExtensionType VideoTimingExtension::kId;
265 constexpr uint8_t VideoTimingExtension::kValueSizeBytes; 271 constexpr uint8_t VideoTimingExtension::kValueSizeBytes;
266 constexpr const char VideoTimingExtension::kUri[]; 272 constexpr const char VideoTimingExtension::kUri[];
267 273
268 bool VideoTimingExtension::Parse(rtc::ArrayView<const uint8_t> data, 274 bool VideoTimingExtension::Parse(rtc::ArrayView<const uint8_t> data,
269 VideoSendTiming* timing) { 275 VideoSendTiming* timing) {
270 RTC_DCHECK(timing); 276 RTC_DCHECK(timing);
271 if (data.size() != kValueSizeBytes) 277 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.
278
279 if (!(data.size() == kValueSizeBytes || is_old_protocol))
272 return false; 280 return false;
273 timing->encode_start_delta_ms = 281 timing->encode_start_delta_ms = ByteReader<uint16_t>::ReadBigEndian(
274 ByteReader<uint16_t>::ReadBigEndian(data.data()); 282 data.data() + VideoSendTiming::kEncodeStartDeltaIdx);
275 timing->encode_finish_delta_ms = ByteReader<uint16_t>::ReadBigEndian( 283 timing->encode_finish_delta_ms = ByteReader<uint16_t>::ReadBigEndian(
276 data.data() + 2 * VideoSendTiming::kEncodeFinishDeltaIdx); 284 data.data() + VideoSendTiming::kEncodeFinishDeltaIdx);
277 timing->packetization_finish_delta_ms = ByteReader<uint16_t>::ReadBigEndian( 285 timing->packetization_finish_delta_ms = ByteReader<uint16_t>::ReadBigEndian(
278 data.data() + 2 * VideoSendTiming::kPacketizationFinishDeltaIdx); 286 data.data() + VideoSendTiming::kPacketizationFinishDeltaIdx);
279 timing->pacer_exit_delta_ms = ByteReader<uint16_t>::ReadBigEndian( 287 timing->pacer_exit_delta_ms = ByteReader<uint16_t>::ReadBigEndian(
280 data.data() + 2 * VideoSendTiming::kPacerExitDeltaIdx); 288 data.data() + VideoSendTiming::kPacerExitDeltaIdx);
281 timing->network_timstamp_delta_ms = ByteReader<uint16_t>::ReadBigEndian( 289 timing->network_timstamp_delta_ms = ByteReader<uint16_t>::ReadBigEndian(
282 data.data() + 2 * VideoSendTiming::kNetworkTimestampDeltaIdx); 290 data.data() + VideoSendTiming::kNetworkTimestampDeltaIdx);
283 timing->network2_timstamp_delta_ms = ByteReader<uint16_t>::ReadBigEndian( 291 timing->network2_timstamp_delta_ms = ByteReader<uint16_t>::ReadBigEndian(
284 data.data() + 2 * VideoSendTiming::kNetwork2TimestampDeltaIdx); 292 data.data() + VideoSendTiming::kNetwork2TimestampDeltaIdx);
285 timing->is_timing_frame = true; 293 timing->flags = is_old_protocol
294 ? 0
295 : ByteReader<uint8_t>::ReadBigEndian(
296 data.data() + VideoSendTiming::kFLagsIdx);
286 return true; 297 return true;
287 } 298 }
288 299
289 bool VideoTimingExtension::Write(uint8_t* data, const VideoSendTiming& timing) { 300 bool VideoTimingExtension::Write(uint8_t* data, const VideoSendTiming& timing) {
290 ByteWriter<uint16_t>::WriteBigEndian(data, timing.encode_start_delta_ms);
291 ByteWriter<uint16_t>::WriteBigEndian( 301 ByteWriter<uint16_t>::WriteBigEndian(
292 data + 2 * VideoSendTiming::kEncodeFinishDeltaIdx, 302 data + VideoSendTiming::kEncodeStartDeltaIdx,
303 timing.encode_start_delta_ms);
304 ByteWriter<uint16_t>::WriteBigEndian(
305 data + VideoSendTiming::kEncodeFinishDeltaIdx,
293 timing.encode_finish_delta_ms); 306 timing.encode_finish_delta_ms);
294 ByteWriter<uint16_t>::WriteBigEndian( 307 ByteWriter<uint16_t>::WriteBigEndian(
295 data + 2 * VideoSendTiming::kPacketizationFinishDeltaIdx, 308 data + VideoSendTiming::kPacketizationFinishDeltaIdx,
296 timing.packetization_finish_delta_ms); 309 timing.packetization_finish_delta_ms);
297 ByteWriter<uint16_t>::WriteBigEndian( 310 ByteWriter<uint16_t>::WriteBigEndian(
298 data + 2 * VideoSendTiming::kPacerExitDeltaIdx, 311 data + VideoSendTiming::kPacerExitDeltaIdx, timing.pacer_exit_delta_ms);
299 timing.pacer_exit_delta_ms);
300 ByteWriter<uint16_t>::WriteBigEndian( 312 ByteWriter<uint16_t>::WriteBigEndian(
301 data + 2 * VideoSendTiming::kNetworkTimestampDeltaIdx, 0); // reserved 313 data + VideoSendTiming::kNetworkTimestampDeltaIdx, 0); // reserved
302 ByteWriter<uint16_t>::WriteBigEndian( 314 ByteWriter<uint16_t>::WriteBigEndian(
303 data + 2 * VideoSendTiming::kNetwork2TimestampDeltaIdx, 0); // reserved 315 data + VideoSendTiming::kNetwork2TimestampDeltaIdx, 0); // reserved
316 ByteWriter<uint8_t>::WriteBigEndian(data + VideoSendTiming::kFLagsIdx,
317 timing.flags);
304 return true; 318 return true;
305 } 319 }
306 320
307 bool VideoTimingExtension::Write(uint8_t* data, 321 bool VideoTimingExtension::Write(uint8_t* data,
308 uint16_t time_delta_ms, 322 uint16_t time_delta_ms,
309 uint8_t idx) { 323 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.
310 RTC_DCHECK_LT(idx, 6); 324 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
311 ByteWriter<uint16_t>::WriteBigEndian(data + 2 * idx, time_delta_ms); 325 ByteWriter<uint16_t>::WriteBigEndian(data + idx, time_delta_ms);
312 return true; 326 return true;
313 } 327 }
314 328
315 bool BaseRtpStringExtension::Parse(rtc::ArrayView<const uint8_t> data, 329 bool BaseRtpStringExtension::Parse(rtc::ArrayView<const uint8_t> data,
316 StringRtpHeaderExtension* str) { 330 StringRtpHeaderExtension* str) {
317 if (data.empty() || data[0] == 0) // Valid string extension can't be empty. 331 if (data.empty() || data[0] == 0) // Valid string extension can't be empty.
318 return false; 332 return false;
319 str->Set(data); 333 str->Set(data);
320 RTC_DCHECK(!str->empty()); 334 RTC_DCHECK(!str->empty());
321 return true; 335 return true;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 constexpr RTPExtensionType RtpStreamId::kId; 367 constexpr RTPExtensionType RtpStreamId::kId;
354 constexpr const char RtpStreamId::kUri[]; 368 constexpr const char RtpStreamId::kUri[];
355 369
356 constexpr RTPExtensionType RepairedRtpStreamId::kId; 370 constexpr RTPExtensionType RepairedRtpStreamId::kId;
357 constexpr const char RepairedRtpStreamId::kUri[]; 371 constexpr const char RepairedRtpStreamId::kUri[];
358 372
359 constexpr RTPExtensionType RtpMid::kId; 373 constexpr RTPExtensionType RtpMid::kId;
360 constexpr const char RtpMid::kUri[]; 374 constexpr const char RtpMid::kUri[];
361 375
362 } // namespace webrtc 376 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698