Condividi tramite


Progettazione dettagliata per IHV e OEMs (Profilo fotocamera V2)

Per comprendere il nuovo schema del profilo della fotocamera V2, iniziamo con una semplice dichiarazione di profilo e la dissezione per comprendere le singole sezioni.

Prendiamo una fotocamera ipotetica che supporta il nuovo profilo ad alta frequenza fotogrammi. Per prima cosa si definiscono alcuni vincoli hardware ipotetici per il dispositivo.

  1. Il pin di anteprima è pin 0. Nella KSFILTER_DESCRIPTOR definita dal driver della fotocamera, quando viene definita la matrice di KSPIN_DESCRIPTOR_EX, la prima KSPIN_DESCRIPTOR_EX è il descrittore del pin di anteprima. Analogamente, il pin 1 è Pin capture e pin 2 è Il pin foto.

  2. A causa della limitazione hardware, il dispositivo in questione non può gestire la scalabilità a velocità di fotogrammi 60 fps o superiore. Pertanto, sia i flussi preview che Capture devono avere la stessa risoluzione.

  3. Analogamente, il dispositivo non può gestire la conversione dello spazio dei colori per 60 fps o superiore, quindi il sottotipo deve essere lo stesso tra Anteprima e Acquisizione.

  4. La fotocamera è in grado di trasmettere video 4K 16x9 a 60 fps. La fotocamera è anche in grado di 3840x2880@60fps (4:3 video a 60 fps).

  5. La fotocamera non è in grado di fornire operazioni fotografiche durante l'esecuzione a 60 fps.

  6. Oltre al profilo ad alta frequenza fotogrammi, dichiariamo un profilo di registrazione video.

  7. Il profilo di registrazione video consente qualsiasi combinazione di tipi di supporti, ma nessun tipo di supporto superiore a 30 fps.

  8. Il profilo di registrazione video supporta anche l'operazione foto singola(ad esempio, non sequenza di foto).

Per la dichiarazione basata su INF, nella sezione DDInstall.Interfaces viene usata la direttiva AddReg per pubblicare le informazioni sul profilo.

Ogni filtro tipo di supporto pin deve essere assegnato a un nome di voce del Registro di sistema. Questo nome deve essere MTF# dove # rappresenta un valore intero. Il valore intero non deve essere sequenziale, semplicemente univoco perché rappresenta un valore denominato nel Registro di sistema operativo.

Dato questi vincoli, è possibile dichiarare il profilo seguente:

[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","BlockedControls",0,"VHDR;VPS;{E0766E84-36A2-4945-906D-092ECBD87445},2;WARM1"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF1",0,"Pin1:((RES==;FRT>=60,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF2",0,"Pin2:(!)"

; Declare the Video Recording Profile here.
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF1",0,"Pin1:((RES==;FRT<=30,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF2",0,"Pin2:((RES==;FRT==;SUT==ALL))"

OEMCameraProfileVersion

Per abilitare il supporto del profilo fotocamera V2, dichiarare la versione del profilo:

La voce OEMCameraProfileVersion definisce la versione del profilo e per questa revisione della specifica, deve essere 2:

[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2

Se la voce del Registro di sistema OEMCameraProfileVersion non è presente e la voce OEMCameraProfile è presente, la pipeline torna allo schema del profilo della fotocamera 1507.

Ciò garantisce la compatibilità con le versioni precedenti con i profili della fotocamera esistenti.

Quando la voce OEMCameraProfileVersion è disponibile, tutte le informazioni del profilo fotocamera esistente 1507 vengono ignorate e verrà elaborato solo il profilo della fotocamera V2.

Nota: se la voce OEMCameraProfileVersion è impostata su 2, ma non vengono trovate dichiarazioni del profilo della fotocamera V2, i profili non verranno pubblicati.

Dopo aver dichiarato, tutti i profili devono essere archiviati nella chiave del Registro di sistema Profili nel nodo Interfaccia dispositivo.

[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"

Ogni profilo deve essere una sottochiave sotto la chiave Profili usando l'ID profilo.

L'ID profilo è una combinazione di tipo di profilo, indice del profilo.

Il tipo di profilo può essere una delle stringhe seguenti o può essere una stringa {GUID}:

  • KSCAMERAPROFILE_VideoRecording

  • KSCAMERAPROFILE_HighQualityPhoto

  • KSCAMERAPROFILE_BalancedVideoAndPhoto

  • KSCAMERAPROFILE_VideoConferencing

  • KSCAMERAPROFILE_PhotoSequence

  • KSCAMERAPROFILE_FaceAuth_Mode

  • KSCAMERAPROFILE_HighFrameRate

  • KSCAMERAPROFILE_HDRWithWCGVideo

  • KSCAMERAPROFILE_HDRWithWCGPhoto

  • KSCAMERAPROFILE_VariablePhotoSequence

  • KSCAMERAPROFILE_VideoHDR8

L'indice del profilo può essere qualsiasi valore compreso tra 0 e 0x7FFFFFFF. I valori di indice con il set di bit di ordine elevato sono riservati per l'uso interno.

La base del profilo fotocamera V2 è suddivisa in due voci principali dello schema:

  • Vincoli di profilo

  • Aggiungere filtri di tipo di supporto

Vincolo profilo

I vincoli di profilo sono una dichiarazione a livello di profilo che influenza l'elaborazione dei filtri dei tipi di supporto pin. Questi sono i sei tag supportati. Possono essere visualizzati in qualsiasi ordine separato da un ";":

Vincolo profilo Descrizione
LRS Blocca risoluzione in tutti i pin. Tutti i pin dichiarati nel profilo devono avere la stessa risoluzione quando attiva.
LFR Frequenza dei fotogrammi di blocco in tutti i pin. Tutti i pin dichiarati nel profilo devono avere la stessa frequenza di fotogrammi quando attiva.
LST Blocca sottotipo in tutti i pin. Tutti i pin dichiarati nel profilo devono avere lo stesso sottotipo quando attivo.
AAR Applicare la dichiarazione del profilo a livello di pin a tutte le proporzioni.

Il filtro basato sulla risoluzione viene eseguito usando il prodotto Larghezza * Altezza della risoluzione e tale prodotto viene usato come valore per il confronto. Tuttavia, se il tag AAR non è impostato, il confronto verrà eseguito solo per le risoluzioni con lo stesso rapporto di aspetto.
DIS Disattivato. Se questo vincolo viene usato per il vincolo profilo, Il filtro tipo di supporto pin viene ignorato e verrà considerato come sintassi del profilo non valida.

Questo tag potrebbe non essere combinato con altri tag di vincolo del profilo.
UAR Consenti una combinazione arbitraria di proporzioni di risoluzione tra i pin.

Per impostazione predefinita, le proporzioni tra i pin devono essere uguali. Questo tag rimuove il vincolo predefinito.

Nota: le applicazioni sono incoraggiate a mantenere lo stesso rapporto di aspetto tra i pin disponibili.

Se il tag UAR non è impostato su una dichiarazione del profilo, tutte le proporzioni tra i pin devono essere uguali. In particolare, l'anteprima di streaming alle 16:9 durante l'esecuzione di una foto o lo streaming dal pin capture alle 4:3 non è supportata. I tentativi a tale scopo causano un errore.

Elaborazione del profilo di esempio precedente:

[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"

Il vincolo profilo indica che per il profilo [KSCAMERAPROFILE_HighFrameRate.0] le risoluzioni e il sottotipo in tutti i pin devono essere uguali. Questo corrisponde al vincolo HW della fotocamera ipotetica (nessuna conversione dello spazio di ridimensionamento/colore durante l'esecuzione a 60 fps o superiore).

Vincoli codificatori

Un set facoltativo di vincoli di profilo può contenere parametri di codificatore consigliati per le applicazioni che scelgono di selezionare un profilo per le operazioni di codifica video. Ad esempio, un IHV/OEM può scegliere di usare HEVC su H264 per determinati sistemi quando un tipo di supporto supera una soglia predeterminata in termini di risoluzione e/o frequenza di fotogrammi.

Inoltre, poiché il codificatore HW presente nel computer può fornire un'operazione più ottimale quando configurata con i parametri di codifica, l'OEM può scegliere di creare un profilo con più "hint" all'applicazione.

Per facilitare questo supporto, è possibile aggiungere i vincoli aggiuntivi seguenti a qualsiasi profilo.

Sottotipo codificato preferito

L'elenco seguente di sottotipi è il sottotipo codificato preferito per il codificatore:

  • eSPSubtype_H264

  • eSPSubtype_HEVC

Questi due vincoli si escludono a vicenda. Può essere dichiarato solo uno. Dichiarando entrambi verrà generato un profilo non valido e verrà rifiutato.

Quando viene dichiarato il vincolo sottotipo codificato preferito, l'archivio attributi MF di FMSensorProfile espone il sottotipo con codifica preferita dichiarato con l'attributo MF_MT_SUBTYPE.

Profilo codificatore preferito

L'elenco del profilo del codificatore preferito seguente corrisponde all'eAVEncH264VProfile .

  • eSPProfile_Simple

  • eSPProfile_Base

  • eSPProfile_Main

  • eSPProfile_High

  • eSPProfile_422

  • eSPProfile_High10

  • eSPProfile_444

  • eSPProfile_Extended

  • eSPProfile_ScalableBase

  • eSPProfile_ScalableHigh

  • eSPProfile_MultiviewHigh

  • eSPProfile_StereoHigh

  • eSPProfile_ConstrainedBase

  • eSPProfile_UCConstrainedHigh

  • eSPProfile_UCScalableConstrainedBase

  • eSPProfile_UCScalableConstrainedHigh

  • eSPProfileH265_Main_420_8

  • eSPProfileH265_Main_420_10

  • eSPProfileH265_Main_420_12

  • eSPProfileH265_Main_422_10

  • eSPProfileH265_Main_422_12

  • eSPProfileH265_Main_444_8

  • eSPProfileH265_Main_444_10

  • eSPProfileH265_Main_444_12

  • eSPProfileH265_Monochrome_12

  • eSPProfileH265_Monochrome_16

  • eSPProfileH265_MainIntra_420_8

  • eSPProfileH265_MainIntra_420_10

  • eSPProfileH265_MainIntra_420_12

  • eSPProfileH265_MainIntra_422_10

  • eSPProfileH265_MainIntra_422_12

  • eSPProfileH265_MainIntra_444_8

  • eSPProfileH265_MainIntra_444_10

  • eSPProfileH265_MainIntra_444_12

  • eSPProfileH265_MainIntra_444_12

  • eSPProfileH265_MainStill_420_8

  • eSPProfileH265_MainStill_444_8

  • eSPProfileH265_MainStill_444_16

La dichiarazione Dei profili del codificatore preferito precedente è a vicenda esclusiva. Può essere dichiarato solo uno. Dichiarando più di uno verrà generato un profilo non valido e verrà rifiutato.

Quando viene dichiarato il vincolo del profilo del codificatore preferito, l'archivio attributi MF di FMSensorProfile espone il profilo del codificatore preferito dichiarato con l'attributo MF_MT_MPEG2_PROFILE.

NOTA: i profili eSPProfileH265 sono validi solo per i sottotipi con codifica HEVC.

Il vincolo conteggio Bframe consigliato consente all'OEM di indicare il numero di fotogrammi B consigliato per il video codificato:

  • eSPBFCount_X

Dove X rappresenta il numero di fotogrammi B: ad esempio, eSPBFCount_0 indica 0 numero di fotogrammi B.

Quando viene dichiarato il vincolo di conteggio BFrame consigliato, l'archivio attributi MF di FMSensorProfile espone l'attributo BFrame Count dichiarato con l'attributo CODECAPI_AVEncMPVDefaultBPictureCount.

Il vincolo frequenza bit consigliata consente all'OEM di specificare sia una velocità media di bit di codifica (quando si usa una modalità di controllo della frequenza di codifica appropriata) sia una velocità massima di bit:

  • eSPBitRate_XXXXX

  • eSPMaxBitRate_XXXXX

Questi due vincoli possono essere specificati in modo indipendente o insieme. XXXXX rappresenta la frequenza di bit in Kbps. Ad esempio, eSPBitRate_5000 rappresenta 5.000.000 bit al secondo.

Il eSPBitRate_XXXXX, quando specificato dall'OEM verrà esposto tramite l'archivio degli attributi MF di FMSensorProfile tramite l'attributo CODECAPI_AVEncCommonMeanBitRate.

Il eSPMaxBitRate_XXXXX quando specificato dall'OEM verrà esposto tramite l'archivio degli attributi MF di FMSensorProfile tramite il CODECAPI_AVEncCommonMaxBitRate.

Vincolo di codificatore di esempio

Nell'esempio seguente INF viene illustrato come un OEM può dichiarare i vincoli del codificatore:

[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","Constraint",0,"eSPSubtype_HEVC;eSPProfile_Main;eSPBFCount_1;eSPBitRate_20000;eSPMaxBitRate_50000"

Il vincolo di codificatore di esempio precedente comporta l'archivio degli attributi MFSensorProfile del KSCAMERAPROFILE_VideoRecording.0 del profilo (vedere la descrizione dell'API seguente) che contiene i vari attributi del codificatore come indicato di seguito:

HRESULT
CheckEncoderParameters(
    _In_ IMFSensorProfile* pProfile
    )
{
    HRESULT hr = S_OK;
    ComPtr<IMFAttributes> spAttributes;
    GUID guidSubtype = GUID_NULL;
    UINT32 eProfile = eAVEncH264VProfile_unknown;
    UINT32 uiBFrameCount = 0;
    UINT32 uiBitRate = 0;
    UINT32 uiMaxBitRate = 0;

    if (nullptr == pProfile)
    {
        return E_INVALIDARG;
    }

    RETURN_IF_FAILED (pProfile->QueryInterface(IID_PPV_ARGS(&spAttributes)));
    if (SUCCEEDED(spAttributes->GetGUID(MF_MT_SUBTYPE, &guidSubtype)))
    {
        if (guidSubtype == MFVideoFormat_HEVC)
        {
            // Use HEVC codec.
        }
        else
        {
            // Use H264 codec.
        }
    }
    if (SUCCEEDED(spAttributes->GetUINT32(MF_MT_MPEG2_PROFILE, &eProfile)))
    {
        // Use the eProfile provided for encoder profile.
    }
    if (SUCCEEDED(spAttributes->GetUINT32(CODECAPI_AVEncMPVDefaultBPictureCount, &uiBFrameCount)))
    {
        // This is the BFrame count...
    }
    if (SUCCEEDED(spAttributes->GetUINT32(CODECAPI_AVEncCommonMeanBitRate, &uiBitRate)))
    {
        // This is the average bit rate...
    }
    if (SUCCEEDED(spAttributes->GetUINT32(CODECAPI_AVEncCommonMaxBitRate, &uiMaxBitRate)))
    {
        // This is the max bit rate...
    }

    return hr;
}

Nell'area dell'API WinRT, questi stessi attributi possono essere ottenuti tramite CameraProfile.Properties (vedere La descrizione dell'API WinRT seguente).

Controlli bloccati

I controlli bloccati consentono agli OEM/IHV di disabilitare in modo selettivo determinati controlli della fotocamera in base al profilo selezionato:

[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","BlockedControls",0,"VHDR;PHSEQ;{E0766E84-36A2-4945-906D-092ECBD87445},2;WARM1"

Nell'esempio precedente, il KSCAMERAPROFILE_HighFrameRate.0 dichiara che Video HDR (VHDR), Photo Sequence (PHSEQ), un controllo personalizzato il cui KSPROPERTY. Set = {E0766E84-36A2-4945-906D-092ECBD87445} e KSPROPERTY.Id = 2 e Warm Start on Pin1 non è supportato.

Quando viene selezionato questo profilo, la pipeline impedirà esplicitamente l'emissione di tali controlli al driver DMFT/Fotocamera. Ciò consente al driver DMFT/Camera di esporre il supporto per tutti i controlli della fotocamera e la pipeline garantisce che l'applicazione che usa il profilo della fotocamera non tenterà di toccare i controlli bloccati.

I controlli bloccati possono essere definiti usando uno dei tag seguenti per i controlli della fotocamera definiti o possono usare un formato {GUID},Id.

Tag Descrizione del controllo
PHSEQ Controllo fotocamera esteso - Sequenza di foto

Nota: la sequenza di foto blocca anche la sequenza di foto variabile.
CALDO# Controllo fotocamera estesa - Controllo Avvio caldo.

# rappresenta l'ID pin in cui disabilitare il controllo Warm Start.
SCENA Controllo fotocamera esteso - Modalità scena.
TORCIA Controllo fotocamera esteso - Modalità torcia.
FLASH Controllo fotocamera esteso - Modalità flash.
ISO Controllo fotocamera esteso - ISO
EVCOMP Controllo fotocamera estesa - Compensazione EV
WBAL Controllo fotocamera esteso - Bilanciamento del bianco
EXPOS Controllo fotocamera esteso - Esposizione
CONCENTRARSI Controllo fotocamera estesa - Stato attivo
Ritorno sugli investimenti Controllo fotocamera esteso - ROI
EXTZOOM Controllo fotocamera esteso - Zoom
ADVISO Controllo fotocamera esteso - ISO Advanced
VIDST Controllo fotocamera estesa - Stabilizzazione video
FRONTET Controllo fotocamera esteso - Rilevamento viso
VHDR Controllo fotocamera esteso - HDR video
OIS Controllo fotocamera esteso - Stabilizzazione ottica delle immagini
ADVPHOTO Controllo fotocamera esteso - Foto avanzata
FACEAUTH Controllo della fotocamera estesa - Autenticazione viso
PROTEGGI Controllo fotocamera estesa - Modalità protetta
VFP Controllo fotocamera esteso - VFR

Oltre ai controlli fotocamera estesi, i profili possono anche bloccare i controlli legacy nei set di controlli PROPSETID_VIDCAP_VIDEOPROCAMP e PROPSETID_VIDCAP_CAMERACONTROL. PROPSETID_VIDCAP_VIDEOPROCAMP i controlli possono essere bloccati tramite :

VIDPROC#

Dove # rappresenta l'ID del controllo:

KSPROPERTY_VIDEOPROCAMP_BRIGHTNESS // 0
KSPROPERTY_VIDEOPROCAMP_CONTRAST // 1
KSPROPERTY_VIDEOPROCAMP_HUE // 2
KSPROPERTY_VIDEOPROCAMP_SATURATION // 3
KSPROPERTY_VIDEOPROCAMP_SHARPNESS // 4
KSPROPERTY_VIDEOPROCAMP_GAMMA // 5
KSPROPERTY_VIDEOPROCAMP_COLORENABLE // 6
KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE // 7
KSPROPERTY_VIDEOPROCAMP_BACKLIGHT_COMPENSATION // 8
KSPROPERTY_VIDEOPROCAMP_GAIN // 9
KSPROPERTY_VIDEOPROCAMP_DIGITAL_MULTIPLIER // 10
KSPROPERTY_VIDEOPROCAMP_DIGITAL_MULTIPLIER_LIMIT // 11
KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE_COMPONENT // 12
KSPROPERTY_VIDEOPROCAMP_POWERLINE_FREQUENCY // 13

Ad esempio: VIDPROC13 blocca il controllo Frequenza della linea di alimentazione.

Analogamente, il PROPSETID_VIDCAP_CAMERACONTROL può essere bloccato con:

CAMCTRL#

Dove # rappresenta l'ID del controllo:

KSPROPERTY_CAMERACONTROL_PAN // 0
KSPROPERTY_CAMERACONTROL_TILT // 1
KSPROPERTY_CAMERACONTROL_ROLL // 2
KSPROPERTY_CAMERACONTROL_ZOOM // 3
KSPROPERTY_CAMERACONTROL_EXPOSURE // 4
KSPROPERTY_CAMERACONTROL_IRIS // 5
KSPROPERTY_CAMERACONTROL_FOCUS // 6
KSPROPERTY_CAMERACONTROL_SCANMODE // 7
KSPROPERTY_CAMERACONTROL_PRIVACY // 8
KSPROPERTY_CAMERACONTROL_PANTILT // 9
KSPROPERTY_CAMERACONTROL_PAN_RELATIVE // 10
KSPROPERTY_CAMERACONTROL_TILT_RELATIVE // 11
KSPROPERTY_CAMERACONTROL_ROLL_RELATIVE // 12
KSPROPERTY_CAMERACONTROL_ZOOM_RELATIVE // 13
KSPROPERTY_CAMERACONTROL_EXPOSURE_RELATIVE // 14
KSPROPERTY_CAMERACONTROL_IRIS_RELATIVE // 15
KSPROPERTY_CAMERACONTROL_FOCUS_RELATIVE // 16
KSPROPERTY_CAMERACONTROL_PANTILT_RELATIVE // 17
KSPROPERTY_CAMERACONTROL_FOCAL_LENGTH // 18
KSPROPERTY_CAMERACONTROL_AUTO_EXPOSURE_PRIORITY // 19

Aggiungi filtro tipo di supporto

Passando al profilo di esempio, viene visualizzato un filtro tipo di supporto pin per il profilo con frequenza elevata dei fotogrammi:

[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF1",0,"Pin1:((RES==;FRT>=60,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF2",0,"Pin2:(!)"

Nella sezione precedente Pin0 (pin di anteprima) del profilo Con frequenza elevata dei fotogrammi è consentita qualsiasi risoluzione/frequenza dei fotogrammi disponibile nel pin. Per il dispositivo ipotetico, il driver non espone alcuna frequenza di fotogrammi superiore a 30 fps per il pin di anteprima.

I numeri di pin quando dichiarati usando un INF corrispondono al numero ordinale di indice in base 0 della struttura KSPIN_DESCRIPTOR_EX definita nella struttura KSFILTER_DESCRIPTOR annunciati dai driver mini-porta AVStream.

Per interpretare il filtro del tipo di supporto pin e il set di filtri corrispondente, è necessario definire lo schema della sintassi:

Questa definizione di stringa usa lo schema Pin Media Type Filter seguente. Dove vengono visualizzati [] la stringa inclusa è facoltativa; in caso contrario, tutte le stringhe dichiarate nella sintassi sono obbligatorie (la sintassi del vincolo non fa distinzione tra maiuscole e minuscole):

PinMediaTypeFilter     : Pin#:[(!)]|(FilterSet0)(FilterSet1)...(FilterSetN)
FilterSet              : [!](ResolutionFilter;FrameRateFilter;FourCCFilter)
Resolution             : RES[==|<=|>=|!=]Width,Height
FrameRate              : FRT[==|<=|>=|!=]Num,Denom
Subtype                : SUT[==|!=]SubtypeValue
SubtypeValue           : <See below>

SubtypeValue può assumere la forma di una singola rappresentazione esadecimale del valore Four CC (ad esempio, 0x3231564E == NV12), un {GUID} nel caso di un tipo di supporto personalizzato (sono necessarie parentesi graffe aperte/vicine e il GUID deve assumere il formato: {55D24460-45B7-450E-829B-91A94FF84180} o un tag ben noto (NV12, YUY2 e così via)).

La rappresentazione {GUID} può essere usata anche per i sottotipi MFVideoFormat_* se un sottotipo noto non ha un tag elencato.

Per l'esempio:

Pin0:((RES==;FRT==;SUT==ALL))

Analizza in:

Resolution  : Ignore all resolution checks (implies all resolutions are allowed)
Frame rate  : Ignore all frame rate checks (implies all frame rates are allowed)
Subtype     : All

Questo è semanticamente: "Consenti tutti i tipi di supporti".

Vedere Filtro frequenza fotogrammi di seguito per la definizione di singoli tag risoluzione, frequenza dei fotogrammi e sottotipo.

Per Pin1 (pin di acquisizione), la dichiarazione Frequenza fotogrammi ha un valore diverso:

[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF1",0,"Pin1:((RES==;FRT>=60,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF2",0,"Pin2:(!)"

Analizza in:

Resolution  : Ignore all resolution checks (implies all resolutions are allowed)
Frame rate  : Equal or greater than 60,1
Subtype     : All

Solo i tipi di supporti con frequenza di fotogrammi di 60 fps o superiore sarebbero consentiti in questo profilo per Pin1.

Mentre per Pin2 (pin foto) non è disponibile:

[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF1",0,"Pin1:((RES==;FRT>=60,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF2",0,"Pin2:(!)"

Come implica la sintassi, un filtro tipo di supporto pin può essere facoltativamente una singola dichiarazione (!), che implica per tale pin, non esistono formati multimediali supportati (i pin senza tipi di supporti supportati verranno nascosti al client).

Passando al profilo di registrazione video, ancora una volta, non abbiamo vincoli sul pin di anteprima poiché la fotocamera ipotetica espone solo l'anteprima di 30 fps con solo i tipi di supporto che sono garantiti per essere simultanei in scenari di registrazione video o frequenza dei fotogrammi elevata.

; Declare the Video Recording Profile here.
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","BlockedControls",0,"PHSEQ"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF1",0,"Pin1:((RES==;FRT<=30,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF2",0,"Pin2:((RES==;FRT==;SUT==ALL))"

Tuttavia, per il pin di acquisizione, è necessario limitarlo a soli 30 fps, perché non è possibile supportare frequenze di fotogrammi più elevate per risoluzioni diverse tra anteprima e acquisizione e operazioni foto.

; Declare the Video Recording Profile here.
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","BlockedControls",0,"PHSEQ"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF1",0,"Pin1:((RES==;FRT<=30,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF2",0,"Pin2:((RES==;FRT==;SUT==ALL))"

Questa operazione viene eseguita usando il tag Frequenza fotogrammi uguale a minore di (FRT<=) e specificando una frequenza di fotogrammi di 30 fps.

Pin1:((RES==;FRT<=30,1;SUT==ALL))

Analizza in:

Resolution    : Ignore all resolution checks (implies all resolutions are allowed)
Frame rate    : Equal or less than 30,1
Subtype       : All

Per il pin foto non dichiariamo alcun supporto per la sequenza di foto dichiarando BlockedControls con PHSEQ come controllo da non consentire.

; Declare the Video Recording Profile here.
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","BlockedControls",0,"PHSEQ"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF1",0,"Pin1:((RES==;FRT<=30,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF2",0,"Pin2:((RES==;FRT==;SUT==ALL))"

Set di filtri

Nella sezione precedente sono stati esaminati diversi set di filtri e sono state illustrate le rappresentazioni di alcune di queste stringhe dello schema. A questo punto, è necessario descrivere la sintassi dello schema del set di filtri per ulteriori informazioni.

Ogni set di filtri è costituito da un set specifico di dichiarazione per Risoluzione, Frequenza fotogrammi e Sottotipo. Questo trio di dichiarazione, nell'ordine specificato, è necessario per un set di filtri valido.

Un filtro tipo di supporto pin può essere costituito da più voci di filtro:

PinMediaTypeFilter : Pin#:[(!)]|(FilterSet0)(FilterSet1)...(FilterSetN)
FilterSet          : [!](ResolutionFilter;FrameRateFilter;SubtypeFilter)

Se un set di filtri non soddisfa questo schema, l'intera dichiarazione del profilo viene rifiutata.

Tutte le stringhe dello schema del profilo non fanno distinzione tra maiuscole e minuscole.

Ogni filtro deve essere separato da un ";" e il trio di filtro risoluzione, filtro frequenza fotogrammi e filtro sottotipo deve essere delimitato da una parentesi aperta/chiusa.

Un altro esempio di set di filtri:

; Allow only 1080p@60fps for any media subtype.
Pin0:((RES==1920,1080;FRT==60,1;SUT==ALL))

; Allow either 1080p@60fps or 1080p@120fps for any subtype but nothing else.
Pin0:((RES==1920,1080;FRT==60,1;SUT==ALL))((RES==1920,1080;FRT==120,1;SUT==ALL))

Come illustrato nel secondo esempio precedente, per più set di filtri su un pin, il confronto viene eseguito con un OR logico dei due set di filtri. Ad esempio, se un tipo di supporto corrisponde a uno dei due set di filtri, è consentito.

Nota: per facilitare la lettura della dichiarazione, il set di filtri può essere descritto in più righe. A tale scopo, devono avere lo stesso Pin# per essere raggruppati:

; Allow only 1080p@60fps or 1080p@120fps
Pin0:((RES==1920,1080;FRT==60,1;SUT==ALL))
Pin0:((RES==1920,1080;FRT==120,1;SUT==ALL))

È semanticamente identico alla dichiarazione precedente. Ogni riga deve tuttavia avere una voce MTF# univoca.

Disabled Pin

Filtro di risoluzione

Come definito nei termini del documento, il filtro di risoluzione definisce come filtrare in base all'attributo MF_MT_FRAME_SIZE di un IMFMediaType.

Sintassi del filtro di risoluzione:

Resolution : RES[==|<=|>=|!=]Width,Height

Attributo filtro di risoluzione

L'attributo filtro di risoluzione usa la stringa RES. Questa stringa non fa distinzione tra maiuscole e minuscole.

Operatori di confronto dei filtri di risoluzione

Di seguito sono riportati gli operatori supportati:

Operatori di confronto Descrizione
== Consente se Resolution è uguale alla risoluzione dichiarata.

Se il set di filtri è un set di filtri di esclusione, questo tag non consente se la risoluzione è uguale alla risoluzione dichiarata.

Nota: se la dichiarazione usa l'operatore == e il valore filter è vuoto (ad esempio RES==;), l'attributo MF_MT_FRAME_SIZE viene ignorato.
<= Consenti se Resolution è uguale o minore della risoluzione dichiarata.

Il confronto di risoluzione viene eseguito in base al numero totale di pixel (prodotto di Width *Height) e in base alle proporzioni.

Se il valore AAR viene dichiarato nel vincolo del profilo, il conteggio totale dei pixel viene applicato a tutte le proporzioni. In caso contrario, corrisponde solo alle proporzioni.

Se il set di filtri è un set di filtri di esclusione, questo tag non consente se la risoluzione è uguale o minore della risoluzione dichiarata.
>= Consenti se Resolution è uguale o maggiore della risoluzione dichiarata.

Il confronto di risoluzione viene eseguito in base al numero totale di pixel (prodotto di Width * Height) e in base alle proporzioni.

Se il valore AAR viene dichiarato nel vincolo del profilo, il conteggio totale dei pixel viene applicato a tutte le proporzioni. In caso contrario, corrisponde solo alle proporzioni.

Se il set di filtri è un set di filtri di esclusione, questo tag non consente se la risoluzione è uguale o maggiore della risoluzione dichiarata.
!= Consente se la risoluzione non è uguale alla risoluzione dichiarata.

Se il set di filtri è un set di filtri di esclusione, questo tag non consente se la risoluzione non è uguale alla risoluzione dichiarata.

Valore del filtro di risoluzione

La larghezza e l'altezza del valore del filtro di risoluzione devono essere in formato decimale separati da una virgola (",") senza spazi vuoti:

; 1080p only.
RES==1920,1080

L'esempio seguente:

; 1080p and any lower resolution.
RES<=1920,1080

Corrisponderà solo alla risoluzione 16:9 uguale o minore di 1080p se il tag AAR non è dichiarato nel vincolo del profilo. Tuttavia, se AAR viene dichiarato, corrisponde a tutta la risoluzione il cui prodotto di Width * Height è uguale o minore di (1920 * 1080 = 2073600).

Ad esempio:

  • Se AAR non è dichiarato, questa voce corrisponde a 720p, ma non a 1280x960.

  • Se AAR è dichiarato, questa voce corrisponde a 720p, 1280x960 e tutte le risoluzioni inferiori.

Se AAR non è dichiarato per garantire corrispondenze di risoluzione selettiva per entrambe le proporzioni di 16:9 e 4:3, è possibile usare più set di filtri:

; This will match any 16:9 resolution of 1080p or lower
; and match any 4:3 resolution of 800x600 or lower.
; Effectively skipping 1280x960.
((RES<=1920,1080;FRT==;SUT==ALL))((RES<=800,600;FRT==;SUT==ALL))

Per trovare la corrispondenza con tutte le risoluzioni, specificare uguale o maggiore di 0,0

; Match all resolutions.
RES>=0,0

Filtro frequenza fotogrammi

Come definito nei termini del documento, filtro frequenza fotogrammi definisce come filtrare in base all'attributo MF_MT_FRAME_RATE di un IMFMediaType.

Sintassi del filtro frequenza fotogrammi:

FrameRate : FRT[==|<=|>=|!=]Num,Denom

Attributo filtro frequenza fotogrammi

L'attributo filtro frequenza fotogrammi usa la stringa FRT. Questa stringa non fa distinzione tra maiuscole e minuscole.

Operatori di confronto filtro frequenza fotogrammi

Questi sono i tag di frequenza dei fotogrammi supportati:

Operatori di confronto Descrizione
== Consenti se la frequenza dei fotogrammi è uguale alla frequenza dei fotogrammi dichiarata.

Se il set di filtri è un set di filtri di esclusione, questo tag non consente se la frequenza dei fotogrammi è uguale alla frequenza dei fotogrammi dichiarata.

Nota: se la dichiarazione usa l'operatore == e filter Value è vuoto (ad esempio, FRT==;), l'attributo MF_MT_FRAME_RATE viene ignorato.
<= Consente se la frequenza dei fotogrammi è uguale o minore della frequenza dei fotogrammi dichiarata.

Se il set di filtri è un set di filtri di esclusione, questo tag non consente se la frequenza dei fotogrammi è uguale o inferiore alla frequenza dei fotogrammi dichiarata.
>= Consente se la frequenza dei fotogrammi è uguale o maggiore della frequenza dei fotogrammi dichiarata.

Se il set di filtri è un set di filtri di esclusione, questo tag non consente se la frequenza dei fotogrammi è uguale o maggiore della frequenza dei fotogrammi dichiarata.
!= Consenti solo se la frequenza dei fotogrammi non è uguale alla frequenza dei fotogrammi dichiarata.

Se il set di filtri è un set di filtri di esclusione, questo tag non consente se la frequenza dei fotogrammi non è uguale alla frequenza dei fotogrammi dichiarata.
; Allow 30fps.
FRT==30,1

; Allow 30fps or lower.
FRT<=30,1

; Allow 60fps or higher.
FRT>=60,1

; Match for all frame rate.
FRT>=0,0

FRT==;, e FRT>=0,0 presentano piccole differenze semantiche.

FRT==; : Ignore all frame rate checks for the Filter Set.

FRT>=0,0 : Match any frame rate.

Differenza tra FRT==; e FRT>=0,0 è il primo ha lo stesso significato sia per il set di filtri di inclusione che per il set di filtri di esclusione. Mentre il significato di FRT>=0,0 cambierà a seconda che si tratti di un set di filtri di inclusione o di un set di filtri di esclusione.

Per la spiegazione del set di filtri di esclusione, vedere Set di filtri .

Filtro sottotipo

Filtro sottotipo definisce come filtrare in base all'attributo MF_MT_SUBTYPE di un IMFMediaType.

Sintassi del filtro sottotipo:

Subtype : SUT[==|!=]SubtypeValue
SubtypeValue : <See Below>

Attributo filtro sottotipo

L'attributo filtro sottotipo usa la stringa SUT. Questa stringa non fa distinzione tra maiuscole e minuscole.

Operatori di confronto dei filtri sottotipi

Sono supportati gli operatori di confronto seguenti:

Operatori di confronto Descrizione
== Consenti se il sottotipo è uguale al sottotipo dichiarato.

Se il set di filtri è un set di filtri di esclusione, questo tag non consente se il sottotipo è uguale al sottotipo dichiarato.

Nota: se la dichiarazione usa l'operatore == e filter Value è vuoto (ad esempio, FRT==;), l'attributo MF_MT_SUBTYPE viene ignorato.
!= Consenti se il sottotipo non è uguale al sottotipo dichiarato.

Se il set di filtri è un set di filtri di esclusione, questo tag non consente se il sottotipo non è uguale al sottotipo dichiarato.

Gli operatori Uguale o Minore di (<=) e Uguale o Maggiore di (>=) non sono supportati per il filtro sottotipo. Se dichiarato, il profilo non è valido e rifiutato dalla pipeline.

Valore filtro sottotipo

Il valore del filtro sottotipo può essere la rappresentazione esadecimale del valore FourCC, una dichiarazione di stringa GUID se viene utilizzato un tipo di supporto personalizzato (è possibile usare anche il GUID del sottotipo MFVideoFormat noto) o un tag sottotipo noto (vedere l'elenco seguente).

; Match any media type which has NV12 subtype
SUT==0x3231564E
; Same as above…
SUT=={3231564E-0000-0010-8000-00AA00389B71}
; Still the same (and the recommended declaration).
SUT==NV12

; Allow any subtype except for NV12
SUT!=0x3231564E
; Another way to say the same thing
SUT!={3231564E-0000-0010-8000-00AA00389B71}
; Yet another (and recommended).
SUT!=NV12

; Valid syntax. Profile allow/disallow should ignore
; the subtype and only check against resolution and
; frame rate.
SUT==;

Il valore di 0/GUID_NULL e ALL ha un significato speciale.

Significa "Tutti e quattro i valori CC".

; Match all subtypes
SUT==0
; Another way to say the same thing
SUT=={00000000-0000-0000-0000-000000000000}
; Yet another (and recommended).
SUT==ALL

SEMANTICAMENTE SUT==; e SUT==0 hanno significati leggermente diversi.

Se usato in un filtro inclusione, hanno lo stesso effetto: Consenti qualsiasi sottotipo. Tuttavia, se usato in un filtro di esclusione, SUT==0 significa escludere tutti i sottotipi. Tuttavia, poiché questo ha lo stesso effetto di contrassegnare l'intero pin come disabilitato (!), non esiste alcun motivo per usare SUT==0 in un filtro di esclusione.

Tag di sottotipo noti

Tag
RGB32
ARGB32
RGB24
L8
L16
D16
AI44
AYUV
YUY2
YVYU
YVU9
UYVY
NV11
NV12
YV12
I420
IYUV
Y210
Y216
Y410
Y416
Y41P
Y41T
Y42T
P210
P216
P010
P016
V210
V216
V410
MP43
MP4S
M4S2
MP4V
WMV1
WMV2
WMV3
WVC1
MSS1
MSS2
MPEG1
DVSL
DVSD
DVHD
DV25
DV50
DVH1
DVC
H264
H265
MJPG
420O
HEVC
HEVS
VP80
VP90
ORAW
H263
VP10
AV01
JPEG

Set di filtri di esclusione

Tutti gli esempi di Set di filtri finora sono voci di filtro inclusive. Sono semanticamente "se un tipo di supporto soddisfa i criteri, consentire l'utilizzo del tipo di supporto dal client".

Mancante nella discussione è l'equivalente di "se un tipo di supporto soddisfa i criteri, impedire che il tipo di supporto venga reso disponibile al client".

Per questo è necessario un set di filtri di esclusione.

Se il set di filtri è preceduto da "!":

; Allow everything except 1080p@60fps of any subtype.
Pin0:(!(RES==1920,1080;FRT==60,1;SUT==))

È un set di filtri di esclusione. Un set di filtri di esclusione, se il tipo di supporto corrisponde, verrà escluso dall'elenco dei tipi di supporti disponibili.

Dichiarando più set di filtri, i controlli vincolo di ogni set di filtri devono essere logicamente OR-ed tra loro:

; Allow everything except 1080p@60fps or 1080p@120fps
Pin0:(!(RES==1920,1080;FRT==60,1;SUT==))(!(RES==1920,1080;FRT==120,1;SUT==))

Esclusione e set di filtri di inclusione

Come illustrato, un set di filtri può essere un set di filtri di inclusione o un set di filtri di esclusione. La combinazione di set di filtri diversi è consentita, ma a seconda del tipo di set di filtri aggiunto, il significato del filtro tipo di supporto pin può cambiare:

  1. Se solo le voci filtro inclusione vengono dichiarate per un filtro tipo di supporto Pin, qualsiasi tipo di supporto che non corrisponde a una delle voci filtro verrà escluso dai tipi di supporti disponibili.

  2. Se solo le voci filtro di esclusione vengono dichiarate per un filtro tipo di supporto Pin, qualsiasi tipo di supporto che non corrisponde a una delle voci filtro verrà incluso dai tipi di supporti disponibili.

  3. Se le voci di filtro inclusione ed esclusione vengono dichiarate per un filtro tipo di supporto Pin, qualsiasi tipo di supporto corrispondente a un set di filtri di inclusione è incluso a meno che non corrisponda anche a un set di filtri di esclusione. Il set di filtri di esclusione sostituisce il set di filtri di inclusione.

Per illustrare questo esempio, si supponga che per Pin0 siano disponibili i tipi di supporti seguenti:

  • 1920x1080@60fps, NV12

  • 1920x1080@30fps, NV12

  • 1280x720@60fps, NV12

  • 1280x720@30fps, NV12

  • 640x360@60fps, NV12

  • 640x360@30fps, NV12

Se si dichiara solo un set di filtri di inclusione:

; Allow all media types 720p and lower resolution whose frame
; rate is 30fps or lower. for example, no 60fps is allowed and no
; 1080p is allowed.
Pin0:((RES<=1280,720;FRT<=30,1;SUT==ALL))

Se si dichiara solo un set di filtri di esclusione:

; Disallow 1080p resolutions or higher or any media types with
; 60fps or higher. Ignore Subtypes.
Pin0:(!(RES>=1920,1080;FRT>=60,1;SUT==))

Se si dichiara sia un set di filtri di inclusione che di esclusione:

; Allow all media types except for 640x360@60fps NV12.
Pin0:((RES<=1920,1080;FRT<=60,1;SUT==ALL))
Pin0:(!(RES==640,360;FRT==60,1;SUT==NV12))

Nota: a causa della regola #2 nell'istruzione di elaborazione del filtro, l'esempio finale di "Consenti tutti i tipi di supporto ad eccezione di 640x360@60fps NV12" può essere per il pin di esempio:

; Allow all media types except for 640x360@60fps NV12.
Pin0:(!(RES==640,360;FRT==60,1;SUT==NV12))

Poiché è presente un solo set di filtri di esclusione, tutti i tipi di supporti sono consentiti ad eccezione dei tipi di supporti corrispondenti al set di filtri di esclusione.

Per illustrare le voci inclusione ed esclusione filtro, sono disponibili alcuni esempi:

; Allow any media type that is 30fps.
Pin0:((RES==;FRT==30,1;SUT==ALL))

; Allow any media type that is NV12.
Pin0:((RES==;FRT==;SUT==0x3132564E))

; Allow any media type, except for 4K@60fps of any subtype.
Pin0:(!(RES==3840,2160;FRT==60,1;SUT==))

; Allow any media type less than equal to 4K resolution,
; except for YUY2 subtypes.
Pin0:((RES<=3840,2160;FRT>=0,0;SUT==ALL))
Pin0:(!(RES==;FRT==;SUT==YUY2))

; Allow any media type equal or less than 4K
; and equal or less than 60fps
Pin0:((RES<=3840,2160;FRT<=60,1;SUT==ALL))

; Allow any NV12 and YUY2 media types
Pin0:((RES==;FRT>=0,0;SUT==NV12))((RES==;FRT>=0,0;SUT==YUY2))

; Allow any except for MJPG and H264
Pin0:((RES==;FRT>=0,0;SUT!=MJPG))((RES==;FRT>=0,0;SUT!=H264))

; Allow any but exclude only 4K@60fps NV12 & 3840x2880@60fps NV12
Pin0:(!(RES==3840,2160;FRT==60,1;SUT==NV12))(!(RES==3840,2880;FRT==60,1;SUT==NV12))

Specifica per sviluppatori del profilo della fotocamera V2