vendor/rockchip/hardware/interfaces/codec2/component/osal/C2RKVdecExtendFeature.cpp

122 lines
3.6 KiB
C++

/*
* Copyright 2023 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.
*/
#undef ROCKCHIP_LOG_TAG
#define ROCKCHIP_LOG_TAG "C2VdecExtendFeature"
#include "C2RKVdecExtendFeature.h"
#include "C2RKLog.h"
#include "C2RKGrallocOps.h"
#include <errno.h>
#include <inttypes.h>
namespace android {
int C2RKVdecExtendFeature::configFrameHdrDynamicMeta(buffer_handle_t hnd, int64_t offset)
{
int ret = 0;
int64_t dynamicHdrOffset = offset;
ret = C2RKGrallocOps::get()->setDynamicHdrMeta(hnd, dynamicHdrOffset);
if (ret)
return ret;
return ret;
}
int C2RKVdecExtendFeature::checkNeedScale(buffer_handle_t hnd) {
int ret = 0;
int need = 0;
uint64_t bufId = 0;
uint64_t usage = 0;
metadata_for_rkvdec_scaling_t* metadata = NULL;
bufId = C2RKGrallocOps::get()->getBufferId(hnd);
usage = C2RKGrallocOps::get()->getUsage(hnd);
ret = C2RKGrallocOps::get()->mapScaleMeta(hnd, &metadata);
if (!ret) {
/*
* NOTE: After info change realloc buf, buf has not processed by hwc,
* metadata->requestMask is default value 0. So we define:
* requestMask = 1 : need scale
* requestMask = 2 : no need scale
* other : keep same as before
*/
switch (metadata->requestMask) {
case 1:
need = 1;
c2_info("bufId:0x%" PRIx64" hwc need scale", bufId);
break;
case 2:
need = 0;
c2_info("bufId:0x%" PRIx64" hwc no need scale", bufId);
break;
default:
need = -1;
break;
}
C2RKGrallocOps::get()->unmapScaleMeta(hnd);
}
return need;
}
int C2RKVdecExtendFeature::configFrameScaleMeta(
buffer_handle_t hnd, C2PreScaleParam *scaleParam) {
int ret = 0;
metadata_for_rkvdec_scaling_t* metadata = NULL;
ret = C2RKGrallocOps::get()->mapScaleMeta(hnd, &metadata);
if (!ret) {
int32_t thumbWidth = scaleParam->thumbWidth;
int32_t thumbHeight = scaleParam->thumbHeight;
int32_t thumbHorStride = scaleParam->thumbHorStride;
uint64_t usage = 0;
metadata->replyMask = 1;
/*
* NOTE: keep same with gralloc
* width = stride, crop real size
*/
metadata->width = thumbHorStride;
metadata->height = thumbHeight;
metadata->pixel_stride = thumbHorStride;
metadata->format = scaleParam->format;
// NV12 8/10 bit nfbc, modifier = 0
metadata->modifier = 0;
metadata->srcLeft = 0;
metadata->srcTop = 0;
metadata->srcRight = thumbWidth;
metadata->srcBottom = thumbHeight;
metadata->offset[0] = scaleParam->yOffset;
metadata->offset[1] = scaleParam->uvOffset;
metadata->byteStride[0] = thumbHorStride;
metadata->byteStride[1] = thumbHorStride;
usage = C2RKGrallocOps::get()->getUsage(hnd);
metadata->usage = (uint32_t)usage;
}
ret = C2RKGrallocOps::get()->unmapScaleMeta(hnd);
return ret;
}
}