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

📄 codecmemtest.c

📁 6410BSP1
💻 C
字号:
#include <windows.h>
// Platform Dependent
#include <SVEDriverAPI.h>
#include "CMMAPI.h"


#define DEBUG    1
#define MAX_BUFFER_NUM    3
#define    IMG_WIDTH        320
#define IMG_HEIGHT        240
#define LCD_WIDTH        800
#define LCD_HEIGHT        480
#define PADDING_SIZE    0
#define    BUFF_SIZE        (((IMG_WIDTH + 2*PADDING_SIZE)*(IMG_HEIGHT + 2*PADDING_SIZE)*3)>>1)
#define    NUM_OF_ITERATION    3

/////////////////////////////////////////////////////////////////
// Variables                                                   //
/////////////////////////////////////////////////////////////////

HANDLE    hEvent;
HANDLE    hEvent2;
HANDLE    displayThread;
HANDLE    hCMMTestThread_1;
HANDLE    hCMMTestThread_2;
UINT8    *buff[3];
HANDLE     hVideoDrv = INVALID_HANDLE_VALUE;
BOOL    bFirstRender;


static int DisplayInit();
static int DisplayEnd();
static int StartDisplay(UINT32 buffNo, void *CodecMemHandle);

/////////////////////////////////////////////////////////////////
// functions                                                    //
/////////////////////////////////////////////////////////////////



int WINAPI WinMain(HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPTSTR    lpCmdLine,
                    int       nCmdShow)
{

    int                    ret;
    FILE                *fp;
    UINT32                buffsize;
    DWORD                dwRead;
    DWORD                displayTime = 0;
    DWORD                totalTime = 0;
    UINT32                count = 0, i, loop = 0;
    CMM_ALLOC_PRAM_T    inParam;
    void                *CodecMemHandle;
    DWORD                 dwBytes;
    UINT8                *tempbuff;


    
    if(!DisplayInit()) return 0;


    do{
        RETAILMSG(1,(L"\n---------------------------------------------\n"));
        RETAILMSG(1,(L"CodecMemTest start(%d)\n", loop));
        RETAILMSG(1,(L"---------------------------------------------\n"));
        CodecMemHandle = CreateFile(CODEC_MEM_DRIVER_NAME,
                                GENERIC_READ|GENERIC_WRITE,
                                0,
                                NULL,
                                OPEN_EXISTING,
                                FILE_ATTRIBUTE_NORMAL,NULL);

        if(CodecMemHandle == INVALID_HANDLE_VALUE){
            RETAILMSG(1, (TEXT("main :: CreateFile(CODEC_MEM_DRIVER_NAME) failed\r\n")));
            return 0;
        }

        for(i=0; i < MAX_BUFFER_NUM; i++){
            inParam.size = (unsigned int)BUFF_SIZE;
            inParam.cacheFlag = 1;
            ret = DeviceIoControl(CodecMemHandle, IOCTL_CODEC_MEM_ALLOC, (PBYTE)&inParam, 
                                sizeof(CMM_ALLOC_PRAM_T *), &buff[i], sizeof(buff[i]), 
                                NULL, NULL);
            if(ret == 0){
                RETAILMSG(1, (TEXT("IOCTL_CODEC_MEM_GET failed\r\n")));
                return 0;
            }
        }

        fp = fopen("\\Storage Card\\test.yuv", "rb");
        if(fp == NULL){
            RETAILMSG(1, (TEXT("File open error : test.yuv \r\n")));
            return 0;
        }

        i = 0;
        bFirstRender = TRUE;
        
        do{
            dwRead = fread(buff[i], 1, BUFF_SIZE, fp);

            
            //
            // Instead of Sleep, your decoding function should be here...........
            //
                Sleep(20);
            //
            //
            if(!(StartDisplay(i, CodecMemHandle)))    return 0;

            i = (++i) % MAX_BUFFER_NUM;
        }while(dwRead == BUFF_SIZE);

        fclose(fp);
        // Wait for Post Processing Finished
        if ( !DeviceIoControl(hVideoDrv, IOCTL_SVE_POST_WAIT_PROCESSING_DONE, NULL, 0, NULL, 0, &dwBytes, NULL) )
        {
            RETAILMSG(1,(L"[VDE:ERR] IOCTL_SVE_POST_WAIT_PROCESSING_DONE Failed 1111\n"));
            return 0;
        }
        CloseHandle(CodecMemHandle);
        Sleep(1000);
    }while(++loop < NUM_OF_ITERATION);
    DisplayEnd();
    //free(inParam);
}


static int DisplayInit()
{
    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;

}

static int DisplayEnd()
{
    DWORD             dwBytes;
    DWORD            dwWinNum;

    

    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;
    }
    // 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);
    RETAILMSG(1,(L"Display End\n"));
}


static int StartDisplay(UINT32 buffNo, void *CodecMemHandle)
{
    int                            ret;
    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;
    UINT                        phy_addr;
    DWORD                        dwWinNum;


    ret = DeviceIoControl(CodecMemHandle, IOCTL_CODEC_CACHE_CLEAN_INVALIDATE, (PBYTE)buff[buffNo], 
                        sizeof(buff[buffNo]), NULL, 0, 
                        NULL, NULL);
    if(ret == 0) {
        RETAILMSG(1, (TEXT("IOCTL_CODEC_CACHE_FLUSH failed(buffno : %ld)\r\n", buffNo)));
        return 0;
    }

    /*
    ret = DeviceIoControl(CodecMemHandle, IOCTL_CODEC_CACHE_CLEAN, (PBYTE)buff[buffNo], 
                        sizeof(buff[buffNo]), NULL, 0, 
                        NULL, NULL);
    if(ret == 0) {
        RETAILMSG(1, (TEXT("IOCTL_CODEC_CACHE_FLUSH failed(buffno : %ld)\r\n", buffNo)));
        return 0;
    }

    ret = DeviceIoControl(CodecMemHandle, IOCTL_CODEC_CACHE_INVALIDATE, (PBYTE)buff[buffNo], 
                        sizeof(buff[buffNo]), NULL, 0, 
                        NULL, NULL);
    if(ret == 0) {
        RETAILMSG(1, (TEXT("IOCTL_CODEC_CACHE_FLUSH failed(buffno : %ld)\r\n", buffNo)));
        return 0;
    }
    */

    ret = DeviceIoControl(CodecMemHandle, IOCTL_CODEC_GET_PHY_ADDR, (PBYTE)buff[buffNo], 
                        sizeof(buff[buffNo]), (PBYTE)&phy_addr, sizeof(phy_addr), 
                        NULL, NULL);
    if(ret == 0) {
        RETAILMSG(1, (TEXT("IOCTL_CODEC_GET_PHY_ADDR failed\r\n")));
        return 0;
    }


    if (bFirstRender)
    {
        bFirstRender = FALSE;

        tParamMode.dwWinMode = DISP_WIN0_DMA;
        tParamMode.dwBPP = DISP_16BPP_565;
        tParamMode.dwWidth = LCD_WIDTH;
        tParamMode.dwHeight = LCD_HEIGHT;
        tParamMode.dwOffsetX = (800-tParamMode.dwWidth)/2;
        tParamMode.dwOffsetY = (480-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 = IMG_WIDTH + 2*PADDING_SIZE;
        tParamPost.dwSrcBaseHeight = IMG_HEIGHT + 2*PADDING_SIZE;
        tParamPost.dwSrcOffsetX = PADDING_SIZE;
        tParamPost.dwSrcOffsetY = PADDING_SIZE;
        tParamPost.dwSrcWidth = tParamPost.dwSrcBaseWidth -2* tParamPost.dwSrcOffsetX;
        tParamPost.dwSrcHeight = tParamPost.dwSrcBaseHeight -2*tParamPost.dwSrcOffsetY ;
        tParamPost.dwDstType = POST_DST_RGB16;
         tParamPost.dwDstBaseWidth = LCD_WIDTH;
        tParamPost.dwDstBaseHeight = LCD_HEIGHT;
        tParamPost.dwDstWidth = LCD_WIDTH;
        tParamPost.dwDstHeight = LCD_HEIGHT;
        tParamPost.dwDstOffsetX = 0;
        tParamPost.dwDstOffsetY = 0;

        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;
        }

        // Source Address
        tParamBuffer.dwBufferRGBY = phy_addr;
        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;
        }

        // Destination Address
        tParamBuffer.dwBufferRGBY = 0x57400000;
        tParamBuffer.dwBufferCb = 0;
        tParamBuffer.dwBufferCr = 0;
        tParamBuffer.bWaitForVSync = FALSE;

        if ( !DeviceIoControl(hVideoDrv, IOCTL_SVE_POST_SET_DESTINATION_BUFFER, &tParamBuffer, sizeof(SVEARG_POST_BUFFER), NULL, 0, &dwBytes, NULL) )
        {
            RETAILMSG(1,(L"[VDE:ERR] IOCTL_SVE_POST_SET_DESTINATION_BUFFER Failed\n"));
            return 0;
        }

        // Post Processing Start
        if ( !DeviceIoControl(hVideoDrv, IOCTL_SVE_POST_SET_PROCESSING_START, NULL, 0, NULL, 0, &dwBytes, NULL) )
        {
            RETAILMSG(1,(L"[VDE:ERR] IOCTL_SVE_POST_SET_PROCESSING_START Failed\n"));
            return 0;
        }
    }
    else
    {
        // Wait for Post Processing Finished
        if ( !DeviceIoControl(hVideoDrv, IOCTL_SVE_POST_WAIT_PROCESSING_DONE, NULL, 0, NULL, 0, &dwBytes, NULL) )
        {
            RETAILMSG(1,(L"[VDE:ERR] IOCTL_SVE_POST_WAIT_PROCESSING_DONE Failed 2222\n"));
            return 0;
        }

        // Source Address
        tParamBuffer.dwBufferRGBY = phy_addr;
        tParamBuffer.dwBufferCb = tParamBuffer.dwBufferRGBY+(IMG_WIDTH + 2*PADDING_SIZE)*(IMG_HEIGHT + 2*PADDING_SIZE);
        tParamBuffer.dwBufferCr = tParamBuffer.dwBufferCb+(IMG_WIDTH + 2*PADDING_SIZE)*(IMG_HEIGHT + 2*PADDING_SIZE)/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;
        }

        // Post Processing Start
        if ( !DeviceIoControl(hVideoDrv, IOCTL_SVE_POST_SET_PROCESSING_START, NULL, 0, NULL, 0, &dwBytes, NULL) )
        {
            RETAILMSG(1,(L"[VDE:ERR] IOCTL_SVE_POST_SET_PROCESSING_START Failed\n"));
            return 0;
        }
    }

    return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -