次の方法で共有


レート変更プロパティ セット

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 倍速のような特殊な場合は、次のように計算する。

レート変更の x 切片の計算

要件

Dvdmedia.h をインクルードすること。

参照