Chromium Code Reviews| 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 "content/browser/media/capture/content_video_capture_device_core.h" | 5 #include "content/browser/media/capture/content_video_capture_device_core.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/callback_forward.h" | 9 #include "base/callback_forward.h" |
| 10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 63 } | 63 } |
| 64 | 64 |
| 65 ThreadSafeCaptureOracle::~ThreadSafeCaptureOracle() {} | 65 ThreadSafeCaptureOracle::~ThreadSafeCaptureOracle() {} |
| 66 | 66 |
| 67 bool ThreadSafeCaptureOracle::ObserveEventAndDecideCapture( | 67 bool ThreadSafeCaptureOracle::ObserveEventAndDecideCapture( |
| 68 VideoCaptureOracle::Event event, | 68 VideoCaptureOracle::Event event, |
| 69 const gfx::Rect& damage_rect, | 69 const gfx::Rect& damage_rect, |
| 70 base::TimeTicks event_time, | 70 base::TimeTicks event_time, |
| 71 scoped_refptr<media::VideoFrame>* storage, | 71 scoped_refptr<media::VideoFrame>* storage, |
| 72 CaptureFrameCallback* callback) { | 72 CaptureFrameCallback* callback) { |
| 73 // Grab the current time before waiting to acquire the |lock_|. | |
| 74 const base::TimeTicks capture_begin_time = base::TimeTicks::Now(); | |
| 75 | |
| 73 base::AutoLock guard(lock_); | 76 base::AutoLock guard(lock_); |
| 74 | 77 |
| 75 if (!client_) | 78 if (!client_) |
| 76 return false; // Capture is stopped. | 79 return false; // Capture is stopped. |
| 77 | 80 |
| 78 // Always round up the coded size to multiple of 16 pixels. | 81 // Always round up the coded size to multiple of 16 pixels. |
| 79 // See http://crbug.com/402151. | 82 // See http://crbug.com/402151. |
| 80 const gfx::Size visible_size = params_.requested_format.frame_size; | 83 const gfx::Size visible_size = params_.requested_format.frame_size; |
| 81 const gfx::Size coded_size((visible_size.width() + 15) & ~15, | 84 const gfx::Size coded_size((visible_size.width() + 15) & ~15, |
| 82 (visible_size.height() + 15) & ~15); | 85 (visible_size.height() + 15) & ~15); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 134 static_cast<uint8*>(output_buffer->data()), | 137 static_cast<uint8*>(output_buffer->data()), |
| 135 output_buffer->size(), | 138 output_buffer->size(), |
| 136 base::SharedMemory::NULLHandle(), | 139 base::SharedMemory::NULLHandle(), |
| 137 0, | 140 0, |
| 138 base::TimeDelta(), | 141 base::TimeDelta(), |
| 139 base::Closure()); | 142 base::Closure()); |
| 140 } | 143 } |
| 141 *callback = base::Bind(&ThreadSafeCaptureOracle::DidCaptureFrame, | 144 *callback = base::Bind(&ThreadSafeCaptureOracle::DidCaptureFrame, |
| 142 this, | 145 this, |
| 143 frame_number, | 146 frame_number, |
| 144 output_buffer); | 147 output_buffer, |
| 148 capture_begin_time); | |
| 145 return true; | 149 return true; |
| 146 } | 150 } |
| 147 | 151 |
| 148 gfx::Size ThreadSafeCaptureOracle::GetCaptureSize() const { | 152 gfx::Size ThreadSafeCaptureOracle::GetCaptureSize() const { |
| 149 base::AutoLock guard(lock_); | 153 base::AutoLock guard(lock_); |
| 150 return params_.requested_format.frame_size; | 154 return params_.requested_format.frame_size; |
| 151 } | 155 } |
| 152 | 156 |
| 153 void ThreadSafeCaptureOracle::UpdateCaptureSize(const gfx::Size& source_size) { | 157 void ThreadSafeCaptureOracle::UpdateCaptureSize(const gfx::Size& source_size) { |
| 154 base::AutoLock guard(lock_); | 158 base::AutoLock guard(lock_); |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 181 | 185 |
| 182 void ThreadSafeCaptureOracle::ReportError(const std::string& reason) { | 186 void ThreadSafeCaptureOracle::ReportError(const std::string& reason) { |
| 183 base::AutoLock guard(lock_); | 187 base::AutoLock guard(lock_); |
| 184 if (client_) | 188 if (client_) |
| 185 client_->OnError(reason); | 189 client_->OnError(reason); |
| 186 } | 190 } |
| 187 | 191 |
| 188 void ThreadSafeCaptureOracle::DidCaptureFrame( | 192 void ThreadSafeCaptureOracle::DidCaptureFrame( |
| 189 int frame_number, | 193 int frame_number, |
| 190 const scoped_refptr<media::VideoCaptureDevice::Client::Buffer>& buffer, | 194 const scoped_refptr<media::VideoCaptureDevice::Client::Buffer>& buffer, |
| 195 base::TimeTicks capture_begin_time, | |
| 191 const scoped_refptr<media::VideoFrame>& frame, | 196 const scoped_refptr<media::VideoFrame>& frame, |
| 192 base::TimeTicks timestamp, | 197 base::TimeTicks timestamp, |
| 193 bool success) { | 198 bool success) { |
| 194 base::AutoLock guard(lock_); | 199 base::AutoLock guard(lock_); |
| 195 TRACE_EVENT_ASYNC_END2("mirroring", "Capture", buffer.get(), | 200 TRACE_EVENT_ASYNC_END2("mirroring", "Capture", buffer.get(), |
| 196 "success", success, | 201 "success", success, |
| 197 "timestamp", timestamp.ToInternalValue()); | 202 "timestamp", timestamp.ToInternalValue()); |
| 198 | 203 |
| 199 if (!client_) | 204 if (!client_) |
| 200 return; // Capture is stopped. | 205 return; // Capture is stopped. |
| 201 | 206 |
| 202 if (success) { | 207 if (success) { |
| 203 if (oracle_->CompleteCapture(frame_number, ×tamp)) { | 208 if (oracle_->CompleteCapture(frame_number, ×tamp)) { |
| 204 media::VideoCaptureFormat format = params_.requested_format; | 209 // TODO(miu): Use the locked-in frame rate from AnimatedContentSampler. |
| 205 // TODO(miu): Passing VideoCaptureFormat here introduces ambiguities. The | 210 frame->metadata().SetDouble(media::VideoFrame::kFrameRateMetadataKey, |
| 206 // following is a hack where frame_size takes on a different meaning than | 211 params_.requested_format.frame_rate); |
| 207 // everywhere else (i.e., coded size, not visible size). Will fix in | 212 // Provide capture begin/end timestamps in the VideoFrame metadata. |
| 208 // soon-upcoming code change. | 213 // Casting the int64 internal value of the start and end TimeTickses to |
| 209 format.frame_size = frame->coded_size(); | 214 // double is reasonable here. This will guarantee 1us resolution for |
| 210 client_->OnIncomingCapturedVideoFrame(buffer, format, frame, timestamp); | 215 // values up to 2^53 (e.g., ~285 years since kernel boot). Alternative |
| 216 // approaches are much more heavyweight (e.g., storing the low and high 32 | |
| 217 // bits as separate fields, storing as formatted ASCII strings, etc.). | |
| 218 frame->metadata().SetDouble( | |
| 219 "captureBeginTimeTicks", | |
|
Alpha Left Google
2015/02/26 21:17:23
Can these names be defined in video_frame.h as wel
miu
2015/02/26 23:25:18
I'm uncomfortable with starting the practice of pu
| |
| 220 static_cast<double>(capture_begin_time.ToInternalValue())); | |
| 221 frame->metadata().SetDouble( | |
| 222 "captureEndTimeTicks", | |
| 223 static_cast<double>(base::TimeTicks::Now().ToInternalValue())); | |
| 224 client_->OnIncomingCapturedVideoFrame(buffer, frame, timestamp); | |
| 211 } | 225 } |
| 212 } | 226 } |
| 213 } | 227 } |
| 214 | 228 |
| 215 void ContentVideoCaptureDeviceCore::AllocateAndStart( | 229 void ContentVideoCaptureDeviceCore::AllocateAndStart( |
| 216 const media::VideoCaptureParams& params, | 230 const media::VideoCaptureParams& params, |
| 217 scoped_ptr<media::VideoCaptureDevice::Client> client) { | 231 scoped_ptr<media::VideoCaptureDevice::Client> client) { |
| 218 DCHECK(thread_checker_.CalledOnValidThread()); | 232 DCHECK(thread_checker_.CalledOnValidThread()); |
| 219 | 233 |
| 220 if (state_ != kIdle) { | 234 if (state_ != kIdle) { |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 350 return; | 364 return; |
| 351 | 365 |
| 352 if (oracle_proxy_.get()) | 366 if (oracle_proxy_.get()) |
| 353 oracle_proxy_->ReportError(reason); | 367 oracle_proxy_->ReportError(reason); |
| 354 | 368 |
| 355 StopAndDeAllocate(); | 369 StopAndDeAllocate(); |
| 356 TransitionStateTo(kError); | 370 TransitionStateTo(kError); |
| 357 } | 371 } |
| 358 | 372 |
| 359 } // namespace content | 373 } // namespace content |
| OLD | NEW |