📄 emc_video.c
字号:
/*******************************************************************************
File name : emc_video.c
Description : video & audio set
Revision : 1.0
COPYRIGHT (C) EMC-HUST-JRC 2005.
Date Label Auther Comment
---- ---- ------ ---------------------
02-27-2006 Allen Wu Add VideoMode Control
02-16-2006 Allen Wu Add BCS control
01-03-2006 Allen Wu Created
*********************************************************************************/
/* Includes --------------------------------------------------------------- */
#include "stdio.h"
#include "stvid.h"
#include "stevt.h"
#include "stvout.h"
#include "stvtg.h"
#include "stdenc.h"
#include "stvmix.h"
#include "stgxobj.h"
#include "vid.h"
#include "../../src/stvout/src/Vout_drv.h"
#include "gui.h"
#include "osdwrap.h"
#include "emc_mainmenu.h"
#include "emc_font.h"
#include "emc_video.h"
#define BCS_BOX_WIDTH 420
#define BCS_BOX_HEIGHT 40
#define BCS_BOX_STEP_LENGTH 2
extern UIMenu_t *currMenu;
extern STVOUT_Handle_t VOUT_Handle[];
//extern STVID_ViewPortHandle_t VID_ViewPortHandle;
extern STVTG_Handle_t VTG_Handle;
extern int iAspectRatio; /* 0=Ignore on 4:3; 1=Letter-box on 16:9; 2=Pan&Scan on 16:9*/
extern int iOutputType; /* 0=PAL; 1=NTSCM */
/*the following are modified by Allen,02-20-2006*/
extern char cBrightness;/*0-255*/
extern char cSaturation;/*0-255*/
extern signed char sContrast;/*-127-127,but we use -50 to 50 infact*/
extern char cTransparent;/*0-63*/
extern clock_t infoStartTime;
extern int iPAL_Mode;
int BCSValue;
dvb_MenuCmd_e BCSstate;
extern void SRUIF_UpdateBoxInfo(void);
extern void AVC_NewVideoFrameEvent(STEVT_CallReason_t Reason, STEVT_EventConstant_t Event, const void *EventData);
extern ST_ErrorCode_t STVID_SetDisplayAspectRatioConversion(
const STVID_ViewPortHandle_t ViewPortHandle,
const STVID_DisplayAspectRatioConversion_t Mode);
//extern ST_ErrorCode_t VOUT_GetOutputParams(STVOUT_OutputParams_t *OutputParams_p);
extern ST_ErrorCode_t STVOUT_SetOutputParams(
const STVOUT_Handle_t Handle,
const STVOUT_OutputParams_t* const OutputParams_p
);
extern ST_ErrorCode_t stvout_HalSetBrightness( stvout_Unit_t *Unit_p, U8 Brightness);
//extern void RedrawCurrentMenu(int menulevel);
//----------------------------------------------------------------------------------------
static ST_ErrorCode_t setVideoMode(int index/*0:PAL,1:NTSC*/)
{
#if 0
STDENC_Mode_t Mode;
STVMIX_ScreenParams_t VMIXScreenParams;
STVTG_ModeParams_t VTGModeParams;
STVTG_TimingMode_t TimingMode;
STOSD_ScreenParams_t STOSD_ScreenParams;
ST_ErrorCode_t ErrCode = ST_NO_ERROR;
/* Mute VIDEO */
ErrCode = VOUT_Disable();
if (index == 0)
{ /*PAL MODE*/
Mode = STDENC_MODE_PALBDGHI;
DENC_SetEncodingMode(Mode, FALSE, FALSE); /* Set Encoding Modes for DENC */
STVTG_SetMode(VTG_Handle, STVTG_TIMING_MODE_576I50000_13500);
iPAL_Mode= 1;
}
else if (index == 1)
{ /*NTSC MODE*/
Mode = STDENC_MODE_NTSCM;
DENC_SetEncodingMode(Mode, FALSE, FALSE ); /* Set Encoding Modes for DENC */
STVTG_SetMode(VTG_Handle, STVTG_TIMING_MODE_480I59940_13500);
iPAL_Mode = 0;
}
STVTG_GetMode(VTG_Handle, &TimingMode, &VTGModeParams);
VMIXScreenParams.XStart = VTGModeParams.ActiveAreaXStart;
VMIXScreenParams.YStart = VTGModeParams.ActiveAreaYStart;
VMIXScreenParams.Height = VTGModeParams.ActiveAreaHeight;
VMIXScreenParams.Width = VTGModeParams.ActiveAreaWidth;
VMIXScreenParams.FrameRate = VTGModeParams.FrameRate;
VMIXScreenParams.ScanType = VTGModeParams.ScanType;
VMIXScreenParams.AspectRatio = STGXOBJ_ASPECT_RATIO_4TO3;
ErrCode = VMIX_SetScreenParams(0, 0, &VMIXScreenParams); /* Set screen params of the output screen */
STOSD_ScreenParams.Aspect = STGXOBJ_ASPECT_RATIO_4TO3;
STOSD_ScreenParams.XOffset = VTGModeParams.ActiveAreaXStart;
STOSD_ScreenParams.YOffset = VTGModeParams.ActiveAreaYStart;
STOSD_ScreenParams.Width = VTGModeParams.ActiveAreaWidth;
STOSD_ScreenParams.Height = VTGModeParams.ActiveAreaHeight;
STOSD_ScreenParams.FrameRate = (U8)VTGModeParams.FrameRate;
STOSD_ScreenParams.ScanType = VTGModeParams.ScanType;
ErrCode = STOSD_SetScreenParams(&STOSD_ScreenParams);
sttbx_Print("\n------STOSD_SetScreenParams = %s\n",GetErrorText(ErrCode));
ErrCode = EMC_ReshapeOsdRegion(iPAL_Mode);
sttbx_Print("\n------STOSD_ReshapeRegion = %s\n",GetErrorText(ErrCode));
/*show menu*/
RedrawCurrentMenu(2);
ErrCode = STOSD_EnableDisplay();
sttbx_Print("\n------STOSD_EnableDisplay = %s\n",GetErrorText(ErrCode));
STVID_EnableOutputWindow(VID_ViewPortHandle);
VOUT_Enable();
return ErrCode;
#endif
}
void msm_SetVideoAspectRatio(void)
{
STVID_DisplayAspectRatioConversion_t Mode;
int index = currMenu->itemSelectedIndex;
switch(index)
{
case 0:/*Ignore on 4:3*/
Mode = STVID_DISPLAY_AR_CONVERSION_IGNORE;
break;
case 1:/*Letter-box on 16:9*/
Mode = STVID_DISPLAY_AR_CONVERSION_LETTER_BOX;
break;
case 2:/*Pan&Scan on 16:9*/
Mode = STVID_DISPLAY_AR_CONVERSION_PAN_SCAN;
break;
}
STVID_SetDisplayAspectRatioConversion(VID_ViewPortHandle,Mode);
iAspectRatio = index;
SRUIF_UpdateBoxInfo();
}
void msm_SetVideoMode(void)
{
int index = currMenu->itemSelectedIndex;
/*index: 0---PAL MODE; 1---NTSC MODE*/
/*iPAL_MODE:0---NTSC MODE; 1---PAL MODE*/
if(iPAL_Mode!=index)
return;
iOutputType = index;
setVideoMode(iOutputType);
SRUIF_UpdateBoxInfo();
}
/***********************************************************************/
/* Brightness:
To adjust the luminance intensity of the display video image.
This value is unsigned and scaled between 1 to 254.
Default value are 128.
Contrast:
to adjust the relative difference between higher and lower intensity luminance
values of the display image.
This value is signed and scaled between -128 to 127.
Default value are 0.
Saturation:
to adjust the color intensity of the displayed video image.
This value is unsigned and scaled between 1 to 254.
Default value are 128.
NOTE:We set all between 0 to 100
***********************************************************************/
void setBrightness(U8 Brightness)
{
stvout_Unit_t *Unit_p = (stvout_Unit_t *) VOUT_Handle[0];
Unit_p->Device_p->Out.Analog.BCSLevel.Brightness = Brightness;
stvout_HalSetBrightness(Unit_p,Brightness);
}
void setContrast(S8 Contrast)
{
stvout_Unit_t *Unit_p = (stvout_Unit_t *) VOUT_Handle[0];
Unit_p->Device_p->Out.Analog.BCSLevel.Contrast = Contrast;
stvout_HalSetContrast(Unit_p,Contrast);
}
void setSaturation(U8 Saturation)
{
stvout_Unit_t *Unit_p = (stvout_Unit_t *) VOUT_Handle[0];
Unit_p->Device_p->Out.Analog.BCSLevel.Saturation = Saturation;
stvout_HalSetSaturation(Unit_p,Saturation);
}
static U8 redefineBCSLevel(dvb_MenuCmd_e eNumber)
{
U8 newBCSLevel = 0;
switch(eNumber)
{
case cmd_Brightness:
case cmd_Saturation:
newBCSLevel = BCSValue-78;
break;
case cmd_Contrast:
/*
if(BCSValue<0)
newBCSLevel = BCSValue+50;
else
newBCSLevel = BCSValue;
*/
newBCSLevel = BCSValue+50;
break;
}
return newBCSLevel;
}
U8 getBCSValue(dvb_MenuCmd_e eNumber)
{
STVOUT_OutputParams_t OutputParams_p;
VOUT_GetOutputParams(&OutputParams_p);
switch(eNumber)
{
case cmd_Brightness:
BCSValue = OutputParams_p.Analog.BCSLevel.Brightness;
sttbx_Print("\nBrightness = %d\n",BCSValue);
return BCSValue-78;
case cmd_Contrast:
BCSValue = OutputParams_p.Analog.BCSLevel.Contrast;
sttbx_Print("\nContrast = %d\n",BCSValue);
#if 0
if(BCSValue<0)
return BCSValue+50;
else
return BCSValue;
#else
return BCSValue+50;
#endif
case cmd_Saturation:
BCSValue = OutputParams_p.Analog.BCSLevel.Saturation;
sttbx_Print("\nSaturation = %d\n",BCSValue);
return BCSValue-78;
}
}
void msm_ShowBCSWindow(dvb_MenuCmd_e eNumber)
{
U8 newBCSLevel;
STVOUT_OutputParams_t OutputParams_p;
int x = (ProviewWindowParams.Width - BCS_BOX_WIDTH)/2;
int y = ProviewWindowParams.Height -BCS_BOX_HEIGHT-40;
char sBCSValue[4];
EMC_HideAllRegions();
STOSD_FillRectangle(Handle_ProviewWindow,
x, y, BCS_BOX_WIDTH, BCS_BOX_HEIGHT, dialogcolor);
STOSD_FillRectangle(Handle_ProviewWindow,
x+130, y+10, 100*BCS_BOX_STEP_LENGTH, 20, whitecolor);
VOUT_GetOutputParams(&OutputParams_p);
switch(eNumber)
{
case cmd_Brightness:
BCSValue = OutputParams_p.Analog.BCSLevel.Brightness;
EMC_DrawTextRectangle(Handle_ProviewWindow,
x+15, y+(BCS_BOX_HEIGHT-24)/2, 120, 24,
"BRIGHTNESS", JLEFT, FONT_MYFONT, FALSE,
whitecolor, dialogcolor, dialogcolor);
break;
case cmd_Contrast:
BCSValue = OutputParams_p.Analog.BCSLevel.Contrast;
EMC_DrawTextRectangle(Handle_ProviewWindow,
x+15, y+(BCS_BOX_HEIGHT-24)/2, 120, 24,
"CONTRAST", JLEFT, FONT_MYFONT, FALSE,
whitecolor, dialogcolor, dialogcolor);
break;
case cmd_Saturation:
BCSValue = OutputParams_p.Analog.BCSLevel.Saturation;
EMC_DrawTextRectangle(Handle_ProviewWindow,
x+15, y+(BCS_BOX_HEIGHT-24)/2, 120, 24,
"SATURATION", JLEFT, FONT_MYFONT, FALSE,
whitecolor, dialogcolor, dialogcolor);
break;
}
newBCSLevel = redefineBCSLevel(eNumber);
STOSD_FillRectangle(Handle_ProviewWindow,
x+130, y+10, newBCSLevel*BCS_BOX_STEP_LENGTH, 20, darkyellow);
sBCSValue[0] = newBCSLevel/100+'0';
sBCSValue[1] = (newBCSLevel%100)/10+'0';
sBCSValue[2] = newBCSLevel%10+'0';
sBCSValue[3] = '\0';
EMC_DrawTextRectangle(Handle_ProviewWindow,
x+130+100*BCS_BOX_STEP_LENGTH+5, y+(BCS_BOX_HEIGHT-24)/2, 40, 24,
sBCSValue, JLEFT, FONT_MYFONT, FALSE,
whitecolor, dialogcolor, dialogcolor);
BCSstate = eNumber;
infoStartTime = time_now();
EMC_ShowRegion();
}
void msm_BCSChangeValue(dvb_MenuCmd_e eNumber)
{
U8 newBCSLevel;
char sBCSValue[4];
STVOUT_OutputParams_t OutputParams_p;
int x = (ProviewWindowParams.Width - BCS_BOX_WIDTH)/2;
int y = ProviewWindowParams.Height - BCS_BOX_HEIGHT -40;
VOUT_GetOutputParams(&OutputParams_p);
switch(BCSstate)
{
case cmd_Brightness:
BCSValue = OutputParams_p.Analog.BCSLevel.Brightness;
sttbx_Print("\n----BCSValue = %d\n",BCSValue);
if(eNumber == cmd_ArrowDown)
BCSValue = BCSValue>78? BCSValue-1: BCSValue;
else if(eNumber == cmd_ArrowUp)
BCSValue = BCSValue<178? BCSValue+1: BCSValue;
cBrightness = BCSValue;
setBrightness(BCSValue);
sttbx_Print("\n----BCSValue = %d\n",BCSValue);
break;
case cmd_Contrast:
BCSValue = OutputParams_p.Analog.BCSLevel.Contrast;
sttbx_Print("\n----BCSValue = %d\n",BCSValue);
if(eNumber == cmd_ArrowDown)
BCSValue = BCSValue>-50? BCSValue-1: BCSValue;
else if(eNumber == cmd_ArrowUp)
BCSValue = BCSValue<50? BCSValue+1: BCSValue;
sContrast = BCSValue;
setContrast(BCSValue);
sttbx_Print("\n----BCSValue = %d\n",BCSValue);
break;
case cmd_Saturation:
BCSValue = OutputParams_p.Analog.BCSLevel.Saturation;
sttbx_Print("\n----BCSValue = %d\n",BCSValue);
if(eNumber == cmd_ArrowDown)
BCSValue = BCSValue>78? BCSValue-1: BCSValue;
else if(eNumber == cmd_ArrowUp)
BCSValue = BCSValue<178? BCSValue+1: BCSValue;
cSaturation = BCSValue;
setSaturation(BCSValue);
sttbx_Print("\n----BCSValue = %d\n",BCSValue);
break;
}
newBCSLevel = redefineBCSLevel(BCSstate);
sBCSValue[0] = newBCSLevel/100+'0';
sBCSValue[1] = (newBCSLevel%100)/10+'0';
sBCSValue[2] = newBCSLevel%10+'0';
sBCSValue[3] = '\0';
STOSD_FillRectangle(Handle_ProviewWindow,
x+130+(newBCSLevel+(eNumber == cmd_ArrowUp? -1: 0))*BCS_BOX_STEP_LENGTH, y+10, BCS_BOX_STEP_LENGTH, 20, eNumber == cmd_ArrowUp? darkyellow: whitecolor);
EMC_DrawTextRectangle(Handle_ProviewWindow,
x+130+100*BCS_BOX_STEP_LENGTH+5, y+(BCS_BOX_HEIGHT-24)/2, 40, 24,
sBCSValue, JLEFT, FONT_MYFONT, FALSE,
whitecolor, dialogcolor, dialogcolor);
SRUIF_UpdateBoxInfo();
infoStartTime = time_now();
}
void msm_HideBCSWindow(void)
{
EMC_HideAllRegions();
}
/*------------------------------------EOF---------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -