Dear all:
I have met a difficult during web camera driver developing. Here is the problem.
Using one web camera hardware supports MJPEG 1 and YUY2, and amcap.exe to test my driver.
If driver just creats YUY2 data range, AmCap works well(video frames are displayed continously).
If driver just creats MJPEG data range, AmCap works well also.
However, if driver creats both YUY2 and MJPEG data range, AmCap can not work
continuously when I set data frame as YUY2. And in order to resume amcap, I need switch other windows or clilk amcmp’s window several times.
Furthermore, graphedit is OK.
The next are data ranges:
const
KS_DATARANGE_VIDEO
FormatYUY2_Capture = {
//
// KSDATARANGE
//
{
sizeof (KS_DATARANGE_VIDEO), // FormatSize
0, // Flags
0,//DMAX_X2 * DMAX_Y2 * 2, // SampleSize
0, // Reserved
STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
0x32595559, 0x0000, 0x0010, 0x80, 0x00,
0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71, //aka. MEDIASUBTYPE_YUY2,
STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
},
TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
TRUE, // BOOL, bTemporalCompression (all I frames?)
0, // Reserved (was StreamDescriptionFlags)
0, // Reserved (was MemoryAllocationFlags
// (KS_VIDEO_ALLOC_*))
//
// _KS_VIDEO_STREAM_CONFIG_CAPS
//
{
STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
KS_AnalogVideo_None,// // AnalogVideoStandard
DMAX_X2, DMAX_Y2, // InputSize, (the inherent size of the incoming signal
// with every digitized pixel unique)
D_X2,D_Y2, // MinCroppingSize, smallest rcSrc cropping rect allowed
DMAX_X2, DMAX_Y2, // MaxCroppingSize, largest rcSrc cropping rect allowed
1, // CropGranularityX, granularity of cropping size
1, // CropGranularityY
1, // CropAlignX, alignment of cropping rect
1, // CropAlignY;
D_X2, D_Y2, // MinOutputSize, smallest bitmap stream can produce
DMAX_X2, DMAX_Y2, // MaxOutputSize, largest bitmap stream can produce
1, // OutputGranularityX, granularity of output bitmap size
1, // OutputGranularityY;
0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp…)
0, // StretchTapsY
0, // ShrinkTapsX
0, // ShrinkTapsY
333333, // MinFrameInterval, 100 nS units
640000000, // MaxFrameInterval, 100 nS units
8 * 2 * 30 * D_X2 * D_Y2, // MinBitsPerSecond;
8 * 2 * 30 * DMAX_X2 * DMAX_Y2, // MaxBitsPerSecond;
},
//
// KS_VIDEOINFOHEADER (default format)
//
{
0, 0, D_X2, D_Y2, // RECT rcSource;
0, 0, D_X2, D_Y2, // RECT rcTarget;
DMAX_X2 * DMAX_Y2 * 2 *8* 30, // DWORD dwBitRate;
0L, // DWORD dwBitErrorRate;
333333, // REFERENCE_TIME AvgTimePerFrame;
sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
DMAX_X2, // LONG biWidth;
DMAX_Y2, // LONG biHeight;
1, // WORD biPlanes;
16, // WORD biBitCount;
FOURCC_YUY2, // DWORD biCompression;
DMAX_X2 * DMAX_Y2 * 2+1, // DWORD biSizeImage;
0, // LONG biXPelsPerMeter;
0, // LONG biYPelsPerMeter;
0, // DWORD biClrUsed;
0 // DWORD biClrImportant;
}
};
// FormatMJPEG_Capture:
//
// This is the data range description of the YUY2 format we support.
const
KS_DATARANGE_VIDEO
FormatMJPEG_Capture = {
//
// KSDATARANGE
//
{
sizeof (KS_DATARANGE_VIDEO), // FormatSize
0, // Flags
0,//DMAX_X2 * DMAX_Y2 * 2, // SampleSize
0, // Reserved
STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
0x47504A4D, 0x0000, 0x0010, 0x80, 0x00,0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71, //aka. MEDIASUBTYPE_YUY2,
STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
},
TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
TRUE, // BOOL, bTemporalCompression (all I frames?)
0, // Reserved (was StreamDescriptionFlags)
0, // Reserved (was MemoryAllocationFlags
// (KS_VIDEO_ALLOC_*))
//
// _KS_VIDEO_STREAM_CONFIG_CAPS
//
{
STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
KS_AnalogVideo_None,// // AnalogVideoStandard
DMAX_X, DMAX_Y, // InputSize, (the inherent size of the incoming signal
// with every digitized pixel unique)
D_X,D_Y, // MinCroppingSize, smallest rcSrc cropping rect allowed
DMAX_X, DMAX_Y, // MaxCroppingSize, largest rcSrc cropping rect allowed
1, // CropGranularityX, granularity of cropping size
1, // CropGranularityY
1, // CropAlignX, alignment of cropping rect
1, // CropAlignY;
D_X, D_Y, // MinOutputSize, smallest bitmap stream can produce
DMAX_X, DMAX_Y, // MaxOutputSize, largest bitmap stream can produce
1, // OutputGranularityX, granularity of output bitmap size
1, // OutputGranularityY;
0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp…)
0, // StretchTapsY
0, // ShrinkTapsX
0, // ShrinkTapsY
333333, // MinFrameInterval, 100 nS units
200000000, // MaxFrameInterval, 100 nS units
8 * 2 * 30 * D_X * D_Y, // MinBitsPerSecond;
8 * 2 * 30 * DMAX_X * DMAX_Y, // MaxBitsPerSecond;
},
//
// KS_VIDEOINFOHEADER (default format)
//
{
0, 0, D_X, D_Y, // RECT rcSource;
0, 0, D_X, D_Y, // RECT rcTarget;
DMAX_X * DMAX_Y * 2 *8* 30, // DWORD dwBitRate;
0L, // DWORD dwBitErrorRate;
333333, // REFERENCE_TIME AvgTimePerFrame;
sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
DMAX_X, // LONG biWidth;
DMAX_Y, // LONG biHeight;
1, // WORD biPlanes;
24, // WORD biBitCount;
FOURCC_MJPEG, // DWORD biCompression;
DMAX_X * DMAX_Y * 2+1, // DWORD biSizeImage;
0, // LONG biXPelsPerMeter;
0, // LONG biYPelsPerMeter;
0, // DWORD biClrUsed;
0 // DWORD biClrImportant;
}
};