Program Listing for File ColorSpec.h

Return to documentation for file (nvcv_types/include/nvcv/ColorSpec.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_COLORSPEC_H
#define NVCV_FORMAT_COLORSPEC_H

#include "detail/FormatUtils.h"

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

#ifdef __cplusplus
extern "C"
{
#endif

typedef enum
{
    NVCV_COLOR_MODEL_UNDEFINED = 0,
    NVCV_COLOR_MODEL_YCbCr     = 1,
    NVCV_COLOR_MODEL_RGB       = 2,
    NVCV_COLOR_MODEL_RAW       = 2 + 7,
    NVCV_COLOR_MODEL_XYZ,
    NVCV_COLOR_MODEL_HSV,
    NVCV_COLOR_MODEL_CMYK,
    NVCV_COLOR_MODEL_YCCK
} NVCVColorModel;

typedef enum
{
    NVCV_COLOR_SPACE_BT601,
    NVCV_COLOR_SPACE_BT709,
    NVCV_COLOR_SPACE_BT2020,
    NVCV_COLOR_SPACE_DCIP3,
} NVCVColorSpace;

typedef enum
{
    NVCV_WHITE_POINT_D65,
    NVCV_WHITE_POINT_FORCE8 = UINT8_MAX
    /* \endcond */
} NVCVWhitePoint;

typedef enum
{
    NVCV_YCbCr_ENC_UNDEFINED = 0,
    NVCV_YCbCr_ENC_BT601,
    NVCV_YCbCr_ENC_BT709,
    NVCV_YCbCr_ENC_BT2020,
    NVCV_YCbCr_ENC_BT2020c,
    NVCV_YCbCr_ENC_SMPTE240M,
} NVCVYCbCrEncoding;

typedef enum
{
    NVCV_COLOR_XFER_LINEAR,
    NVCV_COLOR_XFER_sRGB,
    NVCV_COLOR_XFER_sYCC,
    NVCV_COLOR_XFER_PQ,
    NVCV_COLOR_XFER_BT709,
    NVCV_COLOR_XFER_BT2020,
    NVCV_COLOR_XFER_SMPTE240M,
} NVCVColorTransferFunction;

typedef enum
{
    NVCV_COLOR_RANGE_FULL,
    NVCV_COLOR_RANGE_LIMITED
} NVCVColorRange;

typedef enum
{
    NVCV_CHROMA_LOC_BOTH = 0,
    NVCV_CHROMA_LOC_EVEN,
    NVCV_CHROMA_LOC_CENTER,
    NVCV_CHROMA_LOC_ODD,
} NVCVChromaLocation;

/* clang-format off */
typedef enum
{
    NVCV_COLOR_SPEC_UNDEFINED        = NVCV_DETAIL_MAKE_CSPC(SPACE_BT709,  ENC_UNDEFINED, XFER_LINEAR,    RANGE_FULL,    LOC_BOTH,   LOC_BOTH),

    NVCV_COLOR_SPEC_BT601            = NVCV_DETAIL_MAKE_CSPC(SPACE_BT709,  ENC_BT601,     XFER_BT709,     RANGE_LIMITED, LOC_EVEN,   LOC_EVEN),

    NVCV_COLOR_SPEC_BT601_ER         = NVCV_DETAIL_MAKE_CSPC(SPACE_BT709,  ENC_BT601,     XFER_BT709,     RANGE_FULL,    LOC_EVEN,   LOC_EVEN),

    NVCV_COLOR_SPEC_BT709            = NVCV_DETAIL_MAKE_CSPC(SPACE_BT709,  ENC_BT709,     XFER_BT709,     RANGE_LIMITED, LOC_EVEN,   LOC_EVEN),

    NVCV_COLOR_SPEC_BT709_ER         = NVCV_DETAIL_MAKE_CSPC(SPACE_BT709,  ENC_BT709,     XFER_BT709,     RANGE_FULL,    LOC_EVEN,   LOC_EVEN),

    NVCV_COLOR_SPEC_BT709_LINEAR     = NVCV_DETAIL_MAKE_CSPC(SPACE_BT709,  ENC_BT709,     XFER_LINEAR,    RANGE_LIMITED, LOC_EVEN,   LOC_EVEN),

    NVCV_COLOR_SPEC_BT2020           = NVCV_DETAIL_MAKE_CSPC(SPACE_BT2020, ENC_BT2020,    XFER_BT2020,    RANGE_LIMITED, LOC_EVEN,   LOC_EVEN),

    NVCV_COLOR_SPEC_BT2020_ER        = NVCV_DETAIL_MAKE_CSPC(SPACE_BT2020, ENC_BT2020,    XFER_BT2020,    RANGE_FULL,    LOC_EVEN,   LOC_EVEN),

    NVCV_COLOR_SPEC_BT2020_LINEAR    = NVCV_DETAIL_MAKE_CSPC(SPACE_BT2020, ENC_BT2020,    XFER_LINEAR,    RANGE_LIMITED, LOC_EVEN,   LOC_EVEN),

    NVCV_COLOR_SPEC_BT2020_PQ        = NVCV_DETAIL_MAKE_CSPC(SPACE_BT2020, ENC_BT2020,    XFER_PQ,        RANGE_LIMITED, LOC_EVEN,   LOC_EVEN),

    NVCV_COLOR_SPEC_BT2020_PQ_ER     = NVCV_DETAIL_MAKE_CSPC(SPACE_BT2020, ENC_BT2020,    XFER_PQ,        RANGE_FULL,    LOC_EVEN,   LOC_EVEN),

    NVCV_COLOR_SPEC_BT2020c          = NVCV_DETAIL_MAKE_CSPC(SPACE_BT2020, ENC_BT2020c,   XFER_BT2020,    RANGE_LIMITED, LOC_EVEN,   LOC_EVEN),

    NVCV_COLOR_SPEC_BT2020c_ER       = NVCV_DETAIL_MAKE_CSPC(SPACE_BT2020, ENC_BT2020c,   XFER_BT2020,    RANGE_FULL,    LOC_EVEN,   LOC_EVEN),

    NVCV_COLOR_SPEC_MPEG2_BT601      = NVCV_DETAIL_MAKE_CSPC(SPACE_BT709,  ENC_BT601,     XFER_BT709,     RANGE_FULL,    LOC_EVEN,   LOC_CENTER),

    NVCV_COLOR_SPEC_MPEG2_BT709      = NVCV_DETAIL_MAKE_CSPC(SPACE_BT709,  ENC_BT709,     XFER_BT709,     RANGE_FULL,    LOC_EVEN,   LOC_CENTER),

    NVCV_COLOR_SPEC_MPEG2_SMPTE240M  = NVCV_DETAIL_MAKE_CSPC(SPACE_BT709,  ENC_SMPTE240M, XFER_SMPTE240M, RANGE_FULL,    LOC_EVEN,   LOC_CENTER),

    NVCV_COLOR_SPEC_sRGB             = NVCV_DETAIL_MAKE_CSPC(SPACE_BT709,  ENC_UNDEFINED, XFER_sRGB,      RANGE_FULL,    LOC_BOTH,   LOC_BOTH),

    NVCV_COLOR_SPEC_sYCC             = NVCV_DETAIL_MAKE_CSPC(SPACE_BT709,  ENC_BT601,     XFER_sYCC,      RANGE_FULL,    LOC_CENTER, LOC_CENTER),

    NVCV_COLOR_SPEC_SMPTE240M        = NVCV_DETAIL_MAKE_CSPC(SPACE_BT709,  ENC_SMPTE240M, XFER_SMPTE240M, RANGE_LIMITED, LOC_EVEN,   LOC_EVEN),

    NVCV_COLOR_SPEC_DISPLAYP3        = NVCV_DETAIL_MAKE_CSPC(SPACE_DCIP3,  ENC_UNDEFINED, XFER_sRGB,      RANGE_FULL,    LOC_BOTH,   LOC_BOTH),

    NVCV_COLOR_SPEC_DISPLAYP3_LINEAR = NVCV_DETAIL_MAKE_CSPC(SPACE_DCIP3,  ENC_UNDEFINED, XFER_LINEAR,    RANGE_FULL,    LOC_BOTH,   LOC_BOTH),

    NVCV_COLOR_SPEC_FORCE32 = INT32_MAX
    /* \endcond */
} NVCVColorSpec;

/* clang-format on */

#ifdef NVCV_DOXYGEN
#    define NVCV_MAKE_COLOR_SPEC(cspace, encoding, xferFunc, range, locHoriz, locVert)
#else
#    define NVCV_MAKE_COLOR_SPEC (NVCVColorSpec) NVCV_DETAIL_MAKE_COLOR_SPEC
#endif

NVCV_PUBLIC NVCVStatus nvcvMakeColorSpec(NVCVColorSpec *outColorSpec, NVCVColorSpace cspace, NVCVYCbCrEncoding encoding,
                                         NVCVColorTransferFunction xferFunc, NVCVColorRange range,
                                         NVCVChromaLocation locHoriz, NVCVChromaLocation locVert);

typedef enum
{
    NVCV_RAW_BAYER_RGGB,
    NVCV_RAW_BAYER_BGGR,
    NVCV_RAW_BAYER_GRBG,
    NVCV_RAW_BAYER_GBRG,

    NVCV_RAW_BAYER_RCCB,
    NVCV_RAW_BAYER_BCCR,
    NVCV_RAW_BAYER_CRBC,
    NVCV_RAW_BAYER_CBRC,

    NVCV_RAW_BAYER_RCCC,
    NVCV_RAW_BAYER_CRCC,
    NVCV_RAW_BAYER_CCRC,
    NVCV_RAW_BAYER_CCCR,

    NVCV_RAW_BAYER_CCCC,

    NVCV_RAW_FORCE8 = UINT8_MAX
    /* \endcond */
} NVCVRawPattern;

typedef enum
{
    NVCV_CSS_NONE = 0,

    NVCV_CSS_444 = NVCV_CSS_NONE,

    NVCV_CSS_422,

    NVCV_CSS_422R,

    NVCV_CSS_411,

    NVCV_CSS_411R,

    NVCV_CSS_420,

    NVCV_CSS_440 = NVCV_CSS_422R,

    NVCV_CSS_410,

    NVCV_CSS_410R
} NVCVChromaSubsampling;

NVCV_PUBLIC NVCVStatus nvcvMakeChromaSubsampling(NVCVChromaSubsampling *outCSS, int32_t samplesHoriz,
                                                 int32_t samplesVert);

NVCV_PUBLIC NVCVStatus nvcvChromaSubsamplingGetNumSamples(NVCVChromaSubsampling css, int32_t *outSamplesHoriz,
                                                          int32_t *outSamplesVert);

NVCV_PUBLIC NVCVStatus nvcvColorSpecGetChromaLoc(NVCVColorSpec cspec, NVCVChromaLocation *outLocHoriz,
                                                 NVCVChromaLocation *outLocVert);

NVCV_PUBLIC NVCVStatus nvcvColorSpecSetChromaLoc(NVCVColorSpec *cspec, NVCVChromaLocation locHoriz,
                                                 NVCVChromaLocation locVert);

NVCV_PUBLIC NVCVStatus nvcvColorSpecGetColorSpace(NVCVColorSpec cspec, NVCVColorSpace *outColorSpace);

NVCV_PUBLIC NVCVStatus nvcvColorSpecSetColorSpace(NVCVColorSpec *cspec, NVCVColorSpace cspace);

NVCV_PUBLIC NVCVStatus nvcvColorSpecGetYCbCrEncoding(NVCVColorSpec cspec, NVCVYCbCrEncoding *outEncoding);

NVCV_PUBLIC NVCVStatus nvcvColorSpecSetYCbCrEncoding(NVCVColorSpec *cspec, NVCVYCbCrEncoding encoding);

NVCV_PUBLIC NVCVStatus nvcvColorSpecGetColorTransferFunction(NVCVColorSpec              cspec,
                                                             NVCVColorTransferFunction *outXferFunc);

NVCV_PUBLIC NVCVStatus nvcvColorSpecSetColorTransferFunction(NVCVColorSpec *cspec, NVCVColorTransferFunction xferFunc);

NVCV_PUBLIC NVCVStatus nvcvColorSpecGetRange(NVCVColorSpec cspec, NVCVColorRange *outColorRange);

NVCV_PUBLIC NVCVStatus nvcvColorSpecSetRange(NVCVColorSpec *cspec, NVCVColorRange range);

NVCV_PUBLIC const char *nvcvColorSpecGetName(NVCVColorSpec cspec);

NVCV_PUBLIC NVCVStatus nvcvColorModelNeedsColorspec(NVCVColorModel cmodel, int8_t *outBool);

NVCV_PUBLIC const char *nvcvColorModelGetName(NVCVColorModel cmodel);

NVCV_PUBLIC const char *nvcvColorSpaceGetName(NVCVColorSpace cspace);

NVCV_PUBLIC const char *nvcvWhitePointGetName(NVCVWhitePoint wpoint);

NVCV_PUBLIC const char *nvcvYCbCrEncodingGetName(NVCVYCbCrEncoding enc);

NVCV_PUBLIC const char *nvcvColorTransferFunctionGetName(NVCVColorTransferFunction xfer);

NVCV_PUBLIC const char *nvcvColorRangeGetName(NVCVColorRange range);

NVCV_PUBLIC const char *nvcvChromaLocationGetName(NVCVChromaLocation loc);

NVCV_PUBLIC const char *nvcvRawPatternGetName(NVCVRawPattern raw);

NVCV_PUBLIC const char *nvcvChromaSubsamplingGetName(NVCVChromaSubsampling css);

#ifdef __cplusplus
}
#endif

#endif /* NVCV_FORMAT_COLORSPEC_H */