blob: e732ba32e9d4f0ee31392c4b3771e439e59b513e [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 MEDIA_GPU_VAAPI_VAAPI_JPEG_ENCODER_H_
#define MEDIA_GPU_VAAPI_VAAPI_JPEG_ENCODER_H_
#include <va/va.h>
#include <memory>
#include "base/macros.h"
#include "base/memory/scoped_refptr.h"
#include "media/gpu/media_gpu_export.h"
#include "ui/gfx/geometry/size.h"
namespace media {
class VaapiWrapper;
// A collection of methods that utilize VA-API hardware video encode
// acceleration on Intel systems. Provides functionality to allow plugging VAAPI
// HW acceleration into the JpegEncodeAccelerator framework.
//
// Clients are expected to manage VA surfaces and VA buffers created via
// VaapiWrapper, and pass them to this class.
class MEDIA_GPU_EXPORT VaapiJpegEncoder {
public:
// |vaapi_wrapper| should be initialized in
// VaapiWrapper::kEncodeConstantBitrate mode with VAProfileJPEGBaseline
// profile.
explicit VaapiJpegEncoder(scoped_refptr<VaapiWrapper> vaapi_wrapper);
VaapiJpegEncoder(const VaapiJpegEncoder&) = delete;
VaapiJpegEncoder& operator=(const VaapiJpegEncoder&) = delete;
~VaapiJpegEncoder();
// Encode a JPEG picture. It will fill VA-API parameters and call
// corresponding VA-API methods according to |input_size|.
// |exif_buffer| contains the EXIF data that will be inserted to the JPEG
// image.
// |exif_buffer_size| is the size of |exif_buffer|.
// |quality| is the JPEG image quality
// |surface_id| is the VA surface that contains input image.
// |output_buffer_id| is the ID of VA buffer that encoded image will be
// stored. The size of it should be at least as large as
// GetMaxCodedBufferSize().
// |exif_offset| is the offset where Exif data should be filled into.
// Return false on failure.
bool Encode(const gfx::Size& input_size,
const uint8_t* exif_buffer,
size_t exif_buffer_size,
int quality,
VASurfaceID surface_id,
VABufferID output_buffer_id,
size_t* exif_offset);
// Gets the maximum possible encoded result size.
// |size| is the dimension of the YUV image to be encoded.
static size_t GetMaxCodedBufferSize(const gfx::Size& size);
private:
scoped_refptr<VaapiWrapper> vaapi_wrapper_;
// |q_matrix_cached_|, |huff_table_param_cached_| and |slice_param_cached_|
// are created when Encode() is called the first time. After that, they will
// directly be used for all the subsequent Encode() calls.
std::unique_ptr<VAQMatrixBufferJPEG> q_matrix_cached_;
std::unique_ptr<VAHuffmanTableBufferJPEGBaseline> huff_table_param_cached_;
std::unique_ptr<VAEncSliceParameterBufferJPEG> slice_param_cached_;
};
} // namespace media
#endif // MEDIA_GPU_VAAPI_VAAPI_JPEG_ENCODER_H_