Kodlayıcı kod örnekleri

Aşağıdaki kod örnekleri AVStream Simulated Hardware Sample Driver 'ı (AVSHwS) temel alır. Bunlar aşağıdakileri gösterir:

  • Kodlayıcının desteklenen bit hızlarını belirtme

  • Kodlayıcı tarafından desteklenen bit hızı kodlama modlarını belirtme

  • Kodlayıcı cihazının Cihaz Parametreleri\Capabilities kayıt defteri anahtarı altında çalışma zamanında meta veri değerlerini belirtme

Desteklenen Bit Hızlarını Uygulama

Aşağıdaki kod parçacıkları, ENCAPIPARAM_BITRATE özelliği için desteğin nasıl uygulanduğunu gösterir. 400 bps alt sınır ve 4.000.000 bps üst sınır ile saniyede 400 bit (bps) adımlama ayrıntı düzeyini belirtmek için bir KSPROPERTY_STEPPING_LONG yapısı kullanın.

const KSPROPERTY_STEPPING_LONG BitRateRanges [] = {
    {
        400,
        0,
        400,
        4000000
    }
};

GraphEdit gibi bir araçta filtreye sağ tıklayarak kodlayıcı filtresinin özellik sayfasına erişirseniz, bu değerlerin kullanıldığı Bit Hızı kaydırıcı çubuğunu görürsünüz.

Ardından, bir örneği oluşturulduğunda kodlayıcı filtresinin varsayılan kodlama bit hızını belirtin. Kullanılan veri türünün, ENCAPIPARAM_BITRATE özelliği için gereken özellik değeri türüne karşılık gelen bir ULONG olduğunu unutmayın. Bu değer, kodlayıcının özellik sayfasında görüntülenen varsayılan kodlama "Bit Hızı"dır:

const ULONG BitRateValues [] = {
    1000000
};

yasal aralıkların listesini ve ENCAPIPARAM_BITRATE özelliği için varsayılan değeri belirtin:

 const KSPROPERTY_MEMBERSLIST BitRateMembersList [] = {
    {
        {
            KSPROPERTY_MEMBER_STEPPEDRANGES,
            sizeof (BitRateRanges),
            SIZEOF_ARRAY (BitRateRanges),
            0
        },
        BitRateRanges
    },
    {
        {
            KSPROPERTY_MEMBER_VALUES,
            sizeof (BitRateValues),
            SIZEOF_ARRAY (BitRateValues),
            KSPROPERTY_MEMBER_FLAG_DEFAULT
        },
        BitRateValues
    }
};
 const KSPROPERTY_VALUES BitRateValuesSet = {
    {
        STATICGUIDOF (KSPROPTYPESETID_General),
        VT_UI4,
        0
    },
    SIZEOF_ARRAY (BitRateMembersList),
    BitRateMembersList
};

ENCAPIPARAM_BITRATE özellik kümesi için tanımlanan tek özelliği belirtin:

DEFINE_KSPROPERTY_TABLE(ENCAPI_BitRate) {
    DEFINE_KSPROPERTY_ITEM (
        0,
        GetBitRateHandler, //Get-property handler supported
        sizeof (KSPROPERTY),
        sizeof (ULONG),
        SetBitRateHandler, //Set-property handler supported
        &BitRateValuesSet,
        0,
        NULL,
        NULL,
        sizeof (ULONG)
        )
};

Uyarı

Get-property işleyicisi kodlama bit hızını döndürür ve Set-property işleyicisi, gelen geçirilen değeri kullanmadan önce geçerli olup olmadığını test etmelidir.

Desteklenen Kodlama Bit Hızı Modlarını Uygulama

Aşağıdaki kod parçacıkları , ENCAPIPARAM_BITRATE_MODE özelliği için desteğin nasıl uygulanduğunu gösterir.

Kodlayıcı tarafından desteklenen kodlama modlarını tanımlayın:

 const VIDEOENCODER_BITRATE_MODE BitRateModeValues [] = {
    ConstantBitRate,
    VariableBitRateAverage
};

Varsayılan kodlama bit hızı modunu ortalama değişken bit hızı olarak belirtin:

const VIDEOENCODER_BITRATE_MODE BitRateModeDefaultValues [] = {
    VariableBitRateAverage
};

ENCAPIPARAM_BITRATE_MODE özelliği için yasal aralıkların listesini ve varsayılan değeri belirtin:

const KSPROPERTY_MEMBERSLIST BitRateModeMembersList [] = {
    {
        {
            KSPROPERTY_MEMBER_VALUES,
            sizeof (BitRateModeValues),
            SIZEOF_ARRAY (BitRateModeValues),
            0
        },
        BitRateModeValues
    },
    {
        {
            KSPROPERTY_MEMBER_VALUES,
            sizeof (BitRateModeDefaultValues),
            SIZEOF_ARRAY (BitRateModeDefaultValues),
            KSPROPERTY_MEMBER_FLAG_DEFAULT
        },
        BitRateModeDefaultValues
    }
};

const KSPROPERTY_VALUES BitRateModeValuesSet = {
    {
        STATICGUIDOF (KSPROPTYPESETID_General),
        VT_I4,
        0
    },
    SIZEOF_ARRAY (BitRateModeMembersList),
    BitRateModeMembersList
};

ENCAPIPARAM_BITRATE_MODE özellik kümesi için tanımlanan tek özelliği belirtin:

DEFINE_KSPROPERTY_TABLE(ENCAPI_BitRateMode) {
    DEFINE_KSPROPERTY_ITEM (
        0,
        GetBitRateModeHandler, //Get-property handler supported
        sizeof (KSPROPERTY),
        sizeof (VIDEOENCODER_BITRATE_MODE),
        SetBitRateModeHandler, //Set-property handler supported
        &BitRateModeValuesSet,
        0,
        NULL,
        NULL,
        sizeof (VIDEOENCODER_BITRATE_MODE)
        )
};

Uyarı

Get-property işleyicisi kodlama bit hızı modunu döndürmelidir ve Set-property işleyicisi, gelen geçirilen değeri kullanmadan önce geçerli olup olmadığını test etmelidir.

Özellik kümeleri daha sonra KSFILTER_DESCRIPTOR yapısının otomasyon tablosu olarak belirtilir.

DEFINE_KSPROPERTY_SET_TABLE(PropertyTable) {
    DEFINE_KSPROPERTY_SET(
        &ENCAPIPARAM_BITRATE_MODE,
        SIZEOF_ARRAY (ENCAPI_BitRateMode),
        ENCAPI_BitRateMode,
        0,
        NULL
        ),
    DEFINE_KSPROPERTY_SET(
        &ENCAPIPARAM_BITRATE,
        SIZEOF_ARRAY (ENCAPI_BitRate),
        ENCAPI_BitRate,
        0,
        NULL
        )
};

DEFINE_KSAUTOMATION_TABLE(FilterTestTable) {
    DEFINE_KSAUTOMATION_PROPERTIES(PropertyTable),
    DEFINE_KSAUTOMATION_METHODS_NULL,
    DEFINE_KSAUTOMATION_EVENTS_NULL
};

const
KSFILTER_DESCRIPTOR
FilterDescriptor = {
    ...,
    &FilterTestTable, // Automation Table
    ...,
    ...
};

Kayıt Defteri'nde Kodlayıcının Özelliklerini Belirtme

Aşağıdaki kod örneği, Cihaz Parametreleri kayıt defteri anahtarı altında Bir Capabilities kayıt defteri anahtarının nasıl oluşturulacağını ve Yetenek anahtarı altında alt anahtarların ve değerlerin nasıl oluşturulup belirtileceğini gösterir. Sürücü başlatıldığında bu kodu yürütür.

Uyarı

Aşağıdaki kod, fiziksel cihaz başına tek bir donanım kodlayıcının varlığını varsayar. Donanımınız birden fazla kodlayıcı içeriyorsa IoGetDeviceInterfaces işlevi çağrısında döndürülen listede yinelemeli ve her kodlayıcı için özellikleri kaydetmelisiniz.

/**************************************************************************
CreateDwordValueInCapabilityRegistry()

IN Pdo: PhysicalDeviceObject
IN categoryGUID: Category GUID eg KSCATEGORY_CAPTURE

1. Get Symbolic name for interface
2. Open registry key for storing information about a
   particular device interface instance
3. Create Capabilities key under "Device Parameters" key
4. Create a DWORD value "TestCapValueDWORD" under Capabilities

Must be running at IRQL = PASSIVE_LEVEL in the context of a system thread
**************************************************************************/
NTSTATUS CreateDwordValueInCapabilityRegistry(IN PDEVICE_OBJECT pdo, IN GUID categoryGUID)

{

    // 1. Get Symbolic name for interface
    // pSymbolicNameList can contain multiple strings if pdo is NULL.
    // Driver should parse this list of string to get
    // the one corresponding to current device interface instance.
    PWSTR  pSymbolicNameList = NULL;

    NTSTATUS ntStatus = IoGetDeviceInterfaces(
        &categoryGUID,
        pdo,
        DEVICE_INTERFACE_INCLUDE_NONACTIVE,
        &pSymbolicNameList);
    if (NT_SUCCESS(ntStatus) && (NULL != pSymbolicNameList))
    {
        HANDLE hDeviceParametersKey = NULL;
        UNICODE_STRING symbolicName;

        // 2. Open registry key for storing information about a
        // particular device interface instance
        RtlInitUnicodeString(&symbolicName, pSymbolicNameList);
        ntStatus = IoOpenDeviceInterfaceRegistryKey(
            &symbolicName,
            KEY_READ|KEY_WRITE,
            &hDeviceParametersKey);
        if (NT_SUCCESS(ntStatus))
        {
            OBJECT_ATTRIBUTES objAttribSubKey;
            UNICODE_STRING subKey;

            // 3. Create Capabilities key under "Device Parameters" key
            RtlInitUnicodeString(&subKey,L"Capabilities");
            InitializeObjectAttributes(&objAttribSubKey,
                &subKey,
                OBJ_KERNEL_HANDLE,
                hDeviceParametersKey,
                NULL);

            HANDLE hCapabilityKeyHandle = NULL;

            ntStatus = ZwCreateKey(&hCapabilityKeyHandle,
                    KEY_READ|KEY_WRITE|KEY_SET_VALUE,
                    &objAttribSubKey,
                    0,
                    NULL,
                    REG_OPTION_NON_VOLATILE,
                    NULL);
            if (NT_SUCCESS(ntStatus))
            {
                OBJECT_ATTRIBUTES objAttribDwordKeyVal;
                UNICODE_STRING subValDword;

                // 4. Create a DWORD value "TestCapValueDWORD" under Capabilities
                RtlInitUnicodeString(&subValDword,L"TestCapValueDWORD");

                ULONG data = 0xaaaaaaaa;

                ntStatus = ZwSetValueKey(hCapabilityKeyHandle,&subValDword,0,REG_DWORD,&data,sizeof(ULONG));
                ZwClose(hCapabilityKeyHandle);
            }
        }
        ZwClose(hDeviceParametersKey);
        ExFreePool(pSymbolicNameList);
    }

    return ntStatus;
}