Index: content/browser/renderer_host/media/web_contents_video_capture_device.cc |
diff --git a/content/browser/renderer_host/media/web_contents_video_capture_device.cc b/content/browser/renderer_host/media/web_contents_video_capture_device.cc |
index d8a7ac7fcf90244e049456159ceeb11140e1e2d3..8dab1c163f94befbaec8a7807a6645bd4f3502a2 100644 |
--- a/content/browser/renderer_host/media/web_contents_video_capture_device.cc |
+++ b/content/browser/renderer_host/media/web_contents_video_capture_device.cc |
@@ -163,10 +163,11 @@ class ThreadSafeCaptureOracle |
virtual ~ThreadSafeCaptureOracle() {} |
// Callback invoked on completion of all captures. |
- void DidCaptureFrame(const scoped_refptr<media::VideoFrame>& frame, |
- int frame_number, |
- base::Time timestamp, |
- bool success); |
+ void DidCaptureFrame( |
+ scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer, |
+ int frame_number, |
+ base::Time timestamp, |
+ bool success); |
// Protects everything below it. |
base::Lock lock_; |
@@ -417,8 +418,8 @@ bool ThreadSafeCaptureOracle::ObserveEventAndDecideCapture( |
if (!client_) |
return false; // Capture is stopped. |
- scoped_refptr<media::VideoFrame> output_buffer = |
- client_->ReserveOutputBuffer(capture_size_); |
+ scoped_ptr<media::VideoCaptureDevice::Client::Buffer> output_buffer = |
+ client_->ReserveOutputBuffer(media::VideoFrame::I420, capture_size_); |
const bool should_capture = |
oracle_->ObserveEventAndDecideCapture(event, event_time); |
const bool content_is_dirty = |
@@ -430,14 +431,14 @@ bool ThreadSafeCaptureOracle::ObserveEventAndDecideCapture( |
"paint")); |
// Consider the various reasons not to initiate a capture. |
- if (should_capture && !output_buffer.get()) { |
+ if (should_capture && !output_buffer) { |
TRACE_EVENT_INSTANT1("mirroring", |
"EncodeLimited", |
TRACE_EVENT_SCOPE_THREAD, |
"trigger", |
event_name); |
return false; |
- } else if (!should_capture && output_buffer.get()) { |
+ } else if (!should_capture && output_buffer) { |
if (content_is_dirty) { |
// This is a normal and acceptable way to drop a frame. We've hit our |
// capture rate limit: for example, the content is animating at 60fps but |
@@ -447,7 +448,7 @@ bool ThreadSafeCaptureOracle::ObserveEventAndDecideCapture( |
"trigger", event_name); |
} |
return false; |
- } else if (!should_capture && !output_buffer.get()) { |
+ } else if (!should_capture && !output_buffer) { |
// We decided not to capture, but we wouldn't have been able to if we wanted |
// to because no output buffer was available. |
TRACE_EVENT_INSTANT1("mirroring", "NearlyEncodeLimited", |
@@ -459,9 +460,21 @@ bool ThreadSafeCaptureOracle::ObserveEventAndDecideCapture( |
TRACE_EVENT_ASYNC_BEGIN2("mirroring", "Capture", output_buffer.get(), |
"frame_number", frame_number, |
"trigger", event_name); |
- *storage = output_buffer; |
+ |
+ *storage = media::VideoFrame::WrapExternalPackedMemory( |
+ media::VideoFrame::I420, |
+ capture_size_, |
+ gfx::Rect(capture_size_), |
+ capture_size_, |
+ static_cast<uint8*>(output_buffer->data()), |
+ output_buffer->size(), |
+ base::SharedMemory::NULLHandle(), |
+ base::TimeDelta(), |
+ base::Closure()); |
*callback = base::Bind(&ThreadSafeCaptureOracle::DidCaptureFrame, |
- this, output_buffer, frame_number); |
+ this, |
+ base::Passed(&output_buffer), |
ncarter (slow)
2013/10/29 18:42:17
I think this ownership scheme will work today, but
sheu
2013/11/05 20:02:10
That actually blew this whole thing wide open. Lo
|
+ frame_number); |
return true; |
} |
@@ -477,12 +490,12 @@ void ThreadSafeCaptureOracle::ReportError() { |
} |
void ThreadSafeCaptureOracle::DidCaptureFrame( |
- const scoped_refptr<media::VideoFrame>& frame, |
+ scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer, |
int frame_number, |
base::Time timestamp, |
bool success) { |
base::AutoLock guard(lock_); |
- TRACE_EVENT_ASYNC_END2("mirroring", "Capture", frame.get(), |
+ TRACE_EVENT_ASYNC_END2("mirroring", "Capture", buffer.get(), |
"success", success, |
"timestamp", timestamp.ToInternalValue()); |
@@ -490,8 +503,10 @@ void ThreadSafeCaptureOracle::DidCaptureFrame( |
return; // Capture is stopped. |
if (success) { |
- if (oracle_->CompleteCapture(frame_number, timestamp)) |
- client_->OnIncomingCapturedVideoFrame(frame, timestamp); |
+ if (oracle_->CompleteCapture(frame_number, timestamp)) { |
+ client_->OnIncomingCapturedBuffer( |
+ buffer.Pass(), media::VideoFrame::I420, capture_size_, timestamp); |
+ } |
} |
} |