Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Unified Diff: content/common/gpu/media/v4l2_video_encode_accelerator.h

Issue 1882373004: Migrate content/common/gpu/media code to media/gpu (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix several more bot-identified build issues Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/common/gpu/media/v4l2_video_encode_accelerator.h
diff --git a/content/common/gpu/media/v4l2_video_encode_accelerator.h b/content/common/gpu/media/v4l2_video_encode_accelerator.h
deleted file mode 100644
index f1f6a3c38650a9507e6040d085af0cf7e9055ec7..0000000000000000000000000000000000000000
--- a/content/common/gpu/media/v4l2_video_encode_accelerator.h
+++ /dev/null
@@ -1,301 +0,0 @@
-// Copyright 2014 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_VIDEO_ENCODE_ACCELERATOR_H_
-#define CONTENT_COMMON_GPU_MEDIA_V4L2_VIDEO_ENCODE_ACCELERATOR_H_
-
-#include <linux/videodev2.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <list>
-#include <vector>
-
-#include "base/files/scoped_file.h"
-#include "base/macros.h"
-#include "base/memory/linked_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/threading/thread.h"
-#include "base/time/time.h"
-#include "content/common/content_export.h"
-#include "content/common/gpu/media/v4l2_device.h"
-#include "content/common/gpu/media/v4l2_image_processor.h"
-#include "media/video/video_encode_accelerator.h"
-#include "ui/gfx/geometry/size.h"
-
-namespace media {
-
-class BitstreamBuffer;
-
-} // namespace media
-
-namespace content {
-
-// This class handles video encode acceleration by interfacing with a V4L2
-// device exposed by the codec hardware driver. The threading model of this
-// class is the same as in the V4L2VideoDecodeAccelerator (from which class this
-// was designed).
-// This class may try to instantiate and use a V4L2ImageProcessor for input
-// format conversion, if the input format requested via Initialize() is not
-// accepted by the hardware codec.
-class CONTENT_EXPORT V4L2VideoEncodeAccelerator
- : public media::VideoEncodeAccelerator {
- public:
- explicit V4L2VideoEncodeAccelerator(const scoped_refptr<V4L2Device>& device);
- ~V4L2VideoEncodeAccelerator() override;
-
- // media::VideoEncodeAccelerator implementation.
- media::VideoEncodeAccelerator::SupportedProfiles GetSupportedProfiles()
- override;
- bool Initialize(media::VideoPixelFormat format,
- const gfx::Size& input_visible_size,
- media::VideoCodecProfile output_profile,
- uint32_t initial_bitrate,
- Client* client) override;
- void Encode(const scoped_refptr<media::VideoFrame>& frame,
- bool force_keyframe) override;
- void UseOutputBitstreamBuffer(const media::BitstreamBuffer& buffer)
- override;
- void RequestEncodingParametersChange(uint32_t bitrate,
- uint32_t framerate) override;
- void Destroy() override;
-
- private:
- // Auto-destroy reference for BitstreamBuffer, for tracking buffers passed to
- // this instance.
- struct BitstreamBufferRef;
-
- // Record for codec input buffers.
- struct InputRecord {
- InputRecord();
- ~InputRecord();
- bool at_device;
- scoped_refptr<media::VideoFrame> frame;
- };
-
- // Record for output buffers.
- struct OutputRecord {
- OutputRecord();
- ~OutputRecord();
- bool at_device;
- linked_ptr<BitstreamBufferRef> buffer_ref;
- void* address;
- size_t length;
- };
-
- struct ImageProcessorInputRecord {
- ImageProcessorInputRecord();
- ~ImageProcessorInputRecord();
- scoped_refptr<media::VideoFrame> frame;
- bool force_keyframe;
- };
-
- enum {
- kInitialFramerate = 30,
- // These are rather subjectively tuned.
- kInputBufferCount = 2,
- kOutputBufferCount = 2,
- kImageProcBufferCount = 2,
- kOutputBufferSize = (2 * 1024 * 1024),
- };
-
- // Internal state of the encoder.
- enum State {
- kUninitialized, // Initialize() not yet called.
- kInitialized, // Initialize() returned true; ready to start encoding.
- kEncoding, // Encoding frames.
- kError, // Error in encoder state.
- };
-
- //
- // Callbacks for the image processor, if one is used.
- //
-
- // Callback run by the image processor when a frame is ready for us to encode.
- void FrameProcessed(bool force_keyframe,
- base::TimeDelta timestamp,
- int output_buffer_index);
-
- // Error callback for handling image processor errors.
- void ImageProcessorError();
-
- //
- // Encoding tasks, to be run on encode_thread_.
- //
-
- void EncodeTask(const scoped_refptr<media::VideoFrame>& frame,
- bool force_keyframe);
-
- // Add a BitstreamBuffer to the queue of buffers ready to be used for encoder
- // output.
- void UseOutputBitstreamBufferTask(
- std::unique_ptr<BitstreamBufferRef> buffer_ref);
-
- // Device destruction task.
- void DestroyTask();
-
- // Service I/O on the V4L2 devices. This task should only be scheduled from
- // DevicePollTask().
- void ServiceDeviceTask();
-
- // Handle the device queues.
- void Enqueue();
- void Dequeue();
- // Enqueue a buffer on the corresponding queue. Returns false on fatal error.
- bool EnqueueInputRecord();
- bool EnqueueOutputRecord();
-
- // Attempt to start/stop device_poll_thread_.
- bool StartDevicePoll();
- bool StopDevicePoll();
-
- //
- // Device tasks, to be run on device_poll_thread_.
- //
-
- // The device task.
- void DevicePollTask(bool poll_device);
-
- //
- // Safe from any thread.
- //
-
- // Error notification (using PostTask() to child thread, if necessary).
- void NotifyError(Error error);
-
- // Set the encoder_state_ to kError and notify the client (if necessary).
- void SetErrorState(Error error);
-
- //
- // Other utility functions. Called on encoder_thread_, unless
- // encoder_thread_ is not yet started, in which case the child thread can call
- // these (e.g. in Initialize() or Destroy()).
- //
-
- // Change encoding parameters.
- void RequestEncodingParametersChangeTask(uint32_t bitrate,
- uint32_t framerate);
-
- // Set up formats and initialize the device for them.
- bool SetFormats(media::VideoPixelFormat input_format,
- media::VideoCodecProfile output_profile);
-
- // Try to set up the device to the input format we were Initialized() with,
- // or if the device doesn't support it, use one it can support, so that we
- // can later instantiate a V4L2ImageProcessor to convert to it.
- bool NegotiateInputFormat(media::VideoPixelFormat input_format);
-
- // Set up the device to the output format requested in Initialize().
- bool SetOutputFormat(media::VideoCodecProfile output_profile);
-
- // Initialize device controls with default values.
- bool InitControls();
-
- // Create the buffers we need.
- bool CreateInputBuffers();
- bool CreateOutputBuffers();
-
- // Destroy these buffers.
- void DestroyInputBuffers();
- void DestroyOutputBuffers();
-
- // Set controls in |ctrls| and return true if successful.
- bool SetExtCtrls(std::vector<struct v4l2_ext_control> ctrls);
-
- // Recycle output buffer of image processor with |output_buffer_index|.
- void ReuseImageProcessorOutputBuffer(int output_buffer_index);
-
- // Our original calling task runner for the child thread.
- const scoped_refptr<base::SingleThreadTaskRunner> child_task_runner_;
-
- gfx::Size visible_size_;
- // Input allocated size required by the device.
- gfx::Size input_allocated_size_;
- size_t output_buffer_byte_size_;
-
- // Formats for input frames and the output stream.
- media::VideoPixelFormat device_input_format_;
- size_t input_planes_count_;
- uint32_t output_format_fourcc_;
-
- //
- // Encoder state, owned and operated by encoder_thread_.
- // Before encoder_thread_ has started, the encoder state is managed by
- // the child (main) thread. After encoder_thread_ has started, the encoder
- // thread should be the only one managing these.
- //
-
- // Encoder state.
- State encoder_state_;
-
- // We need to provide the stream header with every keyframe, to allow
- // midstream decoding restarts. Store it here.
- std::unique_ptr<uint8_t[]> stream_header_;
- size_t stream_header_size_;
-
- // Video frames ready to be encoded.
- std::queue<scoped_refptr<media::VideoFrame>> encoder_input_queue_;
-
- // Encoder device.
- scoped_refptr<V4L2Device> device_;
-
- // Input queue state.
- bool input_streamon_;
- // Input buffers enqueued to device.
- int input_buffer_queued_count_;
- // Input buffers ready to use; LIFO since we don't care about ordering.
- std::vector<int> free_input_buffers_;
- // Mapping of int index to input buffer record.
- std::vector<InputRecord> input_buffer_map_;
- enum v4l2_memory input_memory_type_;
-
- // Output queue state.
- bool output_streamon_;
- // Output buffers enqueued to device.
- int output_buffer_queued_count_;
- // Output buffers ready to use; LIFO since we don't care about ordering.
- std::vector<int> free_output_buffers_;
- // Mapping of int index to output buffer record.
- std::vector<OutputRecord> output_buffer_map_;
-
- // Bitstream buffers ready to be used to return encoded output, as a LIFO
- // since we don't care about ordering.
- std::vector<linked_ptr<BitstreamBufferRef> > encoder_output_queue_;
-
- // Image processor, if one is in use.
- std::unique_ptr<V4L2ImageProcessor> image_processor_;
- // Indexes of free image processor output buffers. Only accessed on child
- // thread.
- std::vector<int> free_image_processor_output_buffers_;
- // Video frames ready to be processed. Only accessed on child thread.
- std::queue<ImageProcessorInputRecord> image_processor_input_queue_;
- // Mapping of int index to fds of image processor output buffer.
- std::vector<std::vector<base::ScopedFD>> image_processor_output_buffer_map_;
-
- // This thread services tasks posted from the VEA API entry points by the
- // child thread and device service callbacks posted from the device thread.
- base::Thread encoder_thread_;
-
- // The device polling thread handles notifications of V4L2 device changes.
- // TODO(sheu): replace this thread with an TYPE_IO encoder_thread_.
- base::Thread device_poll_thread_;
-
- // To expose client callbacks from VideoEncodeAccelerator.
- // NOTE: all calls to these objects *MUST* be executed on
- // child_task_runner_.
- base::WeakPtr<Client> client_;
- std::unique_ptr<base::WeakPtrFactory<Client>> client_ptr_factory_;
-
- // WeakPtr<> pointing to |this| for use in posting tasks from the
- // image_processor_ back to the child thread.
- // Tasks posted onto encoder and poll threads can use base::Unretained(this),
- // as both threads will not outlive this object.
- base::WeakPtr<V4L2VideoEncodeAccelerator> weak_this_;
- base::WeakPtrFactory<V4L2VideoEncodeAccelerator> weak_this_ptr_factory_;
-
- DISALLOW_COPY_AND_ASSIGN(V4L2VideoEncodeAccelerator);
-};
-
-} // namespace content
-
-#endif // CONTENT_COMMON_GPU_MEDIA_V4L2_VIDEO_ENCODE_ACCELERATOR_H_

Powered by Google App Engine
This is Rietveld 408576698