📄 post.c
字号:
SrcStartX=SrcStartY=0;
OrgDstWidth=DstWidth=PQVGA_XSIZE; //no destination offset
OrgDstHeight=DstHeight=PQVGA_YSIZE; //no destination offset
DstStartX=DstStartY=0;
InFrameBuffer=downloadAddress;
OutFrameBuffer=LCDFRAMEBUFFERBG1;
PostInit(OrgSrcWidth, OrgSrcHeight, SrcWidth, SrcHeight, SrcStartX, SrcStartY,
OrgDstWidth, OrgDstHeight, DstWidth, DstHeight, DstStartX, DstStartY,
InFrameBuffer, OutFrameBuffer, mode);
pISR_LCD_POST=(unsigned)PostIsr;
rINTMSK &= ~(BIT_LCD_POST);
rINTSUBMSK &= ~(BIT_SUB_POST);
PostStartProcessing(0);
while(!postProcessingDone); //waiting for post-processing done
postProcessingDone=0;
LcdEnvidOnOff(1); //LCD Envid On
Uart_Printf("Test of Zoom In/Out, PIP Operation\n");
Uart_Printf("w.z.s.a for Zoom in/out\n");
Uart_Printf("r.c.f.d for Coordination of zoomed image\n");
Uart_Printf("y.b.h.g for PIP\n");
Uart_Printf("i.m.k.j for Coordination of PIP image\n");
SrcStartX=SrcStartY=0;
DstStartX=DstStartY=0;
while(1) {
switch(Uart_Getch()) {
case 'w':
SrcHeight+=8;
if(SrcHeight>OrgSrcHeight)
SrcHeight=OrgSrcHeight;
break;
case 'z':
SrcHeight-=8;
if(SrcHeight<8)
SrcHeight=8;
break;
case 's':
SrcWidth+=8;
if(SrcWidth>OrgSrcWidth)
SrcWidth=OrgSrcWidth;
break;
case 'a':
SrcWidth-=8;
if(SrcWidth<8)
SrcWidth=8;
break;
case 'r':
SrcStartY+=8;
if((SrcStartY-1)>(OrgSrcHeight-SrcHeight))
SrcStartY=OrgSrcHeight-SrcHeight;
break;
case 'c':
SrcStartY-=8;
if(SrcStartY<0)
SrcStartY=0;
break;
case 'f':
SrcStartX+=8;
if((SrcStartX-1)>(OrgSrcWidth-SrcWidth))
SrcStartX=OrgSrcWidth-SrcWidth;
break;
case 'd':
SrcStartX-=8;
if(SrcStartX<0)
SrcStartX=0;
break;
case 'y':
DstHeight+=4;
if(DstHeight>OrgDstHeight)
DstHeight=OrgDstHeight;
break;
case 'b':
DstHeight-=4;
if(DstHeight<12)
DstHeight=12;
break;
case 'h':
DstWidth+=4;
if(DstWidth>OrgDstWidth)
DstWidth=OrgDstWidth;
break;
case 'g':
DstWidth-=4;
if(DstWidth<12)
DstWidth=12;
break;
case 'i':
DstStartY+=8;
if((DstStartY-1)>(OrgDstHeight-DstHeight))
DstStartY=OrgDstHeight-DstHeight;
break;
case 'm':
DstStartY-=8;
if(DstStartY<0)
DstStartY=0;
break;
case 'k':
DstStartX+=8;
if((DstStartX-1)>(OrgDstWidth-DstWidth))
DstStartX=OrgDstWidth-DstWidth;
break;
case 'j':
DstStartX-=8;
if(DstStartX<0)
DstStartX=0;
break;
case '\r':
return;
default:
break;
}
Uart_Printf("SrcWidth:0x%x, SrcHeight:0x%x, DstWidth:0x%x, DstHeight:0x%x\n", SrcWidth, SrcHeight, DstWidth, DstHeight);
Uart_Printf("SrcStartX:0x%x, SrcStartY:0x%x, DstStartX:0x%x, DstStartY:0x%x\n\n", SrcStartX, SrcStartY, DstStartX, DstStartY);
PostInit((U32)OrgSrcWidth, (U32)OrgSrcHeight, (U32)SrcWidth, (U32)SrcHeight, (U32)SrcStartX, (U32)SrcStartY,
(U32)OrgDstWidth, (U32)OrgDstHeight, (U32)DstWidth, (U32)DstHeight, (U32)DstStartX, (U32)DstStartY,
InFrameBuffer, OutFrameBuffer, mode);
PostStartProcessing(0);
while(!postProcessingDone);
postProcessingDone=0;//redundant;
}
rINTSUBMSK |= BIT_SUB_POST;
rINTMSK |= BIT_LCD_POST;
}
void Test_Post_RGB_RGB_PQVGA(void)
{
U32 i,j,k;
U32 OrgSrcWidth, OrgSrcHeight, SrcWidth, SrcHeight, SrcStartX, SrcStartY;
U32 OrgDstWidth, OrgDstHeight, DstWidth, DstHeight, DstStartX, DstStartY;
U32 InFrameBuffer, OutFrameBuffer;
U32 mode;
U32 temp;
U32 *postframebuffer;
U32 *lcdframebuffer;
OrgSrcWidth=SrcWidth=PQVGA_XSIZE; //no source offset
OrgSrcHeight=SrcHeight=PQVGA_YSIZE; //no source offset
SrcStartX=SrcStartY=0;
OrgDstWidth=DstWidth=PQVGA_XSIZE; //no destination offset
OrgDstHeight=DstHeight=PQVGA_YSIZE; //no destination offset
DstStartX=DstStartY=0;
InFrameBuffer=downloadAddress;
OutFrameBuffer=LCDFRAMEBUFFERBG1;
mode=0;
k=0;
temp=0;
postframebuffer=(U32 *)downloadAddress;
lcdframebuffer=(U32 *)LCDFRAMEBUFFERBG1;
Uart_Printf("Select Input format of Post Processor\n");
Uart_Printf("0:16bpp, 1:24bpp\n");
i=Uart_GetIntNum();
switch(i) {
case 0:
mode|=POST_IN_RGB16B;
for(j=0; j<PQVGA_YSIZE; j++)
for(i=0; i<PQVGA_XSIZE; i+=2) {
*(lcdframebuffer++)=*(postframebuffer++);
}
LcdBGInit(MODE_PAR_16BIT565_240320|MODE_NO_VIRTUAL_16B);
break;
case 1:
mode|=POST_IN_RGB24B;
for(j=0; j<PQVGA_YSIZE; j++)
for(i=0; i<PQVGA_XSIZE; i++) {
*(lcdframebuffer++)=*(postframebuffer++);
}
LcdBGInit(MODE_PAR_18BIT_240320|MODE_NO_VIRTUAL_24B);
break;
default:
mode|=POST_IN_RGB16B;
for(j=0; j<PQVGA_YSIZE; j++)
for(i=0; i<PQVGA_XSIZE; i+=2) {
*(lcdframebuffer++)=*(postframebuffer++);
}
LcdBGInit(MODE_PAR_16BIT565_240320|MODE_NO_VIRTUAL_16B);
break;
}
LcdEnvidOnOffDirect(1);
Uart_Printf("Original Image before post processing!!!!\n");
Uart_Printf("Press any key to process POST\n");
Uart_Getch();
LcdEnvidOnOffDirect(0);
//mode=POST_IN_YCBYCR420|POST_OUT_RGB16B;
//LCD Initialization
//LcdBGInit(MODE_PAR_16BIT565_240320|MODE_NO_VIRTUAL_16B);
Uart_Printf("Select Output format of Post Processor\n");
Uart_Printf("0:RG16, 1:RGB24\n");
i=Uart_GetIntNum();
switch(i) {
case 0:
mode|=POST_OUT_RGB16B;
LcdBGInit(MODE_PAR_16BIT565_240320|MODE_NO_VIRTUAL_16B);
break;
case 1:
mode|=POST_OUT_RGB24B;
LcdBGInit(MODE_PAR_18BIT_240320|MODE_NO_VIRTUAL_24B);
break;
default:
mode|=POST_OUT_RGB16B;
LcdBGInit(MODE_PAR_16BIT565_240320|MODE_NO_VIRTUAL_16B);
break;
}
PostInit(OrgSrcWidth, OrgSrcHeight, SrcWidth, SrcHeight, SrcStartX, SrcStartY,
OrgDstWidth, OrgDstHeight, DstWidth, DstHeight, DstStartX, DstStartY,
InFrameBuffer, OutFrameBuffer, mode);
pISR_LCD_POST=(unsigned)PostIsr;
rINTMSK &= ~(BIT_LCD_POST);
rINTSUBMSK &= ~(BIT_SUB_POST);
Uart_Printf("rMODE:0x%x\n", rMODE);
#if 1
PostStartProcessing(0);
#else
if(mode&POST_IN_YCBYCR420)
amount=OrgSrcWidth*OrgSrcHeight*3/2;
if(mode&POST_OUT_RGB16B)
amount+=OrgDstWidth*OrgDstHeight*2;
else if(mode&POST_OUT_RGB24B)
amount+=OrgDstWidth*OrgDstHeight*4;
PostStartProcessing(amount, 0);
#endif
while(!postProcessingDone); //waiting for post-processing done
postProcessingDone=0;
LcdEnvidOnOffDirect(1); //LCD Envid On
Uart_Printf("Processed Image!!!\n");
Uart_Printf("Press any key to continue\n");
Uart_Getch();
LcdEnvidOnOffDirect(0); //LCD Envid Off
rINTSUBMSK |= BIT_SUB_POST;
rINTMSK |= BIT_LCD_POST;
}
void PostSetFimv16B(U32 SrcWidth, U32 SrcHeight, U32 DstWidth, U32 DstHeight, U32 InFrameBuffer, U32 OutFrameBuffer)
{
PostInit(SrcWidth+32, SrcHeight+32, SrcWidth, SrcHeight, 16, 16,
DstWidth, DstHeight, DstWidth, DstHeight, 0, 0,
InFrameBuffer, OutFrameBuffer, POST_IN_YCBYCR420|POST_OUT_RGB16B);
}
void PostSetFimv24B(U32 SrcWidth, U32 SrcHeight, U32 DstWidth, U32 DstHeight, U32 InFrameBuffer, U32 OutFrameBuffer)
{
PostInit(SrcWidth+32, SrcHeight+32, SrcWidth, SrcHeight, 16, 16,
DstWidth, DstHeight, DstWidth, DstHeight, 0, 0,
InFrameBuffer, OutFrameBuffer, POST_IN_YCBYCR420|POST_OUT_RGB24B);
}
void PostDownloadImage(void)
{
//Uart_Printf("You can download image to memory\n");
DownloadBinary();
}
void __irq PostIsr(void)
{
rINTSUBMSK=BIT_SUB_DISP_FIFO|BIT_SUB_DISP_FRAME|BIT_SUB_POST;
rMODE &= ~(1<<6);//Clear Source in POST Processor
rSUBSRCPND=BIT_SUB_POST; //Clear SUB Interrupt Source Pending.
ClearPending(BIT_LCD_POST);//Clear Source Pending, Interrupt Pending
postProcessingDone=1;
rINTSUBMSK&= ~(BIT_SUB_POST);
}
void PostStartProcessing(U32 FrameCnt)
{
postProcessingDone=0;
rADDRStart_Y=ADDRStartY[FrameCnt];
rADDREnd_Y=ADDREndY[FrameCnt];
rADDRStart_Cb=ADDRStartCb[FrameCnt];
rADDREnd_Cb=ADDREndCb[FrameCnt];
rADDRStart_Cr=ADDRStartCr[FrameCnt];
rADDREnd_Cr=ADDREndCr[FrameCnt];
rMODE|=(1<<5);
}
void PostInit(U32 OrgSrcWidth, U32 OrgSrcHeight, U32 SrcWidth, U32 SrcHeight, U32 SrcStartX, U32 SrcStartY,
U32 OrgDstWidth, U32 OrgDstHeight, U32 DstWidth, U32 DstHeight, U32 DstStartX, U32 DstStartY,
U32 InFrameBuffer,U32 OutFrameBuffer, U32 mode)
{
U32 src420, inrgb, interleave, inrgbformat, inycformat;
U32 outrgb;
U32 H_Shift, V_Shift, PreHorRatio, PreVerRatio;
U32 inmultiplier, outmultiplier;
U32 OffsetY, OffsetC, OffsetRGB;
switch(mode&POST_IN_MASK) {
case POST_IN_YCBYCR420:
src420=1;
inrgb=0;
interleave=0;
inrgbformat=1;
inycformat=0;
inmultiplier=1;
break;
case POST_IN_YCBYCR422:
src420=0;
inrgb=0;
interleave=1;
inrgbformat=1;
inycformat=0;
inmultiplier=2;
break;
case POST_IN_CBYCRY422:
src420=0;
inrgb=0;
interleave=1;
inrgbformat=1;
inycformat=1;
inmultiplier=2;
break;
case POST_IN_RGB16B:
src420=0;
inrgb=1;
interleave=1;
inrgbformat=0;
inycformat=0;
inmultiplier=2;
break;
case POST_IN_RGB24B:
src420=0;
inrgb=1;
interleave=1;
inrgbformat=1;
inycformat=0;
inmultiplier=4;
break;
default:
Uart_Printf("ERROR:incorrect POST input format.\n");
break;
}
if((mode&POST_OUT_MASK)==POST_OUT_RGB16B) {
outrgb=0;
outmultiplier=2;
}
else if((mode&POST_OUT_MASK)==POST_OUT_RGB24B) {
outrgb=1;
outmultiplier=4;
}
else
Uart_Printf("ERROR:incorrect POST output format.\n");
OffsetC=(OrgSrcWidth-SrcWidth)*inmultiplier/2;
//rMODE=(1<<9)|(src420<<8)|(POST_INTEN<<7)|(outrgb<<4)|(inrgb<<3)|(interleave<<2)|(inrgbformat<<1)|(inycformat);
rMODE=(2<<10)|(1<<9)|(src420<<8)|(POST_INTEN<<7)|(outrgb<<4)|(inrgb<<3)|(interleave<<2)|(inrgbformat<<1)|(inycformat);
CalculatePrescalerRatioShift(SrcWidth, DstWidth, &PreHorRatio, &H_Shift);
CalculatePrescalerRatioShift(SrcHeight, DstHeight, &PreVerRatio, &V_Shift);
rPreScale_Ratio=(PreVerRatio<<7)|(PreHorRatio);
rPreScaleImgSize=((SrcHeight/PreVerRatio)<<12)|(SrcWidth/PreHorRatio);
rSRCImgSize=(SrcHeight<<12)|(SrcWidth<<0);
rMainScale_H_Ratio=(SrcWidth<<8)/(DstWidth<<H_Shift);
rMainScale_V_Ratio=(SrcHeight<<8)/(DstHeight<<V_Shift);
rDSTImgSize=(DstHeight<<12)|(DstWidth<<0);
rPreScale_SHFactor=10-(H_Shift+V_Shift);
OffsetY=(OrgSrcWidth-SrcWidth)*inmultiplier;
OffsetC=((OrgSrcWidth-SrcWidth)/2)*1;
ADDRStartY[0]=InFrameBuffer+(OrgSrcWidth*SrcStartY+SrcStartX)*inmultiplier;
ADDREndY[0]=ADDRStartY[0]+SrcWidth*SrcHeight*inmultiplier+OffsetY*(SrcHeight-1);
ADDRStartCb[0]=InFrameBuffer+OrgSrcWidth*OrgSrcHeight*1+(OrgSrcWidth/2*SrcStartY/2+SrcStartX/2)*1;
ADDREndCb[0]=ADDRStartCb[0]+(SrcWidth/2*SrcHeight/2)*1+OffsetC*(SrcHeight/2-1);
ADDRStartCr[0]=InFrameBuffer+OrgSrcWidth*OrgSrcHeight*1+(OrgSrcWidth/2*OrgSrcHeight/2)*1+(OrgSrcWidth/2*SrcStartY/2+SrcStartX/2)*1;
ADDREndCr[0]=ADDRStartCr[0]+(SrcWidth/2*SrcHeight/2)*1+OffsetC*(SrcHeight/2-1);
InFrameBuffer+=(OrgSrcWidth*OrgSrcHeight)*(2+inmultiplier)/2;
ADDRStartY[1]=InFrameBuffer+(OrgSrcWidth*SrcStartY+SrcStartX)*inmultiplier;
ADDREndY[1]=ADDRStartY[1]+SrcWidth*SrcHeight*inmultiplier+OffsetY*(SrcHeight-1);
ADDRStartCb[1]=InFrameBuffer+OrgSrcWidth*OrgSrcHeight*1+(OrgSrcWidth/2*SrcStartY/2+SrcStartX/2)*1;
ADDREndCb[1]=ADDRStartCb[1]+(SrcWidth/2*SrcHeight/2)*1+OffsetC*(SrcHeight/2-1);
ADDRStartCr[1]=InFrameBuffer+OrgSrcWidth*OrgSrcHeight*1+(OrgSrcWidth/2*OrgSrcHeight/2)*1+(OrgSrcWidth/2*SrcStartY/2+SrcStartX/2)*1;
ADDREndCr[1]=ADDRStartCr[1]+(SrcWidth/2*SrcHeight/2)*1+OffsetC*(SrcHeight/2-1);
InFrameBuffer+=(OrgSrcWidth*OrgSrcHeight)*(2+inmultiplier)/2;
ADDRStartY[2]=InFrameBuffer+(OrgSrcWidth*SrcStartY+SrcStartX)*inmultiplier;
ADDREndY[2]=ADDRStartY[2]+SrcWidth*SrcHeight*inmultiplier+OffsetY*(SrcHeight-1);
ADDRStartCb[2]=InFrameBuffer+OrgSrcWidth*OrgSrcHeight*1+(OrgSrcWidth/2*SrcStartY/2+SrcStartX/2)*1;
ADDREndCb[2]=ADDRStartCb[2]+(SrcWidth/2*SrcHeight/2)*1+OffsetC*(SrcHeight/2-1);
ADDRStartCr[2]=InFrameBuffer+OrgSrcWidth*OrgSrcHeight*1+(OrgSrcWidth/2*OrgSrcHeight/2)*1+(OrgSrcWidth/2*SrcStartY/2+SrcStartX/2)*1;
ADDREndCr[2]=ADDRStartCr[2]+(SrcWidth/2*SrcHeight/2)*1+OffsetC*(SrcHeight/2-1);
InFrameBuffer+=(OrgSrcWidth*OrgSrcHeight)*(2+inmultiplier)/2;
ADDRStartY[3]=InFrameBuffer+(OrgSrcWidth*SrcStartY+SrcStartX)*inmultiplier;
ADDREndY[3]=ADDRStartY[3]+SrcWidth*SrcHeight*inmultiplier+OffsetY*(SrcHeight-1);
ADDRStartCb[3]=InFrameBuffer+OrgSrcWidth*OrgSrcHeight*1+(OrgSrcWidth/2*SrcStartY/2+SrcStartX/2)*1;
ADDREndCb[3]=ADDRStartCb[3]+(SrcWidth/2*SrcHeight/2)*1+OffsetC*(SrcHeight/2-1);
ADDRStartCr[3]=InFrameBuffer+OrgSrcWidth*OrgSrcHeight*1+(OrgSrcWidth/2*OrgSrcHeight/2)*1+(OrgSrcWidth/2*SrcStartY/2+SrcStartX/2)*1;
ADDREndCr[3]=ADDRStartCr[3]+(SrcWidth/2*SrcHeight/2)*1+OffsetC*(SrcHeight/2-1);
OffsetRGB=(OrgDstWidth-DstWidth)*outmultiplier;
ADDRStartRGB[0]=OutFrameBuffer+(OrgDstWidth*DstStartY+DstStartX)*outmultiplier;
ADDREndRGB[0]=ADDRStartRGB[0]+(DstWidth*DstHeight)*outmultiplier+OffsetRGB*(DstHeight-1);
ADDRStartRGB[1]=ADDREndRGB[0]+(OrgDstWidth*DstStartY+DstStartX)*outmultiplier;
ADDREndRGB[1]=ADDRStartRGB[1]+(DstWidth*DstHeight)*outmultiplier+OffsetRGB*(DstHeight-1);
ADDRStartRGB[2]=ADDREndRGB[1]+(OrgDstWidth*DstStartY+DstStartX)*outmultiplier;
ADDREndRGB[2]=ADDRStartRGB[2]+(DstWidth*DstHeight)*outmultiplier+OffsetRGB*(DstHeight-1);
ADDRStartRGB[3]=ADDREndRGB[2]+(OrgDstWidth*DstStartY+DstStartX)*outmultiplier;
ADDREndRGB[3]=ADDRStartRGB[3]+(DstWidth*DstHeight)*outmultiplier+OffsetRGB*(DstHeight-1);
rADDRStart_Y=ADDRStartY[0];
rADDREnd_Y=ADDREndY[0];
rOffset_Y=OffsetY;
if(src420) { //if .srcFormat420==1, .srcFormatInterleave should be 0.
rADDRStart_Cb=ADDRStartCb[0];
rADDREnd_Cb=ADDREndCb[0];
rADDRStart_Cr=ADDRStartCr[0];
rADDREnd_Cr=ADDREndCr[0];
rOffset_Cb=OffsetC;
rOffset_Cr=OffsetC;
}
rADDRStart_RGB=ADDRStartRGB[0];
rADDREnd_RGB=ADDREndRGB[0];
rOffset_RGB=OffsetRGB;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -