?? scaler_test.c
字號:
/*----------------------------------------------------------------------
*
* Filename: scaler_test.cpp
*
* Contents: Testing application of "class POST"
*
* Authors:
*
* Notes:
*
* Copyright (c) 2003 SAMSUNG Electronics.
*
*----------------------------------------------------------------------
*/
#include <stdio.h>
#include "def.h"
#include "option.h"
#include "library.h"
#include "sfr6400.h"
#include "system.h"
#include "sysc.h"
#include "post.h"
#include "lcd.h"
#include "glib.h"
#include "intc.h"
#include "camera.h"
#include "timer.h"
#include "post_test.h"
#include "tvenc.h"
static POST oPost;
static POST oSc;
static CSPACE eSrcDataFmt;
static CSPACE eMidDataFmt;
static CSPACE eDstDataFmt;
static CSPACE eSrcDataFmt_Yuv;
static CSPACE eDstDataFmt_Yuv;
static POST_RUN_MODE ePostRunMode;
static u32 uLcdHSz, uLcdVSz;
static u32 uSrcStartX, uSrcStartY;
static u32 uSrcCroppedHSz, uSrcCroppedVSz;
static u32 uMidImgHSz, uMidImgVSz;
static u32 uMidStartX, uMidStartY;
static u32 uMidScaledHSz, uMidScaledVSz;
static u32 uMid2ImgHSz, uMid2ImgVSz;
static u32 uMid2StartX, uMid2StartY;
static u32 uMid2ScaledHSz, uMid2ScaledVSz;
static u32 uImgHSz, uImgVSz;
static u32 uDstStartX, uDstStartY;
static u32 uDstScaledHSz, uDstScaledVSz;
const static u32 uLcdStAddr = CODEC_MEM_ST;
static u32 uNxtAddr1, uNxtAddr2;
const static u32 uMaxFrameCnt = 10;
bool bScalerIsPollingOrInt = true; // true: Polling, false: Int
static u32 uSimpleTest;
static bool uScalerIntOccured;
u8 *Scaler_Image_Entertain[] = { "D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/entertainment1.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/entertainment2.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/entertainment3.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/entertainment4.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/entertainment5.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/entertainment6.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/entertainment7.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/entertainment8.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/entertainment9.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/entertainment10.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/entertainment11.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/entertainment12.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/entertainment13.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/entertainment14.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/entertainment15.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/Illustrate1.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/Illustrate2.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/Illustrate3.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/Illustrate4.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/Illustrate5.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/Illustrate6.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/Illustrate7.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/Illustrate8.bmp",
"D:/MyDocument/AP/S3C6400/Software/6400_Test_Rev04/Components/multimedia/image/bmp/Illustrate9.bmp"
};
////////////////////////////////////////////////////////////////////////////
////////////////// ISR Routine ///////////////////
////////////////////////////////////////////////////////////////////////////
void __irq ScalerISRDma(void)
{
uScalerIntOccured = TRUE;
POST_ClearPending(&oSc);
INTC_ClearVectAddr();
}
//////////
// Function Name : ScalerT_SelectClockDivider
// Function Description : Set POST Clock Divider
// Input : None
// Output : None
void ScalerT_SelectClockDivider(void)
{
u32 uPostClockDivide;
UART_Printf("[ScalerT_SelectClockDivider]\n");
UART_Printf("\n");
UART_Printf("Select the source clock [0x01 ~ 0x3F] : ");
uPostClockDivide = (u32)UART_GetIntNum();
POST_SetClockDivide(uPostClockDivide, &oSc);
}
#if (POST_IMAGE_SORCE == POST_IMAGE_HEADER)
static void ScalerT_GetImageFromHeader(u32 uFbAddr, u32 uHSize, u32 uVSize, CSPACE eBpp)
{
u32 i;
u16 *pBufAddr16;
u32 *pBufAddr32;
pBufAddr16 = (u16 *)uFbAddr;
pBufAddr32 = (u32 *)uFbAddr;
switch(eBpp)
{
case RGB16 : for(i=0 ; i<uHSize*uVSize ; i++)
{
//*pBufAddr16++ = pGuitar240320_16rgb[i];
//*pBufAddr16++ = pRacingGirl320240[i];
*pBufAddr16++ = sun320240_16bpp[i];
}
break;
case RGB24 : for(i=0 ; i<uHSize*uVSize ; i++)
{
//*pBufAddr32++ = pGuitar240320_24rgb[i];
*pBufAddr32++ = pYepp320x240[i];
}
break;
case YC420 : for(i=0 ; i<uHSize*uVSize ; i++)
{
*pBufAddr16++ = pGuitar240320_YCbYCr420[i];
}
break;
case YCBYCR : for(i=0 ; i<uHSize*uVSize ; i++)
{
*pBufAddr16++ = pGuitar240320_YCbYCr422[i];
}
break;
case YCRYCB : for(i=0 ; i<uHSize*uVSize ; i++)
{
*pBufAddr16++ = pGuitar240320_YCrYCb422[i];
}
break;
case CBYCRY : for(i=0 ; i<uHSize*uVSize ; i++)
{
*pBufAddr16++ = pGuitar240320_CbYCrY422[i];
}
break;
case CRYCBY : for(i=0 ; i<uHSize*uVSize ; i++)
{
*pBufAddr16++ = pGuitar240320_CrYCbY422[i];
}
break;
default : break;
}
}
#endif
static void ScalerT_GetImageFromBMP(u32 uFbAddr, u32 uHSize, u32 uVSize, u32 NumOfImage, CSPACE eBpp)
{
u32 ImageNum;
u16 *pBufAddr16;
u32 *pBufAddr32;
u32 *uBuffer_Temp;
uBuffer_Temp = (u32 *)malloc(300000); //bmp file
pBufAddr16 = (u16 *)uFbAddr;
pBufAddr32 = (u32 *)uFbAddr;
ImageNum = NumOfImage%(sizeof(Scaler_Image_Entertain)/4);
switch(eBpp)
{
case RGB16 : LoadFromFile((const char*)Scaler_Image_Entertain[ImageNum], (u32)uBuffer_Temp);
ConvertBmpToRgb16bpp((u32)uBuffer_Temp, (u32)pBufAddr16, uHSize, uVSize);
break;
case RGB24 : LoadFromFile((const char*)Scaler_Image_Entertain[ImageNum], (u32)uBuffer_Temp);
ConvertBmpToRgb24bpp((u32)uBuffer_Temp, (u32)pBufAddr32, uHSize, uVSize);
break;
default : break;
}
free(uBuffer_Temp);
}
////////////////////////////////////////////////////////////////////////////
////////////////// RGB to RGB ///////////////////
////////////////////////////////////////////////////////////////////////////
static void ScalerT_SetCscTypeDmaToDma_R2R(void)
{
u32 uSelDmaCscType_R2R;
while(1)
{
UART_Printf("\n");
UART_Printf("[1] From RGB16 To RGB16\n");
UART_Printf("[2] From RGB16 To RGB24\n");
UART_Printf("[3] From RGB24 To RGB16\n");
UART_Printf("[4] From RGB24 To RGB24\n");
UART_Printf("\n");
UART_Printf(">>Select The Color Space Conversion Type: ");
uSelDmaCscType_R2R = UART_GetIntNum();
if (uSelDmaCscType_R2R == 1 || uSelDmaCscType_R2R == 2 || uSelDmaCscType_R2R == 3 || uSelDmaCscType_R2R == 4)
{
eSrcDataFmt = (uSelDmaCscType_R2R == 1 || uSelDmaCscType_R2R == 2) ? RGB16 : RGB24;
eDstDataFmt = (uSelDmaCscType_R2R == 1 || uSelDmaCscType_R2R == 3) ? RGB16 : RGB24;
break;
}
else
UART_Printf("Invalid Input! Retry It!!\n");
}
if (eSrcDataFmt == RGB16 && eDstDataFmt == RGB16)
{
// Scale up(width, height)
uImgHSz = 120, uImgVSz = 160;
uSrcStartX = 20, uSrcStartY = 30;
uSrcCroppedHSz = 88, uSrcCroppedVSz = 100;
uDstStartX = 40, uDstStartY = 80;
uDstScaledHSz = 160, uDstScaledVSz = 160;
}
else if (eSrcDataFmt == RGB16 && eDstDataFmt == RGB24)
{
// Scale up(width), scale down(height)
uImgHSz = 240, uImgVSz = 320;
uSrcStartX = 80, uSrcStartY = 160;
uSrcCroppedHSz = 120, uSrcCroppedVSz = 160;
uDstStartX = 20, uDstStartY = 40;
uDstScaledHSz = 200, uDstScaledVSz = 120;
}
else if (eSrcDataFmt == RGB24 && eDstDataFmt == RGB16)
{
// scale down(width), scale up(height)
uImgHSz = 360, uImgVSz = 480;
uSrcStartX = 30, uSrcStartY = 40;
uSrcCroppedHSz = 160, uSrcCroppedVSz = 100;
uDstStartX = 10, uDstStartY = 50;
uDstScaledHSz = 120, uDstScaledVSz = 190;
}
else if (eSrcDataFmt == RGB24 && eDstDataFmt == RGB24)
{
// scale down(widht, height)
uImgHSz = 360, uImgVSz = 480;
uSrcStartX = 80, uSrcStartY = 20;
uSrcCroppedHSz = 168, uSrcCroppedVSz = 240;
uDstStartX = 100, uDstStartY = 100;
uDstScaledHSz = 128, uDstScaledVSz = 140;
}
else
{
UART_Printf("Error! Unsupported Data Format!\n");
return;
}
UART_Printf("\n");
if(uSimpleTest == 0)
{
UART_Printf("========= Complex_Test Image Size =========\n");
UART_Printf("SrcImgHSz = %d, SrcImgVSz = %d\n",uImgHSz,uImgVSz);
UART_Printf("SrcStartX = %d, SrcStartY = %d\n",uSrcStartX,uSrcStartY);
UART_Printf("SrcCroppedHSz = %d, SrcCroppedVSz = %d\n",uSrcCroppedHSz,uSrcCroppedVSz);
UART_Printf("DstStartX = %d, DstStartY = %d\n",uDstStartX,uDstStartY);
UART_Printf("DstScaledHSz = %d, DstScaledVSz = %d\n",uDstScaledHSz,uDstScaledVSz);
UART_Printf("=================================================\n");
UART_Printf("\n");
}
}
static void ScalerT_SimpleDmaToDma_R2R(void)
{
u32 uLcdHSz, uLcdVSz;
u32 uGlibStAddr;
u32 uBytesPerPixel;
UART_Printf("[ScalerT_SimpleDmaToDma_R2R(No Scaling)]\n");
uSimpleTest = 1;
ScalerT_SetCscTypeDmaToDma_R2R();
LCD_InitDISPC(eDstDataFmt, uLcdStAddr, WIN0, false);
LCD_Start();
LCD_SetWinOnOff(1, WIN0);
LCD_GetFrmSz(&uLcdHSz, &uLcdVSz, WIN0);
// To Clear the LCD Display
GLIB_Init(uLcdStAddr, uLcdHSz, uLcdVSz, eDstDataFmt);
GLIB_ClearFrame(C_BLACK);
uBytesPerPixel = (eDstDataFmt == RGB16) ? 2: 4;
uGlibStAddr = uLcdStAddr + uLcdHSz*uLcdVSz*uBytesPerPixel;
#if (POST_IMAGE_SORCE == POST_IMAGE_PATTERN)
GLIB_Init(uGlibStAddr, uLcdHSz, uLcdVSz, eSrcDataFmt);
GLIB_DrawPattern(uLcdHSz, uLcdVSz);
#elif (POST_IMAGE_SORCE == POST_IMAGE_HEADER)
ScalerT_GetImageFromHeader(uGlibStAddr, uLcdHSz, uLcdVSz, eSrcDataFmt);
#endif
POST_InitIpForDmaInDmaOut( uLcdHSz, uLcdVSz, uGlibStAddr, eSrcDataFmt,
uLcdHSz, uLcdVSz, uLcdStAddr, eDstDataFmt,
1, false, ONE_SHOT, &oSc );
POST_StartProcessing(&oSc);
while (!POST_IsProcessingDone(&oSc));
#if (POST_IMAGE_BMP_SLIDE)
{
u32 uImageNum;
UART_Printf("Input the any key to display the other image ('q' : quit)\n");
uImageNum = 0;
while(UART_Getc() != 'q')
{
ScalerT_GetImageFromBMP(uGlibStAddr, uLcdHSz, uLcdVSz, uImageNum, eSrcDataFmt);
// Only CSC operation, not Scaling
POST_InitIpForDmaInDmaOut( uLcdHSz, uLcdVSz, uGlibStAddr, eSrcDataFmt,
uLcdHSz, uLcdVSz, uLcdStAddr, eDstDataFmt,
1, false, ONE_SHOT, &oSc );
POST_StartProcessing(&oSc);
while (!POST_IsProcessingDone(&oSc));
uImageNum++;
}
}
#endif
}
static void ScalerT_ComplexIDmaToDma_R2R(void)
{
u32 uGlibStAddr=0;
u32 uBytesPerPixel=0;
u32 uSrcStAddr;
UART_Printf("[ScalerT_ComplexIDmaToDma_R2R]\n");
uSimpleTest = 0;
ScalerT_SetCscTypeDmaToDma_R2R();
ePostRunMode = ONE_SHOT;
//LCD_InitLDI(MAIN);
#ifdef LCD_INIT_TEST
LCD_InitBase();
LCD_Start();
LCD_InitWin(eDstDataFmt, uImgHSz, uImgVSz, 0, 0, uImgHSz, uImgVSz, 0, 0, uLcdStAddr, WIN0, false);
#else
LCD_InitDISPC(eDstDataFmt, uLcdStAddr, WIN0, false);
LCD_Start();
#endif
LCD_SetWinOnOff(1, WIN0);
LCD_GetFrmSz(&uLcdHSz, &uLcdVSz, WIN0);
// To Clear the LCD Display
GLIB_Init(uLcdStAddr, uLcdHSz, uLcdVSz, eDstDataFmt);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -