334 lines
6.3 KiB
C++
Executable File
334 lines
6.3 KiB
C++
Executable File
/*
|
|
* 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.
|
|
*/
|
|
|
|
#include "C2RKChipFeaturesDef.h"
|
|
#include "C2RKLog.h"
|
|
#include "C2RKEnv.h"
|
|
|
|
#include <string.h>
|
|
|
|
static C2FbcCaps fbcCaps_rk356x[] = {
|
|
{ MPP_VIDEO_CodingAVC, RT_COMPRESS_AFBC_16x16, 0, 4 },
|
|
{ MPP_VIDEO_CodingHEVC, RT_COMPRESS_AFBC_16x16, 0, 4 },
|
|
{ MPP_VIDEO_CodingVP9, RT_COMPRESS_AFBC_16x16, 0, 0 },
|
|
};
|
|
|
|
static C2FbcCaps fbcCaps_rk3588[] = {
|
|
{ MPP_VIDEO_CodingAVC, RT_COMPRESS_AFBC_16x16, 0, 4 },
|
|
{ MPP_VIDEO_CodingHEVC, RT_COMPRESS_AFBC_16x16, 0, 4 },
|
|
{ MPP_VIDEO_CodingVP9, RT_COMPRESS_AFBC_16x16, 0, 0 },
|
|
};
|
|
|
|
static const C2ChipFeatures FeatrueInfos[] = {
|
|
{
|
|
"unkown", // chipName
|
|
RK_CHIP_UNKOWN, // chipType
|
|
0, // fbcCapNum
|
|
NULL, // fbcCaps
|
|
0, // scaleMetaCap
|
|
0, // reserved
|
|
},
|
|
{
|
|
"rk2928",
|
|
RK_CHIP_2928,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3036",
|
|
RK_CHIP_3036,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3066",
|
|
RK_CHIP_3066,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3188",
|
|
RK_CHIP_3188,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk312x",
|
|
RK_CHIP_312X,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
/* 3128h first for string matching */
|
|
{
|
|
"rk3128h",
|
|
RK_CHIP_3128H,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3128m",
|
|
RK_CHIP_3128M,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3128",
|
|
RK_CHIP_312X,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3126",
|
|
RK_CHIP_312X,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3288",
|
|
RK_CHIP_3288,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3228a",
|
|
RK_CHIP_3228A,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3228b",
|
|
RK_CHIP_3228B,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk322x",
|
|
RK_CHIP_3229,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3229",
|
|
RK_CHIP_3229,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3228h",
|
|
RK_CHIP_3228H,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3328",
|
|
RK_CHIP_3328,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3399",
|
|
RK_CHIP_3399,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3368a",
|
|
RK_CHIP_3368A,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3368h",
|
|
RK_CHIP_3368H,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3368",
|
|
RK_CHIP_3368,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3326",
|
|
RK_CHIP_3326,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"px30",
|
|
RK_CHIP_3326,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3566",
|
|
RK_CHIP_3566,
|
|
3,
|
|
fbcCaps_rk356x,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3568",
|
|
RK_CHIP_3568,
|
|
3,
|
|
fbcCaps_rk356x,
|
|
0,
|
|
0,
|
|
},
|
|
{
|
|
"rk3528",
|
|
RK_CHIP_3528,
|
|
3,
|
|
fbcCaps_rk3588,
|
|
1,
|
|
0,
|
|
},
|
|
{
|
|
"rk3588",
|
|
RK_CHIP_3588,
|
|
3,
|
|
fbcCaps_rk3588,
|
|
0,
|
|
0,
|
|
}
|
|
};
|
|
|
|
static const int C2ChipFeatureSize = sizeof(FeatrueInfos) / sizeof((FeatrueInfos)[0]);
|
|
|
|
int C2RKChipFeaturesDef::getFbcOutputMode(MppCodingType codecId) {
|
|
RKChipInfo *chipInfo = getChipName();
|
|
|
|
if (chipInfo == NULL)
|
|
return 0;
|
|
|
|
uint32_t value;
|
|
Rockchip_C2_GetEnvU32("codec2_fbc_disable", &value, 0);
|
|
if (value == 1) {
|
|
c2_info("property match, disable fbc output mode");
|
|
return 0;
|
|
}
|
|
|
|
int i, j;
|
|
int fbcMode = 0;
|
|
for (i = 0; i < C2ChipFeatureSize; i++) {
|
|
C2ChipFeatures featureInfo = FeatrueInfos[i];
|
|
|
|
if (strstr(chipInfo->name, featureInfo.chipName)) {
|
|
for (j = 0; j < featureInfo.fbcCapNum; j++) {
|
|
if (featureInfo.fbcCaps[j].codecId == codecId
|
|
&& featureInfo.fbcCaps[j].fbcMode != 0) {
|
|
fbcMode = featureInfo.fbcCaps[j].fbcMode;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
c2_info("[%s] codec-0x%08x fbc_support_result-%d", chipInfo->name, codecId, fbcMode);
|
|
|
|
return fbcMode;
|
|
}
|
|
|
|
void C2RKChipFeaturesDef::getFbcOutputOffset(
|
|
MppCodingType codecId, uint32_t *offsetX, uint32_t *offsetY) {
|
|
*offsetX = *offsetY = 0;
|
|
if (getFbcOutputMode(codecId) == 0) {
|
|
return;
|
|
}
|
|
|
|
RKChipInfo *chipInfo = getChipName();
|
|
|
|
int i, j;
|
|
for (i = 0; i < C2ChipFeatureSize; i++) {
|
|
C2ChipFeatures featureInfo = FeatrueInfos[i];
|
|
|
|
if (strstr(chipInfo->name, featureInfo.chipName)) {
|
|
for (j = 0; j < featureInfo.fbcCapNum; j++) {
|
|
if (featureInfo.fbcCaps[j].codecId == codecId) {
|
|
*offsetX = featureInfo.fbcCaps[j].offsetX;
|
|
*offsetY = featureInfo.fbcCaps[j].offsetY;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
uint32_t C2RKChipFeaturesDef::getScaleMetaCap() {
|
|
RKChipInfo *chipInfo = getChipName();
|
|
|
|
if (chipInfo == NULL)
|
|
return 0;
|
|
|
|
int scaleCap = 0;
|
|
for (int i = 0; i < C2ChipFeatureSize; i++) {
|
|
C2ChipFeatures featureInfo = FeatrueInfos[i];
|
|
|
|
if (strstr(chipInfo->name, featureInfo.chipName)) {
|
|
scaleCap = featureInfo.scaleMetaCap;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return scaleCap;
|
|
}
|