📄 s3c6400_camera.cpp
字号:
{
pBufInfo[i].VirtAddr = (DWORD)pPreviewVirtAddr + size*i;
pBufInfo[i].size = size;
pBufInfo[i].pY = (DWORD*)((DWORD)(PhysPreviewAddr.LowPart) + size*i);
}
if(OUTPUT_CODEC_YCBCR420 == Preview_Buffer.Format)
{
sizeY = Preview_Buffer.Width*Preview_Buffer.Height;
sizeC = Preview_Buffer.Width*Preview_Buffer.Height/4;
for(i=0;i<MAX_HW_FRAMES;i++)
{
pBufInfo[i].pCb = (DWORD*)((DWORD)pBufInfo[i].pY + sizeY);
pBufInfo[i].pCr = (DWORD*)((DWORD)pBufInfo[i].pCb + sizeC);
}
}
}
else
{
return FALSE;
}
RETAILMSG(CAM_INOUT,(TEXT("------------------CameraPrepareBuffer\n")));
return TRUE;
}
int CameraDeallocateBuffer(int BufferType)
{
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CameraDeallocateBuffer\n")));
RETAILMSG(CAM_INOUT,(TEXT("------------------CameraDeallocateBuffer\n")));
return TRUE;
}
int CameraSetFormat(UINT32 width, UINT32 height, int format, int BufferType)
{
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CameraSetFormat\n")));
if(BufferType == VIDEO_CAPTURE_BUFFER)
{
Video_Buffer.Width = width;
Video_Buffer.Height = height;
Video_Buffer.Format = format;
//SetCodecRegister(width, height, format);
}
else if(BufferType == STILL_CAPTURE_BUFFER)
{
Still_Buffer.Width = width;
Still_Buffer.Height = height;
Still_Buffer.Format = format;
//SetCodecRegister(width, height, format);
}
else if(BufferType == PREVIEW_CAPTURE_BUFFER)
{
Preview_Buffer.Width = width;
Preview_Buffer.Height = height;
Preview_Buffer.Format = format;
//SetPreviewRegister(width, height, format);
}
else
{
return FALSE;
}
RETAILMSG(CAM_INOUT,(TEXT("------------------CameraSetFormat\n")));
return TRUE;
}
void CameraSetCodecRegister(UINT32 width, UINT32 height, int Format) // set codec register
{
MODULE_DESCRIPTOR value;
BYTE Out422_Co, Cpt_CoDMA_RGBFMT;
UINT32 MainBurstSizeY, RemainedBurstSizeY, MainBurstSizeC, RemainedBurstSizeC;
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++SetCodecRegister Width=%d Height=%d Format=%d\n"),width,height,Format));
ModuleGetFormat(value);
switch(Format)
{
case OUTPUT_CODEC_YCBCR422:
Out422_Co = 2; // we don't support Non-interleave 4:2:2
Cpt_CoDMA_RGBFMT = 0;
CalculateBurstSize(width*2, &MainBurstSizeY, &RemainedBurstSizeY);
MainBurstSizeY /= 2;
RemainedBurstSizeY /= 2;
MainBurstSizeC = MainBurstSizeY/2;
RemainedBurstSizeC = RemainedBurstSizeY/2;
//CalculateBurstSize(width/2, &MainBurstSizeC, &RemainedBurstSizeC);
break;
case OUTPUT_CODEC_RGB16:
Out422_Co = 3;
Cpt_CoDMA_RGBFMT = 0;
CalculateBurstSize(width*2, &MainBurstSizeY, &RemainedBurstSizeY);
MainBurstSizeC = 0;
RemainedBurstSizeC = 0;
break;
case OUTPUT_CODEC_RGB24:
Out422_Co = 3;
Cpt_CoDMA_RGBFMT = 2;
CalculateBurstSize(width*4, &MainBurstSizeY, &RemainedBurstSizeY);
MainBurstSizeC = 0;
RemainedBurstSizeC = 0;
break;
case OUTPUT_CODEC_YCBCR420:
default:
Out422_Co = 0;
Cpt_CoDMA_RGBFMT = 0;
CalculateBurstSize(width, &MainBurstSizeY, &RemainedBurstSizeY);
CalculateBurstSize(width/2, &MainBurstSizeC, &RemainedBurstSizeC);
break;
}
//CameraClockOn(TRUE);
s6400CAM->CICOTRGFMT= (Out422_Co<<29)|(width<<16)|(height);
s6400CAM->CICOCTRL=(MainBurstSizeY<<19)|(RemainedBurstSizeY<<14)|(MainBurstSizeC<<9)|(RemainedBurstSizeC<<4)|(0);
s6400CAM->CICOSCCTRL=(1<<28)|(1<<27)|(0<<26)|(0<<25)|(3<<13)|(Cpt_CoDMA_RGBFMT<<11)|(0<<10);
CameraSetScaler(width,height,CODEC_PATH);
s6400CAM->CICOTAREA=width*height;
//s6400CAM->CIIMGCPT ;
//CameraClockOn(FALSE);
RETAILMSG(CAM_INOUT,(TEXT("------------------SetCodecRegister\n")));
}
void CameraSetPreviewRegister(UINT32 width, UINT32 height, int Format) // set preview register
{
MODULE_DESCRIPTOR value;
BYTE Out422_Pr, Cpt_PrDMA_RGBFMT;
UINT32 MainBurstSizeY, RemainedBurstSizeY, MainBurstSizeC, RemainedBurstSizeC;
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++SetPreviewRegister\n")));
ModuleGetFormat(value);
switch(Format)
{
case OUTPUT_CODEC_YCBCR422:
Out422_Pr = 2; // we don't support Non-interleave 4:2:2
Cpt_PrDMA_RGBFMT = 0;
CalculateBurstSize(width*2, &MainBurstSizeY, &RemainedBurstSizeY);
CalculateBurstSize(width/2, &MainBurstSizeC, &RemainedBurstSizeC);
break;
case OUTPUT_CODEC_RGB16:
Out422_Pr = 3;
Cpt_PrDMA_RGBFMT = 0;
CalculateBurstSize(width*2, &MainBurstSizeY, &RemainedBurstSizeY);
MainBurstSizeC = 0;
RemainedBurstSizeC = 0;
break;
case OUTPUT_CODEC_RGB24:
Out422_Pr = 3;
Cpt_PrDMA_RGBFMT = 2;
CalculateBurstSize(width*4, &MainBurstSizeY, &RemainedBurstSizeY);
MainBurstSizeC = 0;
RemainedBurstSizeC = 0;
break;
case OUTPUT_CODEC_YCBCR420:
default:
Out422_Pr = 0;
Cpt_PrDMA_RGBFMT = 0;
CalculateBurstSize(width, &MainBurstSizeY, &RemainedBurstSizeY);
CalculateBurstSize(width/2, &MainBurstSizeC, &RemainedBurstSizeC);
break;
}
//CameraClockOn(TRUE);
s6400CAM->CIPRTRGFMT= (Out422_Pr<<29)|(width<<16)|(height);
s6400CAM->CIPRCTRL=(MainBurstSizeY<<19)|(RemainedBurstSizeY<<14)|(MainBurstSizeC<<9)|(RemainedBurstSizeC<<4);
s6400CAM->CIPRSCCTRL=(1<<28)|(1<<27)|(0<<26)|(0<<25)|(3<<13)|(Cpt_PrDMA_RGBFMT<<11)|(0<<10);
CameraSetScaler(width,height,PREVIEW_PATH);
s6400CAM->CIPRTAREA= width*height;
s6400CAM->CICPTSEQ = 0xFFFFFFFF;
s6400CAM->CIMSCTRL = 0;
s6400CAM->CIPRSCOSY = 0;
s6400CAM->CIPRSCOSCB = 0;
s6400CAM->CIPRSCOSCR = 0;
//CameraClockOn(FALSE);
RETAILMSG(CAM_INOUT,(TEXT("------------------SetPreviewRegister\n")));
}
/********************************************************
CalculateBurstSize - Calculate the busrt lengths
Description:
- dstHSize: the number of the byte of H Size.
*/
void CalculateBurstSize(unsigned int hSize,unsigned int *mainBurstSize,unsigned int *remainedBurstSize)
{
unsigned int tmp;
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CalculateBurstSize\n")));
tmp=(hSize/4)%16;
switch(tmp) {
case 0:
*mainBurstSize=16;
*remainedBurstSize=16;
break;
case 4:
*mainBurstSize=16;
*remainedBurstSize=4;
break;
case 8:
*mainBurstSize=16;
*remainedBurstSize=8;
break;
default:
tmp=(hSize/4)%8;
switch(tmp) {
case 0:
*mainBurstSize=8;
*remainedBurstSize=8;
break;
case 4:
*mainBurstSize=8;
*remainedBurstSize=4;
default:
*mainBurstSize=4;
tmp=(hSize/4)%4;
*remainedBurstSize= (tmp) ? tmp: 4;
break;
}
break;
}
RETAILMSG(CAM_INOUT,(TEXT("------------------CalculateBurstSize\n")));
}
/********************************************************
CalculatePrescalerRatioShift - none
Description:
- none
*/
void CalculatePrescalerRatioShift(unsigned int SrcSize, unsigned int DstSize, unsigned int *ratio,unsigned int *shift)
{
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CalculatePrescalerRatioShift\n")));
if(SrcSize>=64*DstSize) {
// Uart_Printf("ERROR: out of the prescaler range: SrcSize/DstSize = %d(< 64)\r\n",SrcSize/DstSize);
while(1);
}
else if(SrcSize>=32*DstSize) {
*ratio=32;
*shift=5;
}
else if(SrcSize>=16*DstSize) {
*ratio=16;
*shift=4;
}
else if(SrcSize>=8*DstSize) {
*ratio=8;
*shift=3;
}
else if(SrcSize>=4*DstSize) {
*ratio=4;
*shift=2;
}
else if(SrcSize>=2*DstSize) {
*ratio=2;
*shift=1;
}
else {
*ratio=1;
*shift=0;
}
RETAILMSG(CAM_INOUT,(TEXT("------------------CalculatePrescalerRatioShift\n")));
}
UINT32 CalculateBufferSize(UINT32 width, UINT32 height, int format)
{
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CalculateBufferSize\n")));
UINT32 size=0;
switch(format)
{
case OUTPUT_CODEC_YCBCR422:
size = width*height + width*height/2*2;
break;
case OUTPUT_CODEC_YCBCR420:
size = width*height + width*height/4*2;
break;
case OUTPUT_CODEC_RGB24:
size = width*height*4;
break;
case OUTPUT_CODEC_RGB16:
size = width*height*2;
break;
}
RETAILMSG(CAM_INOUT,(TEXT("------------------CalculateBufferSize\n")));
return size;
}
int CameraGetCurrentFrameNum(int BufferType)
{
int temp;
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CameraGetCurrentFrameNum\n")));
if(VIDEO_CAPTURE_BUFFER == BufferType)
{
temp = (s6400CAM->CICOSTATUS>>26)&3;
temp = (temp + 2) % 4;
}
else if(STILL_CAPTURE_BUFFER == BufferType)
{
temp = (s6400CAM->CICOSTATUS>>26)&3;
temp = (temp + 2) % 4;
}
else if(PREVIEW_CAPTURE_BUFFER == BufferType)
{
temp = (s6400CAM->CIPRSTATUS>>26)&3;
temp = (temp + 2) % 4;
}
RETAILMSG(CAM_INOUT,(TEXT("------------------CameraGetCurrentFrameNum\n")));
return temp;
}
int CameraCaptureControl(int Format, BOOL on)
{
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CameraCaptureControl\n")));
//CameraClockOn(TRUE);
s6400CAM->CIIMGCPT &= ~(CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT);
if(PREVIEW_CAPTURE_BUFFER == Format)
{
if(on)
{
RETAILMSG(CAM_MSG,(TEXT("Preview ON\n")));
PreviewOn = TRUE;
s6400CAM->CIPRSCCTRL |=(CAM_PVIEW_SACLER_START_BIT);
s6400CAM->CIIMGCPT |= (CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT)|(CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT);
//s6400INT->INTSUBMSK &= ~(1<<IRQ_SUB_CAM_P);
//while((s6400CAM->CIPRSTATUS&(1<<21)) == 0);
}
else
{
RETAILMSG(CAM_MSG,(TEXT("Preview OFF\n")));
PreviewFrameCnt = 0;
PreviewOn = FALSE;
s6400CAM->CIPRSCCTRL &= ~(CAM_PVIEW_SACLER_START_BIT);
s6400CAM->CIIMGCPT &= ~(CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT);
//s6400INT->INTMSK |= (1<<IRQ_SUB_CAM_P);
}
}
else // STILL, VIDEO
{
if(on)
{
RETAILMSG(CAM_MSG,(TEXT("Capture ON\n")));
CodecOn = TRUE;
if(STILL_CAPTURE_BUFFER == Format)
{
StillOn = TRUE;
VideoOn = FALSE;
}
else
{
StillOn = FALSE;
VideoOn = TRUE;
}
s6400CAM->CICOSCCTRL |=(CAM_CODEC_SACLER_START_BIT);
s6400CAM->CIIMGCPT |=(CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT)|(CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT);
//s6400INT->INTSUBMSK &= ~(1<<IRQ_SUB_CAM_C);
}
else
{
RETAILMSG(CAM_MSG,(TEXT("Capture OFF\n")));
CodecOn = FALSE;
StillOn = FALSE;
VideoOn = FALSE;
CodecFrameCnt = 0;
s6400CAM->CICOSCCTRL &= ~(CAM_CODEC_SACLER_START_BIT);
s6400CAM->CIIMGCPT &= ~((CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT));
//s6400INT->INTSUBMSK |= (1<<IRQ_SUB_CAM_C);
}
}
if(PreviewOn == FALSE && CodecOn == FALSE) // All Off
{
s6400CAM->CIGCTRL &= ~(1<<20);
//CameraClockOn(FALSE);
//s6400INT->INTMSK |= (1<<IRQ_CAM);
}
else // On
{
s6400CAM->CIGCTRL |= (1<<20);
s6400CAM->CIIMGCPT |= (CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT);
RETAILMSG(CAM_MSG,(TEXT("s6400CAM->CIPRSCCTRL=0x%08X\n"),s6400CAM->CIPRSCCTRL));
RETAILMSG(CAM_MSG,(TEXT("s6400CAM->CIIMGCPT=0x%08X\n"),s6400CAM->CIIMGCPT));
RETAILMSG(CAM_MSG,(TEXT("s6400CAM->CIPRSTATUS=0x%08X\n"),s6400CAM->CIPRSTATUS));
//s6400INT->INTMSK &= ~(1<<IRQ_CAM);
}
RETAILMSG(CAM_INOUT,(TEXT("------------------CameraCaptureControl\n")));
return TRUE;
}
int CameraSetRegisters(int format)
{
int size;
int sizeY,sizeC;
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CameraSetRegisters\n")));
//CameraClockOn(TRUE);
if(format == VIDEO_CAPTURE_BUFFER)
{
size = Video_Buffer.FrameSize;
s6400CAM->CICOYSA1 = (UINT32)(PhysCodecAddr.LowPart);
s6400CAM->CICOYSA2 = s6400CAM->CICOYSA1 + size;
s6400CAM->CICOYSA3 = s6400CAM->CICOYSA2 + size;
s6400CAM->CICOYSA4 = s6400CAM->CICOYSA3 + size;
if(OUTPUT_CODEC_YCBCR420 == Video_Buffer.Format)
{
sizeY = Video_Buffer.Width*Video_Buffer.Height;
sizeC = Video_Buffer.Width*Video_Buffer.Height/4;
/*
s6400CAM->CICOCBSA1=s6400CAM->CICOYSA1+sizeY;
s6400CAM->CICOCBSA2=s6400CAM->CICOYSA2+sizeY;
s6400CAM->CICOCBSA3=s6400CAM->CICOYSA3+sizeY;
s6400CAM->CICOCBSA4=s6400CAM->CICOYSA4+sizeY;
s6400CAM->CICOCRSA1=s6400CAM->CICOCBSA1+sizeC;
s6400CAM->CICOCRSA2=s6400CAM->CICOCBSA2+sizeC;
s6400CAM->CICOCRSA3=s6400CAM->CICOCBSA3+sizeC;
s6400CAM->CICOCRSA4=s6400CAM->CICOCBSA4+sizeC; */
// In DSHOW CB and Cr are changed.
s6400CAM->CICOCRSA1=s6400CAM->CICOYSA1+sizeY;
s6400CAM->CICOCRSA2=s6400CAM->CICOYSA2+sizeY;
s6400CAM->CICOCRSA3=s6400CAM->CICOYSA3+sizeY;
s6400CAM->CICOCRSA4=s6400CAM->CICOYSA4+sizeY;
s6400CAM->CICOCBSA1=s6400CAM->CICOCRSA1+sizeC;
s6400CAM->CICOCBSA2=s6400CAM->CICOCRSA2+sizeC;
s6400CAM->CICOCBSA3=s6400CAM->CICOCRSA3+sizeC;
s6400CAM->CICOCBSA4=s6400CAM->CICOCRSA4+sizeC;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -