レート変更プロパティ セット
MPEG-2 ソース フィルタとパーサー フィルタは、レート変更プロパティ セットを使って、再生レートを変更できる。MPEG-2 デコーダは、このプロパティ セットをサポートする必要がある。DVD ナビゲータとストリーム バッファ エンジンは両方とも、このプロパティ セットを使って再生レートを制御する。
プロパティ セット GUID | AM_KSPROPSETID_TSRateChange |
プロパティ ID | 説明 |
AM_RATE_CorrectTS | ナビゲータが適切なタイム スタンプを設定していることをデコーダに通知する。
これらの問題は、最新バージョンの DVD ナビゲータでは解決している。既存のデコーダとの下位互換性を保つために、DVD ナビゲータでは、値 TRUE でデコーダの AM_RATE_CorrectTS プロパティを設定すれば、タイム スタンプが正しく設定されることを示している。このプロパティが設定された場合、デコーダはプレゼンテーション タイムの予測ではなく、実際のタイム スタンプを使う必要がある。 |
AM_RATE_ExactRateChange | 使われていない。 |
AM_RATE_MaxFullDataRate | デコーダの最大データ レートを問い合わせる。 |
AM_RATE_QueryFullFrameRate | デコーダの最大フルフレーム レートを問い合わせる。 |
AM_RATE_QueryLastRateSegPTS | デコーダに、最新のレート セグメントの有効 PTS を問い合わせる。 |
AM_RATE_SimpleRateChange | レート変更をデコーダに送信する。 |
AM_RATE_Step | 使われていない。「コマ送りプロパティ セット」を参照すること。 |
AM_RATE_UseRateVersion | 使うべきレート変更プロパティ セットのバージョンを指定する。 |
注意
レートは再生速度の逆数で、再生速度が 2 倍速の場合、レートは 0.5 となる。デコーダは、デコードするサンプルのプレゼンテーション タイムをスケーリングして、レートに一致させる。たとえば、レートが 0.5 とすると、プレゼンテーション タイムは通常レートの半分になる。サンプルは通常よりも早くレンダリングされるので、再生速度はより高速となる。
サンプルは、レート 1 のプレゼンテーション タイムに等しいタイム スタンプでデコーダに送信される。デコーダは、出力サンプルのタイム スタンプを現在のレートの正しいプレゼンテーション タイムに合うようスケーリングする必要がある。通常、I フレームだけがタイム スタンプを持っている。デコーダは、B フレームと P フレームのタイム スタンプを補間する必要がある。逆方向再生中は、タイム スタンプは増加し続ける点に注意すること。タイム スタンプが逆戻りすることはない。
レート変更プロパティ セットは、バージョン 1.0 とバージョン 1.1 の、2 つのバージョンが定義されている。デフォルトの動作は、バージョン 1.0 から提供される。デコーダ ベンダーは、バージョン 1.1 をサポートすることを推奨する。バージョン 1.1 の方がよりスムーズに再生されるからである。
レート変更バージョン 1.0
バージョン 1.0 のレート変更プロパティ セットは、MPEG-2 デコーダのデフォルトの動作を定義する。DVD ナビゲータは現在、このバージョンを使っている。
ソース フィルタは、AM_RATE_SimpleRateChange プロパティを設定して、レート変更を知らせる。このプロパティのデータは、新しいレートおよびレートが有効になる入力サンプルの開始タイムである。デコーダは、開始タイムでソートされたペンディング状態のレート変更のキューを維持する。
DVD ナビゲータは 1 倍速以外の速度に変更する前に、ペンディング状態のサンプルをすべて出力し、一時的にレートを 1.0 に設定し、グラフをフラッシュする。次に、新しいレートを設定する。すべてのレート変更は、現在のビデオ オブジェクト単位 (VOBU) の最後にスケジュールされている。グラフをフラッシュすると、プレゼンテーション タイムがゼロにリセットされる点に注意すること。
DVD ナビゲータは、スムーズ モードでもスキャン モードでも動作する。スムーズ モードでは、B フレームや P フレームを含むすべてのフレームをデコーダに送信する。DVD ナビゲータは、再生速度がゼロより大きいがデコーダの最大データ レートより小さい場合は必ずスムーズ モードを使う。再生速度がゼロより小さい (逆方向再生) か、デコーダの最大データ レートを上回る場合、DVD ナビゲータはスキャン モードを使い、デコーダには I フレームしか送信しない。超高速時には、I フレームをいくつかスキップする場合がある。たとえば、1 つおきに I フレームを送信する場合がある。
デフォルトでは、DVD ナビゲータは 1.0 以外のレートのオーディオ ストリームをミュートする。このデフォルト設定を変更するには、DVD_AudioDuringFFwdRew フラグを設定して、IDvdControl2::SetOption を呼び出す。
レート変更バージョン 1.1
バージョン 1.1 のレート変更プロパティ セットも基本原則はバージョン 1.0 と同じだが、次の点が異なる。
- ソース フィルタはデコーダにバージョン 1.1 を使うよう通知するために、AM_RATE_UseRateVersion プロパティを設定する。それ以外の場合は、デコーダはバージョン 1.0 の動作を使う必要がある。
- ソース フィルタは、レート変更間でグラフをフラッシュしない。したがって、タイム スタンプはレート変更の境界をまたがって単調に増加し、ゼロにはリセットされない。
- ソース フィルタは、特定の基準タイムのレート変更をキューに入れるのではなく、デコーダの送信キューの先頭のサンプルとして定義され、デコーダの最前サンプルにレート変更を適用するよう指定できる。そのように指定するには、ソース フィルタは AM_RATE_SimpleRateChange プロパティを使って開始タイムが -1 と等しくなるよう設定する。
- ソース フィルタは、デコーダに対して最後にキューに入れられたレート変更の開始タイムを照会できる。照会には、AM_RATE_QueryLastRateSegPTS プロパティを使う。
- ソース フィルタは、オーディオ デコーダの最大データ レートにかかわりなく、オーディオ ストリームはミュートしない。オーディオ デコーダは、再生速度がデコーダの最大レートを上回ると、サンプルをドロップできる。ただし、その場合でもスケジュールされたレート変更のキューを維持する必要がある。
詳細については、個々のプロパティのリファレンス ページを参照すること。
レート セグメントの算出方法
以下の図では、出力タイム スタンプ (y) は次の式で求められる。
y = r(x - xi)
ここで、x は入力タイム スタンプ、r はレート、xi は現在のレートの x 切片である。この式は、xi の位置における y = mx + b から求められる。ここで、m は勾配 (r)、b は y 切片である。このことから b = -m(xi) が求められるので、式 y = mx + b に代入する。
デコーダは x 切片を次のようにして求める。仮定 :
r1 = 前のレート
r2 = 現在のレート
xi1 = 前のレート変更の x 切片
xi2 = 現在のレート変更の x 切片
x = 現在のレート変更の開始タイム
未知の xi2 は、y = r2(x - xi2) = r1(x - xi1) を解くことによって求められる (次の図を参照すること)。こうして、次の結果が得られる。
xi2 = (r1 / r2)(xi - x) + x
タイム 0、r1 = 1、xi1 = 0 で再生が 1 倍速のような特殊な場合は、次のように計算する。
要件
Dvdmedia.h をインクルードすること。
参照