概要

いつも使っているプレイヤーで、AVIファイルをダウンロードしながら再生します。
(HTTP(S)/FTP経由でAVIファイルを擬似ストリーミング再生するDirectShowフィルタです)


ダウンロード


インストール方法

  • Debugフォルダ内のpfsource.infを右クリックして[インストール]を選択


アンインストール方法

  • コントロールパネルの[アプリケーションの追加と削除]から、 [Progressive File Source]を選択して削除


動作環境

  • Windows
  • DirectX 9c以降


状態

開発中公開中



開発関連データ


次期構想

1バッファ + ダウンローダープール (+ 1プレバッファ )

clipboard11.png
  • フィルタ全体でひとつのバッファを持ち、複数のマネージャーが分割して使用
  • 複数のダウンローダーをプールしておき、マネージャーは空いているダウンローダーを探して使用
  • リブ差の大きいファイルに対する、これまでの方法を変更する
    • マネージャー数はAVIファイルのインデックス情報をもとに自動的に決定
      • インデックス情報の予測ダウンロードだけでなく、インデックス情報を解析しリブ差が大きい場合は1ストリーム対1マネージャーにする
  • ユーザーはフィルタ全体のバッファサイズとダウンローダー数を指定する
clipboard07.png

リブ差の小さいファイル(1つの映像ストリーム、1つの音声ストリーム) → これまで通り、またはフィルタ全体で1つのマネージャーを使用する

clipboard08.png

リブ差の大きいファイル(1つの映像ストリーム、1つの音声ストリーム) → 1ストリームに1マネージャを割り当てる(この場合フィルタ全体で2つのマネージャを使用する)

clipboard10.png

リブ差の小さいファイル(1つの映像ストリーム、2つの音声ストリーム) → これまで通り、またはフィルタ全体で1つのマネージャーを使用する


構成

新しいネゴシエータ以下の構成:

pff.png

CRACRMemBufferとCRACRFileBufferの使い分け:

pfsdev.20061019.png

(1)はメモリバッファ + メディアサンプル内ポインタの書き換えに対応したスプリッタ(例えばgabest氏AviSplitter)の場合
(2)はメモリバッファ + メディアサンプル内ポインタの書き換えに対応しないスプリッタ(例えばquartsのAviSplitter)の場合
(3)はファイルバッファの場合


経緯(複数セッションによるダウンロード実装まで)


  • 2006/10/26 - バッファの空き待ち後にフラグメントの連続が正しく認識されないことがある問題を修正 - filepfsdev.20061026.zip
    • バッファ操作を見直してシンプルにしました。
    • 次回からpfsourceに組み込んでテストです。
  • 2006/10/23 - CRACRFileBuffer完了
    • 「バッファの空き待ち後にフラグメントの〜」はもう少し時間がかかるかも。
      今週末までには終わらせてpfsourceへの組み込みテストに移りたいけど・・・
  • 2006/10/21 - FTP(S)Downloaderの移植完了 - filepfsdev.20061021.zip
  • 2006/10/19 - メモ1,5完了 - filepfsdev.20061019.zip
  • 2006/10/18 - メモ6完了 - filepfsdev.20061018a.zip
    pfsdev.20061018a.gif
  • 2006/10/18 - 今度こそバッファ修正完了メモ4修正完了 (テストするにはマネージャーとリーダーを起動、ぐるぐる回り続ければOK) - filepfsdev.20061018.zip
    • フラグメントの表示方法を変更(フラグメントベクタへの同時アクセスでイテレータが無効になる。
      表示のためにベクタの排他処理をしてダウンロードを重くしたくないので個々のフラグメントは表示しないでフラグメント量のみ表示に変更)
      • メモ6: ダウンローダーを列挙してセグメントとダウンロード済みサイズの表示をして、フラグメント表示に似せる
    • メモ5: ダウンローダー異常停止時にダウンロードできなかった領域を探してダウンロードし直す
  • 2006/10/17 キープサイズによる自動破棄がうまく動いてない?
    pfsdev.20061017.png
    これで1周目の問題もなくなる気がするんだけど・・だめかな
    • メモ4: cスケールとbスケールの相互変換に問題がある
    • メモ2,3 修正完了
  • 2006/10/16 - 調整完了のはず. 次はメモ1を修正してFTP(S)Downloaderの移植を完了させる - filepfsdev.20061016b.zip
  • 2006/10/16 - マネージャー微調整途中 - filepfsdev.20061016a.zip
    pfsdev.20061016.png
    • メモ3: cp増加後にマネージャーが異常な位置からダウンローダーを起動させる
  • 2006/10/16 - バッファ操作の修正 - filepfsdev.20061016.zip
  • 2006/10/15 - 新しいマネージャー CHTTP(S)Downloader完了 CFTP(S)Downloader移植ほぼ完了 - filepfsdev.20061015.zip
    • メモ2: ダウンロード中に読み取りをするとダウンローダーが止まる
      • cp移動後バッファに空き領域を問い合わせるとE_〜が返ることがある - バッファ操作に問題がある
    • メモ1: ダウンローダー::set_BufferをしたときにgetEmptyBlockのE_NOTIMPLを検出してwriteに切り替える
  • 2006/10/14 - 新しいマネージャー CHTTP(S)Downloader移植ほぼ完了 - filepfsdev.20061014a.zip
  • 2006/10/14 - 新しいマネージャー 読み取り側を実装 CHTTP(S)Downloader移植途中 - filepfsdev.20061014.zip
  • 2006/10/10 - 新しいマネージャー セグメント管理を実装 CNullDownloaderでテスト 次は読み取り側 - filepfsdev.20061010a.zip

ダウンローダー3個 セグメントサイズ1MB

pfsdev.20061010.png
pfsdev.20061010d.png

ダウンローダー6個 セグメントサイズ1MB

pfsdev.20061010c.png


経緯(開発記録サルベージ)

※日記で書いていたpfsourceに関する小言などをサルベージしたものです。


pfsourceのFTP(S)を使用した再生が不安定(かもしれない)問題、

データ転送終了後にFTPのコントロールコネクションが返すはずのメッセージが来なくて、

それを待ってタイムアウトしてるのが原因です。


データコネクションの切断方法が悪くて、

サーバーがデータコネクションの切断を検出できないのかも。

ちゃんとshutdownしてから閉じてるんだけどなぁ・・


コントロールのほうで転送を中止するように

明示的にABORコマンドを送ったほうが良いのかも。


複数セッションでのダウンロードのほうは順調なのですが、

memcpyを使わない再生(CPU負荷が軽い)については、

再び先行きが怪しくなりました!


これまでの経緯...


フィルタ間のデータの受け渡し方法には、

非同期と同期の二つの方法があります。


memcpyを使わない再生は、非同期でデータを渡す際に、

バッファのポインタを書き換えることで実現しています。


quartsのAVI Splitter(Windowsに最初から入ってるやつ)は、

非同期で読み取りをする前にバッファのポインタをキャッシュしているので、

pfsource側でポインタを書き換えても無視してくれます。


そこで最近まで、

gabest氏のAvi Splitterを使って実験してきました。


そして最近、さっき、gabest氏のAviSplitterは、

そもそも非同期読み取りをしてない

ことが分かりました。


というわけで、memcpyを使わない再生は、

思いっきり振り出しに戻りました


何だったーのかね今までの時間は。

わざわざブランチまでしたのに。


他にもAVI Splitterが無いか探してみたら、

Haali氏(Matroskaのほうの方)のMediaSplitterが、

AVIもSplitできることが分かりました!

http://haali.cs.msu.ru/mkv/


でもこれも非同期読み取りしてませんでした。


gabest氏のAviSplitterを元に、いいかげん自分で組みます。

完成はいつになるか...

...AvI SpLItΤErめ!!


pfsource、vectorでのダウンロード数が累計1万を超えました。

ありがとうございます。

その割にクレームがないのが謎です。

危険ではないけどでかいバグが2つもあったのにー。(後述


もともとpfsourceのサイトへのアクセスは少ないから、

大げさで書き込みづらい(と個人的に思うけどテキトーな理由で開設した)xoopsやめて、

質素な掲示板と手書きページに替えようかなー


ちなみに最近うちで一番アクセスされてるページは

CIL(MSIL)メモ バックアップでした。

でもあれは、スタックさえ考えてれば良いし、

Reflectorあるし、難読化もあれ以来考えてないし・・

またメンヘるまで放置


それで最近メンタルヘルス的な調子が良いので、

暗い日記を書くこともなく、

左上の予定とやりたいことに専念できているのですが、

pfsourceのほうに、調子が悪いときに弄ってできたバグが見つかってます。


1. 認証情報を含んだURLを渡した時に正常に接続できない

変数をインクリメントするのを忘れてました。


2. FTPSサーバーに接続できない

今pfsdevで作ってる物でも同じ現象が起こりました。

いろいろ調べたところ、SSL接続の開始時に

非ブロッキングソケットを渡しているのに、

一度しかSSL_connect()を評価していないのが原因でした。

あと変数名の間違いも・・


OpenSSLを使ったSSL接続に非ブロッキングソケットを使う場合は

何度かSSL_connect()を繰り返す必要があるそうです。

http://www.openssl.org/docs/ssl/SSL_connect.html

SSL_connect()が1を返すまで繰り返したところ正常に接続できるようになりました。


初期のpfsourceで正常にFTPS接続ができたのは、

ブロッキングソケットだったからです。


またHTTPSのほうが正常に動くのは、

FTPSでいうImplicitだからでした。


どちらのバグにも半年近く気づきませんでしたが、

まあ今気づいたので良いと言うことでー・・

http://images.xenowire.net/pfsource.0041.nosrc.lzh


http://images.xenowire.net/pfsource.0038.nosrc.lzh

http://images.xenowire.net/pfsource.0038.lzh (ソース)

認証用ダイアログ表示時にフォーカスが自動で移らない問題を修正


gabest氏のAviSplitterを利用できるようにするに当たって・・・


1.

gabest氏のAviSplitterを静的にリンクする。

そしてpfsourceをGPLにする。

インストールが簡単


2.

AVI再生時にgabest氏のAviSplitterをシステムから検索して、

優先的に使用する。

gabest氏のAviSplitterの利用を前提としているので、

恐らくpfsourceをGPLにする必要あり?

インストールが簡単


3.

pfsourceの設定画面で、

システムで使用できるAVIスプリッタを列挙して、

ユーザーにAVIスプリッタを選んでもらう。

ポインタの書き換えによるデータの受け渡しをするかどうかも、

チェックボックスを付けておいてユーザーに選んでもらう。

gabest氏のAviSplitterが利用されるかどうかについて、

pfsourceの開発段階では確定的でないということで、

pfsourceをGPLにしない。

インストールが若干面倒


もともとpfsourceはオープンソースだし、

GPLにしても良いのだけど、

その場合コンパイルできる形でソースコードを配布しないとならなくて、

そうするとMS製のDirectX SDKのコードも再配布する必要があって、

それはDirextX SDKのほうのライセンスに違反する??


というわけで3か・・


http://images.xenowire.net/pfsource.1001.nosrc.lzh

http://images.xenowire.net/pfsource.1001.lzh (ソース)


やっとmemcpyを減らすことが出来ました。

リングバッファの切れ目をまたいで取得する場合を除いて、

memcpyを使用せず、ポインタの書き換えのみでデータをやり取りします。

CPU負荷がかなり軽くなっていると思います。


これに伴い、quarts.dllのAVI Splitterを使うのを諦め、

gabest氏のAVI Splitterを優先的に接続することにしました。

pfsource1xxxは今後この仕様で作っていく予定です。


とりあえず版なので、エラーが出たり落ちたりフリーズする可能性が高いです。


gabest氏のAVI Splitterは http://sourceforge.net/project/showfiles.php?group_id=03&package_id=41&release_id=0402 よりダウンロードしてください。

ダウンロード後 regsvr32 avisplitter.ax で登録し、

DirectShowフィルタのメリット値設定ソフトなどで、

gabest氏のAVI Splitterが優先的に使用されるようにしてください。


(インストールが面倒ですが、暫くの間勘弁してください。

再配布条件などの確認が済み次第、メリット値を使用しない優先的な接続と、

アーカイブへの取り込み、infファイルの対応などを行いたいと思います。)


pfsourceのmemcpyが重い問題、

これまでアロケータを提供することで解決しようとしてきましたが、

今回は違う方法でやってみました。

結局だめだったんですが。

メディアサンプルが持っているバッファへのポインタを、

リングバッファへのポインタで無理やり書き換えてみました。

pf2.png

※かなり簡略化した図です

quartsのAVI Splitterは、バッファへのポインタを

WaitForNextを呼び出す前にキャッシュしていて、

WaitForNextで別のバッファへのポインタを含むメディアサンプルを返しても無視して、

キャッシュしておいたポインタのほうを使用しているようです。

他にも色々試したけどなかなか気に入ってもらえません。

いよいよquartsのAVI Splitter使うのやめるか


pfsourceに久々に手をつけてみました。

相変わらずquartsのAVI Splitterは、

こっち側のアロケータを使ってくれません。

やっぱりAVI Splitter組み込まないとだめかな。

それから、再生中のファイルを、

プレイヤー側で保存できるようにするための

インターフェイスを探してみましたが見つからず。

オープンソースなプレイヤーを参考にしてやってみる予定です。


http://images.xenowire.net/pfsource.0034.nosrc.lzh

http://images.xenowire.net/pfsource.0034.lzh (ソース)

・テンポラリファイルへのバッファリングを実装

・プロパティページの修正

・認証情報を含まないURLに@マークが含まれる場合に正常に再生されない問題を修正

時間無いくせに触って気づいたら日付変わってるし・・


http://images.xenowire.net/pfsource.0031.nosrc.lzh

http://images.xenowire.net/pfsource.0031.lzh (ソース)

データの送受信でイベントオブジェクトを再利用するようにした.


http://images.xenowire.netpfsource.0024.nosrc.lzh

http://images.xenowire.net/pfsource.0024.lzh (ソース)

シーク時に重複ダウンロードが起こる問題を修正

0022に引き続きプロパティページの変更(途中)


pfsource.0022.png

http://images.xenowire.net/pfsource.0022.nosrc.lzh

http://images.xenowire.net/pfsource.0022.lzh (ソース)

スキップサイズを実装

拡張子DIVXに対応

プロパティページを強化(途中)

SSLライブラリをスタティックリンクに


http://images.xenowire.net/pfsource.0017.nosrc.lzh (リリースビルド版 ソース無し)

http://images.xenowire.net/pfsource.0017.lzh (ソース同封)

0016で改悪した(ftp:// が利用できなくなっていた)部分を修正


http://images.xenowire.net/pfsource.0016.nosrc.lzh (リリースビルド版 ソース無し)

http://images.xenowire.net/pfsource.0016.lzh (ソース同封)

FTPS(SSL Explicit(AUTH SSL) Private(PROT P))に対応

バージョン情報の追加

サポートサイトを作成


何のことはない

auth.png

↑に勝手に名前付けて呼んでるだけですが、

これに入力したIDとパスワードをpfsourceから参照したい。

さすがにURL入力欄に毎回

http://<user>:<pass>@localhost/test.avi

とか面倒だし・・・

でも対話型認証で入力された認証情報は

HRESULT

IFileSourceFilter::Load(

 LPCOLESTR pszFileName,

 const AM_MEDIA_TYPE *pmt

);

のpszFilenameには反映されない。

どうやって取ってくりゃいいんだか・・・

IE周りっぽいけども・・・


・・・取ってくるなんて無理か。

MSの「File Source (URL)」フィルタは、ソケット直接弄らずAPI使って

データ取ってくるから対話型認証の認証情報使える(うろ覚え)。

で間接的にURLMonikerのURLOpen〜関数を使ってる(うろ覚え)。

でURLMonikerのURLOpen〜関数にはオフセット指定機能が無い(調べた)からpfsourceでURLMonikerを使うわけにもいかず。

というかオフセット指定があったらMSがとっくの昔にシーク可能なURLソースフィルタ出してるはずだし。

おまけにURLMonikerには認証情報だけ取り出す関数なんて無いくさいし。

有ったら有ったで悪用されるだろうし。

諦めるかなぁ


更に調べたら・・・

IHttpNegotiate::BeginningTransaction

を使えばHTTPに関してはリクエストヘッダを弄れるかも。

FTPに関してはむりぽい・・・?


http://images.xenowire.net/pfsource.0015.nosrc.lzh (リリースビルド版 ソース無し)

http://images.xenowire.net/pfsource.0015.lzh (ソース同封)

FTPのレスポンス受信方法を修正


http://images.xenowire.net/pfsource.0014.nosrc.lzh (リリースビルド版 ソース無し)

http://images.xenowire.net/pfsource.0014.lzh (ソース同封)

HTTPレスポンスコード200を受け入れるよう変更

HTTPレスポンスヘッダの受信ミス修正

(CRLFCRLFを待つべき所でCRLFを待ってましたorz... vocho氏thxです)

バッファの状態表示に対応


http://images.xenowire.net/pfsource.0012.nosrc.lzh (リリースビルド版 ソース無し)

http://images.xenowire.net/pfsource.0012.lzh (ソース同封)

シーク時や停止時のフリーズを解消

pfsource.0012.png

忌まわしいBeginFlush


http://images.xenowire.net/pfsource.0007.nosrc.lzh (リリースビルド版 ソース無し)

http://images.xenowire.net/pfsource.0007.lzh (ソース同封)

ポーリングを廃止

SSL切断手順を修正

エラー処理とバッファオーバーラン対策を強化

フィルタの状態表示のためのプロパティページを追加

プロパティページが表示できない問題を修正


http://images.xenowire.net/pfsource.0003.nosrc.lzh (リリースビルド版 ソース無し)

http://images.xenowire.net/pfsource.0003.lzh (ソース同封)

infファイルを作成。

FTP&HTTPSソースフィルタとして動くことを確認。

プロパティーページ実装完了。

pfsource.0003.jpg

ただWindowsMediaPlayerではHTTPSのURLを開けず。

MediaPlayerClassicやpfsourcetesterだと大丈夫。

WMPは証明書のチェックでもしてるのかも。


pfsource.0002.lzh

HTTPテスト版。

ソース同封。

フィルタのバイナリはDebug/pfsource.ax

プロパティページの値の保存とFTP部分は未実装


今日もnetaviplayerのソースフィルタ部分(pfsource)の独立作業ー。

細部はまだだけどほぼ出来たので、試しにWindowsMediaPlayerで試してみる。

メリット値をいくら上げても使われず。

Registering a Custom File Typeによると、

GraphBuilderのRenderFileに使われるソースフィルタは、

HKEY_CLASSES_ROOT/<プロトコル>/Extensions

以下のレジストリをみて決められるらしいので、

HTTPを使ったAVIの再生にnetaviplayerのフィルタを使うために

HKEY_CLASSES_ROOT/http/Extensions/.AVI=<pfsourceのクラスID>

を作成・・・

pfsource.0002.png

にしてもフルスクラッチしたpfsourceに、テスト用のプレイヤー付けてnetaviplayerにしたのが6月・・・そしてもう9月半ば。サボりすぎ。


トップ 編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード 新規 一覧 単語検索 最終更新 リンク元 ヘルプ 最終更新のRSS xenowire
Last-modified: Thu, 25 Jan 2018 15:11:33 JST