obs-studio/build_dependencies/aja/include/ajalibraries/ajantv2/includes/ntv2testpatterngen.h
Ward Nakchbandi b48576284b first commit
2023-03-04 20:33:16 +03:00

290 lines
13 KiB
C++

/* SPDX-License-Identifier: MIT */
/**
@file ajantv2/includes/ntv2testpatterngen.h
@brief Declares the NTV2TestPatternGen class.
@copyright (C) 2010-2021 AJA Video Systems, Inc.
**/
#ifndef NTV2_TESTPATTERN_GEN_
#define NTV2_TESTPATTERN_GEN_
#include "ajaexport.h"
#include "ntv2videodefines.h"
#include "ntv2enums.h"
#include "ntv2utils.h"
#include <vector>
#include <set>
#include <string>
typedef std::vector <uint8_t> NTV2TestPatternBuffer, NTV2TestPatBuffer; ///< @brief A byte vector that stores a complete video frame.
#if !defined(NTV2_DEPRECATE_15_0)
typedef std::vector <const char *> NTV2TestPatternList; ///< @deprecated Use NTV2TestPatternNames instead.
#endif//!defined(NTV2_DEPRECATE_15_0)
typedef NTV2StringList NTV2TestPatternNames; ///< @brief A list (std::vector) of pattern names.
/**
@brief Identifies a predefined NTV2 test pattern.
**/
enum NTV2TestPatternSelect
{
NTV2_TestPatt_ColorBars100,
NTV2_TestPatt_FIRST = NTV2_TestPatt_ColorBars100,
NTV2_TestPatt_ColorBars75,
NTV2_TestPatt_Ramp,
NTV2_TestPatt_MultiBurst,
NTV2_TestPatt_LineSweep,
NTV2_TestPatt_CheckField,
NTV2_TestPatt_FlatField,
NTV2_TestPatt_MultiPattern,
NTV2_TestPatt_Black,
NTV2_TestPatt_White,
NTV2_TestPatt_Border,
NTV2_TestPatt_LinearRamp,
NTV2_TestPatt_SlantRamp,
NTV2_TestPatt_ZonePlate,
NTV2_TestPatt_ColorQuadrant,
NTV2_TestPatt_ColorQuadrantBorder,
NTV2_TestPatt_ColorQuadrantTsi,
NTV2_TestPatt_TsiAlignment,
NTV2_TestPatt_ZonePlate_12b_RGB,
NTV2_TestPatt_LinearRamp_12b_RGB,
NTV2_TestPatt_HLG_Narrow_12b_RGB,
NTV2_TestPatt_PQ_Narrow_12b_RGB,
NTV2_TestPatt_PQ_Wide_12b_RGB,
NTV2_TestPatt_All,
NTV2_TestPatt_INVALID = NTV2_TestPatt_All,
NTV2_TestPatt_LAST = NTV2_TestPatt_All
};
typedef NTV2TestPatternSelect NTV2TestPatternID;
#define NTV2_IS_VALID_PATTERN(__S__) ((__S__) >= NTV2_TestPatt_ColorBars100 && (__S__) < NTV2_TestPatt_All)
#define NTV2_IS_12B_PATTERN(__S__) ((__S__) >= NTV2_TestPatt_ZonePlate_12b_RGB && (__S__) < NTV2_TestPatt_All)
typedef std::set<NTV2TestPatternSelect> NTV2TestPatternSet;
typedef NTV2TestPatternSet::const_iterator NTV2TestPatternSetConstIter;
/**
@brief The NTV2 test pattern generator.
@bug ::NTV2TestPatternGen doesn't work for planar formats.
**/
class AJAExport NTV2TestPatternGen
{
// CLASS METHODS
public:
/**
@name Class Methods
**/
///@{
/**
@param[in] inPattern Specifies the test pattern of interest.
@param[in] inDesc Specifies a description of the raster being used.
@return True, if the given test pattern can be drawn for the given raster description.
**/
static bool canDrawTestPattern (const NTV2TestPatternSelect inPattern,
const NTV2FormatDescriptor & inDesc);
/**
@return An ordered collection of strings containing the names of all available test patterns.
**/
static NTV2TestPatternNames getTestPatternNames (void);
/**
@return An ordered collection of strings containing the names of all available flat-field "web colors".
**/
static NTV2StringList getColorNames (void); // New in SDK 16.0
/**
@return The test pattern that corresponds to the given name.
@param[in] inName Specifies the test pattern name. The search is done case-insensitively.
**/
static NTV2TestPatternSelect findTestPatternByName (const std::string & inName); // New in SDK 16.0
/**
@return The flat-field RGB "web color" value that corresponds to the given name.
The highest-order byte in the 32-bit result is 0x00; the next-lower byte
is the Red value (0-255); the next-lower byte is the Green value (0-255);
the lowest-order byte is the Blue value (0-255). A zero return value
means "not found".
@param[in] inName Specifies the "web color" name. The search is done case-insensitively.
@note "Black" and "White" are not returned, as these are available as ordinary
test patterns NTV2_TestPatt_Black and NTV2_TestPatt_White, respectively.
**/
static ULWord findRGBColorByName (const std::string & inName); // New in SDK 16.0
#if !defined(NTV2_DEPRECATE_15_0)
static NTV2_SHOULD_BE_DEPRECATED (NTV2TestPatternList & getTestPatternList (void));
#endif // !defined(NTV2_DEPRECATE_15_0)
///@}
// INSTANCE METHODS
public:
/**
@name Constructors & Destructors
**/
///@{
NTV2TestPatternGen ();
virtual inline ~NTV2TestPatternGen () {}
///@}
/**
@name Drawing Methods
**/
///@{
/**
@brief Renders the given test pattern or color into a host raster buffer.
@param[in] inTPName Specifies the name of the test pattern or web color to be drawn.
@param[in] inFormatDesc Describes the raster memory.
@param inBuffer Specifies the host memory buffer to be written.
@note If the format descriptor describes a "tall" or "taller" (VANC) raster geometry,
the first byte in the specified buffer is presumed to be the start of the VANC region.
@note If my mSetDstVancBlack member is true, the buffer's VANC region will also be cleared
to legal black.
@return True if successful; otherwise false.
@bug Needs planar pixel format implementations.
**/
virtual bool DrawTestPattern (const std::string & inTPName,
const NTV2FormatDescriptor & inFormatDesc,
NTV2_POINTER & inBuffer); // New in SDK 16.0
/**
@brief Renders the given test pattern into a host raster buffer.
@param[in] inPattern Specifies the test pattern to be drawn.
@param[in] inFormatDesc Describes the raster memory.
@param inBuffer Specifies the host memory buffer to be written.
@note If the format descriptor describes a "tall" or "taller" (VANC) geometry, the
first byte in the specified buffer is presumed to be the start of the VANC region.
@note If my mSetDstVancBlack member is true, the buffer's VANC region will also be cleared
to legal black.
@return True if successful; otherwise false.
@bug Needs planar pixel format implementations.
**/
virtual bool DrawTestPattern (const NTV2TestPatternSelect inPattern,
const NTV2FormatDescriptor & inFormatDesc,
NTV2_POINTER & inBuffer); // New in SDK 16.0
#if !defined(NTV2_DEPRECATE_16_0)
/**
@deprecated Use the DrawTestPattern method that requires an NTV2_POINTER to specify the buffer to fill.
**/
virtual inline NTV2_DEPRECATED_f(bool DrawTestPattern (const NTV2TestPatternSelect inPattern, const NTV2FormatDescriptor & inDesc, NTV2TestPatBuffer & outBuffer))
{return DrawTestPattern(inPattern, inDesc.GetRasterWidth(), inDesc.GetVisibleRasterHeight(), inDesc.GetPixelFormat(), outBuffer);}
/**
@deprecated Use the DrawTestPattern method that requires an NTV2_POINTER to specify the buffer to fill.
**/
virtual NTV2_DEPRECATED_f(bool DrawTestPattern (const NTV2TestPatternSelect inPat, const uint32_t inWdth, const uint32_t inHght, const NTV2FrameBufferFormat inPF, NTV2TestPatBuffer & outBuf));
#endif // !defined(NTV2_DEPRECATE_16_0)
///@}
/**
@name Getters
**/
///@{
inline bool getUseRGBSmpteRange (void) const {return mSetRGBSmpteRange;}
inline NTV2SignalMask getSignalMask (void) const {return mSignalMask;}
inline const double & getSliderValue (void) const {return mSliderValue;}
inline bool getAlphaFromLuma (void) const {return mSetAlphaFromLuma;}
inline bool setVANCToLegalBlack (void) const {return mSetDstVancBlack;} ///< @return True if DrawTestPattern will also set VANC lines (if any) to legal black.
///@}
/**
@name Setters
**/
///@{
inline NTV2TestPatternGen & setUseRGBSmpteRange (const bool useRGBSmpteRange) {mSetRGBSmpteRange = useRGBSmpteRange; return *this;}
inline NTV2TestPatternGen & setSignalMask (const NTV2SignalMask signalMask) {mSignalMask = signalMask; return *this;}
inline NTV2TestPatternGen & setSliderValue (const double & sliderValue) {mSliderValue = sliderValue; return *this;}
inline NTV2TestPatternGen & setAlphaFromLuma (const bool alphaFromLuma) {mSetAlphaFromLuma = alphaFromLuma; return *this;}
/**
@brief Changes my "clear VANC lines to legal black" setting.
@param[in] inClearVANC Specify true to have my DrawTestPattern method automatically clear the VANC region (if any) to legal black.
@return A non-constant reference to me.
**/
inline NTV2TestPatternGen & setVANCToLegalBlack (const bool inClearVANC) {mSetDstVancBlack = inClearVANC; return *this;}
///@}
// INTERNAL METHODS
protected:
virtual bool DrawSegmentedTestPattern ();
virtual bool DrawYCbCrFrame (uint16_t Y, uint16_t Cb, uint16_t Cr);
virtual bool DrawBorderFrame ();
virtual bool DrawLinearRampFrame ();
virtual bool DrawSlantRampFrame ();
virtual bool DrawZonePlateFrame ();
virtual bool DrawQuadrantBorderFrame ();
virtual bool DrawColorQuadrantFrame ();
virtual bool DrawColorQuadrantFrameTsi ();
virtual bool DrawColorQuadrantFrameTsi2 ();
// 12-bit patterns:
virtual bool DrawTestPatternNarrowHLG();
virtual bool DrawTestPatternNarrowPQ();
virtual bool DrawTestPatternWidePQ();
virtual bool Draw12BitRamp();
virtual bool Draw12BitZonePlate();
virtual void PrepareForOutput();
bool IsSDStandard(void) const;
bool GetStandard (int & outStandard, bool & outIs4K, bool & outIs8K) const;
virtual bool drawIt (void);
// INSTANCE DATA
protected:
NTV2TestPatternID mPatternID; ///< @brief Pattern number
// NTV2FormatDesc mDstFormat; ///< @brief Dest format
NTV2PixelFormat mDstPixelFormat; ///< @brief Dest pixel format
uint32_t mDstFrameWidth; ///< @brief Dest width (pixels)
uint32_t mDstFrameHeight; ///< @brief Dest height (lines)
uint32_t mDstLinePitch; ///< @brief Dest bytes per row
uint32_t mSrcLinePitch; ///< @brief Src bytes per row
uint32_t mDstBufferSize; ///< @brief Dest visible buffer size (bytes)
uint8_t * mpDstBuffer; ///< @brief Dest buffer (start of active video)
uint32_t * mpPackedLineBuffer;
uint16_t * mpUnpackedLineBuffer;
bool mSetRGBSmpteRange;
bool mSetAlphaFromLuma;
bool mSetDstVancBlack; ///< @brief Set destination VANC lines to legal black?
double mSliderValue; ///< @brief Used for Zone Plate
NTV2SignalMask mSignalMask; ///< @brief Component mask for MultiBurst, LineSweep
uint32_t mNumPixels;
uint32_t mNumLines;
uint32_t mBitsPerComponent;
uint32_t mSamplesPerPixel;
uint16_t mCompressionType;
uint32_t mDataOffset;
uint32_t mDataSize;
std::vector<char> mData;
std::vector<uint16_t> mUnPackedRAWBuffer;
std::vector<uint16_t> mRGBBuffer;
}; // NTV2TestPatternGen
#if !defined(NTV2_DEPRECATE_14_3)
typedef NTV2TestPatternGen AJATestPatternGenEx; ///< @deprecated Use NTV2TestPatternGen instead.
typedef NTV2TestPatternBuffer AJATestPatternBufferEx; ///< @deprecated Use NTV2TestPatternBuffer instead.
typedef NTV2TestPatternSelect AJATestPatternSelectEx; ///< @deprecated Use NTV2TestPatternSelect instead.
#define AJA_TestPattEx_ColorBars100 NTV2_TestPatt_ColorBars100 ///< @deprecated Use NTV2_TestPatt_ColorBars100 instead.
#define AJA_TestPattEx_ColorBars75 NTV2_TestPatt_ColorBars75 ///< @deprecated Use NTV2_TestPatt_ColorBars75 instead.
#define AJA_TestPattEx_Ramp NTV2_TestPatt_Ramp ///< @deprecated Use NTV2_TestPatt_Ramp instead.
#define AJA_TestPattEx_MultiBurst NTV2_TestPatt_MultiBurst ///< @deprecated Use NTV2_TestPatt_MultiBurst instead.
#define AJA_TestPattEx_LineSweep NTV2_TestPatt_LineSweep ///< @deprecated Use NTV2_TestPatt_LineSweep instead.
#define AJA_TestPattEx_CheckField NTV2_TestPatt_CheckField ///< @deprecated Use NTV2_TestPatt_CheckField instead.
#define AJA_TestPattEx_FlatField NTV2_TestPatt_FlatField ///< @deprecated Use NTV2_TestPatt_FlatField instead.
#define AJA_TestPattEx_MultiPattern NTV2_TestPatt_MultiPattern ///< @deprecated Use NTV2_TestPatt_MultiPattern instead.
#define AJA_TestPattEx_Black NTV2_TestPatt_Black ///< @deprecated Use NTV2_TestPatt_Black instead.
#define AJA_TestPattEx_White NTV2_TestPatt_White ///< @deprecated Use NTV2_TestPatt_White instead.
#define AJA_TestPattEx_Border NTV2_TestPatt_Border ///< @deprecated Use NTV2_TestPatt_Border instead.
#define AJA_TestPattEx_LinearRamp NTV2_TestPatt_LinearRamp ///< @deprecated Use NTV2_TestPatt_LinearRamp instead.
#define AJA_TestPattEx_SlantRamp NTV2_TestPatt_SlantRamp ///< @deprecated Use NTV2_TestPatt_SlantRamp instead.
#define AJA_TestPattEx_ZonePlate NTV2_TestPatt_ZonePlate ///< @deprecated Use NTV2_TestPatt_ZonePlate instead.
#define AJA_TestPattEx_ColorQuadrant NTV2_TestPatt_ColorQuadrant ///< @deprecated Use NTV2_TestPatt_ColorQuadrant instead.
#define AJA_TestPattEx_ColorQuadrantBorder NTV2_TestPatt_ColorQuadrantBorder ///< @deprecated Use NTV2_TestPatt_ColorQuadrantBorder instead.
#define AJA_TestPattEx_ColorQuadrantTsi NTV2_TestPatt_ColorQuadrantTsi ///< @deprecated Use NTV2_TestPatt_ColorQuadrantTsi instead.
#define AJA_TestPattEx_All NTV2_TestPatt_All ///< @deprecated Use NTV2_TestPatt_All instead.
#elif !defined(NTV2_DEPRECATE_15_0)
typedef NTV2TestPatternList AJATestPatternListEx; ///< @deprecated Use NTV2TestPatternNames instead.
#endif // NTV2_DEPRECATE_15_0
#endif // NTV2_TESTPATTERN_GEN_