📄 video.c
字号:
//----------------------------------------------------------------------------------------------------
// ID Code : Video.c No.0001
// Update Note :
//
//----------------------------------------------------------------------------------------------------
#define __VIDEO__
#include "..\Header\Include.h"
#if (_VIDEO_SUPPORT == _ON)
//--------------------------------------------------
// Description : Display video set process
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CVideoDisplaySet(void)
{
/*
WORD ustemp;
BYTE field, temp;
//float usclock;
field = (BYTE)bVideoType; //flag 50Hz or 60Hz. Note by zhang_dc
//CI2cWrite(_VIDEO_DEVICE, ADDRESS(0x9A), LENGTH(6), tVIDEO_TABLE_FIELD[field]);
stModeInfo.IHTotal = tVIDEO_TABLE_INPUT_INFO[field][0];
stModeInfo.IHStartPos = tVIDEO_TABLE_INPUT_INFO[field][1];
stModeInfo.IHWidth = tVIDEO_TABLE_INPUT_INFO[field][2];
stModeInfo.IVStartPos = tVIDEO_TABLE_INPUT_INFO[field][3];
stModeInfo.IVHeight = tVIDEO_TABLE_INPUT_INFO[field][4];
stDisplayInfo.DHWidth = Panel.DHEndPos - Panel.DHStartPos;
stDisplayInfo.DVHeight = Panel.DVEndPos - Panel.DVStartPos;
stDisplayInfo.DHTotal = Panel.DHTotal;
ucHStartBias = 100;
ucVStartBias = 0;
//x.hu
if (stDisplayInfo.DHWidth <= tVIDEO_TABLE_INPUT_INFO[field][2]){
ucVStartBias = CAdjustIVS2DVSDelay(0x01); //V scaler up
}
else {
ucVStartBias = CAdjustIVS2DVSDelay(0x05);
}
if(ucVStartBias > stModeInfo.IVStartPos)
ucVStartBias = stModeInfo.IVStartPos;
//Set Capture Window
ustemp = stModeInfo.IHStartPos + _CAPTURE_HDELAY - (ucHStartBias + _PROGRAM_HDELAY);
CScalerSetBit(_IPH_ACT_STA_H_09, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(ustemp) & (_BIT2 | _BIT1 | _BIT0));
CScalerSetByte(_IPH_ACT_STA_L_0A, LOBYTE(ustemp));
CScalerSetBit(_IPH_ACT_WID_H_0B, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(stModeInfo.IHWidth) & (_BIT2 | _BIT1 | _BIT0));
CScalerSetByte(_IPH_ACT_WID_L_0C, LOBYTE(stModeInfo.IHWidth));
ustemp = stModeInfo.IVStartPos - (ucVStartBias + _PROGRAM_VDELAY);
CScalerSetBit(_IPV_ACT_STA_H_0D, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(ustemp) & (_BIT2 | _BIT1 | _BIT0));
CScalerSetByte(_IPV_ACT_STA_L_0E, LOBYTE(ustemp));
CScalerSetBit(_IPV_ACT_LEN_H_0F, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(stModeInfo.IVHeight) & (_BIT2 | _BIT1 | _BIT0));
CScalerSetByte(_IPV_ACT_LEN_L_10, LOBYTE(stModeInfo.IVHeight));
//Set DH_TOTAL
pData[0] = (HIBYTE(stDisplayInfo.DHTotal - 4) & 0x0f);
pData[1] = (LOBYTE(stDisplayInfo.DHTotal - 4));
CScalerWrite(_DH_TOTAL_H_2A, 2, pData, _AUTOINC);
// Set internal input H sync delay
CAdjustIHSDelay(ucHStartBias + _PROGRAM_HDELAY);
// Set internal input V sync delay
CAdjustIVSDelay(ucVStartBias + _PROGRAM_VDELAY);
//Set DClk
if(field == _VIDEO_50HZ)
//usclock = ((15.625 * stDisplayInfo.DVHeight) / stModeInfo.IVHeight) * stDisplayInfo.DHTotal;
//usclock = (((LWORD)15625 * stDisplayInfo.DVHeight) / (LWORD)stModeInfo.IVHeight) * (LWORD)stDisplayInfo.DHTotal / 1000;
CAdjustDPLL((((LWORD)15625 * stDisplayInfo.DVHeight) / (LWORD)stModeInfo.IVHeight) * (LWORD)stDisplayInfo.DHTotal / 1000);
else
//usclock = ((15.734 * stDisplayInfo.DVHeight) / stModeInfo.IVHeight) * stDisplayInfo.DHTotal;
//usclock = (((LWORD)15734 * stDisplayInfo.DVHeight) / (LWORD)stModeInfo.IVHeight) * (LWORD)stDisplayInfo.DHTotal / 1000;
CAdjustDPLL((((LWORD)15734 * stDisplayInfo.DVHeight) / (LWORD)stModeInfo.IVHeight) * (LWORD)stDisplayInfo.DHTotal / 1000);
//CAdjustDPLL(usclock);
//x.hu
if (stDisplayInfo.DHWidth <= tVIDEO_TABLE_INPUT_INFO[field][2]){
CModeSetScaling(0x01); // 0x01: V SCALE UP
}
else {
CModeSetScaling(0x05); // 0x05: ALL SCALE UP
}
// Turn off full-line buffer
CScalerSetBit(_SCALE_CTRL_19, ~_BIT4, 0x00);
//x.hu
if (stDisplayInfo.DHWidth <= tVIDEO_TABLE_INPUT_INFO[field][2]){
CAdjustIVS2DVSDelay(0x01); // 0x05: V SCALE UP
}
else {
CAdjustIVS2DVSDelay(0x05); // 0x05: ALL SCALE UP
}
// Enable display timing
if (!GET_VIDEO_PN_ACTION())
CScalerSetBit(_VDISP_CTRL_28, ~(_BIT5 | _BIT3 | _BIT1 | _BIT0), (_BIT5 | _BIT3 | _BIT1 | _BIT0));
//set to default
stConBriData.Brightness = _VBRIGHT_DEFAULT;
stConBriData.Contrast = _VCONTRAST_DEFAULT;
CEepromLoadColorTempData();
CAdjustContrast();
CAdjustBrightness();
CAdjustBacklight();
//load VColor value.
CEepromLoadBriConData();
CEepromLoadVideoData();
CAdjustVideoContrast();
CAdjustVideoBright();
CAdjustVideoSaturation();
CAdjustVideoHue();
CAdjustVideoSharpness();
CPowerADCAPLLOff();
pData[0] = CFrameSyncDo();
SET_MODESTABLE();
// Change to even/odd field frame sync
CScalerSetByte(_IPV_ACT_STA_L_0E, CScalerGetBit(_IPV_ACT_STA_L_0E, 0xff) + 1);
CScalerRead(_IV_DV_DELAY_CLK_ODD_41, LENGTH(1), &temp, _NON_AUTOINC);
ustemp = (WORD)temp * 16 + 16;
ustemp += stModeInfo.IHTotal;
CScalerSetByte(_IV_DV_DELAY_CLK_ODD_41, (ustemp - 16) / 16);
ustemp -= stModeInfo.IHTotal / 2;
CScalerSetByte(_IV_DV_DELAY_CLK_EVEN_42, (ustemp - 16) / 16);
CScalerSetBit(_FS_DELAY_FINE_TUNING_43, ~(_BIT1), _BIT1);
CModeSetupEtcs(_FUNCTION_DISABLE);
#if 0
// x.hu, 20050803, add
// start audio after 1s from showing video
#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
CTimerDelayXms(600); // here also delay light on
#endif
#if (_AUDIO_DEVICE != _AUDIO_NONE)
CAdjustVolume();
#endif
#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
#if (_FM_MODULATION == _ENABLE)
CAudio2FM();
#endif
#endif
#endif
*/
//version 200D
WORD ustemp;
BYTE field, temp;
field = (BYTE)bVideoType;
// saa7114
//CI2cWrite(_VIDEO_DEVICE, ADDRESS(0x9A), LENGTH(6), tVIDEO_TABLE_FIELD[field]);
stModeInfo.IHTotal = tVIDEO_TABLE_INPUT_INFO[field][0];
stModeInfo.IHStartPos = tVIDEO_TABLE_INPUT_INFO[field][1];
stModeInfo.IHWidth = tVIDEO_TABLE_INPUT_INFO[field][2];
stModeInfo.IVStartPos = tVIDEO_TABLE_INPUT_INFO[field][3];
stModeInfo.IVHeight = tVIDEO_TABLE_INPUT_INFO[field][4];
stDisplayInfo.DHWidth = Panel.DHEndPos - Panel.DHStartPos;
stDisplayInfo.DVHeight = Panel.DVEndPos - Panel.DVStartPos;
stDisplayInfo.DVStartPos = Panel.DVStartPos;
stDisplayInfo.DHTotal = Panel.DHTotal;
ucHStartBias = 100;
ucVStartBias = 0;
//x.hu
if (stDisplayInfo.DHWidth <= tVIDEO_TABLE_INPUT_INFO[field][2]){
ucVStartBias = CAdjustIVS2DVSDelay(0x01); //V scaler up
}
else {
ucVStartBias = CAdjustIVS2DVSDelay(0x05);
}
if(ucVStartBias > stModeInfo.IVStartPos)
ucVStartBias = stModeInfo.IVStartPos;
//Set Capture Window
ustemp = stModeInfo.IHStartPos + _CAPTURE_HDELAY - (ucHStartBias + _PROGRAM_HDELAY);
CScalerSetBit(_IPH_ACT_STA_H_09, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(ustemp) & (_BIT2 | _BIT1 | _BIT0));
CScalerSetByte(_IPH_ACT_STA_L_0A, LOBYTE(ustemp));
CScalerSetBit(_IPH_ACT_WID_H_0B, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(stModeInfo.IHWidth) & (_BIT2 | _BIT1 | _BIT0));
CScalerSetByte(_IPH_ACT_WID_L_0C, LOBYTE(stModeInfo.IHWidth));
ustemp = stModeInfo.IVStartPos - (ucVStartBias + _PROGRAM_VDELAY);
CScalerSetBit(_IPV_ACT_STA_H_0D, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(ustemp) & (_BIT2 | _BIT1 | _BIT0));
CScalerSetByte(_IPV_ACT_STA_L_0E, LOBYTE(ustemp));
CScalerSetBit(_IPV_ACT_LEN_H_0F, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(stModeInfo.IVHeight) & (_BIT2 | _BIT1 | _BIT0));
CScalerSetByte(_IPV_ACT_LEN_L_10, LOBYTE(stModeInfo.IVHeight));
//Set DH_TOTAL
pData[0] = (HIBYTE(stDisplayInfo.DHTotal - 4) & 0x0f);
pData[1] = (LOBYTE(stDisplayInfo.DHTotal - 4));
CScalerWrite(_DH_TOTAL_H_2A, 2, pData, _AUTOINC);
// Calculate DV_TOTAL setting for watchdog
((WORD *)pData)[2] = (LWORD)stModeInfo.IVTotal * (LWORD)(stDisplayInfo.DVHeight) / stModeInfo.IVHeight + 64;
pData[0] = (HIBYTE(((WORD *)pData)[2]) & 0x0f);
pData[1] = (LOBYTE(((WORD *)pData)[2]));
CScalerWrite(_DV_TOTAL_H_35, 2, pData, _AUTOINC);
// Set internal input H sync delay
CAdjustIHSDelay(ucHStartBias + _PROGRAM_HDELAY);
// Set internal input V sync delay
CAdjustIVSDelay(ucVStartBias + _PROGRAM_VDELAY);
//Set DClk
if(field == _VIDEO_50HZ)
//usclock = ((15.625 * stDisplayInfo.DVHeight) / stModeInfo.IVHeight) * stDisplayInfo.DHTotal;
//usclock = (((LWORD)15625 * stDisplayInfo.DVHeight) / (LWORD)stModeInfo.IVHeight) * (LWORD)stDisplayInfo.DHTotal / 1000;
CAdjustDPLL((((LWORD)15625 * stDisplayInfo.DVHeight) / (LWORD)stModeInfo.IVHeight) * (LWORD)stDisplayInfo.DHTotal / 1000);
else
//usclock = ((15.734 * stDisplayInfo.DVHeight) / stModeInfo.IVHeight) * stDisplayInfo.DHTotal;
//usclock = (((LWORD)15734 * stDisplayInfo.DVHeight) / (LWORD)stModeInfo.IVHeight) * (LWORD)stDisplayInfo.DHTotal / 1000;
CAdjustDPLL((((LWORD)15734 * stDisplayInfo.DVHeight) / (LWORD)stModeInfo.IVHeight) * (LWORD)stDisplayInfo.DHTotal / 1000);
//CAdjustDPLL(usclock);
//x.hu
if (stDisplayInfo.DHWidth <= tVIDEO_TABLE_INPUT_INFO[field][2]){
CModeSetScaling(0x01); // 0x01: V SCALE UP
}
else {
CModeSetScaling(0x05); // 0x05: ALL SCALE UP
}
// Turn off full-line buffer
CScalerSetBit(_SCALE_CTRL_19, ~_BIT4, 0x00);
//x.hu
if (stDisplayInfo.DHWidth <= tVIDEO_TABLE_INPUT_INFO[field][2]){
CAdjustIVS2DVSDelay(0x01); // 0x05: V SCALE UP
}
else {
CAdjustIVS2DVSDelay(0x05); // 0x05: ALL SCALE UP
}
// Enable display timing
#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
if (!GET_VIDEO_PN_ACTION())
CScalerSetBit(_VDISP_CTRL_28, ~(_BIT5 | _BIT3 | _BIT1 | _BIT0), (_BIT5 | _BIT3 | _BIT1 | _BIT0));
#else
CScalerSetBit(_VDISP_CTRL_28, ~(_BIT5 | _BIT3 | _BIT1 | _BIT0), (_BIT5 | _BIT3 | _BIT1 | _BIT0));
#endif
CEepromLoadBriConData();
//x.hu
// stConBriData.Brightness = _VBRIGHT_DEFAULT;
stConBriData.Contrast = _VCONTRAST_DEFAULT;
CEepromLoadColorTempData();
CAdjustContrast();
CAdjustBrightness();
CAdjustBacklight();
//x.hu, load VColor value.
CEepromLoadBriConData();
CEepromLoadVideoData();
CAdjustVideoContrast();
CAdjustVideoBright();
CAdjustVideoSaturation();
CAdjustVideoHue();
CAdjustVideoSharpness();
CPowerADCAPLLOff();
pData[0] = CFrameSyncDo();
SET_MODESTABLE();
// Change to even/odd field frame sync
CScalerSetByte(_IPV_ACT_STA_L_0E, CScalerGetBit(_IPV_ACT_STA_L_0E, 0xff) + 1);
CScalerRead(_IV_DV_DELAY_CLK_ODD_41, LENGTH(1), &temp, _NON_AUTOINC);
ustemp = (WORD)temp * 16 + 16;
ustemp += stModeInfo.IHTotal;
CScalerSetByte(_IV_DV_DELAY_CLK_ODD_41, (ustemp - 16) / 16);
ustemp -= stModeInfo.IHTotal / 2;
CScalerSetByte(_IV_DV_DELAY_CLK_EVEN_42, (ustemp - 16) / 16);
CScalerSetBit(_FS_DELAY_FINE_TUNING_43, ~(_BIT1), _BIT1);
CTimerDelayXms(100);
CModeSetupEtcs(_FUNCTION_DISABLE);
}
//x.hu, for source change
bit CSourceChange(void)
{
if (GET_SOURCESTATUS() == 0) {
return _FALSE;
}
else if (!GET_POWERSTATUS()) {
// don't switch source while power off
CLR_SOURCESTATUS();
return _FALSE;
}
else {
if (GET_FIRST_LOADFONT() == _TRUE) {
CLR_FIRST_LOADFONT();
COsdDispFirstTimeLoadFont();
}
//#if (_SOURCE_TYPE == _SOURCE_TYPE_2V)
if ((GET_SOURCESTATUS()-1) != stSystemData.InputSource)//not current source
{
// update input source
stSystemData.InputSource = GET_SOURCESTATUS()-1;
// save
CEepromSaveSystemData();
//ucOsdEventMsg = _SAVE_EE_SYSTEMDATA_MSG;
// clear destination source
CLR_SOURCESTATUS();
//x.hu, if source change, mute is canceled:
//!!!demo do not cancel mute state after source switch
#if (_MUTE_AUTO_DISABLE == _ENABLE)
if (stAudioData.audioFlag&_BIT7) {
CAdjustMute();
}
#endif
return _TRUE;
}
else {
// current channel:
// if active state, only show hint
if (1) {//(ucCurrState == _ACTIVE_STATE) {
ucOsdEventMsg = _SHOW_SOURCE_MSG;
CTimerReactiveTimerEvent(SEC(4),COsdDispOsdTimerEvent);
//if no signal, press current channel selected key cause always show blue BG and source hints,
// untill timeover(5s) after the key is released.
if (ucCurrState == _NOSIGNAL_STATE || ucCurrState == _NOSUPPORT_STATE) {
CTimerReactiveTimerEvent(SEC(5), CModePowerSavingEvent);
}
}
// if not active state, source key will lead to reset, then work as search mode
else {
CModeResetMode();
}
}
//#endif
// x.hu, for other source combinations
// ...
// clear destination source
CLR_SOURCESTATUS();
return _FALSE;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -