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 + -
显示快捷键?