📄 decoder.cpp
字号:
// Input: int param - parameter value (0-255; default 128)
// Output: None
// Return: Fail if error in parameter, else Success
// Note: See IsAdjustContrast() for detailed description of the contrast
// adjustment calculation
/////////////////////////////////////////////////////////////////////////////
ErrorCode Decoder::SetContrast(int param)
{
if(m_param.OutOfRange(param))
return Fail;
BOOL adjustContrast = IsAdjustContrast(); // is contrast need to be adjusted
// if adjust contrast is needed, make sure contrast reg value != 0
if (adjustContrast)
m_regContrast = CRegInfo(1, ConMax, ConDef);
// perform mapping to our range
int mapped;
if (Mapping(param, m_param, &mapped, m_regContrast) == Fail)
return Fail;
m_conParam = (WORD)param;
// calculate contrast
DWORD value = (DWORD)0x1FF * (DWORD)mapped;
value /= (DWORD)m_regContrast.Max();
if (value > 0x1FF)
value = 0x1FF;
// contrast is set by a 9 bit value; set LSB first
decRegCONTRAST_LO = value;
// now set the Miscellaneous Control Register CON_V_MSB to the 9th bit value
decFieldCON_MSB = ((value & 0x0100) ? On : Off);
// perform adjustment of brightness register if adjustment is needed
if (adjustContrast)
{
regContrast = (WORD)value; // contrast value
long A = (long)regBright * (long)0xD8;
long B = 64 * ((long)0xD8 - (long)regContrast);
long temp = 0x00;
if (regContrast != 0) // already limit contrast > zero; just in case here
temp = ((A + B) / (long)regContrast);
temp = (temp < -128) ? -128 : ((temp > 127) ? 127 : temp);
decRegBRIGHT = (BYTE)temp;
}
return Success;
}
/////////////////////////////////////////////////////////////////////////////
// Method: int Decoder::GetContrast()
// Purpose: Obtain contrast value
// Input: None
// Output: None
// Return: Contrast parameter (0-255)
/////////////////////////////////////////////////////////////////////////////
int Decoder::GetContrast()
{
return m_conParam;
}
//===== Chroma Gain register (SAT_U_MSB, SAT_V_MSB, SAT_U_LO, SAT_V_LO) =====
/////////////////////////////////////////////////////////////////////////////
// Method: ErrorCode Decoder::SetSaturation(int param)
// Purpose: Set color saturation by modifying U and V values
// Input: int param - parameter value (0-255; default 128)
// Output: None
// Return: Fail if error in parameter, else Success
/////////////////////////////////////////////////////////////////////////////
ErrorCode Decoder::SetSaturation(int param)
{
if(m_param.OutOfRange(param))
return Fail;
// color saturation is controlled by two nine bit values:
// ChromaU & ChromaV
// To maintain normal color balance, the ratio between the 2 register
// values should be kept at the power-up default ratio
// Note that U & V values for NTSC and PAL are the same, SECAM is different
WORD nominalNTSC_U = 0xFE; // nominal value (i.e. 100%) for NTSC/PAL
WORD nominalNTSC_V = 0xB4;
WORD nominalSECAM_U = 0x87; // nominal value (i.e. 100%) for SECAM
WORD nominalSECAM_V = 0x85;
CRegInfo regSat; // selected saturation register; NTSC/PAL or SECAM
WORD nominal_U, nominal_V; // selected nominal U and V value; NTSC/PAL or SECAM
// select U & V values of either NTSC/PAL or SECAM to be used for calculation
if (GetVideoFormat() == VFormat_SECAM)
{
nominal_U = nominalSECAM_U;
nominal_V = nominalSECAM_V;
regSat = m_regSaturationSECAM;
}
else
{
nominal_U = nominalNTSC_U;
nominal_V = nominalNTSC_V;
regSat = m_regSaturationNTSC;
}
// perform mapping to our range
int mapped;
if (Mapping(param, m_param, &mapped, regSat) == Fail)
return Fail;
m_satParam = (WORD)param;
WORD max_nominal = max(nominal_U, nominal_V);
// calculate U and V values
WORD Uvalue = (WORD) ((DWORD)mapped * (DWORD)nominal_U / (DWORD)max_nominal);
WORD Vvalue = (WORD) ((DWORD)mapped * (DWORD)nominal_V / (DWORD)max_nominal);
// set U
decRegSAT_U_LO = Uvalue;
// now set the Miscellaneous Control Register SAT_U_MSB to the 9th bit value
decFieldSAT_U_MSB = ((Uvalue & 0x0100) ? On : Off);
// set V
decRegSAT_V_LO = Vvalue;
// now set the Miscellaneous Control Register SAT_V_MSB to the 9th bit value
decFieldSAT_V_MSB = ((Vvalue & 0x0100) ? On : Off);
return Success;
}
/////////////////////////////////////////////////////////////////////////////
// Method: int Decoder::GetSaturation()
// Purpose: Obtain saturation value
// Input: None
// Output: None
// Return: Saturation parameter (0-255)
/////////////////////////////////////////////////////////////////////////////
int Decoder::GetSaturation()
{
return m_satParam;
}
//===== Hue Control register (HUE) ==========================================
/////////////////////////////////////////////////////////////////////////////
// Method: ErrorCode Decoder::SetHue(int param)
// Purpose: Set video hue
// Input: int param - parameter value (0-255; default 128)
// Output: None
// Return: Fail if error in parameter, else Success
/////////////////////////////////////////////////////////////////////////////
ErrorCode Decoder::SetHue(int param)
{
if(m_param.OutOfRange(param))
return Fail;
// perform mapping to our range
int mapped;
if (Mapping(param, m_param, &mapped, m_regHue) == Fail)
return Fail;
m_hueParam = (WORD)param;
int value = (-128 * mapped) / m_regHue.Max();
if (value > 127)
value = 127;
else if (value < -128)
value = -128;
decRegHUE = value;
return Success;
}
/////////////////////////////////////////////////////////////////////////////
// Method: int Decoder::GetHue()
// Purpose: Obtain hue value
// Input: None
// Output: None
// Return: Hue parameter (0-255)
/////////////////////////////////////////////////////////////////////////////
int Decoder::GetHue()
{
return m_hueParam;
}
//===== SC Loop Control register (E_SCLOOP, O_SCLOOP) =======================
/////////////////////////////////////////////////////////////////////////////
// Method: void Decoder::SetChromaAGC(BOOL mode)
// Purpose: Enable/Disable Chroma AGC compensation
// Input: BOOL mode - TRUE = Enable, FALSE = Disable
// Output: None
// Return: None
/////////////////////////////////////////////////////////////////////////////
void Decoder::SetChromaAGC(BOOL mode)
{
decFieldCAGC = (mode == FALSE) ? Off : On;
}
/////////////////////////////////////////////////////////////////////////////
// Method: BOOL Decoder::IsChromaAGC()
// Purpose: Check if Chroma AGC compensation is enable or disable
// Input: None
// Output: None
// Return: TRUE = Enable, FALSE = Disable
/////////////////////////////////////////////////////////////////////////////
BOOL Decoder::IsChromaAGC()
{
return (decFieldCAGC == On) ? TRUE : FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// Method: void Decoder::SetLowColorAutoRemoval(BOOL mode)
// Purpose: Enable/Disable low color detection and removal
// Input: BOOL mode - TRUE = Enable, FALSE = Disable
// Output: None
// Return: None
/////////////////////////////////////////////////////////////////////////////
void Decoder::SetLowColorAutoRemoval(BOOL mode)
{
decFieldCKILL = (mode == FALSE) ? Off : On;
}
//===== Output Format register (OFORM) ======================================
/////////////////////////////////////////////////////////////////////////////
// Method: void Decoder::SetVBIFrameMode(BOOL mode)
// Purpose: Enable/Disable VBI frame output mode
// Input: BOOL mode - TRUE = Enable, FALSE = Disable
// Output: None
// Return: None
/////////////////////////////////////////////////////////////////////////////
void Decoder::SetVBIFrameMode(BOOL mode)
{
decFieldVBI_FRAME = (mode == FALSE) ? Off : On;
}
/////////////////////////////////////////////////////////////////////////////
// Method: BOOL Decoder::IsVBIFrameMode()
// Purpose: Check if VBI frame output mode is enabled
// Input: None
// Output: None
// Return: TRUE = Enable, FALSE = Disable
/////////////////////////////////////////////////////////////////////////////
BOOL Decoder::IsVBIFrameMode()
{
return (decFieldVBI_FRAME == On) ? TRUE : FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// Method: void Decoder::SetCodeInsertionEnabled(BOOL mode)
// Purpose:
// Input: BOOL mode - TRUE = Disabled, FALSE = Enabled
// Output: None
// Return: None
/////////////////////////////////////////////////////////////////////////////
void Decoder::SetCodeInsertionEnabled(BOOL mode)
{
decFieldCODE = (mode == TRUE) ? On : Off;
}
/////////////////////////////////////////////////////////////////////////////
// Method: BOOL Decoder::IsCodeInsertionEnabled()
// Purpose: Check if code insertion in data stream is enabled
// Input: None
// Output: None
// Return: TRUE = enabled, FALSE = disabled
/////////////////////////////////////////////////////////////////////////////
BOOL Decoder::IsCodeInsertionEnabled()
{
return (decFieldCODE == On) ? TRUE : FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// Method: void Decoder::Set16BitDataStream(BOOL mode)
// Purpose: 8 or 16 bit data stream
// Input: BOOL mode - TRUE = 16, FALSE = 8
// Output: None
// Return: None
/////////////////////////////////////////////////////////////////////////////
void Decoder::Set16BitDataStream(BOOL mode)
{
decFieldLEN = (mode == TRUE) ? On : Off;
}
/////////////////////////////////////////////////////////////////////////////
// Method: BOOL Decoder::Is16BitDatastream()
// Purpose: Check if 16 bit data stream
// Input: None
// Output: None
// Return: TRUE = 16, FALSE = 8
/////////////////////////////////////////////////////////////////////////////
BOOL Decoder::Is16BitDataStream()
{
return (decFieldLEN == On) ? TRUE : FALSE;
}
//===== Vertical Scaling register (E_VSCALE_HI, O_VSCALE_HI) ================
/////////////////////////////////////////////////////////////////////////////
// Method: void Decoder::SetChromaComb(BOOL mode)
// Purpose: Enable/Disable chroma comb
// Input: BOOL mode - TRUE = Enable, FALSE = Disable
// Output: None
// Return: None
/////////////////////////////////////////////////////////////////////////////
void Decoder::SetChromaComb(BOOL mode)
{
decFieldCOMB = (mode == FALSE) ? Off : On;
}
/////////////////////////////////////////////////////////////////////////////
// Method: BOOL Decoder::IsChromaComb()
// Purpose: Check if chroma comb is enable or disable
// Input: None
// Output: None
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -