1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef CONTENT_COMMON_GPU_MEDIA_V4L2_VIDEO_ENCODE_ACCELERATOR_H_
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define CONTENT_COMMON_GPU_MEDIA_V4L2_VIDEO_ENCODE_ACCELERATOR_H_
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <list>
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <linux/videodev2.h>
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <vector>
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/memory/linked_ptr.h"
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/memory/weak_ptr.h"
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/threading/thread.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/content_export.h"
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/common/gpu/media/v4l2_image_processor.h"
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/common/gpu/media/v4l2_video_device.h"
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "media/video/video_encode_accelerator.h"
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/gfx/size.h"
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace base {
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class MessageLoopProxy;
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace base
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace media {
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class BitstreamBuffer;
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace media
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace content {
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// This class handles video encode acceleration by interfacing with a V4L2
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// device exposed by the codec hardware driver. The threading model of this
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// class is the same as in the V4L2VideoDecodeAccelerator (from which class this
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// was designed).
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// This class may try to instantiate and use a V4L2ImageProcessor for input
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// format conversion, if the input format requested via Initialize() is not
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// accepted by the hardware codec.
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class CONTENT_EXPORT V4L2VideoEncodeAccelerator
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public media::VideoEncodeAccelerator {
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  explicit V4L2VideoEncodeAccelerator(scoped_ptr<V4L2Device> device);
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~V4L2VideoEncodeAccelerator();
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
481675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  static std::vector<media::VideoEncodeAccelerator::SupportedProfile>
491675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      GetSupportedProfilesStatic();
501675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // media::VideoEncodeAccelerator implementation.
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual std::vector<media::VideoEncodeAccelerator::SupportedProfile>
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GetSupportedProfiles() OVERRIDE;
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual bool Initialize(media::VideoFrame::Format format,
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                          const gfx::Size& input_visible_size,
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                          media::VideoCodecProfile output_profile,
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          uint32 initial_bitrate,
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          Client* client) OVERRIDE;
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void Encode(const scoped_refptr<media::VideoFrame>& frame,
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                      bool force_keyframe) OVERRIDE;
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void UseOutputBitstreamBuffer(const media::BitstreamBuffer& buffer)
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      OVERRIDE;
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void RequestEncodingParametersChange(uint32 bitrate,
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                               uint32 framerate) OVERRIDE;
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void Destroy() OVERRIDE;
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Auto-destroy reference for BitstreamBuffer, for tracking buffers passed to
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // this instance.
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  struct BitstreamBufferRef;
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Record for codec input buffers.
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  struct InputRecord {
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    InputRecord();
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool at_device;
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scoped_refptr<media::VideoFrame> frame;
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  };
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Record for output buffers.
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  struct OutputRecord {
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    OutputRecord();
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool at_device;
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    linked_ptr<BitstreamBufferRef> buffer_ref;
8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    void* address;
8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    size_t length;
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  };
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enum {
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    kInitialFramerate = 30,
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // These are rather subjectively tuned.
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    kInputBufferCount = 2,
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    kOutputBufferCount = 2,
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    kOutputBufferSize = (2 * 1024 * 1024),
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  };
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Internal state of the encoder.
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enum State {
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    kUninitialized,  // Initialize() not yet called.
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    kInitialized,    // Initialize() returned true; ready to start encoding.
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    kEncoding,       // Encoding frames.
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    kError,          // Error in encoder state.
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  };
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  //
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Callbacks for the image processor, if one is used.
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  //
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Callback run by the image processor when a frame is ready for us to encode.
109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void FrameProcessed(bool force_keyframe,
110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      const scoped_refptr<media::VideoFrame>& frame);
111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Error callback for handling image processor errors.
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void ImageProcessorError();
114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  //
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Encoding tasks, to be run on encode_thread_.
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  //
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void EncodeTask(const scoped_refptr<media::VideoFrame>& frame,
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                  bool force_keyframe);
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Add a BitstreamBuffer to the queue of buffers ready to be used for encoder
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // output.
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void UseOutputBitstreamBufferTask(scoped_ptr<BitstreamBufferRef> buffer_ref);
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Device destruction task.
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void DestroyTask();
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Service I/O on the V4L2 devices.  This task should only be scheduled from
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // DevicePollTask().
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void ServiceDeviceTask();
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Handle the device queues.
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void Enqueue();
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void Dequeue();
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Enqueue a buffer on the corresponding queue.  Returns false on fatal error.
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool EnqueueInputRecord();
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool EnqueueOutputRecord();
1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Attempt to start/stop device_poll_thread_.
1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool StartDevicePoll();
1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool StopDevicePoll();
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  //
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Device tasks, to be run on device_poll_thread_.
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  //
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // The device task.
149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void DevicePollTask(bool poll_device);
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  //
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Safe from any thread.
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  //
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Error notification (using PostTask() to child thread, if necessary).
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void NotifyError(Error error);
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Set the encoder_thread_ state (using PostTask to encoder thread, if
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // necessary).
1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void SetEncoderState(State state);
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  //
1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Other utility functions.  Called on encoder_thread_, unless
1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // encoder_thread_ is not yet started, in which case the child thread can call
1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // these (e.g. in Initialize() or Destroy()).
1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  //
1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Change encoding parameters.
1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void RequestEncodingParametersChangeTask(uint32 bitrate, uint32 framerate);
1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Set up formats and initialize the device for them.
172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool SetFormats(media::VideoFrame::Format input_format,
173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  media::VideoCodecProfile output_profile);
174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Try to set up the device to the input format we were Initialized() with,
176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // or if the device doesn't support it, use one it can support, so that we
177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // can later instantiate a V4L2ImageProcessor to convert to it.
178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool NegotiateInputFormat(media::VideoFrame::Format input_format);
179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Set up the device to the output format requested in Initialize().
181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool SetOutputFormat(media::VideoCodecProfile output_profile);
182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Initialize device controls with default values.
184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool InitControls();
185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Create the buffers we need.
187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool CreateInputBuffers();
188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool CreateOutputBuffers();
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Destroy these buffers.
191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void DestroyInputBuffers();
192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void DestroyOutputBuffers();
1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Our original calling message loop for the child thread.
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const scoped_refptr<base::MessageLoopProxy> child_message_loop_proxy_;
1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gfx::Size visible_size_;
198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Input allocated size required by the device.
199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gfx::Size input_allocated_size_;
200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  size_t output_buffer_byte_size_;
201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Formats for input frames and the output stream.
203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  media::VideoFrame::Format device_input_format_;
204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  size_t input_planes_count_;
205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32 output_format_fourcc_;
206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  //
2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Encoder state, owned and operated by encoder_thread_.
2093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Before encoder_thread_ has started, the encoder state is managed by
2103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // the child (main) thread.  After encoder_thread_ has started, the encoder
2113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // thread should be the only one managing these.
2123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  //
2133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Encoder state.
2153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  State encoder_state_;
2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // We need to provide the stream header with every keyframe, to allow
2183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // midstream decoding restarts.  Store it here.
2193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<uint8[]> stream_header_;
2203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  size_t stream_header_size_;
2213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Video frames ready to be encoded.
2233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::list<scoped_refptr<media::VideoFrame> > encoder_input_queue_;
2243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Encoder device.
226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<V4L2Device> device_;
227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Input queue state.
229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool input_streamon_;
230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Input buffers enqueued to device.
231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int input_buffer_queued_count_;
232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Input buffers ready to use; LIFO since we don't care about ordering.
233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::vector<int> free_input_buffers_;
234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Mapping of int index to input buffer record.
235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::vector<InputRecord> input_buffer_map_;
236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  enum v4l2_memory input_memory_type_;
237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Output queue state.
239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool output_streamon_;
240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Output buffers enqueued to device.
241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int output_buffer_queued_count_;
242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Output buffers ready to use; LIFO since we don't care about ordering.
243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::vector<int> free_output_buffers_;
244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Mapping of int index to output buffer record.
245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::vector<OutputRecord> output_buffer_map_;
2463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Bitstream buffers ready to be used to return encoded output, as a LIFO
2483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // since we don't care about ordering.
2493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::vector<linked_ptr<BitstreamBufferRef> > encoder_output_queue_;
2503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Image processor, if one is in use.
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<V4L2ImageProcessor> image_processor_;
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // This thread services tasks posted from the VEA API entry points by the
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // child thread and device service callbacks posted from the device thread.
256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::Thread encoder_thread_;
257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // The device polling thread handles notifications of V4L2 device changes.
2593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // TODO(sheu): replace this thread with an TYPE_IO encoder_thread_.
2603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::Thread device_poll_thread_;
2613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // To expose client callbacks from VideoEncodeAccelerator.
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // NOTE: all calls to these objects *MUST* be executed on
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // child_message_loop_proxy_.
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::WeakPtr<Client> client_;
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<base::WeakPtrFactory<Client> > client_ptr_factory_;
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // WeakPtr<> pointing to |this| for use in posting tasks from the
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // image_processor_ back to the child thread.
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Tasks posted onto encoder and poll threads can use base::Unretained(this),
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // as both threads will not outlive this object.
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::WeakPtr<V4L2VideoEncodeAccelerator> weak_this_;
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::WeakPtrFactory<V4L2VideoEncodeAccelerator> weak_this_ptr_factory_;
274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(V4L2VideoEncodeAccelerator);
2763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
2773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace content
2793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif  // CONTENT_COMMON_GPU_MEDIA_V4L2_VIDEO_ENCODE_ACCELERATOR_H_
281