blob: b3fbe2fe332cfce16b2566023f877c1e48da4246 [file] [log] [blame]
/*
* Copyright 2018 The Chromium OS 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 INCLUDE_CROS_CAMERA_JPEG_DECODE_ACCELERATOR_H_
#define INCLUDE_CROS_CAMERA_JPEG_DECODE_ACCELERATOR_H_
#include <stdint.h>
#include <memory>
#include <base/bind.h>
namespace cros {
using DecodeCallback = base::Callback<void(int buffer_id, int error)>;
// Encapsulates a converter from JPEG to YU12 format. This class is not
// thread-safe.
// Before using this class, make sure mojo is initialized first.
class JpegDecodeAccelerator {
public:
// Enumeration of decode errors.
enum class Error {
// No error. Decode succeeded.
NO_ERRORS,
// Invalid argument was passed to an API method, e.g. the output buffer is
// too small, JPEG width/height are too big for JDA.
INVALID_ARGUMENT,
// Encoded input is unreadable, e.g. failed to map on another process.
UNREADABLE_INPUT,
// Failed to parse compressed JPEG picture.
PARSE_JPEG_FAILED,
// Failed to decode JPEG due to unsupported JPEG features, such as
// profiles, coding mode, or color formats.
UNSUPPORTED_JPEG,
// A fatal failure occurred in the GPU process layer or one of its
// dependencies. Examples of such failures include hardware failures,
// driver failures, library failures, browser programming errors, and so
// on. Client is responsible for destroying JDA after receiving this.
PLATFORM_FAILURE,
// Largest used enum. This should be adjusted when new errors are added.
LARGEST_MOJO_ERROR_ENUM = PLATFORM_FAILURE,
// The Mojo channel is corrupted. User can call Start() again to establish
// the channel.
TRY_START_AGAIN,
// Create shared memory for input buffer failed.
CREATE_SHARED_MEMORY_FAILED,
// mmap() for input failed.
MMAP_FAILED,
// No decode response from Mojo channel after timeout.
NO_DECODE_RESPONSE,
};
static std::unique_ptr<JpegDecodeAccelerator> CreateInstance();
virtual ~JpegDecodeAccelerator() {}
// Starts the Jpeg decoder.
// This method must be called before all the other methods are called.
//
// Returns:
// Returns true on success otherwise false.
virtual bool Start() = 0;
// Decodes the given buffer that contains one JPEG image.
// The image is decoded from memory of |input_fd| with size
// |input_buffer_size|. The size of JPEG image is |coded_size_width| and
// |coded_size_height|.
// Decoded I420 frame data will be put onto memory associated with |output_fd|
// with allocated size |output_buffer_size|.
// Note: This API doesn't close the |input_fd| and |output_fd|. Caller doesn't
// need to dup file descriptor.
//
// Args:
// |input_fd|: A file descriptor of DMA buffer.
// |input_buffer_size|: Size of input buffer.
// |coded_size_width|: Width of JPEG image.
// |coded_size_height|: Height of JPEG image.
// |output_fd|: A file descriptor of shared memory.
// |output_buffer_size|: Size of output buffer.
//
// Returns:
// Returns enum Error to notify the decode status.
// If the return code is TRY_START_AGAIN, user can call Start() again and
// use this API.
virtual Error DecodeSync(int input_fd,
uint32_t input_buffer_size,
int32_t coded_size_width,
int32_t coded_size_height,
int output_fd,
uint32_t output_buffer_size) = 0;
// Asynchronous version of DecodeSync.
//
// Args:
// |input_fd|: A file descriptor of DMA buffer.
// |input_buffer_size|: Size of input buffer.
// |coded_size_width|: Width of JPEG image.
// |coded_size_height|: Height of JPEG image.
// |output_fd|: A file descriptor of shared memory.
// |output_buffer_size|: Size of output buffer.
// |callback|: callback function after finish decoding.
//
// Returns:
// Returns buffer_id of this Decode.
virtual int32_t Decode(int input_fd,
uint32_t input_buffer_size,
int32_t coded_size_width,
int32_t coded_size_height,
int output_fd,
uint32_t output_buffer_size,
DecodeCallback callback) = 0;
};
} // namespace cros
#endif // INCLUDE_CROS_CAMERA_JPEG_DECODE_ACCELERATOR_H_