summaryrefslogtreecommitdiffstats
path: root/media/cast/video_sender
diff options
context:
space:
mode:
authorpwestin@google.com <pwestin@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-11 17:00:51 +0000
committerpwestin@google.com <pwestin@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-11 17:00:51 +0000
commit08c318539f67ece9a88724c1f00bc7d0032980a7 (patch)
tree7345320e64b7ca2c6f9c9ba3aae1a108d9776b29 /media/cast/video_sender
parent4c91c1d65b41305e9e9b3b3264baf446c11f0b04 (diff)
downloadchromium_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.cc57
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));