You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

146 lines
4.0 KiB

/*
* Copyright 2021 Rockchip Electronics Co. LTD
*
* 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.
*
* author: kevin.chen@rock-chips.com
*/
#ifndef __MPI_JPEG_ENCODER_H__
#define __MPI_JPEG_ENCODER_H__
#include "rk_mpi.h"
class QList;
class MpiJpegEncoder {
public:
MpiJpegEncoder();
~MpiJpegEncoder();
/* All supported input formats */
typedef enum {
INPUT_FMT_YUV420SP = MPP_FMT_YUV420SP,
INPUT_FMT_YUV420P = MPP_FMT_YUV420P,
INPUT_FMT_YUV422SP_VU = MPP_FMT_YUV422SP_VU,
INPUT_FMT_YUV422_YUYV = MPP_FMT_YUV422_YUYV,
INPUT_FMT_YUV422_UYVY = MPP_FMT_YUV422_UYVY,
INPUT_FMT_ARGB8888 = MPP_FMT_ARGB8888,
INPUT_FMT_RGBA8888 = MPP_FMT_RGBA8888,
INPUT_FMT_ABGR8888 = MPP_FMT_ABGR8888
} InputFormat;
typedef struct {
/* Output parameters */
void *data;
int32_t size;
/* packet handle, used to release cache buffer */
void *handle;
} OutputPacket_t;
typedef struct {
/* input buffer information */
int32_t inputPhyAddr;
uint8_t *inputVirAddr;
int32_t width;
int32_t height;
InputFormat format;
/* coding quality - range from (1 - 10) */
int32_t qLvl;
/* insert thumbnail or not */
int32_t doThumbNail;
int32_t thumbWidth;
int32_t thumbHeight;
int32_t thumbQLvl;
void *exifInfo;
void *gpsInfo;
} EncInInfo;
typedef struct {
/* Input parameters, User-specified output buffer address */
int32_t outputPhyAddr;
uint8_t *outputVirAddr;
int32_t outBufLen;
} EncOutInfo;
bool prepareEncoder();
bool flushBuffer();
bool updateEncodeCfg(
int32_t width, int32_t height,
InputFormat format = INPUT_FMT_YUV420SP, int32_t qLvl = 80,
int32_t hstride = 0, int32_t vstride = 0);
/*
* output buffer count within limits, so release packet buffer if the
* frame has been display successfully.
*/
bool deinitOutputPacket(OutputPacket_t *packetOut);
bool encodeFrame(char *data, OutputPacket_t *packetOut);
bool encodeFile(const char *inputFile, const char *outputFile);
/*
* designed for Rockchip cameraHal, using user-specified in/output fd
*
* param[in] inInfo - pointer to input buffer parameters for encoder
* param[in/out] outInfo - pointer to output buffer parameters for encoder
*/
bool encode(EncInInfo *inInfo, EncOutInfo *outInfo);
private:
typedef struct {
int32_t fd;
int32_t size;
uint8_t *exifData;
int32_t exifSize;
} OutBuffer_t;
MppCtx mMppCtx;
MppApi *mMppMpi;
MppBufferGroup mMemGroup;
bool mStateReady;
int32_t mFrameCount;
int32_t mWidth;
int32_t mHeight;
int32_t mHorStride;
int32_t mVerStride;
/* coding quality - range from (10 ~ 100) */
int32_t mQuality;
QList *mPackets;
InputFormat mInputFmt;
/* global jpeg encoder warpper */
bool runFrameEnc(MppFrame inFrame, MppPacket &outPacket);
/* crop and get thumbnail image */
bool getThumbImage(EncInInfo *inInfo, int32_t outputFd);
/* encode thumbnail image */
bool encodeThumbImage(EncInInfo *inInfo, OutputPacket_t *packetOut);
/* encode big image using user-specified fd */
bool encodeBigImage(
EncInInfo *inInfo, OutBuffer_t *outBuffer, OutputPacket_t *packetOut);
};
#endif // __MPI_JPEG_ENCODER_H__