Lionに移行。 [開発系とか]
iPhone 4S導入後、ようやく落ち着いたので、iPhone 3GSを初期化したり。
MBPも、Lionのパーティションを10.7.2を新規インストールし直して、メイン環境を移行してみました。
SnowLeopardに比べると、特にFinderでもっさり感がありますね。新しいメールはイマイチ慣れないなぁ。
MBPも、Lionのパーティションを10.7.2を新規インストールし直して、メイン環境を移行してみました。
SnowLeopardに比べると、特にFinderでもっさり感がありますね。新しいメールはイマイチ慣れないなぁ。
一段落。 [開発系とか]
多分間違ってる。 [開発系とか]
libavformatで、DV.movの時間軸解釈がおかしい件のパッチ。
QuickTimeのSequence Grabber APIで生成したmovには、tmcd(タイムコード)トラックが埋め込まれるのだが、libavformatはこのトラックに対応しないのに、トラック情報だけは反映しようとしていた。
=> libavformat/utils.c : update_stream_timings()
この関数でやっていることは、「各トラック情報を元にムービーの時間軸をのばす」というもので、movフォーマットの管理情報を壊す、正しくないやり方になっている。が、2年以上も放置されていることからみて、「誰も気にしてない」(笑)。
せめて解釈しないAVStreamは処理をスキップしろよ・・・
って、ここをいじるとあちこち被害が大きいな・・・。
QuickTimeのSequence Grabber APIで生成したmovには、tmcd(タイムコード)トラックが埋め込まれるのだが、libavformatはこのトラックに対応しないのに、トラック情報だけは反映しようとしていた。
=> libavformat/utils.c : update_stream_timings()
この関数でやっていることは、「各トラック情報を元にムービーの時間軸をのばす」というもので、movフォーマットの管理情報を壊す、正しくないやり方になっている。が、2年以上も放置されていることからみて、「誰も気にしてない」(笑)。
せめて解釈しないAVStreamは処理をスキップしろよ・・・
って、ここをいじるとあちこち被害が大きいな・・・。
ワケ分からん。 [開発系とか]
ん〜。難題山積。 [開発系とか]
今のところ気がついた問題とか列挙。
自分のコード側:
・Layer側がOKでも、View側だけ表示異常になることがある。
・View側でクローズ出来ずハングするケースあり。
・DV.movで、yuv420でない画像(多分411)が返ってきて落ちる。
ライブラリ側:
・mp4とmovとflvは、最近のは割とOK。ニコニコ系はほぼ通る。
・SANYOやCASIOのデジカメの60fpsサンプルムービーで落ちる。
・QTで通るH.264.mov系で画像が出ないものが散見される。
・tsがほぼ全滅。
・vobもほぼ全滅。
・・・圧倒的にダメダメじゃないか・・・ライブラリ側の問題が厳しいな。
tsとvobは・・・libavformat側の問題かな。SimplePlayerで使ってるぼろいパッチを埋め込むか。
DVは・・・420前提じゃダメということ。swscaleのところ復活させるか。
デジカメが生成する60fps.movが通らないのは・・・対処方法あるのか?
後は、libav gitじゃなくてffmpeg gitを試すとか、かな?
全部対処はまず無理なので、どこまで対処するかは適当に考えることにする。
自分のコード側:
・Layer側がOKでも、View側だけ表示異常になることがある。
・View側でクローズ出来ずハングするケースあり。
・DV.movで、yuv420でない画像(多分411)が返ってきて落ちる。
ライブラリ側:
・mp4とmovとflvは、最近のは割とOK。ニコニコ系はほぼ通る。
・SANYOやCASIOのデジカメの60fpsサンプルムービーで落ちる。
・QTで通るH.264.mov系で画像が出ないものが散見される。
・tsがほぼ全滅。
・vobもほぼ全滅。
・・・圧倒的にダメダメじゃないか・・・ライブラリ側の問題が厳しいな。
tsとvobは・・・libavformat側の問題かな。SimplePlayerで使ってるぼろいパッチを埋め込むか。
DVは・・・420前提じゃダメということ。swscaleのところ復活させるか。
デジカメが生成する60fps.movが通らないのは・・・対処方法あるのか?
後は、libav gitじゃなくてffmpeg gitを試すとか、かな?
全部対処はまず無理なので、どこまで対処するかは適当に考えることにする。
NSOpenGLView。 [開発系とか]
10.7.1のNSOpenGLViewはどこかおかしいです。
先日の記事の続き。
//
とりあえず、LAVPViewのオーバーヘッドを取り除くことに成功。10.6.8環境下なら、LAVPLayerとLAVPViewのCPU使用率は同等に出来ました。
LAVPLayerと同様、FBOに描いてからRectを表示する方式に書換え、CVDisplayLink割り込み時に強制表示(-setNeedsDisplay:ではなく、-displayを使う)とすることで、改善をはかりました。(github)
//
・・・しかし、10.7.1ではLAVPViewのCPU負荷がやはり高いです。先日よりはマシになりましたが。
CVDisplayLink、CIContext、CVPixelBuffer辺りの動作は同一に出来たので、この状態で10.7ではCPU使用率に差が生まれる、ということは・・・。
おそらく、NSOpenGLViewにオーバーヘッドがある、ということになるでしょうか。
自分のコード側の処理方法が基本同じに出来たので、NVIDIAのドライバの線も、考えづらくなりましたし。
先日の記事の続き。
//
とりあえず、LAVPViewのオーバーヘッドを取り除くことに成功。10.6.8環境下なら、LAVPLayerとLAVPViewのCPU使用率は同等に出来ました。
LAVPLayerと同様、FBOに描いてからRectを表示する方式に書換え、CVDisplayLink割り込み時に強制表示(-setNeedsDisplay:ではなく、-displayを使う)とすることで、改善をはかりました。(github)
//
・・・しかし、10.7.1ではLAVPViewのCPU負荷がやはり高いです。先日よりはマシになりましたが。
CVDisplayLink、CIContext、CVPixelBuffer辺りの動作は同一に出来たので、この状態で10.7ではCPU使用率に差が生まれる、ということは・・・。
おそらく、NSOpenGLViewにオーバーヘッドがある、ということになるでしょうか。
自分のコード側の処理方法が基本同じに出来たので、NVIDIAのドライバの線も、考えづらくなりましたし。
GT330Mドライバか? [開発系とか]
サポート終了予定のお知らせ。 [開発系とか]
CoreVFの更新版。 [開発系とか]
開発ネタ。
使おうと思ってくれる人が居るのは、本当にありがたい。
CoreVF Framework 0.1.9のテストビルドを作りました。
・testbuild.dmg (リンク削除)
・Xcode 3.2でビルドし直し。
・SDKを10.5.sdkに更新。
・MacOS X 10.4とPPCサポートのドロップ。
・mcdeintとpostprocについて、libav git-29773へ更新。
・imageunit、postprocの致命的なバグを修正。
バージョンが0.1.9止まりなのは、新機能がないからです(笑)
時間がなくて、手元で十分なテストが出来ていないので、しばらくベータ版扱いとします。安定しているようなら正式リリースとし直します。
使おうと思ってくれる人が居るのは、本当にありがたい。
CoreVF Framework 0.1.9のテストビルドを作りました。
・testbuild.dmg (リンク削除)
・Xcode 3.2でビルドし直し。
・SDKを10.5.sdkに更新。
・MacOS X 10.4とPPCサポートのドロップ。
・mcdeintとpostprocについて、libav git-29773へ更新。
・imageunit、postprocの致命的なバグを修正。
バージョンが0.1.9止まりなのは、新機能がないからです(笑)
時間がなくて、手元で十分なテストが出来ていないので、しばらくベータ版扱いとします。安定しているようなら正式リリースとし直します。
CVF_ImageUnit。(追記) [開発系とか]
追記)CoreVF全体をコンパイルし直しました。(リンク)
//
昨日コメントをくれた78さんへ。速度低下の対処を試みました。
(リンク削除)
こちらを試していただけますか。よろしくお願いします。
//
拙作CoreVFのプラグインの一つ、CVF_ImageUnit。エンコード時にCoreImageフィルタをかけることが出来るのですが、長時間エンコードで不安定であるという指摘を受けていました。
いろいろ調べたのですが、
1)NSConnection -connectionWithRegisteredName:host:を呼び
2)connectionのrootProxyを得て
3)setProtocolForProxy:を呼ぶ
という処理を何度も繰り返すと、proxy経由の呼び出しが徐々にスローダウンする、という現象を突き止めました。(MacOS X 10.6.8で確認)
最初は上記の処理も、proxy呼び出しのオーバーヘッドも、1/1000もかからなかいのです。が、これを数万という単位で繰り返し呼び出すと、上記の処理、さらにはproxy経由のオーバーヘッドが、どんどん増大する、という悪循環に陥るようです。
一時間も処理をまわすとconnectionのinvalidateでハングアップのような状態に陥る現象が発生し、使い物にならなくなります。
プロセス間通信のエラー処理が面倒だから、簡単に使えるNSDistributedObjectを使っているのに、こういう落とし穴があると結構困ります。
・・・こういう連続呼び出しにDOを使う方が間違っているような気もしますが・・・
//
昨日コメントをくれた78さんへ。速度低下の対処を試みました。
(リンク削除)
こちらを試していただけますか。よろしくお願いします。
//
拙作CoreVFのプラグインの一つ、CVF_ImageUnit。エンコード時にCoreImageフィルタをかけることが出来るのですが、長時間エンコードで不安定であるという指摘を受けていました。
いろいろ調べたのですが、
1)NSConnection -connectionWithRegisteredName:host:を呼び
2)connectionのrootProxyを得て
3)setProtocolForProxy:を呼ぶ
という処理を何度も繰り返すと、proxy経由の呼び出しが徐々にスローダウンする、という現象を突き止めました。(MacOS X 10.6.8で確認)
最初は上記の処理も、proxy呼び出しのオーバーヘッドも、1/1000もかからなかいのです。が、これを数万という単位で繰り返し呼び出すと、上記の処理、さらにはproxy経由のオーバーヘッドが、どんどん増大する、という悪循環に陥るようです。
一時間も処理をまわすとconnectionのinvalidateでハングアップのような状態に陥る現象が発生し、使い物にならなくなります。
プロセス間通信のエラー処理が面倒だから、簡単に使えるNSDistributedObjectを使っているのに、こういう落とし穴があると結構困ります。
・・・こういう連続呼び出しにDOを使う方が間違っているような気もしますが・・・
Test build。 [開発系とか]
libavPlayer.frameworkのテストビルドを作りました。
興味のある方は、試してみてフィードバックをください。GPL V2ライセンスです。対応環境はSnowLeopard以降、intel-64bit環境専用です。
・testbuild.dmg (リンク削除)
//
QTKit.frameworkにおけるQTMovieと同じように、libavPlayer.frameworkにはLAVPStreamクラスが用意されています。表示側は、NSOpenGLViewのサブクラスと、CAOpenGLLayerのサブクラスが利用可能です。
フレームワークにヘッダが入っているので、見れば分かると思います。実際の使い方は、
・https://github.com/MyCometG3/libavPlayer/tree/master/LAVPTest
あたりを見れば一発だと思います。
興味のある方は、試してみてフィードバックをください。GPL V2ライセンスです。対応環境はSnowLeopard以降、intel-64bit環境専用です。
・testbuild.dmg (リンク削除)
//
QTKit.frameworkにおけるQTMovieと同じように、libavPlayer.frameworkにはLAVPStreamクラスが用意されています。表示側は、NSOpenGLViewのサブクラスと、CAOpenGLLayerのサブクラスが利用可能です。
フレームワークにヘッダが入っているので、見れば分かると思います。実際の使い方は、
・https://github.com/MyCometG3/libavPlayer/tree/master/LAVPTest
あたりを見れば一発だと思います。
FFTすげぇ。 [開発系とか]
libavPlayer.framework、遂に変速再生にも対応。あと必要なのは・・・アスペクト比指定サポートくらいか?
正直、ここまで出来るとは思ってなかった。今の状態でもちょっとしたプレーヤなら作れるくらい、使える所まで来た感じ。
正直、ここまで出来るとは思ってなかった。今の状態でもちょっとしたプレーヤなら作れるくらい、使える所まで来た感じ。
10.5.sdk。 [開発系とか]
夏休みを取った。しばしの間、ふぬけ生活を満喫しますw。
//
Xcode 4.0に、10.5.SDKを強引に入れる方法を知った。Xcode 3.2.6に入っている、10.5.dmgという隠しフォルダに入っているインストーラを使い、Xcode 4のフォルダを指定するものだ。
・stackoverflow:How to add base SDK for 10.5 in xCode 4
試した所、一応動いた。が、新規Cocoaアプリを作ろうとする所で、引っかかった。
//
//
Xcode 4.0に、10.5.SDKを強引に入れる方法を知った。Xcode 3.2.6に入っている、10.5.dmgという隠しフォルダに入っているインストーラを使い、Xcode 4のフォルダを指定するものだ。
・stackoverflow:How to add base SDK for 10.5 in xCode 4
試した所、一応動いた。が、新規Cocoaアプリを作ろうとする所で、引っかかった。
//
libavPlayer.framework。 [開発系とか]
一応動くレベルになったので、とりあえずgithubに上げてみた。
https://github.com/MyCometG3/libavPlayer
ffplay.cのコードをベースとした、メディアプレーヤクラス。NSOpenGLView+CAOpenGLLayerのサブクラスが利用出来る。
頑張ってSDLへの依存を排除したので、このままでMacOS X 10.6以降でコンパイル出来る。
が、実用性はまだまだ。
・開いた直後に動画が表示されない(CALayer)
・開いた瞬間にゴミが一瞬表示される(NSView)
・音がでなくなったり、凄く遅くなったり。
・字幕関連も動かない。
内部のキューの管理とか、個人的に凄く嫌いな作り。ガリガリcond_signalで同期を取る方式なんだけど、これではまともに動かすのが大変。
でも、絵が出ないのは、CAOpenGLLayerの使い勝手がおかしいと思う。drawInCGLContextが有効なtimeStamp付きで呼ばれないことがあるのは仕様なのか?
なんかこのコードは肥やしにして、作り直した方が良い気がする。
https://github.com/MyCometG3/libavPlayer
ffplay.cのコードをベースとした、メディアプレーヤクラス。NSOpenGLView+CAOpenGLLayerのサブクラスが利用出来る。
頑張ってSDLへの依存を排除したので、このままでMacOS X 10.6以降でコンパイル出来る。
が、実用性はまだまだ。
・開いた直後に動画が表示されない(CALayer)
・開いた瞬間にゴミが一瞬表示される(NSView)
・音がでなくなったり、凄く遅くなったり。
・字幕関連も動かない。
内部のキューの管理とか、個人的に凄く嫌いな作り。ガリガリcond_signalで同期を取る方式なんだけど、これではまともに動かすのが大変。
でも、絵が出ないのは、CAOpenGLLayerの使い勝手がおかしいと思う。drawInCGLContextが有効なtimeStamp付きで呼ばれないことがあるのは仕様なのか?
なんかこのコードは肥やしにして、作り直した方が良い気がする。
NPAPI。 [開発系とか]
自分用メモ。そのうちやる気がおきる「かも知れない」。
//
Safari 5.1(Webkit2)は、WebkitがサポートしていたWebkitPluginに対応していない。このため、NetScape Pluginとしてビルドし直す必要がある。
1. プラグイン作成に必要なnpapi.hなどはSDKがこちらから入手できる。
http://releases.mozilla.org/pub/mozilla.org/xulrunner/releases/2.0/sdk/
http://releases.mozilla.org/pub/mozilla.org/xulrunner/releases/5.0/sdk/
2. AppleのSafari FAQ 11にサンプルへのリンクが埋め込んである。Developerサイトの検索では引っかからないので注意。
http://developer.apple.com/jp/internet/safari/faq.html
http://developer.apple.com/internet/safari/samples/SamplePlugInProject.dmg
3. SDKをビルドする、必要はないかも知れないが、やったことはないので良くわからない。
https://developer.mozilla.org/ja/Gecko_SDK" target="_blank">https://developer.mozilla.org/ja/Gecko_SDK
4. あとはCarbon in Cocoaの要領でCocoaを初期化し、WebkitプラグインのObjective-Cのコードを移植すれば・・・多分動く。
//
//
Safari 5.1(Webkit2)は、WebkitがサポートしていたWebkitPluginに対応していない。このため、NetScape Pluginとしてビルドし直す必要がある。
1. プラグイン作成に必要なnpapi.hなどはSDKがこちらから入手できる。
http://releases.mozilla.org/pub/mozilla.org/xulrunner/releases/2.0/sdk/
http://releases.mozilla.org/pub/mozilla.org/xulrunner/releases/5.0/sdk/
2. AppleのSafari FAQ 11にサンプルへのリンクが埋め込んである。Developerサイトの検索では引っかからないので注意。
http://developer.apple.com/jp/internet/safari/faq.html
http://developer.apple.com/internet/safari/samples/SamplePlugInProject.dmg
3. SDKをビルドする、必要はないかも知れないが、やったことはないので良くわからない。
https://developer.mozilla.org/ja/Gecko_SDK" target="_blank">https://developer.mozilla.org/ja/Gecko_SDK
4. あとはCarbon in Cocoaの要領でCocoaを初期化し、WebkitプラグインのObjective-Cのコードを移植すれば・・・多分動く。
//
動作テストの結果。 [開発系とか]
・・・本業が忙し過ぎて時間が取れない。あぅ。
//
最終的に、拙作の互換性は予想より高かった。
今分かっているので、動かないのはiEPGWebPlugin 0.8.1ぐらい。・・・一応WebKit Plug-inなんだが、全く認識されていない。Safari 5.1でまたまた仕様変更?
//
QuickTime Component系、CoreVF Framework、ReserveDV/recdv、QTP7Controller、movencoderなど、試した限り普通に動いている感じ。
SimplePlayerはLion対応版にしたものの、古い版でも普通に動いていたので、そこもそれほど問題なかった。
//
まあ、ReserveDV/recdvは、SequenceGrabberとかNSCalendarDateとか使っているし、しかも基本DV-NTSCなソフトなので、もう動かなくなっても仕方ないと思っている。MacOS X 10.3から開発開始したソフトだし(初めてのCocoaアプリだし)、あちこち作りが古いんだよね。
日本のアナログ放送も明日で終わり。もう使ってる人ほとんどいないと思う。直すのも疲れるので、動かなくなったらさすがにdiscontinuedかなぁ。
//
最終的に、拙作の互換性は予想より高かった。
今分かっているので、動かないのはiEPGWebPlugin 0.8.1ぐらい。・・・一応WebKit Plug-inなんだが、全く認識されていない。Safari 5.1でまたまた仕様変更?
//
QuickTime Component系、CoreVF Framework、ReserveDV/recdv、QTP7Controller、movencoderなど、試した限り普通に動いている感じ。
SimplePlayerはLion対応版にしたものの、古い版でも普通に動いていたので、そこもそれほど問題なかった。
//
まあ、ReserveDV/recdvは、SequenceGrabberとかNSCalendarDateとか使っているし、しかも基本DV-NTSCなソフトなので、もう動かなくなっても仕方ないと思っている。MacOS X 10.3から開発開始したソフトだし(初めてのCocoaアプリだし)、あちこち作りが古いんだよね。
日本のアナログ放送も明日で終わり。もう使ってる人ほとんどいないと思う。直すのも疲れるので、動かなくなったらさすがにdiscontinuedかなぁ。
SDLとffplay。 [開発系とか]
ふとやる気になったので、ffplayを動かす努力をしてみた。
丸一日を費やしたのち、やっと動いた。
・・・音は出るが、こりゃ酷い代物だな。
//
素のままでは動かないので、ffplayのコードをばらして、SDL.frameworkを使えるように書き換える作業に入ったのだけれど。・・・これが大変。
一応、動くものは出来た。動くというだけだが。
丸一日を費やしたのち、やっと動いた。
・・・音は出るが、こりゃ酷い代物だな。
//
素のままでは動かないので、ffplayのコードをばらして、SDL.frameworkを使えるように書き換える作業に入ったのだけれど。・・・これが大変。
一応、動くものは出来た。動くというだけだが。
よっしゃ。 [開発系とか]
年輪。 [開発系とか]
自分も、もうすぐ満6年。
・@MP4_maniac 6月1日 webから
・・・うーんと、260項目、514MBありました(笑
なんか捨てられないんだよね。うん。
・@MP4_maniac 6月1日 webから
つか、一体、俺は何年続けてきたんだ?アーカイブフォルダですか?
・・・うーんと、260項目、514MBありました(笑
なんか捨てられないんだよね。うん。
見えないフラグ。 [開発系とか]
ローカライズ。 [開発系とか]
ローカライズめんどい。
こちらの記事を参考に、MainMenu.stringsのローカライズをawkでガリガリ書いてみた。
・masakihの日記:makeとgnu sedでローカライズ
Snow Leopardのawk、普通にUTF-8が通るね。
単純な置き換え(非正規表現)が使えればもっと簡単なんだけど。
awkだと、sedと違って2番目だけ置き換えるとか使えないのがネックだな。
こちらの記事を参考に、MainMenu.stringsのローカライズをawkでガリガリ書いてみた。
・masakihの日記:makeとgnu sedでローカライズ
Snow Leopardのawk、普通にUTF-8が通るね。
単純な置き換え(非正規表現)が使えればもっと簡単なんだけど。
awkだと、sedと違って2番目だけ置き換えるとか使えないのがネックだな。
-registerDefaults:。 [開発系とか]
ML。 [開発系とか]
方針決定。(追記) [開発系とか]
追記:結局、qpminはデフォルト値を4にして、クリッピングはかけないことにしました。
//
結局、qpminを3に制限する変更を組み込むことが必要と判断しました。
//
Apple H.264 Software Decoderの問題であることは確実です。(GPUデコードではない)
手元(MacBookPro Mid 2010)での、Snow Leopard環境では、Perianが動くケースなら大丈夫ですが、そうでない場合、QuickTime X(VideoToolbox)でもQuickTime 7(QuickTimeH.264.scalar)でも再現します。
一方、○ンデ○イオン上でテストの環境では、テストした限り、Software Decodeerでの問題は修正されています。これは、QuickTime X(VideoToolbox)、QuickTime 7.6.6.app(QuickTimeH.264.scalar)を使った場合とも同じです。この問題に対しては、Perianが不要、ということです。
//
x264バイナリとの重要な違いの一つに、拙作x264Encoderには「qp固定エンコードのサポートがない」という点があります(abrエンコードかcrfエンコードのみ)。従って、qp固定で発生するケースは除外できます。となると、crfとabrの場合のみを考慮すればよいことになります。(losslessエンコードを除く)
abrはもちろん、qpminを3以下を除外すればよいわけですね。
テストでlibavcodec/libx264.cにクリッピングパッチを当てたところ
x4->params.rc.i_qp_min = FFMAX(avctx->qmin, 3);
crfであっても、qpminの値を3以上に 「追記:(3でも再現するケースがあるので)4以上に」制限するだけで、問題が除外出来ることを確認しました。
//
結局、qpminを3に制限する変更を組み込むことが必要と判断しました。
//
Apple H.264 Software Decoderの問題であることは確実です。(GPUデコードではない)
手元(MacBookPro Mid 2010)での、Snow Leopard環境では、Perianが動くケースなら大丈夫ですが、そうでない場合、QuickTime X(VideoToolbox)でもQuickTime 7(QuickTimeH.264.scalar)でも再現します。
一方、○ンデ○イオン上でテストの環境では、テストした限り、Software Decodeerでの問題は修正されています。これは、QuickTime X(VideoToolbox)、QuickTime 7.6.6.app(QuickTimeH.264.scalar)を使った場合とも同じです。この問題に対しては、Perianが不要、ということです。
//
x264バイナリとの重要な違いの一つに、拙作x264Encoderには「qp固定エンコードのサポートがない」という点があります(abrエンコードかcrfエンコードのみ)。従って、qp固定で発生するケースは除外できます。となると、crfとabrの場合のみを考慮すればよいことになります。(losslessエンコードを除く)
abrはもちろん、qpminを3以下を除外すればよいわけですね。
テストでlibavcodec/libx264.cにクリッピングパッチを当てたところ
x4->params.rc.i_qp_min = FFMAX(avctx->qmin, 3);
crfであっても、qpminの値を






