Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(459)

Side by Side Diff: media/cast/video_sender/video_sender.cc

Issue 314593002: [Cast] Cleanup: Remove TransportXXXXXSender, an unnecessary layer of indirection. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Restored/Improved CastSenderImpl VLOGging. Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 10 matching lines...) Expand all
21 namespace cast { 21 namespace cast {
22 22
23 const int kNumAggressiveReportsSentAtStart = 100; 23 const int kNumAggressiveReportsSentAtStart = 100;
24 const int kMinSchedulingDelayMs = 1; 24 const int kMinSchedulingDelayMs = 1;
25 25
26 VideoSender::VideoSender( 26 VideoSender::VideoSender(
27 scoped_refptr<CastEnvironment> cast_environment, 27 scoped_refptr<CastEnvironment> cast_environment,
28 const VideoSenderConfig& video_config, 28 const VideoSenderConfig& video_config,
29 const CreateVideoEncodeAcceleratorCallback& create_vea_cb, 29 const CreateVideoEncodeAcceleratorCallback& create_vea_cb,
30 const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb, 30 const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb,
31 const CastInitializationCallback& cast_initialization_cb,
32 transport::CastTransportSender* const transport_sender) 31 transport::CastTransportSender* const transport_sender)
33 : rtp_max_delay_(base::TimeDelta::FromMilliseconds( 32 : rtp_max_delay_(base::TimeDelta::FromMilliseconds(
34 video_config.rtp_config.max_delay_ms)), 33 video_config.rtp_config.max_delay_ms)),
35 max_frame_rate_(video_config.max_frame_rate), 34 max_frame_rate_(video_config.max_frame_rate),
36 cast_environment_(cast_environment), 35 cast_environment_(cast_environment),
37 transport_sender_(transport_sender), 36 transport_sender_(transport_sender),
38 rtp_timestamp_helper_(kVideoFrequency), 37 rtp_timestamp_helper_(kVideoFrequency),
39 num_aggressive_rtcp_reports_sent_(0), 38 num_aggressive_rtcp_reports_sent_(0),
40 last_acked_frame_id_(-1), 39 last_acked_frame_id_(-1),
41 last_sent_frame_id_(-1), 40 last_sent_frame_id_(-1),
42 frames_in_encoder_(0), 41 frames_in_encoder_(0),
43 duplicate_ack_(0), 42 duplicate_ack_(0),
44 last_skip_count_(0), 43 last_skip_count_(0),
45 current_requested_bitrate_(video_config.start_bitrate), 44 current_requested_bitrate_(video_config.start_bitrate),
46 congestion_control_(cast_environment->Clock(), 45 congestion_control_(cast_environment->Clock(),
47 video_config.congestion_control_back_off, 46 video_config.congestion_control_back_off,
48 video_config.max_bitrate, 47 video_config.max_bitrate,
49 video_config.min_bitrate, 48 video_config.min_bitrate,
50 video_config.start_bitrate), 49 video_config.start_bitrate),
50 cast_initialization_status_(STATUS_VIDEO_UNINITIALIZED),
51 initialized_(false), 51 initialized_(false),
52 active_session_(false), 52 active_session_(false),
53 weak_factory_(this) { 53 weak_factory_(this) {
54 max_unacked_frames_ = 54 max_unacked_frames_ =
55 1 + static_cast<uint8>(video_config.rtp_config.max_delay_ms * 55 1 + static_cast<uint8>(video_config.rtp_config.max_delay_ms *
56 max_frame_rate_ / 1000); 56 max_frame_rate_ / 1000);
57 VLOG(1) << "max_unacked_frames " << static_cast<int>(max_unacked_frames_); 57 VLOG(1) << "max_unacked_frames " << static_cast<int>(max_unacked_frames_);
58 DCHECK_GT(max_unacked_frames_, 0) << "Invalid argument"; 58 DCHECK_GT(max_unacked_frames_, 0) << "Invalid argument";
59 59 if (!encryptor_.Initialize(video_config.rtp_config.aes_key,
60 video_config.rtp_config.aes_iv_mask)) {
61 // Leave cast_initialization_status_ set to UNINITIALIZED to indicate
62 // failure.
63 return;
64 }
65 DVLOG(1) << (video_config.rtp_config.aes_key.empty() ? "Not using" : "Using")
66 << " video frame data encryption.";
60 if (video_config.use_external_encoder) { 67 if (video_config.use_external_encoder) {
61 video_encoder_.reset(new ExternalVideoEncoder(cast_environment, 68 video_encoder_.reset(new ExternalVideoEncoder(cast_environment,
62 video_config, 69 video_config,
63 create_vea_cb, 70 create_vea_cb,
64 create_video_encode_mem_cb)); 71 create_video_encode_mem_cb));
65 } else { 72 } else {
66 video_encoder_.reset(new VideoEncoderImpl( 73 video_encoder_.reset(new VideoEncoderImpl(
67 cast_environment, video_config, max_unacked_frames_)); 74 cast_environment, video_config, max_unacked_frames_));
68 } 75 }
69 76 cast_initialization_status_ = STATUS_VIDEO_INITIALIZED;
70 77
71 media::cast::transport::CastTransportVideoConfig transport_config; 78 media::cast::transport::CastTransportVideoConfig transport_config;
72 transport_config.codec = video_config.codec; 79 transport_config.codec = video_config.codec;
73 transport_config.rtp.config = video_config.rtp_config; 80 transport_config.rtp.config = video_config.rtp_config;
74 transport_config.rtp.max_outstanding_frames = max_unacked_frames_ + 1; 81 transport_config.rtp.max_outstanding_frames = max_unacked_frames_ + 1;
75 transport_sender_->InitializeVideo(transport_config); 82 transport_sender_->InitializeVideo(transport_config);
76 83
77 rtcp_.reset( 84 rtcp_.reset(
78 new Rtcp(cast_environment_, 85 new Rtcp(cast_environment_,
79 this, 86 this,
80 transport_sender_, 87 transport_sender_,
81 NULL, // paced sender. 88 NULL, // paced sender.
82 NULL, 89 NULL,
83 video_config.rtcp_mode, 90 video_config.rtcp_mode,
84 base::TimeDelta::FromMilliseconds(video_config.rtcp_interval), 91 base::TimeDelta::FromMilliseconds(video_config.rtcp_interval),
85 video_config.rtp_config.ssrc, 92 video_config.rtp_config.ssrc,
86 video_config.incoming_feedback_ssrc, 93 video_config.incoming_feedback_ssrc,
87 video_config.rtcp_c_name, 94 video_config.rtcp_c_name,
88 false)); 95 false));
89 rtcp_->SetCastReceiverEventHistorySize(kReceiverRtcpEventHistorySize); 96 rtcp_->SetCastReceiverEventHistorySize(kReceiverRtcpEventHistorySize);
90 97
91 // TODO(pwestin): pass cast_initialization_cb to |video_encoder_|
92 // and remove this call.
93 cast_environment_->PostTask(
94 CastEnvironment::MAIN,
95 FROM_HERE,
96 base::Bind(cast_initialization_cb, STATUS_VIDEO_INITIALIZED));
97
98 memset(frame_id_to_rtp_timestamp_, 0, sizeof(frame_id_to_rtp_timestamp_)); 98 memset(frame_id_to_rtp_timestamp_, 0, sizeof(frame_id_to_rtp_timestamp_));
99 } 99 }
100 100
101 VideoSender::~VideoSender() { 101 VideoSender::~VideoSender() {
102 } 102 }
103 103
104 void VideoSender::InitializeTimers() { 104 void VideoSender::InitializeTimers() {
105 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); 105 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
106 if (!initialized_) { 106 if (!initialized_) {
107 initialized_ = true; 107 initialized_ = true;
108 ScheduleNextResendCheck(); 108 ScheduleNextResendCheck();
109 ScheduleNextSkippedFramesCheck(); 109 ScheduleNextSkippedFramesCheck();
110 } 110 }
111 } 111 }
112 112
113 void VideoSender::InsertRawVideoFrame( 113 void VideoSender::InsertRawVideoFrame(
114 const scoped_refptr<media::VideoFrame>& video_frame, 114 const scoped_refptr<media::VideoFrame>& video_frame,
115 const base::TimeTicks& capture_time) { 115 const base::TimeTicks& capture_time) {
116 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); 116 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
117 if (cast_initialization_status_ != STATUS_VIDEO_INITIALIZED) {
118 NOTREACHED();
119 return;
120 }
117 DCHECK(video_encoder_.get()) << "Invalid state"; 121 DCHECK(video_encoder_.get()) << "Invalid state";
118 122
119 RtpTimestamp rtp_timestamp = GetVideoRtpTimestamp(capture_time); 123 RtpTimestamp rtp_timestamp = GetVideoRtpTimestamp(capture_time);
120 cast_environment_->Logging()->InsertFrameEvent( 124 cast_environment_->Logging()->InsertFrameEvent(
121 capture_time, FRAME_CAPTURE_BEGIN, VIDEO_EVENT, 125 capture_time, FRAME_CAPTURE_BEGIN, VIDEO_EVENT,
122 rtp_timestamp, kFrameIdUnknown); 126 rtp_timestamp, kFrameIdUnknown);
123 cast_environment_->Logging()->InsertFrameEvent( 127 cast_environment_->Logging()->InsertFrameEvent(
124 cast_environment_->Clock()->NowTicks(), 128 cast_environment_->Clock()->NowTicks(),
125 FRAME_CAPTURE_END, VIDEO_EVENT, 129 FRAME_CAPTURE_END, VIDEO_EVENT,
126 rtp_timestamp, 130 rtp_timestamp,
127 kFrameIdUnknown); 131 kFrameIdUnknown);
128 132
129 // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc 133 // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc
130 TRACE_EVENT_INSTANT2( 134 TRACE_EVENT_INSTANT2(
131 "cast_perf_test", "InsertRawVideoFrame", 135 "cast_perf_test", "InsertRawVideoFrame",
132 TRACE_EVENT_SCOPE_THREAD, 136 TRACE_EVENT_SCOPE_THREAD,
133 "timestamp", capture_time.ToInternalValue(), 137 "timestamp", capture_time.ToInternalValue(),
134 "rtp_timestamp", rtp_timestamp); 138 "rtp_timestamp", rtp_timestamp);
135 139
136 if (video_encoder_->EncodeVideoFrame( 140 if (video_encoder_->EncodeVideoFrame(
137 video_frame, 141 video_frame,
138 capture_time, 142 capture_time,
139 base::Bind(&VideoSender::SendEncodedVideoFrameMainThread, 143 base::Bind(&VideoSender::SendEncodedVideoFrame,
140 weak_factory_.GetWeakPtr(), 144 weak_factory_.GetWeakPtr(),
141 current_requested_bitrate_))) { 145 current_requested_bitrate_))) {
142 frames_in_encoder_++; 146 frames_in_encoder_++;
143 UpdateFramesInFlight(); 147 UpdateFramesInFlight();
144 } 148 }
145 } 149 }
146 150
147 void VideoSender::SendEncodedVideoFrameMainThread( 151 void VideoSender::SendEncodedVideoFrame(
148 int requested_bitrate_before_encode, 152 int requested_bitrate_before_encode,
149 scoped_ptr<transport::EncodedFrame> encoded_frame) { 153 scoped_ptr<transport::EncodedFrame> encoded_frame) {
150 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); 154 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
151 last_send_time_ = cast_environment_->Clock()->NowTicks(); 155 last_send_time_ = cast_environment_->Clock()->NowTicks();
152 VLOG_IF(1, encoded_frame->dependency == transport::EncodedFrame::KEY) 156 VLOG_IF(1, encoded_frame->dependency == transport::EncodedFrame::KEY)
153 << "Send encoded key frame; frame_id: " << encoded_frame->frame_id; 157 << "Send encoded key frame; frame_id: " << encoded_frame->frame_id;
154 158
155 DCHECK_GT(frames_in_encoder_, 0); 159 DCHECK_GT(frames_in_encoder_, 0);
156 frames_in_encoder_--; 160 frames_in_encoder_--;
157 uint32 frame_id = encoded_frame->frame_id; 161 uint32 frame_id = encoded_frame->frame_id;
158 cast_environment_->Logging()->InsertEncodedFrameEvent( 162 cast_environment_->Logging()->InsertEncodedFrameEvent(
159 last_send_time_, FRAME_ENCODED, VIDEO_EVENT, encoded_frame->rtp_timestamp, 163 last_send_time_, FRAME_ENCODED, VIDEO_EVENT, encoded_frame->rtp_timestamp,
160 frame_id, static_cast<int>(encoded_frame->data.size()), 164 frame_id, static_cast<int>(encoded_frame->data.size()),
161 encoded_frame->dependency == transport::EncodedFrame::KEY, 165 encoded_frame->dependency == transport::EncodedFrame::KEY,
162 requested_bitrate_before_encode); 166 requested_bitrate_before_encode);
163 167
164 // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc 168 // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc
165 TRACE_EVENT_INSTANT1( 169 TRACE_EVENT_INSTANT1(
166 "cast_perf_test", "VideoFrameEncoded", 170 "cast_perf_test", "VideoFrameEncoded",
167 TRACE_EVENT_SCOPE_THREAD, 171 TRACE_EVENT_SCOPE_THREAD,
168 "rtp_timestamp", encoded_frame->rtp_timestamp); 172 "rtp_timestamp", encoded_frame->rtp_timestamp);
169 173
170 // Only use lowest 8 bits as key. 174 // Only use lowest 8 bits as key.
171 frame_id_to_rtp_timestamp_[frame_id & 0xff] = encoded_frame->rtp_timestamp; 175 frame_id_to_rtp_timestamp_[frame_id & 0xff] = encoded_frame->rtp_timestamp;
172 176
173 last_sent_frame_id_ = static_cast<int>(encoded_frame->frame_id); 177 last_sent_frame_id_ = static_cast<int>(encoded_frame->frame_id);
178
179 // If using encryption, encrypt the frame data now.
180 if (encryptor_.initialized()) {
181 std::string encrypted_data;
182 if (!encryptor_.Encrypt(encoded_frame->frame_id,
183 encoded_frame->data,
184 &encrypted_data)) {
185 LOG(ERROR) << "Encryption failed. Not sending frame with ID "
186 << encoded_frame->frame_id;
187 return;
188 }
189 encoded_frame->data.swap(encrypted_data);
190 }
191
174 DCHECK(!encoded_frame->reference_time.is_null()); 192 DCHECK(!encoded_frame->reference_time.is_null());
175 rtp_timestamp_helper_.StoreLatestTime(encoded_frame->reference_time, 193 rtp_timestamp_helper_.StoreLatestTime(encoded_frame->reference_time,
176 encoded_frame->rtp_timestamp); 194 encoded_frame->rtp_timestamp);
177 195
178 // At the start of the session, it's important to send reports before each 196 // At the start of the session, it's important to send reports before each
179 // frame so that the receiver can properly compute playout times. The reason 197 // frame so that the receiver can properly compute playout times. The reason
180 // more than one report is sent is because transmission is not guaranteed, 198 // more than one report is sent is because transmission is not guaranteed,
181 // only best effort, so send enough that one should almost certainly get 199 // only best effort, so send enough that one should almost certainly get
182 // through. 200 // through.
183 if (num_aggressive_rtcp_reports_sent_ < kNumAggressiveReportsSentAtStart) { 201 if (num_aggressive_rtcp_reports_sent_ < kNumAggressiveReportsSentAtStart) {
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 453
436 void VideoSender::UpdateBitrate(int new_bitrate) { 454 void VideoSender::UpdateBitrate(int new_bitrate) {
437 // Make sure we don't set the bitrate too insanely low. 455 // Make sure we don't set the bitrate too insanely low.
438 DCHECK_GT(new_bitrate, 1000); 456 DCHECK_GT(new_bitrate, 1000);
439 video_encoder_->SetBitRate(new_bitrate); 457 video_encoder_->SetBitRate(new_bitrate);
440 current_requested_bitrate_ = new_bitrate; 458 current_requested_bitrate_ = new_bitrate;
441 } 459 }
442 460
443 } // namespace cast 461 } // namespace cast
444 } // namespace media 462 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698