天天看点

Filesrc源码分析

概述

根据上一篇博客的介绍,我们知道对于filesrc类我们只需完成其静态方法即可,调用逻辑则由pipeline/bin来完成。这里额外要提的是filesrc是继承basesrc的,basesrc是所有src类型element的一个模板,其接口完成了状态切换管理、Pad协商、内存分配器协商等等一系列逻辑。filesrc仅仅重载了basesrc的部分接口,如果不想使用basesrc的默认提供的逻辑,也可自己通过重载进行替换。

代码分析

filesrc类的成员和方法的介绍可参见:filesrc官方介绍,官方介绍中详细描述了每个属性和接口的功能。由于filesrc 类并未额外声明接口,其源码所实现接口也全都是重载basesrc接口,因此想了解这些接口的功能,需要查阅basesrc的官方介绍。此处额外补充各个接口的调用逻辑,这样针对filesrc的代码逻辑就一目了然了。

如下便是笔者通过添加打印得出的filesrc函数调用时序。通过该调用时序,我们能窥探出Pipeline的各个阶段需要准备的事情。

  • 【NULL】to【READY】阶段:创建元素的实例。
  • 【READY】to【PAUSED】阶段:打开文件句柄,获取文件流信息。
  • 【PAUSED】to【PREROLL】阶段:成功读取了第一个buffer的数据。
  • 【PLAYING】阶段:源源不断的将读取文件数据,并填充到指定buffer中,直到读完数据返回GST_FLOW_EOS。
  • 【PLAYING】to【PAUSED】阶段:具体实现对filesrc是透明的。
  • 【PAUSED】to【READY】阶段:具体实现对filesrc是透明的。
  • 【READY】to【NULL】阶段:关闭文件句柄
$ gst-launch-1.0 filesrc location=/oem/200frames_count.h264 ! filesink location=/tmp/flc.h264

FLC-DBG:[GstFileSrc] <gst_file_src_class_init> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_init> is called!
Setting pipeline to PAUSED ...
FLC-DBG:[GstFileSrc] <gst_file_src_start> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_get_size> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_is_seekable> is called!
Pipeline is PREROLLING ...
FLC-DBG:[GstFileSrc] <gst_file_src_fill> is called!
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
FLC-DBG:[GstFileSrc] <gst_file_src_fill> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_fill> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_fill> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_fill> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_fill> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_get_size> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_fill> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_get_size> is called!
Got EOS from element "pipeline0".
Execution ended after 0:00:00.009744000
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
FLC-DBG:[GstFileSrc] <gst_file_src_stop> is called!
Setting pipeline to NULL ...
Freeing pipeline ...
FLC-DBG:[GstFileSrc] <gst_file_src_finalize> is called!