📄 decoder.cpp
字号:
// Return: TRUE = Enable, FALSE = Disable
/////////////////////////////////////////////////////////////////////////////
BOOL Decoder::IsChromaComb()
{
return (decFieldCOMB == On) ? TRUE : FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// Method: void Decoder::SetInterlaced(BOOL mode)
// Purpose: Enable/Disable Interlace
// Input: BOOL mode - TRUE = Interlaced
// Output: None
// Return: None
/////////////////////////////////////////////////////////////////////////////
void Decoder::SetInterlaced(BOOL mode)
{
decFieldINT = (mode == FALSE) ? Off : On;
}
/////////////////////////////////////////////////////////////////////////////
// Method: BOOL Decoder::IsInterlaced()
// Purpose: Check if interlaced or non-interlaced
// Input: None
// Output: None
// Return: TRUE = Interlaced
/////////////////////////////////////////////////////////////////////////////
BOOL Decoder::IsInterlaced()
{
return (decFieldINT == On) ? TRUE : FALSE;
}
//===== VPOLE register ==================================================
BOOL Decoder::IsOutputEnabled ()
{
return (decFieldOUT_EN == m_outputEnablePolarity);
}
void Decoder::SetOutputEnabled (BOOL mode)
{
decFieldOUT_EN = (mode == TRUE) ? m_outputEnablePolarity : !m_outputEnablePolarity;
}
BOOL Decoder::IsHighOdd ()
{
return (decFieldFIELD == 0); // 0 enabled; 1 even
}
void Decoder::SetHighOdd (BOOL mode)
{
decFieldFIELD = (mode == TRUE) ? 0 : 1; // 0 enabled; 1 even
}
//===== ADC Interface register (ADC) =========================================
/////////////////////////////////////////////////////////////////////////////
// Method: void Decoder::PowerDown(BOOL mode)
// Purpose: Select normal or shut down clock operation
// Input: BOOL mode - TRUE = shut down, FALSE = normal operation
// Output: None
// Return: None
/////////////////////////////////////////////////////////////////////////////
void Decoder::PowerDown(BOOL mode)
{
decFieldCLK_SLEEP = (mode == FALSE) ? Off : On;
}
/////////////////////////////////////////////////////////////////////////////
// Method: BOOL Decoder::IsPowerDown()
// Purpose: Check if clock operation has been shut down
// Input: None
// Output: None
// Return: TRUE = shut down, FALSE = normal operation
/////////////////////////////////////////////////////////////////////////////
BOOL Decoder::IsPowerDown()
{
return (decFieldCLK_SLEEP == On) ? TRUE : FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// Method: void Decoder::SetChromaADC(BOOL mode)
// Purpose: Select normal or sleep C ADC operation
// Input: BOOL mode - TRUE = normal, FALSE = sleep
// Output: None
// Return: None
/////////////////////////////////////////////////////////////////////////////
void Decoder::SetChromaADC(BOOL mode)
{
decFieldC_SLEEP = (mode == FALSE) ? On : Off; // reverse
}
/*^^////////////////////////////////////////////////////////////////////////////
// Method: void Decoder::SetAdaptiveAGC(BOOL mode)
// Purpose: Set adaptive or non-adaptive AGC operation
// Input: BOOL mode - TRUE = Adaptive, FALSE = Non-adaptive
// Output: None
// Return: None
*////////////////////////////////////////////////////////////////////////////
void Decoder::SetAdaptiveAGC(BOOL mode)
{
decFieldCRUSH = (mode == FALSE) ? Off : On;
}
/////////////////////////////////////////////////////////////////////////////
// Method: BOOL Decoder::IsAdaptiveAGC()
// Purpose: Check if adaptive or non-adaptive AGC operation is selected
// Input: None
// Output: None
// Return: TRUE = Adaptive, FALSE = Non-adaptive
/////////////////////////////////////////////////////////////////////////////
BOOL Decoder::IsAdaptiveAGC()
{
return (decFieldCRUSH == On) ? TRUE : FALSE;
}
//===== Software Reset register (SRESET) ====================================
/////////////////////////////////////////////////////////////////////////////
// Method: void Decoder::SoftwareReset()
// Purpose: Perform software reset; all registers set to default values
// Input: None
// Output: None
// Return: None
/////////////////////////////////////////////////////////////////////////////
void Decoder::SoftwareReset()
{
decRegSRESET = 0x00; // write any value will do
}
//===== Test Control register (TEST) ========================================
/////////////////////////////////////////////////////////////////////////////
// Method: void Decoder::AdjustInertialDampener(BOOL mode)
// Purpose: for factory diagnostics only
// Input: TRUE or FALSE
// Output: None
// Return: None
// NOTE: For factory diagnostics only!!!!!!!
// John Welch's dirty little secret
/////////////////////////////////////////////////////////////////////////////
void Decoder::AdjustInertialDampener(BOOL mode)
{
#pragma message ("FOR TEST DIAGNOSTICS ONLY! ")
decRegTEST = (mode == FALSE) ? 0x00 : 0x01;
}
/////////////////////////////////////////////////////////////////////////////
// Method: void Decoder::SelectCrystal(char useCrystal)
// Purpose: Select correct crystal for NTSC or PAL
// Input: char useCrystal - 'N' for NTSC; 'P' for PAL
// Output: None
// Return: None
// NOTE: Assume at most 2 crystals installed in hardware. i.e. 1 for NTSC
// and the other for PAL/SECAM.
// If there is only 1 crystal exists (which must be crystal XT0),
// do nothing since it is already selected.
/////////////////////////////////////////////////////////////////////////////
void Decoder::SelectCrystal(char useCrystal)
{
#pragma message("do something about registry")
/*
// locate crystal information in the registry
// the keys to look for in registry are:
// 1. Bt848\NumXTAL - number of crystal installed
// possible values are "1" or "2"
// 2. Bt848\XT0 - what crystal type is for crystal 0
// possible values are "NTSC", "PAL"
// There is another key exist which may be useful in the future:
// Bt848\XT1 - what crystal type is for crystal 1
// possible values are "NTSC", "PAL", and "NONE"
VRegistryKey vkey(PRK_CLASSES_ROOT, "Bt848");
// make sure the key exists
if (vkey.lastError() == ERROR_SUCCESS)
{
char * numCrystalKey = "NumXTAL";
char nCrystal[5];
DWORD nCrystalLen = 2; // need only first char; '1' or '2'
// get number of crystal exists
if (vkey.getSubkeyValue(numCrystalKey, nCrystal, (DWORD *)&nCrystalLen))
{
// if there is only 1 crystal, no other crystal to change to
if (nCrystal[0] == '2')
{
char * crystalTypeKey = "XT0"; // crystal 0 type
char crystalType[10];
DWORD crystalTypeLen = 6; // need only first char: 'N' or 'P'
// get the crystal 0 information
if (vkey.getSubkeyValue(crystalTypeKey, crystalType, (DWORD *)&crystalTypeLen))
// compare with what we want to use
if ((IsCrystal0Selected() && (crystalType[0] != useCrystal)) ||
(!IsCrystal0Selected() && (crystalType[0] == useCrystal)))
// need to change crystal
SetCrystal(IsCrystal0Selected() ? Crystal_XT1 : Crystal_XT0);
}
}
}
*/
}
/////////////////////////////////////////////////////////////////////////////
// Method: ErrorCode Decoder::Mapping(int fromValue, CRegInfo fromRange,
// int * toValue, CRegInfo toRange)
// Purpose: Map a value in certain range to a value in another range
// Input: int fromValue - value to be mapped from
// CRegInfo fromRange - range of value mapping from
// CRegInfo toRange - range of value mapping to
// Output: int * toValue - mapped value
// Return: Fail if error in parameter, else Success
// Comment: No range checking is performed here. Assume parameters are in
// valid ranges.
// The mapping function does not assume default is always the mid
// point of the whole range. It only assumes default values of the
// two ranges correspond to each other.
//
// The mapping formula is:
//
// For fromRange.Min() <= fromValue <= fromRange.Default():
//
// fromValue (fromRange.Default() - fromRange.Min())
// ------------------------------------------------ + fromRange.Min()
// toRange.Default() - toRange.Min()
//
// For fromRange.Default() < fromValue <= fromRange.Max():
//
// (fromValue - fromRange.Default()) (toRange.Max() - toRange.Default())
// --------------------------------------------------------------------- + toRange.Default()
// toRange.Max() - toRange.Default()
//
////////////////////////////////////////////////////////////////////////////
ErrorCode Decoder::Mapping(int fromValue, CRegInfo fromRange,
int * toValue, CRegInfo toRange)
{
// calculate intermediate values
DWORD a = toRange.Default() - toRange.Min();
DWORD b = fromRange.Default() - fromRange.Min();
DWORD c = toRange.Max() - toRange.Default();
DWORD d = fromRange.Max() - fromRange.Default();
// prevent divide by zero
if ((b == 0) || (d == 0))
return (Fail);
// perform mapping
if (fromValue <= fromRange.Default())
*toValue = (int) (DWORD)fromValue * a / b + (DWORD)toRange.Min();
else
*toValue = (int) ((DWORD)fromValue - (DWORD)fromRange.Default()) * c / d
+ (DWORD)toRange.Default();
return (Success);
}
/////////////////////////////////////////////////////////////////////////////
// Method: BOOL Decoder::IsAdjustContrast()
// Purpose: Check registry key whether adjust contrast is needed
// Input: None
// Output: None
// Return: TRUE = adjust contrast, FALSE = don't adjust contrast
// Note: If adjust contrast is turn on, brightness register value will be
// adjusted such that it remains a constant after the calculation
// performed by the hardware.
//
// The formula is:
// To keep brightness constant (i.e. not affect by changing contrast)
// set brightness to B/(C/C0)
// where B is value of brightness before adjustment
// C is contrast value
// C0 is nominal contrast value (0xD8)
//
// To adjust the contrast level such that it is at the middle of
// black and white: set brightness to (B * C0 + 64 * (C0 - C))/C
// (this is what Intel wants)
//
// Currently there is still limitation of how much adjustment
// can be performed. For example, if brightness is already high,
// (i.e. brightness reg value close to 0x7F), lowering contrast
// until a certain level will have no adjustment effect on brightness.
// In fact, it would even bring down brightness to darkness.
//
// Example 1: if brightness is at nominal value (0x00), contrast can
// only go down to 0x47 (brightness adjustment is already
// at max of 0x7F) before it starts affecting brightness
// which takes it darkness.
// Example 2: if brightness is at nominal value (0x00), contrast can
// go all the way up with brightness adjusted correctly.
// However, the max adjustment used is only 0xDC and
// the max adjustment we can use is 0x&F.
// Example 3: if brightness is at max (0x7F), lowering contrast
// cannot be compensated by adjusting brightness anymore.
// The result is gradually taking brightness to darkness.
// Example 4: if brightness is at min (0x80), lowering contrast has
// no visual effect. Bringing contrast to max is using
// 0xA5 in brightness for compensation.
//
// One last note, the center is defined as the middle of the
// gamma adjusted luminance level. Changing it to use the middle of
// the linear (RGB) luminance level is possible.
/////////////////////////////////////////////////////////////////////////////
BOOL Decoder::IsAdjustContrast()
{
return FALSE;
/*
// locate adjust contrast information in the registry
// the key to look for in registry is:
// Bt848\AdjustContrast - 0 = don't adjust contrast
// 1 = adjust contrast
VRegistryKey vkey(PRK_CLASSES_ROOT, "Bt848");
// make sure the key exists
if (vkey.lastError() == ERROR_SUCCESS)
{
char * adjustContrastKey = "AdjustContrast";
char key[3];
DWORD keyLen = 2; // need only first char; '0' or '1'
// get the registry value and check it, if exist
if ((vkey.getSubkeyValue(adjustContrastKey, key, (DWORD *)&keyLen)) &&
(key[0] == '1'))
return (TRUE);
}
return (FALSE);
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -