/* * 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_a3dlut_usage() { printf("Usage : \n"); printf(" ImgProc API: \n"); printf("\t 0) 3DLUT: Set 3DLUT MANUAL Mode.\n"); printf("\t 1) 3DLUT: Set 3DLUT AUTO Mode.\n"); printf("\t 2) 3DLUT: Get 3DLUT Mode.\n"); printf("\t 3) 3DLUT: Set 3DLUT Manual Lut.\n"); printf("\t 4) 3DLUT: Get 3DLUT Lut.\n"); printf("\t 5) 3DLUT: Get A3DLUT Strength.\n"); printf("\t 6) 3DLUT: Get A3DLUT LutName.\n"); printf(" Module API: \n"); printf("\t a) 3DLUT: Set 3dlut Attr & Sync .\n"); printf("\t b) 3DLUT: Set 3dlut Attr & Async .\n"); printf("\t c) 3DLUT: Set Mode Manual & Sync.\n"); printf("\t d) 3DLUT: Set Mode Manual & Async.\n"); printf("\t e) 3DLUT: Set Mode Auto & Sync.\n"); printf("\t f) 3DLUT: Set Mode Auto & Async.\n"); printf("\t g) 3DLUT: Set Manual attr & Sync.\n"); printf("\t i) 3DLUT: Set Manual attr & Async.\n"); printf("\t j) 3DLUT: Query A3DLUT Info.\n"); printf("\n"); printf("\t h) 3DLUT: help.\n"); printf("\t q) 3DLUT: return to main sample screen.\n"); printf("\n"); printf("\t please press the key: "); return; } void sample_print_a3dlut_info(const void *arg) { printf ("enter 3DLUT modult test!\n"); } /* ****************************** * * ImgProc level API Sample Func * ****************************** */ static int sample_set_a3dlut_manual(const rk_aiq_sys_ctx_t* ctx) { opMode_t mode = OP_MANUAL; rk_aiq_uapi2_setLut3dMode(ctx, mode); return 0; } static int sample_set_a3dlut_auto(const rk_aiq_sys_ctx_t* ctx) { opMode_t mode = OP_AUTO; rk_aiq_uapi2_setLut3dMode(ctx, mode); return 0; } static int sample_get_a3dlut_mode(const rk_aiq_sys_ctx_t* ctx) { opMode_t mode; rk_aiq_uapi2_getLut3dMode(ctx, &mode); if (mode == OP_MANUAL) printf("Get 3DLUT Mode is: Manual \n"); else if (mode == OP_AUTO) printf("Get 3DLUT Mode is: AUTO\n"); else printf("Get 3DLUT Mode is: INVALID\n"); return 0; } static int sample_set_a3dlut_manual_lut(const rk_aiq_sys_ctx_t* ctx) { rk_aiq_lut3d_table_t mlut; memset(&mlut, 0, sizeof(mlut)); // create mlut rk_aiq_uapi2_getM3dLut(ctx, &mlut); memcpy(mlut.look_up_table_b, mlut.look_up_table_r, sizeof(unsigned short) * 729); for(int i = 0; i < 729; i++) mlut.look_up_table_g[i] = mlut.look_up_table_r[i]<<2; // set mlut rk_aiq_uapi2_setM3dLut(ctx, &mlut); printf("Set 3DLUT Manual Lut\n\n"); return 0; } static int sample_get_a3dlut_lut(const rk_aiq_sys_ctx_t* ctx) { rk_aiq_lut3d_table_t mlut; rk_aiq_uapi2_getM3dLut(ctx, &mlut); printf("Get 3DLUT Lut: "); printf("\t r: %d, %d, %d \n", mlut.look_up_table_r[0], mlut.look_up_table_r[1], mlut.look_up_table_r[2]); printf("\t g: %d, %d, %d \n", mlut.look_up_table_g[0], mlut.look_up_table_g[1], mlut.look_up_table_g[2]); printf("\t b: %d, %d, %d \n", mlut.look_up_table_b[0], mlut.look_up_table_b[1], mlut.look_up_table_b[2]); return 0; } static int sample_get_a3dlut_strength(const rk_aiq_sys_ctx_t* ctx) { float alpha; rk_aiq_uapi2_getA3dLutStrth(ctx, &alpha); printf("Get A3DLUT Strength: %f\n\n", alpha); return 0; } static int sample_get_a3dlut_lutname(const rk_aiq_sys_ctx_t* ctx) { char lutname[25]; rk_aiq_uapi2_getA3dLutName(ctx, lutname); printf("Get A3DLUT LutName: %s\n\n", lutname); return 0; } /* ****************************** * * Module level API Sample Func * ****************************** */ static int sample_3dlut_set3dlutAttr(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; rk_aiq_lut3d_attrib_t attr; memset(&attr,0,sizeof(rk_aiq_lut3d_attrib_t)); //get ret = rk_aiq_user_api2_a3dlut_GetAttrib(ctx, &attr); RKAIQ_SAMPLE_CHECK_RET(ret, "set3dlutAttr failed in getting a3dlut attrib!"); //modify attr.sync.sync_mode = sync; if (attr.mode > 1 ) { attr.mode = RK_AIQ_LUT3D_MODE_MANUAL; memset(attr.stManual.look_up_table_g, 0, 729*sizeof(unsigned short)); } else { attr.mode = RK_AIQ_LUT3D_MODE_AUTO; } //set ret = rk_aiq_user_api2_a3dlut_SetAttrib(ctx, attr); RKAIQ_SAMPLE_CHECK_RET(ret, "set 3DLUT Attr failed!"); printf("set 3DLUT Attr\n\n"); return 0; } static int sample_3dlut_get3dlutAttr(const rk_aiq_sys_ctx_t* ctx) { XCamReturn ret = XCAM_RETURN_NO_ERROR; rk_aiq_lut3d_attrib_t attr; memset(&attr,0,sizeof(rk_aiq_lut3d_attrib_t)); //get ret = rk_aiq_user_api2_a3dlut_GetAttrib(ctx, &attr); RKAIQ_SAMPLE_CHECK_RET(ret, "get 3dlut Attr failed!"); printf("get 3DLUT 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_LUT3D_MODE_MANUAL){ printf("\t mode = Manual\n"); printf("\t manual lut"); printf("\t\t r: %d, %d, %d \n", attr.stManual.look_up_table_r[0], attr.stManual.look_up_table_r[1], attr.stManual.look_up_table_r[2]); printf("\t\t g: %d, %d, %d \n", attr.stManual.look_up_table_g[0], attr.stManual.look_up_table_g[1], attr.stManual.look_up_table_g[2]); printf("\t\t b: %d, %d, %d \n", attr.stManual.look_up_table_b[0], attr.stManual.look_up_table_b[1], attr.stManual.look_up_table_b[2]); } else if (attr.mode == RK_AIQ_LUT3D_MODE_AUTO){ printf("\t mode = Auto\n"); } else { printf("\t mode is invalid!"); } return 0; } static int sample_3dlut_setModeManual(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; rk_aiq_lut3d_attrib_t attr; memset(&attr,0,sizeof(rk_aiq_lut3d_attrib_t)); //get ret = rk_aiq_user_api2_a3dlut_GetAttrib(ctx, &attr); RKAIQ_SAMPLE_CHECK_RET(ret, "setModeManual failed in getting a3dlut attrib!"); //modify attr.sync.sync_mode = sync; attr.mode = RK_AIQ_LUT3D_MODE_MANUAL; //set ret = rk_aiq_user_api2_a3dlut_SetAttrib(ctx, attr); RKAIQ_SAMPLE_CHECK_RET(ret, "set Mode Manual failed!"); printf("set 3DLUT Mode Manual\n\n"); return 0; } static int sample_3dlut_setModeAuto(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; rk_aiq_lut3d_attrib_t attr; memset(&attr,0,sizeof(rk_aiq_lut3d_attrib_t)); //get ret = rk_aiq_user_api2_a3dlut_GetAttrib(ctx, &attr); RKAIQ_SAMPLE_CHECK_RET(ret, "setModeAuto failed in getting a3dlut attrib!"); //modify attr.sync.sync_mode = sync; attr.mode = RK_AIQ_LUT3D_MODE_AUTO; //set ret = rk_aiq_user_api2_a3dlut_SetAttrib(ctx, attr); RKAIQ_SAMPLE_CHECK_RET(ret, "set Mode Auto failed!"); printf("set 3DLUT Mode Auto\n\n"); return 0; } static int sample_3dlut_getMode(const rk_aiq_sys_ctx_t* ctx) { XCamReturn ret = XCAM_RETURN_NO_ERROR; rk_aiq_lut3d_attrib_t attr; memset(&attr,0,sizeof(rk_aiq_lut3d_attrib_t)); //get ret = rk_aiq_user_api2_a3dlut_GetAttrib(ctx, &attr); RKAIQ_SAMPLE_CHECK_RET(ret, "get 3dlut Mode failed!"); printf("get 3DLUT Mode:\n\n"); printf("\t sync = %d, done = %d\n", attr.sync.sync_mode, attr.sync.done); if (attr.mode == RK_AIQ_LUT3D_MODE_MANUAL){ printf("\t mode = Manual\n"); } else if (attr.mode == RK_AIQ_LUT3D_MODE_AUTO){ printf("\t mode = Auto\n"); } else { printf("\t mode is invalid!"); } return 0; } static int sample_3dlut_setM3dlut(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; rk_aiq_lut3d_attrib_t attr; memset(&attr,0,sizeof(rk_aiq_lut3d_attrib_t)); //get ret = rk_aiq_user_api2_a3dlut_GetAttrib(ctx, &attr); RKAIQ_SAMPLE_CHECK_RET(ret, "setM3dlut failed in getting a3dlut attrib!"); //modify attr.sync.sync_mode = sync; attr.mode = RK_AIQ_LUT3D_MODE_MANUAL; if (attr.stManual.look_up_table_g[2] > 0) { memset(attr.stManual.look_up_table_g, 0, 729*sizeof(unsigned short)); } else { memcpy(attr.stManual.look_up_table_g, attr.stManual.look_up_table_r, \ sizeof(attr.stManual.look_up_table_r)); } //set ret = rk_aiq_user_api2_a3dlut_SetAttrib(ctx, attr); RKAIQ_SAMPLE_CHECK_RET(ret, "set Manual attr failed!"); printf("set Manual attr\n\n"); return 0; } static int sample_query_a3dlut_info(const rk_aiq_sys_ctx_t* ctx) { rk_aiq_lut3d_querry_info_t info; rk_aiq_user_api2_a3dlut_Query3dlutInfo(ctx, &info); printf("Query 3DLUT Info:\n\n"); printf("\t enable: %s, \n", (info.lut3d_en ? "true" : "false")); printf("\t lut: "); printf("\t\t r: %d, %d, %d \n", info.look_up_table_r[0], info.look_up_table_r[1], info.look_up_table_r[2]); printf("\t\t g: %d, %d, %d \n", info.look_up_table_g[0], info.look_up_table_g[1], info.look_up_table_g[2]); printf("\t\t b: %d, %d, %d \n", info.look_up_table_b[0], info.look_up_table_b[1], info.look_up_table_b[2]); printf("\t alpha: %f \n", info.alpha); printf("\t lutname: %s \n", info.name); return 0; } XCamReturn sample_a3dlut_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_a3dlut_usage (); do { key = getchar (); while (key == '\n' || key == '\r') key = getchar(); printf ("\n"); switch (key) { case 'h': CLEAR(); sample_a3dlut_usage (); break; case '0': sample_set_a3dlut_manual(ctx); printf("Set 3DLUT MANUAL Mode\n\n"); break; case '1': sample_set_a3dlut_auto(ctx); printf("Set 3DLUT AUTO Mode\n\n"); break; case '2': sample_get_a3dlut_mode(ctx); break; case '3': sample_set_a3dlut_manual_lut(ctx); break; case '4': sample_get_a3dlut_lut(ctx); break; case '5': sample_get_a3dlut_strength(ctx); break; case '6': sample_get_a3dlut_lutname(ctx); break; case 'a': sample_3dlut_set3dlutAttr(ctx, RK_AIQ_UAPI_MODE_DEFAULT); sample_3dlut_get3dlutAttr(ctx); break; case 'b': sample_3dlut_set3dlutAttr(ctx, RK_AIQ_UAPI_MODE_ASYNC); sample_3dlut_get3dlutAttr(ctx); usleep(40*1000); sample_3dlut_get3dlutAttr(ctx); break; case 'c': sample_3dlut_setModeManual(ctx, RK_AIQ_UAPI_MODE_DEFAULT); sample_3dlut_getMode(ctx); break; case 'd': sample_3dlut_setModeManual(ctx, RK_AIQ_UAPI_MODE_ASYNC); sample_3dlut_getMode(ctx); usleep(40*1000); sample_3dlut_getMode(ctx); break; case 'e': sample_3dlut_setModeAuto(ctx, RK_AIQ_UAPI_MODE_DEFAULT); sample_3dlut_getMode(ctx); break; case 'f': sample_3dlut_setModeAuto(ctx, RK_AIQ_UAPI_MODE_ASYNC); sample_3dlut_getMode(ctx); usleep(40*1000); sample_3dlut_getMode(ctx); break; case 'g': sample_3dlut_setM3dlut(ctx, RK_AIQ_UAPI_MODE_DEFAULT); sample_3dlut_get3dlutAttr(ctx); break; break; case 'i': sample_3dlut_setM3dlut(ctx, RK_AIQ_UAPI_MODE_ASYNC); sample_3dlut_get3dlutAttr(ctx); usleep(40*1000); sample_3dlut_get3dlutAttr(ctx); break; case 'j': sample_query_a3dlut_info(ctx); break; default: break; } } while (key != 'q' && key != 'Q'); return XCAM_RETURN_NO_ERROR; }