Index: content/browser/renderer_host/media/video_capture_device_client.cc |
diff --git a/content/browser/renderer_host/media/video_capture_device_client.cc b/content/browser/renderer_host/media/video_capture_device_client.cc |
index 66b7fdb3d5d8064233e13585558b4a3894daac4e..9c5efdd07b06e84ba93750e57a3738ae65aa47d5 100644 |
--- a/content/browser/renderer_host/media/video_capture_device_client.cc |
+++ b/content/browser/renderer_host/media/video_capture_device_client.cc |
@@ -7,6 +7,7 @@ |
#include "base/bind.h" |
#include "base/strings/stringprintf.h" |
#include "base/trace_event/trace_event.h" |
+#include "content/browser/renderer_host/gpu_jpeg_decoder.h" |
#include "content/browser/renderer_host/media/video_capture_buffer_pool.h" |
#include "content/browser/renderer_host/media/video_capture_controller.h" |
#include "content/public/browser/browser_thread.h" |
@@ -27,16 +28,15 @@ class AutoReleaseBuffer : public media::VideoCaptureDevice::Client::Buffer { |
AutoReleaseBuffer(const scoped_refptr<VideoCaptureBufferPool>& pool, |
int buffer_id, |
void* data, |
- size_t size) |
- : pool_(pool), |
- id_(buffer_id), |
- data_(data), |
- size_(size) { |
+ size_t size, |
+ base::SharedMemoryHandle handle) |
+ : pool_(pool), id_(buffer_id), data_(data), size_(size), handle_(handle) { |
DCHECK(pool_.get()); |
} |
int id() const override { return id_; } |
void* data() const override { return data_; } |
size_t size() const override { return size_; } |
+ base::SharedMemoryHandle handle() const override { return handle_; } |
private: |
~AutoReleaseBuffer() override { pool_->RelinquishProducerReservation(id_); } |
@@ -45,6 +45,7 @@ class AutoReleaseBuffer : public media::VideoCaptureDevice::Client::Buffer { |
const int id_; |
void* const data_; |
const size_t size_; |
+ const base::SharedMemoryHandle handle_; |
}; |
VideoCaptureDeviceClient::VideoCaptureDeviceClient( |
@@ -52,9 +53,12 @@ VideoCaptureDeviceClient::VideoCaptureDeviceClient( |
const scoped_refptr<VideoCaptureBufferPool>& buffer_pool) |
: controller_(controller), |
buffer_pool_(buffer_pool), |
- last_captured_pixel_format_(media::PIXEL_FORMAT_UNKNOWN) {} |
+ last_captured_pixel_format_(media::PIXEL_FORMAT_UNKNOWN) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+} |
-VideoCaptureDeviceClient::~VideoCaptureDeviceClient() {} |
+VideoCaptureDeviceClient::~VideoCaptureDeviceClient() { |
+} |
void VideoCaptureDeviceClient::OnIncomingCapturedData( |
const uint8* data, |
@@ -68,11 +72,29 @@ void VideoCaptureDeviceClient::OnIncomingCapturedData( |
OnLog("Pixel format: " + media::VideoCaptureFormat::PixelFormatToString( |
frame_format.pixel_format)); |
last_captured_pixel_format_ = frame_format.pixel_format; |
+ |
+ if (frame_format.pixel_format == media::PIXEL_FORMAT_MJPEG && |
+ !external_jpeg_decoder_ && |
+ GpuJpegDecoder::Supported()) { |
+ external_jpeg_decoder_.reset(new GpuJpegDecoder(this)); |
+ if (!external_jpeg_decoder_->Initialize()) { |
wuchengli
2015/04/24 05:54:23
We'll try this for every frame if this fails. Can
kcwu
2015/04/30 19:25:39
Done.
|
+ // Reset external_jpeg_decoder_ to fallback to software decode. |
+ external_jpeg_decoder_.reset(); |
+ } |
+ } |
} |
if (!frame_format.IsValid()) |
return; |
+ if (frame_format.pixel_format == media::PIXEL_FORMAT_MJPEG && |
+ external_jpeg_decoder_ && rotation == 0 && |
+ !external_jpeg_decoder_->IsFailed()) { |
wuchengli
2015/04/24 05:54:23
Let's have a failure callback from GpuJpegDecoder
kcwu
2015/04/30 19:25:39
Since |external_jpeg_decoder_| is created in the c
|
+ external_jpeg_decoder_->DecodeCapturedData(data, length, frame_format, |
wuchengli
2015/04/24 05:54:23
DecodeCapturedData can return a value to indicate
kcwu
2015/04/30 19:25:39
Done.
|
+ rotation, timestamp); |
+ return; |
+ } |
+ |
// |chopped_{width,height} and |new_unrotated_{width,height}| are the lowest |
// bit decomposition of {width, height}, grabbing the odd and even parts. |
const int chopped_width = frame_format.frame_size.width() & 1; |
@@ -316,10 +338,11 @@ VideoCaptureDeviceClient::ReserveOutputBuffer(media::VideoPixelFormat format, |
return NULL; |
void* data; |
size_t size; |
- buffer_pool_->GetBufferInfo(buffer_id, &data, &size); |
+ base::SharedMemoryHandle handle; |
+ buffer_pool_->GetBufferInfo(buffer_id, &data, &size, &handle); |
scoped_refptr<media::VideoCaptureDevice::Client::Buffer> output_buffer( |
- new AutoReleaseBuffer(buffer_pool_, buffer_id, data, size)); |
+ new AutoReleaseBuffer(buffer_pool_, buffer_id, data, size, handle)); |
if (buffer_id_to_drop != VideoCaptureBufferPool::kInvalidId) { |
BrowserThread::PostTask(BrowserThread::IO, |