10
votes

Comment utiliser les scalers vidéo matériels?

Les cartes graphiques modernes ont des scalers vidéo matériels, par exemple dans le cadre d'AMD Avivo, Nvidia Purevideo ou Intel Clearvideo. Par exemple, AMD's whiteaper Avivo dit:

"Les scrapeurs de sortie d'image prennent en charge jusqu'à 6 robinets de filtres verticaux et en hausse à 10 robinets de filtres horizontaux. Ces scalers sont de haute précision les effaceurs polyphases hautement programmables; ils conviennent à upcaling par pratiquement n'importe quel ratio ou pour la réduction des effectifs jusqu'à 4: 1. "

La question: Comment le matériel vidéo peut-il être utilisé à partir d'un programme Windows?

Supposons qu'il existe déjà une image vidéo décodée, par exemple dans un IDIRECT3DSURFace9 , et l'objectif est d'afficher ce cadre vidéo à l'écran à l'aide du daler matériel. J'aimerais utiliser une API Windows comme Media Foundation ou DirectShow, plutôt que des API spécifiques au fournisseur si possible. Je suis principalement intéressé par UpScaling par un facteur assez important autour de 1,5-3x.

Une question secondaire est, comment les paramètres de matériel vidéo peuvent-ils être contrôlés? (Par exemple, les coefficients de filtrage dans les filtres polyphases mentionnés ci-dessus)

EDIT: Bounty a commencé. Veuillez fournir un exemple de quelque manière que ce soit d'utiliser le matériel vidéo Scaler dans la carte vidéo (ceci peut être spécifique au fournisseur ou utiliser une version d'API de Foundation DirectX / DirectShow / Media).

Modifier: Mise à jour: Quelques exemples de programmes utilisant le matériel vidéo Scaler: WINDVD, PowerDVD, MADVR. Je veux savoir comment accomplir ce qu'ils font, ce qui est d'utiliser le matériel vidéo du GPU intégré de scaler, pas un scaler mis en œuvre en utilisant les shaders D3D et échantillonneurs de texture.


0 commentaires

3 Réponses :


0
votes

Direct2D Microsoft est-il moyen d'avoir accès au matériel graphique, bien que indirectement. Direct2D Transform fait la mise à l'échelle. Vous n'aurez aucun contrôle direct sur le refleer vidéo, mais vous devez faire confiance au pilote pour choisir les paramètres corrects pour vous.


3 commentaires

@Alexi, les liens que j'ai fournis parlent spécifiquement d'utiliser le matériel graphique, mais malheureusement, n'entrez pas dans les détails. En fait, il utilise probablement les capacités 3D plutôt que la vidéo spécifiquement car elle est superposée sur Direct3D. Je ne suis pas sûr du matériel graphique cependant, pourrait-il être que les mêmes voies sont utilisées aux deux fins?


Je crois qu'ils ne sont pas les mêmes. Les scalers vidéo (selon divers feuilles de spécifications) utilisent un filtre multitap avec beaucoup plus de robinets que tout disponible dans l'échantillonneur de texture 3D, il s'agit probablement d'une unité matérielle distincte.


@Alexi - J'ai vérifié et tu as raison. Direct2D serait comme utiliser un échantillonneur de texture pour effectuer le redimensionnement (ne pas utiliser les composants matériels intégrés pour la mise à l'échelle, le décodage, etc.).



2
votes

Pour simplement accéder au matériel - Direct2D (Direct3D est probablement un meilleur choix) va bien. Mais pour accéder au scalteur vidéo, vous devez utiliser DirectShow ou Windows Media Foundation (je n'ai pas beaucoup utilisé cela).

AFAIK - Le filtre "Resizer DMO" accédera au matériel correct et effectuera la redimensionnement de la vidéo pour vous. ici est un échantillon de code qui utilise ce filtre.

edit: Si vous utilisez des MFT, le filtre de processeur vidéo doit également être aussi efficace. Comme indiqué dans la documentation ", le processeur vidéo prend en charge le traitement vidéo accéléré GPU, à l'aide de Microsoft Direct3D 11. Pour plus d'informations, voir mf_sa_d3d11_aware ."

Aussi - voir Cette section sur les attributs matériels MFT, en particulier mft_enum_hardware_url_atribute que vous permet de vérifier si ce MFT est implémenté dans du matériel ou non . Notez que DXVA s'intègre à la Fondation Media et expose ses fonctionnalités en tant que MFTS. Donc, un MFT qui est implémenté dans du matériel est très probablement en utilisant le matériel sous-jacent et est la méthode utilisée par Windows elle-même.

J'espère que cela vous aidera!



2
votes

Certaines des approches possibles sont:

  1. Utilisez MFCreateDorenderer pour créer un évier multimédia EVR et appeler imfvideodisplayControl :: SetrenderingPrafs avec mfvideorenderprefs_alowscaling Set d'indicateur (ou utilisez imfattributes et définissez le evrconfig_alowscaling attribut) puis appelez imfvideodisplayControl :: SetVideoposition Pour définir la manière dont le résultat est mis à l'échelle. Cela fait partie du rendu vidéo amélioré (EVR).

  2. Utilisez IdirectXVideoProcesseur :: VideoProcessblt et Set DXVA2_Videoprocessbltparams :: Contriction Constriction Pour définir la manière dont le résultat est mis à l'échelle. Ceci est également basé sur EVR / DXVA.

  3. (suggéré par ananthonline) Utilisez Video Reifizer DSP et utilisez IWMResizerProps :: SETFULLELCROPREGION (ou MFPKEY_RESIZE_DST_WIDTH et MFPKEY_RESIZE_DST_HEIGHT ) pour augmenter le résultat. Ceci est à la fois un objet DirectX Media Object (DMO) et une transformation de la fondation multimédia (MFT). Remarque: une vidéo MFT a l'attribut MF_SA_D3D_AWARE qui peut être utilisé pour interroger s'il prend en charge l'accélération matérielle DirectX 3D, ce qui peut être activé en l'envoyant le message mft_message_set_d3d_message_set_d3d_Manager .

  4. Utilisez Processeur vidéo MFT et définir Imfvideoprocessorcontrol :: SetConstrictionSize Pour réduire le résultat. C'est un mft.

  5. Utilisez un périphérique 3D DirectX 3D et appelez STRETTRECT pour balancer une surface. Remarque: Ceci n'utilise évidemment pas le matériel scaler , il utilise le matériel Sampler Texture. Une texture peut être rendue sur un quad avec un effet similaire.

    Je ne suis toujours pas sûr qui, le cas échéant, de ces approches utilise le matériel de scaler vidéo. Il est probable qu'au moins approcher 1 et 2, car ils sont liés directement à EVR / DXVA; Les approches 3 et 4 pourraient également s'ils sont accélérés par DXVA. Une réponse définitive est toujours nécessaire, idéalement avec une référence à la documentation et / ou à un échantillon de code.


1 commentaires

Merci! Direct3D avec la méthode 2 (DXVA2_Videoprocrocessbltparams :: Contriction) fonctionne pour moi!