| Index: content/browser/renderer_host/media/video_capture_buffer_pool.cc
|
| diff --git a/content/browser/renderer_host/media/video_capture_buffer_pool.cc b/content/browser/renderer_host/media/video_capture_buffer_pool.cc
|
| index 894a6710d0ddfc8e7b91351f7d98b5984d877e0b..f636f3ac819e0b04c9eb4dc8f614983c6762aee5 100644
|
| --- a/content/browser/renderer_host/media/video_capture_buffer_pool.cc
|
| +++ b/content/browser/renderer_host/media/video_capture_buffer_pool.cc
|
| @@ -25,8 +25,8 @@ VideoFrame::Format VideoPixelFormatToVideoFrameFormat(
|
| VideoFrame::Format frame_format;
|
| } const kVideoPixelFormatToVideoFrameFormat[] = {
|
| {media::PIXEL_FORMAT_I420, VideoFrame::I420},
|
| - {media::PIXEL_FORMAT_TEXTURE, VideoFrame::NATIVE_TEXTURE},
|
| - {media::PIXEL_FORMAT_GPUMEMORYBUFFER, VideoFrame::NATIVE_TEXTURE},
|
| + {media::PIXEL_FORMAT_TEXTURE, VideoFrame::ARGB},
|
| + {media::PIXEL_FORMAT_GPUMEMORYBUFFER, VideoFrame::ARGB},
|
| };
|
|
|
| for (const auto& format_pair : kVideoPixelFormatToVideoFrameFormat) {
|
| @@ -38,6 +38,26 @@ VideoFrame::Format VideoPixelFormatToVideoFrameFormat(
|
| return VideoFrame::UNKNOWN;
|
| }
|
|
|
| +VideoFrame::StorageType VideoPixelFormatToVideoFrameStorageType(
|
| + media::VideoPixelFormat pixel_format) {
|
| + static struct {
|
| + media::VideoPixelFormat pixel_format;
|
| + VideoFrame::StorageType storage_type;
|
| + } const kVideoPixelFormatToVideoFrameStorageType[] = {
|
| + {media::PIXEL_FORMAT_I420, VideoFrame::STORAGE_SHMEM},
|
| + {media::PIXEL_FORMAT_TEXTURE, VideoFrame::STORAGE_TEXTURE},
|
| + {media::PIXEL_FORMAT_GPUMEMORYBUFFER, VideoFrame::STORAGE_TEXTURE},
|
| + };
|
| +
|
| + for (const auto& format_pair : kVideoPixelFormatToVideoFrameStorageType) {
|
| + if (format_pair.pixel_format == pixel_format)
|
| + return format_pair.storage_type;
|
| + }
|
| + LOG(ERROR) << "Unsupported VideoPixelFormat "
|
| + << media::VideoCaptureFormat::PixelFormatToString(pixel_format);
|
| + return VideoFrame::STORAGE_UNKNOWN;
|
| +}
|
| +
|
| // A simple holder of a memory-backed buffer and accesors to it.
|
| class SimpleBufferHandle final : public VideoCaptureBufferPool::BufferHandle {
|
| public:
|
| @@ -90,7 +110,9 @@ class GpuMemoryBufferBufferHandle
|
| class VideoCaptureBufferPool::SharedMemTracker final : public Tracker {
|
| public:
|
| SharedMemTracker();
|
| - bool Init(VideoFrame::Format format, const gfx::Size& dimensions) override;
|
| + bool Init(VideoFrame::Format format,
|
| + media::VideoFrame::StorageType storage_type,
|
| + const gfx::Size& dimensions) override;
|
|
|
| size_t mapped_size() const override { return shared_memory_.mapped_size(); }
|
|
|
| @@ -114,7 +136,9 @@ class VideoCaptureBufferPool::SharedMemTracker final : public Tracker {
|
| class VideoCaptureBufferPool::GpuMemoryBufferTracker final : public Tracker {
|
| public:
|
| GpuMemoryBufferTracker();
|
| - bool Init(VideoFrame::Format format, const gfx::Size& dimensions) override;
|
| + bool Init(VideoFrame::Format format,
|
| + media::VideoFrame::StorageType storage_type,
|
| + const gfx::Size& dimensions) override;
|
| ~GpuMemoryBufferTracker() override;
|
|
|
| size_t mapped_size() const override { return packed_size_; }
|
| @@ -138,9 +162,11 @@ VideoCaptureBufferPool::SharedMemTracker::SharedMemTracker() : Tracker() {
|
|
|
| bool VideoCaptureBufferPool::SharedMemTracker::Init(
|
| VideoFrame::Format format,
|
| + media::VideoFrame::StorageType storage_type,
|
| const gfx::Size& dimensions) {
|
| DVLOG(2) << "allocating ShMem of " << dimensions.ToString();
|
| set_pixel_format(format);
|
| + set_storage_type(storage_type);
|
| // Input |dimensions| can be 0x0 for trackers that do not require memory
|
| // backing. The allocated size is calculated using VideoFrame methods since
|
| // this will be the abstraction used to wrap the underlying data.
|
| @@ -161,12 +187,14 @@ VideoCaptureBufferPool::GpuMemoryBufferTracker::~GpuMemoryBufferTracker() {
|
|
|
| bool VideoCaptureBufferPool::GpuMemoryBufferTracker::Init(
|
| VideoFrame::Format format,
|
| + media::VideoFrame::StorageType storage_type,
|
| const gfx::Size& dimensions) {
|
| DVLOG(2) << "allocating GMB for " << dimensions.ToString();
|
| // BrowserGpuMemoryBufferManager::current() may not be accessed on IO Thread.
|
| DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| DCHECK(BrowserGpuMemoryBufferManager::current());
|
| set_pixel_format(format);
|
| + set_storage_type(storage_type);
|
| set_pixel_count(dimensions.GetArea());
|
| gpu_memory_buffer_ =
|
| BrowserGpuMemoryBufferManager::current()->AllocateGpuMemoryBuffer(
|
| @@ -298,6 +326,10 @@ int VideoCaptureBufferPool::ReserveForProducerInternal(
|
| *buffer_id_to_drop = kInvalidId;
|
|
|
| const size_t size_in_pixels = dimensions.GetArea();
|
| + const media::VideoFrame::Format pixel_format =
|
| + VideoPixelFormatToVideoFrameFormat(format);
|
| + const media::VideoFrame::StorageType storage_type =
|
| + VideoPixelFormatToVideoFrameStorageType(format);
|
| // Look for a tracker that's allocated, big enough, and not in use. Track the
|
| // largest one that's not big enough, in case we have to reallocate a tracker.
|
| *buffer_id_to_drop = kInvalidId;
|
| @@ -308,8 +340,8 @@ int VideoCaptureBufferPool::ReserveForProducerInternal(
|
| Tracker* const tracker = it->second;
|
| if (!tracker->consumer_hold_count() && !tracker->held_by_producer()) {
|
| if (tracker->pixel_count() >= size_in_pixels &&
|
| - (tracker->pixel_format() ==
|
| - VideoPixelFormatToVideoFrameFormat(format))) {
|
| + (tracker->pixel_format() == pixel_format) &&
|
| + (tracker->storage_type() == storage_type)) {
|
| // Existing tracker is big enough and has correct format. Reuse it.
|
| tracker->set_held_by_producer(true);
|
| return it->first;
|
| @@ -338,7 +370,7 @@ int VideoCaptureBufferPool::ReserveForProducerInternal(
|
|
|
| scoped_ptr<Tracker> tracker =
|
| Tracker::CreateTracker(format == media::PIXEL_FORMAT_GPUMEMORYBUFFER);
|
| - if (!tracker->Init(VideoPixelFormatToVideoFrameFormat(format), dimensions)) {
|
| + if (!tracker->Init(pixel_format, storage_type, dimensions)) {
|
| DLOG(ERROR) << "Error initializing Tracker";
|
| return kInvalidId;
|
| }
|
|
|