tvcontrol.cpp
来自「6410BSP3」· C++ 代码 · 共 447 行 · 第 1/2 页
CPP
447 行
DevOutputEnableTVDMA();
}
else if (eType == TV_DMA_OVERLAY)
{
if (m_OverlayCtxt.bShow)
{
DevUpdateTVDMAContext();
DevOutputEnableTVDMA();
}
}
RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] --S3C6410Disp::DevSetTVDMAMode()\n\r")));
return TRUE;
}
void
S3C6410Disp::DevUpdateTVDMAContext(void)
{
RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] ++S3C6410Disp::DevUpdateTVDMAContext()\n\r")));
if (m_eTVDMAMode == TV_DMA_PRIMARY)
{
if (m_pModeEx->ePixelFormat == ddgpePixelFormat_565)
{
m_TVDMACtxt.dwSourceFormat = TVSC_SRC_RGB16;
}
#if 0 // FIMD can not support Packed RGB888
else if (m_pModeEx->ePixelFormat == ddgpePixelFormat_8880)
{
m_TVDMACtxt.dwSourceFormat = TVSC_SRC_RGB24;
}
#endif
else if (m_pModeEx->ePixelFormat == ddgpePixelFormat_8888)
{
m_TVDMACtxt.dwSourceFormat = TVSC_SRC_RGB24;
}
m_TVDMACtxt.uiSrcBaseWidth = m_dwDeviceScreenWidth;
m_TVDMACtxt.uiSrcBaseHeight = m_dwDeviceScreenHeight;
m_TVDMACtxt.uiSrcWidth = m_dwDeviceScreenWidth;
m_TVDMACtxt.uiSrcHeight = m_dwDeviceScreenHeight;
m_TVDMACtxt.uiSrcOffsetX = 0;
m_TVDMACtxt.uiSrcOffsetY = 0;
m_TVDMACtxt.uiBufferRGBY = m_VideoMemoryPhysicalBase;
m_TVDMACtxt.uiBufferCb = 0;
m_TVDMACtxt.uiBufferCr = 0;
}
else if (m_eTVDMAMode == TV_DMA_OVERLAY)
{
switch(m_OverlayCtxt.pSurface->PixelFormat())
{
case ddgpePixelFormat_565:
m_TVDMACtxt.dwSourceFormat = TVSC_SRC_RGB16;
break;
//case ddgpePixelFormat_8880: // FIMD can not support Packed RGB888
case ddgpePixelFormat_8888:
m_TVDMACtxt.dwSourceFormat = TVSC_SRC_RGB24;
break;
case ddgpePixelFormat_I420:
case ddgpePixelFormat_YV12: // Cb and Cr is swapped in S3C6410Surf()
m_TVDMACtxt.dwSourceFormat = TVSC_SRC_YUV420;
break;
case ddgpePixelFormat_YUYV:
case ddgpePixelFormat_YUY2:
m_TVDMACtxt.dwSourceFormat = TVSC_SRC_YUV422_CRYCBY;
break;
case ddgpePixelFormat_UYVY:
m_TVDMACtxt.dwSourceFormat = TVSC_SRC_YUV422_YCRYCB;
break;
case ddgpePixelFormat_YVYU:
m_TVDMACtxt.dwSourceFormat = TVSC_SRC_YUV422_CBYCRY;
break;
case ddgpePixelFormat_VYUY:
m_TVDMACtxt.dwSourceFormat = TVSC_SRC_YUV422_YCBYCR;
break;
default:
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] S3C6410Disp::DevUpdateTVDMAContext() : Unknown PixelFormat %d\n\r"), m_OverlayCtxt.pSurface->PixelFormat()));
break;
}
m_TVDMACtxt.uiSrcBaseWidth = m_OverlayCtxt.pSurface->Width();
m_TVDMACtxt.uiSrcBaseHeight = m_OverlayCtxt.pSurface->Height();
m_TVDMACtxt.uiSrcWidth = m_OverlayCtxt.pSurface->Width();
m_TVDMACtxt.uiSrcHeight = m_OverlayCtxt.pSurface->Height();
m_TVDMACtxt.uiSrcOffsetX = 0;
m_TVDMACtxt.uiSrcOffsetY = 0;
m_TVDMACtxt.uiBufferRGBY = (unsigned int)(m_OverlayCtxt.pSurface->OffsetInVideoMemory() + m_VideoMemoryPhysicalBase);
m_TVDMACtxt.uiBufferCb = m_TVDMACtxt.uiBufferRGBY+m_OverlayCtxt.pSurface->m_uiOffsetCb;
m_TVDMACtxt.uiBufferCr = m_TVDMACtxt.uiBufferRGBY+m_OverlayCtxt.pSurface->m_uiOffsetCr;
}
RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] --S3C6410Disp::DevUpdateTVDMAContext()\n\r")));
}
void
S3C6410Disp::DevOutputEnableTVDMA(void)
{
DWORD dwBytes;
RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] ++S3C6410Disp::DevOutputEnableTVDMA()\n\r")));
if (m_TVDMACtxt.uiSrcBaseWidth > 800)
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableTVDMA() : For TV DMA, Source width[%d] should be lower than 800 pixel\n\r"), m_TVDMACtxt.uiSrcBaseWidth));
m_eTVDMAMode = TV_DMA_DISABLE;
return;
}
if (!m_bTVDMARunning && (m_eTVDMAMode != TV_DMA_DISABLE))
{
// TV Scaler Initialize
SVEARG_TVSC_PARAMETER tParamTVSC;
tParamTVSC.dwOpMode = TVSC_FREE_RUN_MODE;
tParamTVSC.dwScanMode = TVSC_INTERLACE;
tParamTVSC.dwSrcType = m_TVDMACtxt.dwSourceFormat;
tParamTVSC.dwSrcBaseWidth = m_TVDMACtxt.uiSrcBaseWidth;
tParamTVSC.dwSrcBaseHeight = m_TVDMACtxt.uiSrcBaseHeight;
tParamTVSC.dwSrcWidth = m_TVDMACtxt.uiSrcBaseWidth;
tParamTVSC.dwSrcHeight = m_TVDMACtxt.uiSrcBaseHeight;
tParamTVSC.dwSrcOffsetX = 0;
tParamTVSC.dwSrcOffsetY = 0;
tParamTVSC.dwDstType = TVSC_DST_FIFO_YUV444;
tParamTVSC.dwDstBaseWidth = TV_DST_WIDTH*2;
tParamTVSC.dwDstBaseHeight = TV_DST_HEIGHT;
tParamTVSC.dwDstWidth = TV_DST_WIDTH*2;
tParamTVSC.dwDstHeight = TV_DST_HEIGHT;
tParamTVSC.dwDstOffsetX = 0;
tParamTVSC.dwDstOffsetY = 0;
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_TVSC_SET_PROCESSING_PARAM, &tParamTVSC, sizeof(SVEARG_TVSC_PARAMETER), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableTVDMA() : IOCTL_SVE_TVSC_SET_PROCESSING_PARAM Failed\n\r")));
}
// TV Scaler Source Buffer Initialize
SVEARG_TVSC_BUFFER tParamFB;
tParamFB.dwBufferRGBY = m_TVDMACtxt.uiBufferRGBY;
tParamFB.dwBufferCb = m_TVDMACtxt.uiBufferCb;
tParamFB.dwBufferCr = m_TVDMACtxt.uiBufferCr;
tParamFB.bWaitForVSync = FALSE;
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_TVSC_SET_SOURCE_BUFFER, &tParamFB, sizeof(SVEARG_TVSC_BUFFER), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableTVDMA() : IOCTL_SVE_TVSC_SET_SOURCE_BUFFER Failed\n\r")));
}
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_TVSC_SET_NEXT_SOURCE_BUFFER, &tParamFB, sizeof(SVEARG_TVSC_BUFFER), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableTVDMA() : IOCTL_SVE_TVSC_SET_NEXT_SOURCE_BUFFER Failed\n\r")));
}
// TV Encoder Initialize
SVEARG_TVENC_PARAMETER tParamTVEnc;
tParamTVEnc.dwOutputType = TVENC_COMPOSITE;
tParamTVEnc.dwOutputStandard = TVENC_NTSC_M;
tParamTVEnc.dwMVisionPattern = TVENC_MACROVISION_OFF;
tParamTVEnc.dwSrcWidth = TV_DST_WIDTH;
tParamTVEnc.dwSrcHeight = TV_DST_HEIGHT;
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_TVENC_SET_INTERFACE_PARAM, &tParamTVEnc, sizeof(SVEARG_TVENC_PARAMETER), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableTV() : IOCTL_SVE_TVENC_SET_INTERFACE_PARAM Failed\n\r")));
}
// TV Encoder On & TV Scaler Start
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_TVENC_SET_ENCODER_ON, NULL, 0, NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableTV() : IOCTL_SVE_TVENC_SET_ENCODER_ON Failed\n\r")));
}
}
m_bTVDMARunning = TRUE;
RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] --S3C6410Disp::DevOutputEnableTVDMA()\n\r")));
}
void
S3C6410Disp::DevOutputDisableTVDMA(void)
{
DWORD dwBytes;
RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] ++S3C6410Disp::DevOutputDisableTVDMA()\n\r")));
if (m_bTVDMARunning)
{
// TV Scaler Stop & TV Encoder Off
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_TVENC_SET_ENCODER_OFF, NULL, 0, NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputDisableTVDMA() : IOCTL_SVE_TVENC_SET_ENCODER_OFF Failed\n\r")));
}
}
m_bTVDMARunning = FALSE;
RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] --S3C6410Disp::DevOutputDisableTVDMA()\n\r")));
}
void
S3C6410Disp::DevSetTVDMABuffer(unsigned int uiAddrRGBY, unsigned int uiAddrCb, unsigned int uiAddrCr, BOOL bWaitForVBlank)
{
// Update to Context
m_TVDMACtxt.uiBufferRGBY = uiAddrRGBY;
m_TVDMACtxt.uiBufferCb = uiAddrCb;
m_TVDMACtxt.uiBufferCr = uiAddrCr;
// TV Scaler Next Source Buffer Initialize
DWORD dwBytes;
SVEARG_TVSC_BUFFER tParamFB;
tParamFB.dwBufferRGBY = m_TVDMACtxt.uiBufferRGBY;
tParamFB.dwBufferCb = m_TVDMACtxt.uiBufferCb;
tParamFB.dwBufferCr = m_TVDMACtxt.uiBufferCr;
tParamFB.bWaitForVSync = bWaitForVBlank;
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_TVSC_SET_NEXT_SOURCE_BUFFER, &tParamFB, sizeof(SVEARG_TVSC_BUFFER), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevSetTVDMABuffer() : IOCTL_SVE_TVSC_SET_NEXT_SOURCE_BUFFER Failed\n\r")));
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?