插件内存分析

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。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山西茄子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值