DirectShowのIMediaFilter::SetSyncSourceについて

解決


ds  2010-09-26 23:12:15  No: 71947

DirectShowのHELPの中の『グラフクロックの設定』にSetSyncSource()の例文がありますが、そこで仮に使われている
hr = CreateMyPrivateClock(&pClock);
なる、『クロックを作成し、IReferenceClock ポインタを返すアプリケーション定義関数』の内容をご存知の方は教えていただけませんか。
いろいろ調べていくと、クロック、アドバイズ、セマフォと出てくるのですが、&pClockに関連付けるところがどうもよくわかりません。
お願いいたします。


gak  2010-09-29 02:52:19  No: 71948

HRESULT CreateMyPrivateClock(IReferenceClock** clock) {
    return ::CoCreateInstance(CLSID_SystemClock, NULL, CLSCTX_INPROC_SERVER, IID_IReferenceClock, reinterpret_cast<void**>(clock));
}

システムクロックで良いなら↑で良いんじゃね。
システムクロックがダメなら IReferenceClock を継承して独自に実装したモノを此処で作って返してやれば良いかと。


ds  2010-09-29 09:28:07  No: 71949

gakさん、ありがとうございます。
>システムクロックがダメなら IReferenceClock を継承して独自に実装したモノ・・・・
を作りたいのですが、どうしたらいいでしょう。
私の考え方が間違っているのかもわかりませんが
・DirectShowの基準クロック・・・・システムクロック基準(標準)。
・基準クロックを自作クロック(システムクロックの2倍速、0.5倍速など・・)にてセット(SetSyncSource())してやれば再生も2倍速、0.5倍速・・になるのでは。
・IMediaSeeking::Rate()ではAVIファイルくらいしか対応できなののでは・・と思っていますので、すべてのビデオファイルに対応できるのはクロックを変えるのがいいのかな〜〜と。

と考えていますが、間違っているのでしょうか。
そこで、自作クロックを作りたいのですが、その作り方と、実装の仕方を教えていただけないでしょうか。


gak  2010-09-30 02:43:40  No: 71950

> 自作クロックを作りたいのですが、その作り方と、実装の仕方を教えていただけないでしょうか。
C++ならば、WindowsSDKに含まれるrefclock.hで定義されている CBaseReferenceClock の派生クラスを書けば良い。
DirectShowがDirectXからハブられる以前のDirectXSDK(2004年以前?)を使っているならば其れにもrefclock.hは含まれているハズ。
Cで組んでるならば、CBaseReferenceClockの内部処理を参考にしてCOMインターフェースの流儀に則って自力で全部書く。
自作クロックを他のプログラムから使用する気が無いならばCOM登録する必要は無い。

> 自作クロック(システムクロックの2倍速、0.5倍速など・・)
CBaseReferenceClock::AdviseTime
CBaseReferenceClock::AdvisePeriodic
CBaseReferenceClock::GetPrivateTime
CBaseReferenceClock::SetTimeDelta

↑辺りをオーバーライドして時間を弄くってやれば良いのではないかと。


ds  2010-09-30 09:35:04  No: 71951

gakさん、いつもありがとうございます。
「CBaseReferenceClock」でCOMインターフェースですか・・・
なんか光明が・・・頑張ってみます。
AdvisePeriodic  →  セマフォの線を再度調べなおしてみます。
助言ありがとうございました。


ds  2010-11-19 09:37:33  No: 71952

error LNK2028,2019

の疑問解決にて解決いたしました。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加