Releasing Packets
When it finishes issuing instructions to read from a packet, the consumer must return the packet to the producer for reuse. Packets may be returned in any order, regardless of the order they were acquired.
Before sending the frame back, the consumer provides synchronization to indicate when its
      operations complete. For synchronous elements,  the consumer must perform a CPU wait for
      reading to finish before inserting the packet in the stream. For asynchronous elements, it
      must instruct the APIs it used to generate fences, which trigger when rendering finishes.  The
      application sets the fences for the elements of the packet that is going to be released by
      calling NvSciStreamBlockPacketFenceSet(). 
The application can now insert the packet back into the stream along with the fences by
      calling NvSciStreamConsumerPacketRelease() with the handle of the packet. The
      stream returns the packet to the producer, performing any necessary copy or translations steps
      to make the fences accessible. When a packet is released, the application must not attempt to
      read its contents until a new payload using the packet arrives.
NvSciError
NvSciStreamConsumerPacketRelease(
    NvSciStreamBlock const      consumer,
    NvSciStreamPacket const     handle,
    NvSciSyncFence const *const postfences
)