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 |