📄 dctq_test.c
字号:
/******************************************************************************
Filename: DCTQ_test.c
Descriptions
- DCTQ function test
History
-15.Dec.2003
draft
Copyright (c) 2003 SAMSUNG Electronics.
# However, Anybody can use this code without our permission.
******************************************************************************/
#include <stdio.h>
#include "24a0lib.h"
#include "24a0addr.h"
#include "fimvlib.h"
#include "fim20_def.h"
#include "dctq_test.h"
#include "me_test.h"
#include "mc_test.h"
//DCTQ_CTRL
#define COEFF_NOT_WRITE_BIT (1<<29)
#define WITH_VLC_BIT (1<<28)
#define Q_SKIP_BIT (1<<27)
#define IQ_SKIP_BIT (1<<26)
#define SWRST_BIT (1<<25)
#define DCTQ_BUSY_BIT (1<<7)
#define DCTQ_START_BIT (1<<6)
#define H263_FORMAT_BIT (1<<4)
#define MPEG4_FORMAT_BIT (0<<4)
#define IS_ENCODE_BIT (1<<2)
#define IS_DECODE_BIT (0<<2)
#define FRAME_START_BIT (1<<0)
#if(FIMVTEST_IMAGE_SIZE==QCIF)
#define FIMV_IMAGE_WIDTH (176)
#define FIMV_IMAGE_HEIGHT (144)
#define FIMV_DISPLAY_IMAGE_WIDTH (240)
#define FIMV_DISPLAY_IMAGE_HEIGHT (196)
#define TEST_PREV_IMAGE ((U32)image_a1p)
#define TEST_CURR_IMAGE ((U32)image_a2)
#elif(FIMVTEST_IMAGE_SIZE==CIF)
#define FIMV_IMAGE_WIDTH (352)
#define FIMV_IMAGE_HEIGHT (288)
#define FIMV_DISPLAY_IMAGE_WIDTH (240)
#define FIMV_DISPLAY_IMAGE_HEIGHT (196)
#define TEST_PREV_IMAGE ((U32)image_b1p)
#define TEST_CURR_IMAGE ((U32)image_b2)
#elif(FIMVTEST_IMAGE_SIZE==VGA)
#define FIMV_IMAGE_WIDTH (640)
#define FIMV_IMAGE_HEIGHT (480)
#define FIMV_DISPLAY_IMAGE_WIDTH (240)
#define FIMV_DISPLAY_IMAGE_HEIGHT (196)
#define TEST_PREV_IMAGE ((U32)image_c1p)
#define TEST_CURR_IMAGE ((U32)image_c2)
// add QCIF, VGA image size
#endif
extern void USB_Download(void);
extern volatile U32 downloadFileSize;
#if (FIMVTEST_IMAGE_SIZE==QCIF)
const U8 image_a1p[]=
{
#include "..\bmp\foreman_qcif_001_420_padded.pic"
};
const U8 image_a2[]=
{
#include "..\bmp\foreman_qcif_002_420.pic"
};
#endif
#if (FIMVTEST_IMAGE_SIZE==CIF)
const U8 image_b1p[]=
{
#include "..\bmp\foreman_cif_001_420_padded.pic"
};
const U8 image_b2[]=
{
#include "..\bmp\foreman_cif_002_420.pic"
//#include ".\bmp\fig1_352x288.pic"
//#include ".\bmp\fig2_352x288.pic"
//#include ".\bmp\fig3_352x288.pic"
//#include ".\bmp\fig4_352x288.pic"
};
#endif
#if (FIMVTEST_IMAGE_SIZE==VGA)
U8 image_c1p[(640+32)*(480+32)+(640+32)*(480+32)/2];
const U8 image_c2[]=
{
//#include ".\bmp\oasis_vga_002_420.pic"
//#include ".\bmp\fig1_640x480.pic"
//#include ".\bmp\fig2_640x480.pic"
#include "..\bmp\fig3_640x480.pic"
//#include ".\bmp\fig4_640x480.pic"
};
#endif
volatile U32 dctqDone;
static ME_VECTOR meVector[(FIMV_IMAGE_WIDTH/16)*(FIMV_IMAGE_HEIGHT/16)];
void TestDctq_2048X2048(void)
{
IMAGE420 currImage; //no-padded image YCbCr420
IMAGE420 prevImage; //padded image YCbCr420
IMAGE420 refImage; //padded image YCbCr420
IMAGE420 mcedImage; //padded image YCbCr420
IMAGE420 dctqCoeff; //no-padded, the size is twice than currImage.
PQINFO pQInfo;
U32 qinfoMode;
U32 imageWidth=2048;
U32 imageHeight=2048;
U32 freeBufStartAddr=0x11000000;
U32 qpStepTable[((2048/16)*(2048/16)+3)/4]; //for deblock test
int i;
printf("[DCTQ Encoder Test = 2048X2048 ]\n");
qinfoMode=QINFO_INTRA_MODE;
printf("QINFO mode:%s %s\n",(qinfoMode &QINFO_INTRA_MODE) ? "Intra" :
(qinfoMode &QINFO_INTER_MODE) ? "Inter" : "Unknown",
(qinfoMode &QINFO_SKIP_0_2_4) ? "Skip_0_2_4" :
(qinfoMode &QINFO_SKIP_01_45) ? "Skip_01_45" : "" );
//currImage has already been in the read-only area.
AllocImage420(&currImage,0x11000000,imageWidth,imageHeight,IMAGE420_NO_PADDED);
printf("currImage addr: %x\n",0x11000000);
//printf("The picture is the currImage. Press any key!\n");
//getchar();
//previous mcedImage will be on the read-only area.
AllocImage420(&refImage,0x11600000,imageWidth,imageHeight,IMAGE420_PADDED|IMAGE420_CLEAR);
printf("prevImage addr(read only): %x\n",0x11600000);
freeBufStartAddr=AllocImage420(&dctqCoeff,0x11c30600,imageWidth,imageHeight,IMAGE420_DCTQ_COEFF|IMAGE420_CLEAR);
freeBufStartAddr=
AllocImage420(&mcedImage,freeBufStartAddr,imageWidth,imageHeight,
IMAGE420_PADDED|IMAGE420_CLEAR);
InitQInfo(&pQInfo,&freeBufStartAddr,imageWidth,imageHeight,qinfoMode);
DctqInitIsr();
MeInitIsr();
McInitIsr();
MeEngine(&currImage,&refImage,meVector,0);
//printf("Wait until M.E. is completed.\n");
while(meDone==0);
printf("M.E. is completed!\n");
getchar();
McEngine(&refImage,&mcedImage,meVector,0);
//printf("Wait until M.C. is completed.\n");
while(mcDone==0);
printf("M.C. is completed!\n");
getchar();
DctqEngine(&currImage,&mcedImage,&dctqCoeff,pQInfo,0);
while(dctqDone==0);
printf("completed!\n");
getchar();
}
void TestDctq_Encoder(void)
{
IMAGE420 currImage; //no-padded image YCbCr420
IMAGE420 prevImage; //padded image YCbCr420
IMAGE420 refImage; //padded image YCbCr420
IMAGE420 refImage2; //padded image YCbCr420
IMAGE420 dctqCoeff; //no-padded, the size is twice than currImage.
PQINFO pQInfo;
U32 qinfoMode;
U32 imageWidth=FIMV_IMAGE_WIDTH;
U32 imageHeight=FIMV_IMAGE_HEIGHT;
U32 freeBufStartAddr=0x11000000;
U32 qpStepTable[((FIMV_IMAGE_WIDTH/16)*(FIMV_IMAGE_HEIGHT/16)+3)/4]; //for deblock test
int i;
printf("[DCTQ Encoder Test]\n");
printf("Test Image size:%s\n",(FIMVTEST_IMAGE_SIZE==QCIF) ? "QCIF":
(FIMVTEST_IMAGE_SIZE==CIF) ? "CIF" :
(FIMVTEST_IMAGE_SIZE==VGA) ? "VGA" :
(FIMVTEST_IMAGE_SIZE==PQVGA)? "PQVGA":"Unknown");
printf("Select QINFO mode: 1)intra 2)intra_skip_0_2_4 3)intra_skip_01_45\n"
" 4)inter 5)inter_skip_0_2_4 6)inter_skip_01_45\n");
switch(getchar())
{
case '1':
qinfoMode=QINFO_INTRA_MODE;
break;
case '2':
qinfoMode=QINFO_INTRA_MODE|QINFO_SKIP_0_2_4;
break;
case '3':
qinfoMode=QINFO_INTRA_MODE|QINFO_SKIP_01_45;
break;
case '4':
qinfoMode=QINFO_INTER_MODE;
break;
case '5':
qinfoMode=QINFO_INTER_MODE|QINFO_SKIP_0_2_4;
break;
case '6':
qinfoMode=QINFO_INTER_MODE|QINFO_SKIP_01_45;
break;
default:
break;
}
printf("QINFO mode:%s %s\n",(qinfoMode &QINFO_INTRA_MODE) ? "Intra" :
(qinfoMode &QINFO_INTER_MODE) ? "Inter" : "Unknown",
(qinfoMode &QINFO_SKIP_0_2_4) ? "Skip_0_2_4" :
(qinfoMode &QINFO_SKIP_01_45) ? "Skip_01_45" : "" );
//currImage has already been in the read-only area.
AllocImage420(&currImage,TEST_CURR_IMAGE,imageWidth,imageHeight,IMAGE420_NO_PADDED);
printf("currImage addr: %x\n",TEST_CURR_IMAGE);
//printf("The picture is the currImage. Press any key!\n");
//getchar();
//previous mcedImage will be on the read-only area.
AllocImage420(&prevImage,TEST_PREV_IMAGE,imageWidth,imageHeight,IMAGE420_PADDED);
printf("prevImage addr(read only): %x\n",TEST_PREV_IMAGE);
//*********************************
// encoding path test
//*********************************
//refImage is used for DctqEngine() as mced_input_image and recon_output image.
printf("reference image addr: %x\n",freeBufStartAddr);
freeBufStartAddr=AllocImage420(&refImage,freeBufStartAddr,imageWidth,imageHeight,
IMAGE420_PADDED|IMAGE420_CLEAR);
//printf("The picture is the refImage before DCTQ/IDCTQ. Press any key!\n");
//getchar();
printf("dctqCoeff addr: [%x,",freeBufStartAddr);
freeBufStartAddr=AllocImage420(&dctqCoeff,freeBufStartAddr,imageWidth,imageHeight,IMAGE420_DCTQ_COEFF|IMAGE420_CLEAR);
printf("%x)\n",freeBufStartAddr);
InitQInfo(&pQInfo,&freeBufStartAddr,imageWidth,imageHeight,qinfoMode);
DctqInitIsr();
#if DCTQ_GOB_OPERATION
for(i=0;i<(imageHeight/16);i++)
{
DctqEngineGob(&currImage,&prevImage,&dctqCoeff,pQInfo,(imageWidth/16),
((i==0)? DCTQ_FRAME_START_MODE : 0) );
while(dctqDone==0);
printf("completed(DCT_Q_IQ_IDCT GOB=%d).\n",i);
}
#else
DctqEngine(&currImage,&prevImage,&dctqCoeff,pQInfo,0);
//printf("Wait until DCT_Q_IQ_IDCT is completed... ");
while(dctqDone==0);
printf("completed!\n");
#endif
/*
PostInitCfgEx(&postCfg,
imageWidth+32,imageHeight+32,0,0,imageWidth+32,imageHeight+32,
LCD_XSIZE,LCD_YSIZE,0,0,FIMV_DISPLAY_IMAGE_WIDTH,FIMV_DISPLAY_IMAGE_HEIGHT,
refImage.frameStartAddr,0,0,0,
LCDFRAMEBUFFER,POST_IN_420_YCBCR);
PostInitIsr();
PostInitRegs(&postCfg);
PostStartProcessing(&postCfg,0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -