def execute(self, allCameraObject,instancSingle): # Check input arguments self.communicateInstance=instancSingle self.cameraContextDetails=allCameraObject print('In DS camera list:',allCameraObject) args=[] args=self.getCameraList(allCameraObject) print('In DS ARGS list:',allCameraObject) #args.append(rule_context.url) #args.append(rule_context.url) self.interval=self.getInterval() self.croudThreshold=self.getCroudThreshold() print('Interval is :',self.interval) if len(args) < 1: sys.stderr.write("usage: %s [uri2] ... [uriN]\n" % args[0]) sys.exit(1) for i in range(0,len(args)): self.fps_streams["stream{0}".format(i)]=GETFPS(i) number_sources=len(args) # Standard GStreamer initialization GObject.threads_init() Gst.init(None) # Create gstreamer elements */ # Create Pipeline element that will form a connection of other elements print("Creating Pipeline \n ") pipeline = Gst.Pipeline() is_live = False if not pipeline: sys.stderr.write(" Unable to create Pipeline \n") print("Creating streamux \n ") # Create nvstreammux instance to form batches from one or more sources. streammux = Gst.ElementFactory.make("nvstreammux", "Stream-muxer") if not streammux: sys.stderr.write(" Unable to create NvStreamMux \n") pipeline.add(streammux) for i in range(number_sources): #os.mkdir("/root/Smarg/Gateway_11May/Gateway_11May/Images/stream_"+str(i)) self.frame_count["stream_"+str(i)]=0 self.saved_count["stream_"+str(i)]=0 print("Creating source_bin ",i," \n ") uri_name=args[i] if uri_name.find("rtsp://") == 0 : is_live = True source_bin=self.create_source_bin(i, uri_name) if not source_bin: sys.stderr.write("Unable to create source bin \n") pipeline.add(source_bin) padname="sink_%u" %i sinkpad= streammux.get_request_pad(padname) if not sinkpad: sys.stderr.write("Unable to create sink pad bin \n") srcpad=source_bin.get_static_pad("src") if not srcpad: sys.stderr.write("Unable to create src pad bin \n") srcpad.link(sinkpad) print("Creating Pgie \n ") pgie = Gst.ElementFactory.make("nvinfer", "primary-inference") if not pgie: sys.stderr.write(" Unable to create pgie \n") # which is easier to work with in Python. print("Creating nvvidconv1 \n ") nvvidconv1 = Gst.ElementFactory.make("nvvideoconvert", "convertor_postosd") if not nvvidconv1: sys.stderr.write(" Unable to create nvvidconv1 \n") print("Creating filter1 \n ") caps1 = Gst.Caps.from_string("video/x-raw(memory:NVMM), format=RGBA") filter1 = Gst.ElementFactory.make("capsfilter", "filter1") if not filter1: sys.stderr.write(" Unable to get the caps filter1 \n") filter1.set_property("caps", caps1) print("Creating tiler \n ") tiler=Gst.ElementFactory.make("nvmultistreamtiler", "nvtiler") if not tiler: sys.stderr.write(" Unable to create tiler \n") print("Creating nvvidconv \n ") nvvidconv = Gst.ElementFactory.make("nvvideoconvert", "convertor") if not nvvidconv: sys.stderr.write(" Unable to create nvvidconv \n") print("Creating nvosd \n ") nvosd = Gst.ElementFactory.make("nvdsosd", "onscreendisplay") if not nvosd: sys.stderr.write(" Unable to create nvosd \n") if(is_aarch64()): print("Creating transform \n ") #transform=Gst.ElementFactory.make("queue", "queue") transform=Gst.ElementFactory.make("nvegltransform", "nvegl-transform") if not transform: sys.stderr.write(" Unable to create transform \n") print("Creating EGLSink \n") #sink = Gst.ElementFactory.make("nvoverlaysink", "nvvideo-renderer") sink = Gst.ElementFactory.make("nveglglessink", "nvvideo-renderer") if not sink: sys.stderr.write(" Unable to create egl sink \n") if is_live: print("Atleast one of the sources is live") streammux.set_property('live-source', 1) streammux.set_property('width', 1280) streammux.set_property('height', 720) streammux.set_property('batch-size', number_sources) streammux.set_property('batched-push-timeout', 4000000) print(os.getcwd()) pgie.set_property('config-file-path', "../config/people_density_config.txt") pgie.set_property('interval', self.interval) pgie_batch_size=pgie.get_property("batch-size") if(pgie_batch_size != number_sources): print("WARNING: Overriding infer-config batch-size",pgie_batch_size," with number of sources ", number_sources," \n") pgie.set_property("batch-size",number_sources) tiler_rows=int(math.sqrt(number_sources)) tiler_columns=int(math.ceil((1.0*number_sources)/tiler_rows)) tiler.set_property("rows",tiler_rows) tiler.set_property("columns",tiler_columns) tiler.set_property("width", self.TILED_OUTPUT_WIDTH) tiler.set_property("height", self.TILED_OUTPUT_HEIGHT) #sink.set_property("sync", 0) if not is_aarch64(): # Use CUDA unified memory in the pipeline so frames # can be easily accessed on CPU in Python. mem_type = int(pyds.NVBUF_MEM_CUDA_UNIFIED) streammux.set_property("nvbuf-memory-type", mem_type) nvvidconv.set_property("nvbuf-memory-type", mem_type) nvvidconv1.set_property("nvbuf-memory-type", mem_type) tiler.set_property("nvbuf-memory-type", mem_type) print("Adding elements to Pipeline \n") pipeline.add(pgie) pipeline.add(tiler) pipeline.add(nvvidconv) #new added pipeline.add(nvosd) pipeline.add(filter1) pipeline.add(nvvidconv1) if is_aarch64(): pipeline.add(transform) pipeline.add(sink) print("Linking elements in the Pipeline \n") # streammux.link(pgie) # pgie.link(nvvidconv1) # nvvidconv1.link(filter1) # filter1.link(tiler) # tiler.link(nvvidconv) # nvvidconv.link(nvosd) streammux.link(pgie) pgie.link(nvvidconv) nvvidconv.link(nvosd) nvosd.link(nvvidconv1) nvvidconv1.link(filter1) filter1.link(tiler) if is_aarch64(): tiler.link(transform) transform.link(sink) else: tiler.link(sink) # create an event loop and feed gstreamer bus mesages to it loop = GObject.MainLoop() bus = pipeline.get_bus() bus.add_signal_watch() bus.connect ("message", bus_call, loop) # tiler_src_pad=pgie.get_static_pad("src") # if not tiler_src_pad: # sys.stderr.write(" Unable to get src pad \n") # else: # tiler_src_pad.add_probe(Gst.PadProbeType.BUFFER, self.tiler_src_pad_buffer_probe, 0) tiler_sink_pad=tiler.get_static_pad("sink") if not tiler_sink_pad: sys.stderr.write("Unable to get src pad \n") else: tiler_sink_pad.add_probe(Gst.PadProbeType.BUFFER, self.tiler_sink_pad_buffer_probe, 0) # List the sources print("Now playing...") for i, source in enumerate(args): if (i != 0): print(i, ": ", source) print("Starting pipeline \n") # start play back and listed to events pipeline.set_state(Gst.State.PLAYING) try: loop.run() except: pass # cleanup print("Exiting app\n") pipeline.set_state(Gst.State.NULL)