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 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 cast_environment_->Clock()->NowTicks(), | 140 cast_environment_->Clock()->NowTicks(), |
141 FRAME_CAPTURE_END, VIDEO_EVENT, | 141 FRAME_CAPTURE_END, VIDEO_EVENT, |
142 rtp_timestamp, | 142 rtp_timestamp, |
143 kFrameIdUnknown); | 143 kFrameIdUnknown); |
144 | 144 |
145 // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc | 145 // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc |
146 TRACE_EVENT_INSTANT2( | 146 TRACE_EVENT_INSTANT2( |
147 "cast_perf_test", "InsertRawVideoFrame", | 147 "cast_perf_test", "InsertRawVideoFrame", |
148 TRACE_EVENT_SCOPE_THREAD, | 148 TRACE_EVENT_SCOPE_THREAD, |
149 "timestamp", capture_time.ToInternalValue(), | 149 "timestamp", capture_time.ToInternalValue(), |
150 "rtp_timestamp", GetVideoRtpTimestamp(capture_time)); | 150 "rtp_timestamp", rtp_timestamp); |
151 | 151 |
152 if (video_encoder_->EncodeVideoFrame( | 152 if (video_encoder_->EncodeVideoFrame( |
153 video_frame, | 153 video_frame, |
154 capture_time, | 154 capture_time, |
155 base::Bind(&VideoSender::SendEncodedVideoFrameMainThread, | 155 base::Bind(&VideoSender::SendEncodedVideoFrameMainThread, |
156 weak_factory_.GetWeakPtr(), | 156 weak_factory_.GetWeakPtr(), |
157 current_requested_bitrate_))) { | 157 current_requested_bitrate_))) { |
158 frames_in_encoder_++; | 158 frames_in_encoder_++; |
159 UpdateFramesInFlight(); | 159 UpdateFramesInFlight(); |
160 } | 160 } |
161 } | 161 } |
162 | 162 |
163 void VideoSender::SendEncodedVideoFrameMainThread( | 163 void VideoSender::SendEncodedVideoFrameMainThread( |
164 int requested_bitrate_before_encode, | 164 int requested_bitrate_before_encode, |
165 scoped_ptr<transport::EncodedVideoFrame> encoded_frame, | 165 scoped_ptr<transport::EncodedFrame> encoded_frame) { |
166 const base::TimeTicks& capture_time) { | |
167 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 166 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
168 last_send_time_ = cast_environment_->Clock()->NowTicks(); | 167 last_send_time_ = cast_environment_->Clock()->NowTicks(); |
169 if (encoded_frame->key_frame) { | 168 VLOG_IF(1, encoded_frame->dependency == transport::EncodedFrame::KEY) |
170 VLOG(1) << "Send encoded key frame; frame_id:" | 169 << "Send encoded key frame; frame_id: " << encoded_frame->frame_id; |
171 << static_cast<int>(encoded_frame->frame_id); | |
172 } | |
173 | 170 |
174 DCHECK_GT(frames_in_encoder_, 0); | 171 DCHECK_GT(frames_in_encoder_, 0); |
175 frames_in_encoder_--; | 172 frames_in_encoder_--; |
176 uint32 frame_id = encoded_frame->frame_id; | 173 uint32 frame_id = encoded_frame->frame_id; |
177 cast_environment_->Logging()->InsertEncodedFrameEvent( | 174 cast_environment_->Logging()->InsertEncodedFrameEvent( |
178 last_send_time_, FRAME_ENCODED, VIDEO_EVENT, encoded_frame->rtp_timestamp, | 175 last_send_time_, FRAME_ENCODED, VIDEO_EVENT, encoded_frame->rtp_timestamp, |
179 frame_id, static_cast<int>(encoded_frame->data.size()), | 176 frame_id, static_cast<int>(encoded_frame->data.size()), |
180 encoded_frame->key_frame, | 177 encoded_frame->dependency == transport::EncodedFrame::KEY, |
181 requested_bitrate_before_encode); | 178 requested_bitrate_before_encode); |
182 | 179 |
183 // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc | 180 // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc |
184 TRACE_EVENT_INSTANT1( | 181 TRACE_EVENT_INSTANT1( |
185 "cast_perf_test", "VideoFrameEncoded", | 182 "cast_perf_test", "VideoFrameEncoded", |
186 TRACE_EVENT_SCOPE_THREAD, | 183 TRACE_EVENT_SCOPE_THREAD, |
187 "rtp_timestamp", GetVideoRtpTimestamp(capture_time)); | 184 "rtp_timestamp", encoded_frame->rtp_timestamp); |
188 | 185 |
189 // Only use lowest 8 bits as key. | 186 // Only use lowest 8 bits as key. |
190 frame_id_to_rtp_timestamp_[frame_id & 0xff] = encoded_frame->rtp_timestamp; | 187 frame_id_to_rtp_timestamp_[frame_id & 0xff] = encoded_frame->rtp_timestamp; |
191 | 188 |
192 last_sent_frame_id_ = static_cast<int>(encoded_frame->frame_id); | 189 last_sent_frame_id_ = static_cast<int>(encoded_frame->frame_id); |
193 rtp_timestamp_helper_.StoreLatestTime(capture_time, | 190 DCHECK(!encoded_frame->reference_time.is_null()); |
| 191 rtp_timestamp_helper_.StoreLatestTime(encoded_frame->reference_time, |
194 encoded_frame->rtp_timestamp); | 192 encoded_frame->rtp_timestamp); |
195 transport_sender_->InsertCodedVideoFrame(encoded_frame.get(), capture_time); | 193 transport_sender_->InsertCodedVideoFrame(*encoded_frame); |
196 UpdateFramesInFlight(); | 194 UpdateFramesInFlight(); |
197 InitializeTimers(); | 195 InitializeTimers(); |
198 } | 196 } |
199 | 197 |
200 void VideoSender::IncomingRtcpPacket(scoped_ptr<Packet> packet) { | 198 void VideoSender::IncomingRtcpPacket(scoped_ptr<Packet> packet) { |
201 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 199 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
202 rtcp_->IncomingRtcpPacket(&packet->front(), packet->size()); | 200 rtcp_->IncomingRtcpPacket(&packet->front(), packet->size()); |
203 } | 201 } |
204 | 202 |
205 void VideoSender::ScheduleNextRtcpReport() { | 203 void VideoSender::ScheduleNextRtcpReport() { |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
433 void VideoSender::UpdateBitrate(int new_bitrate) { | 431 void VideoSender::UpdateBitrate(int new_bitrate) { |
434 new_bitrate /= current_bitrate_divider_; | 432 new_bitrate /= current_bitrate_divider_; |
435 // Make sure we don't set the bitrate too insanely low. | 433 // Make sure we don't set the bitrate too insanely low. |
436 DCHECK_GT(new_bitrate, 1000); | 434 DCHECK_GT(new_bitrate, 1000); |
437 video_encoder_->SetBitRate(new_bitrate); | 435 video_encoder_->SetBitRate(new_bitrate); |
438 current_requested_bitrate_ = new_bitrate; | 436 current_requested_bitrate_ = new_bitrate; |
439 } | 437 } |
440 | 438 |
441 } // namespace cast | 439 } // namespace cast |
442 } // namespace media | 440 } // namespace media |
OLD | NEW |