11bd4fe43Sopenharmony_ci/* 21bd4fe43Sopenharmony_ci * Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED. 31bd4fe43Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 41bd4fe43Sopenharmony_ci * you may not use this file except in compliance with the License. 51bd4fe43Sopenharmony_ci * You may obtain a copy of the License at 61bd4fe43Sopenharmony_ci * 71bd4fe43Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 81bd4fe43Sopenharmony_ci * 91bd4fe43Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 101bd4fe43Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 111bd4fe43Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121bd4fe43Sopenharmony_ci * See the License for the specific language governing permissions and 131bd4fe43Sopenharmony_ci * limitations under the License. 141bd4fe43Sopenharmony_ci */ 151bd4fe43Sopenharmony_ci 161bd4fe43Sopenharmony_ci#ifndef __HI_BUFFER_H__ 171bd4fe43Sopenharmony_ci#define __HI_BUFFER_H__ 181bd4fe43Sopenharmony_ci 191bd4fe43Sopenharmony_ci#include "hi_math.h" 201bd4fe43Sopenharmony_ci#include "hi_type.h" 211bd4fe43Sopenharmony_ci#include "hi_common.h" 221bd4fe43Sopenharmony_ci#include "hi_comm_video.h" 231bd4fe43Sopenharmony_ci 241bd4fe43Sopenharmony_ci#ifdef __cplusplus 251bd4fe43Sopenharmony_ci#if __cplusplus 261bd4fe43Sopenharmony_ciextern "C" { 271bd4fe43Sopenharmony_ci#endif 281bd4fe43Sopenharmony_ci#endif /* __cplusplus */ 291bd4fe43Sopenharmony_ci 301bd4fe43Sopenharmony_ci#define HI_MAXINUM_LIMIT 100000 311bd4fe43Sopenharmony_ci 321bd4fe43Sopenharmony_ci__inline static HI_VOID COMMON_GetPicBufferConfig(HI_U32 u32Width, HI_U32 u32Height, 331bd4fe43Sopenharmony_ci PIXEL_FORMAT_E enPixelFormat, DATA_BITWIDTH_E enBitWidth, 341bd4fe43Sopenharmony_ci COMPRESS_MODE_E enCmpMode, HI_U32 u32Align, VB_CAL_CONFIG_S *pstCalConfig) 351bd4fe43Sopenharmony_ci{ 361bd4fe43Sopenharmony_ci HI_U32 u32BitWidth = 0; 371bd4fe43Sopenharmony_ci HI_U32 u32HeadStride = 0; 381bd4fe43Sopenharmony_ci HI_U32 u32VBSize = 0; 391bd4fe43Sopenharmony_ci HI_U32 u32HeadSize = 0; 401bd4fe43Sopenharmony_ci HI_U32 u32AlignHeight; 411bd4fe43Sopenharmony_ci HI_U32 u32MainStride = 0; 421bd4fe43Sopenharmony_ci HI_U32 u32MainSize = 0; 431bd4fe43Sopenharmony_ci HI_U32 u32ExtStride = 0; 441bd4fe43Sopenharmony_ci HI_U32 u32ExtSize = 0; 451bd4fe43Sopenharmony_ci HI_U32 u32ExtYSize = 0; 461bd4fe43Sopenharmony_ci HI_U32 u32HeadYSize = 0; 471bd4fe43Sopenharmony_ci HI_U32 u32YSize = 0; 481bd4fe43Sopenharmony_ci 491bd4fe43Sopenharmony_ci if ((u32Width > HI_MAXINUM_LIMIT) || (u32Height > HI_MAXINUM_LIMIT)) { 501bd4fe43Sopenharmony_ci pstCalConfig->u32VBSize = 0; 511bd4fe43Sopenharmony_ci } 521bd4fe43Sopenharmony_ci 531bd4fe43Sopenharmony_ci /* u32Align: 0 is automatic mode, alignment size following system. Non-0 for specified alignment size */ 541bd4fe43Sopenharmony_ci if (u32Align == 0) { 551bd4fe43Sopenharmony_ci u32Align = DEFAULT_ALIGN; 561bd4fe43Sopenharmony_ci } else if (u32Align > MAX_ALIGN) { 571bd4fe43Sopenharmony_ci u32Align = MAX_ALIGN; 581bd4fe43Sopenharmony_ci } else { 591bd4fe43Sopenharmony_ci u32Align = (HI_ALIGN_UP(u32Align, DEFAULT_ALIGN)); 601bd4fe43Sopenharmony_ci } 611bd4fe43Sopenharmony_ci 621bd4fe43Sopenharmony_ci switch (enBitWidth) { 631bd4fe43Sopenharmony_ci case DATA_BITWIDTH_8: { 641bd4fe43Sopenharmony_ci u32BitWidth = 8; 651bd4fe43Sopenharmony_ci break; 661bd4fe43Sopenharmony_ci } 671bd4fe43Sopenharmony_ci case DATA_BITWIDTH_16: { 681bd4fe43Sopenharmony_ci u32BitWidth = 16; 691bd4fe43Sopenharmony_ci break; 701bd4fe43Sopenharmony_ci } 711bd4fe43Sopenharmony_ci default: { 721bd4fe43Sopenharmony_ci u32BitWidth = 0; 731bd4fe43Sopenharmony_ci break; 741bd4fe43Sopenharmony_ci } 751bd4fe43Sopenharmony_ci } 761bd4fe43Sopenharmony_ci 771bd4fe43Sopenharmony_ci u32AlignHeight = HI_ALIGN_UP(u32Height, 2); 781bd4fe43Sopenharmony_ci 791bd4fe43Sopenharmony_ci if (enCmpMode == COMPRESS_MODE_NONE) { 801bd4fe43Sopenharmony_ci u32MainStride = HI_ALIGN_UP((u32Width * u32BitWidth + 7) >> 3, u32Align); 811bd4fe43Sopenharmony_ci u32YSize = u32MainStride * u32AlignHeight; 821bd4fe43Sopenharmony_ci 831bd4fe43Sopenharmony_ci if ((PIXEL_FORMAT_YVU_SEMIPLANAR_420 == enPixelFormat) || (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == enPixelFormat)) { 841bd4fe43Sopenharmony_ci u32MainSize = (u32MainStride * u32AlignHeight * 3) >> 1; 851bd4fe43Sopenharmony_ci } else if (PIXEL_FORMAT_YVU_SEMIPLANAR_422 == enPixelFormat || 861bd4fe43Sopenharmony_ci PIXEL_FORMAT_YUV_SEMIPLANAR_422 == enPixelFormat) { 871bd4fe43Sopenharmony_ci u32MainSize = u32MainStride * u32AlignHeight * 2; 881bd4fe43Sopenharmony_ci } else if ((enPixelFormat == PIXEL_FORMAT_YUV_400) || (PIXEL_FORMAT_S16C1 == enPixelFormat)) { 891bd4fe43Sopenharmony_ci u32MainSize = u32MainStride * u32AlignHeight; 901bd4fe43Sopenharmony_ci } else { 911bd4fe43Sopenharmony_ci u32MainSize = u32MainStride * u32AlignHeight * 3; 921bd4fe43Sopenharmony_ci } 931bd4fe43Sopenharmony_ci 941bd4fe43Sopenharmony_ci u32VBSize = u32MainSize; 951bd4fe43Sopenharmony_ci } else { 961bd4fe43Sopenharmony_ci if (u32Width <= 4096) { 971bd4fe43Sopenharmony_ci u32HeadStride = 16; 981bd4fe43Sopenharmony_ci } else if (u32Width <= 8192) { 991bd4fe43Sopenharmony_ci u32HeadStride = 32; 1001bd4fe43Sopenharmony_ci } else { 1011bd4fe43Sopenharmony_ci u32HeadStride = 64; 1021bd4fe43Sopenharmony_ci } 1031bd4fe43Sopenharmony_ci 1041bd4fe43Sopenharmony_ci if (u32BitWidth == 8) { 1051bd4fe43Sopenharmony_ci u32MainStride = HI_ALIGN_UP(u32Width, u32Align); 1061bd4fe43Sopenharmony_ci u32HeadYSize = u32HeadStride * u32AlignHeight; 1071bd4fe43Sopenharmony_ci u32YSize = u32MainStride * u32AlignHeight; 1081bd4fe43Sopenharmony_ci 1091bd4fe43Sopenharmony_ci if ((PIXEL_FORMAT_YVU_SEMIPLANAR_420 == enPixelFormat) || 1101bd4fe43Sopenharmony_ci (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == enPixelFormat)) { 1111bd4fe43Sopenharmony_ci u32HeadSize = (u32HeadStride * u32AlignHeight * 3) >> 1; 1121bd4fe43Sopenharmony_ci u32MainSize = (u32MainStride * u32AlignHeight * 3) >> 1; 1131bd4fe43Sopenharmony_ci } else if (PIXEL_FORMAT_YVU_SEMIPLANAR_422 == enPixelFormat || 1141bd4fe43Sopenharmony_ci PIXEL_FORMAT_YUV_SEMIPLANAR_422 == enPixelFormat) { 1151bd4fe43Sopenharmony_ci u32HeadSize = u32HeadStride * u32AlignHeight * 2; 1161bd4fe43Sopenharmony_ci u32MainSize = u32MainStride * u32AlignHeight * 2; 1171bd4fe43Sopenharmony_ci } else if (enPixelFormat == PIXEL_FORMAT_YUV_400) { 1181bd4fe43Sopenharmony_ci u32HeadSize = u32HeadStride * u32AlignHeight; 1191bd4fe43Sopenharmony_ci u32MainSize = u32MainStride * u32AlignHeight; 1201bd4fe43Sopenharmony_ci } else { 1211bd4fe43Sopenharmony_ci u32HeadSize = u32HeadStride * u32AlignHeight * 3; 1221bd4fe43Sopenharmony_ci u32MainSize = u32MainStride * u32AlignHeight * 3; 1231bd4fe43Sopenharmony_ci } 1241bd4fe43Sopenharmony_ci } else { 1251bd4fe43Sopenharmony_ci u32VBSize = 0; 1261bd4fe43Sopenharmony_ci u32HeadYSize = 0; 1271bd4fe43Sopenharmony_ci u32HeadSize = 0; 1281bd4fe43Sopenharmony_ci u32HeadStride = 0; 1291bd4fe43Sopenharmony_ci u32MainStride = 0; 1301bd4fe43Sopenharmony_ci u32YSize = 0; 1311bd4fe43Sopenharmony_ci u32MainSize = 0; 1321bd4fe43Sopenharmony_ci u32ExtStride = 0; 1331bd4fe43Sopenharmony_ci u32ExtYSize = 0; 1341bd4fe43Sopenharmony_ci } 1351bd4fe43Sopenharmony_ci 1361bd4fe43Sopenharmony_ci u32HeadSize = HI_ALIGN_UP(u32HeadSize, u32Align); 1371bd4fe43Sopenharmony_ci 1381bd4fe43Sopenharmony_ci u32VBSize = u32HeadSize + u32MainSize + u32ExtSize; 1391bd4fe43Sopenharmony_ci } 1401bd4fe43Sopenharmony_ci 1411bd4fe43Sopenharmony_ci pstCalConfig->u32VBSize = u32VBSize; 1421bd4fe43Sopenharmony_ci pstCalConfig->u32HeadYSize = u32HeadYSize; 1431bd4fe43Sopenharmony_ci pstCalConfig->u32HeadSize = u32HeadSize; 1441bd4fe43Sopenharmony_ci pstCalConfig->u32HeadStride = u32HeadStride; 1451bd4fe43Sopenharmony_ci pstCalConfig->u32MainStride = u32MainStride; 1461bd4fe43Sopenharmony_ci pstCalConfig->u32MainYSize = u32YSize; 1471bd4fe43Sopenharmony_ci pstCalConfig->u32MainSize = u32MainSize; 1481bd4fe43Sopenharmony_ci pstCalConfig->u32ExtStride = u32ExtStride; 1491bd4fe43Sopenharmony_ci pstCalConfig->u32ExtYSize = u32ExtYSize; 1501bd4fe43Sopenharmony_ci 1511bd4fe43Sopenharmony_ci return; 1521bd4fe43Sopenharmony_ci} 1531bd4fe43Sopenharmony_ci 1541bd4fe43Sopenharmony_ci__inline static HI_U32 COMMON_GetPicBufferSize(HI_U32 u32Width, HI_U32 u32Height, 1551bd4fe43Sopenharmony_ci PIXEL_FORMAT_E enPixelFormat, 1561bd4fe43Sopenharmony_ci DATA_BITWIDTH_E enBitWidth, COMPRESS_MODE_E enCmpMode, HI_U32 u32Align) 1571bd4fe43Sopenharmony_ci{ 1581bd4fe43Sopenharmony_ci VB_CAL_CONFIG_S stCalConfig; 1591bd4fe43Sopenharmony_ci 1601bd4fe43Sopenharmony_ci COMMON_GetPicBufferConfig(u32Width, u32Height, enPixelFormat, enBitWidth, enCmpMode, u32Align, &stCalConfig); 1611bd4fe43Sopenharmony_ci 1621bd4fe43Sopenharmony_ci return stCalConfig.u32VBSize; 1631bd4fe43Sopenharmony_ci} 1641bd4fe43Sopenharmony_ci 1651bd4fe43Sopenharmony_ci__inline static HI_U32 VI_GetRawBufferSizeEx(HI_U32 u32Width, HI_U32 u32Height, 1661bd4fe43Sopenharmony_ci PIXEL_FORMAT_E enPixelFormat, 1671bd4fe43Sopenharmony_ci COMPRESS_MODE_E enCmpMode, HI_U32 u32CmpRatio, HI_U32 u32Align) 1681bd4fe43Sopenharmony_ci{ 1691bd4fe43Sopenharmony_ci HI_U32 u32BitWidth; 1701bd4fe43Sopenharmony_ci HI_U32 u32Size = 0; 1711bd4fe43Sopenharmony_ci HI_U32 u32Stride = 0; 1721bd4fe43Sopenharmony_ci HI_U32 u32RawCmpRatio = 1600; 1731bd4fe43Sopenharmony_ci 1741bd4fe43Sopenharmony_ci if ((u32Width > HI_MAXINUM_LIMIT) || (u32Height > HI_MAXINUM_LIMIT)) { 1751bd4fe43Sopenharmony_ci return 0; 1761bd4fe43Sopenharmony_ci } 1771bd4fe43Sopenharmony_ci 1781bd4fe43Sopenharmony_ci if (enCmpMode == COMPRESS_MODE_LINE) { 1791bd4fe43Sopenharmony_ci u32RawCmpRatio = 1600; 1801bd4fe43Sopenharmony_ci } else if (enCmpMode == COMPRESS_MODE_FRAME) { 1811bd4fe43Sopenharmony_ci if (u32CmpRatio == 0) { 1821bd4fe43Sopenharmony_ci u32RawCmpRatio = 2000; 1831bd4fe43Sopenharmony_ci } else { 1841bd4fe43Sopenharmony_ci u32RawCmpRatio = u32CmpRatio; 1851bd4fe43Sopenharmony_ci } 1861bd4fe43Sopenharmony_ci } 1871bd4fe43Sopenharmony_ci 1881bd4fe43Sopenharmony_ci /* u32Align: 0 is automatic mode, alignment size following system. Non-0 for specified alignment size */ 1891bd4fe43Sopenharmony_ci if (u32Align == 0) { 1901bd4fe43Sopenharmony_ci u32Align = DEFAULT_ALIGN; 1911bd4fe43Sopenharmony_ci } else if (u32Align > MAX_ALIGN) { 1921bd4fe43Sopenharmony_ci u32Align = MAX_ALIGN; 1931bd4fe43Sopenharmony_ci } else { 1941bd4fe43Sopenharmony_ci u32Align = (HI_ALIGN_UP(u32Align, DEFAULT_ALIGN)); 1951bd4fe43Sopenharmony_ci } 1961bd4fe43Sopenharmony_ci 1971bd4fe43Sopenharmony_ci switch (enPixelFormat) { 1981bd4fe43Sopenharmony_ci case PIXEL_FORMAT_RGB_BAYER_8BPP: { 1991bd4fe43Sopenharmony_ci u32BitWidth = 8; 2001bd4fe43Sopenharmony_ci break; 2011bd4fe43Sopenharmony_ci } 2021bd4fe43Sopenharmony_ci 2031bd4fe43Sopenharmony_ci case PIXEL_FORMAT_RGB_BAYER_10BPP: { 2041bd4fe43Sopenharmony_ci u32BitWidth = 10; 2051bd4fe43Sopenharmony_ci break; 2061bd4fe43Sopenharmony_ci } 2071bd4fe43Sopenharmony_ci 2081bd4fe43Sopenharmony_ci case PIXEL_FORMAT_RGB_BAYER_12BPP: { 2091bd4fe43Sopenharmony_ci u32BitWidth = 12; 2101bd4fe43Sopenharmony_ci break; 2111bd4fe43Sopenharmony_ci } 2121bd4fe43Sopenharmony_ci 2131bd4fe43Sopenharmony_ci case PIXEL_FORMAT_RGB_BAYER_14BPP: { 2141bd4fe43Sopenharmony_ci u32BitWidth = 14; 2151bd4fe43Sopenharmony_ci break; 2161bd4fe43Sopenharmony_ci } 2171bd4fe43Sopenharmony_ci 2181bd4fe43Sopenharmony_ci case PIXEL_FORMAT_RGB_BAYER_16BPP: { 2191bd4fe43Sopenharmony_ci u32BitWidth = 16; 2201bd4fe43Sopenharmony_ci break; 2211bd4fe43Sopenharmony_ci } 2221bd4fe43Sopenharmony_ci 2231bd4fe43Sopenharmony_ci default: { 2241bd4fe43Sopenharmony_ci u32BitWidth = 0; 2251bd4fe43Sopenharmony_ci break; 2261bd4fe43Sopenharmony_ci } 2271bd4fe43Sopenharmony_ci } 2281bd4fe43Sopenharmony_ci 2291bd4fe43Sopenharmony_ci if (enCmpMode == COMPRESS_MODE_NONE) { 2301bd4fe43Sopenharmony_ci u32Stride = HI_ALIGN_UP(HI_ALIGN_UP(u32Width * u32BitWidth, 8) / 8, u32Align); 2311bd4fe43Sopenharmony_ci u32Size = u32Stride * u32Height; 2321bd4fe43Sopenharmony_ci } else if (enCmpMode == COMPRESS_MODE_LINE) { 2331bd4fe43Sopenharmony_ci HI_U32 u32Tmp; 2341bd4fe43Sopenharmony_ci u32Tmp = HI_ALIGN_UP((16 + u32Width * u32BitWidth * 1000UL / u32RawCmpRatio + 8192 + 127) / 128, 2); 2351bd4fe43Sopenharmony_ci u32Stride = HI_ALIGN_UP(u32Tmp * 16, u32Align); 2361bd4fe43Sopenharmony_ci u32Size = u32Stride * u32Height; 2371bd4fe43Sopenharmony_ci } else if (enCmpMode == COMPRESS_MODE_FRAME) { 2381bd4fe43Sopenharmony_ci u32Size = HI_ALIGN_UP(u32Height * u32Width * u32BitWidth * 1000UL / (u32RawCmpRatio * 8), u32Align); 2391bd4fe43Sopenharmony_ci } 2401bd4fe43Sopenharmony_ci 2411bd4fe43Sopenharmony_ci return u32Size; 2421bd4fe43Sopenharmony_ci} 2431bd4fe43Sopenharmony_ci 2441bd4fe43Sopenharmony_ci__inline static HI_U32 VI_GetRawBufferSize(HI_U32 u32Width, HI_U32 u32Height, 2451bd4fe43Sopenharmony_ci PIXEL_FORMAT_E enPixelFormat, COMPRESS_MODE_E enCmpMode, HI_U32 u32Align) 2461bd4fe43Sopenharmony_ci{ 2471bd4fe43Sopenharmony_ci return VI_GetRawBufferSizeEx(u32Width, u32Height, enPixelFormat, enCmpMode, 0, u32Align); 2481bd4fe43Sopenharmony_ci} 2491bd4fe43Sopenharmony_ci 2501bd4fe43Sopenharmony_ci__inline static HI_U32 VDEC_GetPicBufferSize(PAYLOAD_TYPE_E enType, HI_U32 u32Width, 2511bd4fe43Sopenharmony_ci HI_U32 u32Height, __attribute__((unused))PIXEL_FORMAT_E enPixelFormat, 2521bd4fe43Sopenharmony_ci __attribute__((unused))DATA_BITWIDTH_E enBitWidth, 2531bd4fe43Sopenharmony_ci __attribute__((unused))HI_U32 u32Align) 2541bd4fe43Sopenharmony_ci{ 2551bd4fe43Sopenharmony_ci HI_U32 u32AlignWidth, u32AlignHeight; 2561bd4fe43Sopenharmony_ci HI_U32 u32Size = 0; 2571bd4fe43Sopenharmony_ci 2581bd4fe43Sopenharmony_ci if ((u32Width > HI_MAXINUM_LIMIT) || (u32Height > HI_MAXINUM_LIMIT)) { 2591bd4fe43Sopenharmony_ci return 0; 2601bd4fe43Sopenharmony_ci } 2611bd4fe43Sopenharmony_ci 2621bd4fe43Sopenharmony_ci if (enType == PT_H264) { 2631bd4fe43Sopenharmony_ci u32AlignWidth = HI_ALIGN_UP(u32Width, H264D_ALIGN_W); 2641bd4fe43Sopenharmony_ci u32AlignHeight = HI_ALIGN_UP(u32Height, H264D_ALIGN_H); 2651bd4fe43Sopenharmony_ci u32Size = ((u32AlignWidth * u32AlignHeight) * 3) >> 1; 2661bd4fe43Sopenharmony_ci } else if (enType == PT_H265) { 2671bd4fe43Sopenharmony_ci u32AlignWidth = HI_ALIGN_UP(u32Width, H265D_ALIGN_W); 2681bd4fe43Sopenharmony_ci u32AlignHeight = HI_ALIGN_UP(u32Height, H265D_ALIGN_H); 2691bd4fe43Sopenharmony_ci u32Size = ((u32AlignWidth * u32AlignHeight) * 3) >> 1; 2701bd4fe43Sopenharmony_ci } else if ((enType == PT_JPEG) || (enType == PT_MJPEG)) { 2711bd4fe43Sopenharmony_ci /* for PIXEL_FORMAT_YVU_SEMIPLANAR_420 */ 2721bd4fe43Sopenharmony_ci u32AlignWidth = HI_ALIGN_UP(u32Width, JPEGD_ALIGN_W); 2731bd4fe43Sopenharmony_ci u32AlignHeight = HI_ALIGN_UP(u32Height, JPEGD_ALIGN_H); 2741bd4fe43Sopenharmony_ci u32Size = (u32AlignWidth * u32AlignHeight * 3) >> 1; 2751bd4fe43Sopenharmony_ci } else { 2761bd4fe43Sopenharmony_ci u32Size = 0; 2771bd4fe43Sopenharmony_ci } 2781bd4fe43Sopenharmony_ci 2791bd4fe43Sopenharmony_ci return u32Size; 2801bd4fe43Sopenharmony_ci} 2811bd4fe43Sopenharmony_ci 2821bd4fe43Sopenharmony_ci__inline static HI_U32 VDEC_GetTmvBufferSize(PAYLOAD_TYPE_E enType, HI_U32 u32Width, HI_U32 u32Height) 2831bd4fe43Sopenharmony_ci{ 2841bd4fe43Sopenharmony_ci HI_U32 WidthInMb, HeightInMb; 2851bd4fe43Sopenharmony_ci HI_U32 ColMbSize; 2861bd4fe43Sopenharmony_ci HI_U32 u32Size = 0; 2871bd4fe43Sopenharmony_ci 2881bd4fe43Sopenharmony_ci if ((u32Width > HI_MAXINUM_LIMIT) || (u32Height > HI_MAXINUM_LIMIT)) { 2891bd4fe43Sopenharmony_ci return 0; 2901bd4fe43Sopenharmony_ci } 2911bd4fe43Sopenharmony_ci 2921bd4fe43Sopenharmony_ci if (enType == PT_H264) { 2931bd4fe43Sopenharmony_ci WidthInMb = HI_ALIGN_UP(u32Width, 16) >> 4; 2941bd4fe43Sopenharmony_ci HeightInMb = HI_ALIGN_UP(u32Height, 16) >> 4; 2951bd4fe43Sopenharmony_ci ColMbSize = 16 * 4; 2961bd4fe43Sopenharmony_ci u32Size = HI_ALIGN_UP((ColMbSize * WidthInMb * HeightInMb), 128); 2971bd4fe43Sopenharmony_ci } else if (enType == PT_H265) { 2981bd4fe43Sopenharmony_ci WidthInMb = HI_ALIGN_UP(u32Width, 64) >> 4; 2991bd4fe43Sopenharmony_ci HeightInMb = HI_ALIGN_UP(u32Height, 64) >> 4; 3001bd4fe43Sopenharmony_ci ColMbSize = 4 * 4; 3011bd4fe43Sopenharmony_ci u32Size = HI_ALIGN_UP((ColMbSize * WidthInMb * HeightInMb), 128); 3021bd4fe43Sopenharmony_ci } else { 3031bd4fe43Sopenharmony_ci u32Size = 0; 3041bd4fe43Sopenharmony_ci } 3051bd4fe43Sopenharmony_ci 3061bd4fe43Sopenharmony_ci return u32Size; 3071bd4fe43Sopenharmony_ci} 3081bd4fe43Sopenharmony_ci 3091bd4fe43Sopenharmony_ci__inline static HI_U32 VENC_GetRefPicInfoBufferSize(PAYLOAD_TYPE_E enType, HI_U32 u32Width, HI_U32 u32Height, 3101bd4fe43Sopenharmony_ci __attribute__((unused))HI_U32 u32Align) 3111bd4fe43Sopenharmony_ci{ 3121bd4fe43Sopenharmony_ci HI_U32 u32Size; 3131bd4fe43Sopenharmony_ci HI_U32 u32AlignWidth, u32AlignHeight; 3141bd4fe43Sopenharmony_ci HI_U32 u32TmvSize, u32PmeSize, u32PmeInfoSize; 3151bd4fe43Sopenharmony_ci 3161bd4fe43Sopenharmony_ci if ((u32Width > HI_MAXINUM_LIMIT) || (u32Height > HI_MAXINUM_LIMIT)) { 3171bd4fe43Sopenharmony_ci return 0; 3181bd4fe43Sopenharmony_ci } 3191bd4fe43Sopenharmony_ci 3201bd4fe43Sopenharmony_ci if (enType == PT_H265) { 3211bd4fe43Sopenharmony_ci u32AlignWidth = HI_ALIGN_UP(u32Width, 64) >> 6; 3221bd4fe43Sopenharmony_ci u32AlignHeight = HI_ALIGN_UP(u32Height, 64) >> 6; 3231bd4fe43Sopenharmony_ci 3241bd4fe43Sopenharmony_ci u32TmvSize = (u32AlignWidth * u32AlignHeight) << 8; 3251bd4fe43Sopenharmony_ci u32PmeSize = (u32AlignWidth << 4) * (u32AlignHeight << 4); 3261bd4fe43Sopenharmony_ci 3271bd4fe43Sopenharmony_ci u32AlignWidth = HI_ALIGN_UP(u32Width, 1024) >> 10; 3281bd4fe43Sopenharmony_ci u32AlignHeight = HI_ALIGN_UP(u32Height, 64) >> 6; 3291bd4fe43Sopenharmony_ci u32PmeInfoSize = (u32AlignWidth * u32AlignHeight) << 5; 3301bd4fe43Sopenharmony_ci 3311bd4fe43Sopenharmony_ci u32Size = u32TmvSize + u32PmeSize + u32PmeInfoSize; 3321bd4fe43Sopenharmony_ci } else if (enType == PT_H264) { 3331bd4fe43Sopenharmony_ci u32AlignWidth = HI_ALIGN_UP(u32Width, 16) >> 4; 3341bd4fe43Sopenharmony_ci u32AlignHeight = HI_ALIGN_UP(u32Height, 16) >> 4; 3351bd4fe43Sopenharmony_ci u32TmvSize = (u32AlignWidth * u32AlignHeight) << 5; 3361bd4fe43Sopenharmony_ci 3371bd4fe43Sopenharmony_ci u32AlignWidth = HI_ALIGN_UP(u32Width, 64) >> 6; 3381bd4fe43Sopenharmony_ci u32AlignHeight = HI_ALIGN_UP(u32Height, 64) >> 6; 3391bd4fe43Sopenharmony_ci u32PmeSize = (u32AlignWidth << 4) * (u32AlignHeight << 4); 3401bd4fe43Sopenharmony_ci 3411bd4fe43Sopenharmony_ci u32AlignWidth = HI_ALIGN_UP(u32Width, 4096) >> 12; 3421bd4fe43Sopenharmony_ci u32AlignHeight = HI_ALIGN_UP(u32Height, 16) >> 4; 3431bd4fe43Sopenharmony_ci u32PmeInfoSize = (u32AlignWidth * u32AlignHeight) << 5; 3441bd4fe43Sopenharmony_ci 3451bd4fe43Sopenharmony_ci u32Size = u32TmvSize + u32PmeSize + u32PmeInfoSize; 3461bd4fe43Sopenharmony_ci } else { 3471bd4fe43Sopenharmony_ci u32Size = 0; 3481bd4fe43Sopenharmony_ci } 3491bd4fe43Sopenharmony_ci return u32Size; 3501bd4fe43Sopenharmony_ci} 3511bd4fe43Sopenharmony_ci 3521bd4fe43Sopenharmony_ci__inline static HI_U32 VENC_GetRefBufferSize(PAYLOAD_TYPE_E enType, HI_U32 u32Width, HI_U32 u32Height, 3531bd4fe43Sopenharmony_ci DATA_BITWIDTH_E enBitWidth, __attribute__((unused))HI_U32 u32Align) 3541bd4fe43Sopenharmony_ci{ 3551bd4fe43Sopenharmony_ci HI_U32 u32Size = 0; 3561bd4fe43Sopenharmony_ci HI_U32 u32AlignWidth, u32AlignHeight, u32BitWidth; 3571bd4fe43Sopenharmony_ci HI_U32 u32YHeaderSize, u32CHeaderSize, u32YSize, u32CSize; 3581bd4fe43Sopenharmony_ci 3591bd4fe43Sopenharmony_ci if ((u32Width > HI_MAXINUM_LIMIT) || (u32Height > HI_MAXINUM_LIMIT)) { 3601bd4fe43Sopenharmony_ci return 0; 3611bd4fe43Sopenharmony_ci } 3621bd4fe43Sopenharmony_ci 3631bd4fe43Sopenharmony_ci if (enBitWidth == DATA_BITWIDTH_8) { 3641bd4fe43Sopenharmony_ci u32BitWidth = 8; 3651bd4fe43Sopenharmony_ci } else { 3661bd4fe43Sopenharmony_ci return 0; 3671bd4fe43Sopenharmony_ci } 3681bd4fe43Sopenharmony_ci 3691bd4fe43Sopenharmony_ci if (enType == PT_H265) { 3701bd4fe43Sopenharmony_ci u32AlignWidth = HI_ALIGN_UP(u32Width, 128); 3711bd4fe43Sopenharmony_ci u32AlignHeight = HI_ALIGN_UP(u32Height, 64) >> 6; 3721bd4fe43Sopenharmony_ci 3731bd4fe43Sopenharmony_ci u32YHeaderSize = u32AlignWidth / 64 * 32 * u32AlignHeight; 3741bd4fe43Sopenharmony_ci u32CHeaderSize = u32YHeaderSize; 3751bd4fe43Sopenharmony_ci 3761bd4fe43Sopenharmony_ci u32AlignWidth = HI_ALIGN_UP(u32Width, 64); 3771bd4fe43Sopenharmony_ci u32AlignHeight = HI_ALIGN_UP(u32Height, 16); 3781bd4fe43Sopenharmony_ci u32YSize = (u32AlignWidth * u32AlignHeight * u32BitWidth) >> 3; 3791bd4fe43Sopenharmony_ci u32CSize = u32YSize >> 1; 3801bd4fe43Sopenharmony_ci 3811bd4fe43Sopenharmony_ci u32Size = u32YHeaderSize + u32CHeaderSize + u32YSize + u32CSize; 3821bd4fe43Sopenharmony_ci } else if (enType == PT_H264) { 3831bd4fe43Sopenharmony_ci u32AlignWidth = HI_ALIGN_UP(u32Width, 512); 3841bd4fe43Sopenharmony_ci u32AlignHeight = HI_ALIGN_UP(u32Height, 16) >> 4; 3851bd4fe43Sopenharmony_ci u32YHeaderSize = ((u32AlignWidth >> 8) << 4) * u32AlignHeight; 3861bd4fe43Sopenharmony_ci u32CHeaderSize = u32YHeaderSize; 3871bd4fe43Sopenharmony_ci 3881bd4fe43Sopenharmony_ci u32AlignWidth = HI_ALIGN_UP(u32Width, 64); 3891bd4fe43Sopenharmony_ci u32AlignHeight = HI_ALIGN_UP(u32Height, 16); 3901bd4fe43Sopenharmony_ci u32YSize = u32AlignWidth * u32AlignHeight; 3911bd4fe43Sopenharmony_ci u32CSize = u32YSize >> 1; 3921bd4fe43Sopenharmony_ci 3931bd4fe43Sopenharmony_ci u32Size = u32YHeaderSize + u32CHeaderSize + u32YSize + u32CSize; 3941bd4fe43Sopenharmony_ci } else { 3951bd4fe43Sopenharmony_ci u32Size = 0; 3961bd4fe43Sopenharmony_ci } 3971bd4fe43Sopenharmony_ci 3981bd4fe43Sopenharmony_ci return u32Size; 3991bd4fe43Sopenharmony_ci} 4001bd4fe43Sopenharmony_ci 4011bd4fe43Sopenharmony_ci__inline static HI_U32 VENC_GetQpmapSizeStride(HI_U32 u32Width) 4021bd4fe43Sopenharmony_ci{ 4031bd4fe43Sopenharmony_ci if (u32Width > HI_MAXINUM_LIMIT) { 4041bd4fe43Sopenharmony_ci return 0; 4051bd4fe43Sopenharmony_ci } 4061bd4fe43Sopenharmony_ci 4071bd4fe43Sopenharmony_ci return DIV_UP(u32Width, 512) * 32; 4081bd4fe43Sopenharmony_ci} 4091bd4fe43Sopenharmony_ci 4101bd4fe43Sopenharmony_ci__inline static HI_U32 VENC_GetQpmapSize(HI_U32 u32Width, HI_U32 u32Height) 4111bd4fe43Sopenharmony_ci{ 4121bd4fe43Sopenharmony_ci HI_U32 u32Stride, u32AlignHeight; 4131bd4fe43Sopenharmony_ci 4141bd4fe43Sopenharmony_ci if ((u32Width > HI_MAXINUM_LIMIT) || (u32Height > HI_MAXINUM_LIMIT)) { 4151bd4fe43Sopenharmony_ci return 0; 4161bd4fe43Sopenharmony_ci } 4171bd4fe43Sopenharmony_ci 4181bd4fe43Sopenharmony_ci u32Stride = VENC_GetQpmapSizeStride(u32Width); 4191bd4fe43Sopenharmony_ci u32AlignHeight = DIV_UP(u32Height, 16); 4201bd4fe43Sopenharmony_ci 4211bd4fe43Sopenharmony_ci return u32Stride * u32AlignHeight; 4221bd4fe43Sopenharmony_ci} 4231bd4fe43Sopenharmony_ci 4241bd4fe43Sopenharmony_ci__inline static HI_U32 VENC_GetSkipWeightSizeStride(PAYLOAD_TYPE_E enType, HI_U32 u32Width) 4251bd4fe43Sopenharmony_ci{ 4261bd4fe43Sopenharmony_ci HI_U32 u32Stride; 4271bd4fe43Sopenharmony_ci 4281bd4fe43Sopenharmony_ci if (u32Width > HI_MAXINUM_LIMIT) { 4291bd4fe43Sopenharmony_ci return 0; 4301bd4fe43Sopenharmony_ci } 4311bd4fe43Sopenharmony_ci 4321bd4fe43Sopenharmony_ci if (enType == PT_H265) { 4331bd4fe43Sopenharmony_ci u32Stride = DIV_UP(u32Width, 2048) * 16; 4341bd4fe43Sopenharmony_ci } else if (enType == PT_H264) { 4351bd4fe43Sopenharmony_ci u32Stride = DIV_UP(u32Width, 512) * 16; 4361bd4fe43Sopenharmony_ci } else { 4371bd4fe43Sopenharmony_ci u32Stride = 0; 4381bd4fe43Sopenharmony_ci } 4391bd4fe43Sopenharmony_ci 4401bd4fe43Sopenharmony_ci return u32Stride; 4411bd4fe43Sopenharmony_ci} 4421bd4fe43Sopenharmony_ci__inline static HI_U32 VENC_GetSkipWeightSize(PAYLOAD_TYPE_E enType, HI_U32 u32Width, HI_U32 u32Height) 4431bd4fe43Sopenharmony_ci{ 4441bd4fe43Sopenharmony_ci HI_U32 u32Stride, u32AlignHeight; 4451bd4fe43Sopenharmony_ci 4461bd4fe43Sopenharmony_ci if ((u32Width > HI_MAXINUM_LIMIT) || (u32Height > HI_MAXINUM_LIMIT)) { 4471bd4fe43Sopenharmony_ci return 0; 4481bd4fe43Sopenharmony_ci } 4491bd4fe43Sopenharmony_ci 4501bd4fe43Sopenharmony_ci u32Stride = VENC_GetSkipWeightSizeStride(enType, u32Width); 4511bd4fe43Sopenharmony_ci 4521bd4fe43Sopenharmony_ci if (enType == PT_H265) { 4531bd4fe43Sopenharmony_ci u32AlignHeight = DIV_UP(u32Height, 64); 4541bd4fe43Sopenharmony_ci } else if (enType == PT_H264) { 4551bd4fe43Sopenharmony_ci u32AlignHeight = DIV_UP(u32Height, 16); 4561bd4fe43Sopenharmony_ci } else { 4571bd4fe43Sopenharmony_ci u32AlignHeight = 0; 4581bd4fe43Sopenharmony_ci } 4591bd4fe43Sopenharmony_ci 4601bd4fe43Sopenharmony_ci return u32Stride * u32AlignHeight; 4611bd4fe43Sopenharmony_ci} 4621bd4fe43Sopenharmony_ci 4631bd4fe43Sopenharmony_ci#ifdef __cplusplus 4641bd4fe43Sopenharmony_ci#if __cplusplus 4651bd4fe43Sopenharmony_ci} 4661bd4fe43Sopenharmony_ci#endif 4671bd4fe43Sopenharmony_ci#endif /* __cplusplus */ 4681bd4fe43Sopenharmony_ci 4691bd4fe43Sopenharmony_ci#endif /* __HI_BUFFER_H__ */ 4701bd4fe43Sopenharmony_ci 471