Presenting Packets
When it finishes issuing its rendering instructions, the producer application must provide
      synchronization for their completion. For synchronous elements the producer must perform a CPU
      wait for rendering to finish on those synchronous elements before inserting the packet in the
      stream. For asynchronous elements, it instructs the APIs it used to generate fences to trigger
      when rendering finishes. The application sets the fences for the elements of the packet that
      is going to be presented by calling NvSciStreamBlockPacketFenceSet().
The application can now insert the packet back into the stream along with the fences by
      calling NvSciStreamProducerPacketPresent() with the handle of the packet. The
      stream makes the packet available to consumers, performing any necessary copy or translations
      steps along the way to make the data and fences accessible. Once a packet is presented, the
      application must not attempt to modify its contents until it is returned for reuse.
NvSciError
NvSciStreamBlockPacketFenceSet(
    NvSciStreamBlock const block,
    NvSciStreamPacket const handle,
    uint32_t const elemIndex,
    NvSciSyncFence const* const postfence
)
NvSciError
NvSciStreamProducerPacketPresent(
    NvSciStreamBlock const      producer,
    NvSciStreamPacket const     handle
)