Compartilhar via


Design detalhado para IHVs e OEMs (Perfil de Câmera V2)

Para ajudar a entender o novo esquema do Perfil de Câmera V2, começamos com uma declaração de perfil simples e dissecamos para entender as seções individuais.

Usamos uma câmera hipotética que dá suporte ao novo perfil de Alta Taxa de Quadros. Primeiro, definimos algumas restrições de hardware hipotéticas para nosso dispositivo.

  1. O pino de visualização é o pino 0. No KSFILTER_DESCRIPTOR definido pelo driver da câmera, quando a matriz de KSPIN_DESCRIPTOR_EX é definida, o primeiro KSPIN_DESCRIPTOR_EX é o descritor do pino de visualização. Da mesma forma, o pino 1 é Pino de captura e o pino 2 é Pino de foto.

  2. Devido à limitação de hardware, o dispositivo em questão não pode lidar com o dimensionamento com taxas de quadros de 60 fps ou superiores. Portanto, os fluxos De visualização e captura devem ter a mesma resolução.

  3. Da mesma forma, o dispositivo também não pode lidar com a conversão de espaço de cor por 60 fps ou superior, portanto, o subtipo deve ser o mesmo entre Visualizar e Capturar.

  4. A câmera é capaz de transmitir vídeo 4K 16x9 a 60 fps. A câmera também é capaz de 3840x2880@60fps (vídeo 4:3 a 60 fps).

  5. A câmera não é capaz de fornecer nenhuma operação de foto ao executar a 60 fps.

  6. Além do Perfil de Alta Taxa de Quadros, declaramos um Perfil de Gravação de Vídeo.

  7. O Perfil de Gravação de Vídeo permite qualquer combinação de tipos de mídia, mas nenhum tipo de mídia com mais de 30 fps.

  8. O Perfil de Gravação de Vídeo também dá suporte a uma única operação de foto (por exemplo, sequência não foto).

Para declaração baseada em INF, na seção DDInstall.Interfaces, a diretiva AddReg é usada para publicar as informações do perfil.

Cada Filtro de Tipo de Mídia de Fixação deve receber um nome de entrada do Registro. Esse nome deve ser MTF# em que # representa um valor inteiro. O valor inteiro não precisa ser sequencial, apenas exclusivo, pois representa um valor nomeado no registro do sistema operacional.

Considerando essas restrições, podemos declarar o seguinte perfil:

[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 o suporte ao Perfil de Câmera V2, declare a versão do perfil:

A entrada OEMCameraProfileVersion define nossa versão de perfil e, para essa revisão da especificação, deve ser 2:

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

Se a entrada do registro OEMCameraProfileVersion não estiver presente e a entrada OEMCameraProfile estiver presente, o pipeline retornará ao esquema do Perfil da Câmera 1507.

Isso garante a compatibilidade com versões anteriores com perfis de câmera existentes.

Quando a entrada OEMCameraProfileVersion estiver disponível, todas as informações existentes do Perfil de Câmera 1507 serão ignoradas e somente o Perfil da Câmera V2 será processado.

Observação: se a entrada OEMCameraProfileVersion estiver definida como 2, mas nenhuma declaração de Perfil de Câmera V2 for encontrada, os perfis não serão publicados.

Depois de declarados, todos os perfis devem ser armazenados na chave do Registro de Perfis no nó Interface do 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 deve ser uma subchave na chave Perfis usando a ID do Perfil.

A ID do perfil é uma combinação de Tipo de Perfil, Índice de Perfil.

O Tipo de Perfil pode ser uma das seguintes cadeias de caracteres ou pode ser uma cadeia de caracteres {GUID}:

  • KSCAMERAPROFILE_VideoRecording

  • KSCAMERAPROFILE_HighQualityPhoto

  • KSCAMERAPROFILE_BalancedVideoAndPhoto

  • KSCAMERAPROFILE_VideoConferencing

  • KSCAMERAPROFILE_PhotoSequence

  • KSCAMERAPROFILE_FaceAuth_Mode

  • KSCAMERAPROFILE_HighFrameRate

  • KSCAMERAPROFILE_HDRWithWCGVideo

  • KSCAMERAPROFILE_HDRWithWCGPhoto

  • KSCAMERAPROFILE_VariablePhotoSequence

  • KSCAMERAPROFILE_VideoHDR8

O Índice de Perfil pode ser qualquer valor de 0 a 0x7FFFFFFF. Os valores de índice com o conjunto de bits de ordem alta são reservados para uso interno.

A base do Perfil de Câmera V2 é dividida em duas entradas de esquema main:

  • Restrições de perfil

  • Fixar filtros de tipo de mídia

Restrição de perfil

Restrições de perfil é uma declaração de todo o perfil que influencia o processamento de Filtros de Tipo de Mídia de Fixação. Essas são as seis marcas com suporte. Eles podem aparecer em qualquer ordem separada por um ";":

Restrição de perfil Descrição
LRS Bloquear Resolução em todos os pinos. Todos os pinos declarados no perfil devem ter a mesma resolução quando ativos.
LFR Bloquear Taxa de Quadros em todos os pinos. Todos os pinos declarados no perfil devem ter a mesma taxa de quadros quando ativos.
LST Bloquear Subtipo em todos os pinos. Todos os pinos declarados no perfil devem ter o mesmo subtipo quando ativos.
AAR Aplique a declaração de perfil de nível de fixação a todas as proporções.

A filtragem baseada em resolução é feita usando o produto Width * Height da resolução e esse produto é usado como um valor para comparação. No entanto, se a marca AAR não estiver definida, a comparação só será feita para as resoluções com a mesma taxa de proporção.
DIS Desabilitado. Se essa Restrição for usada para a Restrição de Perfil, o Filtro de Tipo de Mídia de Fixação será ignorado e será tratado como uma sintaxe de perfil inválida.

Essa marca pode não ser combinada com nenhuma outra marca de Restrição de Perfil.
UAR Permitir combinação arbitrária de proporções de resolução entre pinos.

Por padrão, as proporções entre pinos devem ser as mesmas. Essa marca remove essa restrição padrão.

Observação: os aplicativos são incentivados a manter a mesma taxa de proporção entre os pinos disponíveis.

Se a marca UAR não estiver definida em uma declaração de perfil, toda a taxa de proporção entre os pinos deverá ser a mesma. Especificamente, não há suporte para streaming de visualização às 16:9 enquanto tira uma foto ou transmissão do pino captura às 4:3. As tentativas de fazer isso resultarão em um erro.

Processando o perfil de exemplo acima:

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

A Restrição de Perfil indica que para o perfil [KSCAMERAPROFILE_HighFrameRate,0], as resoluções e o subtipo em todos os pinos devem ser os mesmos. Isso corresponde à restrição HW da câmera hipotética (sem conversão de espaço em escala/cor ao executar a 60 fps ou superior).

Restrições do codificador

Um conjunto opcional de Restrições de Perfil pode conter parâmetros de codificador recomendados para aplicativos que optam por selecionar um perfil para operações de codificação de vídeo. Por exemplo, um IHV/OEM pode optar por recomendar o uso de HEVC sobre H264 para determinados sistemas quando um tipo de mídia excede um limite predeterminado em termos de resolução e/ou taxa de quadros.

Além disso, como o codificador HW presente no computador pode fornecer uma operação mais ideal quando configurado com os parâmetros de codificação, o OEM pode optar por criar um perfil com mais "dicas" para o aplicativo.

Para facilitar esse suporte, as seguintes restrições adicionais podem ser adicionadas a qualquer perfil.

Subtipo codificado preferencial

A seguinte lista de subtipos é o Subtipo Codificado Preferencial para o codificador:

  • eSPSubtype_H264

  • eSPSubtype_HEVC

Essas duas restrições são mutuamente exclusivas. Somente um pode ser declarado. Declarar ambos resultará em um perfil inválido e será rejeitado.

Quando a Restrição de Subtipo Codificado Preferencial é declarada, o repositório de atributos MF do IMFSensorProfile expõe o subtipo codificado preferencial declarado com o atributo MF_MT_SUBTYPE.

Perfil de Codificador Preferencial

A lista de perfis de codificador preferencial a seguir corresponde à enumeração 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

A declaração de Perfis de Codificador Preferencial acima é mutuamente exclusiva. Somente um pode ser declarado. Declarar mais de um resultará em um perfil inválido e será rejeitado.

Quando a Restrição de Perfil de Codificador Preferencial é declarada, o repositório de atributos MF do IMFSensorProfile expõe o Perfil de Codificador Preferencial declarado com o atributo MF_MT_MPEG2_PROFILE.

OBSERVAÇÃO: os perfis eSPProfileH265 são válidos apenas para subtipos codificados em HEVC.

A Restrição de Contagem de BFrame Recomendada fornece uma maneira de o OEM indicar a contagem de quadros B recomendada para o vídeo codificado:

  • eSPBFCount_X

Onde X representa a Contagem de BFrame: por exemplo, eSPBFCount_0 indica 0 Contagem de Quadros B.

Quando a Restrição de Contagem de BFrame Recomendada é declarada, o repositório de atributos MF do IMFSensorProfile expõe a Contagem de BFrame Recomendada declarada com o atributo CODECAPI_AVEncMPVDefaultBPictureCount.

A Restrição de Taxa de Bits Recomendada fornece uma maneira para o OEM especificar uma taxa média de bits de codificação (ao usar um modo de controle de taxa de codificação apropriado) e/ou taxa máxima de bits:

  • eSPBitRate_XXXXX

  • eSPMaxBitRate_XXXXX

Essas duas restrições podem ser especificadas independentemente ou juntas. O XXXXX representa a taxa de bits em Kbps. Por exemplo, eSPBitRate_5000 representa 5.000.000 bits por segundo.

O eSPBitRate_XXXXX, quando especificado pelo OEM, será exposto por meio do repositório de atributos MF do IMFSensorProfile por meio do atributo CODECAPI_AVEncCommonMeanBitRate.

O eSPMaxBitRate_XXXXX quando especificado pelo OEM, será exposto por meio do repositório de atributos MF do IMFSensorProfile por meio do CODECAPI_AVEncCommonMaxBitRate.

Restrição de codificador de exemplo

O inf de exemplo a seguir mostra como um OEM pode declarar as restrições do 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"

A restrição de codificador de exemplo acima resultaria no repositório de atributos de MF imfSensorProfile do perfil KSCAMERAPROFILE_VideoRecording,0 (consulte a descrição da API abaixo) que contém os vários atributos do codificador da seguinte maneira:

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

Na superfície da API do WinRT, esses mesmos atributos podem ser obtidos por meio de CameraProfile.Properties (consulte a descrição da API do WinRT abaixo).

Controles bloqueados

Os Controles Bloqueados permitirão que os OEM/IHVs desabilitem seletivamente determinados controles de câmera com base no perfil selecionado:

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

No exemplo acima, o KSCAMERAPROFILE_HighFrameRate,0 declara que Video HDR (VHDR), Photo Sequence (PHSEQ), um controle personalizado cujo KSPROPERTY. Set = {E0766E84-36A2-4945-906D-092ECBD87445} e KSPROPERTY.Id = 2, e não há suporte para Início Quente no Pin1.

Quando esse perfil é selecionado, o pipeline impede explicitamente que esses controles sejam emitidos para o Driver de Câmera/DMFT. Isso permite que o Driver de Câmera/DMFT exponha o suporte para todos os controles de câmera e o pipeline garantirá que o aplicativo que usa o perfil da câmera não tente tocar nos controles bloqueados.

Os Controles Bloqueados podem ser definidos usando uma das marcas abaixo para controles de câmera definidos ou podem usar um formato {GUID}, Id.

Marca Descrição do controle
PHSEQ Controle de Câmera Estendida – Sequência de Fotos

Observação: o bloqueio da sequência de fotos também bloqueará a Sequência de Fotos Variável.
QUENTE# Controle de Câmera Estendida – Controle de Início Quente.

# representa a ID do Pino na qual desabilitar o controle Início Quente.
CENA Controle de Câmera Estendido – Modo de Cena.
TOCHA Controle de Câmera Estendida – Modo Tocha.
FLASH Controle de Câmera Estendida – Modo Flash.
ISO Controle de câmera estendida – ISO
EVCOMP Controle de Câmera Estendida – Compensação de EV
WBAL Controle de câmera estendido – Saldo em branco
EXPOSIÇÕES Controle de Câmera Estendida – Exposição
FOCO Controle de Câmera Estendida – Foco
ROI Controle de Câmera Estendida – ROI
EXTZOOM Controle de Câmera Estendida – Zoom
ADVISO Controle de câmera estendido – ISO Avançado
VIDST Controle de Câmera Estendida – Estabilização de Vídeo
FACEDT Controle de câmera estendida – Detecção facial
VHDR Controle de câmera estendido – Vídeo HDR
OIS Controle de câmera estendido – Estabilização de imagem óptica
ADVPHOTO Controle de Câmera Estendido – Foto Avançada
FACEAUTH Controle de Câmera Estendida – Autenticação Facial
PROTEGER Controle de Câmera Estendido – Modo Seguro
VFP Controle de câmera estendido – VFR

Além dos Controles de Câmera Estendidos, os perfis também podem bloquear controles herdados nos conjuntos de controles PROPSETID_VIDCAP_VIDEOPROCAMP e PROPSETID_VIDCAP_CAMERACONTROL. PROPSETID_VIDCAP_VIDEOPROCAMP controles podem ser bloqueados usando:

VIDPROC#

Em que # representa a ID de controle:

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 exemplo: VIDPROC13 bloqueia o controle Frequência da Linha de Energia.

Da mesma forma, o PROPSETID_VIDCAP_CAMERACONTROL pode ser bloqueado com:

CAMCTRL#

Em que # representa a ID de controle:

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

Fixar Filtro de Tipo de Mídia

Passando para o perfil de exemplo, vemos um Filtro de Tipo de Mídia de Fixação para o perfil de Taxa de Quadros 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:(!)"

Na seção acima, Fixar0 (o pino de visualização) do perfil taxa de quadros alta, estamos permitindo qualquer taxa de resolução/quadro disponível no pino. Para nosso dispositivo hipotético, o driver não exporá nenhuma taxa de quadros maior que 30 fps para o pino de visualização.

Fixar números quando declarados usando um INF corresponde ao ordinal de índice baseado em 0 da estrutura de KSPIN_DESCRIPTOR_EX definida na estrutura de KSFILTER_DESCRIPTOR que os drivers de mini-portas AVStream anunciam.

Para interpretar o Filtro de Tipo de Mídia de Fixação e o Conjunto de Filtros correspondente, precisamos definir o esquema de sintaxe:

Essa definição de cadeia de caracteres usa o seguinte esquema de Filtro de Tipo de Mídia de Fixação. Quando [] são mostrados, a cadeia de caracteres incluída é opcional, caso contrário, toda a cadeia de caracteres declarada na sintaxe é obrigatória (a sintaxe de restrição não diferencia maiú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 pode assumir a forma de uma única representação hexadecimal do valor de Quatro CC (por exemplo, 0x3231564E == NV12), um {GUID} no caso de um tipo de mídia personalizado (chaves abertas/fechadas são necessárias e o GUID deve assumir a forma de: {55D24460-45B7-450E-829B-91A94FF84180} ou uma marca bem conhecido (NV12, YUY2 e assim por diante)).

A representação {GUID} também poderá ser usada para subtipos MFVideoFormat_* se um subtipo conhecido não tiver uma marca listada.

Para nosso exemplo:

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

Analisa para:

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

Isso é semanticamente: "Permitir todos os tipos de mídia".

Consulte Filtro de Taxa de Quadros abaixo para obter a definição de marcas individuais de Resolução, Taxa de Quadros e Subtipo.

Para Pin1 (o pin captura), a declaração Taxa de Quadros tem um 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:(!)"

Analisa para:

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

Somente tipos de mídia com taxa de quadros de 60 fps ou superiores seriam permitidos sob esse perfil para Pin1.

Enquanto para Pin2 (o pino de foto) não está disponível:

[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 a sintaxe implica, um Filtro de Tipo de Mídia de Pino pode ser opcionalmente uma única declaração (!), o que implica que, para esse pino, não há formato de mídia com suporte (pinos sem tipos de mídia com suporte ficarão ocultos no cliente).

Passando para o perfil de Gravação de Vídeo, mais uma vez, não temos restrições no pino Visualização, pois nossa câmera hipotética expõe apenas 30 fps de visualização apenas com tipos de mídia que têm a garantia de serem simultâneos em cenários de Gravação de Vídeo ou Alta Taxa de Quadros.

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

No entanto, para o pin captura, precisamos limitar isso a apenas 30 fps tipos de mídia porque não podemos dar suporte a taxas de quadros mais altas para resoluções diferentes entre operações de Visualização e Captura nem 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))"

Isso é feito usando a marca Taxa de Quadros Igual a Menor que (FRT<=) e especificando uma taxa de quadros de 30 fps.

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

Analisa para:

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

Para Pino de foto, não declaramos nenhum suporte à Sequência de Fotos declarando o BlockedControls com PHSEQ como o controle a ser não permitido.

; 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

Na seção anterior, examinamos vários Conjuntos de Filtros e explicamos o que algumas dessas cadeias de caracteres de esquema representam. Neste ponto, é necessário descrever a sintaxe de esquema do Conjunto de Filtros para discussão posterior.

Cada Conjunto de Filtros consiste em um conjunto específico de declaração para Resolução, Taxa de Quadros e Subtipo. Esse trio de declaração, na ordem especificada, é necessário para um Conjunto de Filtros válido.

Um Filtro de Tipo de Mídia de Fixação pode consistir em várias Entradas de Filtro:

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

Se um Conjunto de Filtros não atender a esse esquema, toda a declaração de perfil será rejeitada.

Todas as cadeias de caracteres do Esquema de Perfil não diferenciam maiúsculas de minúsculas.

Cada Filtro deve ser separado por um ";" e o trio de Filtro de Resolução, Filtro de Taxa de Quadro e Filtro de Subtipo deve ser limitado por um parêntese aberto/próximo.

Outro exemplo de um 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))

Conforme mostrado no segundo exemplo acima, para vários Conjuntos de Filtros em um pin, a comparação é feita com um OR lógico dos dois Conjuntos de Filtros. Por exemplo, se um tipo de mídia corresponder a um dos dois Conjuntos de Filtros, ele será permitido.

Observação: para facilitar a capacidade de leitura da declaração, o Conjunto de Filtros pode ser descrito em várias linhas. Para fazer isso, eles devem ter o mesmo Pin# a ser agrupado:

; 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 idêntico à declaração acima. No entanto, cada linha deve ter uma entrada MTF# exclusiva.

Disabled Pin

Filtro de Resolução

Conforme definido nos Termos do Documento, o Filtro de Resolução define como filtrar com base no atributo MF_MT_FRAME_SIZE de um IMFMediaType.

A sintaxe filtro de resolução:

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

Atributo filtro de resolução

O atributo filtro de resolução usa a cadeia de caracteres RES. Essa cadeia de caracteres não diferencia maiúsculas de minúsculas.

Operadores de comparação de filtro de resolução

Veja a seguir os operadores com suporte:

Operadores de comparação Descrição
== Permite se Resolução for igual à resolução declarada.

Se o Conjunto de Filtros for um Conjunto de Filtros de Exclusão, essa marca não permitirá se a Resolução for igual à resolução declarada.

Observação: se a declaração usar o operador == e o Valor do Filtro estiver vazio (por exemplo, RES==;), o atributo MF_MT_FRAME_SIZE será ignorado.
<= Permitir se Resolução igual ou menor que a resolução declarada.

A comparação de resolução é feita com base na contagem total de pixels (produto de Width *Height) e com base na taxa de proporção.

Se o AAR for declarado na Restrição de Perfil, a contagem total de pixels será aplicada a todas as taxas de proporção. Caso contrário, apenas as taxas de proporção correspondentes.

Se o Conjunto de Filtros for um Conjunto de Filtros de Exclusão, essa marca não permitirá se a Resolução for igual ou menor que a resolução declarada.
>= Permitir se Resolução igual ou maior que a resolução declarada.

A comparação de resolução é feita com base na contagem total de pixels (produto de Width * Height) e com base na taxa de proporção.

Se o AAR for declarado na Restrição de Perfil, a contagem total de pixels será aplicada a todas as taxas de proporção. Caso contrário, apenas as taxas de proporção correspondentes.

Se o Conjunto de Filtros for um Conjunto de Filtros de Exclusão, essa marca não permitirá se a Resolução for igual ou maior que a resolução declarada.
!= Permitir se a Resolução NÃO for igual à resolução declarada.

Se o Conjunto de Filtros for um Conjunto de Filtros de Exclusão, essa marca não permitirá se a Resolução NÃO for igual à resolução declarada.

Valor do Filtro de Resolução

A Largura e a Altura do Valor do Filtro de Resolução devem estar no formato decimal separado por uma vírgula (",") sem espaço em branco:

; 1080p only.
RES==1920,1080

O exemplo a seguir:

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

Corresponderá apenas à resolução 16:9 igual ou menor que 1080p se a marca AAR não for declarada na Restrição de Perfil. No entanto, se o AAR for declarado, ele corresponderá a toda a resolução cujo produto de Width * Height é igual ou menor que (1920 * 1080 = 2073600).

Por exemplo:

  • Se o AAR não for declarado, essa entrada corresponderá a 720p, mas não a 1280x960.

  • Se o AAR for declarado, essa entrada corresponderá a 720p, 1280x960 e todas as resoluções inferiores.

Se o AAR não for declarado para garantir correspondências de resolução seletiva para a taxa de proporção de 16:9 e 4:3, vários Conjuntos de Filtros poderão ser usados:

; 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 corresponder a todas as resoluções, especifique igual ou maior que 0,0

; Match all resolutions.
RES>=0,0

Filtro de taxa de quadros

Conforme definido nos Termos do Documento, o Filtro de Taxa de Quadros define como filtrar com base no atributo MF_MT_FRAME_RATE de um IMFMediaType.

Sintaxe de Filtro de Taxa de Quadros:

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

Atributo de filtro de taxa de quadros

O Atributo de Filtro de Taxa de Quadros usa a cadeia de caracteres FRT. Essa cadeia de caracteres não diferencia maiúsculas de minúsculas.

Operadores de comparação de filtro de taxa de quadros

Estas são as marcas de Taxa de Quadros com suporte:

Operadores de comparação Descrição
== Permitir se a Taxa de Quadros for igual à Taxa de Quadros declarada.

Se o Conjunto de Filtros for um Conjunto de Filtros de Exclusão, essa marca não permitirá se a Taxa de Quadros for igual à Taxa de Quadros declarada.

Observação: se a declaração usar o operador == e o Valor do Filtro estiver vazio (por exemplo, FRT==;), o atributo MF_MT_FRAME_RATE será ignorado.
<= Permitir se a Taxa de Quadros for igual ou menor que a Taxa de Quadros declarada.

Se o Conjunto de Filtros for um Conjunto de Filtros de Exclusão, essa marca não permitirá se a Taxa de Quadros for igual ou menor que a Taxa de Quadros declarada.
>= Permitir se a Taxa de Quadros for igual ou maior que a Taxa de Quadros declarada.

Se o Conjunto de Filtros for um Conjunto de Filtros de Exclusão, essa marca não permitirá se a Taxa de Quadros for igual ou maior que a Taxa de Quadros declarada.
!= Permitir somente se a Taxa de Quadros NÃO for igual à Taxa de Quadros declarada.

Se o Conjunto de Filtros for um Conjunto de Filtros de Exclusão, essa marca não permitirá se a Taxa de Quadros NÃO for igual à Taxa de Quadros 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==;e FRT>=0,0 têm diferenças semânticas sutis.

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

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

A diferença entre FRT==; e FRT>=0,0 é o primeiro tem o mesmo significado para Conjunto de Filtros de Inclusão e Conjunto de Filtros de Exclusão. Enquanto o significado de FRT>=0,0 será alterado dependendo se é um Conjunto de Filtros de Inclusão ou um Conjunto de Filtros de Exclusão.

Consulte Conjunto de Filtros para obter a explicação do Conjunto de Filtros de Exclusão.

Filtro de subtipo

Filtro de Subtipo define como filtrar com base no atributo MF_MT_SUBTYPE de um IMFMediaType.

Sintaxe de filtro de subtipo:

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

Atributo de filtro de subtipo

O Atributo de Filtro de Subtipo usa a cadeia de caracteres SUT. Essa cadeia de caracteres não diferencia maiúsculas de minúsculas.

Operadores de comparação de filtro de subtipo

Há suporte para os seguintes Operadores de Comparação:

Operadores de comparação Descrição
== Permitir se o Subtipo for igual ao Subtipo declarado.

Se o Conjunto de Filtros for um Conjunto de Filtros de Exclusão, essa marca não permitirá se o Subtipo for igual ao Subtipo declarado.

Observação: se a declaração usar o operador == e o Valor do Filtro estiver vazio (por exemplo, FRT==;), o atributo MF_MT_SUBTYPE será ignorado.
!= Permitir se o Subtipo NÃO for igual ao Subtipo declarado.

Se o Conjunto de Filtros for um Conjunto de Filtros de Exclusão, essa marca não permitirá se o Subtipo NÃO for igual ao Subtipo declarado.

Os operadores Equal ou Less Than (<=) e Equal ou Greater Than (>=) não são compatíveis com o Filtro de Subtipo. Se declarado, o perfil é inválido e rejeitado pelo pipeline.

Valor do filtro de subtipo

O Valor do Filtro de Subtipo pode ser a representação hexadecimal do valor FourCC, uma declaração de cadeia de caracteres GUID se um tipo de mídia personalizado for usado (o GUID do subtipo MFVideoFormat conhecido também pode ser usado) ou uma marca subtipo conhecida (veja a lista abaixo).

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

O valor de 0/GUID_NULL e ALL tem um significado especial.

Significa "Todos os quatro 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

Semanticamente SUT==; e SUT==0 têm significados sutilmente diferentes.

Quando usados em um filtro de Inclusão, eles têm o mesmo efeito: Permitir qualquer subtipo. Mas quando usado em um filtro de exclusão, SUT==0 significa excluir todos os subtipos. No entanto, como isso tem o mesmo efeito que marcar o pino inteiro como desabilitado (!), não há motivo para usar SUT==0 em um filtro de exclusão.

Marcas de subtipo conhecidas

Marcações
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 Exclusão

Todos os exemplos de Conjunto de Filtros até agora são Entradas de Filtro Inclusivo. Eles são semanticamente "se um tipo de mídia atender aos critérios, permita que o tipo de mídia seja consumido pelo cliente".

Ausente da discussão é o equivalente a "se um tipo de mídia atender aos critérios, não permitir que o tipo de mídia seja disponibilizado para o cliente".

Para isso, precisamos de um Conjunto de Filtros de Exclusão.

Se o Conjunto de Filtros for precedido por um "!":

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

É um conjunto de filtros de exclusão. Um Conjunto de Filtros de Exclusão, se o tipo de mídia corresponder, será excluído da lista de tipos de mídia disponíveis.

Declarar vários Conjuntos de Filtros resultará nas verificações de restrição de cada Conjunto de Filtros a serem logicamente or-ed entre si:

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

Exclusão vs. Conjunto de Filtros de Inclusão

Conforme mostrado, um Conjunto de Filtros pode ser um Conjunto de Filtros de Inclusão ou um Conjunto de Filtros de Exclusão. A combinação de conjunto de filtros diferente é permitida, mas dependendo de qual tipo de Conjunto de Filtros é adicionado, o significado do Filtro de Tipo de Mídia de Fixação pode mudar:

  1. Se apenas as Entradas de Filtro de Inclusão forem declaradas para um Filtro de Tipo de Mídia de Pino, qualquer tipo de mídia que não corresponda a uma das Entradas de Filtro será excluído dos tipos de mídia disponíveis.

  2. Se apenas as Entradas de Filtro de Exclusão forem declaradas para um Filtro de Tipo de Mídia de Pino, qualquer tipo de mídia que não corresponda a uma das Entradas de Filtro será incluído nos tipos de mídia disponíveis.

  3. Se as Entradas de Filtro de Inclusão e Exclusão forem declaradas para um Filtro de Tipo de Mídia de Pino, qualquer tipo de mídia que corresponda a um Conjunto de Filtros de Inclusão será incluído, a menos que ele também corresponda a um Conjunto de Filtros de Exclusão. O Conjunto de Filtros de Exclusão substitui o Conjunto de Filtros de Inclusão.

Para ilustrar este exemplo, vamos supor que para Pin0, temos os seguintes tipos de mídia disponíveis:

  • 1920x1080@60fps, NV12

  • 1920x1080@30fps, NV12

  • 1280x720@60fps, NV12

  • 1280x720@30fps, NV12

  • 640x360@60fps, NV12

  • 640x360@30fps, NV12

Se declararmos apenas um Conjunto de Filtros de Inclusão:

; 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 declararmos apenas um Conjunto de Filtros de Exclusão:

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

Se declararmos um conjunto de filtros de inclusão e exclusão:

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

Observação: devido à regra nº 2 na instrução de processamento de filtro, o exemplo final de "Permitir todos os tipos de mídia, exceto 640x360@60fps NV12", pode ser para nosso pin0 de exemplo:

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

Como apenas um Conjunto de Filtros de Exclusão está presente, todos os tipos de mídia são permitidos, exceto para os tipos de mídia que correspondem ao Conjunto de Filtros de Exclusão.

Para ilustrar as Entradas de Filtro de Inclusão e Exclusão, mais alguns exemplos:

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

Especificação do desenvolvedor do Perfil de Câmera V2