test1_app.c

//針對不同的消息類型進行相應的處理
static gboolean
bus_call (GstBus * bus, GstMessage * msg, gpointer data)
{}


//下面是main函數裏的

osd_sink_pad_buffer_probe  //此方法將提取osd sink pad上接收到的元數據,
//並更新繪製矩形、對象信息等的參數
//讓加入探測器獲得生成的元數據的通知,我們將probe探測器添加到osd元素的sink pad中,
//因爲到那時,緩衝區已經獲得了所有的元數據。
  osd_sink_pad = gst_element_get_static_pad (nvosd, "sink");
  if (!osd_sink_pad)
    g_print ("Unable to get sink pad\n");
  else
    gst_pad_add_probe (osd_sink_pad, GST_PAD_PROBE_TYPE_BUFFER,
        osd_sink_pad_buffer_probe, NULL, NULL);

//for循環統計該幀的車輛和行人

gst_init (&argc, &argv); //首先我們調用了gstreamer的初始化函數
loop = g_main_loop_new (NULL, FALSE);//創建一個循環體

//創建將形成其他元素連接的管道元素
//Pipeline通過gst_pipeline_new創建,參數爲pipeline的名字
pipeline = gst_pipeline_new ("dstest1-pipeline");


//用於讀取文件的源元素
//創建一個element  類型是filesrc,名字是file-source
source = gst_element_factory_make ("filesrc", "file-source");

//由於輸入文件中的數據格式是基本的h264流,我們需要一個h264解析器
//創建一個element  類型是h264parse,名字是h264-parser
h264parser = gst_element_factory_make ("h264parse", "h264-parser");

//在GPU上使用nvdec_h264進行硬件加速解碼
decoder = gst_element_factory_make ("nvv4l2decoder", "nvv4l2-decoder");

//創建nvstreamux實例以從一個或多個源形成批處理
streammux = gst_element_factory_make ("nvstreammux", "stream-muxer");

//使用nvinfer對解碼器的輸出運行推理,推理行爲通過配置文件設置
pgie = gst_element_factory_make ("nvinfer", "primary-nvinference-engine");

//根據nvosd的要求,使用轉換器將NV12轉換爲RGBA
nvvidconv = gst_element_factory_make ("nvvideoconvert", "nvvideo-converter");

//創建OSD以在已轉換的RGBA緩衝區上繪製
nvosd = gst_element_factory_make ("nvdsosd", "nv-onscreendisplay");
/* Finally render the osd output 最後呈現osd輸出*/

// 我們將輸入文件名設置爲源元素 //設置source的位置,source是視頻文件
g_object_set (G_OBJECT (source), "location", argv[1], NULL);
//設置視頻格式,如分辨率等
g_object_set (G_OBJECT (streammux), "width", MUXER_OUTPUT_WIDTH, "height",
    MUXER_OUTPUT_HEIGHT, "batch-size", 1,
    "batched-push-timeout", MUXER_BATCH_TIMEOUT_USEC, NULL);

//設置nvinfer元素的所有必要屬性,這些屬性是:
//設置配置文件的路徑。該配置文件指示tensorRT轉換後的文件等
g_object_set (G_OBJECT (pgie),
    "config-file-path", "dstest1_pgie_config.txt", NULL);

/* we add a message handler */
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
bus_watch_id = gst_bus_add_watch (bus, bus_call, loop);
gst_object_unref (bus);

/* Set up the pipeline 設置管道*/
/* we add all elements into the pipeline */
gst_bin_add_many (GST_BIN (pipeline),
      source, h264parser, decoder, streammux, pgie,
      nvvidconv, nvosd, sink, NULL);

gst_object_unref (sinkpad);
gst_object_unref (srcpad);

/* we link the elements together */
/* file-source -> h264-parser -> nvh264-decoder ->
 * nvinfer -> nvvidconv -> nvosd -> video-renderer */

//讓加入探測器獲得生成的元數據的通知,我們將probe探測器添加到osd元素的sink pad中,
//因爲到那時,緩衝區已經獲得了所有的元數據。
osd_sink_pad = gst_element_get_static_pad (nvosd, "sink");
gst_pad_add_probe (osd_sink_pad, GST_PAD_PROBE_TYPE_BUFFER,
        osd_sink_pad_buffer_probe, NULL, NULL);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章