📄 ssbsiprender.cpp
字号:
/*********************************************************************************
* *
* Copyright (c) 2008 Samsung System LSI *
* All rights reserved. *
* *
* This software is test sample code for Hybrid Divx Decoder *
* *
* Author : Jiyoung Shin *
* Last Changed : 2008.06.10 *
*********************************************************************************/
#include <windows.h>
// Platform Dependent
#include <SVEDriverAPI.h>
#include "SsbSipRender.h"
#include "SsbSipMpeg4Decode.h"
HANDLE hEvent = INVALID_HANDLE_VALUE;
HANDLE displayThread = INVALID_HANDLE_VALUE;
HANDLE hVideoDrv = INVALID_HANDLE_VALUE;
static UINT DisplayBuffPhyAddr;
static unsigned int DisplayWidth, DisplayHeight;
static unsigned int DisplayBufWidth, DisplayBufHeight;
static unsigned int DisplayOffsetX, DisplayOffsetY;
static int SsbSipDisplayInit()
{
DWORD dwBytes;
hVideoDrv = CreateFile( L"VDE0:", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
if (hVideoDrv == INVALID_HANDLE_VALUE)
{
RETAILMSG(1,(L"[VDE:ERR] VDE0 Open Device Failed\n"));
return 0;
}
// Request FIMD Win0 H/W Resource to Video Engine Driver for Local Path
if ( !DeviceIoControl(hVideoDrv, IOCTL_SVE_RSC_REQUEST_FIMD_WIN0, NULL, 0, NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(1,(L"[VDE:ERR] IOCTL_SVE_RSC_REQUEST_FIMD_WIN0 Failed\n"));
return 0;
}
// Request Post Processor H/W Resource to Video Engine Driver for Local Path
if ( !DeviceIoControl(hVideoDrv, IOCTL_SVE_RSC_REQUEST_POST, NULL, 0, NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(1,(L"[VDE:ERR] IOCTL_SVE_RSC_REQUEST_POST Failed\n"));
return 0;
}
return 1;
}
int SsbSipDisplayDeInit()
{
DWORD dwBytes;
DWORD dwWinNum;
#ifdef MEM_TO_MEM
dwWinNum = DISP_WIN0;
if ( !DeviceIoControl(hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_DISABLE, &dwWinNum, sizeof(DWORD), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(1,(L"[VDE:ERR] IOCTL_SVE_FIMD_SET_WINDOW_DISABLE Failed\n"));
return 0;
}
#else //LOCAL_PATH
if ( !DeviceIoControl(hVideoDrv, IOCTL_SVE_LOCALPATH_SET_WIN0_STOP, NULL, 0, NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(1,(L"[VDE:ERR] IOCTL_SVE_LOCALPATH_SET_WIN0_STOP Failed\n"));
return 0;
}
#endif
// Release FIMD Win0 H/W Resource to Video Engine Driver for Local Path
if ( !DeviceIoControl(hVideoDrv, IOCTL_SVE_RSC_RELEASE_FIMD_WIN0, NULL, 0, NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(1,(L"[VDE:ERR] IOCTL_SVE_RSC_RELEASE_FIMD_WIN0 Failed\n"));
return 0;
}
// Release Post Processor H/W Resource to Video Engine Driver for Local Path
if ( !DeviceIoControl(hVideoDrv, IOCTL_SVE_RSC_RELEASE_POST, NULL, 0, NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(1,(L"[VDE:ERR] IOCTL_SVE_RSC_RELEASE_POST Failed\n"));
return 0;
}
CloseHandle(hVideoDrv);
return 0;
}
static DWORD WINAPI SsbSipDisplayThread()
{
int ret;
BOOL bFirstRender;
SVEARG_FIMD_WIN_MODE tParamMode;
SVEARG_FIMD_WIN_FRAMEBUFFER tParamFB;
SVEARG_FIMD_WIN_COLORKEY tParamCKey;
SVEARG_FIMD_WIN_ALPHA tParamAlpha;
SVEARG_POST_PARAMETER tParamPost;
SVEARG_POST_BUFFER tParamBuffer;
DWORD dwBytes;
DWORD dwWinNum;
printf("StartDisplay\n");
if(!SsbSipDisplayInit()) ExitThread(0);
bFirstRender = TRUE;
while(TRUE){
WaitForSingleObject(hEvent, INFINITE);
#ifdef MEM_TO_MEM
if (bFirstRender)
{
bFirstRender = FALSE;
tParamMode.dwWinMode = DISP_WIN0_DMA;
tParamMode.dwBPP = DISP_16BPP_565;
tParamMode.dwWidth = DISPLAY_X;
tParamMode.dwHeight = DISPLAY_Y;
tParamMode.dwOffsetX = (LCD_X - tParamMode.dwWidth)/2;
tParamMode.dwOffsetY = (LCD_Y - tParamMode.dwHeight)/2;
if ( !DeviceIoControl(hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_MODE, &tParamMode, sizeof(SVEARG_FIMD_WIN_MODE), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(1,(L"[VDE:ERR] IOCTL_SVE_FIMD_SET_WINDOW_MODE Failed\n"));
return 0;
}
// Color Key Disable
tParamCKey.dwWinNum = DISP_WIN1;
tParamCKey.bOnOff = FALSE;
tParamCKey.dwDirection = DISP_FG_MATCH_BG_DISPLAY;
tParamCKey.dwColorKey = 0;
tParamCKey.dwCompareKey = 0;
// Alpha Set to 0x0 (Show Window0)
tParamAlpha.dwWinNum = DISP_WIN1;
tParamAlpha.dwMethod = DISP_ALPHA_PER_PLANE;
tParamAlpha.dwAlpha0 = 0x0;
tParamAlpha.dwAlpha1 = 0x0;
if ( !DeviceIoControl(hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_BLEND_COLORKEY, &tParamCKey, sizeof(SVEARG_FIMD_WIN_COLORKEY), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(1,(L"[VDE:ERR] IOCTL_SVE_FIMD_SET_WINDOW_BLEND_COLORKEY Failed\n"));
return 0;
}
if ( !DeviceIoControl(hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_BLEND_ALPHA, &tParamAlpha, sizeof(SVEARG_FIMD_WIN_ALPHA), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(1,(L"[VDE:ERR] IOCTL_SVE_FIMD_SET_WINDOW_BLEND_ALPHA Failed\n"));
return 0;
}
// Set Window0 Framebuffer
tParamFB.dwWinNum = DISP_WIN0;
tParamFB.dwFrameBuffer = 0x57400000;
tParamFB.bWaitForVSync = FALSE;
if ( !DeviceIoControl(hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_FRAMEBUFFER, &tParamFB, sizeof(SVEARG_FIMD_WIN_FRAMEBUFFER), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(1,(L"[VDE:ERR] IOCTL_SVE_FIMD_SET_WINDOW_FRAMEBUFFER Failed\n"));
return 0;
}
// Window0 Enable
dwWinNum = DISP_WIN0;
if ( !DeviceIoControl(hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_ENABLE, &dwWinNum, sizeof(DWORD), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(1,(L"[VDE:ERR] IOCTL_SVE_FIMD_SET_WINDOW_ENABLE Failed\n"));
return 0;
}
tParamPost.dwOpMode = POST_PER_FRAME_MODE;
tParamPost.dwScanMode = POST_PROGRESSIVE;
tParamPost.dwSrcType = POST_SRC_YUV420;
tParamPost.dwSrcBaseWidth = DisplayBufWidth;
tParamPost.dwSrcBaseHeight = DisplayBufHeight;
tParamPost.dwSrcOffsetX = DisplayOffsetX;
tParamPost.dwSrcOffsetY = DisplayOffsetY;
tParamPost.dwSrcWidth = DisplayWidth;
tParamPost.dwSrcHeight = DisplayHeight ;
tParamPost.dwDstType = POST_DST_RGB16;
tParamPost.dwDstBaseWidth = DISPLAY_X;
tParamPost.dwDstBaseHeight = DISPLAY_Y;
tParamPost.dwDstWidth = DISPLAY_X;
tParamPost.dwDstHeight = DISPLAY_Y;
tParamPost.dwDstOffsetX = (tParamPost.dwDstBaseWidth - tParamPost.dwDstWidth)/2;
tParamPost.dwDstOffsetY = (tParamPost.dwDstBaseHeight - tParamPost.dwDstHeight)/2;
if ( !DeviceIoControl(hVideoDrv, IOCTL_SVE_POST_SET_PROCESSING_PARAM, &tParamPost, sizeof(SVEARG_POST_PARAMETER), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(1,(L"[VDE:ERR] IOCTL_SVE_POST_SET_PROCESSING_PARAM Failed\n"));
return 0;
}
tParamBuffer.dwBufferRGBY = DisplayBuffPhyAddr;
tParamBuffer.dwBufferCb = tParamBuffer.dwBufferRGBY+tParamPost.dwSrcBaseWidth*tParamPost.dwSrcBaseHeight;
tParamBuffer.dwBufferCr = tParamBuffer.dwBufferCb+tParamPost.dwSrcBaseWidth*tParamPost.dwSrcBaseHeight/4;
tParamBuffer.bWaitForVSync = FALSE;
if ( !DeviceIoControl(hVideoDrv, IOCTL_SVE_POST_SET_SOURCE_BUFFER, &tParamBuffer, sizeof(SVEARG_POST_BUFFER), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(1,(L"[VDE:ERR] IOCTL_SVE_POST_SET_SOURCE_BUFFER Failed\n"));
return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -