video_receive_stream.cc (6742B)
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 "call/video_receive_stream.h" 12 13 #include <cstddef> 14 #include <cstdint> 15 #include <string> 16 #include <utility> 17 18 #include "api/call/transport.h" 19 #include "api/rtp_headers.h" 20 #include "api/video_codecs/sdp_video_format.h" 21 #include "rtc_base/strings/string_builder.h" 22 23 namespace webrtc { 24 25 VideoReceiveStreamInterface::Decoder::Decoder(SdpVideoFormat video_format, 26 int payload_type) 27 : video_format(std::move(video_format)), payload_type(payload_type) {} 28 VideoReceiveStreamInterface::Decoder::Decoder() : video_format("Unset") {} 29 VideoReceiveStreamInterface::Decoder::Decoder(const Decoder&) = default; 30 VideoReceiveStreamInterface::Decoder::~Decoder() = default; 31 32 bool VideoReceiveStreamInterface::Decoder::operator==( 33 const Decoder& other) const { 34 return payload_type == other.payload_type && 35 video_format == other.video_format; 36 } 37 38 std::string VideoReceiveStreamInterface::Decoder::ToString() const { 39 StringBuilder ss; 40 ss << "{payload_type: " << payload_type; 41 ss << ", payload_name: " << video_format.name; 42 ss << ", codec_params: {"; 43 for (auto it = video_format.parameters.begin(); 44 it != video_format.parameters.end(); ++it) { 45 if (it != video_format.parameters.begin()) { 46 ss << ", "; 47 } 48 ss << it->first << ": " << it->second; 49 } 50 ss << "}"; 51 ss << "}"; 52 53 return ss.str(); 54 } 55 56 VideoReceiveStreamInterface::Stats::Stats() = default; 57 VideoReceiveStreamInterface::Stats::~Stats() = default; 58 59 std::string VideoReceiveStreamInterface::Stats::ToString( 60 int64_t time_ms) const { 61 StringBuilder ss; 62 ss << "VideoReceiveStreamInterface stats: " << time_ms << ", {ssrc: " << ssrc 63 << ", "; 64 ss << "total_bps: " << total_bitrate_bps << ", "; 65 // Spec-compliant stats are camelCased to distinguish them from 66 // the legacy and internal stats. 67 ss << "frameWidth: " << width << ", "; 68 ss << "frameHeight: " << height << ", "; 69 // TODO(crbug.com/webrtc/15166): `key` and `delta` will not 70 // perfectly match the other frame counters. 71 ss << "key: " << frame_counts.key_frames << ", "; 72 ss << "delta: " << frame_counts.delta_frames << ", "; 73 ss << "framesAssembledFromMultiplePackets: " 74 << frames_assembled_from_multiple_packets << ", "; 75 ss << "framesDecoded: " << frames_decoded << ", "; 76 ss << "framesDropped: " << frames_dropped << ", "; 77 ss << "network_fps: " << network_frame_rate << ", "; 78 ss << "decode_fps: " << decode_frame_rate << ", "; 79 ss << "render_fps: " << render_frame_rate << ", "; 80 ss << "decode_ms: " << decode_ms << ", "; 81 ss << "max_decode_ms: " << max_decode_ms << ", "; 82 ss << "first_frame_received_to_decoded_ms: " 83 << first_frame_received_to_decoded_ms << ", "; 84 ss << "current_delay_ms: " << current_delay_ms << ", "; 85 ss << "target_delay_ms: " << target_delay_ms << ", "; 86 ss << "jitter_delay_ms: " << jitter_buffer_ms << ", "; 87 ss << "totalAssemblyTime: " << total_assembly_time.seconds<double>() << ", "; 88 ss << "jitterBufferDelay: " << jitter_buffer_delay.seconds<double>() << ", "; 89 ss << "jitterBufferTargetDelay: " 90 << jitter_buffer_target_delay.seconds<double>() << ", "; 91 ss << "jitterBufferEmittedCount: " << jitter_buffer_emitted_count << ", "; 92 ss << "jitterBufferMinimumDelay: " 93 << jitter_buffer_minimum_delay.seconds<double>() << ", "; 94 ss << "totalDecodeTime: " << total_decode_time.seconds<double>() << ", "; 95 ss << "totalProcessingDelay: " << total_processing_delay.seconds<double>() 96 << ", "; 97 ss << "min_playout_delay_ms: " << min_playout_delay_ms << ", "; 98 ss << "sync_offset_ms: " << sync_offset_ms << ", "; 99 ss << "cum_loss: " << rtp_stats.packets_lost << ", "; 100 ss << "nackCount: " << rtcp_packet_type_counts.nack_packets << ", "; 101 ss << "firCount: " << rtcp_packet_type_counts.fir_packets << ", "; 102 ss << "pliCount: " << rtcp_packet_type_counts.pli_packets; 103 ss << "}"; 104 return ss.str(); 105 } 106 107 VideoReceiveStreamInterface::Config::Config(const Config&) = default; 108 VideoReceiveStreamInterface::Config::Config(Config&&) = default; 109 VideoReceiveStreamInterface::Config::Config( 110 Transport* rtcp_send_transport, 111 VideoDecoderFactory* decoder_factory) 112 : decoder_factory(decoder_factory), 113 rtcp_send_transport(rtcp_send_transport) {} 114 115 VideoReceiveStreamInterface::Config& 116 VideoReceiveStreamInterface::Config::operator=(Config&&) = default; 117 VideoReceiveStreamInterface::Config::Config::~Config() = default; 118 119 std::string VideoReceiveStreamInterface::Config::ToString() const { 120 StringBuilder ss; 121 ss << "{decoders: ["; 122 for (size_t i = 0; i < decoders.size(); ++i) { 123 ss << decoders[i].ToString(); 124 if (i != decoders.size() - 1) 125 ss << ", "; 126 } 127 ss << "]"; 128 ss << ", rtp: " << rtp.ToString(); 129 ss << ", renderer: " << (renderer ? "(renderer)" : "nullptr"); 130 ss << ", render_delay_ms: " << render_delay_ms; 131 if (!sync_group.empty()) 132 ss << ", sync_group: " << sync_group; 133 ss << "}"; 134 135 return ss.str(); 136 } 137 138 VideoReceiveStreamInterface::Config::Rtp::Rtp() = default; 139 VideoReceiveStreamInterface::Config::Rtp::Rtp(const Rtp&) = default; 140 VideoReceiveStreamInterface::Config::Rtp::~Rtp() = default; 141 142 std::string VideoReceiveStreamInterface::Config::Rtp::ToString() const { 143 StringBuilder ss; 144 ss << "{remote_ssrc: " << remote_ssrc; 145 ss << ", local_ssrc: " << local_ssrc; 146 ss << ", rtcp_mode: " 147 << (rtcp_mode == RtcpMode::kCompound ? "RtcpMode::kCompound" 148 : "RtcpMode::kReducedSize"); 149 ss << ", rtcp_xr: "; 150 ss << "{receiver_reference_time_report: " 151 << (rtcp_xr.receiver_reference_time_report ? "on" : "off"); 152 ss << "}"; 153 ss << ", lntf: {enabled: " << (lntf.enabled ? "true" : "false") << "}"; 154 ss << ", nack: {rtp_history_ms: " << nack.rtp_history_ms << "}"; 155 ss << ", ulpfec_payload_type: " << ulpfec_payload_type; 156 ss << ", red_type: " << red_payload_type; 157 ss << ", rtx_ssrc: " << rtx_ssrc; 158 ss << ", rtx_payload_types: {"; 159 for (auto& kv : rtx_associated_payload_types) { 160 ss << kv.first << " (pt) -> " << kv.second << " (apt), "; 161 } 162 ss << "}"; 163 ss << ", raw_payload_types: {"; 164 for (const auto& pt : raw_payload_types) { 165 ss << pt << ", "; 166 } 167 ss << "}"; 168 ss << ", rtcp_event_observer: " 169 << (rtcp_event_observer ? "(rtcp_event_observer)" : "nullptr"); 170 ss << "}"; 171 return ss.str(); 172 } 173 174 } // namespace webrtc