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: P>
"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. " P> blockQuote>
La question: Comment le matériel vidéo peut-il être utilisé à partir d'un programme Windows? strong> p>
Supposons qu'il existe déjà une image vidéo décodée, par exemple dans un
IDIRECT3DSURFace9 code>, 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 Strong> par un facteur assez important autour de 1,5-3x. P>
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) P>
EDIT: strong> 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). P>
Modifier: strong> 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 em> un scaler mis en œuvre en utilisant les shaders D3D et échantillonneurs de texture. P>
3 Réponses :
Direct2D A > 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. P>
@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.).
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). P>
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. P>
edit: strong> 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 ." P>
Aussi - voir Cette section sur les attributs matériels MFT, en particulier mft_enum_hardware_url_atribute que J'espère que cela vous aidera! P>
Ceci est prometteur. Les documents "Video Reifizer DSP" sont ici: msdn.microsoft.com/en-us/library/windows/desktop/windows/desktop/.../a> est disponible comme une transformation DMO ou MF. La seule option (autre que la largeur d'entrée et de sortie, la culture, etc.) est MFPKey_Resize_quality, qui peut être "élevée" ou "faible". Comment savons-nous que cela utilise le matériel? Comment cela diffère-t-il de la vidéoprocessblt en termes de mise en œuvre sous-jacente?
Regardez la section ci-dessus qui pointe sur mft_hardware_url_attribute. Cela indiquera si le MFT en question est mis en œuvre dans du matériel. Pour accéder spécifiquement à l'accacteur vidéo particulier, vous allez probablement devoir écrire du code spécifique à un périphérique et peut-être besoin d'informations de pilote propriétaires. C'est probablement le meilleur que vous puissiez faire à partir d'une API de haut niveau Hardware-agnostique.
Priorité attribuée parce que vous avez suggéré de nouvelles approches.
J'avais essayé un filtre de processeur vidéo qui utilise Direct3D11, ma carte graphique de test est basée sur Intel basée sur Intel, qui ne supporte que Direct3D 10.1. et doit prendre en charge la plate-forme Windows 7, alors seule la solution semble être directrémique.
Certaines des approches possibles sont: p>
Utilisez Utilisez IdirectXVideoProcesseur :: VideoProcessblt et Set (suggéré par ananthonline) Utilisez Video Reifizer DSP et utilisez Utilisez Processeur vidéo MFT et définir Utilisez un périphérique 3D DirectX 3D et appelez 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. P> MFCreateDorenderer Code> pour créer un évier multimédia EVR et appeler imfvideodisplayControl :: SetrenderingPrafs avec
mfvideorenderprefs_alowscaling code> Set d'indicateur (ou utilisez
imfattributes CODE> et définissez le
evrconfig_alowscaling code> 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). P> li>
DXVA2_Videoprocessbltparams :: Contriction Constriction Code> Pour définir la manière dont le résultat est mis à l'échelle. Ceci est également basé sur EVR / DXVA. P> LI>
IWMResizerProps :: SETFULLELCROPREGION CODE> (ou
MFPKEY_RESIZE_DST_WIDTH code> et
MFPKEY_RESIZE_DST_HEIGHT code>) 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 code>. P> li>
Imfvideoprocessorcontrol :: SetConstrictionSize Code> Pour réduire le résultat. C'est un mft. P> li>
STRETTRECT code> pour balancer une surface. Remarque: Ceci n'utilise évidemment pas le matériel scaler em>, il utilise le matériel Sampler Texture. Une texture peut être rendue sur un quad avec un effet similaire. P> li>
ol>
Merci! Direct3D avec la méthode 2 (DXVA2_Videoprocrocessbltparams :: Contriction) fonctionne pour moi!