Mp4

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)



{{

  1. 関連するものを見つける 機能のすべてのモジュール

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)

{{

  1. module_Map(obj、m-> plugin)//これはチェックする必要があります
  2. 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.hset_callbacksマクロ、モジュールファイル このマクロを使用して設定します モジュール活性化関数アクティベート、およびログアウト機能非アクティブ。)

したがって、上記の読み込みMP4モジュール、にジャンプしますmodules / demux / mp4.c中間開いた()

mp4.cのopen関数は、MP4逆多重化のための2つの重要な関数ポインターを設定します。 pf_demux pf_contrl

すでにリンクされています

………

}

コードストリームが最終的に進む場所では、mp4.cファイルのdemuxも分析する必要があります。これは、さらに処理されます。