天天看點

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!