Vlcソースコード分析(2)--- input.c mp4ファイルの逆多重化、mp4モジュールのロード
Vlc Source Code Analysis Input
src / input.c run()の入力スレッド
分析環境vlc3.0.6 ubuntu18.04(いくつかの奇妙な場所、彼らの意図をさらに理解していない、コード追跡を記録するこのレイアウトは非常に不快です...)
非常に重要なスレッド本体は、ファイル読み取りデータから出力データに逆多重化する、最も重要なアクティブスレッドであると言えます。
上記の詳細な分析module_need(p_demux、 'access_demux'、p_demux-> psz_access、true)
{{
- 関連するものを見つける 機能のすべてのモジュール
module_list_cap(&mods、capability)// bank.cファイル内の関数、明らかにこれはvlc初期化の開始時に、各モジュールに関する情報を含むツリーストレージ構造が作成されています。
2マッピングは、関連する機能のモジュールのセットを取得し、モジュール名でさらに照合します
module_match_name(cand、shortcut);
3モジュールに一致、ロード
module_load(obj、cand、probe、args)
}
分析module_load(obj、cand、probe、args)
{{
- module_Map(obj、m-> plugin)//これはチェックする必要があります
- init(m-> pf_activate、ap)//正式にロードされ、これは少し曲がりくねっています
まず第一に初期化はい パラメータ調査渡された 1「」プローブの関数ポインタ、
m、パラメータですいつ渡されたmodule_t
ap、パラメータです引数
このプロセスを追跡するには、戻って発信者を探す必要があります。あれは 上module_list_capプラグインテーブルをマッピングするときは、特定の場所からプラグインのリストを取得し、プラグインリストが作成された場所を見つけます。
このセクションは見つけることです:
libvlc_instance()==>libvlc_new()==>libvlc_internalInit()==>module_LoadPligins()==>
for(module_InitStatic())==>vlc_pligin_describe()
}
現在のデモmp4、モジュールに直面して、モジュールの上記の呼び出し
vlc_module_load(p_demux、 'demux'、psz_module、
!strcmp(psz_module、p_demux-> psz_demux)、demux_Probe、p_demux)
{……
module_load(obj、cand、調査、args)
プローブは、demux.cファイル内の静的int demux_Probe(void * func、va_list ap)です。
{{
int(* probe)(vlc_object_t *)= func
demux_t * demux = va_arg(ap、demux_t *)
リターンプローブ(VLC_OBJECT(demux))
}
一連の曲げを使用すると、合計は常に次のようになります。
init(m-> pf_activate、ap)==》pf_activate((demux_t)
あれは モジュールを呼び出すpf_activate関数。名前が示すように、活性化関数
モジュールpf_activate機能、グローバルな外観はentry.c中間vlc_plugin_describeで見つかりました、
それが上記の分析ですlibvlc_instance()ですlibvlc_new()。 。 。静的モジュールをロードすると、ループ本体を通過し、各モジュールのエントリ関数を呼び出します。エントリ(vlc_plugin_desc_cb、プラグイン)、特定のモジュール エントリー機能 この呼び出しで渡されたものを使用します コールバック関数ポインタdesc_cb、このdesc_cb名前が示すように、コールバック関数は モジュールがそれ自体を記述した後、 折り返し電話。
(あれは、libvlc最初に各モジュールのエントリ関数を見つけ、次にモジュールエントリ関数を呼び出します。特定のモジュールエントリが実行され、呼び出しが行われます。desc_cb伝えるためにlibvlcモジュールが開かれ、イニシアチブが再び返されます。libvlc)。 参照vlc_plugin.hのset_callbacksマクロ、モジュールファイル このマクロを使用して設定します モジュール活性化関数アクティベート、およびログアウト機能非アクティブ。)
したがって、上記の読み込みMP4モジュール、にジャンプしますmodules / demux / mp4.c中間開いた()
mp4.cのopen関数は、MP4逆多重化のための2つの重要な関数ポインターを設定します。 pf_demux と pf_contrl
すでにリンクされています
………
}
コードストリームが最終的に進む場所では、mp4.cファイルのdemuxも分析する必要があります。これは、さらに処理されます。