|
|
|
/*
|
|
|
|
* Copyright@ Samsung 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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <linux/videodev2.h>
|
|
|
|
|
|
|
|
#define JPEG_DEC_NODE "/dev/video11"
|
|
|
|
#define JPEG_ENC_NODE "/dev/video12"
|
|
|
|
|
|
|
|
#define JPEG_MAX_PLANE_CNT 3
|
|
|
|
#define JPEG_DEC_OUT_BYTE_ALIGN 8
|
|
|
|
|
|
|
|
//#define JPEG_PERF_MEAS
|
|
|
|
|
|
|
|
#ifdef JPEG_PERF_MEAS
|
|
|
|
#define JPEG_PERF_DEFINE(n) \
|
|
|
|
struct timeval time_start_##n, time_stop_##n; unsigned long log_time_##n = 0;
|
|
|
|
|
|
|
|
#define JPEG_PERF_START(n) \
|
|
|
|
gettimeofday(&time_start_##n, NULL);
|
|
|
|
|
|
|
|
#define JPEG_PERF_END(n) \
|
|
|
|
gettimeofday(&time_stop_##n, NULL); log_time_##n = measure_time(&time_start_##n, &time_stop_##n);
|
|
|
|
|
|
|
|
#define JPEG_PERF(n) \
|
|
|
|
log_time_##n
|
|
|
|
#else
|
|
|
|
#define JPEG_PERF_DEFINE(n)
|
|
|
|
#define JPEG_PERF_START(n)
|
|
|
|
#define JPEG_PERF_END(n)
|
|
|
|
#define JPEG_PERF(n)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
enum jpeg_ret_type {
|
|
|
|
JPEG_FAIL,
|
|
|
|
JPEG_OK,
|
|
|
|
JPEG_ENCODE_FAIL,
|
|
|
|
JPEG_ENCODE_OK,
|
|
|
|
JPEG_DECODE_FAIL,
|
|
|
|
JPEG_DECODE_OK,
|
|
|
|
JPEG_OUT_OF_MEMORY,
|
|
|
|
JPEG_UNKNOWN_ERROR
|
|
|
|
};
|
|
|
|
|
|
|
|
enum jpeg_quality_level {
|
|
|
|
QUALITY_LEVEL_1 = 0, /* high */
|
|
|
|
QUALITY_LEVEL_2,
|
|
|
|
QUALITY_LEVEL_3,
|
|
|
|
QUALITY_LEVEL_4, /* low */
|
|
|
|
};
|
|
|
|
|
|
|
|
enum jpeg_mode {
|
|
|
|
JPEG_ENCODE,
|
|
|
|
JPEG_DECODE
|
|
|
|
};
|
|
|
|
|
|
|
|
struct jpeg_buf {
|
|
|
|
int num_planes;
|
|
|
|
void *start[JPEG_MAX_PLANE_CNT];
|
|
|
|
int length[JPEG_MAX_PLANE_CNT];
|
|
|
|
enum v4l2_memory memory;
|
|
|
|
enum v4l2_buf_type buf_type; // Caller need not set this
|
|
|
|
};
|
|
|
|
|
|
|
|
struct jpeg_buf_info {
|
|
|
|
int num_planes;
|
|
|
|
enum v4l2_memory memory;
|
|
|
|
enum v4l2_buf_type buf_type;
|
|
|
|
int reserved[4];
|
|
|
|
};
|
|
|
|
|
|
|
|
struct jpeg_pixfmt {
|
|
|
|
int in_fmt;
|
|
|
|
int out_fmt;
|
|
|
|
int reserved[4];
|
|
|
|
};
|
|
|
|
|
|
|
|
struct jpeg_config {
|
|
|
|
enum jpeg_mode mode;
|
|
|
|
enum jpeg_quality_level enc_qual; // for encoding
|
|
|
|
|
|
|
|
int width;
|
|
|
|
int height;
|
|
|
|
|
|
|
|
int num_planes;
|
|
|
|
|
|
|
|
int scaled_width; // 1/2, 1/4 scaling for decoding
|
|
|
|
int scaled_height; // 1/2, 1/4 scaling for decoding
|
|
|
|
|
|
|
|
int sizeJpeg;
|
|
|
|
|
|
|
|
union {
|
|
|
|
struct jpeg_pixfmt enc_fmt;
|
|
|
|
struct jpeg_pixfmt dec_fmt;
|
|
|
|
} pix;
|
|
|
|
|
|
|
|
int reserved[8];
|
|
|
|
};
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
int jpeghal_dec_init();
|
|
|
|
int jpeghal_enc_init();
|
|
|
|
|
|
|
|
int jpeghal_dec_setconfig(int fd, struct jpeg_config *config);
|
|
|
|
int jpeghal_enc_setconfig(int fd, struct jpeg_config *config);
|
|
|
|
int jpeghal_dec_getconfig(int fd, struct jpeg_config *config);
|
|
|
|
int jpeghal_enc_getconfig(int fd, struct jpeg_config *config);
|
|
|
|
|
|
|
|
int jpeghal_set_inbuf(int fd, struct jpeg_buf *buf);
|
|
|
|
int jpeghal_set_outbuf(int fd, struct jpeg_buf *buf);
|
|
|
|
|
|
|
|
int jpeghal_dec_exe(int fd, struct jpeg_buf *in_buf, struct jpeg_buf *out_buf);
|
|
|
|
int jpeghal_enc_exe(int fd, struct jpeg_buf *in_buf, struct jpeg_buf *out_buf);
|
|
|
|
|
|
|
|
int jpeghal_deinit(int fd, struct jpeg_buf *in_buf, struct jpeg_buf *out_buf);
|
|
|
|
|
|
|
|
int jpeghal_s_ctrl(int fd, int cid, int value);
|
|
|
|
int jpeghal_g_ctrl(int fd, int id);
|
|
|
|
|
|
|
|
unsigned long measure_time(struct timeval *start, struct timeval *stop);
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|