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. | 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 Loading... | |
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 |
OLD | NEW |