[D3D9] Direct3D Surface converteren naar Texture?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Adion
  • Registratie: Januari 2001
  • Laatst online: 31-07 16:44
Ik ben dus aan het proberen om DXVA te gebruiken om het decoden van video's in hardware te accelereren. Dezelfde techniek zou ook bruikbaar horen te zijn om beelden van een webcam rechtstreeks in DirectX te krijgen.

Ik gebruik hiervoor de Media Foundation Source Reader
Bij het openen van een bron kan je hierbij een Direct3DManager object meegeven wat er voor hoort te zorgen dat de decoder van je Direct3DDevice gebruik kan maken.

Het openen lukt, en bij het lezen (met IMFSourceReader->ReadSample) kan ik ook met success een IDirect3DSurface9 pointer van de sample verkrijgen. (via MFGetService)

Het probleem dat ik nu heb is echter dat ik maar niet kan vinden hoe ik een Direct3D Surface vervolgens nuttig kan gebruiken.
Wat ik geprobeerd heb is:
-Via UpdateSurface de eerste surface uit een texture met dezelfde grootte updaten. Dit resulteerde in D3DERR_INVALIDCALL, vermoedelijk omdat de bron-surface niet met D3DPOOL_SYSMEM is geinitializeerd.
-Via D3DXLoadSurfaceFromSurface de surface van een texture updaten. Dit lukt wel, maar dat lijkt enorm traag. (Applicatie gaat nog maar aan 5fps ofzo)

Als ik geen DX-acceleratie gebruik, en de SourceReader de conversie naar RGB laat doen, en vervolgens zelf de texture update via de uncompressed bytes dan lukt dat wel goed, en lukt dat zelfs behoorlijk aanvaardbaar.

Het lijkt me echter dat als ik al een Direct3D Surface heb die al in het videogeheugen zit dat het toch mogelijk moet zijn om deze op een efficiente manier verder in mijn applicatie te kunnen gebruiken?

VirtualDJ 2024 - Fast Image Resizer - Instagram


Acties:
  • 0 Henk 'm!

  • NC83
  • Registratie: Juni 2007
  • Laatst online: 08-07 22:30
Waarom creer je niet gewoon een texture en vraag deze om zijn surface vervolgens geef je deze surface pointer aan je MFGetService.

Met IDirect3DTexture9::GetSurfaceLevel geeft je een IDirect3DSurface** deze kan je dan meegeven aan je MFGetService. Je wil als level 0 mee geven waardoor je de top mip map surface krijgt.

[ Voor 42% gewijzigd door NC83 op 11-03-2011 23:10 ]

ex-FE Programmer: CMR:DiRT2,DiRT 3, DiRT Showdown, GRID 2, Mad Max


Acties:
  • 0 Henk 'm!

  • Adion
  • Registratie: Januari 2001
  • Laatst online: 31-07 16:44
Je kan niet meegeven in welke surface je de data wil, je kan enkel een pointer naar een bestaande surface terugkrijgen via MFGetSurface.
De pointer wijzigt dus, maar de oorspronkelijke surface blijft gewoon onaangetast in dat geval.

Update:
Een mogelijke oplossing gevonden: Door de texture die ik wil gebruiken te creeren als RenderTarget is het mogelijk om via StretchRect de surface van de reader te kopieren in de surface van de texture.
Als ik het goed begrijp gebeurd dit nu volledig in het videogeheugen.

[ Voor 37% gewijzigd door Adion op 13-03-2011 00:22 ]

VirtualDJ 2024 - Fast Image Resizer - Instagram