Files
2026-08-24 10:03:24 +08:00

442 lines
15 KiB
C++

/*
* Copyright (c) 2014 Amlogic, Inc. All rights reserved.
*
* This source code is subject to the terms and conditions defined in the
* file 'LICENSE' which is part of this source code package.
*
* Description: header file
*/
#define LOG_MODULE_TAG "PQ"
#define LOG_CLASS_TAG "COverScandb"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <errno.h>
#include "CPQLog.h"
#include "COverScandb.h"
#define OVERSCAN_DB_CODE_VERSION 20201211
typedef enum overscan_db_version_e {
OVERSCAN_DB_CODE_VERSION_0 = 20191113,
OVERSCAN_DB_CODE_VERSION_1 = 20201029, //split hdr10/hdr10plus/hlg/dv
OVERSCAN_DB_CODE_VERSION_2 = 20201211, //add picture mode 5
} overscan_db_version_t;
#define OVERSCAN_DB_GENERALPICTUREMODE_TABLE_NAME "GeneralPictureMode5Table"
COverScandb::COverScandb()
{
mOverScanDbVersion = OVERSCAN_DB_CODE_VERSION_0;
}
COverScandb::~COverScandb()
{
}
int COverScandb::openOverScanDB(const char *db_path)
{
LOGD("%s: path = %s\n", __FUNCTION__, db_path);
int rval;
if (access(db_path, 0) < 0) {
LOGE("OVERSCAN_DB don't exist!\n");
return -1;
}
closeDb();
rval = openDb(db_path);
if (rval == 0) {
std::string OverScanDBToolVersion, OverScanDBdbversion, OverScanDBGenerateTime, OverScanDBProjectVersion, val;
if (GetOverScanDbVersion(OverScanDBToolVersion, OverScanDBProjectVersion, OverScanDBdbversion, OverScanDBGenerateTime)) {
val = OverScanDBToolVersion + " " + OverScanDBProjectVersion + " " + OverScanDBdbversion+ " " + OverScanDBGenerateTime;
if (OverScanDBdbversion.length() == 0) {
if (OverScanDBProjectVersion.length() == 0) {
mOverScanDbVersion = OVERSCAN_DB_CODE_VERSION_0;
} else {
mOverScanDbVersion = atoi(OverScanDBProjectVersion.c_str());
}
} else {
mOverScanDbVersion = atoi(OverScanDBdbversion.c_str());
}
} else {
val = "Get OverScan_DB Verion failure";
}
LOGD("%s = %s\n", "OverScan.db.version", val.c_str());
LOGD("overscan code version:%d db version:%d\n", OVERSCAN_DB_CODE_VERSION, mOverScanDbVersion);
}
return rval;
}
bool COverScandb::GetOverScanDbVersion(std::string& ToolVersion, std::string& ProjectVersion, std::string& dbversion, std::string& GenerateTime)
{
bool ret = false;
CSqlite::Cursor c;
char sqlmaster[256];
bool dbversionExist = false;
if (CheckIdExistInDb("dbversion", "PQ_VersionTable")) {
dbversionExist = true;
getSqlParams(__FUNCTION__, sqlmaster,
"select ToolVersion,ProjectVersion,dbversion,GenerateTime from PQ_VersionTable;");
} else {
dbversionExist = false;
getSqlParams(__FUNCTION__, sqlmaster,
"select ToolVersion,ProjectVersion,GenerateTime from PQ_VersionTable;");
}
int rval = this->select(sqlmaster, c);
if (!rval && c.getCount() > 0) {
ToolVersion = c.getString(0);
ProjectVersion = c.getString(1);
if (dbversionExist) {
dbversion = c.getString(2);
GenerateTime = c.getString(3);
} else {
GenerateTime = c.getString(2);
dbversion = std::string("");
}
ret = true;
}
return ret;
}
void COverScandb::PQ_GetOverscanTableName(vpp_display_mode_t dmode, char *table_name, int size)
{
memset(table_name, 0, size);
switch ( dmode ) {
case VPP_DISPLAY_MODE_169 :
strcpy(table_name, "OVERSCAN_16_9");
break;
case VPP_DISPLAY_MODE_PERSON :
strcpy(table_name, "OVERSCAN_PERSON");
break;
case VPP_DISPLAY_MODE_MOVIE :
strcpy(table_name, "OVERSCAN_MOVIE");
break;
case VPP_DISPLAY_MODE_CAPTION :
strcpy(table_name, "OVERSCAN_CAPTION");
break;
case VPP_DISPLAY_MODE_MODE43 :
strcpy(table_name, "OVERSCAN_4_3");
break;
case VPP_DISPLAY_MODE_FULL :
strcpy(table_name, "OVERSCAN_FULL");
break;
case VPP_DISPLAY_MODE_NORMAL :
strcpy(table_name, "OVERSCAN_NORMAL");
break;
case VPP_DISPLAY_MODE_NOSCALEUP :
strcpy(table_name, "OVERSCAN_NOSCALEUP");
break;
case VPP_DISPLAY_MODE_CROP_FULL :
strcpy(table_name, "OVERSCAN_CROP_FULL");
break;
case VPP_DISPLAY_MODE_CROP :
strcpy(table_name, "OVERSCAN_CROP");
break;
case VPP_DISPLAY_MODE_ZOOM :
strcpy(table_name, "OVERSCAN_ZOOM");
break;
case VPP_DISPLAY_MODE_MAX :
default :
strcpy(table_name, "OVERSCAN_NORMAL");
break;
}
}
int COverScandb::PQ_GetOverscanParams(source_input_param_t source_input_param, vpp_display_mode_t dmode, tvin_cutwin_t *cutwin_t)
{
CSqlite::Cursor c;
char sqlmaster[256];
int rval = -1;
char table_name[30];
tv_source_input_t source_input = source_input_param.source_input;
enum tvin_sig_fmt_e fmt = source_input_param.sig_fmt;
enum tvin_trans_fmt trans_fmt = source_input_param.trans_fmt;
PQ_GetOverscanTableName(dmode, table_name, sizeof(table_name));
LOGD ("%s table_name %s\n", __FUNCTION__, table_name);
memset(cutwin_t, 0, sizeof(tvin_cutwin_t));
getSqlParams(__FUNCTION__, sqlmaster, "select hs, he, vs, ve from %s where "
"TVIN_PORT = %d and "
"TVIN_SIG_FMT = %d and "
"TVIN_TRANS_FMT = %d ;", table_name, source_input, fmt, trans_fmt);
rval = this->select(sqlmaster, c);
if (c.getCount() <= 0) {
fmt = TVIN_SIG_FMT_NULL;
c.close();
LOGD ("%s - Load default.\n", __FUNCTION__);
getSqlParams(__FUNCTION__, sqlmaster, "select hs, he, vs, ve from %s where "
"TVIN_PORT = %d and "
"TVIN_SIG_FMT = %d and "
"TVIN_TRANS_FMT = %d ;", table_name, source_input, fmt, trans_fmt);
this->select(sqlmaster, c);
}
if (c.moveToFirst()) {
cutwin_t->hs = c.getInt(0);
cutwin_t->he = c.getInt(1);
cutwin_t->vs = c.getInt(2);
cutwin_t->ve = c.getInt(3);
}
return rval;
}
int COverScandb::PQ_SetOverscanParams(source_input_param_t source_input_param , vpp_display_mode_t dmode, tvin_cutwin_t cutwin_t)
{
CSqlite::Cursor c;
char sqlmaster[256];
char table_name[30];
int rval = -1;
tv_source_input_t source_input = source_input_param.source_input;
enum tvin_sig_fmt_e fmt = source_input_param.sig_fmt;
enum tvin_trans_fmt trans_fmt = source_input_param.trans_fmt;
PQ_GetOverscanTableName(dmode, table_name, sizeof(table_name));
LOGD ("%s table_name %s\n", __FUNCTION__, table_name);
getSqlParams(__FUNCTION__, sqlmaster,
"select * from %s where TVIN_PORT = %d and TVIN_SIG_FMT = %d and TVIN_TRANS_FMT = %d;",
table_name, source_input, fmt, trans_fmt);
rval = this->select(sqlmaster, c);
if (c.getCount() <= 0) {
fmt = TVIN_SIG_FMT_NULL;
c.close();
LOGE ("%s - Load default.\n", __FUNCTION__);
getSqlParams(__FUNCTION__, sqlmaster,
"select * from %s where TVIN_PORT = %d and TVIN_SIG_FMT = %d and TVIN_TRANS_FMT = %d;",
table_name, source_input, fmt, trans_fmt);
this->select(sqlmaster, c);
}
if (c.moveToFirst()) {
getSqlParams(__FUNCTION__, sqlmaster,
"update %s set hs = %d, he = %d, vs = %d, ve = %d where TVIN_PORT = %d and TVIN_SIG_FMT = %d and TVIN_TRANS_FMT = %d;",
table_name, cutwin_t.hs, cutwin_t.he, cutwin_t.vs, cutwin_t.ve, source_input, fmt, trans_fmt);
} else {
getSqlParams(__FUNCTION__, sqlmaster,
"Insert into %s(TVIN_PORT, TVIN_SIG_FMT, TVIN_TRANS_FMT, hs, he, vs, ve) values(%d, %d, %d ,%d ,%d, %d, %d);",
table_name, source_input, fmt, trans_fmt, cutwin_t.hs, cutwin_t.he, cutwin_t.vs, cutwin_t.ve);
}
if (this->exeSql(sqlmaster)) {
rval = 0;
} else {
LOGE("%s--SQL error!\n",__FUNCTION__);
rval = -1;
}
return rval;
}
int COverScandb::PQ_ResetAllOverscanParams(void)
{
int rval;
char sqlmaster[256];
getSqlParams(
__FUNCTION__,
sqlmaster,
"delete from OVERSCAN; insert into OVERSCAN(TVIN_PORT, TVIN_SIG_FMT, TVIN_TRANS_FMT, hs, he, vs, ve) select TVIN_PORT, TVIN_SIG_FMT, TVIN_TRANS_FMT, hs, he, vs, ve from OVERSCAN_default;");
if (this->exeSql(sqlmaster)) {
rval = 0;
} else {
LOGE("%s--SQL error!\n",__FUNCTION__);
rval = -1;
}
return rval;
}
std::string COverScandb::GetTableName(const char *GeneralTableName, source_input_param_t source_input_param)
{
CSqlite::Cursor c;
char sqlmaster[256];
int ret = -1;
if (mOverScanDbVersion < OVERSCAN_DB_CODE_VERSION_1) {
//for hdr case
if (strcmp(GeneralTableName, OVERSCAN_DB_GENERALPICTUREMODE_TABLE_NAME) == 0) {
if ((mHdrType == HDRTYPE_HDR10) ||
(mHdrType == HDRTYPE_HDR10PLUS) ||
(mHdrType == HDRTYPE_HLG) ||
(mHdrType == HDRTYPE_DOVI)) {
source_input_param.sig_fmt = TVIN_SIG_FMT_HDMI_HDR;
} else {
LOGD("%s: SDR source\n", __FUNCTION__);
}
}
} else if (mOverScanDbVersion >= OVERSCAN_DB_CODE_VERSION_1) {
//for hdr10/hdr10plus/hlg/dolby vision
#if 0 //cdy
if (mHdrType == HDRTYPE_HDR10) {
source_input_param.sig_fmt = TVIN_SIG_FMT_HDMI_HDR10;
} else if (mHdrType == HDRTYPE_HDR10PLUS) {
source_input_param.sig_fmt = TVIN_SIG_FMT_HDMI_HDR10PLUS;
} else if (mHdrType == HDRTYPE_HLG) {
source_input_param.sig_fmt = TVIN_SIG_FMT_HDMI_HLG;
} else if (mHdrType == HDRTYPE_DOVI) {
source_input_param.sig_fmt = TVIN_SIG_FMT_HDMI_DOLBY;
} else {
LOGD("%s: SDR source\n", __FUNCTION__);
}
#endif
}
getSqlParams(__FUNCTION__, sqlmaster, "select TableName from %s where "
"TVIN_PORT = %d and "
"TVIN_SIG_FMT = %d and "
"TVIN_TRANS_FMT = %d and "
"TVOUT_CVBS = %d ;", GeneralTableName, source_input_param.source_input,
source_input_param.sig_fmt, source_input_param.trans_fmt, OUTPUT_TYPE_LVDS);
ret = this->select(sqlmaster, c);
if (ret == 0) {
if (c.moveToFirst()) {
LOGD("table name is %s\n", c.getString(0).c_str());
return c.getString(0);
} else {
LOGE("%s don't have this table\n", GeneralTableName);
return std::string("");
}
} else {
LOGE("%s error!\n", __FUNCTION__);
return std::string("");
}
}
int COverScandb::PQ_GetPQModeParams(tv_source_input_t source_input, vpp_picture_mode_t pq_mode,
vpp_pq_para_t *params)
{
CSqlite::Cursor c;
char sqlmaster[256];
int rval = -1;
getSqlParams(__FUNCTION__, sqlmaster,
"select Brightness, Contrast, Saturation, Hue, Sharpness, Backlight, NR from Picture_Mode where "
"TVIN_PORT = %d and "
"Mode = %d ;", source_input, pq_mode);
rval = this->select(sqlmaster, c);
if (c.moveToFirst()) {
params->brightness = c.getInt(0);
params->contrast = c.getInt(1);
params->saturation = c.getInt(2);
params->hue = c.getInt(3);
params->sharpness = c.getInt(4);
params->backlight = c.getInt(5);
params->nr = c.getInt(6);
} else {
LOGE("%s error!\n",__FUNCTION__);
rval = -1;
}
return rval;
}
int COverScandb::PQ_SetPQModeParams(tv_source_input_t source_input, vpp_picture_mode_t pq_mode, vpp_pq_para_t *params)
{
int rval;
char sql[256];
getSqlParams(__FUNCTION__, sql,
"update Picture_Mode set Brightness = %d, Contrast = %d, Saturation = %d, Hue = %d, Sharpness = %d, Backlight = %d, NR= %d "
" where TVIN_PORT = %d and Mode = %d;", params->brightness, params->contrast,
params->saturation, params->hue, params->sharpness, params->backlight, params->nr,
source_input, pq_mode);
if (this->exeSql(sql)) {
rval = 0;
} else {
LOGE("%s--SQL error!\n",__FUNCTION__);
rval = -1;
}
return rval;
}
int COverScandb::PQ_SetPQModeParamsByName(const char *name, tv_source_input_t source_input,
vpp_picture_mode_t pq_mode, vpp_pq_para_t *params)
{
int rval;
char sql[256];
getSqlParams(__FUNCTION__, sql,
"insert into %s(TVIN_PORT, Mode, Brightness, Contrast, Saturation, Hue, Sharpness, Backlight, NR)"
" values(%d,%d,%d,%d,%d,%d,%d,%d,%d);", name, source_input, pq_mode,
params->brightness, params->contrast, params->saturation, params->hue,
params->sharpness, params->backlight, params->nr);
if (this->exeSql(sql)) {
rval = 0;
} else {
LOGE("%s--SQL error!\n",__FUNCTION__);
rval = -1;
}
return rval;
}
int COverScandb::PQ_ResetAllPQModeParams(void)
{
int rval = -1;
char sqlmaster[256];
if (mOverScanDbVersion < OVERSCAN_DB_CODE_VERSION_2) {
getSqlParams(
__FUNCTION__,
sqlmaster,
"delete from Picture_Mode; insert into Picture_Mode(TVIN_PORT, Mode, Brightness, Contrast, Saturation, Hue, Sharpness, Backlight, NR) select TVIN_PORT, Mode, Brightness, Contrast, Saturation, Hue, Sharpness, Backlight, NR from picture_mode_default;");
if (this->exeSql(sqlmaster)) {
rval = 0;
} else {
LOGE("%s exeSql error\n",__FUNCTION__);
rval = -1;
}
} else {
LOGE("%s %d error\n", __FUNCTION__, mOverScanDbVersion);
}
return rval;
}
bool COverScandb::CheckIdExistInDb(const char *Id, const char *TableName)
{
bool ret = false;
char sqlmaster[256];
CSqlite::Cursor tempCursor;
getSqlParams(__FUNCTION__, sqlmaster,
"select sql from sqlite_master where type = 'table' and tbl_name = '%s';", TableName);
int retVal = this->select(sqlmaster, tempCursor);
if ((retVal == 0) && (tempCursor.moveToFirst())) {
if (strstr(tempCursor.getString(0).c_str(), Id) != NULL) {
ret = true;
} else {
ret = false;
}
} else {
LOGE("%s: error!\n", __FUNCTION__);
ret = false;
}
return ret;
}