blob: a9e3fb0719a2d8118f91415f8e64c7a12b20005a [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 CAMERA_COMMON_JPEG_COMPRESSOR_IMPL_H_
#define CAMERA_COMMON_JPEG_COMPRESSOR_IMPL_H_
#include "cros-camera/jpeg_compressor.h"
#include <system/graphics.h>
// We must include cstdio before jpeglib.h. It is a requirement of libjpeg.
#include <cstdio>
#include <memory>
#include <string>
#include <vector>
extern "C" {
#include <jerror.h>
#include <jpeglib.h>
}
#include "cros-camera/camera_metrics.h"
namespace cros {
class JpegEncodeAccelerator;
// Implementation of JpegCompressor. This class is not thread-safe.
class JpegCompressorImpl : public JpegCompressor {
public:
explicit JpegCompressorImpl(CameraMojoChannelManager* mojo_manager);
~JpegCompressorImpl() override;
// To be deprecated.
bool CompressImage(
const void* image,
int width,
int height,
int quality,
const void* app1_buffer,
uint32_t app1_size,
uint32_t out_buffer_size,
void* out_buffer,
uint32_t* out_data_size,
JpegCompressor::Mode mode = JpegCompressor::Mode::kDefault) override;
bool CompressImageFromHandle(
buffer_handle_t input,
buffer_handle_t output,
int width,
int height,
int quality,
const void* app1_ptr,
uint32_t app1_size,
uint32_t* out_data_size,
JpegCompressor::Mode mode = JpegCompressor::Mode::kDefault) override;
bool CompressImageFromMemory(void* input,
uint32_t input_format,
void* output,
int output_buffer_size,
int width,
int height,
int quality,
const void* app1_ptr,
uint32_t app1_size,
uint32_t* out_data_size) override;
// To be deprecated.
bool GenerateThumbnail(const void* image,
int image_width,
int image_height,
int thumbnail_width,
int thumbnail_height,
int quality,
uint32_t out_buffer_size,
void* out_buffer,
uint32_t* out_data_size) override;
private:
// InitDestination(), EmptyOutputBuffer() and TerminateDestination() are
// callback functions to be passed into jpeg library.
static void InitDestination(j_compress_ptr cinfo);
static boolean EmptyOutputBuffer(j_compress_ptr cinfo);
static void TerminateDestination(j_compress_ptr cinfo);
static void OutputErrorMessage(j_common_ptr cinfo);
// Returns false if errors occur during HW encode.
bool EncodeHwLegacy(const uint8_t* input_buffer,
uint32_t input_buffer_size,
int width,
int height,
const uint8_t* app1_buffer,
uint32_t app1_size,
uint32_t out_buffer_size,
void* out_buffer,
uint32_t* out_data_size);
// Returns false if errors occur.
bool EncodeLegacy(const void* inYuv,
int width,
int height,
int jpegQuality,
const void* app1_buffer,
unsigned int app1_size,
uint32_t out_buffer_size,
void* out_buffer,
uint32_t* out_data_size);
bool EncodeHw(buffer_handle_t input_handle,
buffer_handle_t output_handle,
int width,
int height,
const void* app1_ptr,
uint32_t app1_size,
uint32_t* out_data_size);
bool EncodeSw(const android_ycbcr& input_ycbcr,
uint32_t input_format,
void* output_ptr,
int output_buffer_size,
int width,
int height,
int jpeg_quality,
const void* app1_ptr,
unsigned int app1_size,
uint32_t* out_data_size);
void SetJpegDestination(jpeg_compress_struct* cinfo);
void SetJpegCompressStruct(int width,
int height,
int quality,
jpeg_compress_struct* cinfo);
// Returns false if errors occur.
bool Compress(jpeg_compress_struct* cinfo, const uint8_t* yuv);
// Metrics that used to record things like encoding latency.
std::unique_ptr<CameraMetrics> camera_metrics_;
std::unique_ptr<cros::JpegEncodeAccelerator> hw_encoder_;
bool hw_encoder_started_;
// Process 16 lines of Y and 16 lines of U/V each time.
// We must pass at least 16 scanlines according to libjpeg documentation.
static const int kCompressBatchSize = 16;
// Point to output buffer. JpegCompressorImpl doesn't own this buffer.
JOCTET* out_buffer_ptr_;
// Output buffer size.
uint32_t out_buffer_size_;
// Final JPEG encoded size.
uint32_t out_data_size_;
// Since output buffer is passed from caller, use a variable to indicate
// buffer is enough to encode or not.
bool is_encode_success_;
// Mojo manager which is used for Mojo communication.
CameraMojoChannelManager* mojo_manager_;
};
} // namespace cros
#endif // CAMERA_COMMON_JPEG_COMPRESSOR_IMPL_H_