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?
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?