Partager via


Conception détaillée pour les IVS et les OEM (Profil de caméra V2)

Pour vous aider à comprendre le nouveau schéma Profil d’appareil photo V2, nous commençons par une déclaration de profil simple et nous le disséquer pour comprendre les sections individuelles.

Nous prenons une caméra hypothétique qui prend en charge le nouveau profil haute fréquence d’images. Nous définissons d’abord des contraintes matérielles hypothétiques pour notre appareil.

  1. Le code pin d’aperçu est l’épingle 0. Dans le KSFILTER_DESCRIPTOR défini par le pilote de caméra, lorsque le tableau de KSPIN_DESCRIPTOR_EX est défini, le premier KSPIN_DESCRIPTOR_EX est le descripteur de l’épingle d’aperçu. De même, la broche 1 est broche de capture et l’épingle 2 est broche photo.

  2. En raison de la limitation matérielle, l’appareil en question ne peut pas gérer la mise à l’échelle à la fréquence d’images de 60 fps ou plus. Par conséquent, les flux Préversion et Capture doivent avoir la même résolution.

  3. De même, l’appareil ne peut pas non plus gérer la conversion de l’espace de couleurs pour 60 fps ou plus, de sorte que le sous-type doit être le même entre la préversion et la capture.

  4. L’appareil photo est capable de diffuser en continu des vidéos 4K 16x9 à 60 fps. L’appareil photo est également capable de 3840x2880@60fps (vidéo 4 :3 à 60 fps).

  5. L’appareil photo n’est pas en mesure de fournir des opérations photo lors de l’exécution à 60 fps.

  6. En plus du profil de fréquence d’images élevée, nous déclarons un profil d’enregistrement vidéo.

  7. Le profil d’enregistrement vidéo autorise n’importe quelle combinaison de types multimédias, mais aucun type de média à plus de 30 fps.

  8. Le profil d’enregistrement vidéo prend également en charge l’opération photo unique (par exemple, une séquence non photo).

Pour la déclaration basée sur INF, dans la section DDInstall.Interfaces, la directive AddReg est utilisée pour publier les informations de profil.

Un nom d’entrée de Registre doit être attribué à chaque filtre de type de média pin. Ce nom doit être MTF# où # représente une valeur entière. La valeur entière n’a pas besoin d’être séquentielle, simplement unique, car elle représente une valeur nommée dans le registre du système d’exploitation.

Compte tenu de ces contraintes, nous pouvons déclarer le profil suivant :

[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

Pour activer la prise en charge du profil d’appareil photo V2, déclarez la version du profil :

L’entrée OEMCameraProfileVersion définit notre version de profil et, pour cette révision de la spécification, doit être 2 :

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

Si l’entrée de Registre OEMCameraProfileVersion n’est pas présente et que l’entrée OEMCameraProfile est présente, le pipeline revient au schéma Profil de caméra 1507.

Cela garantit la compatibilité descendante avec les profils d’appareil photo existants.

Lorsque l’entrée OEMCameraProfileVersion est disponible, toutes les informations existantes du profil d’appareil photo 1507 sont ignorées et seul le profil d’appareil photo V2 est traité.

Remarque : Si l’entrée OEMCameraProfileVersion a la valeur 2, mais qu’aucune déclaration de profil d’appareil photo V2 n’est trouvée, les profils ne sont pas publiés.

Une fois déclarés, tous les profils doivent être stockés sous la clé de Registre Profils sous le nœud Interface de l’appareil.

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

Chaque profil doit être une sous-clé sous la clé Profils à l’aide de l’ID de profil.

L’ID de profil est une combinaison de Type de profil, Index de profil.

Le type de profil peut être l’une des chaînes suivantes ou une chaîne {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’index de profil peut être n’importe quelle valeur comprise entre 0 et 0x7FFFFFFF. Les valeurs d’index avec l’ensemble de bits d’ordre élevé sont réservées à une utilisation interne.

La base du profil caméra V2 est divisée en deux entrées de schéma main :

  • Contraintes de profil

  • Filtres de type de média pin

Contrainte de profil

Les contraintes de profil sont une déclaration à l’échelle du profil influençant le traitement des filtres de type de média pin. Il s’agit des six balises prises en charge. Ils peuvent apparaître dans n’importe quel ordre séparé par un « ; » :

Contrainte de profil Description
LRS Verrouiller la résolution sur toutes les broches. Toutes les broches déclarées dans le profil doivent avoir la même résolution lorsqu’elles sont actives.
LFR Verrouiller la fréquence d’images sur toutes les broches. Toutes les broches déclarées dans le profil doivent avoir la même fréquence d’images lorsqu’elles sont actives.
LST Verrouiller le sous-type sur toutes les broches. Toutes les broches déclarées dans le profil doivent avoir le même sous-type lorsqu’elles sont actives.
AAR Appliquez la déclaration de profil au niveau de l’épingle à tous les rapports d’aspect.

Le filtrage basé sur la résolution est effectué à l’aide du produit largeur * hauteur de la résolution et ce produit est utilisé comme valeur pour la comparaison. Toutefois, si la balise AAR n’est pas définie, la comparaison ne sera effectuée que pour les résolutions avec le même rapport d’aspect.
DIS Désactivé. Si cette contrainte est utilisée pour la contrainte profil, le filtre de type de média pin est ignoré et sera traité comme une syntaxe de profil non valide.

Cette balise ne peut pas être combinée avec d’autres balises de contrainte de profil.
UAR Autorisez la combinaison arbitraire de proportions de résolution entre les broches.

Par défaut, les proportions entre les broches doivent être identiques. Cette balise supprime cette contrainte par défaut.

Remarque : Les applications sont encouragées à conserver le même rapport d’aspect entre les broches disponibles.

Si la balise UAR n’est pas définie sur une déclaration de profil, tous les proportions entre les broches doivent être identiques. Plus précisément, la diffusion en continu de la préversion à 16 :9 lors de la prise d’une photo ou de la diffusion en continu à partir du code pin Capture à 4 :3 n’est pas prise en charge. Les tentatives de ce type entraînent une erreur.

Traitement de l’exemple de profil ci-dessus :

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

La contrainte de profil indique que pour le profil [KSCAMERAPROFILE_HighFrameRate,0], les résolutions et le sous-type sur toutes les broches doivent être identiques. Cela correspond à la contrainte HW de notre appareil photo hypothétique (aucune mise à l’échelle/conversion d’espace de couleur lors d’une exécution à 60 fps ou plus).

Contraintes d’encodeur

Un ensemble facultatif de contraintes de profil peut contenir des paramètres d’encodeur recommandés pour les applications qui choisissent de sélectionner un profil pour les opérations d’encodage vidéo. Par exemple, un IHV/OEM peut choisir d’utiliser HEVC sur H264 pour certains systèmes lorsqu’un type de média dépasse un seuil prédéterminé en termes de résolution et/ou de fréquence d’images.

En outre, étant donné que l’encodeur HW présent sur la machine peut fournir une opération plus optimale lorsqu’il est configuré avec les paramètres d’encodage, l’OEM peut choisir de créer un profil avec plus de « conseils » pour l’application.

Pour faciliter cette prise en charge, les contraintes supplémentaires suivantes peuvent être ajoutées à n’importe quel profil.

Sous-type codé préféré

La liste suivante de sous-types est le sous-type encodé préféré pour l’encodeur :

  • eSPSubtype_H264

  • eSPSubtype_HEVC

Ces deux contraintes s’excluent mutuellement. Un seul peut être déclaré. La déclaration des deux entraîne un profil non valide et sera rejetée.

Lorsque la contrainte Preferred Encoded Subtype est déclarée, le magasin d’attributs MF de IMFSensorProfile expose le sous-type codé Preferred déclaré avec l’attribut MF_MT_SUBTYPE.

Profil d’encodeur préféré

La liste profil d’encodeur préféré suivante correspond à l’énumération 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 déclaration Preferred Encoder Profiles ci-dessus s’excluent mutuellement. Un seul peut être déclaré. En déclarant plusieurs d’entre eux, un profil non valide sera rejeté.

Lorsque la contrainte de profil d’encodeur préféré est déclarée, le magasin d’attributs MF de IMFSensorProfile expose le profil d’encodeur préféré déclaré avec l’attribut MF_MT_MPEG2_PROFILE.

REMARQUE : Les profils eSPProfileH265 sont valides uniquement pour les sous-types encodés HEVC.

La contrainte de nombre BFrame recommandé permet au fabricant OEM d’indiquer le nombre d’images B recommandées pour la vidéo encodée :

  • eSPBFCount_X

Où X représente le nombre de images BFrame : par exemple, eSPBFCount_0 indique 0 B Frame Count.

Lorsque la contrainte de nombre BFrame recommandé est déclarée, le magasin d’attributs MF de IMFSensorProfile expose le nombre de BFrames recommandés déclarés avec l’attribut CODECAPI_AVEncMPVDefaultBPictureCount.

La contrainte de débit binaire recommandée permet au fabricant OEM de spécifier à la fois un débit d’encodage moyen (lors de l’utilisation d’un mode de contrôle de débit d’encodage approprié) et/ou un débit binaire maximal :

  • eSPBitRate_XXXXX

  • eSPMaxBitRate_XXXXX

Ces deux contraintes peuvent être spécifiées indépendamment ou ensemble. XXXXX représente le débit binaire en Kbits/s. Par exemple, eSPBitRate_5000 représente 5 000 000 bits par seconde.

Le eSPBitRate_XXXXX, lorsqu’il est spécifié par l’OEM, est exposé via le magasin d’attributs MF de IMFSensorProfile via l’attribut CODECAPI_AVEncCommonMeanBitRate.

Le eSPMaxBitRate_XXXXX lorsqu’il est spécifié par l’OEM, est exposé via le magasin d’attributs MF de IMFSensorProfile via le CODECAPI_AVEncCommonMaxBitRate.

Exemple de contrainte d’encodeur

L’exemple INF suivant montre comment un OEM peut déclarer les contraintes d’encodeur :

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

L’exemple de contrainte d’encodeur ci-dessus entraînerait le magasin d’attributs IMFSensorProfile du profil KSCAMERAPROFILE_VideoRecording,0 (voir la description de l’API ci-dessous) contenant les différents attributs d’encodeur comme suit :

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;
}

À l’aire de l’API WinRT, ces mêmes attributs peuvent être obtenus via CameraProfile.Properties (voir la description de l’API WinRT ci-dessous).

Contrôles bloqués

Les contrôles bloqués permettent aux OEM/IVS de désactiver de manière sélective certains contrôles de caméra en fonction du profil sélectionné :

[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"

Dans l’exemple ci-dessus, le KSCAMERAPROFILE_HighFrameRate,0 déclare que Video HDR (VHDR), Photo Sequence (PHSEQ), un contrôle personnalisé dont KSPROPERTY. Set = {E0766E84-36A2-4945-906D-092ECBD87445} et KSPROPERTY.Id = 2, et le démarrage à chaud sur Pin1 n’est pas pris en charge.

Lorsque ce profil est sélectionné, le pipeline empêche explicitement ces contrôles d’être émis vers le pilote DMFT/caméra. Cela permet au pilote DMFT/Caméra d’exposer la prise en charge de tous les contrôles de caméra et le pipeline garantit que l’application utilisant le profil de caméra ne tentera pas de toucher des contrôles bloqués.

Les contrôles bloqués peuvent être définis à l’aide de l’une des balises ci-dessous pour les contrôles d’appareil photo définis, ou utiliser un format {GUID},Id.

Tag Description du contrôle
PHSEQ Contrôle d’appareil photo étendu - Séquence de photos

Remarque : Le blocage de la séquence de photos bloque également la séquence de photos variables.
CHAUD# Contrôle de l’appareil photo étendu - Contrôle de démarrage à chaud.

# représente l’ID d’épingle sur lequel désactiver le contrôle Démarrage à chaud.
SCÈNE Contrôle de l’appareil photo étendu - Mode scène.
TORCHE Contrôle de l’appareil photo étendu - Mode Torch.
FLASH Contrôle de l’appareil photo étendu - Mode Flash.
ISO Contrôle de caméra étendu - ISO
EVCOMP Contrôle de caméra étendu - Compensation ev
WBAL Contrôle de l’appareil photo étendu - Balance des blancs
EXPOS Contrôle de caméra étendu - Exposition
SE CONCENTRER Contrôle de caméra étendu - Focus
ROI Contrôle de caméra étendu - ROI
EXTZOOM Contrôle de l’appareil photo étendu - Zoom
ADVISO Contrôle de caméra étendu - ISO Advanced
VIDST Contrôle de caméra étendu - Stabilisation vidéo
FACE Contrôle étendu de la caméra - Détection des visages
VHDR Contrôle de caméra étendu - Vidéo HDR
OIS Contrôle étendu de la caméra - Stabilisation optique de l’image
ADVPHOTO Contrôle de l’appareil photo étendu - Photo avancée
FACEAUTH Contrôle étendu de la caméra - Authentification faciale
SÉCURISER Contrôle de caméra étendu - Mode sécurisé
VFP Contrôle de caméra étendu - VFR

En plus des contrôles de caméra étendus, les profils peuvent également bloquer les contrôles hérités sous les jeux de contrôles PROPSETID_VIDCAP_VIDEOPROCAMP et PROPSETID_VIDCAP_CAMERACONTROL. PROPSETID_VIDCAP_VIDEOPROCAMP contrôles peuvent être bloqués à l’aide de :

VIDPROC#

Où # représente l’ID de contrôle :

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

Par exemple : VIDPROC13 bloque le contrôle fréquence de la ligne d’alimentation.

De même, le PROPSETID_VIDCAP_CAMERACONTROL peut être bloqué avec :

CAMCTRL#

Où # représente l’ID de contrôle :

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

Filtre de type de média d’épingler

Pour passer à l’exemple de profil, nous voyons un filtre de type de média pin pour le profil à fréquence d’images élevée :

[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:(!)"

Dans la section ci-dessus, Pin0 (l’épingle d’aperçu) du profil Haute fréquence d’images, nous autoriseons toute résolution/fréquence d’images disponible sur l’épingle. Pour notre appareil hypothétique, le pilote n’expose pas de fréquence d’images supérieure à 30 fps pour la broche d’aperçu.

Les nombres d’épingles lorsqu’ils sont déclarés à l’aide d’un INF correspondent à l’ordinal d’index 0 de la structure KSPIN_DESCRIPTOR_EX définie dans la structure KSFILTER_DESCRIPTOR que les pilotes de mini-port AVStream publient.

Pour interpréter le filtre de type de média pin et le jeu de filtres correspondant, nous devons définir le schéma de syntaxe :

Cette définition de chaîne utilise le schéma de filtre de type de média pin suivant. Lorsque [] sont indiqués, la chaîne incluse est facultative. Sinon, toutes les chaînes déclarées dans la syntaxe sont obligatoires (la syntaxe de contrainte ne respecte pas la casse) :

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

SubtypeValue peut prendre la forme d’une représentation hexadécimale unique de la valeur Quatre CC (par exemple, 0x3231564E == NV12), un {GUID} dans le cas d’un type de média personnalisé (des accolades ouvertes/fermées sont requises et le GUID doit prendre la forme de : {55D24460-45B7-450E-829B-91A94FF84180} ou d’une balise bien connu (NV12, YUY2, etc.)).

La représentation {GUID} peut également être utilisée pour les sous-types MFVideoFormat_* si un sous-type connu n’a pas de balise répertoriée.

Pour notre exemple :

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

Analyse pour :

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

Il s’agit de la sémantique : « Autoriser tous les types de médias ».

Consultez Filtre de fréquence d’images ci-dessous pour la définition des balises Résolution, Fréquence d’images et Sous-type individuelles.

Pour Pin1 (l’épingle de capture), la déclaration Fréquence d’images a une valeur différente :

[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:(!)"

Analyse pour :

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

Seuls les types de supports avec une fréquence d’images égale ou supérieure à 60 ips sont autorisés dans ce profil pour Pin1.

Alors que pour Pin2 (l’épingle photo) n’est pas disponible :

[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:(!)"

Comme la syntaxe l’implique, un filtre de type de média d’épingler peut éventuellement être une déclaration unique ( !), ce qui implique que pour cette épingle, il n’existe aucun format multimédia pris en charge (les broches sans types de média pris en charge seront masquées pour le client).

Pour passer au profil d’enregistrement vidéo, nous n’avons pas de contraintes sur le code d’aperçu, car notre caméra hypothétique n’expose qu’une préversion de 30 fps avec uniquement des types multimédias qui sont garantis pour être simultanés dans les scénarios d’enregistrement vidéo ou de fréquence d’images élevée.

; 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))"

Toutefois, pour l’épingle capture, nous devons limiter ce nombre à seulement 30 images par seconde, car nous ne pouvons pas prendre en charge des fréquences d’images plus élevées pour différentes résolutions entre les opérations d’aperçu et de capture ou de photo.

; 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))"

Pour ce faire, utilisez la balise Frame Rate Equal of Moinss Than (FRT<=) et spécifiez une fréquence d’images de 30 fps.

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

Analyse pour :

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

Pour La broche photo, nous déclarons qu’aucune prise en charge de la séquence de photos n’est prise en charge en déclarant blockedControls avec PHSEQ comme contrôle à interdire.

; 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))"

Jeu de filtres

Dans la section précédente, nous avons examiné plusieurs ensembles de filtres et expliqué ce que représentent certaines de ces chaînes de schéma. À ce stade, il est nécessaire de décrire la syntaxe de schéma du jeu de filtres pour une discussion plus approfondie.

Chaque jeu de filtres se compose d’un ensemble spécifique de déclaration pour la résolution, la fréquence d’images et le sous-type. Ce trio de déclaration, dans l’ordre spécifié, est requis pour un jeu de filtres valide.

Un filtre de type de média pin peut se composer de plusieurs entrées de filtre :

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

Si un jeu de filtres ne répond pas à ce schéma, la déclaration de profil entière est rejetée.

Toutes les chaînes de schéma de profil ne respectent pas la casse.

Chaque filtre doit être séparé par un « ; » et le trio filtre de résolution, filtre de fréquence d’images et filtre de sous-type doit être limité par une parenthèse ouverte/fermée.

Autre exemple de jeu de filtres :

; 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))

Comme indiqué dans le deuxième exemple ci-dessus, pour plusieurs jeux de filtres sur une broche, la comparaison est effectuée avec un OR logique des deux ensembles de filtres. Par exemple, si un type de média correspond à l’un des deux ensembles de filtres, il est autorisé.

Remarque : Pour faciliter la lecture de la déclaration, l’ensemble de filtres peut être décrit en plusieurs lignes. Pour ce faire, ils doivent avoir le même pin# à regrouper :

; 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))

Est sémantiquement identique à la déclaration ci-dessus. Toutefois, chaque ligne doit avoir une entrée MTF# unique.

Disabled Pin

Filtre de résolution

Comme défini dans les termes du document, le filtre de résolution définit comment filtrer en fonction de l’attribut MF_MT_FRAME_SIZE d’un IMFMediaType.

Syntaxe du filtre de résolution :

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

Attribut de filtre de résolution

L’attribut de filtre de résolution utilise la chaîne RES. Cette chaîne ne respecte pas la casse.

Opérateurs de comparaison de filtres de résolution

Voici les opérateurs pris en charge :

Opérateurs de comparaison Description
== Autorise si la résolution est égale à la résolution déclarée.

Si l’ensemble de filtres est un jeu de filtres d’exclusion, cette balise interdit si la résolution est égale à la résolution déclarée.

Remarque : si la déclaration utilise l’opérateur == et que la valeur de filtre est vide (par exemple, RES==;), l’attribut MF_MT_FRAME_SIZE est ignoré.
<= Autorise si la résolution est égale ou inférieure à la résolution déclarée.

La comparaison de résolution est effectuée en fonction du nombre total de pixels (produit de Width *Height) et en fonction du rapport d’aspect.

Si l’AAR est déclaré dans la contrainte de profil, le nombre total de pixels est appliqué à tous les rapports d’aspect. Sinon, uniquement les proportions correspondantes.

Si l’ensemble de filtres est un jeu de filtres d’exclusion, cette balise est déconseillée si la résolution est égale ou inférieure à la résolution déclarée.
>= Autorise si la résolution est égale ou supérieure à la résolution déclarée.

La comparaison de résolution est effectuée en fonction du nombre total de pixels (produit de Largeur * Hauteur) et en fonction du rapport d’aspect.

Si l’AAR est déclaré dans la contrainte de profil, le nombre total de pixels est appliqué à tous les rapports d’aspect. Sinon, uniquement les proportions correspondantes.

Si l’ensemble de filtres est un jeu de filtres d’exclusion, cette balise interdit si la résolution est égale ou supérieure à la résolution déclarée.
!= Autorisez si la résolution n’est PAS égale à la résolution déclarée.

Si l’ensemble de filtres est un jeu de filtres d’exclusion, cette balise interdit si la résolution n’est PAS égale à la résolution déclarée.

Valeur du filtre de résolution

La largeur et la hauteur de la valeur du filtre de résolution doivent être au format décimal séparé par une virgule ( » , « ) sans espace blanc :

; 1080p only.
RES==1920,1080

L’exemple suivant :

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

Correspond uniquement à une résolution 16 :9 égale ou inférieure à 1080p si la balise AAR n’est pas déclarée dans la contrainte de profil. Toutefois, si AAR est déclaré, il correspond à toute la résolution dont le produit Largeur * Hauteur est égal ou inférieur à (1920 * 1080 = 2073600).

Par exemple :

  • Si AAR n’est pas déclaré, cette entrée correspond à 720p, mais pas à 1280x960.

  • Si AAR est déclaré, cette entrée correspond à 720p, 1280x960 et toutes les résolutions inférieures.

Si AAR n’est pas déclaré pour garantir des correspondances de résolution sélective pour les proportions de 16 :9 et 4 :3, plusieurs jeux de filtres peuvent être utilisés :

; 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))

Pour faire correspondre toutes les résolutions, spécifiez égal ou supérieur à 0,0

; Match all resolutions.
RES>=0,0

Filtre de fréquence d’images

Comme défini dans les termes du document, le filtre de fréquence d’images définit comment filtrer en fonction de l’attribut MF_MT_FRAME_RATE d’un IMFMediaType.

Syntaxe du filtre de fréquence d’images :

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

Attribut de filtre de fréquence d’images

L’attribut de filtre de fréquence d’images utilise la chaîne FRT. Cette chaîne ne respecte pas la casse.

Opérateurs de comparaison de filtres de fréquence d’images

Voici les balises de fréquence d’images prises en charge :

Opérateurs de comparaison Description
== Autorisez si la fréquence d’images est égale à la fréquence d’images déclarée.

Si l’ensemble de filtres est un jeu de filtres d’exclusion, cette balise interdit si la fréquence d’images est égale à la fréquence d’images déclarée.

Remarque : si la déclaration utilise l’opérateur == et que la valeur de filtre est vide (par exemple, FRT==;), l’attribut MF_MT_FRAME_RATE est ignoré.
<= Autorisez si la fréquence d’images est égale ou inférieure à la fréquence d’images déclarée.

Si l’ensemble de filtres est un jeu de filtres d’exclusion, cette balise interdit si la fréquence d’images est égale ou inférieure à la fréquence d’images déclarée.
>= Autorisez si la fréquence d’images est égale ou supérieure à la fréquence d’images déclarée.

Si l’ensemble de filtres est un jeu de filtres d’exclusion, cette balise interdit si la fréquence d’images est égale ou supérieure à la fréquence d’images déclarée.
!= Autorisez uniquement si la fréquence d’images n’est PAS égale à la fréquence d’images déclarée.

Si l’ensemble de filtres est un jeu de filtres d’exclusion, cette balise interdit si la fréquence d’images n’est PAS égale à la fréquence d’images déclarée.
; 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== ;, et FRT>=0,0 présentent des différences sémantiques subtiles.

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

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

Différence entre FRT== ; et FRT>=0,0 est le premier a la même signification pour l’ensemble de filtres d’inclusion et le jeu de filtres d’exclusion. Tandis que la signification de FRT>=0,0 change selon qu’il s’agit d’un jeu de filtres d’inclusion ou d’un jeu de filtres d’exclusion.

Consultez Jeu de filtres pour l’explication de l’ensemble de filtres d’exclusion.

Filtre de sous-type

Filtre de sous-type définit comment filtrer en fonction de l’attribut MF_MT_SUBTYPE d’un type IMFMediaType.

Syntaxe de filtre de sous-type :

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

Attribut de filtre de sous-type

L’attribut de filtre subtype utilise la chaîne SUT. Cette chaîne ne respecte pas la casse.

Opérateurs de comparaison de filtres de sous-types

Les opérateurs de comparaison suivants sont pris en charge :

Opérateurs de comparaison Description
== Autorisez si le sous-type est égal au sous-type déclaré.

Si l’ensemble de filtres est un jeu de filtres d’exclusion, cette balise interdit si le sous-type est égal au sous-type déclaré.

Remarque : Si la déclaration utilise l’opérateur == et que la valeur de filtre est vide (par exemple, FRT==;), l’attribut MF_MT_SUBTYPE est ignoré.
!= Autorisez si le sous-type n’est PAS égal au sous-type déclaré.

Si l’ensemble de filtres est un jeu de filtres d’exclusion, cette balise interdit si le sous-type n’est PAS égal au sous-type déclaré.

Les opérateurs Égal ou inférieur à (<=) et Égal ou supérieur à (>=) ne sont pas pris en charge pour le filtre de sous-type. S’il est déclaré, le profil n’est pas valide et rejeté par le pipeline.

Valeur du filtre de sous-type

La valeur de filtre de sous-type peut être la représentation hexadécimale de la valeur FourCC, une déclaration de chaîne GUID si un type de média personnalisé est utilisé (guid de sous-type MFVideoFormat connu peut également être utilisé) ou une balise de sous-type connu (voir la liste ci-dessous).

; 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==;

La valeur 0/GUID_NULL et ALL a une signification particulière.

Cela signifie « Les quatre valeurs 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

Sémantiquement SUT== ; et SUT==0 ont des significations subtilement différentes.

Lorsqu’elles sont utilisées dans un filtre d’inclusion, elles ont le même effet : Autoriser tout sous-type. Mais lorsqu’il est utilisé dans un filtre d’exclusion, SUT==0 signifie exclure tous les sous-types. Toutefois, comme cela a le même effet que le marquage de la broche entière comme désactivée ( !), il n’y a aucune raison d’utiliser SUT==0 dans un filtre d’exclusion.

Balises de sous-type connues

Étiquettes
RGB32
ARGB32
RVB24
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
MPG1
DVSL
DVSD
DVHD
DV25
DV50
DVH1
CVN
H264
H265
MJPG
420O
HEVC
HEVS
VP80
VP90
ORAW
H263
VP10
AV01
JPEG

Jeu de filtres d’exclusion

Tous les exemples d’ensemble de filtres jusqu’à présent sont des entrées de filtre inclusives. Ils sont sémantiquement « si un type de média répond aux critères, autorisez le type de média à être consommé par le client ».

Il manque dans la discussion l’équivalent de « si un type de média répond aux critères, interdire que le type de média soit mis à la disposition du client ».

Pour cela, nous avons besoin d’un jeu de filtres d’exclusion.

Si l’ensemble de filtres est précédé d’un « ! » :

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

Il s’agit d’un jeu de filtres d’exclusion. Un jeu de filtres d’exclusion, si le type de média correspond, est exclu de la liste des types de médias disponibles.

Si vous déclarez plusieurs jeux de filtres, les vérifications de contraintes de chaque jeu de filtres seront logiquement OR-ed les uns avec les autres :

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

Ensemble de filtres d’exclusion et d’inclusion

Comme indiqué, un jeu de filtres peut être un jeu de filtres d’inclusion ou un jeu de filtres d’exclusion. Le mélange de différents ensembles de filtres est autorisé, mais selon le type de jeu de filtres ajouté, la signification du filtre de type de média d’épingle peut changer :

  1. Si seules les entrées de filtre d’inclusion sont déclarées pour un filtre de type de média d’épingle, tout type de média qui ne correspond pas à l’une des entrées de filtre est exclu des types de médias disponibles.

  2. Si seules les entrées de filtre d’exclusion sont déclarées pour un filtre de type de média d’épingle, tout type de média qui ne correspond pas à l’une des entrées de filtre est inclus dans les types de média disponibles.

  3. Si les entrées de filtre d’inclusion et d’exclusion sont déclarées pour un filtre de type de média d’épingle, tout type de média qui correspond à un jeu de filtres d’inclusion est inclus, sauf s’il correspond également à un jeu de filtres d’exclusion. Le jeu de filtres d’exclusion remplace l’ensemble de filtres d’inclusion.

Pour illustrer cet exemple, supposons que pour Pin0, les types de médias suivants sont disponibles :

  • 1920x1080@60fps, NV12

  • 1920x1080@30fps, NV12

  • 1280x720@60fps, NV12

  • 1280x720@30fps, NV12

  • 640x360@60fps, NV12

  • 640x360@30fps, NV12

Si nous déclarons un jeu de filtres d’inclusion uniquement :

; 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))

Si nous déclarons un jeu de filtres d’exclusion uniquement :

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

Si nous déclarons à la fois un ensemble de filtres d’inclusion et d’exclusion :

; 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))

Remarque : En raison de la règle n° 2 dans l’instruction de traitement de filtre, l’exemple final de « Autoriser tous les types de médias à l’exception de 640x360@60fps NV12 » peut être pour notre exemple Pin0 :

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

Étant donné qu’un seul jeu de filtres d’exclusion est présent, tous les types de médias sont autorisés, à l’exception des types de média qui correspondent au jeu de filtres d’exclusion.

Pour illustrer les entrées de filtre d’inclusion et d’exclusion, voici quelques exemples supplémentaires :

; 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))

Spécification du développeur Du profil d’appareil photo V2