rtspsrc
1. 当pipleline为rtspsrc加其他插件时,如果让其他插件卡主会发生什么事情呢?以rtspsrc+fakesink为例(gst-launch-1.0.exe rtspsrc location=rtsp://xxx ! fakesink),修改fakesink的代码,让render中添加sleep如下:
static GstFlowReturn gst_fake_sink_render (GstBaseSink * bsink, GstBuffer * buf)
{
GstFakeSink *sink = GST_FAKE_SINK_CAST (bsink);
GST_DEBUG_OBJECT (sink, "in gst_fake_sink_render sleep 2");
g_usleep (10000000);
......
}
这样让fakesink经常卡10秒,得到日志如下:
0:00:08.202737000 6968 00000165708119C0 LOG bufferpool gstbufferpool.c:300:do_alloc_buffer:<bufferpool0> allocated buffer 0/0, 000001657086CEA0
0:00:22.361072000 6968 00000165709B7380 LOG bufferpool gstbufferpool.c:300:do_alloc_buffer:<bufferpool5> allocated buffer 616/0, 0000016571190120
从日志可以看到,udpsrc分配的内存不能及时得到释放,buffer使用计数在不断增长,对应如下代码:
gstbufferpool.c的do_alloc_buffer{
......
GST_LOG_OBJECT (pool, "allocated buffer %d/%d, %p", cur_buffers,
max_buffers, *buffer);
}
然后把fakesink的sleep去掉,得到如下日志:
0:00:06.964148000 16348 0000012B7FD46E00 LOG bufferpool gstbufferpool.c:396:do_free_buffer:<bufferpool1> freeing buffer 0000012B7FDA1360 (0 left)
0:00:21.482833000 16348 0000012B7E9D8000 LOG bufferpool gstbufferpool.c:396:do_free_buffer:<bufferpool3> freeing buffer 0000012B01693240 (3 left)
可以看到,过了十几秒后,计数没有变的很大,又成0了,说明卡主fakesink会影响udpsrc的buffer释放,相关的堆栈如下,标注的那行就是fakesink,最上面的那行是bufferpool的释放函数。
transfrom类插件
transform的基类是basetransfrom,transfrom有些会创建新的buffer,如编码器,解码器,经过transfrom后,内容都变掉了,所有会释放输入的buffer,创建新的buffer,有些不会创建洗你的buffer,做的是Inplace的变换。
插件释放
调用 gst_object_unref (GST_OBJECT (pipeline));时候,释放pipeline下的所有插件,以
gst-launch-1.0.exe filesrc location= C:\\zhangfan\\streams\\sample_720p.jpg ! jpegdec ! fakesink 为例,调用gst_object_unref (pipeline);时,会递归调用,释放子插件,比如会调用fakesink的gst_fake_sink_finalize。