android13/hardware/google/graphics/common/libhwjpeg/include/ExynosJpegApi.h

181 lines
5.7 KiB
C++

/*
* Copyright Samsung Electronics Co.,LTD.
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __HARDWARE_EXYNOS_EXYNOS_JPEG_API_H__
#define __HARDWARE_EXYNOS_EXYNOS_JPEG_API_H__
// Exynos HAL defines another version of videodev2 apart from the original one
// This prevents conflict from the Exynos HAL from the original videodev2.h
/*
#ifndef v4l2_fourcc
#include <linux/videodev2.h>
#endif
*/
#include <exynos-hwjpeg.h>
#ifndef JPEG_CACHE_ON
#define JPEG_CACHE_ON 1
#endif
#define JPEG_BUF_TYPE_USER_PTR 1
#define JPEG_BUF_TYPE_DMA_BUF 2
// CUSTOM V4L2 4CC FORMATS FOR LEGACY JPEG LIBRARY AND DRIVERS
#ifndef V4L2_PIX_FMT_JPEG_444
#define V4L2_PIX_FMT_JPEG_444 v4l2_fourcc('J', 'P', 'G', '4')
#endif
#ifndef V4L2_PIX_FMT_JPEG_422
#define V4L2_PIX_FMT_JPEG_422 v4l2_fourcc('J', 'P', 'G', '2')
#endif
#ifndef V4L2_PIX_FMT_JPEG_420
#define V4L2_PIX_FMT_JPEG_420 v4l2_fourcc('J', 'P', 'G', '0')
#endif
#ifndef V4L2_PIX_FMT_JPEG_GRAY
#define V4L2_PIX_FMT_JPEG_GRAY v4l2_fourcc('J', 'P', 'G', 'G')
#endif
#ifndef V4L2_PIX_FMT_JPEG_422V
#define V4L2_PIX_FMT_JPEG_422V v4l2_fourcc('J', 'P', 'G', '5')
#endif
#ifndef V4L2_PIX_FMT_JPEG_411
#define V4L2_PIX_FMT_JPEG_411 v4l2_fourcc('J', 'P', 'G', '1')
#endif
class ExynosJpegEncoder {
/*
* ExynosJpedgEncoder class is actually a derived class of
* CHWJpegV4L2Compressor. But it is not derived from CHWJpegV4L2Compressor
* because it has a lot of virtual functions which require extra memory for
* vtables. Moreover, ExynosJpegEncoder class implements no virtual function
* of CHWJpegV4L2Compressor.
*/
CHWJpegV4L2Compressor m_hwjpeg;
char m_iInBufType;
char m_iOutBufType;
unsigned int m_uiState;
int m_nQFactor;
int m_nWidth;
int m_nHeight;
int m_v4l2Format;
int m_jpegFormat;
int m_nStreamSize;
bool __EnsureFormatIsApplied();
protected:
enum {
STATE_SIZE_CHANGED = 1 << 0,
STATE_PIXFMT_CHANGED = 1 << 1,
STATE_BASE_MAX = 1 << 16,
};
unsigned int GetDeviceCapabilities() { return m_hwjpeg.GetDeviceCapabilities(); }
CHWJpegCompressor &GetCompressor() { return m_hwjpeg; }
unsigned int GetHWDelay() { return m_hwjpeg.GetHWDelay(); }
void SetState(unsigned int state) { m_uiState |= state; }
void ClearState(unsigned int state) { m_uiState &= ~state; }
bool TestState(unsigned int state) { return (m_uiState & state) == state; }
bool TestStateEither(unsigned int state) { return (m_uiState & state) != 0; }
virtual bool EnsureFormatIsApplied() { return __EnsureFormatIsApplied(); }
public:
ExynosJpegEncoder(): m_hwjpeg(),
m_iInBufType(JPEG_BUF_TYPE_USER_PTR), m_iOutBufType(JPEG_BUF_TYPE_USER_PTR), m_uiState(0),
m_nQFactor(0), m_nWidth(0), m_nHeight(0), m_v4l2Format(0), m_jpegFormat(0), m_nStreamSize(0)
{
/* To detect setInBuf() call without format setting */
SetState(STATE_SIZE_CHANGED | STATE_PIXFMT_CHANGED);
}
virtual ~ExynosJpegEncoder() { destroy(); }
// Return 0 on success, -1 on error
int flagCreate() { return m_hwjpeg.Okay() ? 0 : -1; }
virtual int create(void) { return flagCreate(); }
virtual int destroy(void) { return 0; }
int updateConfig(void) { return 0; }
int setCache(int __unused val) { return 0; }
void *getJpegConfig() { return reinterpret_cast<void *>(this); }
int setJpegConfig(void* pConfig);
int checkInBufType(void) { return m_iInBufType; }
int checkOutBufType(void) { return m_iOutBufType; }
int getInBuf(int *piBuf, int *piInputSize, int iSize);
int getOutBuf(int *piBuf, int *piOutputSize);
int getInBuf(char **pcBuf, int *piInputSize, int iSize);
int getOutBuf(char **pcBuf, int *piOutputSize);
int setInBuf(int *piBuf, int *iSize);
int setOutBuf(int iBuf, int iSize, int offset = 0);
int setInBuf(char **pcBuf, int *iSize);
int setOutBuf(char *pcBuf, int iSize);
int getSize(int *piWidth, int *piHeight) {
*piWidth = m_nWidth;
*piHeight = m_nHeight;
return 0;
}
int setSize(int iW, int iH) {
if ((m_nWidth != iW) || (m_nHeight != iH)) {
m_nWidth = iW;
m_nHeight = iH;
SetState(STATE_SIZE_CHANGED);
}
return 0;
}
int setJpegFormat(int iV4l2JpegFormat);
int getColorFormat(void) { return m_v4l2Format; }
int setColorFormat(int iV4l2ColorFormat) {
if (iV4l2ColorFormat != m_v4l2Format) {
m_v4l2Format = iV4l2ColorFormat;
SetState(STATE_PIXFMT_CHANGED);
}
return 0;
}
int setQuality(int iQuality) {
if (m_nQFactor != iQuality) {
if (!m_hwjpeg.SetQuality(static_cast<unsigned int>(iQuality)))
return -1;
m_nQFactor = iQuality;
}
return 0;
}
int setQuality(const unsigned char q_table[]);
int setColorBufSize(int *piBufSize, int iSize);
int getJpegSize(void) { return m_nStreamSize; }
int encode(void) {
if (!__EnsureFormatIsApplied())
return false;
m_nStreamSize = static_cast<int>(m_hwjpeg.Compress());
return (m_nStreamSize < 0) ? -1 : 0;
}
};
#endif //__HARDWARE_EXYNOS_EXYNOS_JPEG_API_H__