NVMM memory is corrupted by nvosd after tee

• Hardware Platform (Jetson / GPU): AGX
• DeepStream Version 5.0.1-1
• JetPack Version (valid for Jetson only) 4.2
• TensorRT Version
• NVIDIA GPU Driver Version (valid for GPU only) Cuda 10.2
• Issue Type( questions, bugs)
**• How to reproduce the issue ? just run the provided pipeline

I have a pipeline (see image below), there is a tee in the middle of it. The first branch after the tee has an nvosd element in the middle that renders bounding boxes, end terminates in a display sink. The second branch is responsible for writing a raw video file, so it terminates in a filesink. My intention here is writing the video as it was received from the source, i.e. no modification is made on the frames.

If I open the video file that was produced by the second branch, I can see some of the bounding boxes/rectangles that were drawn by the nvosd element in the first branch. (only some of them, not all of them. Some of the rectangles are only generated partly i.e. only top or bottom line is rendered)

How can I fix this?

For me it seems that the two branches operates on the same NVMM memory, and it is matter of pure luck which happens earlier: the nvosd renders the rectangles (partly or fully) or the filesink writes out the frame. Is this assumption correct? If so how can I tell tee or ensure other way that the two branch operates on separate memory?

Thanks in advance

Please add tee after nvosd, then branching for one branch to display sink, another branch to file sink as you did.

Thank you for your reply, amycao!

Unfortunately this is just the opposite what I try to achieve. If I put the tee after nvosd, all the bounding boxes are rendered into the video file (correctly).

I need the opposite: the video stream needs to be saved as it is, with no bounding boxes at all. That’s why I have the tee before nvosd, and that’s why it bothers me, that nvosd (partly) modifies the frames that are on a totally different branch.

Do you maybe have a solution for this?

HI @tamas2 ,
After “tee”, the two pipeline branches actually share the same buffer, and, because the nvvideoconvert on osd branch is in passthrough model since its input and output has the same data formart, the OSD added on the buffer could be used in the encoding branch by chance and then do its own nvvideoconvert .
So, the basic solution is to avoid passthrough mode for the nvvideoconvert on OSD pipeline, the possible workable change is removing the nvvideoconvert before tee, or change the format of Capsfiliter to be not RGBA or different resolution from the output resolution of the nvvideoconvert on OSD pipeline, or any others that can make the input & output of the OSD nvvideoconvert be different

Thank you, this seems to work.