diff options
author | pwestin@google.com <pwestin@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-11 17:00:51 +0000 |
---|---|---|
committer | pwestin@google.com <pwestin@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-11 17:00:51 +0000 |
commit | 08c318539f67ece9a88724c1f00bc7d0032980a7 (patch) | |
tree | 7345320e64b7ca2c6f9c9ba3aae1a108d9776b29 /media/cast/video_sender | |
parent | 4c91c1d65b41305e9e9b3b3264baf446c11f0b04 (diff) | |
download | chromium_src-08c318539f67ece9a88724c1f00bc7d0032980a7.zip chromium_src-08c318539f67ece9a88724c1f00bc7d0032980a7.tar.gz chromium_src-08c318539f67ece9a88724c1f00bc7d0032980a7.tar.bz2 |
Cast: Wire up sending status log messages from sender to receiver.
Includes both handling of the received message in the receiver and
sending the message in the sender. The acctual packeiztion and parser
has been landed in prior CLs.
Review URL: https://codereview.chromium.org/105883010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@240122 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/cast/video_sender')
-rw-r--r-- | media/cast/video_sender/video_sender.cc | 57 |
1 files changed, 52 insertions, 5 deletions
diff --git a/media/cast/video_sender/video_sender.cc b/media/cast/video_sender/video_sender.cc index aa0e162..91679d9 100644 --- a/media/cast/video_sender/video_sender.cc +++ b/media/cast/video_sender/video_sender.cc @@ -215,7 +215,7 @@ void VideoSender::IncomingRtcpPacket(const uint8* packet, size_t length, void VideoSender::ScheduleNextRtcpReport() { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); base::TimeDelta time_to_next = rtcp_->TimeToSendNextRtcpReport() - - cast_environment_->Clock()->NowTicks(); + cast_environment_->Clock()->NowTicks(); time_to_next = std::max(time_to_next, base::TimeDelta::FromMilliseconds(kMinSchedulingDelayMs)); @@ -227,7 +227,54 @@ void VideoSender::ScheduleNextRtcpReport() { void VideoSender::SendRtcpReport() { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - rtcp_->SendRtcpFromRtpSender(NULL); // TODO(pwestin): add logging. + + RtcpSenderLogMessage sender_log_message; + const FrameRawMap& frame_raw_map = + cast_environment_->Logging()->GetFrameRawData(); + + FrameRawMap::const_iterator it = frame_raw_map.begin(); + while (it != frame_raw_map.end()) { + RtcpSenderFrameLogMessage frame_message; + frame_message.rtp_timestamp = it->first; + frame_message.frame_status = kRtcpSenderFrameStatusUnknown; + if (it->second.type.empty()) { + ++it; + continue; + } + CastLoggingEvent last_event = it->second.type.back(); + switch (last_event) { + case kVideoFrameCaptured: + frame_message.frame_status = kRtcpSenderFrameStatusDroppedByFlowControl; + break; + case kVideoFrameSentToEncoder: + frame_message.frame_status = kRtcpSenderFrameStatusDroppedByEncoder; + break; + case kVideoFrameEncoded: + frame_message.frame_status = kRtcpSenderFrameStatusSentToNetwork; + break; + default: + ++it; + continue; + } + ++it; + if (it == frame_raw_map.end()) { + // Last message on our map; only send if it is kVideoFrameEncoded. + if (last_event != kVideoFrameEncoded) { + // For other events we will wait for it to finish and report the result + // in the next report. + break; + } + } + sender_log_message.push_back(frame_message); + } + rtcp_->SendRtcpFromRtpSender(&sender_log_message); + if (!sender_log_message.empty()) { + VLOG(1) << "Failed to send all log messages"; + } + + // TODO(pwestin): When we start pulling out the logging by other means we need + // to synchronize this. + cast_environment_->Logging()->Reset(); ScheduleNextRtcpReport(); } @@ -256,7 +303,7 @@ void VideoSender::ResendCheck() { if (time_since_last_send > rtp_max_delay_) { if (last_acked_frame_id_ == -1) { // We have not received any ack, send a key frame. - video_encoder_controller_->GenerateKeyFrame(); + video_encoder_controller_->GenerateKeyFrame(); last_acked_frame_id_ = -1; last_sent_frame_id_ = -1; UpdateFramesInFlight(); @@ -280,8 +327,8 @@ void VideoSender::ScheduleNextSkippedFramesCheck() { base::TimeDelta::FromMilliseconds(kSkippedFramesCheckPeriodkMs); } else { time_to_next = last_checked_skip_count_time_ - - cast_environment_->Clock()->NowTicks() + - base::TimeDelta::FromMilliseconds(kSkippedFramesCheckPeriodkMs); + cast_environment_->Clock()->NowTicks() + + base::TimeDelta::FromMilliseconds(kSkippedFramesCheckPeriodkMs); } time_to_next = std::max(time_to_next, base::TimeDelta::FromMilliseconds(kMinSchedulingDelayMs)); |