注意,了解gobject是deepstream的学习前提。了解就好,可以看看这位作者的博客.
deepstream依托于gstreamer框架,可以认为deepstream其实就是设计了几个插件,只不过这几个插件比较复杂,可以定制许多参数,用于控制视频流的推理逻辑和推理算法的选择。
其核心插件是 nvinfer插件,且已经部分开源。从代码实现的角度插件由两部分构成,第一部分为媒体流控制相关操作,代码位于 gst-nvinfer目录内,另外一部分为推理引擎部分的代码,该部分则是调用tensorrt的api实现。
打算在这里首先梳理一下,媒体流控制部分的代码。
在gstreamer框架中,gstBuffer是在不同插件流动的基础数据结构。
这里是gstBuffer的官方文档,阅读第一段你可以对gstBuffer的设计有个大致的理解。当然刚接触时,你可能因为对于概念的不熟悉,而感到困惑,实际上
下面是 gstreamer-1.14.5中gstBuffer的数据结构:
struct _GstBuffer {
GstMiniObject mini_object;
/*< public >*/ /* with COW */
GstBufferPool *pool;
/* timestamp */
GstClockTime pts;
GstClockTime dts;
GstClockTime duration;
/* media specific offset */
guint64 offset;
guint64 offset_end;
};
上面可以认为是gstBuffer的public属性,其内部的私有属性包含在一个名为GstBufferImpl的数据结构之中,(其首字节必定为GstBuffer,很关键,这是gobect继承体系的核心其实)
typedef struct
{
GstBuffer buffer;
gsize slice_size;
/* the memory blocks */
guint len;
GstMemory *mem[GST_BUFFER_MEM_MAX];
/* memory of the buffer when allocated from 1 chunk */
GstMemory *bufmem