⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emc_video.c

📁 关于嵌入式PCB板UI的程序
💻 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 + -