📄 camerafunc.cpp
字号:
//-----------------------------------------------------------------------------
//
// Copyright (C) 2006, Freescale Semiconductor, Inc. All Rights Reserved.
// THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS
// AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT
//
//-----------------------------------------------------------------------------
//
// File: Camerafunc.cpp
//
// Provides the camera functions implementation.
//
//-----------------------------------------------------------------------------
#include "camera.h"
#include "camera_ext.h"
#include "camerafunc.h"
//------------------------------------------------------------------------------
// External Variables
//------------------------------------------------------------------------------
// Global Variables
//#define CodecDemo_DEBUG_MSG 1
//------------------------------------------------------------------------------
// Defines
#define PIN_DESIRED_BUFFER_COUNT 2
#define FOURCC_YV12 mmioFOURCC('Y', 'V', '1', '2')
typedef enum CAMERA_RESOLUTION
{
VGA,
CIF,
QVGA,
QCIF,
QQVGA
};
//------------------------------------------------------------------------------
// Types
//------------------------------------------------------------------------------
// Local Variables
static HANDLE ghCameraDll;
static HANDLE ghPreviewPinDll;
static HANDLE ghCapturePinDll;
static HANDLE ghPreviewMsgQ;
static HANDLE ghCaptureMsgQ;
static CS_DATAFORMAT_VIDEOINFOHEADER gPreviewDataFormat;
static PCS_STREAM_DESCRIPTOR gpPreviewStreamDesc;
static CRITICAL_SECTION gcsPreview;
static CS_DATAFORMAT_VIDEOINFOHEADER gCaptureDataFormat;
static PCS_STREAM_DESCRIPTOR gpCaptureStreamDesc;
static CRITICAL_SECTION gcsCapture;
static PCSMULTIPLE_ITEM g_pPreviewDataRanges, g_pCaptureDataRanges, g_pStillDataRanges;
static UINT32 g_iNumCaptureDataRanges, g_iNumStillDataRanges, g_iNumPreviewDataRanges;
static CSPROPERTY inputIOCTL;
static CSSTATE state;
static PCS_DATAFORMAT_VIDEOINFOHEADER g_pCapDataFormat;
CS_DATAFORMAT_VIDEOINFOHEADER VideoRGBDataFormat =
{
// CSDATARANGE
{
sizeof (CS_DATARANGE_VIDEO),
0, // Flags
921600, // SampleSize
0, // Reserved
STATIC_CSDATAFORMAT_TYPE_VIDEO,
0xe436eb7b, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70,
STATIC_CSDATAFORMAT_SPECIFIER_VIDEOINFO
},
// CS_VIDEOINFOHEADER (default format)
{
0,0,0,0, // RECT rcSource;
0,0,0,0, // RECT rcTarget;
36864000, // DWORD dwBitRate; 153600 * 30FPS * 8 bit/Byte
0L, // DWORD dwBitErrorRate;
333333, // DWORD dwBitRate;
{
sizeof (CS_BITMAPINFOHEADER), // DWORD biSize;
320, // LONG biWidth;
240, // LONG biHeight; -biHeight indicate TopDown for RGB
1, // WORD biPlanes;
16, // WORD biBitCount;
CS_BI_BITFIELDS, // DWORD biCompression;
153600, // DWORD biSizeImage;
0, // LONG biXPelsPerMeter;
0, // LONG biYPelsPerMeter;
0, // DWORD biClrUsed;
0 // DWORD biClrImportant;
},
{
0xF800, // DWORD dwBitMasks[CS_iMASK_COLORS];
0x07E0,
0x001F
}
}
};
#if 0
CS_DATAFORMAT_VIDEOINFOHEADER VideoYUVDataFormat =
{
// CSDATARANGE
{
sizeof (CS_DATARANGE_VIDEO), // Flags
0,
115200, // SampleSize
0, // Reserved
STATIC_CSDATAFORMAT_TYPE_VIDEO,
FOURCC_YV12, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71,
STATIC_CSDATAFORMAT_SPECIFIER_VIDEOINFO
},
// CS_VIDEOINFOHEADER (default format)
{
0,0,CH2_CAPTURE_WIDTH,-CH2_CAPTURE_HEIGHT, // RECT rcSource;
0,0,CH2_CAPTURE_WIDTH,-CH2_CAPTURE_HEIGHT, // RECT rcTarget;
36864000, // DWORD dwBitRate; 153600 * 30FPS * 8 bit/Byte
0L, // DWORD dwBitErrorRate;
333333, // REFERENCE_TIME AvgTimePerFrame;
sizeof (CS_BITMAPINFOHEADER), // DWORD biSize;
CH2_CAPTURE_WIDTH, // LONG biWidth;
-CH2_CAPTURE_HEIGHT, // LONG biHeight;
1, // WORD biPlanes;
12, // WORD biBitCount;
FOURCC_YV12, // DWORD biCompression;
115200, // DWORD biSizeImage;
0, // LONG biXPelsPerMeter;
0, // LONG biYPelsPerMeter;
0, // DWORD biClrUsed;
0, // DWORD biClrImportant;
0, 0, 0 // DWORD dwBitMasks[3]
}
};
#endif
CS_DATAFORMAT_VIDEOINFOHEADER VideoYUVDataFormat =
{
// CSDATARANGE
{
sizeof (CS_DATARANGE_VIDEO),
0, // Flags
115200, // SampleSize
0, // Reserved
STATIC_CSDATAFORMAT_TYPE_VIDEO,
FOURCC_YV12, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71,
STATIC_CSDATAFORMAT_SPECIFIER_VIDEOINFO
},
// CS_VIDEOINFOHEADER (default format)
{
0,0,320,-240, // RECT rcSource;
0,0,320,-240, // RECT rcTarget;
27648000, // DWORD dwBitRate;
0L, // DWORD dwBitErrorRate;
333333, // DWORD dwBitRate; 614400 * 30FPS * 8 bit/Byte
{
sizeof (CS_BITMAPINFOHEADER), // DWORD biSize;
320, // LONG biWidth;
-240, // LONG biHeight; -biHeight indicate TopDown for RGB
1, // WORD biPlanes;
12, // WORD biBitCount;
FOURCC_YV12, // DWORD biCompression;
115200, // DWORD biSizeImage;
0, // LONG biXPelsPerMeter;
0, // LONG biYPelsPerMeter;
0, // DWORD biClrUsed;
0 // DWORD biClrImportant;
},
{
0, // DWORD dwBitMasks[CS_iMASK_COLORS];
0,
0
}
}
};
void ReadPinDataRanges(UINT32 pinId);
bool CameraTestCapture(void);
//------------------------------------------------------------------------------
// Local Functions
//-----------------------------------------------------------------------------
//
// Function: LoadCamDriver
//
// Loader the Camera driver and initiate the preview and capture pin.
//
// Parameters:
// None
//
// Returns:
// TRUE if successful; FALSE if failed.
//
//-----------------------------------------------------------------------------
BOOL LoadCamDriver()
{
MSGQUEUEOPTIONS msgOptions;
CSPROPERTY_STREAMEX_S CsPropStreamEx;
DWORD dBytesTransferred;
BOOL bResult = FALSE;
InitializeCriticalSection(&gcsPreview);
gPreviewDataFormat =VideoRGBDataFormat;
InitializeCriticalSection(&gcsCapture);
gCaptureDataFormat =VideoYUVDataFormat;
gpPreviewStreamDesc = (PCS_STREAM_DESCRIPTOR)malloc(sizeof(CS_STREAM_DESCRIPTOR));
if (gpPreviewStreamDesc == NULL) {
return FALSE;
}
gpCaptureStreamDesc = (PCS_STREAM_DESCRIPTOR)malloc(sizeof(CS_STREAM_DESCRIPTOR));
if (gpCaptureStreamDesc == NULL) {
return FALSE;
}
ghCameraDll = CreateFile(TEXT("CAM1:"), // "special" file name
GENERIC_READ|GENERIC_WRITE, // desired access
FILE_SHARE_READ|FILE_SHARE_WRITE, // sharing mode
NULL, // security attributes (=NULL)
OPEN_EXISTING, // creation disposition
FILE_ATTRIBUTE_NORMAL, // flags and attributes
NULL); // template file (ignored)
if (INVALID_HANDLE_VALUE == ghCameraDll) {
ERRORMSG(CodecDemo_ERROR_MSG, (TEXT("LoadCamDriver: CreateFile CAM1 failed!Last error code is %d \r\n"),GetLastError()));
return FALSE;
}
RETAILMSG(CodecDemo_DEBUG_MSG, (TEXT("LoadCamDriver: CreateFile CAM1 Done!\r\n")));
// open a pin for preview
ghPreviewPinDll= CreateFile(TEXT("PIN1:"), // "special" file name
GENERIC_READ|GENERIC_WRITE, // desired access
0, // sharing mode
NULL, // security attributes (=NULL)
OPEN_ALWAYS, // creation disposition
FILE_ATTRIBUTE_NORMAL, // flags and attributes
NULL); // template file (ignored)
if (INVALID_HANDLE_VALUE == ghPreviewPinDll) {
ERRORMSG(CodecDemo_ERROR_MSG, (TEXT("LoadCamDriver: Open a pin for preview failed!Last error code is %d \r\n"),GetLastError()));
return FALSE;
}
RETAILMSG(CodecDemo_DEBUG_MSG, (TEXT("LoadCamDriver: Open a pin for preview Done!\r\n")));
// Open a pin for capture image
ghCapturePinDll = CreateFile(TEXT("PIN1:"), // "special" file name
GENERIC_READ|GENERIC_WRITE, // desired access
0, // sharing mode
NULL, // security attributes (=NULL)
OPEN_ALWAYS, // creation disposition
FILE_ATTRIBUTE_NORMAL, // flags and attributes
NULL); // template file (ignored)
if (INVALID_HANDLE_VALUE == ghCapturePinDll) {
ERRORMSG(CodecDemo_ERROR_MSG, (TEXT("LoadCamDriver: Open a pin for capture image failed!Last error code is %d \r\n"),GetLastError()));
return FALSE;
}
RETAILMSG(CodecDemo_DEBUG_MSG, (TEXT("LoadCamDriver: Open a pin for capture image done!\r\n")));
// Open msg queue for Preview Pin
msgOptions.dwSize = sizeof(MSGQUEUEOPTIONS);
msgOptions.dwFlags = MSGQUEUE_ALLOW_BROKEN;
msgOptions.dwMaxMessages = 0;
msgOptions.cbMaxMessage = sizeof(CS_MSGQUEUE_BUFFER);
msgOptions.bReadAccess = TRUE;
ghPreviewMsgQ = CreateMsgQueue(NULL, &msgOptions);
if(!ghPreviewMsgQ) {
RETAILMSG(CodecDemo_ERROR_MSG, (TEXT("LoadCamDriver: CreateMsgQueue for Preview pin failed!\r\n")));
return FALSE;
}
RETAILMSG(CodecDemo_DEBUG_MSG, (TEXT("LoadCamDriver: CreateMsgQueue for Preview pin done!\r\n")));
// Open msg queue for Capture Pin
ghCaptureMsgQ = CreateMsgQueue(NULL, &msgOptions);
if(!ghCaptureMsgQ) {
RETAILMSG(CodecDemo_ERROR_MSG, (TEXT("LoadCamDriver: CreateMsgQueue for Capture pin failed!\r\n")));
return FALSE;
}
RETAILMSG(CodecDemo_DEBUG_MSG, (TEXT("LoadCamDriver: CreateMsgQueue for Capture pin done!\r\n")));
// create preview pin instance
CsPropStreamEx.hMsgQueue = ghPreviewMsgQ;
CsPropStreamEx.CsPin.PinId = PREVIEW; //preview
CsPropStreamEx.CsPin.Property.Set = CSPROPSETID_StreamEx;
CsPropStreamEx.CsPin.Property.Id = CSPROPERTY_STREAMEX_INIT;
CsPropStreamEx.CsPin.Property.Flags = CSPROPERTY_TYPE_SET;
bResult = DeviceIoControl(ghPreviewPinDll, // file handle to the driver
IOCTL_STREAM_INSTANTIATE, // I/O control code
&CsPropStreamEx, // in buffer
sizeof(CSPROPERTY_STREAMEX_S), // in buffer size
NULL, // out buffer
0, // out buffer size
&dBytesTransferred, // number of bytes returned
NULL); // ignored (=NULL)
if (!bResult) {
RETAILMSG(CodecDemo_ERROR_MSG, (TEXT("LoadCamDriver: create preview pin instance failed!\r\n")));
return FALSE;
}
// create capture pin instance
CsPropStreamEx.hMsgQueue = ghCaptureMsgQ;
CsPropStreamEx.CsPin.PinId = CAPTURE; //capture 1:still
CsPropStreamEx.CsPin.Property.Set = CSPROPSETID_StreamEx;
CsPropStreamEx.CsPin.Property.Id = CSPROPERTY_STREAMEX_INIT;
CsPropStreamEx.CsPin.Property.Flags = CSPROPERTY_TYPE_SET;
bResult = DeviceIoControl(ghCapturePinDll, // file handle to the driver
IOCTL_STREAM_INSTANTIATE, // I/O control code
&CsPropStreamEx, // in buffer
sizeof(CSPROPERTY_STREAMEX_S), // in buffer size
NULL, // out buffer
0, // out buffer size
&dBytesTransferred, // number of bytes returned
NULL); // ignored (=NULL)
if (!bResult) {
RETAILMSG(CodecDemo_ERROR_MSG, (TEXT("LoadCamDriver: create capture pin instance failed!\r\n")));
return FALSE;
}
// Add by Tony
// Get Basic support
CSPROPERTY csPropIn;
CSALLOCATOR_FRAMING csAllocatorFramingOut;
csPropIn.Set = CSPROPSETID_Connection;
csPropIn.Id = CSPROPERTY_CONNECTION_ALLOCATORFRAMING;
csPropIn.Flags = CSPROPERTY_TYPE_BASICSUPPORT;
DeviceIoControl(ghCapturePinDll, // file handle to the driver
IOCTL_CS_PROPERTY, // I/O control code
&csPropIn, // in buffer
sizeof(CSPROPERTY), // in buffer size
&csAllocatorFramingOut, // out buffer
sizeof(CSALLOCATOR_FRAMING), // out buffer size
&dBytesTransferred, // number of bytes returned
NULL); // ignored (=NULL)
// Read Capture pin DataRanges
ReadPinDataRanges(0);
// Read Preview pin DataRanges
ReadPinDataRanges(2);
CameraTestCapture();
#if 0
// Get Display Info from Display driver
//...
//set BitCount for preview pin
CSPROPERTY IOCTLInput;
IOCTLInput.Set = CSPROPSETID_Connection;
IOCTLInput.Id = CSPROPERTY_CONNECTION_DATAFORMAT;
IOCTLInput.Flags = CSPROPERTY_TYPE_SET;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -