/*
|
* Copyright (c) 2019 Rockchip Corporation
|
*
|
* 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 "sample_comm.h"
|
|
static void sample_accm_usage()
|
{
|
printf("Usage : \n");
|
printf(" ImgProc API: \n");
|
printf("\t 0) CCM: Set CCM MANUAL Mode.\n");
|
printf("\t 1) CCM: Set CCM AUTO Mode.\n");
|
printf("\t 2) CCM: Get CCM Mode.\n");
|
printf("\t 3) CCM: Set CCM Manual Matrix.\n");
|
printf("\t 4) CCM: Get CCM Matrix.\n");
|
printf("\t 5) CCM: Get ACCM Sat-level.\n");
|
printf("\t 6) CCM: Get ACCM Matrix Name.\n");
|
printf(" Module API: \n");
|
printf("\t a) CCM: Set Ccm Attr & Sync .\n");
|
printf("\t b) CCM: Set Ccm Attr & Async .\n");
|
printf("\t c) CCM: Set Mode Manual & Sync.\n");
|
printf("\t d) CCM: Set Mode Manual & Async.\n");
|
printf("\t e) CCM: Set Mode Auto & Sync.\n");
|
printf("\t f) CCM: Set Mode Auto & Async.\n");
|
printf("\t g) CCM: Set Manual attr & Sync.\n");
|
printf("\t i) CCM: Set Manual attr & Async.\n");
|
printf("\t j) CCM: Set Auto attr & Sync.\n");
|
printf("\t k) CCM: Set Auto attr & Async.\n");
|
printf("\t l) CCM: Query CCM Info.\n");
|
printf("\n");
|
printf("\t h) CCM: help.\n");
|
printf("\t q) CCM: return to main sample screen.\n");
|
|
printf("\n");
|
printf("\t please press the key: ");
|
|
return;
|
}
|
|
void sample_print_accm_info(const void *arg)
|
{
|
printf ("enter CCM modult test!\n");
|
}
|
|
/*
|
******************************
|
*
|
* ImgProc level API Sample Func
|
*
|
******************************
|
*/
|
|
static int sample_set_ccm_manual(const rk_aiq_sys_ctx_t* ctx)
|
{
|
opMode_t mode = OP_MANUAL;
|
rk_aiq_uapi2_setCCMMode(ctx, mode);
|
return 0;
|
}
|
|
static int sample_set_ccm_auto(const rk_aiq_sys_ctx_t* ctx)
|
{
|
opMode_t mode = OP_AUTO;
|
rk_aiq_uapi2_setCCMMode(ctx, mode);
|
return 0;
|
}
|
|
static int sample_get_ccm_mode(const rk_aiq_sys_ctx_t* ctx)
|
{
|
opMode_t mode;
|
rk_aiq_uapi2_getCCMMode(ctx, &mode);
|
if (mode == OP_MANUAL)
|
printf("CCM Mode is: Manual \n");
|
else if (mode == OP_AUTO)
|
printf("CCM Mode is: AUTO\n");
|
else
|
printf("CCM Mode is: INVALID\n");
|
return 0;
|
}
|
|
static int sample_set_ccm_manual_matrix(const rk_aiq_sys_ctx_t* ctx)
|
{
|
opMode_t mode = OP_MANUAL;
|
rk_aiq_ccm_matrix_t mccm;
|
memset(&mccm, 0, sizeof(rk_aiq_ccm_matrix_t));
|
mccm.ccMatrix[0] = 1.5;
|
mccm.ccMatrix[1] = 0;
|
mccm.ccMatrix[2] = -0.5;
|
mccm.ccMatrix[3] = 0;
|
mccm.ccMatrix[4] = 1;
|
mccm.ccMatrix[5] = 0;
|
mccm.ccMatrix[6] = 0;
|
mccm.ccMatrix[7] = 0;
|
mccm.ccMatrix[8] = 1;
|
mccm.ccOffsets[0] = 1000;
|
mccm.ccOffsets[1] = 0;
|
mccm.ccOffsets[2] = 0;
|
rk_aiq_uapi2_setMCcCoef(ctx, &mccm);
|
return 0;
|
}
|
|
static int sample_get_ccm_manual_matrix(const rk_aiq_sys_ctx_t* ctx)
|
{
|
rk_aiq_ccm_matrix_t mccm;
|
memset(&mccm, 0, sizeof(rk_aiq_ccm_matrix_t));
|
rk_aiq_uapi2_getMCcCoef(ctx, &mccm);
|
printf("Get CCM Matrix: ");
|
for (int j = 0; j < 9; j++)
|
printf("%f ", mccm.ccMatrix[j]);
|
printf("\n");
|
printf("offs: %f, %f, %f \n", mccm.ccOffsets[0], mccm.ccOffsets[1], mccm.ccOffsets[2]);
|
return 0;
|
}
|
|
static int sample_get_accm_sat(const rk_aiq_sys_ctx_t* ctx)
|
{
|
float finalsat;
|
rk_aiq_uapi2_getACcmSat(ctx, &finalsat);
|
printf("Get ACCM Sat-level: %f\n", finalsat);
|
return 0;
|
}
|
|
static int sample_get_accm_matrix_name(const rk_aiq_sys_ctx_t* ctx)
|
{
|
char* ccmname[2];
|
ccmname[0] = (char*)malloc(sizeof(char)*25);
|
ccmname[1] = (char*)malloc(sizeof(char)*25);
|
rk_aiq_uapi2_getACcmMatrixName(ctx, ccmname);
|
printf("Get ACCM Matrix Name: %s %s \n\n", ccmname[0], ccmname[1]);
|
return 0;
|
}
|
|
/*
|
******************************
|
*
|
* Module level API Sample Func
|
*
|
******************************
|
*/
|
|
static int sample_ccm_setCcmAttr(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
rk_aiq_ccm_attrib_t attr;
|
memset(&attr,0,sizeof(rk_aiq_ccm_attrib_t));
|
//get
|
ret = rk_aiq_user_api2_accm_GetAttrib(ctx, &attr);
|
RKAIQ_SAMPLE_CHECK_RET(ret, "setCcmAttr failed in getting accm attrib!");
|
//modify
|
attr.sync.sync_mode = sync;
|
attr.mode = RK_AIQ_CCM_MODE_AUTO;
|
if (attr.stAuto.color_saturation.level[0] == 100) {
|
for (int i = 0; i < 4; i++)
|
attr.stAuto.color_saturation.level[i] = 50;
|
} else {
|
for (int i = 0; i < 4; i++)
|
attr.stAuto.color_saturation.level[i] = 100;
|
}
|
|
//set
|
ret = rk_aiq_user_api2_accm_SetAttrib(ctx, attr);
|
RKAIQ_SAMPLE_CHECK_RET(ret, "set CCM Attr failed!");
|
printf("set CCM Attr\n\n");
|
|
return 0;
|
}
|
|
static int sample_ccm_getCcmAttr(const rk_aiq_sys_ctx_t* ctx)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
rk_aiq_ccm_attrib_t attr;
|
memset(&attr,0,sizeof(rk_aiq_ccm_attrib_t));
|
//get
|
ret = rk_aiq_user_api2_accm_GetAttrib(ctx, &attr);
|
RKAIQ_SAMPLE_CHECK_RET(ret, "get Ccm Attr failed!");
|
printf("get CCM Attr:\n\n");
|
printf("\t sync = %d, done = %d\n", attr.sync.sync_mode, attr.sync.done);
|
printf("\t enable = %s\n", (attr.byPass ? "false" : "true"));
|
if (attr.mode == RK_AIQ_CCM_MODE_MANUAL){
|
printf("\t mode = Manual\n");
|
printf("\t matrix = [");
|
for (int i = 0; i < 9; i++)
|
printf("%f ", attr.stManual.ccMatrix[i]);
|
printf("\n\t offset = [%f %f %f]\n", attr.stManual.ccOffsets[0],
|
attr.stManual.ccOffsets[1],
|
attr.stManual.ccOffsets[2]);
|
} else if (attr.mode == RK_AIQ_CCM_MODE_AUTO){
|
printf("\t mode = Auto\n");
|
printf("\t color_saturation level = {%f %f %f %f}\n",
|
attr.stAuto.color_saturation.level[0],
|
attr.stAuto.color_saturation.level[1],
|
attr.stAuto.color_saturation.level[2],
|
attr.stAuto.color_saturation.level[3]);
|
} else {
|
printf("\t mode is invalid!");
|
}
|
return 0;
|
}
|
|
static int sample_ccm_setModeManual(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
rk_aiq_ccm_attrib_t attr;
|
memset(&attr,0,sizeof(rk_aiq_ccm_attrib_t));
|
//get
|
ret = rk_aiq_user_api2_accm_GetAttrib(ctx, &attr);
|
RKAIQ_SAMPLE_CHECK_RET(ret, "setModeManual failed in getting accm attrib!");
|
//modify
|
attr.sync.sync_mode = sync;
|
attr.mode = RK_AIQ_CCM_MODE_MANUAL;
|
//set
|
ret = rk_aiq_user_api2_accm_SetAttrib(ctx, attr);
|
RKAIQ_SAMPLE_CHECK_RET(ret, "set Mode Manual failed!");
|
printf("set CCM Mode Manual\n\n");
|
|
return 0;
|
}
|
|
static int sample_ccm_setModeAuto(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
rk_aiq_ccm_attrib_t attr;
|
memset(&attr,0,sizeof(rk_aiq_ccm_attrib_t));
|
//get
|
ret = rk_aiq_user_api2_accm_GetAttrib(ctx, &attr);
|
RKAIQ_SAMPLE_CHECK_RET(ret, "setModeAuto failed in getting accm attrib!");
|
//modify
|
attr.sync.sync_mode = sync;
|
attr.mode = RK_AIQ_CCM_MODE_AUTO;
|
//set
|
ret = rk_aiq_user_api2_accm_SetAttrib(ctx, attr);
|
RKAIQ_SAMPLE_CHECK_RET(ret, "set Mode Auto failed!");
|
printf("set CCM Mode Auto\n\n");
|
|
return 0;
|
}
|
|
static int sample_ccm_getMode(const rk_aiq_sys_ctx_t* ctx)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
rk_aiq_ccm_attrib_t attr;
|
memset(&attr,0,sizeof(rk_aiq_ccm_attrib_t));
|
//get
|
ret = rk_aiq_user_api2_accm_GetAttrib(ctx, &attr);
|
RKAIQ_SAMPLE_CHECK_RET(ret, "get Ccm Mode failed!");
|
printf("get CCM Mode:\n\n");
|
printf("\t sync = %d, done = %d\n", attr.sync.sync_mode, attr.sync.done);
|
if (attr.mode == RK_AIQ_CCM_MODE_MANUAL){
|
printf("\t mode = Manual\n");
|
} else if (attr.mode == RK_AIQ_CCM_MODE_AUTO){
|
printf("\t mode = Auto\n");
|
} else {
|
printf("\t mode is invalid!");
|
}
|
return 0;
|
}
|
|
static int sample_ccm_setMCcm(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
rk_aiq_ccm_attrib_t attr;
|
memset(&attr,0,sizeof(rk_aiq_ccm_attrib_t));
|
//get
|
ret = rk_aiq_user_api2_accm_GetAttrib(ctx, &attr);
|
RKAIQ_SAMPLE_CHECK_RET(ret, "setMCcm failed in getting accm attrib!");
|
//modify
|
attr.sync.sync_mode = sync;
|
attr.mode = RK_AIQ_CCM_MODE_MANUAL;
|
if (attr.stManual.ccOffsets[0] < 1000) {
|
attr.stManual.ccOffsets[0] = 1000;
|
attr.stManual.ccOffsets[1] = 0;
|
attr.stManual.ccOffsets[2] = 0;
|
} else {
|
attr.stManual.ccOffsets[0] = 0;
|
attr.stManual.ccOffsets[1] = 0;
|
attr.stManual.ccOffsets[2] = 1000;
|
}
|
|
//set
|
ret = rk_aiq_user_api2_accm_SetAttrib(ctx, attr);
|
RKAIQ_SAMPLE_CHECK_RET(ret, "set Manual attr failed!");
|
printf("set Manual attr\n\n");
|
|
return 0;
|
}
|
|
static int sample_ccm_setACcm(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
rk_aiq_ccm_attrib_t attr;
|
memset(&attr,0,sizeof(rk_aiq_ccm_attrib_t));
|
//get
|
ret = rk_aiq_user_api2_accm_GetAttrib(ctx, &attr);
|
RKAIQ_SAMPLE_CHECK_RET(ret, "setACcm failed in getting accm attrib!");
|
//modify
|
attr.sync.sync_mode = sync;
|
attr.mode = RK_AIQ_CCM_MODE_AUTO;
|
if (attr.stAuto.color_saturation.level[0] == 100) {
|
for (int i = 0; i < 4; i++)
|
attr.stAuto.color_saturation.level[i] = 50;
|
} else {
|
for (int i = 0; i < 4; i++)
|
attr.stAuto.color_saturation.level[i] = 100;
|
}
|
//set
|
ret = rk_aiq_user_api2_accm_SetAttrib(ctx, attr);
|
RKAIQ_SAMPLE_CHECK_RET(ret, "set Auto attr failed!");
|
printf("set Auto attr\n\n");
|
|
return 0;
|
}
|
|
static int sample_query_ccm_info(const rk_aiq_sys_ctx_t* ctx)
|
{
|
rk_aiq_ccm_querry_info_t info;
|
rk_aiq_user_api2_accm_QueryCcmInfo(ctx, &info);
|
printf("Query CCM Info:\n\n");
|
printf("\t enable: %s, \n", (info.ccm_en ? "true" : "false"));
|
printf("\t matrix: ");
|
for (int j = 0; j < 9; j++)
|
printf("%f ", info.ccMatrix[j]);
|
printf("\n");
|
printf("\t offs: %f, %f, %f \n", info.ccOffsets[0], info.ccOffsets[1], info.ccOffsets[2]);
|
printf("\t alp_y: ");
|
for (int j = 0; j < 17; j++)
|
printf("%f ", info.y_alpha_curve[j]);
|
printf("\n");
|
printf("\t low bound bit: %f \n", info.low_bound_pos_bit);
|
printf("\t color inhibition level: %f, color saturation level: %f \n",
|
info.color_inhibition_level, info.color_saturation_level);
|
printf("\t finalSat: %f \n", info.finalSat);
|
printf("\t ccmname1: %s, ccmname2: %s \n", info.ccmname1, info.ccmname2);
|
return 0;
|
}
|
|
XCamReturn sample_accm_module(const void *arg)
|
{
|
int key = -1;
|
CLEAR();
|
const demo_context_t *demo_ctx = (demo_context_t *)arg;
|
const rk_aiq_sys_ctx_t* ctx;
|
if (demo_ctx->camGroup){
|
ctx = (rk_aiq_sys_ctx_t*)(demo_ctx->camgroup_ctx);
|
} else {
|
ctx = (rk_aiq_sys_ctx_t*)(demo_ctx->aiq_ctx);
|
}
|
|
/*TODO: when rkaiq_3A_server & rkisp_demo run in two different shell, rk_aiq_sys_ctx_t would be null?*/
|
if (ctx == NULL) {
|
ERR ("%s, ctx is nullptr\n", __FUNCTION__);
|
return XCAM_RETURN_ERROR_PARAM;
|
}
|
|
sample_accm_usage ();
|
|
do {
|
|
key = getchar ();
|
while (key == '\n' || key == '\r')
|
key = getchar();
|
printf ("\n");
|
|
switch (key)
|
{
|
case 'h':
|
CLEAR();
|
sample_accm_usage ();
|
break;
|
case '0':
|
sample_set_ccm_manual(ctx);
|
printf("Set CCM MANUAL Mode\n\n");
|
break;
|
case '1':
|
sample_set_ccm_auto(ctx);
|
printf("Set CCM AUTO Mode\n\n");
|
break;
|
case '2':
|
sample_get_ccm_mode(ctx);
|
break;
|
case '3':
|
sample_set_ccm_manual_matrix(ctx);
|
printf("Set CCM Manual Matrix\n\n");
|
break;
|
case '4':
|
sample_get_ccm_manual_matrix(ctx);
|
break;
|
case '5':
|
sample_get_accm_sat(ctx);
|
break;
|
case '6':
|
sample_get_accm_matrix_name(ctx);
|
break;
|
case 'a':
|
sample_ccm_setCcmAttr(ctx, RK_AIQ_UAPI_MODE_DEFAULT);
|
sample_ccm_getCcmAttr(ctx);
|
break;
|
case 'b':
|
sample_ccm_setCcmAttr(ctx, RK_AIQ_UAPI_MODE_ASYNC);
|
sample_ccm_getCcmAttr(ctx);
|
usleep(40*1000);
|
sample_ccm_getCcmAttr(ctx);
|
break;
|
case 'c':
|
sample_ccm_setModeManual(ctx, RK_AIQ_UAPI_MODE_DEFAULT);
|
sample_ccm_getMode(ctx);
|
break;
|
case 'd':
|
sample_ccm_setModeManual(ctx, RK_AIQ_UAPI_MODE_ASYNC);
|
sample_ccm_getMode(ctx);
|
usleep(40*1000);
|
sample_ccm_getMode(ctx);
|
break;
|
case 'e':
|
sample_ccm_setModeAuto(ctx, RK_AIQ_UAPI_MODE_DEFAULT);
|
sample_ccm_getMode(ctx);
|
break;
|
case 'f':
|
sample_ccm_setModeAuto(ctx, RK_AIQ_UAPI_MODE_ASYNC);
|
sample_ccm_getMode(ctx);
|
usleep(40*1000);
|
sample_ccm_getMode(ctx);
|
break;
|
case 'g':
|
sample_ccm_setMCcm(ctx, RK_AIQ_UAPI_MODE_DEFAULT);
|
sample_ccm_getCcmAttr(ctx);
|
break;
|
case 'i':
|
sample_ccm_setMCcm(ctx, RK_AIQ_UAPI_MODE_ASYNC);
|
sample_ccm_getCcmAttr(ctx);
|
usleep(40*1000);
|
sample_ccm_getCcmAttr(ctx);
|
break;
|
case 'j':
|
sample_ccm_setACcm(ctx, RK_AIQ_UAPI_MODE_DEFAULT);
|
sample_ccm_getCcmAttr(ctx);
|
break;
|
case 'k':
|
sample_ccm_setACcm(ctx, RK_AIQ_UAPI_MODE_ASYNC);
|
sample_ccm_getCcmAttr(ctx);
|
usleep(40*1000);
|
sample_ccm_getCcmAttr(ctx);
|
break;
|
case 'l':
|
sample_query_ccm_info(ctx);
|
break;
|
default:
|
break;
|
}
|
} while (key != 'q' && key != 'Q');
|
|
return XCAM_RETURN_NO_ERROR;
|
}
|