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

Side by Side Diff: webrtc/logging/rtc_event_log/encoder/rtc_event_log_encoder_legacy.cc

Issue 3009333002: Create RtcEventLogEncoderLegacy (Closed)
Patch Set: Rebased Created 3 years, 3 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
(Empty)
1 /*
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "webrtc/logging/rtc_event_log/encoder/rtc_event_log_encoder_legacy.h"
12
13 #include "webrtc/logging/rtc_event_log/events/rtc_event_audio_network_adaptation .h"
14 #include "webrtc/logging/rtc_event_log/events/rtc_event_audio_playout.h"
15 #include "webrtc/logging/rtc_event_log/events/rtc_event_audio_receive_stream_con fig.h"
16 #include "webrtc/logging/rtc_event_log/events/rtc_event_audio_send_stream_config .h"
17 #include "webrtc/logging/rtc_event_log/events/rtc_event_bwe_update_delay_based.h "
18 #include "webrtc/logging/rtc_event_log/events/rtc_event_bwe_update_loss_based.h"
19 #include "webrtc/logging/rtc_event_log/events/rtc_event_logging_started.h"
20 #include "webrtc/logging/rtc_event_log/events/rtc_event_logging_stopped.h"
21 #include "webrtc/logging/rtc_event_log/events/rtc_event_probe_cluster_created.h"
22 #include "webrtc/logging/rtc_event_log/events/rtc_event_probe_result_failure.h"
23 #include "webrtc/logging/rtc_event_log/events/rtc_event_probe_result_success.h"
24 #include "webrtc/logging/rtc_event_log/events/rtc_event_rtcp_packet_incoming.h"
25 #include "webrtc/logging/rtc_event_log/events/rtc_event_rtcp_packet_outgoing.h"
26 #include "webrtc/logging/rtc_event_log/events/rtc_event_rtp_packet_incoming.h"
27 #include "webrtc/logging/rtc_event_log/events/rtc_event_rtp_packet_outgoing.h"
28 #include "webrtc/logging/rtc_event_log/events/rtc_event_video_receive_stream_con fig.h"
29 #include "webrtc/logging/rtc_event_log/events/rtc_event_video_send_stream_config .h"
30 #include "webrtc/logging/rtc_event_log/rtc_stream_config.h"
31 #include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_networ k_adaptor_config.h"
32 #include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
33 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
34 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h"
35 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h"
36 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
37 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h"
38 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
39 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/psfb.h"
40 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
41 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rtpfb.h"
42 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h"
43 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
44 #include "webrtc/modules/rtp_rtcp/source/rtp_packet.h"
45 #include "webrtc/rtc_base/checks.h"
46 #include "webrtc/rtc_base/ignore_wundef.h"
47 #include "webrtc/rtc_base/logging.h"
48
49 #ifdef ENABLE_RTC_EVENT_LOG
50 // *.pb.h files are generated at build-time by the protobuf compiler.
51 RTC_PUSH_IGNORING_WUNDEF()
52 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD
53 #include "external/webrtc/webrtc/logging/rtc_event_log/rtc_event_log.pb.h"
54 #else
55 #include "webrtc/logging/rtc_event_log/rtc_event_log.pb.h"
56 #endif
57 RTC_POP_IGNORING_WUNDEF()
58 #endif
59
60 namespace webrtc {
61
62 namespace {
63 rtclog::DelayBasedBweUpdate::DetectorState ConvertDetectorState(
64 BandwidthUsage state) {
65 switch (state) {
66 case BandwidthUsage::kBwNormal:
67 return rtclog::DelayBasedBweUpdate::BWE_NORMAL;
68 case BandwidthUsage::kBwUnderusing:
69 return rtclog::DelayBasedBweUpdate::BWE_UNDERUSING;
70 case BandwidthUsage::kBwOverusing:
71 return rtclog::DelayBasedBweUpdate::BWE_OVERUSING;
72 }
73 RTC_NOTREACHED();
74 return rtclog::DelayBasedBweUpdate::BWE_NORMAL;
75 }
76
77 rtclog::BweProbeResult::ResultType ConvertProbeResultType(
78 ProbeFailureReason failure_reason) {
79 switch (failure_reason) {
80 case kInvalidSendReceiveInterval:
81 return rtclog::BweProbeResult::INVALID_SEND_RECEIVE_INTERVAL;
82 case kInvalidSendReceiveRatio:
83 return rtclog::BweProbeResult::INVALID_SEND_RECEIVE_RATIO;
84 case kTimeout:
85 return rtclog::BweProbeResult::TIMEOUT;
86 }
87 RTC_NOTREACHED();
88 return rtclog::BweProbeResult::SUCCESS;
89 }
90
91 rtclog::VideoReceiveConfig_RtcpMode ConvertRtcpMode(RtcpMode rtcp_mode) {
92 switch (rtcp_mode) {
93 case RtcpMode::kCompound:
94 return rtclog::VideoReceiveConfig::RTCP_COMPOUND;
95 case RtcpMode::kReducedSize:
96 return rtclog::VideoReceiveConfig::RTCP_REDUCEDSIZE;
97 case RtcpMode::kOff:
98 RTC_NOTREACHED();
99 return rtclog::VideoReceiveConfig::RTCP_COMPOUND;
100 }
101 RTC_NOTREACHED();
102 return rtclog::VideoReceiveConfig::RTCP_COMPOUND;
103 }
104 } // namespace
105
106 std::string RtcEventLogEncoderLegacy::Encode(const RtcEvent& event) {
107 switch (event.GetType()) {
108 case RtcEvent::Type::AudioNetworkAdaptation: {
109 auto& rtc_event =
110 static_cast<const RtcEventAudioNetworkAdaptation&>(event);
111 return AudioNetworkAdaptation(rtc_event);
112 }
113
114 case RtcEvent::Type::AudioPlayout: {
115 auto& rtc_event = static_cast<const RtcEventAudioPlayout&>(event);
116 return AudioPlayout(rtc_event);
117 }
118
119 case RtcEvent::Type::AudioReceiveStreamConfig: {
120 auto& rtc_event =
121 static_cast<const RtcEventAudioReceiveStreamConfig&>(event);
122 return AudioReceiveStreamConfig(rtc_event);
123 }
124
125 case RtcEvent::Type::AudioSendStreamConfig: {
126 auto& rtc_event =
127 static_cast<const RtcEventAudioSendStreamConfig&>(event);
128 return AudioSendStreamConfig(rtc_event);
129 }
130
131 case RtcEvent::Type::BweUpdateDelayBased: {
132 auto& rtc_event = static_cast<const RtcEventBweUpdateDelayBased&>(event);
133 return BweUpdateDelayBased(rtc_event);
134 }
135
136 case RtcEvent::Type::BweUpdateLossBased: {
137 auto& rtc_event = static_cast<const RtcEventBweUpdateLossBased&>(event);
138 return BweUpdateLossBased(rtc_event);
139 }
140
141 case RtcEvent::Type::LoggingStarted: {
142 auto& rtc_event = static_cast<const RtcEventLoggingStarted&>(event);
143 return LoggingStarted(rtc_event);
144 }
145
146 case RtcEvent::Type::LoggingStopped: {
147 auto& rtc_event = static_cast<const RtcEventLoggingStopped&>(event);
148 return LoggingStopped(rtc_event);
149 }
150
151 case RtcEvent::Type::ProbeClusterCreated: {
152 auto& rtc_event = static_cast<const RtcEventProbeClusterCreated&>(event);
153 return ProbeClusterCreated(rtc_event);
154 }
155
156 case RtcEvent::Type::ProbeResultFailure: {
157 auto& rtc_event = static_cast<const RtcEventProbeResultFailure&>(event);
158 return ProbeResultFailure(rtc_event);
159 }
160
161 case RtcEvent::Type::ProbeResultSuccess: {
162 auto& rtc_event = static_cast<const RtcEventProbeResultSuccess&>(event);
163 return ProbeResultSuccess(rtc_event);
164 }
165
166 case RtcEvent::Type::RtcpPacketIncoming: {
167 auto& rtc_event = static_cast<const RtcEventRtcpPacketIncoming&>(event);
168 return RtcpPacketIncoming(rtc_event);
169 }
170
171 case RtcEvent::Type::RtcpPacketOutgoing: {
172 auto& rtc_event = static_cast<const RtcEventRtcpPacketOutgoing&>(event);
173 return RtcpPacketOutgoing(rtc_event);
174 }
175
176 case RtcEvent::Type::RtpPacketIncoming: {
177 auto& rtc_event = static_cast<const RtcEventRtpPacketIncoming&>(event);
178 return RtpPacketIncoming(rtc_event);
179 }
180
181 case RtcEvent::Type::RtpPacketOutgoing: {
182 auto& rtc_event = static_cast<const RtcEventRtpPacketOutgoing&>(event);
183 return RtpPacketOutgoing(rtc_event);
184 }
185
186 case RtcEvent::Type::VideoReceiveStreamConfig: {
187 auto& rtc_event =
188 static_cast<const RtcEventVideoReceiveStreamConfig&>(event);
189 return VideoReceiveStreamConfig(rtc_event);
190 }
191
192 case RtcEvent::Type::VideoSendStreamConfig: {
193 auto& rtc_event =
194 static_cast<const RtcEventVideoSendStreamConfig&>(event);
195 return VideoSendStreamConfig(rtc_event);
196 }
197 }
198
199 int event_type = static_cast<int>(event.GetType());
200 RTC_NOTREACHED() << "Unknown event type (" << event_type << ")";
201 }
202
203 std::string RtcEventLogEncoderLegacy::AudioNetworkAdaptation(
204 const RtcEventAudioNetworkAdaptation& event) {
205 rtclog::Event rtclog_event;
206 rtclog_event.set_timestamp_us(event.timestamp_us_);
207 rtclog_event.set_type(rtclog::Event::AUDIO_NETWORK_ADAPTATION_EVENT);
208
209 auto audio_network_adaptation =
210 rtclog_event.mutable_audio_network_adaptation();
211 if (event.config_->bitrate_bps)
212 audio_network_adaptation->set_bitrate_bps(*event.config_->bitrate_bps);
213 if (event.config_->frame_length_ms)
214 audio_network_adaptation->set_frame_length_ms(
215 *event.config_->frame_length_ms);
216 if (event.config_->uplink_packet_loss_fraction) {
217 audio_network_adaptation->set_uplink_packet_loss_fraction(
218 *event.config_->uplink_packet_loss_fraction);
219 }
220 if (event.config_->enable_fec)
221 audio_network_adaptation->set_enable_fec(*event.config_->enable_fec);
222 if (event.config_->enable_dtx)
223 audio_network_adaptation->set_enable_dtx(*event.config_->enable_dtx);
224 if (event.config_->num_channels)
225 audio_network_adaptation->set_num_channels(*event.config_->num_channels);
226
227 return Serialize(&rtclog_event);
228 }
229
230 std::string RtcEventLogEncoderLegacy::AudioPlayout(
231 const RtcEventAudioPlayout& event) {
232 rtclog::Event rtclog_event;
233 rtclog_event.set_timestamp_us(event.timestamp_us_);
234 rtclog_event.set_type(rtclog::Event::AUDIO_PLAYOUT_EVENT);
235
236 auto playout_event = rtclog_event.mutable_audio_playout_event();
237 playout_event->set_local_ssrc(event.ssrc_);
238
239 return Serialize(&rtclog_event);
240 }
241
242 std::string RtcEventLogEncoderLegacy::AudioReceiveStreamConfig(
243 const RtcEventAudioReceiveStreamConfig& event) {
244 rtclog::Event rtclog_event;
245 rtclog_event.set_timestamp_us(event.timestamp_us_);
246 rtclog_event.set_type(rtclog::Event::AUDIO_RECEIVER_CONFIG_EVENT);
247
248 rtclog::AudioReceiveConfig* receiver_config =
249 rtclog_event.mutable_audio_receiver_config();
250 receiver_config->set_remote_ssrc(event.config_->remote_ssrc);
251 receiver_config->set_local_ssrc(event.config_->local_ssrc);
252
253 for (const auto& e : event.config_->rtp_extensions) {
254 rtclog::RtpHeaderExtension* extension =
255 receiver_config->add_header_extensions();
256 extension->set_name(e.uri);
257 extension->set_id(e.id);
258 }
259
260 return Serialize(&rtclog_event);
261 }
262
263 std::string RtcEventLogEncoderLegacy::AudioSendStreamConfig(
264 const RtcEventAudioSendStreamConfig& event) {
265 rtclog::Event rtclog_event;
266 rtclog_event.set_timestamp_us(event.timestamp_us_);
267 rtclog_event.set_type(rtclog::Event::AUDIO_SENDER_CONFIG_EVENT);
268
269 rtclog::AudioSendConfig* sender_config =
270 rtclog_event.mutable_audio_sender_config();
271
272 sender_config->set_ssrc(event.config_->local_ssrc);
273
274 for (const auto& e : event.config_->rtp_extensions) {
275 rtclog::RtpHeaderExtension* extension =
276 sender_config->add_header_extensions();
277 extension->set_name(e.uri);
278 extension->set_id(e.id);
279 }
280
281 return Serialize(&rtclog_event);
282 }
283
284 std::string RtcEventLogEncoderLegacy::BweUpdateDelayBased(
285 const RtcEventBweUpdateDelayBased& event) {
286 rtclog::Event rtclog_event;
287 rtclog_event.set_timestamp_us(event.timestamp_us_);
288 rtclog_event.set_type(rtclog::Event::DELAY_BASED_BWE_UPDATE);
289
290 auto bwe_event = rtclog_event.mutable_delay_based_bwe_update();
291 bwe_event->set_bitrate_bps(event.bitrate_bps_);
292 bwe_event->set_detector_state(ConvertDetectorState(event.detector_state_));
293
294 return Serialize(&rtclog_event);
295 }
296
297 std::string RtcEventLogEncoderLegacy::BweUpdateLossBased(
298 const RtcEventBweUpdateLossBased& event) {
299 rtclog::Event rtclog_event;
300 rtclog_event.set_timestamp_us(event.timestamp_us_);
301 rtclog_event.set_type(rtclog::Event::LOSS_BASED_BWE_UPDATE);
302
303 auto bwe_event = rtclog_event.mutable_loss_based_bwe_update();
304 bwe_event->set_bitrate_bps(event.bitrate_bps_);
305 bwe_event->set_fraction_loss(event.fraction_loss_);
306 bwe_event->set_total_packets(event.total_packets_);
307
308 return Serialize(&rtclog_event);
309 }
310
311 std::string RtcEventLogEncoderLegacy::LoggingStarted(
312 const RtcEventLoggingStarted& event) {
313 rtclog::Event rtclog_event;
314 rtclog_event.set_timestamp_us(event.timestamp_us_);
315 rtclog_event.set_type(rtclog::Event::LOG_START);
316 return Serialize(&rtclog_event);
317 }
318
319 std::string RtcEventLogEncoderLegacy::LoggingStopped(
320 const RtcEventLoggingStopped& event) {
321 rtclog::Event rtclog_event;
322 rtclog_event.set_timestamp_us(event.timestamp_us_);
323 rtclog_event.set_type(rtclog::Event::LOG_END);
324 return Serialize(&rtclog_event);
325 }
326
327 std::string RtcEventLogEncoderLegacy::ProbeClusterCreated(
328 const RtcEventProbeClusterCreated& event) {
329 rtclog::Event rtclog_event;
330 rtclog_event.set_timestamp_us(event.timestamp_us_);
331 rtclog_event.set_type(rtclog::Event::BWE_PROBE_CLUSTER_CREATED_EVENT);
332
333 auto probe_cluster = rtclog_event.mutable_probe_cluster();
334 probe_cluster->set_id(event.id_);
335 probe_cluster->set_bitrate_bps(event.bitrate_bps_);
336 probe_cluster->set_min_packets(event.min_probes_);
337 probe_cluster->set_min_bytes(event.min_bytes_);
338
339 return Serialize(&rtclog_event);
340 }
341
342 std::string RtcEventLogEncoderLegacy::ProbeResultFailure(
343 const RtcEventProbeResultFailure& event) {
344 rtclog::Event rtclog_event;
345 rtclog_event.set_timestamp_us(event.timestamp_us_);
346 rtclog_event.set_type(rtclog::Event::BWE_PROBE_RESULT_EVENT);
347
348 auto probe_result = rtclog_event.mutable_probe_result();
349 probe_result->set_id(event.id_);
350 probe_result->set_result(ConvertProbeResultType(event.failure_reason_));
351
352 return Serialize(&rtclog_event);
353 }
354
355 std::string RtcEventLogEncoderLegacy::ProbeResultSuccess(
356 const RtcEventProbeResultSuccess& event) {
357 rtclog::Event rtclog_event;
358 rtclog_event.set_timestamp_us(event.timestamp_us_);
359 rtclog_event.set_type(rtclog::Event::BWE_PROBE_RESULT_EVENT);
360
361 auto probe_result = rtclog_event.mutable_probe_result();
362 probe_result->set_id(event.id_);
363 probe_result->set_result(rtclog::BweProbeResult::SUCCESS);
364 probe_result->set_bitrate_bps(event.bitrate_bps_);
365
366 return Serialize(&rtclog_event);
367 }
368
369 std::string RtcEventLogEncoderLegacy::RtcpPacketIncoming(
370 const RtcEventRtcpPacketIncoming& event) {
371 return RtcpPacket(event.timestamp_us_, event.packet_, true);
372 }
373
374 std::string RtcEventLogEncoderLegacy::RtcpPacketOutgoing(
375 const RtcEventRtcpPacketOutgoing& event) {
376 return RtcpPacket(event.timestamp_us_, event.packet_, false);
377 }
378
379 std::string RtcEventLogEncoderLegacy::RtpPacketIncoming(
380 const RtcEventRtpPacketIncoming& event) {
381 return RtpPacket(event.timestamp_us_, event.header_, event.packet_length_,
382 true);
383 }
384
385 std::string RtcEventLogEncoderLegacy::RtpPacketOutgoing(
386 const RtcEventRtpPacketOutgoing& event) {
387 return RtpPacket(event.timestamp_us_, event.header_, event.packet_length_,
388 false);
389 }
390
391 std::string RtcEventLogEncoderLegacy::VideoReceiveStreamConfig(
392 const RtcEventVideoReceiveStreamConfig& event) {
393 rtclog::Event rtclog_event;
394 rtclog_event.set_timestamp_us(event.timestamp_us_);
395 rtclog_event.set_type(rtclog::Event::VIDEO_RECEIVER_CONFIG_EVENT);
396
397 rtclog::VideoReceiveConfig* receiver_config =
398 rtclog_event.mutable_video_receiver_config();
399 receiver_config->set_remote_ssrc(event.config_->remote_ssrc);
400 receiver_config->set_local_ssrc(event.config_->local_ssrc);
401
402 // TODO(perkj): Add field for rsid.
403 receiver_config->set_rtcp_mode(ConvertRtcpMode(event.config_->rtcp_mode));
404 receiver_config->set_remb(event.config_->remb);
405
406 for (const auto& e : event.config_->rtp_extensions) {
407 rtclog::RtpHeaderExtension* extension =
408 receiver_config->add_header_extensions();
409 extension->set_name(e.uri);
410 extension->set_id(e.id);
411 }
412
413 for (const auto& d : event.config_->codecs) {
414 rtclog::DecoderConfig* decoder = receiver_config->add_decoders();
415 decoder->set_name(d.payload_name);
416 decoder->set_payload_type(d.payload_type);
417 if (d.rtx_payload_type != 0) {
418 rtclog::RtxMap* rtx = receiver_config->add_rtx_map();
419 rtx->set_payload_type(d.payload_type);
420 rtx->mutable_config()->set_rtx_ssrc(event.config_->rtx_ssrc);
421 rtx->mutable_config()->set_rtx_payload_type(d.rtx_payload_type);
422 }
423 }
424
425 return Serialize(&rtclog_event);
426 }
427
428 std::string RtcEventLogEncoderLegacy::VideoSendStreamConfig(
429 const RtcEventVideoSendStreamConfig& event) {
430 rtclog::Event rtclog_event;
431 rtclog_event.set_timestamp_us(event.timestamp_us_);
432 rtclog_event.set_type(rtclog::Event::VIDEO_SENDER_CONFIG_EVENT);
433
434 rtclog::VideoSendConfig* sender_config =
435 rtclog_event.mutable_video_sender_config();
436
437 // TODO(perkj): rtclog::VideoSendConfig should only contain one SSRC.
438 sender_config->add_ssrcs(event.config_->local_ssrc);
439 if (event.config_->rtx_ssrc != 0) {
440 sender_config->add_rtx_ssrcs(event.config_->rtx_ssrc);
441 }
442
443 for (const auto& e : event.config_->rtp_extensions) {
444 rtclog::RtpHeaderExtension* extension =
445 sender_config->add_header_extensions();
446 extension->set_name(e.uri);
447 extension->set_id(e.id);
448 }
449
450 // TODO(perkj): rtclog::VideoSendConfig should contain many possible codec
451 // configurations.
452 for (const auto& codec : event.config_->codecs) {
453 sender_config->set_rtx_payload_type(codec.rtx_payload_type);
454 rtclog::EncoderConfig* encoder = sender_config->mutable_encoder();
455 encoder->set_name(codec.payload_name);
456 encoder->set_payload_type(codec.payload_type);
457
458 if (event.config_->codecs.size() > 1) {
459 LOG(WARNING) << "LogVideoSendStreamConfig currently only supports one "
460 << "codec. Logging codec :" << codec.payload_name;
461 break;
462 }
463 }
464
465 return Serialize(&rtclog_event);
466 }
467
468 std::string RtcEventLogEncoderLegacy::RtcpPacket(int64_t timestamp_us,
469 const rtc::Buffer& packet,
470 bool is_incoming) {
471 rtclog::Event rtclog_event;
472 rtclog_event.set_timestamp_us(timestamp_us);
473 rtclog_event.set_type(rtclog::Event::RTCP_EVENT);
474 rtclog_event.mutable_rtcp_packet()->set_incoming(is_incoming);
475
476 rtcp::CommonHeader header;
477 const uint8_t* block_begin = packet.data();
478 const uint8_t* packet_end = packet.data() + packet.size();
479 RTC_DCHECK(packet.size() <= IP_PACKET_SIZE);
480 uint8_t buffer[IP_PACKET_SIZE];
481 uint32_t buffer_length = 0;
482 while (block_begin < packet_end) {
483 if (!header.Parse(block_begin, packet_end - block_begin)) {
484 break; // Incorrect message header.
485 }
486 const uint8_t* next_block = header.NextPacket();
487 uint32_t block_size = next_block - block_begin;
488 switch (header.type()) {
489 case rtcp::Bye::kPacketType:
490 case rtcp::ExtendedJitterReport::kPacketType:
491 case rtcp::ExtendedReports::kPacketType:
492 case rtcp::Psfb::kPacketType:
493 case rtcp::ReceiverReport::kPacketType:
494 case rtcp::Rtpfb::kPacketType:
495 case rtcp::SenderReport::kPacketType:
496 // We log sender reports, receiver reports, bye messages
497 // inter-arrival jitter, third-party loss reports, payload-specific
498 // feedback and extended reports.
499 memcpy(buffer + buffer_length, block_begin, block_size);
500 buffer_length += block_size;
501 break;
502 case rtcp::App::kPacketType:
503 case rtcp::Sdes::kPacketType:
504 default:
505 // We don't log sender descriptions, application defined messages
506 // or message blocks of unknown type.
507 break;
508 }
509
510 block_begin += block_size;
511 }
512 rtclog_event.mutable_rtcp_packet()->set_packet_data(buffer, buffer_length);
513
514 return Serialize(&rtclog_event);
515 }
516
517 std::string RtcEventLogEncoderLegacy::RtpPacket(int64_t timestamp_us,
518 const rtp::Packet& header,
519 size_t packet_length,
520 bool is_incoming) {
521 rtclog::Event rtclog_event;
522 rtclog_event.set_timestamp_us(timestamp_us);
523 rtclog_event.set_type(rtclog::Event::RTP_EVENT);
524
525 rtclog_event.mutable_rtp_packet()->set_incoming(is_incoming);
526 rtclog_event.mutable_rtp_packet()->set_packet_length(packet_length);
527 rtclog_event.mutable_rtp_packet()->set_header(header.data(), header.size());
528
529 return Serialize(&rtclog_event);
530 }
531
532 std::string RtcEventLogEncoderLegacy::Serialize(rtclog::Event* event) {
533 // Even though we're only serializing a single event during this call, what
534 // we intend to get is a list of events, with a tag and length preceding
535 // each actual event. To produce that, we serialize a list of a single event.
536 // If we later concatenate several results from this function, the result will
537 // be a proper concatenation of all those events.
538
539 rtclog::EventStream event_stream;
540 event_stream.add_stream();
541
542 // As a tweak, we swap the new event into the event-stream, write that to
543 // file, then swap back. This saves on some copying, while making sure that
544 // the caller wouldn't be surprised by Serialize() modifying the object.
545 rtclog::Event* output_event = event_stream.mutable_stream(0);
546 output_event->Swap(event);
547
548 std::string output_string;
549 event_stream.AppendToString(&output_string);
550
551 // When the function returns, the original Event will be unchanged.
552 output_event->Swap(event);
553
554 return output_string;
555 }
556
557 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698