| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/cast/video_sender/video_sender.h" | 5 #include "media/cast/video_sender/video_sender.h" |
| 6 | 6 |
| 7 #include <list> | 7 #include <list> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 | 219 |
| 220 cast_environment_->PostDelayedTask(CastEnvironment::MAIN, FROM_HERE, | 220 cast_environment_->PostDelayedTask(CastEnvironment::MAIN, FROM_HERE, |
| 221 base::Bind(&VideoSender::SendRtcpReport, weak_factory_.GetWeakPtr()), | 221 base::Bind(&VideoSender::SendRtcpReport, weak_factory_.GetWeakPtr()), |
| 222 time_to_next); | 222 time_to_next); |
| 223 } | 223 } |
| 224 | 224 |
| 225 void VideoSender::SendRtcpReport() { | 225 void VideoSender::SendRtcpReport() { |
| 226 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 226 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
| 227 | 227 |
| 228 transport::RtcpSenderLogMessage sender_log_message; | 228 transport::RtcpSenderLogMessage sender_log_message; |
| 229 const FrameRawMap& frame_raw_map = | 229 VideoRtcpRawMap video_logs = |
| 230 cast_environment_->Logging()->GetFrameRawData(); | 230 cast_environment_->Logging()->GetVideoRtcpRawData(); |
| 231 | 231 |
| 232 FrameRawMap::const_iterator it = frame_raw_map.begin(); | 232 while (!video_logs.empty()) { |
| 233 while (it != frame_raw_map.end()) { | 233 VideoRtcpRawMap::iterator it = video_logs.begin(); |
| 234 uint32 rtp_timestamp = it->first; |
| 235 |
| 234 transport::RtcpSenderFrameLogMessage frame_message; | 236 transport::RtcpSenderFrameLogMessage frame_message; |
| 235 frame_message.rtp_timestamp = it->first; | 237 frame_message.rtp_timestamp = rtp_timestamp; |
| 236 frame_message.frame_status = transport::kRtcpSenderFrameStatusUnknown; | 238 frame_message.frame_status = transport::kRtcpSenderFrameStatusUnknown; |
| 237 if (it->second.type.empty()) { | 239 |
| 238 ++it; | 240 switch (it->second.type) { |
| 239 continue; | |
| 240 } | |
| 241 CastLoggingEvent last_event = it->second.type.back(); | |
| 242 switch (last_event) { | |
| 243 case kVideoFrameCaptured: | 241 case kVideoFrameCaptured: |
| 244 frame_message.frame_status = | 242 frame_message.frame_status = |
| 245 transport::kRtcpSenderFrameStatusDroppedByFlowControl; | 243 transport::kRtcpSenderFrameStatusDroppedByFlowControl; |
| 246 break; | 244 break; |
| 247 case kVideoFrameSentToEncoder: | 245 case kVideoFrameSentToEncoder: |
| 248 frame_message.frame_status = | 246 frame_message.frame_status = |
| 249 transport::kRtcpSenderFrameStatusDroppedByEncoder; | 247 transport::kRtcpSenderFrameStatusDroppedByEncoder; |
| 250 break; | 248 break; |
| 251 case kVideoFrameEncoded: | 249 case kVideoFrameEncoded: |
| 252 frame_message.frame_status = | 250 frame_message.frame_status = |
| 253 transport::kRtcpSenderFrameStatusSentToNetwork; | 251 transport::kRtcpSenderFrameStatusSentToNetwork; |
| 254 break; | 252 break; |
| 255 default: | 253 default: |
| 256 ++it; | 254 NOTREACHED(); |
| 257 continue; | 255 break; |
| 258 } | 256 } |
| 259 ++it; | 257 video_logs.erase(rtp_timestamp); |
| 260 if (it == frame_raw_map.end()) { | |
| 261 // Last message on our map; only send if it is kVideoFrameEncoded. | |
| 262 if (last_event != kVideoFrameEncoded) { | |
| 263 // For other events we will wait for it to finish and report the result | |
| 264 // in the next report. | |
| 265 break; | |
| 266 } | |
| 267 } | |
| 268 sender_log_message.push_back(frame_message); | 258 sender_log_message.push_back(frame_message); |
| 269 } | 259 } |
| 270 rtcp_->SendRtcpFromRtpSender(&sender_log_message); | 260 rtcp_->SendRtcpFromRtpSender(&sender_log_message); |
| 271 if (!sender_log_message.empty()) { | 261 if (!sender_log_message.empty()) { |
| 272 VLOG(1) << "Failed to send all log messages"; | 262 VLOG(1) << "Failed to send all log messages"; |
| 273 } | 263 } |
| 274 | |
| 275 // TODO(pwestin): When we start pulling out the logging by other means we need | |
| 276 // to synchronize this. | |
| 277 cast_environment_->Logging()->ResetRaw(); | |
| 278 ScheduleNextRtcpReport(); | 264 ScheduleNextRtcpReport(); |
| 279 } | 265 } |
| 280 | 266 |
| 281 void VideoSender::ScheduleNextResendCheck() { | 267 void VideoSender::ScheduleNextResendCheck() { |
| 282 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 268 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
| 283 base::TimeDelta time_to_next; | 269 base::TimeDelta time_to_next; |
| 284 if (last_send_time_.is_null()) { | 270 if (last_send_time_.is_null()) { |
| 285 time_to_next = rtp_max_delay_; | 271 time_to_next = rtp_max_delay_; |
| 286 } else { | 272 } else { |
| 287 time_to_next = last_send_time_ - cast_environment_->Clock()->NowTicks() + | 273 time_to_next = last_send_time_ - cast_environment_->Clock()->NowTicks() + |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 408 video_encoder_->SetBitRate(new_bitrate); | 394 video_encoder_->SetBitRate(new_bitrate); |
| 409 } | 395 } |
| 410 } | 396 } |
| 411 ReceivedAck(cast_feedback.ack_frame_id_); | 397 ReceivedAck(cast_feedback.ack_frame_id_); |
| 412 } | 398 } |
| 413 | 399 |
| 414 void VideoSender::ReceivedAck(uint32 acked_frame_id) { | 400 void VideoSender::ReceivedAck(uint32 acked_frame_id) { |
| 415 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 401 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
| 416 last_acked_frame_id_ = static_cast<int>(acked_frame_id); | 402 last_acked_frame_id_ = static_cast<int>(acked_frame_id); |
| 417 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); | 403 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
| 418 cast_environment_->Logging()->InsertGenericEvent(now, kAckReceived, | 404 cast_environment_->Logging()->InsertGenericEvent(now, kVideoAckReceived, |
| 419 acked_frame_id); | 405 acked_frame_id); |
| 420 VLOG(1) << "ReceivedAck:" << static_cast<int>(acked_frame_id); | 406 VLOG(1) << "ReceivedAck:" << static_cast<int>(acked_frame_id); |
| 421 last_acked_frame_id_ = acked_frame_id; | 407 last_acked_frame_id_ = acked_frame_id; |
| 422 UpdateFramesInFlight(); | 408 UpdateFramesInFlight(); |
| 423 } | 409 } |
| 424 | 410 |
| 425 void VideoSender::UpdateFramesInFlight() { | 411 void VideoSender::UpdateFramesInFlight() { |
| 426 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 412 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
| 427 if (last_sent_frame_id_ != -1) { | 413 if (last_sent_frame_id_ != -1) { |
| 428 DCHECK_LE(0, last_sent_frame_id_); | 414 DCHECK_LE(0, last_sent_frame_id_); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 448 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 434 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
| 449 MissingFramesAndPacketsMap missing_frames_and_packets; | 435 MissingFramesAndPacketsMap missing_frames_and_packets; |
| 450 PacketIdSet missing; | 436 PacketIdSet missing; |
| 451 missing_frames_and_packets.insert(std::make_pair(resend_frame_id, missing)); | 437 missing_frames_and_packets.insert(std::make_pair(resend_frame_id, missing)); |
| 452 rtp_sender_->ResendPackets(missing_frames_and_packets); | 438 rtp_sender_->ResendPackets(missing_frames_and_packets); |
| 453 last_send_time_ = cast_environment_->Clock()->NowTicks(); | 439 last_send_time_ = cast_environment_->Clock()->NowTicks(); |
| 454 } | 440 } |
| 455 | 441 |
| 456 } // namespace cast | 442 } // namespace cast |
| 457 } // namespace media | 443 } // namespace media |
| OLD | NEW |