diff --git a/webrtc/media/base/mediachannel.h b/webrtc/media/base/mediachannel.h index 4262ff54de..b254a14933 100644 --- a/webrtc/media/base/mediachannel.h +++ b/webrtc/media/base/mediachannel.h @@ -692,7 +692,11 @@ struct VideoSenderInfo : public MediaSenderInfo { frames_encoded(0) {} std::vector ssrc_groups; + // TODO(hbos): Move this to |VideoMediaInfo::send_codecs|? std::string encoder_implementation_name; + // TODO(hbos): Move this to |MediaSenderInfo| when supported by + // |VoiceSenderInfo| as well (which also extends that class). + rtc::Optional codec_payload_type; int packets_cached; int firs_rcvd; int plis_rcvd; @@ -736,7 +740,11 @@ struct VideoReceiverInfo : public MediaReceiverInfo { } std::vector ssrc_groups; + // TODO(hbos): Move this to |VideoMediaInfo::receive_codecs|? std::string decoder_implementation_name; + // TODO(hbos): Move this to |MediaReceiverInfo| when supported by + // |VoiceReceiverInfo| as well (which also extends that class). + rtc::Optional codec_payload_type; int packets_concealed; int firs_sent; int plis_sent; @@ -812,6 +820,9 @@ struct BandwidthEstimationInfo { int64_t bucket_delay; }; +// Maps from payload type to |RtpCodecParameters|. +typedef std::map RtpCodecParametersMap; + struct VoiceMediaInfo { void Clear() { senders.clear(); @@ -826,10 +837,14 @@ struct VideoMediaInfo { senders.clear(); receivers.clear(); bw_estimations.clear(); + send_codecs.clear(); + receive_codecs.clear(); } std::vector senders; std::vector receivers; std::vector bw_estimations; + RtpCodecParametersMap send_codecs; + RtpCodecParametersMap receive_codecs; }; struct DataMediaInfo { diff --git a/webrtc/media/base/videoengine_unittest.h b/webrtc/media/base/videoengine_unittest.h index aaa03b3e86..024ae5d22e 100644 --- a/webrtc/media/base/videoengine_unittest.h +++ b/webrtc/media/base/videoengine_unittest.h @@ -423,6 +423,8 @@ class VideoMediaChannelTest : public testing::Test, EXPECT_GT(info.senders[0].bytes_sent, 0); EXPECT_EQ(NumRtpPackets(), info.senders[0].packets_sent); EXPECT_EQ(0.0, info.senders[0].fraction_lost); + ASSERT_TRUE(info.senders[0].codec_payload_type); + EXPECT_EQ(DefaultCodec().id, *info.senders[0].codec_payload_type); EXPECT_EQ(0, info.senders[0].firs_rcvd); EXPECT_EQ(0, info.senders[0].plis_rcvd); EXPECT_EQ(0, info.senders[0].nacks_rcvd); @@ -431,10 +433,16 @@ class VideoMediaChannelTest : public testing::Test, EXPECT_GT(info.senders[0].framerate_input, 0); EXPECT_GT(info.senders[0].framerate_sent, 0); + EXPECT_EQ(1U, info.send_codecs.count(DefaultCodec().id)); + EXPECT_EQ(DefaultCodec().ToCodecParameters(), + info.send_codecs[DefaultCodec().id]); + ASSERT_EQ(1U, info.receivers.size()); EXPECT_EQ(1U, info.senders[0].ssrcs().size()); EXPECT_EQ(1U, info.receivers[0].ssrcs().size()); EXPECT_EQ(info.senders[0].ssrcs()[0], info.receivers[0].ssrcs()[0]); + ASSERT_TRUE(info.receivers[0].codec_payload_type); + EXPECT_EQ(DefaultCodec().id, *info.receivers[0].codec_payload_type); EXPECT_EQ(NumRtpBytes(), info.receivers[0].bytes_rcvd); EXPECT_EQ(NumRtpPackets(), info.receivers[0].packets_rcvd); EXPECT_EQ(0.0, info.receivers[0].fraction_lost); @@ -449,6 +457,10 @@ class VideoMediaChannelTest : public testing::Test, EXPECT_GT(info.receivers[0].framerate_rcvd, 0); EXPECT_GT(info.receivers[0].framerate_decoded, 0); EXPECT_GT(info.receivers[0].framerate_output, 0); + + EXPECT_EQ(1U, info.receive_codecs.count(DefaultCodec().id)); + EXPECT_EQ(DefaultCodec().ToCodecParameters(), + info.receive_codecs[DefaultCodec().id]); } cricket::VideoSenderInfo GetSenderStats(size_t i) { diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc index 2ebbd78e98..99ca238753 100644 --- a/webrtc/media/engine/webrtcvideoengine2.cc +++ b/webrtc/media/engine/webrtcvideoengine2.cc @@ -1334,6 +1334,7 @@ bool WebRtcVideoChannel2::GetStats(VideoMediaInfo* info) { info->Clear(); FillSenderStats(info, log_stats); FillReceiverStats(info, log_stats); + FillSendAndReceiveCodecStats(info); webrtc::Call::Stats stats = call_->GetStats(); FillBandwidthEstimationStats(stats, info); if (stats.rtt_ms != -1) { @@ -1388,6 +1389,20 @@ void WebRtcVideoChannel2::FillBandwidthEstimationStats( video_media_info->bw_estimations.push_back(bwe_info); } +void WebRtcVideoChannel2::FillSendAndReceiveCodecStats( + VideoMediaInfo* video_media_info) { + for (const VideoCodec& codec : send_params_.codecs) { + webrtc::RtpCodecParameters codec_params = codec.ToCodecParameters(); + video_media_info->send_codecs.insert( + std::make_pair(codec_params.payload_type, std::move(codec_params))); + } + for (const VideoCodec& codec : recv_params_.codecs) { + webrtc::RtpCodecParameters codec_params = codec.ToCodecParameters(); + video_media_info->receive_codecs.insert( + std::make_pair(codec_params.payload_type, std::move(codec_params))); + } +} + void WebRtcVideoChannel2::OnPacketReceived( rtc::CopyOnWriteBuffer* packet, const rtc::PacketTime& packet_time) { @@ -1992,8 +2007,11 @@ VideoSenderInfo WebRtcVideoChannel2::WebRtcVideoSendStream::GetVideoSenderInfo( for (uint32_t ssrc : parameters_.config.rtp.ssrcs) info.add_ssrc(ssrc); - if (parameters_.codec_settings) + if (parameters_.codec_settings) { info.codec_name = parameters_.codec_settings->codec.name; + info.codec_payload_type = rtc::Optional( + static_cast(parameters_.codec_settings->codec.id)); + } if (stream_ == NULL) return info; @@ -2401,6 +2419,10 @@ WebRtcVideoChannel2::WebRtcVideoReceiveStream::GetVideoReceiverInfo( info.add_ssrc(config_.rtp.remote_ssrc); webrtc::VideoReceiveStream::Stats stats = stream_->GetStats(); info.decoder_implementation_name = stats.decoder_implementation_name; + if (stats.current_payload_type != -1) { + info.codec_payload_type = rtc::Optional( + static_cast(stats.current_payload_type)); + } info.bytes_rcvd = stats.rtp_stats.transmitted.payload_bytes + stats.rtp_stats.transmitted.header_bytes + stats.rtp_stats.transmitted.padding_bytes; diff --git a/webrtc/media/engine/webrtcvideoengine2.h b/webrtc/media/engine/webrtcvideoengine2.h index 24019bc3d1..28dfb9773a 100644 --- a/webrtc/media/engine/webrtcvideoengine2.h +++ b/webrtc/media/engine/webrtcvideoengine2.h @@ -474,6 +474,7 @@ class WebRtcVideoChannel2 : public VideoMediaChannel, public webrtc::Transport { void FillReceiverStats(VideoMediaInfo* info, bool log_stats); void FillBandwidthEstimationStats(const webrtc::Call::Stats& stats, VideoMediaInfo* info); + void FillSendAndReceiveCodecStats(VideoMediaInfo* video_media_info); rtc::ThreadChecker thread_checker_;