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