| 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 <cstring> | 7 #include <cstring> |
| 8 #include <list> | 8 #include <list> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 rtcp_.reset( | 99 rtcp_.reset( |
| 100 new Rtcp(cast_environment_, | 100 new Rtcp(cast_environment_, |
| 101 rtcp_feedback_.get(), | 101 rtcp_feedback_.get(), |
| 102 transport_sender_, | 102 transport_sender_, |
| 103 NULL, // paced sender. | 103 NULL, // paced sender. |
| 104 NULL, | 104 NULL, |
| 105 video_config.rtcp_mode, | 105 video_config.rtcp_mode, |
| 106 base::TimeDelta::FromMilliseconds(video_config.rtcp_interval), | 106 base::TimeDelta::FromMilliseconds(video_config.rtcp_interval), |
| 107 video_config.rtp_config.ssrc, | 107 video_config.rtp_config.ssrc, |
| 108 video_config.incoming_feedback_ssrc, | 108 video_config.incoming_feedback_ssrc, |
| 109 video_config.rtcp_c_name)); | 109 video_config.rtcp_c_name, |
| 110 false)); |
| 110 rtcp_->SetCastReceiverEventHistorySize(kReceiverRtcpEventHistorySize); | 111 rtcp_->SetCastReceiverEventHistorySize(kReceiverRtcpEventHistorySize); |
| 111 | 112 |
| 112 // TODO(pwestin): pass cast_initialization_cb to |video_encoder_| | 113 // TODO(pwestin): pass cast_initialization_cb to |video_encoder_| |
| 113 // and remove this call. | 114 // and remove this call. |
| 114 cast_environment_->PostTask( | 115 cast_environment_->PostTask( |
| 115 CastEnvironment::MAIN, | 116 CastEnvironment::MAIN, |
| 116 FROM_HERE, | 117 FROM_HERE, |
| 117 base::Bind(cast_initialization_cb, STATUS_VIDEO_INITIALIZED)); | 118 base::Bind(cast_initialization_cb, STATUS_VIDEO_INITIALIZED)); |
| 118 cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber_); | 119 cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber_); |
| 119 | 120 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 137 } | 138 } |
| 138 | 139 |
| 139 void VideoSender::InsertRawVideoFrame( | 140 void VideoSender::InsertRawVideoFrame( |
| 140 const scoped_refptr<media::VideoFrame>& video_frame, | 141 const scoped_refptr<media::VideoFrame>& video_frame, |
| 141 const base::TimeTicks& capture_time) { | 142 const base::TimeTicks& capture_time) { |
| 142 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 143 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
| 143 DCHECK(video_encoder_.get()) << "Invalid state"; | 144 DCHECK(video_encoder_.get()) << "Invalid state"; |
| 144 | 145 |
| 145 RtpTimestamp rtp_timestamp = GetVideoRtpTimestamp(capture_time); | 146 RtpTimestamp rtp_timestamp = GetVideoRtpTimestamp(capture_time); |
| 146 cast_environment_->Logging()->InsertFrameEvent( | 147 cast_environment_->Logging()->InsertFrameEvent( |
| 147 capture_time, kVideoFrameCaptureBegin, rtp_timestamp, kFrameIdUnknown); | 148 capture_time, FRAME_CAPTURE_BEGIN, VIDEO_EVENT, |
| 149 rtp_timestamp, kFrameIdUnknown); |
| 148 cast_environment_->Logging()->InsertFrameEvent( | 150 cast_environment_->Logging()->InsertFrameEvent( |
| 149 cast_environment_->Clock()->NowTicks(), | 151 cast_environment_->Clock()->NowTicks(), |
| 150 kVideoFrameCaptureEnd, | 152 FRAME_CAPTURE_END, VIDEO_EVENT, |
| 151 rtp_timestamp, | 153 rtp_timestamp, |
| 152 kFrameIdUnknown); | 154 kFrameIdUnknown); |
| 153 | 155 |
| 154 // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc | 156 // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc |
| 155 TRACE_EVENT_INSTANT2( | 157 TRACE_EVENT_INSTANT2( |
| 156 "cast_perf_test", "InsertRawVideoFrame", | 158 "cast_perf_test", "InsertRawVideoFrame", |
| 157 TRACE_EVENT_SCOPE_THREAD, | 159 TRACE_EVENT_SCOPE_THREAD, |
| 158 "timestamp", capture_time.ToInternalValue(), | 160 "timestamp", capture_time.ToInternalValue(), |
| 159 "rtp_timestamp", GetVideoRtpTimestamp(capture_time)); | 161 "rtp_timestamp", GetVideoRtpTimestamp(capture_time)); |
| 160 | 162 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 175 last_send_time_ = cast_environment_->Clock()->NowTicks(); | 177 last_send_time_ = cast_environment_->Clock()->NowTicks(); |
| 176 if (encoded_frame->key_frame) { | 178 if (encoded_frame->key_frame) { |
| 177 VLOG(1) << "Send encoded key frame; frame_id:" | 179 VLOG(1) << "Send encoded key frame; frame_id:" |
| 178 << static_cast<int>(encoded_frame->frame_id); | 180 << static_cast<int>(encoded_frame->frame_id); |
| 179 } | 181 } |
| 180 | 182 |
| 181 DCHECK_GT(frames_in_encoder_, 0); | 183 DCHECK_GT(frames_in_encoder_, 0); |
| 182 frames_in_encoder_--; | 184 frames_in_encoder_--; |
| 183 uint32 frame_id = encoded_frame->frame_id; | 185 uint32 frame_id = encoded_frame->frame_id; |
| 184 cast_environment_->Logging()->InsertEncodedFrameEvent( | 186 cast_environment_->Logging()->InsertEncodedFrameEvent( |
| 185 last_send_time_, kVideoFrameEncoded, encoded_frame->rtp_timestamp, | 187 last_send_time_, FRAME_ENCODED, VIDEO_EVENT, encoded_frame->rtp_timestamp, |
| 186 frame_id, static_cast<int>(encoded_frame->data.size()), | 188 frame_id, static_cast<int>(encoded_frame->data.size()), |
| 187 encoded_frame->key_frame, current_requested_bitrate_); | 189 encoded_frame->key_frame, current_requested_bitrate_); |
| 188 | 190 |
| 189 // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc | 191 // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc |
| 190 TRACE_EVENT_INSTANT1( | 192 TRACE_EVENT_INSTANT1( |
| 191 "cast_perf_test", "VideoFrameEncoded", | 193 "cast_perf_test", "VideoFrameEncoded", |
| 192 TRACE_EVENT_SCOPE_THREAD, | 194 TRACE_EVENT_SCOPE_THREAD, |
| 193 "rtp_timestamp", GetVideoRtpTimestamp(capture_time)); | 195 "rtp_timestamp", GetVideoRtpTimestamp(capture_time)); |
| 194 | 196 |
| 195 // Only use lowest 8 bits as key. | 197 // Only use lowest 8 bits as key. |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 231 void VideoSender::SendRtcpReport() { | 233 void VideoSender::SendRtcpReport() { |
| 232 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 234 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
| 233 | 235 |
| 234 transport::RtcpSenderLogMessage sender_log_message; | 236 transport::RtcpSenderLogMessage sender_log_message; |
| 235 RtcpEventMap rtcp_events; | 237 RtcpEventMap rtcp_events; |
| 236 event_subscriber_.GetRtcpEventsAndReset(&rtcp_events); | 238 event_subscriber_.GetRtcpEventsAndReset(&rtcp_events); |
| 237 | 239 |
| 238 for (RtcpEventMap::iterator it = rtcp_events.begin(); it != rtcp_events.end(); | 240 for (RtcpEventMap::iterator it = rtcp_events.begin(); it != rtcp_events.end(); |
| 239 ++it) { | 241 ++it) { |
| 240 CastLoggingEvent event_type = it->second.type; | 242 CastLoggingEvent event_type = it->second.type; |
| 241 if (event_type == kVideoFrameCaptureBegin || | 243 if (event_type == FRAME_CAPTURE_BEGIN || |
| 242 event_type == kVideoFrameSentToEncoder || | 244 event_type == FRAME_ENCODED) { |
| 243 event_type == kVideoFrameEncoded) { | |
| 244 transport::RtcpSenderFrameLogMessage frame_message; | 245 transport::RtcpSenderFrameLogMessage frame_message; |
| 245 frame_message.rtp_timestamp = it->first; | 246 frame_message.rtp_timestamp = it->first; |
| 246 switch (event_type) { | 247 switch (event_type) { |
| 247 case kVideoFrameCaptureBegin: | 248 case FRAME_CAPTURE_BEGIN: |
| 248 frame_message.frame_status = | 249 frame_message.frame_status = |
| 249 transport::kRtcpSenderFrameStatusDroppedByFlowControl; | 250 transport::kRtcpSenderFrameStatusDroppedByFlowControl; |
| 250 break; | 251 break; |
| 251 case kVideoFrameSentToEncoder: | 252 case FRAME_ENCODED: |
| 252 frame_message.frame_status = | |
| 253 transport::kRtcpSenderFrameStatusDroppedByEncoder; | |
| 254 break; | |
| 255 case kVideoFrameEncoded: | |
| 256 frame_message.frame_status = | 253 frame_message.frame_status = |
| 257 transport::kRtcpSenderFrameStatusSentToNetwork; | 254 transport::kRtcpSenderFrameStatusSentToNetwork; |
| 258 break; | 255 break; |
| 259 default: | 256 default: |
| 260 NOTREACHED(); | 257 NOTREACHED(); |
| 261 break; | 258 break; |
| 262 } | 259 } |
| 263 sender_log_message.push_back(frame_message); | 260 sender_log_message.push_back(frame_message); |
| 264 } else { | 261 } else { |
| 265 // This shouldn't happen because RtcpEventMap isn't supposed to contain | 262 // This shouldn't happen because RtcpEventMap isn't supposed to contain |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 426 // after establishing that the receiver is active. | 423 // after establishing that the receiver is active. |
| 427 if (last_acked_frame_id_ == -1) { | 424 if (last_acked_frame_id_ == -1) { |
| 428 ScheduleNextRtcpReport(); | 425 ScheduleNextRtcpReport(); |
| 429 } | 426 } |
| 430 last_acked_frame_id_ = static_cast<int>(acked_frame_id); | 427 last_acked_frame_id_ = static_cast<int>(acked_frame_id); |
| 431 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); | 428 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
| 432 | 429 |
| 433 RtpTimestamp rtp_timestamp = | 430 RtpTimestamp rtp_timestamp = |
| 434 frame_id_to_rtp_timestamp_[acked_frame_id & 0xff]; | 431 frame_id_to_rtp_timestamp_[acked_frame_id & 0xff]; |
| 435 cast_environment_->Logging()->InsertFrameEvent( | 432 cast_environment_->Logging()->InsertFrameEvent( |
| 436 now, kVideoAckReceived, rtp_timestamp, acked_frame_id); | 433 now, FRAME_ACK_RECEIVED, VIDEO_EVENT, rtp_timestamp, acked_frame_id); |
| 437 | 434 |
| 438 VLOG(2) << "ReceivedAck:" << static_cast<int>(acked_frame_id); | 435 VLOG(2) << "ReceivedAck:" << static_cast<int>(acked_frame_id); |
| 439 active_session_ = true; | 436 active_session_ = true; |
| 440 DCHECK_NE(-1, last_acked_frame_id_); | 437 DCHECK_NE(-1, last_acked_frame_id_); |
| 441 UpdateFramesInFlight(); | 438 UpdateFramesInFlight(); |
| 442 } | 439 } |
| 443 | 440 |
| 444 void VideoSender::UpdateFramesInFlight() { | 441 void VideoSender::UpdateFramesInFlight() { |
| 445 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 442 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
| 446 if (last_sent_frame_id_ != -1) { | 443 if (last_sent_frame_id_ != -1) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 471 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 468 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
| 472 MissingFramesAndPacketsMap missing_frames_and_packets; | 469 MissingFramesAndPacketsMap missing_frames_and_packets; |
| 473 PacketIdSet missing; | 470 PacketIdSet missing; |
| 474 missing_frames_and_packets.insert(std::make_pair(resend_frame_id, missing)); | 471 missing_frames_and_packets.insert(std::make_pair(resend_frame_id, missing)); |
| 475 last_send_time_ = cast_environment_->Clock()->NowTicks(); | 472 last_send_time_ = cast_environment_->Clock()->NowTicks(); |
| 476 transport_sender_->ResendPackets(false, missing_frames_and_packets); | 473 transport_sender_->ResendPackets(false, missing_frames_and_packets); |
| 477 } | 474 } |
| 478 | 475 |
| 479 } // namespace cast | 476 } // namespace cast |
| 480 } // namespace media | 477 } // namespace media |
| OLD | NEW |