I'm developing a multimedia player app with Directshow recently, and I can successfully build the filter graph to capture video stream from a webcam.
I read the Directshow document on MSDN and found that WDM video capture filter exposes IAMAnalogVideoDecoder interface and I can set the analog video format listed in AnalogVideoStandard enum, but this enum does not contain some new HD standard such as 720p, 1080i, 1080p:
typedef /* [v1_enum] */
enum tagAnalogVideoStandard
{
AnalogVideo_None = 0,
AnalogVideo_NTSC_M = 0x1,
AnalogVideo_NTSC_M_J = 0x2,
AnalogVideo_NTSC_433 = 0x4,
AnalogVideo_PAL_B = 0x10,
AnalogVideo_PAL_D = 0x20,
AnalogVideo_PAL_G = 0x40,
AnalogVideo_PAL_H = 0x80,
AnalogVideo_PAL_I = 0x100,
AnalogVideo_PAL_M = 0x200,
AnalogVideo_PAL_N = 0x400,
AnalogVideo_PAL_60 = 0x800,
AnalogVideo_SECAM_B = 0x1000,
AnalogVideo_SECAM_D = 0x2000,
AnalogVideo_SECAM_G = 0x4000,
AnalogVideo_SECAM_H = 0x8000,
AnalogVideo_SECAM_K = 0x10000,
AnalogVideo_SECAM_K1 = 0x20000,
AnalogVideo_SECAM_L = 0x40000,
AnalogVideo_SECAM_L1 = 0x80000,
AnalogVideo_PAL_N_COMBO = 0x100000,
AnalogVideoMask_MCE_NTSC = ( ( ( ( ( ( AnalogVideo_NTSC_M | AnalogVideo_NTSC_M_J ) | AnalogVideo_NTSC_433 ) | AnalogVideo_PAL_M ) | AnalogVideo_PAL_N ) | AnalogVideo_PAL_60 ) | AnalogVideo_PAL_N_COMBO ) ,
AnalogVideoMask_MCE_PAL = ( ( ( ( AnalogVideo_PAL_B | AnalogVideo_PAL_D ) | AnalogVideo_PAL_G ) | AnalogVideo_PAL_H ) | AnalogVideo_PAL_I ) ,
AnalogVideoMask_MCE_SECAM = ( ( ( ( ( ( ( AnalogVideo_SECAM_B | AnalogVideo_SECAM_D ) | AnalogVideo_SECAM_G ) | AnalogVideo_SECAM_H ) | AnalogVideo_SECAM_K ) | AnalogVideo_SECAM_K1 ) | AnalogVideo_SECAM_L ) | AnalogVideo_SECAM_L1 )
} AnalogVideoStandard;
What's more, when a capture card has more than one physical input, a crossbar filter will be added automatically and I can route which input I want using the PhysicalConnectorType enum, but some new input such as HDMI is not included:
typedef
enum tagPhysicalConnectorType
{
PhysConn_Video_Tuner = 1,
PhysConn_Video_Composite = ( PhysConn_Video_Tuner + 1 ) ,
PhysConn_Video_SVideo = ( PhysConn_Video_Composite + 1 ) ,
PhysConn_Video_RGB = ( PhysConn_Video_SVideo + 1 ) ,
PhysConn_Video_YRYBY = ( PhysConn_Video_RGB + 1 ) ,
PhysConn_Video_SerialDigital = ( PhysConn_Video_YRYBY + 1 ) ,
PhysConn_Video_ParallelDigital = ( PhysConn_Video_SerialDigital + 1 ) ,
PhysConn_Video_SCSI = ( PhysConn_Video_ParallelDigital + 1 ) ,
PhysConn_Video_AUX = ( PhysConn_Video_SCSI + 1 ) ,
PhysConn_Video_1394 = ( PhysConn_Video_AUX + 1 ) ,
PhysConn_Video_USB = ( PhysConn_Video_1394 + 1 ) ,
PhysConn_Video_VideoDecoder = ( PhysConn_Video_USB + 1 ) ,
PhysConn_Video_VideoEncoder = ( PhysConn_Video_VideoDecoder + 1 ) ,
PhysConn_Video_SCART = ( PhysConn_Video_VideoEncoder + 1 ) ,
PhysConn_Video_Black = ( PhysConn_Video_SCART + 1 ) ,
PhysConn_Audio_Tuner = 0x1000,
PhysConn_Audio_Line = ( PhysConn_Audio_Tuner + 1 ) ,
PhysConn_Audio_Mic = ( PhysConn_Audio_Line + 1 ) ,
PhysConn_Audio_AESDigital = ( PhysConn_Audio_Mic + 1 ) ,
PhysConn_Audio_SPDIFDigital = ( PhysConn_Audio_AESDigital + 1 ) ,
PhysConn_Audio_SCSI = ( PhysConn_Audio_SPDIFDigital + 1 ) ,
PhysConn_Audio_AUX = ( PhysConn_Audio_SCSI + 1 ) ,
PhysConn_Audio_1394 = ( PhysConn_Audio_AUX + 1 ) ,
PhysConn_Audio_USB = ( PhysConn_Audio_1394 + 1 ) ,
PhysConn_Audio_AudioDecoder = ( PhysConn_Audio_USB + 1 )
} PhysicalConnectorType;
I know that Directshow is an old multimedia framework and the header may be out of time. So is there any way to apply some new standard to Directshow? Is there some other redistribution of Directshow? Or I should just give up using Directshow and use Media Foundation instead?