본문 바로가기

Tech/DeepStream

[Deepstream] Gst-nvstreammux

반응형

Gst-nvstreammux plugin multiple input sources로부터 생성되는 프레임들을 batch로 묶는 기능을 한다.

nvstreammux source를 연결하기 위해서는 새로운 pad muxer에 요청하여 생성해야한다. 이때gst_element_request_pad() 함수와 pad 템플릿 sink_%u를 사용한다.

 

muxer property에서 batch-size로 정해진 만큼의 frame들로 batched buffer를 구성한다. 만약 muxer input format output format이 같은 경우 해당 source에서 전송된 frame batched buffer에 포함시킨다. 만약 input outputresolution이 같지 않으면 muxer input frame scailing하여 batched buffer에 넣는다.

 

batched buffer batch가 꽉 차거나 미리 설정된 batched-pushed-timeout에 도달하면 downstream으로 buffer를 전송한다. timeout batch에 첫번째 buffer가 도착하는 시간부터 시작하여 측정한다.

 

muxer round-robin 알고리즘을 사용하여 source들로부터 frame을 모은다.  source들로부터 각 batch frame이 평균이 되도록 모으는데, 이는 각 source frame rate에 따라 달라진다.

 

muxer는 단일 resolution으로 결과를 출력하는데, 이는 width height property를 통해서 설정이 가능하다. width, height가 설정되면 muxer는 모든 frame을 해당 resolution으로 scailing한다. 이때 enable-padding propertyi true로 설정하면 입력 frame의 화면비율을 유지하면서 black bands로 padding하여 scailing 한다.

 

DGPU 플랫폼에서는 scailing memory allocation에 사용하는 GPU gpu-id property를 통해서 특정할 수 있다. output resolution으로 scailing이 필요한 각 source 들에게 muxer buffer pool을 생성하고 4개의 buffer를 할당해준다.  buffer의 크기는 다음과 같다.

 

{output width} * {output height} * f
// f: NV12 형식에서는 1.5, RGBA 형삭에서는 4.0 이다.

 

live-source property true로 설정하면 muxer는 해당 source가 live임을 인지하고 마지막 복사된 input buffer의 PTS를 batched Gst Buffer의 PTS에 붙인다. 만약 false인 경우 muxer의 capabilities를 처음 조정한 때부터 source의 frame rate를 기준으로 muxer가 직접 timestamp를 계산한다.

 

muxer는 NvDsBatchMeta metadata structure를 output batched buffer에 추가한다. 해당 meta data는 batch에 복사된 frame의 정보를 가지고 있다. (source ID of the frame, original resolutions of input frames, original buffer PTS of the input frames)

sink_N pad에 연결된 source는 NvDsBatchMeta의 pad_index로 N을 가진다.

 

muxser는 runtime에서 source의 추가, 삭제를 지원한다. 새로운 source로부터 buffer를 받는 경우에 GST_NVEVENT_PAD_ADDED 이벤트를 전송한다. sink pad가 삭제되는 경우에는 GST_NVEVENT_PAD_DELETED 이벤트를 전송한다. 두가지 이벤트 모두 새롭게 추가/삭제 되는 source ID를 포함하고 있다.

추가적으로 EOS에 대해서 GST_NVEVENT_STREAM_EOS 이벤트 또한 전송한다.

 

muxer는 source frame을 위한 NTP timestamps 계산을 지원한다. 이 기능은 두가지 모드로 제공되는데, system timestamp mode에서는 현재 시스템의 시간을 NTP timestamp로 추가한다. RTCP timestamp 모드에서는 source에서 frame이 생성될때 RTCP Sender Report를 frame의 NTP timestamp를 계산하는데 사용한다. NTP timestamp는 NvDsFrameMeta의 ntp_timestamp에 저장된다. 해당 모드는 attach-sys-ts 설정을 통해서 변경이 가능하다. (자세한 사항은 DeepStream의 NTP Timestamp를 참고)

 

 

Gst-nvstreammux 구조

 

Gst-nvstreammux의 input/output

 

 

[reference]

반응형

'Tech > DeepStream' 카테고리의 다른 글

[Deepstream] Gst-nvdsanalytics  (0) 2021.08.18
[Deepstream] Gst-nvinfer  (0) 2021.08.18
[GStreamer] GStreamer 개념 정리  (0) 2021.08.05