Here it is my code to support property in AVStream. Note that my callbacks KStrGetPropertyHandler and KStrGetPropertyHandler are not getting called.
NTSTATUS
KStrGetPropertyHandler(
In PIRP Irp,
In PKSIDENTIFIER Request,
Inout PVOID Data
)
{
return STATUS_SUCCESS;
}
NTSTATUS
KStrSetPropertyHandler(
In PIRP Irp,
In PKSIDENTIFIER Request,
Inout PVOID Data
)
{
PKSPROPERTY_VIDEOCONTROL_CAPS_S pS = (PKSPROPERTY_VIDEOCONTROL_CAPS_S) Request; // pointer to the input data
PKSPROPERTY_VIDEOCONTROL_CAPS_S pOutputData = (PKSPROPERTY_VIDEOCONTROL_CAPS_S) Data;
RtlZeroMemory(pOutputData, sizeof(KSPROPERTY_VIDEOCONTROL_CAPS_S));
pOutputData->VideoControlCaps =
KS_VideoControlFlag_ExternalTriggerEnable
| KS_VideoControlFlag_Trigger
;
return STATUS_SUCCESS;
}
/**************************************************************************
DESCRIPTOR AND DISPATCH LAYOUT
**************************************************************************/
GUID g_PINNAME_VIDEO_CAPTURE = {STATIC_PINNAME_VIDEO_CAPTURE};
GUID g_PINNAME_VIDEO_PREVIEW = {STATIC_PINNAME_VIDEO_PREVIEW};
GUID g_PINNAME_VIDEO_STILL = {STATIC_PINNAME_VIDEO_STILL};
//
// CaptureFilterCategories:
//
// The list of category GUIDs for the capture filter.
//
const
GUID
CaptureFilterCategories [CAPTURE_FILTER_CATEGORIES_COUNT] = {
STATICGUIDOF (KSCATEGORY_VIDEO),
STATICGUIDOF (KSCATEGORY_CAPTURE)
};
// ------------------------------------------------------------------------
// Array of all of the property sets supported by video streams
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
// Property sets for all video capture streams
// ------------------------------------------------------------------------
DEFINE_KSPROPERTY_TABLE(FrameRateProperties)
{
DEFINE_KSPROPERTY_ITEM
(
KSPROPERTY_VIDEOCONTROL_CAPS,
KStrGetPropertyHandler, // GetSupported or Handler
sizeof(KSPROPERTY_VIDEOCONTROL_CAPS_S), // MinProperty
sizeof(KSPROPERTY_VIDEOCONTROL_CAPS_S), // MinData
KStrSetPropertyHandler, // SetSupported or Handler
NULL, // Values
0, // RelationsCount
NULL, // Relations
NULL, // SupportHandler
0 // SerializedSize
),
DEFINE_KSPROPERTY_ITEM
(
KSPROPERTY_VIDEOCONTROL_MODE,
KStrGetPropertyHandler, // GetSupported or Handler
sizeof(KSPROPERTY_VIDEOCONTROL_MODE_S), // MinProperty
sizeof(KSPROPERTY_VIDEOCONTROL_MODE_S), // MinData
KStrSetPropertyHandler, // GetSupported or Handler
NULL, // Values
0, // RelationsCount
NULL, // Relations
NULL, // SupportHandler
0 // SerializedSize
),
};
DEFINE_KSPROPERTY_SET_TABLE(VideoStreamProperties)
{
DEFINE_KSPROPERTY_SET
(
&PROPSETID_VIDCAP_VIDEOCONTROL, // Set
SIZEOF_ARRAY(FrameRateProperties), // PropertiesCount
FrameRateProperties, // PropertyItem
0, // FastIoCount
NULL // FastIoTable
),
};
//-
//----------------------------------------------
DEFINE_KSAUTOMATION_TABLE (StillPinAutomationTable)
{
DEFINE_KSAUTOMATION_PROPERTIES (VideoStreamProperties),
DEFINE_KSAUTOMATION_METHODS_NULL,
DEFINE_KSAUTOMATION_EVENTS_NULL
};
//---------------------------------------------
//
// CaptureFilterPinDescriptors:
//
// The list of pin descriptors on the capture filter.
//
const
KSPIN_DESCRIPTOR_EX
CaptureFilterPinDescriptors [CAPTURE_FILTER_PIN_COUNT] = {
//
// Video Capture Pin
//
{
&CapturePinDispatch,
NULL,
{
0, // Interfaces (NULL, 0 == default)
NULL,
0, // Mediums (NULL, 0 == default)
NULL,
SIZEOF_ARRAY(CapturePinDataRanges),// Range Count
CapturePinDataRanges, // Ranges
KSPIN_DATAFLOW_OUT, // Dataflow
KSPIN_COMMUNICATION_BOTH, // Communication
&PIN_CATEGORY_CAPTURE, // Category
&g_PINNAME_VIDEO_CAPTURE, // Name
0 // Reserved
},
/*KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING|*/
KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY,
1, // Instances Possible
0, // Instances Necessary
&CapturePinAllocatorFraming, // Allocator Framing
reinterpret_cast
(CCapturePin::IntersectHandler)
},
//
// still Capture Pin
//
{
&StillPinDispatch,
&StillPinAutomationTable,
{
0, // Interfaces (NULL, 0 == default)
NULL,
0, // Mediums (NULL, 0 == default)
NULL,
SIZEOF_ARRAY(StillPinDataRanges),// Range Count
StillPinDataRanges, // Ranges
KSPIN_DATAFLOW_OUT, // Dataflow
KSPIN_COMMUNICATION_BOTH, // Communication
&PIN_CATEGORY_STILL, // Category
&g_PINNAME_VIDEO_STILL, // Name
0 // Reserved
},
//KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING|
KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY,
1, // Instances Possible
0, // Instances Necessary
&StillPinAllocatorFraming, // Allocator Framing
reinterpret_cast
(CStillPin::IntersectHandler)
}
};
const
KSFILTER_DISPATCH
CaptureFilterDispatch = {
CCaptureFilter::DispatchCreate, // Filter Create
NULL, // Filter Close
NULL, // Filter Process
NULL // Filter Reset
};
//
// CaptureFilterDescription:
//
// The descriptor for the capture filter. We don’t specify any topology
// since there’s only one pin on the filter. Realistically, there would
// be some topological relationships here because there would be input
// pins from crossbars and the like.
//
const
KSFILTER_DESCRIPTOR
CaptureFilterDescriptor = {
&CaptureFilterDispatch, // Dispatch Table
NULL, // Automation Table
KSFILTER_DESCRIPTOR_VERSION, // Version
0, // Flags
&KSNAME_Filter, // Reference GUID
DEFINE_KSFILTER_PIN_DESCRIPTORS (CaptureFilterPinDescriptors),
DEFINE_KSFILTER_CATEGORIES (CaptureFilterCategories),
0,
sizeof (KSNODE_DESCRIPTOR),
NULL,
0,
NULL,
NULL // Component ID
};