Video Encode/Decode - #226
Conversation
|
Wow! Magnificent! Thanks a ton for bringing this work to life! I will try to review later today. |
Should
Should we add more formats? We should invent better names :) DXGI has short names, but they are unclear (seems to be a good start):
No D3D11 support? Probably not needed, but, IM, nice to have :) (...to be continued) |
|
Q1 Q2: Q3 |
+1, clarifying comments may be added if needed. They are pretty standard.
No objections here (assuming the interface is implementable in D3D11) |
|
Do we need other formats, like |
|
Please, add this link somewhere in the beginning of |
|
I'm ready to merge it after you are done with polishing. Just let me know. Further improvements can be made in I haven't deeply analyzed the implementation, but the API additions are nice and clear. Also I think that these formats: can be removed and |
Definitely. I'll look into it as soon as I can.
I like that. |
The current set targets the common 4:2:0 format family needed by the decode/encode path: NV12, P010, P016. Y410 is packed 4:4:4 and would add support for it in a follow-up if the need arises. |
|
I don't like that you're using native API structures in NRI public API. Wouldn't be logical to implemented it as a translation layer, not in the NRIWrapper* way? |
- "TextureViewDesc::readonlyPlanes" renamed to "planes". Logic switched to "direct" from "inverse"
- removed special depth-stencil format for shader resource views ("R24_UNORM_X8", "X24_G8_UINT", "R32_SFLOAT_X8_X24" and "X32_G8_UINT_X24"). Use "planes" instead
- explained valid usage
OTHER:
- VK: untangled "planes" (aspect mask) logic to be friendly for subpass inputs
- prerequisite for video support (PR #226)
@Daedie-git I have implemented it. Please, update your code to the latest since it's a prerequisite for the video support. Please, note that I have removed PR #222 since the code is completely different for these lines. Feel free to adjust, re-add or discuss. Thanks in advance! We are moving forward!
Just echoing already said, I absolutely agree with this. GAPI specific structs must be moved to corresponding |
Indeed. I have addressed this locally already. I'll rebase it on your change and push it soon. |
…ueues # Conflicts: # Source/VK/DescriptorVK.hpp
437decc to
4a2960d
Compare
|
I wrapped up my changes. |
|
I found some issues, so I will follow up with another commit. |
|
Additional question: For the sake of testing this, I've been building up quite the test suite in my own repo. Do you want to have it in some form? |
|
Also did a round of bugfixes. have all 6 codecs working again in the sample. |
|
Please, add big TODOs right into |
- removed very dirty "SelectQueueFamiliesVK" function with all dependencies - matched "TrySelectPreferredQueueType" usage across "Creation" and "VK"
Just spotted |
|
Semi-update: I've been working on building a new graphics stack for my work based on NRI recently (old one is still opengl based and not keeping up with our needs), and I've started adopting NRI video encode/decode in it (our applications are heavily video focused). I also still plan to direct some attention at upgrading the Samples soon. |
|
I've reworked the NRISample. Now it generates a collection of patterns that are sensitive to encoding artifacts. It now also offers a small suite of quality controls that can be manipulated at runtime. And an option to show the diff between original and encoded->decoded image. This makes the sample actually a quite useful tool (I think my boss will want to have it :) ). I have run into some bugs while integrating NRI video into our new graphics stacks. Those have been fixed. I also added a script to the sample repo that does smoke runs of a rich matrix of configuration permutations, which I highly recommend keeping in some form. It was an essential tool for getting through this final stretch without accidentally re-introduce regressions. I'm currently working through a final bug that surfaced in the aforementioned script. I expect to deal with it today or tomorrow. Then I actually think I'm ready for a final review + merging. |
|
I'm done for the most part. That being said, I would actually like to converge on a merge soon for this. Keep the above as documented known shortcoming. I think what's there is already quite strong even if not perfect. |
|
Thanks. I updated this branch to the latest |
|
Alright, have a great vacation! |
|
I fixed a number of bugs. |
|
I'm back. I will get back to this (planning to merge!) early next week. |
The open encode/decode enticed me to try and get VK hardware decoding working in my software (until now, I only had it on the D3D12 side). I expect this will need further changes, just let me know.
I wasn't sure what the right way to handle the D3D12 CommandBuffer was, I settled on the variant for now.
Summary
Adds hardware video queue support and a minimal native-backed video encode/decode extension API.
This branch makes video-capable queues visible through NRI, allows D3D12/Vulkan video command buffers to be created and submitted, adds
basic multi-planar video format support, and exposes
NRIVideoentry points for issuing native encode/decode commands.Changes
Public API
QueueType::VIDEO_DECODEQueueType::VIDEO_ENCODEG8_B8R8_2PLANE_420_UNORMG10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16G16_B16R16_2PLANE_420_UNORMPLANE_0PLANE_1PLANE_2Include/Extensions/NRIVideo.hVideoInterfaceCmdDecodeVideoCmdEncodeVideoAdapter and Queue Discovery
ID3D12VideoDeviceis availableVkQueueFamilyVideoPropertiesKHRto ensure Vulkan video queues also expose compatible codec operationsD3D12 Backend
D3D12_COMMAND_LIST_TYPE_VIDEO_DECODED3D12_COMMAND_LIST_TYPE_VIDEO_ENCODECommandBufferD3D12to hold graphics, video decode, or video encode command listsCmdDecodeVideoviaID3D12VideoDecodeCommandList::DecodeFrameCmdEncodeVideoviaID3D12VideoEncodeCommandList2::EncodeFrameID3D12CommandList*, since video command lists are not graphics command listsVulkan Backend
VK_KHR_video_queueVK_KHR_video_decode_queueVK_KHR_video_encode_queuevkCmdDecodeVideoKHRandvkCmdEncodeVideoKHRCmdDecodeVideo/CmdEncodeVideoforwarding to Vulkan command buffersValidation / Interface Wiring
VideoInterfacethroughnriGetInterfaceDeviceBase::FillFunctionTable(VideoInterface&)FillFunctionTable(VideoInterface&)implementationsAPI Shape
The new video API is intentionally small and native-backed.
NRI handles queue discovery, command buffer ownership, function table exposure, and command dispatch. Codec/session setup remains
backend-native (initially):
VkVideoDecodeInfoKHR/VkVideoEncodeInfoKHRpayloadsValidation
Built successfully with: