Chromium Code Reviews| Index: content/common/gpu/media/v4l2_jpeg_decode_accelerator.h |
| diff --git a/content/common/gpu/media/v4l2_image_processor.h b/content/common/gpu/media/v4l2_jpeg_decode_accelerator.h |
| similarity index 57% |
| copy from content/common/gpu/media/v4l2_image_processor.h |
| copy to content/common/gpu/media/v4l2_jpeg_decode_accelerator.h |
| index f396b0b3a7800fca88cacca490a0e31629e87dc2..6f03df553e06b5abb1727f2cd5bd3929167f12f3 100644 |
| --- a/content/common/gpu/media/v4l2_image_processor.h |
| +++ b/content/common/gpu/media/v4l2_jpeg_decode_accelerator.h |
| @@ -1,9 +1,9 @@ |
| -// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| -#ifndef CONTENT_COMMON_GPU_MEDIA_V4L2_IMAGE_PROCESSOR_H_ |
| -#define CONTENT_COMMON_GPU_MEDIA_V4L2_IMAGE_PROCESSOR_H_ |
| +#ifndef CONTENT_COMMON_GPU_MEDIA_V4L2_JPEG_DECODE_ACCELERATOR_H_ |
| +#define CONTENT_COMMON_GPU_MEDIA_V4L2_JPEG_DECODE_ACCELERATOR_H_ |
| #include <queue> |
| #include <vector> |
| @@ -14,32 +14,22 @@ |
| #include "base/threading/thread.h" |
| #include "content/common/content_export.h" |
| #include "content/common/gpu/media/v4l2_device.h" |
| +#include "media/base/bitstream_buffer.h" |
| #include "media/base/video_frame.h" |
| +#include "media/video/jpeg_decode_accelerator.h" |
| namespace content { |
| -// Handles image processing accelerators that expose a V4L2 memory-to-memory |
| -// interface. The threading model of this class is the same as for other V4L2 |
| -// hardware accelerators (see V4L2VideoDecodeAccelerator) for more details. |
| -class CONTENT_EXPORT V4L2ImageProcessor { |
| +class CONTENT_EXPORT V4L2JpegDecodeAccelerator |
| + : public media::JpegDecodeAccelerator { |
| public: |
| - explicit V4L2ImageProcessor(const scoped_refptr<V4L2Device>& device); |
| - virtual ~V4L2ImageProcessor(); |
| - |
| - // Initializes the processor to convert from |input_format| to |output_format| |
| - // and/or scale from |input_visible_size| to |output_visible_size|. |
| - // Request the output buffers to be of at least |output_allocated_size|. |
| - // Provided |error_cb| will be called if an error occurs. |
| - // Return true if the requested configuration is supported. |
| - bool Initialize(media::VideoFrame::Format input_format, |
| - media::VideoFrame::Format output_format, |
| - gfx::Size input_visible_size, |
| - gfx::Size output_visible_size, |
| - gfx::Size output_allocated_size, |
| - const base::Closure& error_cb); |
| - |
| - // Returns allocated size required by the processor to be fed with. |
| - gfx::Size input_allocated_size() { return input_allocated_size_; } |
| + V4L2JpegDecodeAccelerator( |
| + const scoped_refptr<V4L2Device>& device, |
| + const scoped_refptr<base::MessageLoopProxy>& io_message_loop_proxy); |
| + ~V4L2JpegDecodeAccelerator() override; |
| + |
| + // Note: Initialize() and Destroy() are synchronous. |
| + bool Initialize(Client* client) override; |
| // Callback to be used to return a processed image to the client. The client |
| // should drop references to |frame| once it's done with it. |
| @@ -49,18 +39,22 @@ class CONTENT_EXPORT V4L2ImageProcessor { |
| // Called by client to process |frame|. The resulting processed frame will |
| // be returned via |cb|. The processor will drop all its references to |frame| |
| // after it finishes accessing it. |
| - void Process(const scoped_refptr<media::VideoFrame>& frame, |
| - const FrameReadyCB& cb); |
| +// void Process(const scoped_refptr<media::VideoFrame>& frame, |
| +// const FrameReadyCB& cb); |
| + |
| + void Decode(const media::BitstreamBuffer& bitstream_buffer, |
| + const scoped_refptr<media::VideoFrame>& video_frame); |
|
kcwu
2015/05/26 10:47:23
override;
henryhsu
2015/06/05 03:28:56
Done.
|
| // Stop all processing and clean up. |
| - void Destroy(); |
| + void Destroy() override; |
| private: |
| // Record for input buffers. |
| struct InputRecord { |
| InputRecord(); |
| ~InputRecord(); |
| - scoped_refptr<media::VideoFrame> frame; |
| + void* address; // mmap() address. |
| + size_t length; // mmap() length. |
| bool at_device; |
| }; |
| @@ -68,9 +62,9 @@ class CONTENT_EXPORT V4L2ImageProcessor { |
| struct OutputRecord { |
| OutputRecord(); |
| ~OutputRecord(); |
| + void* address; // mmap() address. |
| + size_t length; // mmap() length. |
| bool at_device; |
| - bool at_client; |
| - std::vector<int> fds; |
| }; |
| // Job record. Jobs are processed in a FIFO order. This is separate from |
| @@ -80,10 +74,11 @@ class CONTENT_EXPORT V4L2ImageProcessor { |
| // may not have one available (and don't need one to submit input to the |
| // device). |
| struct JobRecord { |
| - JobRecord(); |
| + JobRecord(media::BitstreamBuffer bitstream_buffer, |
| + scoped_refptr<media::VideoFrame> video_frame); |
| ~JobRecord(); |
| + media::BitstreamBuffer bitstream_buffer; |
| scoped_refptr<media::VideoFrame> frame; |
| - FrameReadyCB ready_cb; |
| }; |
| enum { |
| @@ -92,21 +87,20 @@ class CONTENT_EXPORT V4L2ImageProcessor { |
| kOutputBufferCount = 2, |
| }; |
| - void ReuseOutputBuffer(int index); |
| - |
| void Enqueue(); |
| void Dequeue(); |
| bool EnqueueInputRecord(); |
| bool EnqueueOutputRecord(); |
| + bool CheckBufferAttributes(); |
| bool CreateInputBuffers(); |
| bool CreateOutputBuffers(); |
| void DestroyInputBuffers(); |
| void DestroyOutputBuffers(); |
| - void NotifyError(); |
| + void NotifyError(int32_t bitstream_buffer_id, Error error); |
| void DestroyTask(); |
| - void ProcessTask(scoped_ptr<JobRecord> job_record); |
| + void DecodeTask(scoped_ptr<JobRecord> job_record); |
| void ServiceDeviceTask(); |
| // Attempt to start/stop device_poll_thread_. |
| @@ -116,27 +110,23 @@ class CONTENT_EXPORT V4L2ImageProcessor { |
| // Ran on device_poll_thread_ to wait for device events. |
| void DevicePollTask(bool poll_device); |
| - // Size and format-related members remain constant after initialization. |
| - // The visible/allocated sizes of the input frame. |
| - gfx::Size input_visible_size_; |
| - gfx::Size input_allocated_size_; |
| - |
| - // The visible/allocated sizes of the destination frame. |
| - gfx::Size output_visible_size_; |
| - gfx::Size output_allocated_size_; |
| - |
| - media::VideoFrame::Format input_format_; |
| media::VideoFrame::Format output_format_; |
| - uint32 input_format_fourcc_; |
| - uint32 output_format_fourcc_; |
| - |
| - size_t input_planes_count_; |
| - size_t output_planes_count_; |
| + // Record current image size for checking image size is changed or not. |
| + gfx::Size image_coded_size_; |
| // Our original calling message loop for the child thread. |
| - const scoped_refptr<base::MessageLoopProxy> child_message_loop_proxy_; |
| + scoped_refptr<base::MessageLoopProxy> child_message_loop_proxy_; |
| + |
| + // GPU IO message loop. |
| + scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_; |
| - // V4L2 device in use. |
| + // To expose client callbacks from JpegDecodeAccelerator. |
| + // NOTE: all calls to these objects *MUST* be executed on |
| + // |child_message_loop_proxy_|. |
| + scoped_ptr<base::WeakPtrFactory<Client>> client_ptr_factory_; |
| + base::WeakPtr<Client> client_; |
| + |
| + // The V4L2Device this class is operating upon. |
| scoped_refptr<V4L2Device> device_; |
| // Thread to communicate with the device on. |
| @@ -171,11 +161,18 @@ class CONTENT_EXPORT V4L2ImageProcessor { |
| base::Closure error_cb_; |
| // Weak factory for producing weak pointers on the device_thread_ |
| - base::WeakPtrFactory<V4L2ImageProcessor> device_weak_factory_; |
| - |
| - DISALLOW_COPY_AND_ASSIGN(V4L2ImageProcessor); |
| + base::WeakPtrFactory<V4L2JpegDecodeAccelerator> device_weak_factory_; |
| + // WeakPtr<> pointing to |this| for use in posting tasks from the decoder |
| + // thread back to the ChildThread. Because the decoder thread is a member of |
| + // this class, any task running on the decoder thread is guaranteed that this |
| + // object is still alive. As a result, tasks posted from ChildThread to |
| + // decoder thread should use base::Unretained(this), and tasks posted from |
| + // the decoder thread to the ChildThread should use |device_weak_|. |
| + base::WeakPtr<V4L2JpegDecodeAccelerator> device_weak_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(V4L2JpegDecodeAccelerator); |
| }; |
| -} // namespace content |
| +} |
|
kcwu
2015/05/26 10:47:23
} // namespace content
henryhsu
2015/06/05 03:28:56
Done.
|
| -#endif // CONTENT_COMMON_GPU_MEDIA_V4L2_IMAGE_PROCESSOR_H_ |
| +#endif // CONTENT_COMMON_GPU_MEDIA_V4L2_JPEG_DECODE_ACCELERATOR_H_ |