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