| Index: media/gpu/v4l2_video_encode_accelerator.h
|
| diff --git a/media/gpu/v4l2_video_encode_accelerator.h b/media/gpu/v4l2_video_encode_accelerator.h
|
| index de8d6d2946f6415e472af838f05264f86603cbec..f31fdcaa758c362718371631ebcaf5f68df90527 100644
|
| --- a/media/gpu/v4l2_video_encode_accelerator.h
|
| +++ b/media/gpu/v4l2_video_encode_accelerator.h
|
| @@ -9,13 +9,12 @@
|
| #include <stddef.h>
|
| #include <stdint.h>
|
|
|
| -#include <list>
|
| #include <memory>
|
| +#include <queue>
|
| #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"
|
| @@ -78,7 +77,7 @@ class MEDIA_GPU_EXPORT V4L2VideoEncodeAccelerator
|
| OutputRecord();
|
| ~OutputRecord();
|
| bool at_device;
|
| - linked_ptr<BitstreamBufferRef> buffer_ref;
|
| + std::unique_ptr<BitstreamBufferRef> buffer_ref;
|
| void* address;
|
| size_t length;
|
| };
|
| @@ -201,9 +200,21 @@ class MEDIA_GPU_EXPORT V4L2VideoEncodeAccelerator
|
| // Set controls in |ctrls| and return true if successful.
|
| bool SetExtCtrls(std::vector<struct v4l2_ext_control> ctrls);
|
|
|
| + // Return true if a V4L2 control of |ctrl_id| is supported by the device,
|
| + // false otherwise.
|
| + bool IsCtrlExposed(uint32_t ctrl_id);
|
| +
|
| // Recycle output buffer of image processor with |output_buffer_index|.
|
| void ReuseImageProcessorOutputBuffer(int output_buffer_index);
|
|
|
| + // Copy encoded stream data from an output V4L2 buffer at |bitstream_data|
|
| + // of size |bitstream_size| into a BitstreamBuffer referenced by |buffer_ref|,
|
| + // injecting stream headers if required. Return the size in bytes of the
|
| + // resulting stream in the destination buffer.
|
| + size_t CopyIntoOutputBuffer(const uint8_t* bitstream_data,
|
| + size_t bitstream_size,
|
| + std::unique_ptr<BitstreamBufferRef> buffer_ref);
|
| +
|
| // Our original calling task runner for the child thread.
|
| const scoped_refptr<base::SingleThreadTaskRunner> child_task_runner_;
|
|
|
| @@ -227,10 +238,18 @@ class MEDIA_GPU_EXPORT V4L2VideoEncodeAccelerator
|
| // 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_;
|
| + // For H264, for resilience, we prepend each IDR with SPS and PPS. Some
|
| + // devices support this via the V4L2_CID_MPEG_VIDEO_H264_SPS_PPS_BEFORE_IDR
|
| + // control. For devices that don't, we cache the latest SPS and PPS and inject
|
| + // them into the stream before every IDR.
|
| + bool inject_sps_and_pps_ = false;
|
| + // Cached SPS (without H.264 start code).
|
| + std::vector<uint8_t> cached_sps_;
|
| + // Cached PPS (without H.264 start code).
|
| + std::vector<uint8_t> cached_pps_;
|
| + // Size in bytes required to inject cached SPS and PPS, including H.264
|
| + // start codes.
|
| + size_t cached_h264_header_size_ = 0;
|
|
|
| // Video frames ready to be encoded.
|
| std::queue<scoped_refptr<VideoFrame>> encoder_input_queue_;
|
| @@ -259,7 +278,7 @@ class MEDIA_GPU_EXPORT V4L2VideoEncodeAccelerator
|
|
|
| // 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_;
|
| + std::vector<std::unique_ptr<BitstreamBufferRef>> encoder_output_queue_;
|
|
|
| // Image processor, if one is in use.
|
| std::unique_ptr<V4L2ImageProcessor> image_processor_;
|
|
|