📄 filter.cpp
字号:
//
const
KSPIN_INTERFACE
PinInterfaces[] =
{
{
STATICGUIDOF(KSINTERFACESETID_Standard),
KSINTERFACE_STANDARD_STREAMING,
0
}
};
const
KSPIN_MEDIUM
PinMediums[] =
{
{
STATICGUIDOF(KSMEDIUMSETID_Standard),
KSMEDIUM_TYPE_ANYINSTANCE,
0
}
};
//
// Audio Data Formats
//
const KSDATARANGE_AUDIO PinWaveIoRange = {
{
sizeof(KSDATARANGE_AUDIO),
0,
0,
0,
STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
},
1, // maximum range
8, // min bits per sample
8, // max bits per sample
8000, // min frequency
8000 // max frequency
};
//
// Video Data Formats
//
#define D_X 320
#define D_Y 240
const KS_DATARANGE_VIDEO FormatRGB24Bpp_Capture =
{
// KSDATARANGE
{
sizeof (KS_DATARANGE_VIDEO), // FormatSize
0, // Flags
D_X * D_Y * 3, // SampleSize
0, // Reserved
STATICGUIDOF( KSDATAFORMAT_TYPE_VIDEO ), // aka. MEDIATYPE_Video
0xe436eb7d, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70, //MEDIASUBTYPE_RGB24,
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_NTSC_M |
KS_AnalogVideo_PAL_B, // AnalogVideoStandard
720,480, // InputSize, (the inherent size of the incoming signal
// with every digitized pixel unique)
160,120, // MinCroppingSize, smallest rcSrc cropping rect allowed
720,480, // MaxCroppingSize, largest rcSrc cropping rect allowed
8, // CropGranularityX, granularity of cropping size
1, // CropGranularityY
8, // CropAlignX, alignment of cropping rect
1, // CropAlignY;
160, 120, // MinOutputSize, smallest bitmap stream can produce
720, 480, // MaxOutputSize, largest bitmap stream can produce
8, // OutputGranularityX, granularity of output bitmap size
1, // OutputGranularityY;
0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
0, // StretchTapsY
0, // ShrinkTapsX
0, // ShrinkTapsY
333667, // MinFrameInterval, 100 nS units
640000000, // MaxFrameInterval, 100 nS units
8 * 3 * 30 * 160 * 120, // MinBitsPerSecond;
8 * 3 * 30 * 720 * 480 // MaxBitsPerSecond;
},
// KS_VIDEOINFOHEADER (default format)
{
0,0,0,0, // RECT rcSource;
0,0,0,0, // RECT rcTarget;
D_X * D_Y * 3 * 30, // DWORD dwBitRate;
0L, // DWORD dwBitErrorRate;
333667, // REFERENCE_TIME AvgTimePerFrame;
sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
D_X, // LONG biWidth;
D_Y, // LONG biHeight;
1, // WORD biPlanes;
24, // WORD biBitCount;
KS_BI_RGB, // DWORD biCompression;
D_X * D_Y * 3, // DWORD biSizeImage;
0, // LONG biXPelsPerMeter;
0, // LONG biYPelsPerMeter;
0, // DWORD biClrUsed;
0 // DWORD biClrImportant;
}
};
#undef D_X
#undef D_Y
#define D_X 320
#define D_Y 240
const KS_DATARANGE_VIDEO FormatUYU2_Capture =
{
// KSDATARANGE
{
sizeof (KS_DATARANGE_VIDEO), // FormatSize
0, // Flags
D_X * D_Y * 2, // SampleSize
0, // Reserved
STATICGUIDOF( KSDATAFORMAT_TYPE_VIDEO ), // aka. MEDIATYPE_Video
0x59565955, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71, //MEDIASUBTYPE_UYVY,
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_NTSC_M |
KS_AnalogVideo_PAL_B, // AnalogVideoStandard
720,480, // InputSize, (the inherent size of the incoming signal
// with every digitized pixel unique)
160,120, // MinCroppingSize, smallest rcSrc cropping rect allowed
720,480, // MaxCroppingSize, largest rcSrc cropping rect allowed
8, // CropGranularityX, granularity of cropping size
1, // CropGranularityY
8, // CropAlignX, alignment of cropping rect
1, // CropAlignY;
160, 120, // MinOutputSize, smallest bitmap stream can produce
720, 480, // MaxOutputSize, largest bitmap stream can produce
8, // OutputGranularityX, granularity of output bitmap size
1, // OutputGranularityY;
0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
0, // StretchTapsY
0, // ShrinkTapsX
0, // ShrinkTapsY
333667, // MinFrameInterval, 100 nS units
640000000, // MaxFrameInterval, 100 nS units
8 * 2 * 30 * 160 * 120, // MinBitsPerSecond;
8 * 2 * 30 * 720 * 480 // MaxBitsPerSecond;
},
// KS_VIDEOINFOHEADER (default format)
{
0,0,0,0, // RECT rcSource;
0,0,0,0, // RECT rcTarget;
D_X * D_Y * 2 * 30, // DWORD dwBitRate;
0L, // DWORD dwBitErrorRate;
333667, // REFERENCE_TIME AvgTimePerFrame;
sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
D_X, // LONG biWidth;
D_Y, // LONG biHeight;
1, // WORD biPlanes;
16, // WORD biBitCount;
FOURCC_YUV422, // DWORD biCompression;
D_X * D_Y * 2, // DWORD biSizeImage;
0, // LONG biXPelsPerMeter;
0, // LONG biYPelsPerMeter;
0, // DWORD biClrUsed;
0 // DWORD biClrImportant;
}
};
#undef D_X
#undef D_Y
const PKSDATARANGE PinVideoFormatRanges[] =
{
(PKSDATARANGE) &FormatRGB24Bpp_Capture,
(PKSDATARANGE) &FormatUYU2_Capture
};
const PKSDATARANGE PinAudioFormatRanges[] =
{
(PKSDATARANGE) &PinWaveIoRange
};
DECLARE_SIMPLE_FRAMING_EX(
AllocatorFraming,
STATICGUIDOF(KSMEMORY_TYPE_KERNEL_PAGED),
KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY |
KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER |
KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY,
2,
0,
2 * PAGE_SIZE,
2 * PAGE_SIZE);
const
KSPIN_DISPATCH
VideoPinDispatch =
{
VideoPinCreate,
NULL,// Close
NULL,// Process
NULL,// Reset
NULL,// SetDataFormat
PinSetDeviceState,
NULL,// Connect
NULL,// Disconnect
NULL// Allocator
};
const
KSPIN_DISPATCH
AudioPinDispatch =
{
AudioPinCreate,
NULL,// Close
NULL,// Process
NULL,// Reset
NULL,// SetDataFormat
PinSetDeviceState,
NULL,// Connect
NULL,// Disconnect
NULL// Allocator
};
DEFINE_KSAUTOMATION_TABLE(PinAutomation) {
DEFINE_KSAUTOMATION_PROPERTIES_NULL,
DEFINE_KSAUTOMATION_METHODS_NULL,
DEFINE_KSAUTOMATION_EVENTS_NULL
};
GUID g_PINNAME_VIDEO_CAPTURE ={STATIC_PINNAME_VIDEO_CAPTURE};
GUID g_PINNAME_KSCATEGORY_AUDIO ={STATIC_KSCATEGORY_AUDIO};
const
KSPIN_DESCRIPTOR_EX
KsPinDescriptors[] =
{
{ &VideoPinDispatch,
&PinAutomation,
{
SIZEOF_ARRAY(PinInterfaces),
PinInterfaces,
SIZEOF_ARRAY(PinMediums),
PinMediums,
SIZEOF_ARRAY(PinVideoFormatRanges),
PinVideoFormatRanges,
KSPIN_DATAFLOW_OUT,
KSPIN_COMMUNICATION_BOTH,
&g_PINNAME_VIDEO_CAPTURE,//Name
&KSCATEGORY_VIDEO,//Category
0
},
KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING |
KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING,//Flags
1, //InstancesPossible
1, //InstancesNecessary
&AllocatorFraming,
VideoIntersectHandler
},
{ &AudioPinDispatch,
NULL,
{
SIZEOF_ARRAY(PinInterfaces),
PinInterfaces,
SIZEOF_ARRAY(PinMediums),
PinMediums,
SIZEOF_ARRAY(PinAudioFormatRanges),
PinAudioFormatRanges,
KSPIN_DATAFLOW_OUT,
KSPIN_COMMUNICATION_BOTH,
&g_PINNAME_KSCATEGORY_AUDIO,//Name
&KSCATEGORY_AUDIO,//Category
0
},
KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING |
KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING,//Flags
0, // uncomment when audio is required. 1, //InstancesPossible
0, //InstancesNecessary
&AllocatorFraming,
AudioIntersectHandler
},
{ NULL,
NULL,
{
SIZEOF_ARRAY(PinInterfaces),
PinInterfaces,
SIZEOF_ARRAY(PinMediums),
PinMediums,
0,
NULL,
KSPIN_DATAFLOW_IN,
KSPIN_COMMUNICATION_NONE,
NULL,//Name
NULL,//Category
0
},
0,//Flags
0, //InstancesPossible
0, //InstancesNecessary
NULL,
NULL
},
{ NULL,
NULL,
{
SIZEOF_ARRAY(PinInterfaces),
PinInterfaces,
SIZEOF_ARRAY(PinMediums),
PinMediums,
0,
NULL,
KSPIN_DATAFLOW_IN,
KSPIN_COMMUNICATION_NONE,
NULL,//Name
NULL,//Category
0
},
0,//Flags
0, //InstancesPossible
0, //InstancesNecessary
NULL,
NULL
}
};
const
GUID
KsCategories[] =
{
STATICGUIDOF( KSCATEGORY_AUDIO ),
STATICGUIDOF( KSCATEGORY_VIDEO ),
STATICGUIDOF( KSCATEGORY_CAPTURE )
};
const
GUID
VolumeNodeType = {STATICGUIDOF(KSNODETYPE_VOLUME)};
const
KSNODE_DESCRIPTOR
KsNodeDescriptors[] =
{
DEFINE_NODE_DESCRIPTOR( NULL, &VolumeNodeType, NULL )
//DEFINE_NODE_DESCRIPTOR( NULL, NULL, NULL ),
};
// -------------
// 2-| |- 0 Video
// | |
// 3-| 0 Node0 1 |- 1 Audio
// -------------
const
KSTOPOLOGY_CONNECTION
KsConnections[] =
{
{ KSFILTER_NODE, 3, 0, 0 },
{ 0, 1, KSFILTER_NODE, 1 },
//{ KSFILTER_NODE, 2, 1, 0 },
//{ 0, 1, KSFILTER_NODE, 0 },
};
const
KSFILTER_DISPATCH
FilterDispatch =
{
CCapFilter::FilterCreate,
CCapFilter::FilterClose,
CCapFilter::Process,
NULL // Reset
};
DEFINE_KSFILTER_DESCRIPTOR(FilterDescriptor)
{
&FilterDispatch,
NULL,//AutomationTable;
KSFILTER_DESCRIPTOR_VERSION,
KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING,//Flags
&KSNAME_Filter,
DEFINE_KSFILTER_PIN_DESCRIPTORS(KsPinDescriptors),
DEFINE_KSFILTER_CATEGORIES(KsCategories),
DEFINE_KSFILTER_NODE_DESCRIPTORS(KsNodeDescriptors),
DEFINE_KSFILTER_CONNECTIONS(KsConnections),
NULL // ComponentId
};
DEFINE_KSFILTER_DESCRIPTOR_TABLE(FilterDescriptors)
{
&FilterDescriptor
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -