Windows Vista での DVD 再生の機能強化

[このページに関連付けられている機能である DirectShow はレガシ機能です。 これは、MediaPlayerIMFMediaEngineAudio/Video Capture in Media Foundation に置き換えられました。 これらの機能は、Windows 10 および Windows 11 用に最適化されています。 新しいコードでは、可能な場合は、DirectShow ではなく、MediaPlayerIMFMediaEngineAudio/Video Capture in Media Foundation を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存コードを、新しい API を使用するように可能であれば書き直すことを提案しています。]

このセクションでは、Windows Vista での DVD の再生とナビゲーションの機能強化について説明します。

デコーダーの指定

以前のバージョンの DirectShow では、DVD 再生グラフを構築するときに特定の MPEG-2 デコーダーを指定することは困難でした。 Windows Vista 以降では、アプリケーションでデコーダーを次のように指定できます。

  1. IDvdGraphBuilder::RenderDvdVideoVolume を呼び出す前に、デコーダーをグラフに追加します。
  2. RenderDvdVideoVolume を呼び出し、AM_DVD_DO_NOT_CLEAR フラグを設定します。 DVD Navigator では、追加したデコーダーが優先されます。

拡張ビデオ レンダラーのサポート

Windows Vista 以降用に作成されたアプリケーションでは、ビデオ再生に拡張ビデオ レンダラー (EVR) を使用することをお勧めします。 DVD 再生アプリケーションで EVR を使用するには、RenderDvdVideoVolume を呼び出すときにAM_DVD_EVR_ONLY フラグを設定します。

グラフを作成する前に EVR を構成するには、IDvdGraphBuilder::GetDvdInterface を呼び出し、IEVRFilterConfig または IMFVideoRenderer インターフェイスのクエリを実行します (これらのインターフェイスは、メディア ファンデーション SDK のドキュメントに記載されています)。DVD 再生グラフでのビデオ レンダラーの構成の詳細については、「DVD フィルター グラフの作成」を参照してください。

デコーダーの IAMDecoderCaps::GetDecoderCaps メソッドから AM_GETDECODERCAP_QUERY_EVR_SUPPORT フラグが返されない限り、DVD Navigator では EVR は使用されません。 このフラグは、アプリケーションが既存のデコーダーと互換性があることを確かめるために定義されています。 RenderDvdVideoVolume で AM_DVD_EVR_ONLY フラグの使用に失敗した場合、フラグなしでメソッドをもう一度呼び出して、別のビデオ レンダラーにフォールバックします。

スムーズな逆再生

DVD Navigator でスムーズな逆再生を実行できるようになりました。 スムーズな逆再生では、DVD Navigator からビデオ オブジェクト ユニット (VOTU) 全体がデコーダーに送信され、デコーダーによってフレームが逆順に出力されます。 この機能を使用するには、デコーダーでスムーズな逆再生がサポートされている必要があります。

アプリケーションで再生速度を負の値に設定すると、DVD Navigator によって、デコーダーに対して AM_RATE_ReverseMaxFullDataRate プロパティについてクエリが実行されます。 このプロパティの値は、最大逆速度 x 10000 の絶対値です。 たとえば、最大逆速度が -2.0 の場合、値は 20000 です。

ビデオ デコーダーでそのプロパティがサポートされている場合、DVD Navigator ではスムーズな逆再生が使用されます。 オーディオ デコーダーでプロパティがサポートされている場合、オーディオ ストリームは逆に再生されます。それ以外の場合、オーディオ ストリームはミュートされます。 ビデオ デコーダーでプロパティがサポートされていない場合、または再生レートがビデオ デコーダーの最大逆レートを超えている場合、DVD Navigatorは ''スキャン モード'' に切り替わります。 スキャン モードでは、DVD Navigator により、I フレームのみがデコーダーに送信され、すべての B および P フレームがドロップされます。

スムーズな逆再生中、DVD Navigator から完全な VOBU がデコーダーに送信されます。 DVD Navigator からは、逆順に VOTU が送信されますが、各 VOBU 内のフレームは通常の正順で送信されます。 各 VOBU の開始時に、DVD Navigator によってサンプルに AM_ReverseBlockStart フラグが設定されます。 VOBU の最後に、DVD Navigator によって、空のサンプルが AM_ReverseBlockEnd フラグと共に送信されます。 これらのフラグを取得するには、サンプルで IMediaSample2::GetProperties を呼び出します。 フラグは、AM_SAMPLE2_PROPERTIES 構造体の dwTypeSpecificFlags メンバーで設定されます。

デコーダーによって、AM_ReverseBlockEnd フラグを使用してサンプルが受信されるまでビデオ データがキャッシュされます。 その時点で、デコーダーによって、デコードされたフレームが逆順に配信されます。 たとえば、VOBU 1 にフレーム 1 から 4 が含まれており、VOBU 2 にフレーム 5 から 8 が含まれている場合、DVD Navigator からはこの順序でフレームが送信されます。

(ブロックの開始) F5 F6 F7 F8 (ブロックの最後) (ブロックの開始) F1 F2 F3 F4 (ブロックの最後)

デコーダーでは次のようにフレームを処理する必要があります。

  1. VOBU 2 をデコードします。
  2. 出力フレーム: F8 F7 F6 F5
  3. VOBU 1 をデコードします。
  4. 出力フレーム: F4 F3 F2 F1

DVD Navigator によって、VOBU の最初のサンプル (この例では F1 と F5) にタイム スタンプが設定されますが、そのタイム スタンプにはブロックの開始のプレゼンテーション時間が含まれているため、デコーダーではブロックの最後のサンプル (F4 と F8) にこの時間を適用する必要があります。 逆再生中はプレゼンテーション時間が長くなります。

通常、VOBU には最大 42 個のフレームが含まれており、複数のピクチャ グループ (GOP) が含まれる場合があります。 VOBU 全体をデコードできるようにするには、デコーダーで、デコードされた I および P フレームをキャッシュする必要があります。 DVD の VOBU は閉じた GOP ではないため、GOP 内の B フレームでは、前の GOP のすべての参照フレームをデコードする必要がある場合があります。 デコーダーに、デコードされたすべてのフレームを保持するための十分なサーフェスがない場合は、選択されたフレームを再デコードする必要がある場合があります。

レート変更

既定では、DVD Navigator によってレート変更の間にグラフがフラッシュされます。 ただし、デコーダーで AM_RATE_ResetOnTimeDisc プロパティがサポートされている場合、DVD Navigator によってグラフがフラッシュされず、再生レート間の遷移がスムーズになります。

DVD Navigator では、実際の再生速度に関係なく、常に 1x の速度で再生するためのサンプルにタイム スタンプが付けられます。 デコーダーでは、デコードされたサンプルのタイム スタンプを実際の再生速度に合わせてスケーリングする必要があります (詳細については、「AM_RATE_SimpleRateChange プロパティ」を参照してください)。その結果、1x 以外の速度で再生する場合、デコードされたフレームのタイムスタンプはエンコードされたフレームのものとは異なります。 DVD Navigator によってサンプルに AM_SAMPLE_TIMEDISCONTINUITY フラグが設定されるたびに、デコーダーでそのタイム スタンプを再同期する必要があります。 つまり、デコードされたフレームには、入力フレームと同じタイム スタンプが必要です。 AM_SAMPLE_TIMEDISCONTINUITY フラグを取得するには、サンプルで IMediaSample2::GetProperties を呼び出します。 フラグは、AM_SAMPLE2_PROPERTIES 構造体の dwSampleFlags メンバーで設定されます。

電源管理

Windows Vista では、DVD Navigator を使用すると、電源管理を次のように改善できます。

  • タイマー精度をより高くする
  • データ キャッシュをより大きくする

タイマー精度: アプリケーションでは、timeBeginPeriod 関数を呼び出すことによって、最小タイマー精度を要求できます。 精度が高い (期間が短い) ほど、タイムアウトなどの定期的なイベントに対するシステムの応答性が向上しますが、スレッド コンテキストの切り替えの頻度が増える可能性もあります。

既定では、DirectShow の参照クロックでタイマー精度が 1 ミリ秒に設定されます。 その精度では、CPU は省電力モードに入りません。 Windows Vista 以降、DVD Navigator により、参照クロックで IReferenceClockTimerControl::SetDefaultTimerResolution を呼び出すことで、参照クロックの既定の動作がオーバーライドされます。 これにより、1 ミリ秒のタイマー精度のクロックの要求が削除されます。 これにより、CPU が省電力モードに入る可能性があります。

タイマー精度はグローバル設定です。Windows では要求された最も低い値が選択されます。 ビデオ ミキシング レンダラー (VMR) フィルター (VMR-7 および VMR-9) では、タイマー精度が 1 ミリ秒に設定されます。 通常、EVR では、デスクトップ コンポジションが有効かどうか、および EVR が全画面表示モードであるかどうかに応じて、精度が 4 から 8 ミリ秒の値に設定されます。 他のアプリケーションでも精度が設定される場合があります。

キャッシュ サイズ: アプリケーションでは、IDvdControl2::SetOption メソッドで DVD_CacheSizeInMB オプションを設定することで、DVD Navigator によってキャッシュされるデータの量を指定できます。 アプリケーションでこのフラグを大きな値 (> 50 MB) に設定すると、初期プリフェッチ後に DVD ドライブがスピン ダウンする可能性があり、ハードウェアによっては、消費電力を削減できます。

DVD アプリケーション