概要 †いつも使っているプレイヤーで、AVIファイルをダウンロードしながら再生します。 ダウンロード †インストール方法 †
アンインストール方法 †
動作環境 †
状態 †開発中公開中
開発関連データ †次期構想 †1バッファ + ダウンローダープール (+ 1プレバッファ )
リブ差の小さいファイル(1つの映像ストリーム、1つの音声ストリーム) → これまで通り、またはフィルタ全体で1つのマネージャーを使用する リブ差の大きいファイル(1つの映像ストリーム、1つの音声ストリーム) → 1ストリームに1マネージャを割り当てる(この場合フィルタ全体で2つのマネージャを使用する) リブ差の小さいファイル(1つの映像ストリーム、2つの音声ストリーム) → これまで通り、またはフィルタ全体で1つのマネージャーを使用する 構成 †新しいネゴシエータ以下の構成: CRACRMemBufferとCRACRFileBufferの使い分け: (1)はメモリバッファ + メディアサンプル内ポインタの書き換えに対応したスプリッタ(例えばgabest氏AviSplitter)の場合 経緯(複数セッションによるダウンロード実装まで) †
ダウンローダー3個 セグメントサイズ1MB ダウンローダー6個 セグメントサイズ1MB
経緯(開発記録サルベージ) †※日記で書いていた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できることが分かりました! でもこれも非同期読み取りしてませんでした。 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が重い問題、 これまでアロケータを提供することで解決しようとしてきましたが、 今回は違う方法でやってみました。 結局だめだったんですが。 メディアサンプルが持っているバッファへのポインタを、 リングバッファへのポインタで無理やり書き換えてみました。 ※かなり簡略化した図です 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に引き続きプロパティページの変更(途中) 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))に対応 バージョン情報の追加 サポートサイトを作成 何のことはない ↑に勝手に名前付けて呼んでるだけですが、 これに入力した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〜関数には というかオフセット指定があったらMSがとっくの昔にシーク可能なURLソースフィルタ出してるはずだし。
有ったら有ったで悪用されるだろうし。 諦めるかなぁ 更に調べたら・・・ 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 (ソース同封) シーク時や停止時のフリーズを解消 忌まわしい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ソースフィルタとして動くことを確認。 プロパティーページ実装完了。 ただWindowsMediaPlayerではHTTPSのURLを開けず。 MediaPlayerClassicやpfsourcetesterだと大丈夫。 WMPは証明書のチェックでもしてるのかも。 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に、テスト用のプレイヤー付けてnetaviplayerにしたのが6月・・・そしてもう9月半ば。サボりすぎ。 |


















