⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filter.cpp

📁 audio and video stream driver for windows. Tool: winddk
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//

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 + -