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 |