Frage

Ich habe den ganzen Tag recherchiert und bin nicht sehr weit gekommen. Ich bin unter Windows 7, verwendete DirectX 11. (Meine endgültige Ausgabe ist ein Video -Bild von Video auf einer DX11 -Textur) Ich möchte einige sehr große H.264 -Videodateien dekodieren, und die CPU (mit Libav) nicht Schneide es.

Ich habe mir die HWACCEL -Funktionen von Libav mit DXVA2 angesehen, aber ein Roadblock getroffen, wenn ich einen idirectXvideodeCoder erstellen muss, der nur mit einer D3D9 -Schnittstelle erstellt werden kann. (was ich nicht mit DX11 benutze)

Immer wenn ich die DXVA -Dokumentation nachgeschlagen habe, verweist sie nicht auf DX11, wurde dies in DX10 oder 11 entfernt? (Ich kann keine Bestätigung dafür finden, noch irgendwohin, dass DXVA2 überflüssig ist, möglicherweise, dass es von DXVA-HD überlagert wurde?)

Dann habe ich mich mit der Media Foundation SDK befasst, da das so aussieht, als ob ich für DX11 verwenden soll ... aber keiner der Typen gibt es in meinen Headern (die Dokumente sagen, nur einzuschließenu003Cd3d11.h> , aber das liefert nichts). Sie geben auch ein Minimum von Windows 8 an, um es zu verwenden.

Ich glaube, ich brauche MF. Ich brauche das Windows 8 SDK, das jetzt alle DirectX -Libs/Header enthält.

Dies hinterlässt also eine Lücke zu Windows 7 ... ist es möglich, hardware beschleunigte Videodecodierung zu erhalten? Und wenn ja, welche API soll ich verwenden?

Bearbeiten: Als ein weiteres Follow -up befindet sich meine Implementierung von MediaFoundation (und AVF, Android, Magic Leap usw.) in meinem Open -Source -Projekthttps://github.com/newchromantics/poph264Edit2: Aber ich weiß nicht, ob es Win7 unterstützt :)

War es hilfreich?

Lösung

D3D11 verfügt über eine Video -API, die im Grunde genommen DXVA2 mit einer leicht veränderten Schnittstelle oben ist. Sie brauchen einen guten Verständnis von H.264 Bitstreams, um fortzufahren (wirklich!). IE stellen Sie sicher, dass Sie einen H.264 -Parser zur Verfügung haben, um Felder der SPS- und PPS -Strukturen und aller Scheiben eines codierten Rahmens zu extrahieren.

1) Erhalten Sie ID3D11VideoDevice -Instanz von Ihrem ID3D11Device und ID3D11Videocontext aus Ihrem unmittelbaren D3D11 -Gerätskontext Hinweis: Auf Win7 müssen Sie Ihr Gerät mit Funktionsstufe 9_3 erstellen, um Videounterstützung zu erhalten! (In Win8 funktioniert es einfach)

2) Erstellen Sie eine ID3D11VideodeCoder -Instanz für H.264. Verwenden Sie ID3D11VideodeVice :: GetVideodeCoderProfileCount, GetVideodeCoderProfile, checkvideodeCoderformat ... um durch alle unterstützten Profile zu iterieren, und findet einen mit Guid D3d11_Decoder_Profile_H26_VLD_NOFGTOCHOCER. Als OutputFormat ist Ihre beste Wahl dxgi_format_nv12.

3) Decodierung der einzelnen Rahmen siehe Unterstützung von Direct3D 11 Video Decoding in Media Foundation:

  • ID3D11Videocontext :: DecoderBeginframe (Decoder, Ausgabeview -> Decodierte Frame -Textur)
  • Puffer füllen:
    • D3d11_video_decoder_buffer_picture_parameters
    • D3d11_video_decoder_buffer_inverse_quantization_matrix
    • D3d11_video_decoder_buffer_bitstream
    • D3d11_video_decoder_buffer_slice_control

Die Puffer sind mit den entsprechenden DXVA2 -Strukturen gefüllt (siehe DXVA2.H). Die vollständige DXVA2 -Spezifikation ist hier. Sie benötigen sie, um die H.264 -SPS/PPS -Felder entsprechend abzubilden.

Sehen:

Dann:

  • ID3D11Videocontext :: Subjektbuffer, um alle gefüllten Puffer zu begehen
  • ID3D11Videocontext :: Decoderendframe, um den aktuellen Frame zu beenden

3) D3D11_VIDEO_DECODER_BUFFER_PICTURE_PARAMETERS -Puffer enthält außerdem Informationen zu allen Referenzen Frames/Surface - Sie müssen sie selbst verwalten.

Es ist ziemlich kompliziert, überprüft FFMPEG und Media Player Classic, beide haben DXVA2 -Support (wenn auch nicht über DX11).

4) Konvertieren Sie von NV12 in RGB (A), einige GPUs (D3D11 -Feature -Ebenen) können NV12 als Shadereingang verwenden, einige nicht. Wenn es nicht möglich ist, NV12 direkt zu verwenden, sehen Sie sich die D3D11Videoprocessor-Schnittstellen an, die mit NV12/YUV420-> RGB-Konvertierung für alle GPUs mit D3D11-Unterstützung verfügen.

Die Konvertierung könnte in einem solchen Code durchgeführt werden:

// Setup ID3D11Video*
ID3D11VideoProcessor * d3dVideoProc = ...;
ID3D11VideoDevice    * d3dVideoDevice = ...;
ID3D11VideoProcessorEnumerator * d3dVideoProcEnum = ...;


ID3D11Texture2D * srcTextureNV12Fmt = ...;
ID3D11Texture2D * dstTextureRGBFmt = ...;

// Use Video Processor

// Create views for VideoProc In/Output
ID3D11VideoProcessorInputView * videoProcInputView;
ID3D11VideoProcessorOutputView * videoProcOutputView;

{

    D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC inputViewDesc = { 0 };
    inputViewDesc.ViewDimension = D3D11_VPIV_DIMENSION_TEXTURE2D;
    inputViewDesc.Texture2D.ArraySlice = arraySliceIdx;
    inputViewDesc.Texture2D.MipSlice = 0;
    hr = d3dVideoDevice->CreateVideoProcessorInputView(srcTextureNV12Fmt, d3dVideoProcEnum, &inputViewDesc, &videoProcInputView);
}


{
    D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC outputViewDesc = { D3D11_VPOV_DIMENSION_TEXTURE2D };
    outputViewDesc.Texture2D.MipSlice = 0;
    hr = d3dVideoDevice->CreateVideoProcessorOutputView(dstTextureRGBFmt, d3dVideoProcEnum, &outputViewDesc, &videoProcOutputView);
}


// Setup streams
D3D11_VIDEO_PROCESSOR_STREAM streams = { 0 };
streams.Enable = TRUE;
streams.pInputSurface = videoProcInputView.get();

RECT srcRect = { /* source rectangle in pixels*/ };
RECT dstRect = { /* destination rectangle in pixels*/ };

// Perform VideoProc Blit Operation (with color conversion)
hr = videoCtx_->VideoProcessorBlt(d3dVideoProc, videoProcOutputView.get(), 0, 1, &streams);

Andere Tipps

Als Follow -up verwende ich derzeit MediaFoundation mit Windows 7,8 und 10 mit DirectX (oder nur Windows SDK im Fall von 8+).

Es unterstützt weitaus weniger Formate (oder vielmehr, Auflösungen/Profilebenen), und derzeit bin ich mir nicht genau sicher, ob es Hardware -Beschleunigung verwendet oder nicht ...

Aber diese API ist kompatibel, die ursprüngliche Abfrage war

Wie verwende ich mit Hardware beschleunigte Video/H.264 -Decodierung mit DirectX 11 und Windows 7?

Du kannst nicht.

ID3D11VideoDevice ist nur für Windows 8 avalaibel ID3D11VideoDevice.

ID3D11VideodeCoder ist nur für Windows 8 avalaibel ID3D11VideodeCoder.

Unter Windows 7 können Sie DirectX 9 für Hardware -beschleunigte Video/H.264 verwenden. Danke Microsoft. Der gute neue Idirect3D9ex funktioniert ... Ja ... die anderen guten Nachrichten, die GPU -Dekodierungsleistung sind mit DirectX9 unter Windows 7 sehr gut.

Hier ist ein Quellcode für Windows 7 und DirectX 9: MofO7777, unter H264DXVA2DeCoder -Projekt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top