blob: c79e57cf934c3e3055df722dcab993d4c8afc27a [file] [log] [blame]
// 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 CHROME_GPU_GPU_ARC_VIDEO_ENCODE_ACCELERATOR_H_
#define CHROME_GPU_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_accelerator.h"
#include "gpu/command_buffer/service/gpu_preferences.h"
#include "media/video/video_encode_accelerator.h"
namespace chromeos {
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,
size_t payload_size,
bool key_frame,
base::TimeDelta timestamp) override;
void NotifyError(Error error) override;
// ::arc::mojom::VideoEncodeAccelerator implementation.
void GetSupportedProfiles(GetSupportedProfilesCallback callback) override;
void Initialize(VideoPixelFormat input_format,
const gfx::Size& visible_size,
VideoEncodeAccelerator::StorageType input_storage,
VideoCodecProfile output_profile,
uint32_t initial_bitrate,
VideoEncodeClientPtr client,
InitializeCallback callback) override;
void Encode(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;
// Unwraps a file descriptor from the given mojo::ScopedHandle.
// If an error is encountered, it returns an invalid base::ScopedFD and
// notifies client about the error via VideoEncodeClient::NotifyError.
base::ScopedFD UnwrapFdFromMojoHandle(mojo::ScopedHandle handle);
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_;
int32_t bitstream_buffer_serial_;
std::unordered_map<uint32_t, UseBitstreamBufferCallback> use_bitstream_cbs_;
DISALLOW_COPY_AND_ASSIGN(GpuArcVideoEncodeAccelerator);
};
} // namespace arc
} // namespace chromeos
#endif // CHROME_GPU_GPU_ARC_VIDEO_ENCODE_ACCELERATOR_H_