Skip to content

nvcodec: Add new Direct3D11/CUDA mode encoder implementation

Seungha Yang requested to merge seungha.yang/gstreamer:nvencoder-d3d11 into main
    nvcodec: Add new Direct3D11/CUDA mode encoder implementation

    Adding new encoder elements nvd3d11{h264,h265}enc for Direct3D11
    input support and re-written nvcuda{h264,h265}enc elements.
    Newly writeen elements have some differences compared with old
    nv{h264,h265}enc including non-backward compatible changes.

    * RGBA is not a supported input format any more:
      New elements will support only YUV formats to avoid implicit conversion
      done by hardware. Ideally it should be done by upstream element
      in order to have more control on it. Moreover, RGBA support can cause
      redundant RGBA -> YUV conversion if multiple encoders are
      used for the same RGBA input
    * Subsampled planar format support is dropped:
      I420 and YV12 format are not supported formats for Direct3D11.
      Although it's supported in CUDA mode, it's not a hardware friendly
      memory layout and it will waste GPU memory since UV planes
      will have large padding due to the memory layout requirement of NVENC.
    * GL support is dropped: Similar to the RGBA case,
      GL support in encoder would be suboptimal if GL input is
      used by multiple encoders, because each encoder will copy GL memory
      into CUDA memory.
      Upstream cudaupload element can be used for GL <-> CUDA
      interop instead.
    * No more pre-allocation of encoder input surfaces. New implementation
      will use input CUDA memory without copy (zero-copy) or
      will copy into a NVENC's input buffer struct in case of
      system memory input.
Edited by Seungha Yang

Merge request reports