OLD | NEW |
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 Loading... |
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. |flags| is a bitmask and has the | 251 // modification by the network modification. |
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 outside limit. | |
256 // 255 = Invalid. The whole timing frame extension should be ignored. | |
257 // | |
258 // 0 1 2 3 | 252 // 0 1 2 3 |
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 | 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 |
260 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 254 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
261 // | ID | len=12| flags | encode start ms delta | | 255 // | ID | len=11| encode start ms delta | encode finish | |
262 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 256 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
263 // | encode finish ms delta | packetizer finish ms delta | | 257 // | ms delta | packetizer finish ms delta | pacer exit | |
264 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 258 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
265 // | pacer exit ms delta | network timestamp ms delta | | 259 // | ms delta | network timestamp ms delta | network2 time-| |
266 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 260 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
267 // | network2 timestamp ms delta | | 261 // | stamp ms delta| |
268 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 262 // +-+-+-+-+-+-+-+-+ |
269 | 263 |
270 constexpr RTPExtensionType VideoTimingExtension::kId; | 264 constexpr RTPExtensionType VideoTimingExtension::kId; |
271 constexpr uint8_t VideoTimingExtension::kValueSizeBytes; | 265 constexpr uint8_t VideoTimingExtension::kValueSizeBytes; |
272 constexpr const char VideoTimingExtension::kUri[]; | 266 constexpr const char VideoTimingExtension::kUri[]; |
273 | 267 |
274 bool VideoTimingExtension::Parse(rtc::ArrayView<const uint8_t> data, | 268 bool VideoTimingExtension::Parse(rtc::ArrayView<const uint8_t> data, |
275 VideoSendTiming* timing) { | 269 VideoSendTiming* timing) { |
276 RTC_DCHECK(timing); | 270 RTC_DCHECK(timing); |
277 // TODO(sprang): Deprecate support for old wire format. | 271 if (data.size() != kValueSizeBytes) |
278 ptrdiff_t off = 0; | 272 return false; |
279 switch (data.size()) { | 273 timing->encode_start_delta_ms = |
280 case kValueSizeBytes - 1: | 274 ByteReader<uint16_t>::ReadBigEndian(data.data()); |
281 timing->flags = 0; | |
282 off = 1; // Old wire format without the flags field. | |
283 break; | |
284 case kValueSizeBytes: | |
285 timing->flags = ByteReader<uint8_t>::ReadBigEndian(data.data()); | |
286 break; | |
287 default: | |
288 return false; | |
289 } | |
290 | |
291 timing->encode_start_delta_ms = ByteReader<uint16_t>::ReadBigEndian( | |
292 data.data() + VideoSendTiming::kEncodeStartDeltaOffset - off); | |
293 timing->encode_finish_delta_ms = ByteReader<uint16_t>::ReadBigEndian( | 275 timing->encode_finish_delta_ms = ByteReader<uint16_t>::ReadBigEndian( |
294 data.data() + VideoSendTiming::kEncodeFinishDeltaOffset - off); | 276 data.data() + 2 * VideoSendTiming::kEncodeFinishDeltaIdx); |
295 timing->packetization_finish_delta_ms = ByteReader<uint16_t>::ReadBigEndian( | 277 timing->packetization_finish_delta_ms = ByteReader<uint16_t>::ReadBigEndian( |
296 data.data() + VideoSendTiming::kPacketizationFinishDeltaOffset - off); | 278 data.data() + 2 * VideoSendTiming::kPacketizationFinishDeltaIdx); |
297 timing->pacer_exit_delta_ms = ByteReader<uint16_t>::ReadBigEndian( | 279 timing->pacer_exit_delta_ms = ByteReader<uint16_t>::ReadBigEndian( |
298 data.data() + VideoSendTiming::kPacerExitDeltaOffset - off); | 280 data.data() + 2 * VideoSendTiming::kPacerExitDeltaIdx); |
299 timing->network_timstamp_delta_ms = ByteReader<uint16_t>::ReadBigEndian( | 281 timing->network_timstamp_delta_ms = ByteReader<uint16_t>::ReadBigEndian( |
300 data.data() + VideoSendTiming::kNetworkTimestampDeltaOffset - off); | 282 data.data() + 2 * VideoSendTiming::kNetworkTimestampDeltaIdx); |
301 timing->network2_timstamp_delta_ms = ByteReader<uint16_t>::ReadBigEndian( | 283 timing->network2_timstamp_delta_ms = ByteReader<uint16_t>::ReadBigEndian( |
302 data.data() + VideoSendTiming::kNetwork2TimestampDeltaOffset - off); | 284 data.data() + 2 * VideoSendTiming::kNetwork2TimestampDeltaIdx); |
| 285 timing->is_timing_frame = true; |
303 return true; | 286 return true; |
304 } | 287 } |
305 | 288 |
306 bool VideoTimingExtension::Write(uint8_t* data, const VideoSendTiming& timing) { | 289 bool VideoTimingExtension::Write(uint8_t* data, const VideoSendTiming& timing) { |
307 ByteWriter<uint8_t>::WriteBigEndian(data + VideoSendTiming::kFlagsOffset, | 290 ByteWriter<uint16_t>::WriteBigEndian(data, timing.encode_start_delta_ms); |
308 timing.flags); | |
309 ByteWriter<uint16_t>::WriteBigEndian( | 291 ByteWriter<uint16_t>::WriteBigEndian( |
310 data + VideoSendTiming::kEncodeStartDeltaOffset, | 292 data + 2 * VideoSendTiming::kEncodeFinishDeltaIdx, |
311 timing.encode_start_delta_ms); | |
312 ByteWriter<uint16_t>::WriteBigEndian( | |
313 data + VideoSendTiming::kEncodeFinishDeltaOffset, | |
314 timing.encode_finish_delta_ms); | 293 timing.encode_finish_delta_ms); |
315 ByteWriter<uint16_t>::WriteBigEndian( | 294 ByteWriter<uint16_t>::WriteBigEndian( |
316 data + VideoSendTiming::kPacketizationFinishDeltaOffset, | 295 data + 2 * VideoSendTiming::kPacketizationFinishDeltaIdx, |
317 timing.packetization_finish_delta_ms); | 296 timing.packetization_finish_delta_ms); |
318 ByteWriter<uint16_t>::WriteBigEndian( | 297 ByteWriter<uint16_t>::WriteBigEndian( |
319 data + VideoSendTiming::kPacerExitDeltaOffset, | 298 data + 2 * VideoSendTiming::kPacerExitDeltaIdx, |
320 timing.pacer_exit_delta_ms); | 299 timing.pacer_exit_delta_ms); |
321 ByteWriter<uint16_t>::WriteBigEndian( | 300 ByteWriter<uint16_t>::WriteBigEndian( |
322 data + VideoSendTiming::kNetworkTimestampDeltaOffset, 0); // reserved | 301 data + 2 * VideoSendTiming::kNetworkTimestampDeltaIdx, 0); // reserved |
323 ByteWriter<uint16_t>::WriteBigEndian( | 302 ByteWriter<uint16_t>::WriteBigEndian( |
324 data + VideoSendTiming::kNetwork2TimestampDeltaOffset, 0); // reserved | 303 data + 2 * VideoSendTiming::kNetwork2TimestampDeltaIdx, 0); // reserved |
325 return true; | 304 return true; |
326 } | 305 } |
327 | 306 |
328 bool VideoTimingExtension::Write(uint8_t* data, | 307 bool VideoTimingExtension::Write(uint8_t* data, |
329 uint16_t time_delta_ms, | 308 uint16_t time_delta_ms, |
330 uint8_t offset) { | 309 uint8_t idx) { |
331 RTC_DCHECK_LT(offset, kValueSizeBytes - sizeof(uint16_t)); | 310 RTC_DCHECK_LT(idx, 6); |
332 ByteWriter<uint16_t>::WriteBigEndian(data + offset, time_delta_ms); | 311 ByteWriter<uint16_t>::WriteBigEndian(data + 2 * idx, time_delta_ms); |
333 return true; | 312 return true; |
334 } | 313 } |
335 | 314 |
336 bool BaseRtpStringExtension::Parse(rtc::ArrayView<const uint8_t> data, | 315 bool BaseRtpStringExtension::Parse(rtc::ArrayView<const uint8_t> data, |
337 StringRtpHeaderExtension* str) { | 316 StringRtpHeaderExtension* str) { |
338 if (data.empty() || data[0] == 0) // Valid string extension can't be empty. | 317 if (data.empty() || data[0] == 0) // Valid string extension can't be empty. |
339 return false; | 318 return false; |
340 str->Set(data); | 319 str->Set(data); |
341 RTC_DCHECK(!str->empty()); | 320 RTC_DCHECK(!str->empty()); |
342 return true; | 321 return true; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 constexpr RTPExtensionType RtpStreamId::kId; | 353 constexpr RTPExtensionType RtpStreamId::kId; |
375 constexpr const char RtpStreamId::kUri[]; | 354 constexpr const char RtpStreamId::kUri[]; |
376 | 355 |
377 constexpr RTPExtensionType RepairedRtpStreamId::kId; | 356 constexpr RTPExtensionType RepairedRtpStreamId::kId; |
378 constexpr const char RepairedRtpStreamId::kUri[]; | 357 constexpr const char RepairedRtpStreamId::kUri[]; |
379 | 358 |
380 constexpr RTPExtensionType RtpMid::kId; | 359 constexpr RTPExtensionType RtpMid::kId; |
381 constexpr const char RtpMid::kUri[]; | 360 constexpr const char RtpMid::kUri[]; |
382 | 361 |
383 } // namespace webrtc | 362 } // namespace webrtc |
OLD | NEW |