vlcモジュール

モジュールの書き方

ディスクリプタの記述

vlc_module_begin()vlc_module_end ()で囲み、基本的な情報をset_xxx()で与える

vlc_module_begin()
  set_shortname(N_("Hello"))
  set_description(N_("Hello interface"))
  set_capability("interface", 0)
  set_callbacks(Open, Close)
  set_category(CAT_INTERFACE)
  add_string("hello-who", "world", "Target", "Whom to say hello to.", false)
vlc_module_end()

ショートネーム

モジュールの名前を短く記述する。

set_shortname(N_("Hello"))

ディスクリプション

モジュールの概要を記述する。

set_description(N_("Hello interface"))

機能とスコア

以下の種類の機能とスコア(整数値)を与えてどのロードするモジュールの機能を特定する。

機能 機能概要
audio filter イコライザーなどの音声フィルタ
audio mixer 音声チャンネルミキサーなど
audio output DirectXなどのような音声出力
decoder デコーダー
demux ファイルフォーマットなど
encoder x264などのようなエンコーダー
interface Qt4などのインターフェース
meta reader メタ情報リーダー
packetizer パケット化モジュール
playlist export m3uのようなプレイリスト出力
services_discovery UpnpやDLNAなどのようなPCやネットワークからの外部コンテンツを取得するモジュール
sout access ストリーミングのアクセス用
sout mux ストリーミングやエンコーディングのときの合成モジュール
stream_filter ストリームフィルタ
text renderer 字幕やタイトルなどのOSD表示モジュール
video filter コントラスト調整などの映像フィルタ
visualization2 音楽から作成するビジュアライザー
vout display Direct3DやXvのようなビデオ出力モジュール
set_capability("機能", スコア)

カテゴリの種類

以下のカテゴリの種類を記述する。

CAT_INTERFACE
CAT_AUDIO
CAT_VIDEO
CAT_INPUT
CAT_SOUT
CAT_ADVANCED
CAT_PLAYLIST

set_category(カテゴリ)

コールバックの登録

VLC coreがどうやってインスタンス化と実行するかを知るためにモジュールの有効化と無効化の処理を登録する

set_callbacks(Open, Close)

モジュールの開始

モジュールの開始(有効化)させる処理で、成功したらVLC_SUCCESSを返す。開始中に、

static int Open(vlc_object_t *obj)
{
  intf_thread_t *intf = (intf_thread_t *)obj;

  /* Allocate internal state */
  intf_sys_t *sys = malloc(sizeof (*sys));
  if (unlikely(sys == NULL))
    return VLC_ENOMEM;
  intf->p_sys = sys;

  /* Read settings */
  char *who = var_InheritString(intf, "hello-who");
  if (who == NULL){
    msg_Err(intf, "Nobody to say hello to!");
    goto error;
  }
  sys->who = who;

  msg_Info(intf, "Hello %s!", who);
  return VLC_SUCCESS;

error:
  free(sys);
  return VLC_EGENERIC;
}

モジュールの終了

モジュールを終了させる処理

static void Close(vlc_object_t *obj)
{
  intf_thread_t *intf = (intf_thread_t *)obj;
  intf_sys_t *sys = intf->p_sys;

  msg_Info(intf, "Good bye %s!");

  /* Free internal state */
  free(sys->who);
  free(sys);
}

ffmpegモジュールの例

libavcodecを利用した音声・映像のデコード/エンコード

vlc_module_begin ()
    set_shortname( "FFmpeg")
    add_shortcut( "ffmpeg" )
    set_category( CAT_INPUT )
    set_subcategory( SUBCAT_INPUT_VCODEC )
    /* decoder main module */
    set_description( N_("FFmpeg audio/video decoder") )
    set_help( MODULE_DESCRIPTION )
    set_capability( "decoder", 70 )
    set_section( N_("Decoding") , NULL )
    set_callbacks( OpenDecoder, CloseDecoder )