Microsoft DirectX 8.0

IAMTimecodeReader インターフェイス

IAMTimecodeReader インターフェイスを実装すると、外部デバイスからの SMPTE (Society of Motion Picture and Television Engineers) タイムコードや MIDI タイムコードを読み取ることができるようになる。このインターフェイスでは、外部デバイスが読み取るタイムコード フォーマット、およびそのタイムコードをメディアに埋め込む方法を指定するプロパティとメソッドを備えている。このインターフェイスは、IAMExtDevice インターフェイスおよび IAMExtTransport インターフェイスと共に使用して、VCR などのようにタイムコード データを読み取ることができる外部デバイスを制御することが求められる。

SMPTE タイムコードはフレーム アドレッシング システムで、ビデオ ソースとオーディオ ソースを識別し、自動トラック同期を実現し、さらにソース マテリアルに関する付加データのコンテナとしての役割を果たす。SMPTE タイムコードの一番の目的は、ビデオとオーディオ用の、マシンで読み取り可能なアドレスを提供することである。これは hh:mm:ss:ff (時間、分、秒、フレーム) フォーマットで表示され、ANSI/SMPTE 12-1986 で定義されている。

SMPTE タイムコードの詳細については、「SMPTE タイムコード」を参照すること。

外部デバイスが SMPTE/MIDI タイムコード情報を読み取る方法を指定する場合は、外部デバイス フィルタにおいてこのインターフェイスを実装する。

フィルタ上で IMediaSeeking インターフェイスを公開することによって、アプリケーションはその IMediaSeeking::ConvertTimeFormat メソッドを使用して、タイムコードを Microsoft® DirectShow® 基準タイムに変換できる。

外部デバイスは、タイムコードを読み取り、そのコントロール インターフェイスを介してこれをコンピュータに送信できる必要がある。外部デバイスがこの機能を備えていない場合は、コンピュータにタイムコード リーダー カードを装着するか、キャプチャされたビデオ フレーム内の VITC (Vertical Interval Timecode)、またはオーディオ信号としてキャプチャされた LTC (Linear Timecode) を、DirectShow タイムコード サンプルに変換するソフトウェア デコーダを作成する必要がある。

タイムコード情報を読み取って外部デバイスを制御する必要がある場合、または元のプログラム情報を参照しなければならない外部デバイスからのタイムコード情報をアプリケーションの中で使用する場合は、このインターフェイスを使用する。

通常、アプリケーションがタイムコードを保存するには 2 とおりの方法がある。キャプチャ ファイルに対して、追加のストリームとして書き込む方法と、拡張 AVI ファイル インデックスに格納される不連続性テーブルとして書き込む方法である。タイムコードは、キャプチャや再生をトリガする場合、または最終結果に至るまでのソース マテリアルの編集方法を記述する EDL (Edit Decision List) を作成する場合に、一般的に使用される。

タイムコードをキャプチャする場合は、これを、自身のメディア タイプを持つ個別のストリームとして扱う。マルチプレクサ フィルタを作成することによって、適切なファイルがこれを使用できる。ただし、テープからタイムコードを読み取る場合は、しばしばエラーが発生する。これは、テープのデータが抜けていたり、テープに関するその他の機械的な問題が原因である。このような場合、タイムコード ソース フィルタは単純にサンプルを破棄し、次の有効なサンプルに不連続性のプロパティのマークを付ける。

タイムコードを使用して、タイムコード付き ("ストライプ") ビデオテープからのキャプチャまたは再生をトリガする場合は、次の順序で操作を行う。

  1. キャプチャ グラフを作成し、目的の AVI ファイルを開き、必要に応じてディスク領域を事前に割り当てる。キャプチャするマテリアルを既存の AVI ファイルに追加する場合は、書き込む前にファイルの終端をシークする。キャプチャ グラフはこの位置でポーズする。
  2. VCR のキャプチャ開始点を検索し、タイムコードを記録する。この値は手動でプログラムに入力することも、アプリケーションが自動的に読み取ることもできる。自動読み取りの場合、グラフが実行していることが求められる。しかし、ファイル マルチプレクサの入力ピン上のストリーム コントロール インターフェイスが、受信サンプルを破棄することによってキャプチャを効率的に制御している必要がある。
  3. VCR をプリロール位置まで頭出しする。これは通常、ターゲット点の 5 秒前である。
  4. VCR とグラフを開始する。トリガ点、またはトリガ点からファイル ライタのプリロールを引いた時点に達すると、ストリーム コントロール インターフェイスはファイル マルチプレクサを解放し、ファイル ライタへのメディア サンプルのストリーミングを開始する。
  5. キャプチャ処理は手動で停止することも、ストリーム コントロール インターフェイスで時間幅のプロパティを設定することによって停止することもできる。

プリロール時とキャプチャ処理時の両方について、不連続なタイムコードを考慮する必要がある。タイムコードは一般的に、プリロールとキャプチャの開始点以降、連続的、かつ単調増加していくことが望まれる。この状態であれば、IMediaSeeking::ConvertTimeFormat メソッドによる、必ずしも明確でない相対的なストリーム タイムを計算しなくて済む。また、タイムコードが、キャプチャをトリガする唯一の制御信号である必要もない。Intercast やクローズド キャプション データ (XDS) などのように、垂直同期間隔に格納されるタイム スタンプ付きデータを使用して、ビデオ データとオーディオ データのディスクへのストリーミングを開始できる。

ハードウェアの要件

ハードウェアの要件については、「IAMExtTransport インターフェイス」を参照すること。

vtable 順のメソッド

IUnknown メソッド説明
QueryInterface サポートされているインターフェイスへのポインタを取得する。
AddRef 参照カウントをインクリメントする。
Release 参照カウントをデクリメントする。
IAMTimecodeReader メソッド説明
GetTCRMode タイムコード リーダーのプロパティを取得する。
SetTCRMode タイムコード リーダーのプロパティを設定する。
put_VITCLine タイムコード リーダーがタイムコードを読み取るときに使用する VITC (Vertical Interval Timecode) ラインを指定する。
get_VITCLine タイムコード リーダーがタイムコードを読み取るときに使用する VITC ラインを取得する。
GetTimecode 最新のタイムコード、ユーザービット、およびストリーム内で有効なフラグ値を取得する。

IAMTimecodeReader::GetTCRMode

IAMTimecodeReader インターフェイス

タイムコード リーダーのプロパティを取得する。

構文

HRESULT GetTCRMode(

  long Param,
  long *pValue
  );

パラメータ

Param
[in] 設定値を取得する元となるタイムコード リーダーのプロパティ (ED_TCR_SOURCE または ED_TCR_NOTIFY_ENABLE)。
pValue
[out] 要求されたタイムコード リーダー プロパティの値へのポインタ。Param に ED_TCR_NOTIFY_ENABLE が指定されている場合は、通知が有効であることを表す OATRUE、または OAFALSE を返す。Param に ED_TCR_SOURCE が指定されている場合は、次のいずれかの値を返す。
ED_TCR_CT コントロール トラック
ED_TCR_LTC LTC (Linear Timecode)
ED_TCR_VITC VITC (Vertical Interval Timecode)
ED_TCR_LAST_VALUE 前回の読み取り値

戻り値

インターフェイスの実装に応じた HRESULT 値を返す。

注意

LTC は、アナログ オーディオ トラック上でバイフェーズ マーク エンコード信号として記録される。各タイムコード フレームは、時間幅内の 1 つのビデオ フレーム タイムである。

VITC は、通常、ビデオ信号の垂直同期間隔の、11 から 20 の範囲内の 2 つのラインに格納される。

コントロール トラックは、テープ上の特別なトラックに、1 フレームあたり 1 回記録される信号である。ヘッドおよびドライブ サーボのメカニズムでは、これを使用してすべてをロックする。また、タイムコード機能を備えていないマシン上でカウンタを操作するのに使用したり、場合によってはタイムコード リーダーが装備されているマシン上でも使用できる。

ED_TCR_LAST_VALUE は、外部デバイスに対してほかのタイムコード要求を送ることがアプリケーションで望まれない場合、タイムコード通知を実装するときに使用される。この方法はマルチスレッドに関する問題があるので、フレームの正確さが要求されるアプリケーションでは、その使用は推奨されない。

参照

IAMTimecodeReader::SetTCRMode

IAMTimecodeReader::GetTimecode

IAMTimecodeReader インターフェイス

最新のタイムコード、ユーザービット、およびストリーム内で有効なフラグ値を取得する。

構文

HRESULT GetTimecode(
  PTIMECODE_SAMPLE pTimecodeSample
  );

パラメータ

pTimecodeSample
[out] TIMECODE_SAMPLE タイムコード構造体へのポインタ。

戻り値

インターフェイスの実装に応じた HRESULT 値を返す。

注意

このメソッドを使用すると、タイムコードを監視し、重複と不連続性を解析できる。タイムコードを提供するソース フィルタ、および場合によってはダウンストリーム フィルタでは、不連続性やエラーを解析することが望まれる。これは、最新のタイムコードを取得するために、すべてのサンプルを参照する必要があるためである。

アプリケーションでは、タイムコード情報に未定義のビットを設定して、同期情報を格納したり、元のフィルム情報とオーディオ テープ情報をエンコードできる。このような未定義ビット、つまりユーザービットは、このメソッドを呼び出すことによって取得される。

IAMTimecodeReader::get_VITCLine

IAMTimecodeReader インターフェイス

タイムコード リーダーがタイムコードを読み取るときに使用する VITC (Vertical Interval Timecode) ラインを取得する。

構文

HRESULT get_VITCLine(
  long *pLine );

パラメータ

pLine
[out] タイムコード情報を格納している、11 から 20 の範囲内のラインへのポインタ。

戻り値

インターフェイスの実装に応じた HRESULT 値を返す。

注意

ハイ ビットは複数のラインが使用されていることを表し、ライン番号に対して呼び出しが連続して行われる。

参照

IAMTimecodeReader::put_VITCLine

IAMTimecodeReader::put_VITCLine

IAMTimecodeReader インターフェイス

タイムコード リーダーがタイムコードを読み取るときに使用する VITC (Vertical Interval Timecode) ラインを指定する。

構文

HRESULT put_VITCLine(
  long Line );

パラメータ

Line
[in] タイムコード情報を格納する、11 から 20 の範囲内のライン。

戻り値

インターフェイスの実装に応じた HRESULT 値を返す。

注意

IAMTimecodeReader::SetTCRMode メソッドで VITC モードが指定されている場合は、タイムコード情報を含むラインを指定する必要がある。特定の複数のライン上の VITC を読み取るには、目的のラインごとに put_VITCLine を連続して呼び出す。

ハイ ビットをセットしてラインのリストに追加することによって、リーダーが複数のラインを調べる。

参照

IAMTimecodeReader::get_VITCLine

IAMTimecodeReader::SetTCRMode

IAMTimecodeReader インターフェイス

タイムコード リーダーのプロパティを設定する。

構文

HRESULT SetTCRMode(
  long Param,
  long Value
  );

パラメータ

Param
[in] 設定するプロパティ。ED_TCR_SOURCE または ED_TCR_NOTIFY_ENABLE を設定する。
Value
[in] 指定のプロパティの値。Param に ED_TCR_NOTIFY_ENABLE が指定されている場合は、OATRUE または OAFALSE を指定する。Param に ED_TCR_SOURCE が指定されている場合は、次のいずれかを指定する。
ED_TCR_CT コントロール トラック
ED_TCR_LTC LTC (Liner Timecode)
ED_TCR_VITC VITC (Vertical Interval Timecode)
ED_TCR_LAST_VALUE 前回の読み取り値を返す

戻り値

インターフェイスの実装に応じた HRESULT 値を返す。

注意

LTC は、アナログ オーディオ トラック上で NRZ バイフェーズ マーク エンコード信号として記録される。各タイムコード フレームは、時間幅内の 1 つのビデオ フレーム タイムである。

VITC は、通常、ビデオ信号の垂直同期間隔の、10 から 20 の範囲内の 2 つのラインに格納される。

コントロール トラックは、テープ上の特別なトラックに、1 フレームあたり 1 回記録される信号である。ヘッドおよびドライブ サーボのメカニズムでは、これを使用してすべてをロックする。また、タイムコード機能を備えていないマシン上でカウンタを操作するのに使用したり、場合によってはタイムコード リーダーが装備されているマシン上でも使用できる。

ED_TCR_LAST_VALUE は、外部デバイスに対してほかのタイムコード要求を送ることがアプリケーションで望まれない場合に、タイムコード通知を実装するときに使用される。この方法はマルチスレッドに関する問題があるので、フレームの正確さが要求されるアプリケーションでは、その使用は推奨されない。

参照

IAMTimecodeReader::GetTCRMode