| // Copyright 2017 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 COMPONENTS_ARC_VIDEO_ACCELERATOR_GPU_ARC_VIDEO_ENCODE_ACCELERATOR_H_ |
| #define COMPONENTS_ARC_VIDEO_ACCELERATOR_GPU_ARC_VIDEO_ENCODE_ACCELERATOR_H_ |
| |
| #include <memory> |
| #include <unordered_map> |
| #include <vector> |
| |
| #include "base/files/scoped_file.h" |
| #include "base/macros.h" |
| #include "components/arc/common/video_encode_accelerator.mojom.h" |
| #include "components/arc/video_accelerator/video_frame_plane.h" |
| #include "gpu/config/gpu_preferences.h" |
| #include "media/video/video_encode_accelerator.h" |
| |
| namespace arc { |
| |
| // GpuArcVideoEncodeAccelerator manages life-cycle and IPC message translation |
| // for media::VideoEncodeAccelerator. |
| class GpuArcVideoEncodeAccelerator |
| : public ::arc::mojom::VideoEncodeAccelerator, |
| public media::VideoEncodeAccelerator::Client { |
| public: |
| explicit GpuArcVideoEncodeAccelerator( |
| const gpu::GpuPreferences& gpu_preferences); |
| ~GpuArcVideoEncodeAccelerator() override; |
| |
| private: |
| using VideoPixelFormat = media::VideoPixelFormat; |
| using VideoCodecProfile = media::VideoCodecProfile; |
| using Error = media::VideoEncodeAccelerator::Error; |
| using VideoEncodeClientPtr = ::arc::mojom::VideoEncodeClientPtr; |
| |
| // VideoEncodeAccelerator::Client implementation. |
| void RequireBitstreamBuffers(unsigned int input_count, |
| const gfx::Size& input_coded_size, |
| size_t output_buffer_size) override; |
| void BitstreamBufferReady( |
| int32_t bitstream_buffer_id, |
| const media::BitstreamBufferMetadata& metadata) override; |
| void NotifyError(Error error) override; |
| |
| // ::arc::mojom::VideoEncodeAccelerator implementation. |
| void GetSupportedProfiles(GetSupportedProfilesCallback callback) override; |
| void Initialize(const media::VideoEncodeAccelerator::Config& config, |
| VideoEncodeClientPtr client, |
| InitializeCallback callback) override; |
| void EncodeDeprecated(mojo::ScopedHandle fd, |
| std::vector<::arc::VideoFramePlane> planes, |
| int64_t timestamp, |
| bool force_keyframe, |
| EncodeCallback callback) override; |
| void Encode(media::VideoPixelFormat format, |
| mojo::ScopedHandle fd, |
| std::vector<::arc::VideoFramePlane> planes, |
| int64_t timestamp, |
| bool force_keyframe, |
| EncodeCallback callback) override; |
| void UseBitstreamBuffer(mojo::ScopedHandle shmem_fd, |
| uint32_t offset, |
| uint32_t size, |
| UseBitstreamBufferCallback callback) override; |
| void RequestEncodingParametersChange(uint32_t bitrate, |
| uint32_t framerate) override; |
| void Flush(FlushCallback callback) override; |
| |
| void EncodeDmabuf(base::ScopedFD fd, |
| media::VideoPixelFormat format, |
| const std::vector<::arc::VideoFramePlane>& planes, |
| int64_t timestamp, |
| bool force_keyframe, |
| EncodeCallback callback); |
| void EncodeSharedMemory(base::ScopedFD fd, |
| media::VideoPixelFormat format, |
| const std::vector<::arc::VideoFramePlane>& planes, |
| int64_t timestamp, |
| bool force_keyframe, |
| EncodeCallback callback); |
| |
| gpu::GpuPreferences gpu_preferences_; |
| std::unique_ptr<media::VideoEncodeAccelerator> accelerator_; |
| ::arc::mojom::VideoEncodeClientPtr client_; |
| gfx::Size coded_size_; |
| gfx::Size visible_size_; |
| VideoPixelFormat input_pixel_format_; |
| media::VideoEncodeAccelerator::Config::StorageType input_storage_type_; |
| int32_t bitstream_buffer_serial_; |
| std::unordered_map<uint32_t, UseBitstreamBufferCallback> use_bitstream_cbs_; |
| |
| DISALLOW_COPY_AND_ASSIGN(GpuArcVideoEncodeAccelerator); |
| }; |
| |
| } // namespace arc |
| |
| #endif // COMPONENTS_ARC_VIDEO_ACCELERATOR_GPU_ARC_VIDEO_ENCODE_ACCELERATOR_H_ |