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

📄 tskprocess.c

📁 在DM642上实现双通道采集并实现了实时匹配
💻 C
字号:
/*
 *  Copyright 2004 by SEED Incorporated.
 *  All rights reserved. Property of SEED Incorporated.
 *  Restricted rights to use, duplicate or disclose this code are
 *  granted through contract.
 *  
 */
/* "@(#) DDK 1.11.00.00 23-12-04 (ddk-b13)" */
#include <vport.h>
#include <vportcap.h>
#include <tvp51xx.h> 
#include <csl_edma.h>
#include <fvid.h>
#include <csl_dat.h>
#include <csl_cache.h>
#include <scom.h>
//#include <GlobalDef.h>
//#include <dwcif.h>
#include <c6x.h>

#include "appData.h"
#include "seeddm642.h"
#include "seedvpm642cfg.h"
#include "seedvpm642_vcapparams.h"
#include "seedvpm642_vdisparams.h"
#include "seedvpm642_tskprocess.h"

#pragma DATA_ALIGN(_srcW1, 8);                                                                      
#pragma DATA_ALIGN(_srcZ1, 8);              
#pragma DATA_ALIGN(_srcW2, 8);
#pragma DATA_ALIGN(_srcZ2, 8);

#pragma DATA_SECTION(_srcW1,".spec_data")
#pragma DATA_SECTION(_srcZ1,".spec_data")
#pragma DATA_SECTION(_srcW2,".spec_data")
#pragma DATA_SECTION(_srcZ2,".spec_data")

unsigned char _srcW1[720 * 576];
unsigned char _srcZ1[720 * 576];
unsigned char _srcW2[720 * 576];
unsigned char _srcZ2[720 * 576];

#pragma DATA_ALIGN(__desty, 8); 
#pragma DATA_SECTION(__desty,".spec_data")
unsigned char __desty[720 * 576]; 

#pragma DATA_ALIGN(__destcb, 8); 
#pragma DATA_SECTION(__destcb,".spec_data")
unsigned char __destcb[360 * 576];                                                      


#pragma DATA_ALIGN(__destcr, 8); 
#pragma DATA_SECTION(__destcr,".spec_data")
unsigned char __destcr[360* 576];                                                        
                                                     

#pragma DATA_ALIGN(Y0IN,8)
#pragma DATA_SECTION(Y0IN,".spec_data")
unsigned char Y0IN[720 * 576];  

#pragma DATA_ALIGN(Y1IN,8)
#pragma DATA_SECTION(Y1IN,".spec_data")
unsigned char Y1IN[720 * 576];  




#pragma DATA_ALIGN(YOUT,8)
#pragma DATA_SECTION(YOUT,".spec_data")
unsigned char YOUT[720 * 576];               

#pragma DATA_ALIGN(CBOUT,8)
#pragma DATA_SECTION(CBOUT,".spec_data")
unsigned char CBOUT[360 * 576];               


#pragma DATA_ALIGN(CROUT,8)
#pragma DATA_SECTION(CROUT,".spec_data")
unsigned char CROUT[360 * 576];               




#define clip(x,y,z) ((z<x)?x:((z>y)?y:z))
#define RGB2toYUVY(r1,g1,b1,r2,g2,b2,y1,cb1,cr1,y2)\
		y1=(unsigned char)clip(16,235,((76*r1+150*g1+29*b1)>>8));\
		cb1=(unsigned char)clip(16,240,(((0-44*r1-84*g1+128*b1)>>8)+128));\
		cr1=(unsigned char)clip(16,240,(((128*r2-107*g2-20*b2)>>8)+128));\
		y2=(unsigned char)clip(16,235,((76*r2+150*g2+29*b2)>>8));                                      //结束

#define cswap( h3,h2,h1)\
	    h3=(h1*h2)>>8;                           //不知道啊对,灰度融合

//FVID_Handle  disChan;
//FVID_Frame *disFrameBuf;



/*
 * ======== VideoLoopbackInit ========
 * video loopback function init.
 */
void VideoProcessInit()
{
		    
    /*memset(dec_out_y, 0x0,  sizeof(dec_out_y));
    memset(dec_out_u, 0x80, sizeof(dec_out_u));
    memset(dec_out_v, 0x80, sizeof(dec_out_v));	*/
}
/*
 * ======== tskVideoLoopback start========
 * video loopback function start.
 */
void VideoProcessStart()
{
	
}
/*
 * ======== tskVideoLoopback ========
 * video loopback function.
 */
void tskProcess()
{
	int i,j;                            //开始
    //int j,k,l,m,n;
	//unsigned char a=0;

    register unsigned char h10,h11,h12,h13,h14,h15;
	register unsigned char h20,h21,h22,h23,h24,h25;
	register unsigned char h30,h31,h32,h33,h34,h35;

	//unsigned char r1,b1,g1,r2,b2,g2;
	//int y1,y2,cb1,cr1;
    ScomMessage *pMsgBuf1;    
	ScomMessage *pMsgBuf2; 
	
	SCOM_Handle fromInput1toPRO,fromInput2toPRO,fromPROtoDIS;
	//SCOM_Handle fromInput1toPRO,fromPROtoInput1,fromInput2toPRO,fromPROtoInput2,fromPROtoDIS,fromDIStoPRO;
	
    unsigned char *inBuf[2];
    unsigned char *outBuf[3];
    //unsigned char *ctBuf[2];
    //unsigned char *cfBuf[2];
    //unsigned char *ctBufL[2];
    //unsigned char *cfBufL[2];
    //unsigned char *ctBufR;
    //unsigned char max=0;
    //unsigned char value;                              
    

    int width=720;
	int height=576;
	int i1,i3;

	
	int wid;
	int hei;
	
	
	
	unsigned int *src1;
    unsigned int *src2;
    //unsigned char *BYTE_src1;
    //unsigned char *BYTE_src2;
    unsigned char *y,*cb,*cr;
   	
	unsigned char *psrc1,*psrc2;
	unsigned char *psrc3,*psrc4;
    unsigned char *psrc5,*psrc6;
    
    register int index,index2,index1;

    int xoff,yoff;
	int suo;
    int LINE_SZ;
	int k=0,m=0;
	int flag=0;

    int width2=655;
	int height2=524;


	LINE_SZ=720;
	xoff=-62;
	yoff=-11;
	suo=11;

    y=__desty;
	cb=__destcb;
	cr=__destcr;
	
    //register unsigned char h10,h11,h12,h13,h14,h15;
	//register unsigned char h20,h21,h22,h23,h24,h25;
	//register unsigned char h30,h31,h32,h33,h34,h35;
	
	//register int index,index2,index1;



    //src1=_srcW;//放长波图像的数组                             没有定义完整
	//src2=_srcZ;//放短波图像的数组
	psrc3=_srcW1;
	psrc4=_srcZ1;
    psrc5=_srcW2;
    psrc6=_srcZ2;

	//FVID_alloc(capChanCh1, &capFrameBuf1);
    //FVID_alloc(capChanCh2, &capFrameBuf2); 
    //FVID_alloc(disChan, &disFrameBuf); 


	//SCOM_Handle fromInput1toPRO,fromPROtoInput1,fromInput2toPRO,fromPROtoInput2,fromPROtoDIS,fromDIStoPRO;huifu
//	SCOM_Handle fromInput2atoDIS,fromDIStoInput2a;
//	SCOM_Handle fromInput2btoDIS,fromDIStoInput2b;
		
	
    
	
	 		          		         
    /*打开SCOM模块*/
    fromInput1toPRO = SCOM_open("IN1TOPRO");
//	fromPROtoInput1 = SCOM_open("PROTOIN1");
	fromInput2toPRO = SCOM_open("IN2TOPRO");
//	fromPROtoInput2 = SCOM_open("PROTOIN2");
//	fromDIStoPRO = SCOM_open("DISTOPRO");
	fromPROtoDIS = SCOM_open("PROTODIS");

    /*申请一个空间*/
    //FVID_alloc(disChan, &disFrameBuf); 
    

   /* FVID_alloc(capChanCh1, &capFrameBuf1);
    FVID_alloc(capChanCh2, &capFrameBuf2); 
    FVID_alloc(disChan, &disFrameBuf); */
    




    while(1)
    {
	 	/*-----------------------------------------------------------*/
	  	/* Wait for the message from the process task to recieve new */
	  	/* frame to be displayed.                                    */
	   	/*-----------------------------------------------------------*/
	 	pMsgBuf1 = SCOM_getMsg(fromInput1toPRO, SYS_FOREVER);
	 	pMsgBuf2 = SCOM_getMsg(fromInput2toPRO, SYS_FOREVER);
	 	outBuf[0] =  (unsigned char *)YOUT;
		outBuf[1] =  (unsigned char *)CBOUT;
		outBuf[2] =  (unsigned char *)CROUT;
		
		inBuf[0] = (unsigned char *)Y0IN;
		inBuf[1] = (unsigned char *)Y1IN;
	 	
	 	inBuf[0]=pMsgBuf1->bufY;
	 	inBuf[1]=pMsgBuf2->bufY;
	 	

        if(flag)
		{
			//todo: 
			psrc1=_srcW1;
			psrc2=_srcZ1;
			flag=0;
		}
		else
		{
			psrc1=_srcW2;
			psrc2=_srcZ2;
			//todo:
			flag=1;
		}
	    for(i=0;i<575;i++)
		{				
		
			DAT_copy(inBuf[0]+i*720,
				     psrc1+i*720,720);
		    DAT_copy(inBuf[1]+i*720,
				     psrc2+i*720,720);
		}

	//kaishi
       for(i=0;i<576;i++)
		     {
		      for(k=0;k<LINE_SZ;k++)
		         {
		  		   *(src2+i*LINE_SZ+k)=((*(psrc4+i*LINE_SZ+k))
		  		                       +(*(psrc6+i*LINE_SZ+k)))>>1;
		          if((i%suo)==0)continue;
		          else 
		             {
		              if((k%suo)==0)continue;
		              else 
		                 {
		                  *(src1+m)=((*(psrc3+i*LINE_SZ+k))
		                             +(*(psrc5+i*LINE_SZ+k)))>>1;
		                  m=m+1;
		                 }
		         	  }
		   
		       	  }
	
		      }    
	//jieshu	
		/*	for(i=0;i<575;i++)
		     {
		     
		     _nassert( i>=20);       //这个啊要定义的哝
		      for(k=0;k<90;k++)
		          {
		          
		          _nassert( k>=20);//防止冗余
		        *(src2+i*180+k)=_avgu4((unsigned int)(*(psrc4+i*180+k)),(unsigned int)(*(psrc6+i*180+k)));
		        *(src2+i*180+k+90)=_avgu4((unsigned int)(*(psrc4+i*180+k+90)),(unsigned int)(*(psrc6+i*180+k+90)));   
		  		*(src1+i*180+k)=_avgu4((unsigned int)(*(psrc3+i*180+k)),(unsigned int)(*(psrc5+i*180+k)));
                *(src1+i*180+k+90)=_avgu4((unsigned int)(*(psrc3+i*180+k+90)),(unsigned int)(*(psrc5+i*180+k+90)));//取四个无符号数进行平均  
		         
		           
		        *(BYTE_src1+i*LINE_SZ+4*k) =BIT8 (*(src1+i*180+k));//    这个宏是否要重新定义    LINE_SZ是否为720?
		        *(BYTE_src1+i*LINE_SZ+4*k+1)=BIT16(*(src1+i*180+k));
		        *(BYTE_src1+i*LINE_SZ+4*k+2)=BIT24(*(src1+i*180+k));
		        *(BYTE_src1+i*LINE_SZ+4*k+3)=BIT32(*(src1+i*180+k));
		        
		        *(BYTE_src1+i*LINE_SZ+4*k+360)=BIT8 (*(src1+i*180+k+90));
		        *(BYTE_src1+i*LINE_SZ+4*k+361)=BIT16(*(src1+i*180+k+90));     
		        *(BYTE_src1+i*LINE_SZ+4*k+362)=BIT24(*(src1+i*180+k+90));    
		        *(BYTE_src1+i*LINE_SZ+4*k+363)=BIT32(*(src1+i*180+k+90));  
		        
		        *(BYTE_src2+i*LINE_SZ+4*k)  =BIT8 (*(src2+i*180+k));
		        *(BYTE_src2+i*LINE_SZ+4*k+1)=BIT16(*(src2+i*180+k));   
		        *(BYTE_src2+i*LINE_SZ+4*k+2)=BIT24(*(src2+i*180+k));         
		        *(BYTE_src2+i*LINE_SZ+4*k+3)=BIT32(*(src2+i*180+k));      
		                 
		        *(BYTE_src2+i*LINE_SZ+4*k+360)=BIT8 (*(src2+i*180+k+90));            
		        *(BYTE_src2+i*LINE_SZ+4*k+361)=BIT16(*(src2+i*180+k+90));               
		        *(BYTE_src2+i*LINE_SZ+4*k+362)=BIT24(*(src2+i*180+k+90));                     
		        *(BYTE_src2+i*LINE_SZ+4*k+363)=BIT32(*(src2+i*180+k+90));//BIT是宏  后面的数表示取无符号整型数的末几位
		         }
		      }    //去噪    */

		/*		 m=0;
		for(i=0;i<575;i++)
		    {
            for(j=0;j<719;j++)
                {
                                                                        
		       if((i%suo)==0)continue;
		          else 
		             {
		              if((j%suo)==0)continue;
		              else 
		                 {
		                 
		                 *(BYTE_src1+m)=*(BYTE_src1+i*LINE_SZ+j);
		                 
		                 m+=1;
                            
		                  }
		         	   }
		   
		       	  }
	
		       }      */                                               //缩放
		 


        for(i=0;i<575;i++)
		{
			i1=(i)*width;
			i3=(i+yoff)*width2;
			hei=i+yoff;
			for(j=0;j<120;j++)
			{
			  wid=6*j+xoff;
			  index=i1+6*j;
			  index1=i3+6*j+xoff;
			  index2=(index)>>1;
			  
			  if((hei<height)&&(wid<width)&&(hei>=0)&&(wid>=0))
			  {
			    if((i>50)&&(i<height2)&&((6*j)<width2))
			    {
			   
				
				h10=src2[index];
				h11=src2[index+1];
				h12=src2[index+2];
				h13=src2[index+3];
				h14=src2[index+4];
				h15=src2[index+5];
				
				h20=src1[index1];
				h21=src1[index1+1];
				h22=src1[index1+2];
				h23=src1[index1+3];
				h24=src1[index1+4];
				h25=src1[index1+5];
				
								
				cswap(h30,h20,h10)
				cswap(h31,h21,h11)
				cswap(h32,h22,h12)
				cswap(h33,h23,h13)
				cswap(h34,h24,h14)
				cswap(h35,h25,h15)   //调制函数
       
         				
				}
				else
				{
				    h10=16;
				    h11=16;
				    h12=16;
				    h13=16;
				    h14=16;
				    h15=16;
				    
				    h20=16;
				    h21=16;
				    h22=16;
				    h23=16;
				    h24=16;
				    h25=16;
				    
				    h30=16;
				    h31=16;
				    h32=16;
				    h33=16;
				    h34=16;
				    h35=16;
				}
			}
			else
			{
				    h10=16;
				    h11=16;
				    h12=16;
				    h13=16;
				    h14=16;
				    h15=16;
				    
				    h20=16;
				    h21=16;
				    h22=16;
				    h23=16;
				    h24=16;
				    h25=16;
				    
				    h30=16;
				    h31=16;
				    h32=16;
				    h33=16;
				    h34=16;
				    h35=16;
			}
			
           
             
             RGB2toYUVY(h11,h21,h31,h10,h20,h30,y[index+1],cb[index2],cr[index2],y[index])
             //RGBtoY(h10,h20,h30,y[index])
	         //RGBtoYUV(h11,h21,h31,y[index+1],cb[index2],cr[index2])
	         RGB2toYUVY(h13,h23,h33,h12,h22,h32,y[index+3],cb[index2+1],cr[index2+1],y[index+2])       
		     //RGBtoY(h12,h22,h32,y[index+2])
			 //RGBtoYUV(h13,h23,h33,y[index+3],cb[index2+1],cr[index2+1])
			 RGB2toYUVY(h15,h25,h35,h14,h24,h34,y[index+5],cb[index2+2],cr[index2+2],y[index+4])	
			 //RGBtoY(h14,h24,h34,y[index+4])
			 //RGBtoYUV(h15,h25,h35,y[index+5],cb[index2+2],cr[index2+2])



				
			}             
		}	

        CACHE_clean(CACHE_L2ALL,NULL, NULL);
		
		for(i=0;i<(574);i++)
		{
			
			DAT_copy(y+i*720,outBuf[0]+i*720,720);
			DAT_copy(cb+i*360,outBuf[1]+i*360,360);	
			DAT_copy(cr+i*360,outBuf[2]+i*360,360);	 
		}
		
	
	    DAT_wait(DAT_XFRID_WAITALL);
		pMsgBuf1->bufY = YOUT;
		pMsgBuf1->bufU = CBOUT;
		pMsgBuf1->bufV = CROUT;


        SCOM_putMsg(fromPROtoDIS,pMsgBuf1);
		CACHE_clean(CACHE_L2ALL,NULL, NULL);
		//FVID_exchange(capChanCh1, &capFrameBuf1);
		//FVID_exchange(capChanCh2, &capFrameBuf2);
		//FVID_exchange(disChan, &disFrameBuf);
		
		}
	 	
    }

⌨️ 快捷键说明

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