1. 程式人生 > >gstreamer的外掛如何複製資料

gstreamer的外掛如何複製資料

  工作中,使用了gstreamer和nvidia的DeepStream外掛。如何從nvidia外掛中獲取資料,這個之前吾有博文專門論述。因為這個很少介紹,也不好找。吾當時也是運氣好,從別的程式碼中得到啟示,才找到了正確的解決辦法。

  那麼,普通的gstreamer外掛如何獲取資料呢?比如說,從decoder(包括nvidia decoder外掛)中,獲取原始的h264資料程式碼是怎樣的?這個很簡單,這裡分享出來,這樣可以在本部落格中都能找到,更方便。

  當然,這裡的結構體的意思,一看就明白,自行更改即可。


static int get_probe_h264_data(const GstPadProbeInfo * pProbeInfo, DataBuffer* pBuffer)
{
    GstBuffer *gst_buf = (GstBuffer *) pProbeInfo->data;
    GstMapInfo map_info;
    int size = 0;

    if (gst_buf == NULL || !gst_buffer_map (gst_buf, &map_info, GST_MAP_READ))
    {
        g_print ("gst_buffer_map() error!");
        return -1;
    }

    size        = gst_buffer_get_size( gst_buf );
    databuffer_check(pBuffer, size);
    gst_buffer_extract (gst_buf, 0, pBuffer->data, size);
    pBuffer->size = size;

    gst_buffer_unmap (gst_buf, &map_info);

    return 0;
}


/**
 獲取H264資料,並儲存。
 */
static GstPadProbeReturn callback_osd_sink_pad_buffer_probe_decoder (GstPad * pad, GstPadProbeInfo * probe_info, gpointer u_data)
{
    AiTask *pAiTask = (AiTask *)u_data;

    get_probe_h264_data(probe_info, &(pAiTask->h264_buffer));

    /*GH_LOG_INFO("size=%d, data=[0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X,]",
            pAiTask->h264_buffer.size,
            pAiTask->h264_buffer.data[0],
            pAiTask->h264_buffer.data[1],
            pAiTask->h264_buffer.data[2],
            pAiTask->h264_buffer.data[3],
            pAiTask->h264_buffer.data[4]
            );
    */
    fwrite(pAiTask->h264_buffer.data, 1, pAiTask->h264_buffer.size, pAiTask->h264_file);

    return GST_PAD_PROBE_OK;
}


int main()
{
    video_decoder = gst_element_factory_make("nvdec_h264", element_name);

    osd_pad = gst_element_get_static_pad(video_decoder, TEXT_SINK);
    if (osd_pad)
    {
        osd_probe_id = gst_pad_add_probe(osd_pad, GST_PAD_PROBE_TYPE_BUFFER,
                                callback_osd_sink_pad_buffer_probe_decoder, pTask, NULL);
    }

}