gstreamer 核心源碼source創建和識別typefind原理淺析(一) .

 

一般情況下,用戶打開一個多媒體文件,gstreamer首先需要知道文件的類型,然後創建相應的解碼器來解析這個文件,最終實現播放這個文件。

     一個實現流程實例如下:

 (1)     app程序通知gstreamer會根據uri、文件路徑,創建相應類型的src組件,一般爲filesrc組件(element))

 (2)     接着根據插件名創建type_find組件

 (3)     filesrc elementtypefind element連接link起來,添加到一個gstbin(pipeline)

 (4)     當app用戶打開文件後,接着通知 gstreamer去切換狀態。

case GST_STATE_CHANGE_READY_TO_PAUSED:
      if (!gst_element_pads_activate (element, TRUE)) {
        result = GST_STATE_CHANGE_FAILURE;
      }

注意:When changing states, a bin will set the state on all of its children in
sink-to-source order.說明,狀態切換先發生在typefind組件上。

  (5)gst_element_pads_activate (element, TRUE)函數裏接着調用 iter = gst_element_iterate_src_pads (element);
  res =
      iterator_activate_fold_with_resync (iter,
      (GstIteratorFoldFunction) activate_pads, &active);
接着

(6)接着activate_pads函數調用gst_pad_set_active,接着調用(GST_PAD_ACTIVATEFUNC (pad)) (pad)(該宏由gsttypefindelement在實例初始化時
  gst_pad_set_activate_function (typefind->sink,
      GST_DEBUG_FUNCPTR (gst_type_find_element_activate)); 即GST_PAD_ACTIVATEFUNC (pad) = gst_type_find_element_activate)所以實際是調用gst_type_find_element_activate()函數,

(7)在static gboolean gst_type_find_element_activate (GstPad * pad)函數裏:
  /* 1 */
  if (!gst_pad_check_pull_range (pad) || !gst_pad_activate_pull (pad, TRUE)) {
    start_typefinding (typefind);
    return gst_pad_activate_push (pad, TRUE);
  }

typefind會先activate在pull mode,最後調用XX_XX_get_range函數
即:gst_pad_check_pull_range 會調用pad上的函數指針,最終會調用到basesrc的check_get_range虛函數。即:

先調用gst_base_src_pad_check_get_range----》
接着調用gst_base_src_check_get_range----》
( bclass->check_get_range ) 這裏調用::gst_base_src_default_check_get_range----》
然後調用gst_base_src_start--》

( bclass = GST_BASE_SRC_GET_CLASS (basesrc);
  if (bclass->start)
    result = bclass->start (basesrc);
  else
    result = TRUE; )

在filesrc組件裏,對start函數進行了覆蓋,即調用gst_file_src_start。

(8)Filesrc最終會調用open函數打開文件。接着src組件狀態也發生切換,創建一個task,最後把文件信息推送給typefind;

(9)     typefind會從src讀取一部分數據然後送出typefind_callback,在callback裏面創建合適的plugin.

 未完待續,會接着補充。

如需轉載,請註明出處:本博客鏈接http://blog.csdn.net/acs713/article/details/7742976

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章