Lavorare con i Render Targets di Direct3D
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita dal MediaPlayer, dal IMFMediaEnginee dall'Acquisizione audio/video nella Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente di utilizzare MediaPlayer, IMFMediaEngine e Acquisizione audio/video in Media Foundation anziché DirectShowper lo sviluppo di nuovo codice, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.
Diversi sottotipi multimediali per le destinazioni di rendering Direct3D vengono definiti per l'uso con VMR-7 e VMR-9. Quando un filtro upstream propone una connessione con uno di questi sottotipi, indica al vmR che il rendering deve essere eseguito su una destinazione di rendering Direct3D. Per VMR-7, si tratta di una destinazione di rendering DirectX 7 Direct3D e per VMR-9 si tratta di una destinazione di rendering DirectX 9 Direct3D. Se il VMR è in modalità di miscelazione, la superficie sarà anche una texture Direct3D. Se VMR non è in modalità di mixaggio, la superficie sarà una normale superficie Direct3D. I formati pixel ARGB sono supportati solo quando il VMR è in modalità di miscelazione. I sottotipi di destinazione di rendering sono:
VMR-7 | VMR-9 |
---|---|
MEDIASUBTYPE_RGB32_D3D_DX7_RT | MEDIASUBTYPE_RGB32_D3D_DX9_RT |
MEDIASUBTYPE_RGB16_D3D_DX7_RT | MEDIASUBTYPE_RGB16_D3D_DX9_RT |
MEDIASUBTYPE_ARGB32_D3D_DX7_RT | MEDIASUBTYPE_ARGB32_D3D_DX9_RT |
MEDIASUBTYPE_ARGB4444_D3D_DX7_RT | MEDIASUBTYPE_ARGB4444_D3D_DX9_RT |
MEDIASUBTYPE_ARGB1555_D3D_DX7_RT | MEDIASUBTYPE_ARGB1555_D3D_DX9_RT |
Questi tipi sono definiti nel file di intestazione uuids.h. I tipi di media MEDIASUBTYPE_RGB32 sono un formato RGBx888 e i tipi di media MEDIASUBTYPE_RGB16 sono un formato RGB565. Per altre informazioni su questi formati di pixel, vedere la documentazione della grafica DirectX.
Richiesta di superficie sbloccata
Il blocco e lo sblocco delle superfici DirectDraw sono operazioni di calcolo costose. Quando si utilizzano i sottotipi di media target di rendering Direct3D, il filtro upstream ha bisogno che le superfici siano sbloccate affinché possa operare su di esse con l'hardware grafico. Per evitare un'operazione di blocco e sblocco non necessaria, VMR supporta un nuovo flag nel metodo IMemAllocator::GetBuffer, AM_GBF_NODDSURFACELOCK, che istruisce VMR a non bloccare la superficie DirectDraw prima di passare un campione al filtro a monte. Quando si usa questo flag, le chiamate a IMediaSample::GetPointer avranno esito negativo perché non è presente alcun puntatore bloccato. Per ottenere l'accesso alla superficie DirectDraw, il filtro deve chiamare queryInterface sull'oggetto IMediaSample restituito e richiedere l'interfacciaIVMRSurface. Ovviamente, il filtro upstream deve garantire che la superficie non sia bloccata quando rilascia nuovamente il campione nell'elenco libero.