741 lines
26 KiB
C++
741 lines
26 KiB
C++
/* SPDX-License-Identifier: MIT */
|
|
/**
|
|
@file ntv2transcode.h
|
|
@brief Declares a number of pixel format transcoder functions.
|
|
@copyright (C) 2004-2021 AJA Video Systems, Inc.
|
|
**/
|
|
|
|
#ifndef NTV2TRANSCODE_H
|
|
#define NTV2TRANSCODE_H
|
|
#include "ajaexport.h"
|
|
#include "ajatypes.h"
|
|
#include "ntv2fixed.h"
|
|
#include "ntv2videodefines.h"
|
|
#include <vector>
|
|
|
|
// TODO: DEBUG ONLY
|
|
#include <stdio.h>
|
|
|
|
|
|
/**
|
|
@brief Converts a single 8-bit YCbCr '2vuy' raster line to 10-bit YCbCr 'v210' (from NTV2_FBF_8BIT_YCBCR to NTV2_FBF_10BIT_YCBCR ).
|
|
@param[in] pInSrcLine_2vuy Specifies a valid, non-NULL address of the first byte of the '2vuy'
|
|
raster line to be converted.
|
|
@param[out] pOutDstLine_v210 Specifies a valid, non-NULL address of the first byte of the 'v210'
|
|
raster line to receive the converted data.
|
|
@param[in] inNumPixels The number of pixels to be converted.
|
|
@return True if successful; otherwise false.
|
|
**/
|
|
AJAExport bool ConvertLine_2vuy_to_v210 (const UByte * pInSrcLine_2vuy, ULWord * pOutDstLine_v210, const ULWord inNumPixels);
|
|
|
|
/**
|
|
@brief Converts a single 8-bit YCbCr '2vuy' raster line to 10-bit YCbCr 'v210' (from NTV2_FBF_8BIT_YCBCR to NTV2_FBF_8BIT_YCBCR_YUY2 ).
|
|
@param[in] pInSrcLine_2vuy Specifies a valid, non-NULL address of the first byte of the '2vuy'
|
|
raster line to be converted.
|
|
@param[out] pOutDstLine_yuy2 Specifies a valid, non-NULL address of the first byte of the 'YUY2'
|
|
raster line to receive the converted data.
|
|
@param[in] inNumPixels The number of pixels to be converted.
|
|
@return True if successful; otherwise false.
|
|
**/
|
|
AJAExport bool ConvertLine_2vuy_to_yuy2 (const UByte * pInSrcLine_2vuy, UWord * pOutDstLine_yuy2, const ULWord inNumPixels);
|
|
|
|
/**
|
|
@brief Converts a single 10-bit YCbCr 'v210' raster line to 8-bit YCbCr '2vuy'.
|
|
@param[in] pInSrcLine_v210 Specifies a valid, non-NULL address of the first byte of the 'v210'
|
|
raster line to be converted.
|
|
@param[out] pOutDstLine_2vuy Specifies a valid, non-NULL address of the first byte of the '2vuy'
|
|
raster line to receive the converted data.
|
|
@param[in] inNumPixels The number of pixels to be converted.
|
|
@return True if successful; otherwise false.
|
|
**/
|
|
AJAExport bool ConvertLine_v210_to_2vuy (const ULWord * pInSrcLine_v210, UByte * pOutDstLine_2vuy, const ULWord inNumPixels);
|
|
|
|
/**
|
|
@brief Converts a single 10-bit YCbCr 'v210' raster line to 8-bit YCbCr '2vuy' vector.
|
|
@param[in] pInSrcLine_v210 Specifies a valid, non-NULL address of the first byte of the 'v210' raster line to be converted.
|
|
@param[out] outDstLine2vuy Receives the 8-bit '2vuy' vector. Will be cleared upon entry and filled upon exit.
|
|
@param[in] inNumPixels The number of pixels to be converted.
|
|
@return True if successful; otherwise false.
|
|
**/
|
|
AJAExport bool ConvertLine_v210_to_2vuy (const void * pInSrcLine_v210, std::vector<uint8_t> & outDstLine2vuy, const ULWord inNumPixels);
|
|
|
|
/**
|
|
@brief Converts a single 8-bit ABGR raster line to 10-bit ABGR (from NTV2_FBF_ABGR to NTV2_FBF_10BIT_RGB ).
|
|
@param[in] pInSrcLine_8bitABGR Specifies a valid, non-NULL address of the first byte of the 8-bit ABGR raster line to be converted.
|
|
@param[out] pOutDstLine_10BitABGR Specifies a valid, non-NULL address of the first byte of the 10-bit ABGR raster line to receive the converted data.
|
|
@param[in] inNumPixels The number of pixels to be converted.
|
|
@return True if successful; otherwise false.
|
|
**/
|
|
AJAExport bool ConvertLine_8bitABGR_to_10bitABGR (const UByte * pInSrcLine_8bitABGR, ULWord * pOutDstLine_10BitABGR, const ULWord inNumPixels);
|
|
|
|
/**
|
|
@brief Converts a single 8-bit ABGR raster line to 10-bit RGB DPX (from NTV2_FBF_ABGR to NTV2_FBF_10BIT_DPX ).
|
|
@param[in] pInSrcLine_8bitABGR Specifies a valid, non-NULL address of the first byte of the 8-bit ABGR raster line to be converted.
|
|
@param[out] pOutDstLine_10BitDPX Specifies a valid, non-NULL address of the first byte of the 10-bit RGB DPX raster line to receive the converted data.
|
|
@param[in] inNumPixels The number of pixels to be converted.
|
|
@return True if successful; otherwise false.
|
|
**/
|
|
AJAExport bool ConvertLine_8bitABGR_to_10bitRGBDPX (const UByte * pInSrcLine_8bitABGR, ULWord * pOutDstLine_10BitDPX, const ULWord inNumPixels);
|
|
|
|
/**
|
|
@brief Converts a single 8-bit ABGR raster line to 10-bit RGB DPX (from NTV2_FBF_ABGR to NTV2_FBF_10BIT_DPX_LE ).
|
|
@param[in] pInSrcLine_8bitABGR Specifies a valid, non-NULL address of the first byte of the 8-bit ABGR raster line to be converted.
|
|
@param[out] pOutDstLine_10BitDPXLE Specifies a valid, non-NULL address of the first byte of the 10-bit RGB DPX LE raster line to receive the converted data.
|
|
@param[in] inNumPixels The number of pixels to be converted.
|
|
@return True if successful; otherwise false.
|
|
**/
|
|
AJAExport bool ConvertLine_8bitABGR_to_10bitRGBDPXLE (const UByte * pInSrcLine_8bitABGR, ULWord * pOutDstLine_10BitDPXLE, const ULWord inNumPixels);
|
|
|
|
/**
|
|
@brief Converts a single 8-bit ABGR raster line to 24-bit RGB (from NTV2_FBF_ABGR to NTV2_FBF_24BIT_RGB ).
|
|
@param[in] pInSrcLine_8bitABGR Specifies a valid, non-NULL address of the first byte of the 8-bit ABGR raster line to be converted.
|
|
@param[out] pOutDstLine_24BitRGB Specifies a valid, non-NULL address of the first byte of the 24-bit RGB raster line to receive the converted data.
|
|
@param[in] inNumPixels The number of pixels to be converted.
|
|
@return True if successful; otherwise false.
|
|
**/
|
|
AJAExport bool ConvertLine_8bitABGR_to_24bitRGB (const UByte * pInSrcLine_8bitABGR, UByte * pOutDstLine_24BitRGB, const ULWord inNumPixels);
|
|
|
|
/**
|
|
@brief Converts a single 8-bit ABGR raster line to 24-bit BGR (from NTV2_FBF_ABGR to NTV2_FBF_24BIT_BGR ).
|
|
@param[in] pInSrcLine_8bitABGR Specifies a valid, non-NULL address of the first byte of the 8-bit ABGR raster line to be converted.
|
|
@param[out] pOutDstLine_24BitBGR Specifies a valid, non-NULL address of the first byte of the 24-bit BGR raster line to receive the converted data.
|
|
@param[in] inNumPixels The number of pixels to be converted.
|
|
@return True if successful; otherwise false.
|
|
**/
|
|
AJAExport bool ConvertLine_8bitABGR_to_24bitBGR (const UByte * pInSrcLine_8bitABGR, UByte * pOutDstLine_24BitBGR, const ULWord inNumPixels);
|
|
|
|
/**
|
|
@brief Converts a single 8-bit ABGR raster line to 48-bit RGB (from NTV2_FBF_ABGR to NTV2_FBF_48BIT_RGB ).
|
|
@param[in] pInSrcLine_8bitABGR Specifies a valid, non-NULL address of the first byte of the 8-bit ABGR raster line to be converted.
|
|
@param[out] pOutDstLine_48BitRGB Specifies a valid, non-NULL address of the first byte of the 48-bit RGB raster line to receive the converted data.
|
|
@param[in] inNumPixels The number of pixels to be converted.
|
|
@return True if successful; otherwise false.
|
|
**/
|
|
AJAExport bool ConvertLine_8bitABGR_to_48bitRGB (const UByte * pInSrcLine_8bitABGR, ULWord * pOutDstLine_48BitRGB, const ULWord inNumPixels);
|
|
|
|
|
|
// ConvertLineToYCbCr422
|
|
// 8 Bit
|
|
AJAExport void ConvertLineToYCbCr422 (RGBAlphaPixel * RGBLine,
|
|
UByte * YCbCrLine,
|
|
LWord numPixels ,
|
|
LWord startPixel,
|
|
bool fUseSDMatrix);
|
|
|
|
// ConvertLineToYCbCr422
|
|
// 10 Bit
|
|
AJAExport void ConvertLineToYCbCr422 (RGBAlphaPixel * RGBLine,
|
|
UWord * YCbCrLine,
|
|
LWord numPixels,
|
|
LWord startPixel,
|
|
bool fUseSDMatrix);
|
|
|
|
// ConvertLinetoRGB
|
|
// 8 Bit Version
|
|
AJAExport void ConvertLinetoRGB (UByte * ycbcrBuffer,
|
|
RGBAlphaPixel * rgbaBuffer ,
|
|
ULWord numPixels,
|
|
bool fUseSDMatrix,
|
|
bool fUseSMPTERange = false);
|
|
|
|
// ConvertLinetoRGB
|
|
// 10 Bit Version
|
|
AJAExport void ConvertLinetoRGB (UWord * ycbcrBuffer,
|
|
RGBAlphaPixel * rgbaBuffer,
|
|
ULWord numPixels,
|
|
bool fUseSDMatrix,
|
|
bool fUseSMPTERange = false,
|
|
bool fAlphaFromLuma = false);
|
|
|
|
// ConvertLineto10BitRGB
|
|
// 10 Bit YCbCr and 10 Bit RGB Version
|
|
AJAExport void ConvertLineto10BitRGB (UWord * ycbcrBuffer,
|
|
RGBAlpha10BitPixel * rgbaBuffer,
|
|
ULWord numPixels,
|
|
bool fUseSDMatrix,
|
|
bool fUseSMPTERange = false);
|
|
// ConvertLineto10BitYCbCrA
|
|
// 10 Bit YCbCr to 10 Bit YCbCrA
|
|
AJAExport void ConvertLineto10BitYCbCrA (const UWord * pInYCbCrBuffer,
|
|
ULWord * pOutYCbCrABuffer,
|
|
const ULWord inNumPixels);
|
|
|
|
// ConvertRGBLineto10BitRGB
|
|
// 8 Bit RGB and 10 Bit RGB Version
|
|
AJAExport void ConvertRGBLineto10BitRGB (const RGBAlphaPixel * pInRGBA8Buffer,
|
|
RGBAlpha10BitPixel * pOutRGBA10Buffer,
|
|
const ULWord inNumPixels);
|
|
|
|
// ConvertRGBALineToRGB
|
|
// 8 bit RGBA to 8 bit RGB (RGB24)
|
|
// Conversion is done into the same buffer
|
|
AJAExport void ConvertRGBALineToRGB (RGBAlphaPixel * rgbaBuffer,
|
|
ULWord numPixels);
|
|
|
|
// ConvertRGBALineToBGR
|
|
// 8 bit RGBA to 8 bit BGR (BGR24)
|
|
// Conversion is done into the same buffer
|
|
AJAExport void ConvertRGBALineToBGR (RGBAlphaPixel * rgbaBuffer,
|
|
ULWord numPixels);
|
|
|
|
// ConvertLineto10BitRGB
|
|
// 8 Bit RGBA to and 10 Bit RGB Packed Version
|
|
AJAExport void ConvertLineto10BitRGB (const RGBAlphaPixel * pInRGBA8Buffer,
|
|
ULWord * pOutRGB10BitBuffer,
|
|
ULWord inNumPixels);
|
|
|
|
// ConvertLineto8BitYCbCr
|
|
// 10 Bit YCbCr to 8 Bit YCbCr
|
|
AJAExport void ConvertLineto8BitYCbCr (UWord * ycbcr10BitBuffer,
|
|
UByte * ycbcr8BitBuffer,
|
|
ULWord numPixels);
|
|
|
|
// Converts UYVY(2yuv) -> YUY2(yuv2) in place
|
|
AJAExport void Convert8BitYCbCrToYUY2 (UByte * ycbcrBuffer,
|
|
ULWord numPixels);
|
|
|
|
// Converts 8 Bit ARGB 8 Bit RGBA in place
|
|
AJAExport void ConvertARGBYCbCrToRGBA (UByte * rgbaBuffer,
|
|
ULWord numPixels);
|
|
|
|
|
|
// Converts 8 Bit ARGB 8 Bit ABGR in place
|
|
AJAExport void ConvertARGBYCbCrToABGR (UByte * rgbaBuffer,
|
|
ULWord numPixels);
|
|
|
|
// Convert 8 Bit ARGB to 8 bit RGB
|
|
AJAExport void ConvertARGBToRGB (UByte * rgbaLineBuffer,
|
|
UByte * rgbLineBuffer,
|
|
ULWord numPixels);
|
|
|
|
// Convert 16 Bit ARGB to 16 bit RGB
|
|
AJAExport void Convert16BitARGBTo16BitRGBEx (UWord * rgbaLineBuffer,
|
|
UWord * rgbLineBuffer,
|
|
ULWord numPixels);
|
|
|
|
// Convert 16 Bit ARGB to 16 bit RGB
|
|
AJAExport void Convert16BitARGBTo16BitRGB (RGBAlpha16BitPixel * rgbaLineBuffer,
|
|
UWord * rgbLineBuffer,
|
|
ULWord numPixels);
|
|
|
|
// Convert 16 Bit ARGB to 12 bit RGB Packed // New in SDK 15.5
|
|
AJAExport void Convert16BitARGBTo12BitRGBPacked(RGBAlpha16BitPixel *rgbaLineBuffer ,
|
|
UByte * rgbLineBuffer,
|
|
ULWord numPixels);
|
|
|
|
// Convert 8 Bit ARGB to 8 bit BGR
|
|
AJAExport void ConvertARGBToBGR (const UByte * pInRGBALineBuffer,
|
|
UByte * pOutRGBLineBuffer,
|
|
const ULWord inNumPixels);
|
|
|
|
// ConvertLineto16BitRGB
|
|
// 10 Bit YCbCr and 16 Bit RGB Version
|
|
AJAExport void ConvertLineto16BitRGB (UWord * ycbcrBuffer,
|
|
RGBAlpha16BitPixel * rgbaBuffer,
|
|
ULWord numPixels,
|
|
bool fUseSDMatrix,
|
|
bool fUseSMPTERange = false);
|
|
|
|
/*
|
|
// ConvertLinetoRGB
|
|
// 10 Bit YCbCr Version -> 10 Bit RGB
|
|
AJAExport
|
|
void ConvertLinetoRGB(UWord * ycbcrBuffer,
|
|
RGBAlpha10BitPixel * rgbaBuffer,
|
|
ULWord numPixels);
|
|
*/
|
|
|
|
// Pack 10 Bit RGBA to 10 Bit RGB Format for our board
|
|
AJAExport void PackRGB10BitFor10BitRGB (RGBAlpha10BitPixel * pBuffer,
|
|
const ULWord inNumPixels);
|
|
|
|
// Pack 10 Bit RGBA to 10 Bit DPX Format for our board
|
|
AJAExport void PackRGB10BitFor10BitDPX (RGBAlpha10BitPixel * pBuffer,
|
|
const ULWord inNumPixels,
|
|
const bool bigEndian = true);
|
|
|
|
// Pack 10 Bit RGBA to NTV2_FBF_10BIT_RGB_PACKED Format for our board
|
|
AJAExport void PackRGB10BitFor10BitRGBPacked (RGBAlpha10BitPixel * pBuffer,
|
|
const ULWord inNumPixels);
|
|
|
|
|
|
inline void SDConvertRGBAlphatoYCbCr(RGBAlphaPixel * pSource, YCbCrPixel * pTarget)
|
|
{
|
|
LWord Y,Cb,Cr;
|
|
|
|
Y = CCIR601_8BIT_BLACK + FixedRound((Fixed_)0x41BC*pSource->Red +
|
|
(Fixed_)0x810F*pSource->Green +
|
|
(Fixed_)0x1910*pSource->Blue );
|
|
pTarget->y = (UByte)Y;
|
|
|
|
Cb = CCIR601_8BIT_CHROMAOFFSET + FixedRound((Fixed_)-0x25F1*pSource->Red -
|
|
(Fixed_)0x4A7E*pSource->Green +
|
|
(Fixed_)0x7070*pSource->Blue );
|
|
|
|
pTarget->cb = (UByte)Cb;
|
|
|
|
Cr = CCIR601_8BIT_CHROMAOFFSET + FixedRound((Fixed_)0x7070*pSource->Red -
|
|
(Fixed_)0x5E27*pSource->Green -
|
|
(Fixed_)0x1249*pSource->Blue );
|
|
|
|
pTarget->cr = (UByte)Cr;
|
|
}
|
|
|
|
inline void HDConvertRGBAlphatoYCbCr(RGBAlphaPixel * pSource, YCbCrPixel * pTarget)
|
|
{
|
|
LWord Y,Cb,Cr;
|
|
|
|
Y = CCIR601_8BIT_BLACK + FixedRound((Fixed_)0x2E8A*pSource->Red +
|
|
(Fixed_)0x9C9F*pSource->Green +
|
|
(Fixed_)0x0FD2*pSource->Blue );
|
|
pTarget->y = UByte(Y);
|
|
|
|
Cb = CCIR601_8BIT_CHROMAOFFSET + FixedRound((Fixed_)-0x18F4*pSource->Red -
|
|
(Fixed_)0x545B*pSource->Green +
|
|
(Fixed_)0x6DA9*pSource->Blue );
|
|
|
|
pTarget->cb = uint8_t(SByte(Cb));
|
|
|
|
Cr = CCIR601_8BIT_CHROMAOFFSET + FixedRound((Fixed_)0x6D71*pSource->Red -
|
|
(Fixed_)0x6305*pSource->Green -
|
|
(Fixed_)0x0A06*pSource->Blue );
|
|
|
|
pTarget->cr = uint8_t(SByte(Cr));
|
|
}
|
|
|
|
|
|
inline void SDConvertRGBAlphatoYCbCr(const RGBAlphaPixel * pSource, YCbCr10BitPixel * pTarget)
|
|
{
|
|
LWord Y,Cb,Cr;
|
|
|
|
Y = CCIR601_10BIT_BLACK + (((Fixed_)0x41BC*pSource->Red +
|
|
(Fixed_)0x810F*pSource->Green +
|
|
(Fixed_)0x1910*pSource->Blue )>>14);
|
|
pTarget->y = UWord(Y);
|
|
|
|
Cb = CCIR601_10BIT_CHROMAOFFSET + (((Fixed_)-0x25F1*pSource->Red -
|
|
(Fixed_)0x4A7E*pSource->Green +
|
|
(Fixed_)0x7070*pSource->Blue )>>14);
|
|
|
|
pTarget->cb = UWord(Cb&0x3FF);
|
|
|
|
Cr = CCIR601_10BIT_CHROMAOFFSET + (((Fixed_)0x7070*pSource->Red -
|
|
(Fixed_)0x5E27*pSource->Green -
|
|
(Fixed_)0x1249*pSource->Blue )>>14);
|
|
|
|
pTarget->cr = UWord(Cr&0x3FF);
|
|
}
|
|
|
|
inline void HDConvertRGBAlphatoYCbCr(const RGBAlphaPixel * pSource, YCbCr10BitPixel * pTarget)
|
|
{
|
|
LWord Y,Cb,Cr;
|
|
|
|
Y = CCIR601_10BIT_BLACK + (((Fixed_)0x2E8A*pSource->Red +
|
|
(Fixed_)0x9C9F*pSource->Green +
|
|
(Fixed_)0x0FD2*pSource->Blue )>>14);
|
|
pTarget->y = (UWord)Y;
|
|
|
|
Cb = CCIR601_10BIT_CHROMAOFFSET + (((Fixed_)-0x18F4*pSource->Red -
|
|
(Fixed_)0x545B*pSource->Green +
|
|
(Fixed_)0x6DA9*pSource->Blue )>>14);
|
|
|
|
pTarget->cb = UWord(Cb&0x3FF);
|
|
|
|
Cr = CCIR601_10BIT_CHROMAOFFSET + (((Fixed_)0x6D71*pSource->Red -
|
|
(Fixed_)0x6305*pSource->Green -
|
|
(Fixed_)0x0A06*pSource->Blue )>>14);
|
|
|
|
pTarget->cr = UWord(Cr&0x3FF);
|
|
}
|
|
|
|
inline void SDConvertYCbCrtoRGB(YCbCrAlphaPixel *pSource,
|
|
RGBAlphaPixel *pTarget)
|
|
{
|
|
LWord Red,Green,Blue;
|
|
Fixed_ ConvertedY;
|
|
|
|
ConvertedY = 0x12A15*((LWord)pSource->y - CCIR601_8BIT_BLACK);
|
|
|
|
Red = FixedRound(ConvertedY +
|
|
0x19895*((LWord)(pSource->cr-CCIR601_8BIT_CHROMAOFFSET)));
|
|
|
|
pTarget->Red = (UByte)ClipRGB_8BIT(Red);
|
|
|
|
Blue = FixedRound(ConvertedY +
|
|
0x20469*((LWord)(pSource->cb-CCIR601_8BIT_CHROMAOFFSET) ));
|
|
|
|
pTarget->Blue = (UByte)ClipRGB_8BIT(Blue);
|
|
|
|
Green = FixedRound(ConvertedY -
|
|
0x644A*((LWord)(pSource->cb-CCIR601_8BIT_CHROMAOFFSET) ) -
|
|
0xD01F*((LWord)(pSource->cr-CCIR601_8BIT_CHROMAOFFSET) ));
|
|
|
|
pTarget->Green = (UByte)ClipRGB_8BIT(Green);
|
|
|
|
pTarget->Alpha = pSource->Alpha;
|
|
}
|
|
|
|
inline void SDConvert10BitYCbCrtoRGB(const YCbCr10BitAlphaPixel *pSource,
|
|
RGBAlphaPixel *pTarget)
|
|
{
|
|
LWord Red,Green,Blue;
|
|
Fixed_ ConvertedY;
|
|
|
|
ConvertedY = 0x4A86*((LWord)pSource->y - CCIR601_10BIT_BLACK);
|
|
|
|
Red = FixedRound(ConvertedY +
|
|
0x6626*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET)));
|
|
|
|
pTarget->Red = (UByte)ClipRGB_8BIT(Red);
|
|
|
|
Blue = FixedRound(ConvertedY +
|
|
0x811B*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET) ));
|
|
|
|
pTarget->Blue = (UByte)ClipRGB_8BIT(Blue);
|
|
|
|
Green = FixedRound(ConvertedY -
|
|
0x1913*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET) ) -
|
|
0x3408*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET) ));
|
|
|
|
pTarget->Green = (UByte)ClipRGB_8BIT(Green);
|
|
|
|
pTarget->Alpha = (UByte)pSource->Alpha;
|
|
}
|
|
|
|
inline void HDConvertYCbCrtoRGB(YCbCrAlphaPixel *pSource,
|
|
RGBAlphaPixel *pTarget)
|
|
{
|
|
LWord Red,Green,Blue;
|
|
Fixed_ ConvertedY;
|
|
|
|
ConvertedY = 0x12ACF*((LWord)pSource->y - CCIR601_8BIT_BLACK);
|
|
|
|
Red = FixedRound(ConvertedY +
|
|
0x1DF71*((LWord)(pSource->cr-CCIR601_8BIT_CHROMAOFFSET)));
|
|
|
|
pTarget->Red = (UByte)ClipRGB_8BIT(Red);
|
|
|
|
Blue = FixedRound(ConvertedY +
|
|
0x22A86*((LWord)(pSource->cb-CCIR601_8BIT_CHROMAOFFSET) ));
|
|
|
|
pTarget->Blue = (UByte)ClipRGB_8BIT(Blue);
|
|
|
|
Green = FixedRound(ConvertedY -
|
|
0x3806*((LWord)(pSource->cb-CCIR601_8BIT_CHROMAOFFSET) ) -
|
|
0x8C32*((LWord)(pSource->cr-CCIR601_8BIT_CHROMAOFFSET) ));
|
|
|
|
pTarget->Green = (UByte)ClipRGB_8BIT(Green);
|
|
|
|
pTarget->Alpha = pSource->Alpha;
|
|
}
|
|
|
|
inline void HDConvert10BitYCbCrtoRGB(const YCbCr10BitAlphaPixel *pSource,
|
|
RGBAlphaPixel *pTarget)
|
|
{
|
|
LWord Red,Green,Blue;
|
|
Fixed_ ConvertedY;
|
|
|
|
ConvertedY = (0x12ACF>>2)*((LWord)pSource->y - CCIR601_10BIT_BLACK);
|
|
|
|
Red = FixedRound(ConvertedY +
|
|
(0x1DF71>>2)*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET)));
|
|
|
|
pTarget->Red = (UByte)ClipRGB_8BIT(Red);
|
|
|
|
Blue = FixedRound(ConvertedY +
|
|
(0x22A86>>2)*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET) ));
|
|
|
|
pTarget->Blue = (UByte)ClipRGB_8BIT(Blue);
|
|
|
|
Green = FixedRound(ConvertedY -
|
|
(0x3806>>2)*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET) ) -
|
|
(0x8C32>>2)*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET) ));
|
|
|
|
pTarget->Green = (UByte)ClipRGB_8BIT(Green);
|
|
|
|
pTarget->Alpha = (UByte)pSource->Alpha;
|
|
}
|
|
|
|
|
|
inline void SDConvert10BitYCbCrto10BitRGB(YCbCr10BitAlphaPixel *pSource,
|
|
RGBAlpha10BitPixel *pTarget)
|
|
{
|
|
LWord Red,Green,Blue;
|
|
Fixed_ ConvertedY;
|
|
|
|
ConvertedY = 0x12A15*((LWord)pSource->y - CCIR601_10BIT_BLACK);
|
|
|
|
Red = FixedRound(ConvertedY +
|
|
0x19895*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET)));
|
|
|
|
pTarget->Red = (UWord)ClipRGB_10BIT(Red);
|
|
|
|
Blue = FixedRound(ConvertedY +
|
|
0x20469*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET) ));
|
|
|
|
pTarget->Blue = (UWord)ClipRGB_10BIT(Blue);
|
|
|
|
Green = FixedRound(ConvertedY -
|
|
0x644A*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET) ) -
|
|
0xD01F*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET) ));
|
|
|
|
pTarget->Green = (UWord)ClipRGB_10BIT(Green);
|
|
|
|
pTarget->Alpha = pSource->Alpha;
|
|
}
|
|
|
|
inline void HDConvert10BitYCbCrto10BitRGB(YCbCr10BitAlphaPixel *pSource,
|
|
RGBAlpha10BitPixel *pTarget)
|
|
{
|
|
LWord Red,Green,Blue;
|
|
Fixed_ ConvertedY;
|
|
|
|
ConvertedY = 0x12ACF*((LWord)pSource->y - CCIR601_10BIT_BLACK);
|
|
|
|
Red = FixedRound(ConvertedY +
|
|
0x1DF71*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET)));
|
|
|
|
pTarget->Red = (UWord)ClipRGB_10BIT(Red);
|
|
|
|
Blue = FixedRound(ConvertedY +
|
|
0x22A86*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET) ));
|
|
|
|
pTarget->Blue = (UWord)ClipRGB_10BIT(Blue);
|
|
|
|
Green = FixedRound(ConvertedY -
|
|
0x3806*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET) ) -
|
|
0x8C32*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET) ));
|
|
|
|
pTarget->Green = (UWord)ClipRGB_10BIT(Green);
|
|
|
|
pTarget->Alpha = pSource->Alpha;
|
|
}
|
|
|
|
// KAM - start
|
|
inline void SDConvert10BitYCbCrto16BitRGB(YCbCr10BitAlphaPixel *pSource,
|
|
RGBAlpha16BitPixel *pTarget)
|
|
{
|
|
ULWord Red,Green,Blue;
|
|
Fixed_ ConvertedY;
|
|
|
|
ConvertedY = 0x12A15*((LWord)pSource->y - CCIR601_10BIT_BLACK);
|
|
|
|
Red = ULWord(FixedRound(ConvertedY +
|
|
0x19895*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET))));
|
|
|
|
//Red = Red<<4; // only 12 bits used, put them in the MSB
|
|
pTarget->Red = (UWord)ClipRGB_16BIT(Red<<6); // TBD: fix coefficents instead
|
|
|
|
Blue = ULWord(FixedRound(ConvertedY +
|
|
0x20469*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET) )));
|
|
|
|
//Blue = Blue<<4; // only 12 bits used, put them in the MSB
|
|
pTarget->Blue = (UWord)ClipRGB_16BIT(Blue<<6); // TBD: fix coefficents instead
|
|
|
|
Green = ULWord(FixedRound(ConvertedY -
|
|
0x644A*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET) ) -
|
|
0xD01F*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET) )));
|
|
|
|
//Green = Green<<4; // only 12 bits used, put them in the MSB
|
|
pTarget->Green = (UWord)ClipRGB_16BIT(Green<<6); // TBD: fix coefficents instead
|
|
|
|
// TBD: shift alpha???
|
|
pTarget->Alpha = pSource->Alpha;
|
|
}
|
|
|
|
inline void HDConvert10BitYCbCrto16BitRGB(YCbCr10BitAlphaPixel *pSource,
|
|
RGBAlpha16BitPixel *pTarget)
|
|
{
|
|
ULWord Red,Green,Blue;
|
|
Fixed_ ConvertedY;
|
|
|
|
ConvertedY = 0x12ACF*((LWord)pSource->y - CCIR601_10BIT_BLACK);
|
|
|
|
Red = ULWord(FixedRound(ConvertedY +
|
|
0x1DF71*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET))));
|
|
|
|
//Red = Red<<4; // only 12 bits used, put them in the MSB
|
|
pTarget->Red = (UWord)ClipRGB_16BIT(Red); // TBD: fix coefficents instead
|
|
|
|
Blue = ULWord(FixedRound(ConvertedY +
|
|
0x22A86*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET) )));
|
|
|
|
//Blue = Blue<<4; // only 12 bits used, put them in the MSB
|
|
pTarget->Blue = (UWord)ClipRGB_16BIT(Blue); // TBD: fix coefficents instead
|
|
|
|
Green = ULWord(FixedRound(ConvertedY -
|
|
0x3806*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET) ) -
|
|
0x8C32*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET) )));
|
|
|
|
//Green = Green<<4; // only 12 bits used, put them in the MSB
|
|
pTarget->Green = (UWord)ClipRGB_16BIT(Green); // TBD: fix coefficents instead
|
|
|
|
// TBD: shift alpha???
|
|
pTarget->Alpha = pSource->Alpha;
|
|
}
|
|
|
|
inline void SDConvertYCbCrtoRGBSmpte(YCbCrAlphaPixel *pSource,
|
|
RGBAlphaPixel *pTarget)
|
|
{
|
|
LWord Red,Green,Blue;
|
|
Fixed_ ConvertedY;
|
|
|
|
ConvertedY = 0xFF40*((LWord)pSource->y - CCIR601_8BIT_BLACK);
|
|
|
|
Red = FixedRound(ConvertedY +
|
|
0x15DDF*((LWord)(pSource->cr-CCIR601_8BIT_CHROMAOFFSET))) + CCIR601_8BIT_BLACK;
|
|
|
|
pTarget->Red = (UByte)ClipRGB_8BIT(Red);
|
|
|
|
Blue = FixedRound(ConvertedY +
|
|
0x1BA34*((LWord)(pSource->cb-CCIR601_8BIT_CHROMAOFFSET))) + CCIR601_8BIT_BLACK;
|
|
|
|
pTarget->Blue = (UByte)ClipRGB_8BIT(Blue);
|
|
|
|
Green = FixedRound(ConvertedY -
|
|
0x55E1*((LWord)(pSource->cb-CCIR601_8BIT_CHROMAOFFSET)) -
|
|
0xB237*((LWord)(pSource->cr-CCIR601_8BIT_CHROMAOFFSET))) + CCIR601_8BIT_BLACK;
|
|
|
|
pTarget->Green = (UByte)ClipRGB_8BIT(Green);
|
|
|
|
pTarget->Alpha = pSource->Alpha;
|
|
}
|
|
|
|
inline void SDConvert10BitYCbCrtoRGBSmpte(YCbCr10BitAlphaPixel *pSource,
|
|
RGBAlphaPixel *pTarget)
|
|
{
|
|
LWord Red,Green,Blue;
|
|
Fixed_ ConvertedY;
|
|
|
|
ConvertedY = 0x3FD1*((LWord)pSource->y - CCIR601_10BIT_BLACK);
|
|
|
|
Red = FixedRound(ConvertedY +
|
|
0x5778*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET))) + CCIR601_8BIT_BLACK;
|
|
|
|
pTarget->Red = (UByte)ClipRGB_8BIT(Red);
|
|
|
|
Blue = FixedRound(ConvertedY +
|
|
0x6E8E*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET))) + CCIR601_8BIT_BLACK;
|
|
|
|
pTarget->Blue = (UByte)ClipRGB_8BIT(Blue);
|
|
|
|
Green = FixedRound(ConvertedY -
|
|
0x1579*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET)) -
|
|
0x2C8E*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET))) + CCIR601_8BIT_BLACK;
|
|
|
|
pTarget->Green = (UByte)ClipRGB_8BIT(Green);
|
|
|
|
pTarget->Alpha = (UByte)pSource->Alpha;
|
|
}
|
|
|
|
inline void HDConvertYCbCrtoRGBSmpte(YCbCrAlphaPixel *pSource,
|
|
RGBAlphaPixel *pTarget)
|
|
{
|
|
LWord Red,Green,Blue;
|
|
Fixed_ ConvertedY;
|
|
|
|
ConvertedY = 0xFFDF*((LWord)pSource->y - CCIR601_8BIT_BLACK);
|
|
|
|
Red = FixedRound(ConvertedY +
|
|
0x19A8C*((LWord)(pSource->cr-CCIR601_8BIT_CHROMAOFFSET))) + CCIR601_8BIT_BLACK;
|
|
|
|
pTarget->Red = (UByte)ClipRGB_8BIT(Red);
|
|
|
|
Blue = FixedRound(ConvertedY +
|
|
0x1DAD7*((LWord)(pSource->cb-CCIR601_8BIT_CHROMAOFFSET))) + CCIR601_8BIT_BLACK;
|
|
|
|
pTarget->Blue = (UByte)ClipRGB_8BIT(Blue);
|
|
|
|
Green = FixedRound(ConvertedY -
|
|
0x2FF9*((LWord)(pSource->cb-CCIR601_8BIT_CHROMAOFFSET)) -
|
|
0x780D*((LWord)(pSource->cr-CCIR601_8BIT_CHROMAOFFSET))) + CCIR601_8BIT_BLACK;
|
|
|
|
pTarget->Green = (UByte)ClipRGB_8BIT(Green);
|
|
|
|
pTarget->Alpha = pSource->Alpha;
|
|
}
|
|
|
|
inline void HDConvert10BitYCbCrtoRGBSmpte(YCbCr10BitAlphaPixel *pSource,
|
|
RGBAlphaPixel *pTarget)
|
|
{
|
|
LWord Red,Green,Blue;
|
|
Fixed_ ConvertedY;
|
|
|
|
ConvertedY = (0xFFDF>>2)*((LWord)pSource->y - CCIR601_10BIT_BLACK);
|
|
|
|
Red = FixedRound(ConvertedY +
|
|
(0x19A8C>>2)*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET))) + CCIR601_8BIT_BLACK;
|
|
|
|
pTarget->Red = (UByte)ClipRGB_8BIT(Red);
|
|
|
|
Blue = FixedRound(ConvertedY +
|
|
(0x1DAD7>>2)*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET))) + CCIR601_8BIT_BLACK;
|
|
|
|
pTarget->Blue = (UByte)ClipRGB_8BIT(Blue);
|
|
|
|
Green = FixedRound(ConvertedY -
|
|
(0x2FF9>>2)*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET)) -
|
|
(0x780D>>2)*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET))) + CCIR601_8BIT_BLACK;
|
|
|
|
pTarget->Green = (UByte)ClipRGB_8BIT(Green);
|
|
|
|
pTarget->Alpha = (UByte)pSource->Alpha;
|
|
}
|
|
|
|
|
|
inline void SDConvert10BitYCbCrto10BitRGBSmpte(YCbCr10BitAlphaPixel *pSource,
|
|
RGBAlpha10BitPixel *pTarget)
|
|
{
|
|
LWord Red,Green,Blue;
|
|
Fixed_ ConvertedY;
|
|
|
|
ConvertedY = 0xFF40*((LWord)pSource->y - CCIR601_10BIT_BLACK);
|
|
|
|
Red = FixedRound(ConvertedY +
|
|
0x15DDF*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET))) + CCIR601_10BIT_BLACK;
|
|
|
|
pTarget->Red = (UWord)ClipRGB_10BIT(Red);
|
|
|
|
Blue = FixedRound(ConvertedY +
|
|
0x1BA34*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET))) + CCIR601_10BIT_BLACK;
|
|
|
|
pTarget->Blue = (UWord)ClipRGB_10BIT(Blue);
|
|
|
|
Green = FixedRound(ConvertedY -
|
|
0x55E1*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET)) -
|
|
0xB237*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET))) + CCIR601_10BIT_BLACK;
|
|
|
|
pTarget->Green = (UWord)ClipRGB_10BIT(Green);
|
|
|
|
pTarget->Alpha = pSource->Alpha;
|
|
}
|
|
|
|
inline void HDConvert10BitYCbCrto10BitRGBSmpte(YCbCr10BitAlphaPixel *pSource,
|
|
RGBAlpha10BitPixel *pTarget)
|
|
{
|
|
LWord Red,Green,Blue;
|
|
Fixed_ ConvertedY;
|
|
|
|
ConvertedY = 0xFFDF*((LWord)pSource->y - CCIR601_10BIT_BLACK);
|
|
|
|
Red = FixedRound(ConvertedY +
|
|
0x19A8C*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET))) + CCIR601_10BIT_BLACK;
|
|
|
|
pTarget->Red = (UWord)ClipRGB_10BIT(Red);
|
|
|
|
Blue = FixedRound(ConvertedY +
|
|
0x1DAD7*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET))) + CCIR601_10BIT_BLACK;
|
|
|
|
pTarget->Blue = (UWord)ClipRGB_10BIT(Blue);
|
|
|
|
Green = FixedRound(ConvertedY -
|
|
0x2FF9*((LWord)(pSource->cb-CCIR601_10BIT_CHROMAOFFSET)) -
|
|
0x780D*((LWord)(pSource->cr-CCIR601_10BIT_CHROMAOFFSET))) + CCIR601_10BIT_BLACK;
|
|
|
|
pTarget->Green = (UWord)ClipRGB_10BIT(Green);
|
|
|
|
pTarget->Alpha = pSource->Alpha;
|
|
}
|
|
|
|
#endif // NTV2TRANSCODE_H
|