Compartir a través de


Diseño detallado para IHD y OEM (perfil de cámara V2)

Para ayudar a comprender el nuevo esquema de perfil de cámara V2, comenzamos con una declaración de perfil sencilla y la disectamos para comprender las secciones individuales.

Tomamos una cámara hipotética que admite el nuevo perfil de alta velocidad de fotogramas. Primero definimos algunas restricciones hipotéticas de hardware para nuestro dispositivo.

  1. El pin de vista previa es el 0. En el KSFILTER_DESCRIPTOR definido por el controlador de cámara, cuando se define la matriz de KSPIN_DESCRIPTOR_EX, el primer KSPIN_DESCRIPTOR_EX es el descriptor del pin de vista previa. Del mismo modo, el pin 1 es el pin capture y el pin 2 es Photo pin.

  2. Debido a la limitación de hardware, el dispositivo en cuestión no puede controlar el escalado a velocidades de fotogramas de 60 fps o superior. Por lo tanto, las secuencias preview y Capture deben tener la misma resolución.

  3. Del mismo modo, el dispositivo tampoco puede controlar la conversión de espacio de color para 60 fps o superior, por lo que el subtipo debe ser el mismo entre Preview y Capture.

  4. La cámara es capaz de transmitir vídeo de 4K 16x9 a 60 fps. La cámara también es capaz de 3840x2880@60fps (vídeo de 4:3 a 60 fps).

  5. La cámara no puede proporcionar ninguna operación de foto cuando se ejecuta a 60 fps.

  6. Además del perfil de alta velocidad de fotogramas, declaramos un perfil de grabación de vídeo.

  7. El perfil de grabación de vídeo permite cualquier combinación de tipos multimedia, pero ningún tipo de medio con más de 30 fps.

  8. El perfil de grabación de vídeo también admite una operación de foto única (por ejemplo, no secuencia de fotos).

Para la declaración basada en INF, en la sección DDInstall.Interfaces, la directiva AddReg se usa para publicar la información del perfil.

Se debe asignar un nombre de entrada del Registro a cada filtro de tipo de medio pin. Este nombre debe ser MTF# donde # representa un valor entero. El valor entero no necesita ser secuencial, simplemente único, ya que representa un valor con nombre en el registro del sistema operativo.

Dadas estas restricciones, podemos declarar el perfil siguiente:

[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

Para habilitar la compatibilidad con Camera Profile V2, declare la versión del perfil:

La entrada OEMCameraProfileVersion define la versión del perfil y, para esta revisión de la especificación, debe ser 2:

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

Si la entrada del registro OEMCameraProfileVersion no está presente y la entrada OEMCameraProfile está presente, la canalización vuelve al esquema del perfil de cámara 1507.

Esto garantiza la compatibilidad con versiones anteriores con los perfiles de cámara existentes.

Cuando la entrada OEMCameraProfileVersion está disponible, se omite cualquier información existente del perfil de cámara 1507 y solo se procesará el perfil de cámara V2.

Nota: Si la entrada OEMCameraProfileVersion está establecida en 2, pero no se encuentran declaraciones de perfil de cámara V2, no se publicarán perfiles.

Una vez declarados, todos los perfiles deben almacenarse en la clave del Registro de perfiles en el nodo Interfaz de dispositivo.

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

Cada perfil debe ser una subclave en la clave Perfiles mediante el identificador de perfil.

El identificador de perfil es una combinación de tipo de perfil, índice de perfil.

El tipo de perfil puede ser una de las cadenas siguientes o puede ser una cadena {GUID}:

  • KSCAMERAPROFILE_VideoRecording

  • KSCAMERAPROFILE_HighQualityPhoto

  • KSCAMERAPROFILE_BalancedVideoAndPhoto

  • KSCAMERAPROFILE_VideoConferencing

  • KSCAMERAPROFILE_PhotoSequence

  • KSCAMERAPROFILE_FaceAuth_Mode

  • KSCAMERAPROFILE_HighFrameRate

  • KSCAMERAPROFILE_HDRWithWCGVideo

  • KSCAMERAPROFILE_HDRWithWCGPhoto

  • KSCAMERAPROFILE_VariablePhotoSequence

  • KSCAMERAPROFILE_VideoHDR8

El índice de perfil puede ser cualquier valor de 0 a 0x7FFFFFFF. Los valores de índice con el conjunto de bits de orden alto están reservados para uso interno.

La base del perfil de cámara V2 se divide en dos entradas de esquema principales:

  • Restricciones de perfil

  • Anclar filtros de tipo de medio

Restricción de perfil

Las restricciones de perfil son una declaración para todo el perfil que influye en el procesamiento de los filtros de tipo multimedia pin. Estas son las seis etiquetas admitidas. Pueden aparecer en cualquier orden separados por ";":

Restricción de perfil Descripción
LRS Bloquear resolución en todas las patillas. Todas las patillas declaradas en el perfil deben tener la misma resolución cuando está activa.
LFR Bloquear velocidad de fotogramas en todos los patillas. Todas las patillas declaradas en el perfil deben tener la misma velocidad de fotogramas cuando está activa.
LST Bloquear subtipo en todos los patillas. Todas las patillas declaradas en el perfil deben tener el mismo subtipo cuando está activo.
AAR Aplique la declaración de perfil de nivel pin a todas las relaciones de aspecto.

El filtrado basado en la resolución se realiza mediante el producto Width * Height de la resolución y ese producto se usa como un valor para la comparación. Sin embargo, si no se establece la etiqueta AAR, la comparación solo se realizará para las resoluciones con la misma relación de aspecto.
DIS Deshabilitado. Si se usa esta restricción para la restricción de perfil, se omite el filtro de tipo de medio pin y se tratará como una sintaxis de perfil no válida.

Es posible que esta etiqueta no se combine con ninguna otra etiqueta de restricción de perfil.
UAR Permite una combinación arbitraria de relaciones de aspecto de resolución entre patillas.

De forma predeterminada, las relaciones de aspecto entre patillas deben ser las mismas. Esta etiqueta quita esa restricción predeterminada.

Nota: Se recomienda a las aplicaciones mantener la misma relación de aspecto entre las patillas disponibles.

Si la etiqueta UAR no está establecida en una declaración de perfil, toda la relación de aspecto entre las patillas debe ser la misma. En concreto, no se admite la versión preliminar de streaming a las 16:9 mientras se toma una foto o streaming desde el pin de captura a las 4:3. Los intentos al hacerlo producirán un error.

Procesamiento del perfil de ejemplo anterior:

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

La restricción de perfil indica que para el perfil [KSCAMERAPROFILE_HighFrameRate,0], las resoluciones y el subtipo de todas las patillas deben ser iguales. Esto coincide con la restricción HW de la cámara hipotética (sin conversión de espacio de escala o color cuando se ejecuta a 60 fps o superior).

Restricciones del codificador

Un conjunto opcional de restricciones de perfil puede contener parámetros de codificador recomendados para aplicaciones que elijan seleccionar un perfil para las operaciones de codificación de vídeo. Por ejemplo, un IHV/OEM puede optar por recomendar el uso de HEVC sobre H264 para determinados sistemas cuando un tipo de medio supera un umbral predeterminado en términos de resolución y/o velocidad de fotogramas.

Además, dado que el codificador HW presente en la máquina puede proporcionar una operación más óptima cuando se configura con los parámetros de codificación, el OEM puede optar por crear un perfil con más "sugerencias" para la aplicación.

Para facilitar esta compatibilidad, se pueden agregar las siguientes restricciones adicionales a cualquier perfil.

Subtipo codificado preferido

La siguiente lista de subtipos es el Subtipo codificado preferido para el codificador:

  • eSPSubtype_H264

  • eSPSubtype_HEVC

Estas dos restricciones son mutuamente excluyentes. Solo se puede declarar una. Declarar ambos dará como resultado un perfil no válido y se rechazará.

Cuando se declara la restricción subtipo codificada preferida, el almacén de atributos MF de IMFSensorProfile expone el subtipo codificado preferido declarado con el atributo MF_MT_SUBTYPE.

Perfil de codificador preferido

La siguiente lista de perfiles de codificador preferido corresponde a la enumeración 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 declaración de perfiles de codificador preferido anterior es mutuamente excluyente. Solo se puede declarar una. Declarar más de uno dará lugar a un perfil no válido y se rechazará.

Cuando se declara la restricción de perfil de codificador preferido, el almacén de atributos MF de IMFSensorProfile expone el perfil de codificador preferido declarado con el atributo MF_MT_MPEG2_PROFILE.

NOTA: los perfiles de eSPProfileH265 solo son válidos para subtipos codificados en HEVC.

La restricción de recuento de fotogramas B recomendado proporciona una manera para que el OEM indique el recuento de fotogramas B recomendado para el vídeo codificado:

  • eSPBFCount_X

Donde X representa el recuento de fotogramas B: por ejemplo, eSPBFCount_0 indica 0 recuento de fotogramas B.

Cuando se declara la restricción de recuento de fotogramas BFrame recomendada, el almacén de atributos MF de IMFSensorProfile expone el recuento de fotogramas BFrame recomendado declarado con el atributo CODECAPI_AVEncMPVDefaultBPictureCount.

La restricción de velocidad de bits recomendada proporciona una manera de que el OEM especifique una velocidad media de bits de codificación (cuando se usa un modo de control de velocidad de codificación adecuado) o velocidad de bits máxima:

  • eSPBitRate_XXXXX

  • eSPMaxBitRate_XXXXX

Estas dos restricciones se pueden especificar de forma independiente o conjunta. El XXXXX representa la velocidad de bits en Kbps. Por ejemplo, eSPBitRate_5000 representa 5 000 000 bits por segundo.

El eSPBitRate_XXXXX, cuando lo especifique el OEM, se expondrá a través del almacén de atributos MF de IMFSensorProfile a través del atributo CODECAPI_AVEncCommonMeanBitRate.

El eSPMaxBitRate_XXXXX cuando se especifique por el OEM, se expondrá a través del almacén de atributos MF de IMFSensorProfile a través del CODECAPI_AVEncCommonMaxBitRate.

Restricción de codificador de ejemplo

En el ejemplo siguiente INF se muestra cómo un OEM puede declarar las restricciones del codificador:

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

La restricción de codificador de ejemplo anterior daría como resultado el almacén de atributos MF de KSCAMERAPROFILE_VideoRecording,0 del perfil IMFSensorProfile (consulte la descripción de la API siguiente) ALMACÉN de atributos MF que contienen los distintos atributos de codificador de la siguiente manera:

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

En la superficie de la API de WinRT, estos mismos atributos se pueden obtener a través de CameraProfile.Properties (consulte la descripción de la API de WinRT a continuación).

Controles bloqueados

Los controles bloqueados permitirán que los OEM/IHD deshabiliten selectivamente determinados controles de cámara en función del perfil seleccionado:

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

En el ejemplo anterior, el KSCAMERAPROFILE_HighFrameRate,0 declara que Video HDR (VHDR), Photo Sequence (PHSEQ), un control personalizado cuyo KSPROPERTY. Set = {E0766E84-36A2-4945-906D-092ECBD87445} y KSPROPERTY.Id = 2 y no se admite el inicio intermedio en Pin1.

Cuando se selecciona este perfil, la canalización impedirá explícitamente que esos controles se emitan al controlador DMFT/Camera. Esto permite que el controlador DMFT/Camera exponga compatibilidad con todos los controles de cámara y la canalización garantizará que la aplicación que usa el perfil de cámara no intente tocar los controles bloqueados.

Los controles bloqueados se pueden definir mediante una de las etiquetas siguientes para los controles de cámara definidos o pueden usar un formato {GUID},Id.

Etiqueta Descripción del control
PHSEQ Control de cámara extendida: secuencia de fotos

Nota: Bloquear la secuencia de fotos también bloqueará la secuencia de fotos variable.
CALIENTE# Control de cámara extendida- Control de inicio intermedio.

# representa el identificador de pin en el que se va a deshabilitar el control Inicio intermedio.
ESCENA Control de cámara extendida: modo de escena.
ANTORCHA Control de cámara extendida - Modo antorcha.
FLASH Control de cámara extendida - Modo flash.
ISO Control de cámara extendida: ISO
EVCOMP Control de cámara extendida- Compensación ev
WBAL Control de cámara extendida- Balance de blancos
EXPOS Control de cámara extendida: exposición
CENTRO DE ATENCIÓN Control de cámara extendida: foco
ROI Control extendido de cámara: ROI
EXTZOOM Control de cámara extendida: zoom
ADVISO Control de cámara extendida: ISO Avanzado
VIDST Control de cámara extendida: estabilización de vídeo
FACEDT Control de cámara extendida: detección de caras
VHDR Control de cámara extendida - Video HDR
OIS Control de cámara extendida- Estabilización óptica de imágenes
ADVPHOTO Control de cámara extendida- Foto avanzada
FACEAUTH Control de cámara extendida: autenticación facial
PROTEGER Control de cámara extendida: modo seguro
VFP Control de cámara extendida: VFR

Además de los controles extendidos de cámara, los perfiles también pueden bloquear los controles heredados en los conjuntos de controles PROPSETID_VIDCAP_VIDEOPROCAMP y PROPSETID_VIDCAP_CAMERACONTROL. PROPSETID_VIDCAP_VIDEOPROCAMP controles se pueden bloquear mediante:

VIDPROC#

Donde # representa el identificador de control:

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

Por ejemplo: VIDPROC13 bloquea el control Frecuencia de la línea de alimentación.

Del mismo modo, el PROPSETID_VIDCAP_CAMERACONTROL se puede bloquear con:

CAMCTRL#

Donde # representa el identificador de control:

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

Anclar filtro de tipo de medio

Al pasar al perfil de ejemplo, vemos un filtro de tipo de medio de anclaje para el perfil de velocidad de fotogramas alta:

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

En la sección anterior, Pin0 (el pin de vista previa) del perfil de velocidad de fotogramas altas, estamos permitiendo cualquier resolución o velocidad de fotogramas disponible en la patilla. Para nuestro dispositivo hipotético, el controlador no expondrá ninguna velocidad de fotogramas superior a 30 fps para el pin de vista previa.

Los números de anclaje cuando se declaran con un INF corresponden al ordinal de índice basado en 0 de la estructura de KSPIN_DESCRIPTOR_EX definida en la estructura de KSFILTER_DESCRIPTOR que anuncian los controladores de minipuerto avStream.

Para interpretar el filtro de tipo multimedia pin y el conjunto de filtros correspondiente, es necesario definir el esquema de sintaxis:

Esta definición de cadena usa el siguiente esquema de filtro de tipo de medio pin. Donde se muestran [] , la cadena incluida es opcional; de lo contrario, toda la cadena declarada en la sintaxis es obligatoria (la sintaxis de restricción no distingue mayúsculas de minúsculas):

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

SubtypeValue puede adoptar la forma de una sola representación hexadecimal del valor Cuatro CC (por ejemplo, 0x3231564E == NV12), un {GUID} en el caso de un tipo de medio personalizado (se requieren llaves de apertura y cierre y el GUID debe tener la forma de: {55D24460-45B7-450E-829B-91A94FF84180} o una etiqueta bien conocido (NV12, YUY2, etc.).

La representación {GUID} también se puede usar para subtipos MFVideoFormat_* si un subtipo conocido no tiene una etiqueta enumerada.

Para nuestro ejemplo:

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

Analiza a:

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

Esto semánticamente: "Permitir todos los tipos de medios".

Consulte Filtro de velocidad de fotogramas a continuación para obtener la definición de etiquetas individuales de resolución, velocidad de fotogramas y subtipos.

Para Pin1 (el pin de captura), la declaración Velocidad de fotogramas tiene un valor diferente:

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

Analiza a:

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

Solo se permitirían tipos de medios con velocidad de fotogramas de 60 fps o superior en este perfil para Pin1.

Mientras que para Pin2 (el pin foto) no está 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:(!)"

Como implica la sintaxis, un filtro de tipo de medio pin puede ser opcionalmente una única declaración (!), lo que implica que para ese pin, no hay ningún formato multimedia compatible (los patillas sin tipos de medios admitidos se ocultarán al cliente).

Al pasar al perfil de grabación de vídeo, una vez más, no tenemos restricciones en el pin de vista previa, ya que nuestra cámara hipotética solo expone la vista previa de 30 fps con solo tipos de medios que se garantiza que son simultáneos en escenarios de grabación de vídeo o alta velocidad de fotogramas.

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

Sin embargo, para el pin de captura, es necesario limitar esto a solo 30 fps de tipos multimedia porque no podemos admitir velocidades de fotogramas más altas para diferentes resoluciones entre las operaciones de vista previa y captura ni 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))"

Esto se hace con la velocidad de fotograma igual a la etiqueta Menor que (FRT<=) y especificando una velocidad de fotogramas de 30 fps.

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

Analiza a:

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

Para el pin Photo, no declaramos compatibilidad con secuencias de fotos declarando blockedControls con PHSEQ como el control que se va a denegar.

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

Conjunto de filtros

En la sección anterior, hemos examinado varios conjuntos de filtros y hemos explicado lo que representan algunas de esas cadenas de esquema. En este momento, es necesario describir la sintaxis de esquema del conjunto de filtros para obtener más información.

Cada conjunto de filtros consta de un conjunto específico de declaración para resolución, velocidad de fotogramas y subtipo. Este trío de declaraciones, en el orden especificado, es necesario para un conjunto de filtros válido.

Un filtro de tipo de medio pin puede constar de varias entradas de filtro:

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

Si un conjunto de filtros no cumple este esquema, se rechaza toda la declaración de perfil.

Todas las cadenas de esquema de perfil no distinguen mayúsculas de minúsculas.

Cada filtro debe estar separado por un ";" y el trío de filtro de resolución, filtro de velocidad de fotogramas y filtro de subtipo deben estar limitados por un paréntesis de apertura y cierre.

Otro ejemplo de un conjunto de filtros:

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

Como se muestra en el segundo ejemplo anterior, para varios conjuntos de filtros en un pin, la comparación se realiza con un OR lógico de los dos conjuntos de filtros. Por ejemplo, si un tipo de medio coincide con cualquiera de los dos conjuntos de filtros, se permite.

Nota: Para facilitar la capacidad de lectura de la declaración, el conjunto de filtros se puede describir en varias líneas. Para ello, deben tener el mismo Pin# que se va a agrupar:

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

Es semánticamente idéntico a la declaración anterior. Sin embargo, cada línea debe tener una entrada MTF# única.

Disabled Pin

Filtro de resolución

Tal y como se define en los términos del documento, el filtro de resolución define cómo filtrar según el atributo MF_MT_FRAME_SIZE de un IMFMediaType.

Sintaxis del filtro de resolución:

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

Atributo de filtro de resolución

El atributo filtro de resolución usa la cadena RES. Esta cadena no distingue mayúsculas de minúsculas.

Operadores de comparación de filtros de resolución

A continuación se muestran los operadores admitidos:

Operadores de comparación Descripción
== Permite si Resolution es igual a la resolución declarada.

Si el conjunto de filtros es un conjunto de filtros de exclusión, esta etiqueta no permitirá si la resolución es igual a la resolución declarada.

Nota: Si la declaración usa el operador == y el valor de filtro está vacío (por ejemplo, RES==;), se omite el atributo MF_MT_FRAME_SIZE.
<= Permita si Resolution es igual o menor que la resolución declarada.

La comparación de resolución se realiza en función del recuento total de píxeles (producto de Ancho *Alto) y en función de la relación de aspecto.

Si el AAR se declara en la restricción de perfil, el recuento total de píxeles se aplica a todas las relaciones de aspecto. De lo contrario, solo coincide con las relaciones de aspecto.

Si el conjunto de filtros es un conjunto de filtros de exclusión, esta etiqueta no permitirá si la resolución es igual o menor que la resolución declarada.
>= Permitir si resolution es igual o mayor que la resolución declarada.

La comparación de resolución se realiza en función del recuento total de píxeles (producto de Width * Height) y en función de la relación de aspecto.

Si el AAR se declara en la restricción de perfil, el recuento total de píxeles se aplica a todas las relaciones de aspecto. De lo contrario, solo coincide con las relaciones de aspecto.

Si el conjunto de filtros es un conjunto de filtros de exclusión, esta etiqueta no permitirá si la resolución es igual o mayor que la resolución declarada.
!= Permitir si la resolución NO es igual a la resolución declarada.

Si el conjunto de filtros es un conjunto de filtros de exclusión, esta etiqueta no permitirá si la resolución no es igual a la resolución declarada.

Valor del filtro de resolución

El ancho y el alto del valor del filtro de resolución deben estar separados por una coma (",") sin ningún espacio en blanco:

; 1080p only.
RES==1920,1080

En el ejemplo siguiente:

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

Solo coincidirá con la resolución 16:9 igual o inferior a 1080p si la etiqueta AAR no se declara en la restricción de perfil. Sin embargo, si se declara AAR, coincide con toda la resolución cuyo producto de Width * Height es igual o menor que (1920 * 1080 = 2073600).

Por ejemplo:

  • Si AAR no se declara, esta entrada coincide con 720p, pero no 1280x960.

  • Si se declara AAR, esta entrada coincide con 720p, 1280x960 y todas las resoluciones inferiores.

Si AAR no se declara para garantizar coincidencias de resolución selectiva para ambas relaciones de aspecto de 16:9 y 4:3, se pueden usar varios conjuntos de filtros:

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

Para que coincida con todas las resoluciones, especifique igual o mayor que 0,0

; Match all resolutions.
RES>=0,0

Filtro de velocidad de fotogramas

Tal como se define en los términos del documento, el filtro de velocidad de fotogramas define cómo filtrar en función del atributo MF_MT_FRAME_RATE de un IMFMediaType.

Sintaxis de filtro de velocidad de fotogramas:

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

Atributo de filtro de velocidad de fotogramas

El atributo de filtro de velocidad de fotogramas usa la cadena FRT. Esta cadena no distingue mayúsculas de minúsculas.

Operadores de comparación de filtros de velocidad de fotogramas

Estas son las etiquetas de velocidad de fotogramas admitidas:

Operadores de comparación Descripción
== Permitir si la velocidad de fotogramas es igual a la velocidad de fotogramas declarada.

Si el conjunto de filtros es un conjunto de filtros de exclusión, esta etiqueta no permitirá si la velocidad de fotogramas es igual a la velocidad de fotogramas declarada.

Nota: Si la declaración usa el operador == y el valor de filtro está vacío (por ejemplo, FRT==;), se omite el atributo MF_MT_FRAME_RATE.
<= Permitir si la velocidad de fotogramas es igual o menor que la velocidad de fotogramas declarada.

Si el conjunto de filtros es un conjunto de filtros de exclusión, esta etiqueta no permitirá si la velocidad de fotogramas es igual o menor que la velocidad de fotogramas declarada.
>= Permitir si la velocidad de fotogramas es igual o mayor que la velocidad de fotogramas declarada.

Si el conjunto de filtros es un conjunto de filtros de exclusión, esta etiqueta no permitirá si la velocidad de fotogramas es igual o mayor que la velocidad de fotogramas declarada.
!= Permitir solo si la velocidad de fotogramas NO es igual a la velocidad de fotogramas declarada.

Si el conjunto de filtros es un conjunto de filtros de exclusión, esta etiqueta no permitirá si la velocidad de fotogramas no es igual a la velocidad de fotogramas declarada.
; 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==;, y FRT>=0,0 tienen diferencias semánticas sutiles.

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

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

La diferencia entre FRT==; y FRT>=0,0 es el primero tiene el mismo significado para el conjunto de filtros de inclusión y el conjunto de filtros de exclusión. Mientras que el significado de FRT>=0,0 cambiará en función de si se trata de un conjunto de filtros de inclusión o un conjunto de filtros de exclusión.

Consulte Conjunto de filtros para obtener la explicación del conjunto de filtros de exclusión.

Filtro de subtipo

El filtro de subtipo define cómo filtrar en función del atributo MF_MT_SUBTYPE de un IMFMediaType.

Sintaxis de filtro de subtipo:

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

Atributo de filtro de subtipo

El atributo de filtro de subtipo usa la cadena SUT. Esta cadena no distingue mayúsculas de minúsculas.

Operadores de comparación de filtros de subtipo

Se admiten los operadores de comparación siguientes:

Operadores de comparación Descripción
== Permitir si el subtipo es igual al subtipo declarado.

Si el conjunto de filtros es un conjunto de filtros de exclusión, esta etiqueta no permitirá si el subtipo es igual al subtipo declarado.

Nota: Si la declaración usa el operador == y el valor de filtro está vacío (por ejemplo, FRT==;), se omite el atributo MF_MT_SUBTYPE.
!= Permitir si el subtipo NO es igual al subtipo declarado.

Si el conjunto de filtros es un conjunto de filtros de exclusión, esta etiqueta no permitirá si el subtipo NO es igual al subtipo declarado.

Los operadores Igual o Menor que (<=) y Igual o Mayor que (>=) no se admiten para el Filtro de subtipo. Si se declara, el perfil no es válido y lo rechaza la canalización.

Valor de filtro de subtipo

El valor del filtro de subtipo puede ser la representación hexadecimal del valor FourCC, una declaración de cadena GUID si se usa un tipo de medio personalizado (también se puede usar un GUID de subtipo MFVideoFormat) o una etiqueta de subtipo conocida (vea la lista siguiente).

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

El valor de 0/GUID_NULL y ALL tiene un significado especial.

Significa "Todos los cuatro valores 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

Semánticamente SUT==; y SUT==0 tienen significados subdirecursos diferentes.

Cuando se usa en un filtro de inclusión, tienen el mismo efecto: Permitir cualquier subtipo. Pero cuando se usa en un filtro de exclusión, SUT==0 significa excluir todos los subtipos. Sin embargo, dado que esto tiene el mismo efecto que marcar todo el pin como deshabilitado (!), no hay ninguna razón para usar SUT==0 en un filtro de exclusión.

Etiquetas de subtipo conocidas

Etiquetas
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
MPG1
DVSL
DVSD
DVHD
DV25
DV50
DVH1
DVC
H264
H265
MJPG
420O
HEVC
HEVS
VP80
VP90
ORAW
H263
VP10
AV01
JPEG

Conjunto de filtros de exclusión

Todos los ejemplos de Conjunto de filtros hasta ahora son entradas de filtro inclusivas. Semánticamente "si un tipo de medio cumple los criterios, permita que el cliente consuma el tipo de medio".

Faltar en la discusión es el equivalente de "si un tipo de medio cumple los criterios, no permitir que el tipo de medio esté disponible para el cliente".

Para ello, necesitamos un conjunto de filtros de exclusión.

Si el conjunto de filtros está precedido de "!":

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

Es un conjunto de filtros de exclusión. Un conjunto de filtros de exclusión, si el tipo de medio coincide, se excluirá de la lista de tipos de medios disponibles.

Declarar varios conjuntos de filtros dará como resultado las comprobaciones de restricción de cada conjunto de filtros para que estén lógicamente oradas entre sí:

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

Exclusión frente a conjunto de filtros de inclusión

Como se muestra, un conjunto de filtros puede ser un conjunto de filtros de inclusión o un conjunto de filtros de exclusión. Se permite mezclar diferentes conjuntos de filtros, pero según el tipo de conjunto de filtros que se agregue, el significado del filtro de tipo de medio de anclaje puede cambiar:

  1. Si solo se declaran entradas de filtro de inclusión para un filtro de tipo de medio de anclaje, cualquier tipo de medio que no coincida con una de las entradas de filtro se excluirá de los tipos de medios disponibles.

  2. Si solo se declaran entradas de filtro de exclusión para un filtro de tipo de medio de anclaje, cualquier tipo de medio que no coincida con una de las entradas de filtro se incluirá de los tipos de medios disponibles.

  3. Si se declaran tanto entradas de inclusión como filtro de exclusión para un filtro de tipo de medio de anclaje, se incluye cualquier tipo de medio que coincida con un conjunto de filtros de inclusión, a menos que también coincida con un conjunto de filtros de exclusión. El conjunto de filtros de exclusión sustituye al conjunto de filtros de inclusión.

Para ilustrar este ejemplo, supongamos que para Pin0 tenemos los siguientes tipos de medios disponibles:

  • 1920x1080@60fps, NV12

  • 1920x1080@30fps, NV12

  • 1280x720@60fps, NV12

  • 1280x720@30fps, NV12

  • 640x360@60fps, NV12

  • 640x360@30fps, NV12

Si declaramos un conjunto de filtros de inclusión solo:

; 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 declaramos un conjunto de filtros de exclusión solo:

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

Si declaramos un conjunto de filtros de inclusión y exclusión:

; 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: Debido a la regla n.º 2 de la instrucción de procesamiento de filtros, el ejemplo final de "Permitir todos los tipos de medios excepto para 640x360@60fps NV12" puede ser para nuestro Pin0 de ejemplo:

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

Puesto que solo hay un conjunto de filtros de exclusión, se permiten todos los tipos de medios, excepto los tipos de medios que coinciden con el conjunto de filtros de exclusión.

Para ilustrar las entradas de filtro de inclusión y exclusión, se muestran algunos ejemplos más:

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

Especificación del desarrollador camera Profile V2