| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/sender/video_sender.h" | 5 #include "media/cast/sender/video_sender.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cstring> | 8 #include <cstring> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 if (!video_config.use_external_encoder) | 31 if (!video_config.use_external_encoder) |
| 32 return 0; | 32 return 0; |
| 33 return (video_config.min_bitrate + video_config.max_bitrate) / 2; | 33 return (video_config.min_bitrate + video_config.max_bitrate) / 2; |
| 34 } | 34 } |
| 35 | 35 |
| 36 } // namespace | 36 } // namespace |
| 37 | 37 |
| 38 VideoSender::VideoSender( | 38 VideoSender::VideoSender( |
| 39 scoped_refptr<CastEnvironment> cast_environment, | 39 scoped_refptr<CastEnvironment> cast_environment, |
| 40 const VideoSenderConfig& video_config, | 40 const VideoSenderConfig& video_config, |
| 41 const CastInitializationCallback& initialization_cb, |
| 41 const CreateVideoEncodeAcceleratorCallback& create_vea_cb, | 42 const CreateVideoEncodeAcceleratorCallback& create_vea_cb, |
| 42 const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb, | 43 const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb, |
| 43 CastTransportSender* const transport_sender) | 44 CastTransportSender* const transport_sender) |
| 44 : FrameSender( | 45 : FrameSender( |
| 45 cast_environment, | 46 cast_environment, |
| 46 transport_sender, | 47 transport_sender, |
| 47 base::TimeDelta::FromMilliseconds(video_config.rtcp_interval), | 48 base::TimeDelta::FromMilliseconds(video_config.rtcp_interval), |
| 48 kVideoFrequency, | 49 kVideoFrequency, |
| 49 video_config.ssrc, | 50 video_config.ssrc, |
| 50 video_config.max_frame_rate, | 51 video_config.max_frame_rate, |
| 51 video_config.target_playout_delay), | 52 video_config.target_playout_delay), |
| 52 fixed_bitrate_(GetFixedBitrate(video_config)), | 53 fixed_bitrate_(GetFixedBitrate(video_config)), |
| 53 frames_in_encoder_(0), | 54 frames_in_encoder_(0), |
| 54 congestion_control_(cast_environment->Clock(), | 55 congestion_control_(cast_environment->Clock(), |
| 55 video_config.max_bitrate, | 56 video_config.max_bitrate, |
| 56 video_config.min_bitrate, | 57 video_config.min_bitrate, |
| 57 max_unacked_frames_), | 58 max_unacked_frames_), |
| 58 weak_factory_(this) { | 59 weak_factory_(this) { |
| 59 cast_initialization_status_ = STATUS_VIDEO_UNINITIALIZED; | 60 cast_initialization_status_ = STATUS_VIDEO_UNINITIALIZED; |
| 60 VLOG(1) << "max_unacked_frames is " << max_unacked_frames_ | 61 VLOG(1) << "max_unacked_frames is " << max_unacked_frames_ |
| 61 << " for target_playout_delay=" | 62 << " for target_playout_delay=" |
| 62 << target_playout_delay_.InMilliseconds() << " ms" | 63 << target_playout_delay_.InMilliseconds() << " ms" |
| 63 << " and max_frame_rate=" << video_config.max_frame_rate; | 64 << " and max_frame_rate=" << video_config.max_frame_rate; |
| 64 DCHECK_GT(max_unacked_frames_, 0); | 65 DCHECK_GT(max_unacked_frames_, 0); |
| 65 | 66 |
| 66 if (video_config.use_external_encoder) { | 67 if (video_config.use_external_encoder) { |
| 67 video_encoder_.reset(new ExternalVideoEncoder(cast_environment, | 68 video_encoder_.reset(new ExternalVideoEncoder( |
| 68 video_config, | 69 cast_environment, |
| 69 create_vea_cb, | 70 video_config, |
| 70 create_video_encode_mem_cb)); | 71 base::Bind(&VideoSender::OnEncoderInitialized, |
| 72 weak_factory_.GetWeakPtr(), initialization_cb), |
| 73 create_vea_cb, |
| 74 create_video_encode_mem_cb)); |
| 71 } else { | 75 } else { |
| 76 // Software encoder is initialized immediately. |
| 72 video_encoder_.reset(new VideoEncoderImpl( | 77 video_encoder_.reset(new VideoEncoderImpl( |
| 73 cast_environment, video_config, max_unacked_frames_)); | 78 cast_environment, video_config, max_unacked_frames_)); |
| 79 cast_initialization_status_ = STATUS_VIDEO_INITIALIZED; |
| 74 } | 80 } |
| 75 cast_initialization_status_ = STATUS_VIDEO_INITIALIZED; | 81 |
| 82 if (cast_initialization_status_ == STATUS_VIDEO_INITIALIZED) { |
| 83 cast_environment->PostTask( |
| 84 CastEnvironment::MAIN, |
| 85 FROM_HERE, |
| 86 base::Bind(initialization_cb, cast_initialization_status_)); |
| 87 } |
| 76 | 88 |
| 77 media::cast::CastTransportRtpConfig transport_config; | 89 media::cast::CastTransportRtpConfig transport_config; |
| 78 transport_config.ssrc = video_config.ssrc; | 90 transport_config.ssrc = video_config.ssrc; |
| 79 transport_config.feedback_ssrc = video_config.incoming_feedback_ssrc; | 91 transport_config.feedback_ssrc = video_config.incoming_feedback_ssrc; |
| 80 transport_config.rtp_payload_type = video_config.rtp_payload_type; | 92 transport_config.rtp_payload_type = video_config.rtp_payload_type; |
| 81 transport_config.stored_frames = max_unacked_frames_; | 93 transport_config.stored_frames = max_unacked_frames_; |
| 82 transport_config.aes_key = video_config.aes_key; | 94 transport_config.aes_key = video_config.aes_key; |
| 83 transport_config.aes_iv_mask = video_config.aes_iv_mask; | 95 transport_config.aes_iv_mask = video_config.aes_iv_mask; |
| 84 | 96 |
| 85 transport_sender->InitializeVideo( | 97 transport_sender->InitializeVideo( |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 congestion_control_.SendFrameToTransport( | 219 congestion_control_.SendFrameToTransport( |
| 208 frame_id, encoded_frame->data.size() * 8, last_send_time_); | 220 frame_id, encoded_frame->data.size() * 8, last_send_time_); |
| 209 | 221 |
| 210 if (send_target_playout_delay_) { | 222 if (send_target_playout_delay_) { |
| 211 encoded_frame->new_playout_delay_ms = | 223 encoded_frame->new_playout_delay_ms = |
| 212 target_playout_delay_.InMilliseconds(); | 224 target_playout_delay_.InMilliseconds(); |
| 213 } | 225 } |
| 214 transport_sender_->InsertFrame(ssrc_, *encoded_frame); | 226 transport_sender_->InsertFrame(ssrc_, *encoded_frame); |
| 215 } | 227 } |
| 216 | 228 |
| 229 void VideoSender::OnEncoderInitialized( |
| 230 const CastInitializationCallback& initialization_cb, |
| 231 CastInitializationStatus status) { |
| 232 cast_initialization_status_ = status; |
| 233 initialization_cb.Run(status); |
| 234 } |
| 235 |
| 217 void VideoSender::OnReceivedCastFeedback(const RtcpCastMessage& cast_feedback) { | 236 void VideoSender::OnReceivedCastFeedback(const RtcpCastMessage& cast_feedback) { |
| 218 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 237 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
| 219 | 238 |
| 220 base::TimeDelta rtt; | 239 base::TimeDelta rtt; |
| 221 base::TimeDelta avg_rtt; | 240 base::TimeDelta avg_rtt; |
| 222 base::TimeDelta min_rtt; | 241 base::TimeDelta min_rtt; |
| 223 base::TimeDelta max_rtt; | 242 base::TimeDelta max_rtt; |
| 224 if (is_rtt_available()) { | 243 if (is_rtt_available()) { |
| 225 rtt = rtt_; | 244 rtt = rtt_; |
| 226 avg_rtt = avg_rtt_; | 245 avg_rtt = avg_rtt_; |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 << duration_in_flight.InMicroseconds() << " usec (" | 338 << duration_in_flight.InMicroseconds() << " usec (" |
| 320 << (target_playout_delay_ > base::TimeDelta() ? | 339 << (target_playout_delay_ > base::TimeDelta() ? |
| 321 100 * duration_in_flight / target_playout_delay_ : | 340 100 * duration_in_flight / target_playout_delay_ : |
| 322 kint64max) << "%)"; | 341 kint64max) << "%)"; |
| 323 return frames_in_flight >= max_unacked_frames_ || | 342 return frames_in_flight >= max_unacked_frames_ || |
| 324 duration_in_flight >= target_playout_delay_; | 343 duration_in_flight >= target_playout_delay_; |
| 325 } | 344 } |
| 326 | 345 |
| 327 } // namespace cast | 346 } // namespace cast |
| 328 } // namespace media | 347 } // namespace media |
| OLD | NEW |