Program Listing for File DataLayout.h

Return to documentation for file (nvcv_types/include/nvcv/DataLayout.h)

/*
 * SPDX-FileCopyrightText: Copyright (c) 2022-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
 * SPDX-License-Identifier: Apache-2.0
 *
 * 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.
 */

#ifndef NVCV_FORMAT_DATALAYOUT_H
#define NVCV_FORMAT_DATALAYOUT_H

#include "detail/FormatUtils.h"

#include <nvcv/Export.h>
#include <nvcv/Status.h>

#ifdef __cplusplus
extern "C"
{
#endif

#define NVCV_MAX_CHANNEL_COUNT       (4)
#define NVCV_MAX_EXTRA_CHANNEL_COUNT (7)
#define NVCV_MAX_SWIZZLE_COUNT       (57)

typedef enum
{
    NVCV_PACKING_0 = 0,

    NVCV_PACKING_X1 = NVCV_DETAIL_BPP_NCH(1, 1),
    NVCV_PACKING_X2 = NVCV_DETAIL_BPP_NCH(2, 1),
    NVCV_PACKING_X4 = NVCV_DETAIL_BPP_NCH(4, 1),

    NVCV_PACKING_X8 = NVCV_DETAIL_BPP_NCH(8, 1),
    NVCV_PACKING_b4X4,
    NVCV_PACKING_X4b4,

    NVCV_PACKING_X4Y4 = NVCV_DETAIL_BPP_NCH(8, 2),

    NVCV_PACKING_X3Y3Z2 = NVCV_DETAIL_BPP_NCH(8, 3),

    NVCV_PACKING_X16 = NVCV_DETAIL_BPP_NCH(16, 1),
    NVCV_PACKING_b6X10,
    NVCV_PACKING_X10b6,
    NVCV_PACKING_b4X12,
    NVCV_PACKING_X12b4,
    NVCV_PACKING_b2X14,
    NVCV_PACKING_X14b2,

    NVCV_PACKING_X8_Y8 = NVCV_DETAIL_BPP_NCH(16, 2),

    NVCV_PACKING_X5Y5Z6 = NVCV_DETAIL_BPP_NCH(16, 3),
    NVCV_PACKING_X5Y6Z5,
    NVCV_PACKING_X6Y5Z5,
    NVCV_PACKING_b4X4Y4Z4,
    NVCV_PACKING_b1X5Y5Z5,
    NVCV_PACKING_X5Y5b1Z5,

    NVCV_PACKING_X1Y5Z5W5 = NVCV_DETAIL_BPP_NCH(16, 4),
    NVCV_PACKING_X4Y4Z4W4,
    NVCV_PACKING_X5Y1Z5W5,
    NVCV_PACKING_X5Y5Z1W5,
    NVCV_PACKING_X5Y5Z5W1,

    NVCV_PACKING_X8_Y8__X8_Z8,
    NVCV_PACKING_Y8_X8__Z8_X8,

    NVCV_PACKING_X24 = NVCV_DETAIL_BPP_NCH(24, 1),

    NVCV_PACKING_X8_Y8_Z8 = NVCV_DETAIL_BPP_NCH(24, 3),

    NVCV_PACKING_X32 = NVCV_DETAIL_BPP_NCH(32, 1),
    NVCV_PACKING_b12X20,
    NVCV_PACKING_X20b12,
    NVCV_PACKING_X24b8,
    NVCV_PACKING_b8X24,

    NVCV_PACKING_X16_Y16 = NVCV_DETAIL_BPP_NCH(32, 2),
    NVCV_PACKING_X10b6_Y10b6,
    NVCV_PACKING_X12b4_Y12b4,

    NVCV_PACKING_X10Y11Z11 = NVCV_DETAIL_BPP_NCH(32, 3),
    NVCV_PACKING_X11Y11Z10,
    NVCV_PACKING_b2X10Y10Z10,
    NVCV_PACKING_X10Y10Z10b2,

    NVCV_PACKING_X8_Y8_Z8_W8 = NVCV_DETAIL_BPP_NCH(32, 4),
    NVCV_PACKING_X2Y10Z10W10,
    NVCV_PACKING_X10Y10Z10W2,

    NVCV_PACKING_X48 = NVCV_DETAIL_BPP_NCH(48, 1),
    NVCV_PACKING_X16_Y16_Z16 = NVCV_DETAIL_BPP_NCH(48, 3),

    NVCV_PACKING_X64 = NVCV_DETAIL_BPP_NCH(64, 1),
    NVCV_PACKING_X32_Y32 = NVCV_DETAIL_BPP_NCH(64, 2),
    NVCV_PACKING_X32_Y24b8,

    NVCV_PACKING_X16_Y16_Z16_W16 = NVCV_DETAIL_BPP_NCH(64, 4),

    NVCV_PACKING_X96 = NVCV_DETAIL_BPP_NCH(96, 1),
    NVCV_PACKING_X32_Y32_Z32 = NVCV_DETAIL_BPP_NCH(96, 3),

    NVCV_PACKING_X128 = NVCV_DETAIL_BPP_NCH(128, 1),
    NVCV_PACKING_X64_Y64 = NVCV_DETAIL_BPP_NCH(128, 2),
    NVCV_PACKING_X32_Y32_Z32_W32 = NVCV_DETAIL_BPP_NCH(128, 4),

    NVCV_PACKING_X192 = NVCV_DETAIL_BPP_NCH(192, 1),
    NVCV_PACKING_X64_Y64_Z64 = NVCV_DETAIL_BPP_NCH(192, 3),

    NVCV_PACKING_X256 = NVCV_DETAIL_BPP_NCH(256, 1),
    NVCV_PACKING_X128_Y128 = NVCV_DETAIL_BPP_NCH(256, 2),
    NVCV_PACKING_X64_Y64_Z64_W64 = NVCV_DETAIL_BPP_NCH(256, 4),

    NVCV_PACKING_LIMIT32 = INT32_MAX
    /* \endcond */
} NVCVPacking;

typedef enum
{
    NVCV_DATA_KIND_UNSPECIFIED = -1,
    NVCV_DATA_KIND_UNSIGNED,
    NVCV_DATA_KIND_SIGNED,
    NVCV_DATA_KIND_FLOAT,
    NVCV_DATA_KIND_COMPLEX
} NVCVDataKind;

typedef enum
{
    NVCV_MEM_LAYOUT_PITCH_LINEAR,

    NVCV_MEM_LAYOUT_BLOCK1_LINEAR,

    NVCV_MEM_LAYOUT_BLOCK2_LINEAR,

    NVCV_MEM_LAYOUT_BLOCK4_LINEAR,

    NVCV_MEM_LAYOUT_BLOCK8_LINEAR,

    NVCV_MEM_LAYOUT_BLOCK16_LINEAR,

    NVCV_MEM_LAYOUT_BLOCK32_LINEAR,

    NVCV_MEM_LAYOUT_BLOCK_LINEAR = NVCV_MEM_LAYOUT_BLOCK2_LINEAR,

    NVCV_MEM_LAYOUT_PL = NVCV_MEM_LAYOUT_PITCH_LINEAR,
    NVCV_MEM_LAYOUT_BL = NVCV_MEM_LAYOUT_BLOCK_LINEAR
} NVCVMemLayout;

typedef enum
{
    NVCV_CHANNEL_0 = 0,
    NVCV_CHANNEL_X,
    NVCV_CHANNEL_Y,
    NVCV_CHANNEL_Z,
    NVCV_CHANNEL_W,
    NVCV_CHANNEL_1,
    NVCV_CHANNEL_FORCE8 = UINT8_MAX,
    /* \endcond */
} NVCVChannel;

typedef enum
{
    NVCV_ALPHA_ASSOCIATED,
    NVCV_ALPHA_UNASSOCIATED,
} NVCVAlphaType;

typedef enum
{
    NVCV_EXTRA_CHANNEL_U = 0,
    NVCV_EXTRA_CHANNEL_D,
    NVCV_EXTRA_CHANNEL_POS3D,
} NVCVExtraChannel;

typedef struct
{
    int32_t          numChannels;
    int32_t          bitsPerPixel;
    NVCVDataKind     datakind;
    NVCVExtraChannel channelType;
} NVCVExtraChannelInfo;

typedef enum
{
    NVCV_SWIZZLE_0000,
    NVCV_SWIZZLE_X000,
    NVCV_SWIZZLE_XY00,
    NVCV_SWIZZLE_XYZ0,
    NVCV_SWIZZLE_XYZW,
    NVCV_SWIZZLE_1000,
    NVCV_SWIZZLE_0001,
    NVCV_SWIZZLE_ZYXW,
    NVCV_SWIZZLE_WXYZ,
    NVCV_SWIZZLE_WZYX,
    NVCV_SWIZZLE_YZWX,
    NVCV_SWIZZLE_XYZ1,
    NVCV_SWIZZLE_YZW1,
    NVCV_SWIZZLE_XXX1,
    NVCV_SWIZZLE_XZY1,
    NVCV_SWIZZLE_ZYX1,
    NVCV_SWIZZLE_ZYX0,
    NVCV_SWIZZLE_WZY1,
    NVCV_SWIZZLE_0X00,
    NVCV_SWIZZLE_00X0,
    NVCV_SWIZZLE_000X,
    NVCV_SWIZZLE_Y000,
    NVCV_SWIZZLE_0Y00,
    NVCV_SWIZZLE_00Y0,
    NVCV_SWIZZLE_000Y,
    NVCV_SWIZZLE_0XY0,
    NVCV_SWIZZLE_XXXY,
    NVCV_SWIZZLE_YYYX,
    NVCV_SWIZZLE_0YX0,
    NVCV_SWIZZLE_X00Y,
    NVCV_SWIZZLE_Y00X,
    NVCV_SWIZZLE_X001,
    NVCV_SWIZZLE_XY01,
    NVCV_SWIZZLE_0XZ0,
    NVCV_SWIZZLE_0ZX0,
    NVCV_SWIZZLE_XZY0,
    NVCV_SWIZZLE_YZX1,
    NVCV_SWIZZLE_ZYW1,
    NVCV_SWIZZLE_0YX1,
    NVCV_SWIZZLE_XYXZ,
    NVCV_SWIZZLE_YXZX,
    NVCV_SWIZZLE_XZ00,
    NVCV_SWIZZLE_WYXZ,
    NVCV_SWIZZLE_YX00,
    NVCV_SWIZZLE_YX01,
    NVCV_SWIZZLE_00YX,
    NVCV_SWIZZLE_00XY,
    NVCV_SWIZZLE_0XY1,
    NVCV_SWIZZLE_0X01,
    NVCV_SWIZZLE_YZXW,
    NVCV_SWIZZLE_YW00,
    NVCV_SWIZZLE_XYW0,
    NVCV_SWIZZLE_YZW0,
    NVCV_SWIZZLE_YZ00,
    NVCV_SWIZZLE_00X1,
    NVCV_SWIZZLE_0ZXY,
    NVCV_SWIZZLE_UNSUPPORTED = 0b111111
} NVCVSwizzle;

NVCV_PUBLIC NVCVStatus nvcvMakeSwizzle(NVCVSwizzle *outSwizzle, NVCVChannel x, NVCVChannel y, NVCVChannel z,
                                       NVCVChannel w);

NVCV_PUBLIC NVCVStatus nvcvSwizzleGetChannels(NVCVSwizzle swizzle, NVCVChannel *channels);

NVCV_PUBLIC NVCVStatus nvcvSwizzleGetNumChannels(NVCVSwizzle swizzle, int32_t *outNumChannels);

typedef enum
{
    NVCV_ORDER_LSB,
    NVCV_ORDER_MSB
} NVCVByteOrder;

typedef struct
{
    NVCVByteOrder byteOrder;

    int32_t alignment;

    NVCVSwizzle swizzle;

    int32_t bits[NVCV_MAX_CHANNEL_COUNT];

} NVCVPackingParams;

NVCV_PUBLIC NVCVStatus nvcvMakePacking(NVCVPacking *outPacking, const NVCVPackingParams *params);

NVCV_PUBLIC NVCVStatus nvcvPackingGetParams(NVCVPacking packing, NVCVPackingParams *outParams);

NVCV_PUBLIC NVCVStatus nvcvPackingGetNumComponents(NVCVPacking packing, int32_t *outNumComponents);

NVCV_PUBLIC NVCVStatus nvcvPackingGetBitsPerComponent(NVCVPacking packing, int32_t *outBits);

NVCV_PUBLIC NVCVStatus nvcvPackingGetBitsPerPixel(NVCVPacking packing, int32_t *outBPP);

NVCV_PUBLIC NVCVStatus nvcvPackingGetAlignment(NVCVPacking packing, int32_t *outAlignment);

NVCV_PUBLIC const char *nvcvPackingGetName(NVCVPacking fmt);

NVCV_PUBLIC const char *nvcvDataKindGetName(NVCVDataKind dtype);

NVCV_PUBLIC const char *nvcvMemLayoutGetName(NVCVMemLayout memlayout);

NVCV_PUBLIC const char *nvcvChannelGetName(NVCVChannel channel);

NVCV_PUBLIC const char *nvcvSwizzleGetName(NVCVSwizzle swizzle);

NVCV_PUBLIC const char *nvcvByteOrderGetName(NVCVByteOrder byteOrder);

#ifdef __cplusplus
}
#endif

#endif /* NVCV_FORMAT_DATALAYOUT_H */