デコードとインデックスファイル

ほげ
0
muken@混沌の良人 @ChaosSoulLover

そもそもこれ、何のファイルフォーマットで比較してんだろ。 MP4だと、L-SMASHは頻繁な非破壊編集を想定した設計思想の関係上、メモリを食うのは確かだし、要素へのアクセスが遅いんだよね。 正直、MPEG-2 TSならlibavformatの仕様上、インデックスファイル無いとまともにシークできないと思うけど。 twitter.com/kusaanko/statu…

2020-11-15 05:02:12
草あんこ @kusaanko

L-SMASH vs FFmpeg Decoder(自作入力プラグイン) ・FFmpegのほうがシークが高速 ・FFmpegのほうがファイルの読み込みが高速 ・FFmpegはインデックスファイルを作らない ・FFmpegのほうがメモリ消費が少ない

2020-11-14 02:24:31
muken@混沌の良人 @ChaosSoulLover

libavformatに頼るとどうしても対応出来ないのが色々とあって、例えばMP4では途中でコーデックパラメータが変わるパターンはデコードがだめになる。MPEG-2 TSでもBDのm2tsがIDRにパラメータセットを付けないせいで、シークすると映像がぶっ壊れる。これはインデックスファイルに記録しないと無理。

2020-11-15 05:09:18
muken@混沌の良人 @ChaosSoulLover

このように、L-SMASH Worksは何も正確なシークだけではなく、パラメータ変更に対して無力なlibavformatの機能を補うように、デコードに必要な情報をインデックスファイルに記録して、バイナリオフセットとパラメータの対応関係を築き、デコードエラーの無いシークを実現しているのだ。

2020-11-15 05:18:13
muken@混沌の良人 @ChaosSoulLover

ISOBMFFの規格が定義しているランダムアクセスの概念を理解していると、libavformatが如何にシーク機能が乏しくそして不完全であるかは理解できる。 Gradual Decoder Refreshとかまさにそう。エラーハンドリング次第ではOpen-GOPもかなり曲者。

2020-11-15 05:22:34
muken@混沌の良人 @ChaosSoulLover

そもそもMP4はインデックスを自分自身で持ってるので、ちゃんとdemuxerを実装してあればインデックスファイルは不要。インデックスファイルの存在が気になるなら、MP4以外ってことになるけど、インデックスファイルが本当に不要なコンテナって結構限られるはず。

2020-11-15 05:28:04
muken@混沌の良人 @ChaosSoulLover

インデックスファイルが本当に本当に必要ない概念なら、そもそもFFMPEGSource2(ffms2)なんて存在しないし、L-SMASH Worksでffms2よりも更に突き詰めたインデックスファイルとか作ったりしないんだよな。 インデックスファイル不要っていうのはちょっとクリーンな世界しか知らないって気がする。

2020-11-15 05:31:46
muken@混沌の良人 @ChaosSoulLover

実際には世の中には規格違反上等のファイルがはびこっているし、そいつらはインデックスファイル使わないとまともにシーク出来ない曲者だったりするわけ。 wmvは全然違うところにシークして、めっちゃ苦労したしな。つーかwmvファイルのインデックス間違ってるのは鳥肌立ったぞ。

2020-11-15 05:34:46
muken@混沌の良人 @ChaosSoulLover

L-SMASHのlinked-list実装は本当に廃止したい(非破壊編集が想像よりもユースケースが皆無だった)けど、大きくなり過ぎて、配列実際に変更がままならないのがつらい。 配列にすればメモリ消費量も減るし、要素へのアクセスも速くなるからやりたいんどけどな。

2020-11-15 05:38:47
muken@混沌の良人 @ChaosSoulLover

あと、俺は予想するけど、PAFF/SAFFインターレースファイルの対応でめっちゃ頭悩ませると思う。あれは地獄だ。正確なシークを実現するのつらすぎる。特に最終フレーム付近のflush周りな。

2020-11-15 05:44:42
muken@混沌の良人 @ChaosSoulLover

2in1outしてきたのが、突然1in1outになるのつらすぎんだろ。

2020-11-15 05:46:19
muken@混沌の良人 @ChaosSoulLover

これの補足をしておくと、 wmvはwmv自体が持ってるインデックスが間違ってるファイルがはびこってるので、実際にファイルを全舐めしデコードして、どこにキーフレームあった?ってインデックスファイルに記録しないとまともにシークできなんですわ。 twitter.com/ChaosSoulLover…

2020-11-15 05:51:31
muken@混沌の良人 @ChaosSoulLover

つまりね、オリジナルのインデックスが間違ってるから、それを正したインデックスとして生成したインデックスファイルを使う、っていうのもインデックスファイルの存在意義なのですよ。 邪悪なファイルに立ち向かうには、インデックスファイルは必須なのだ・・・。

2020-11-15 05:55:11
muken@混沌の良人 @ChaosSoulLover

インデックスファイルを必要としないファイルリーダープラグインの末路は、DirectShowを使わないDirectShow File Readerプラグインだと俺は思ってるんだよね。

2020-11-15 05:58:16
muken@混沌の良人 @ChaosSoulLover

頭からお尻までデコードするだけ、シークした瞬間信用ならなくなるのがDirectShow File Readerプラグインなので。

2020-11-15 05:59:35
muken@混沌の良人 @ChaosSoulLover

正しい位置にシーク出来なかったので、さの位置より後ろに下がってシーク再試行とか二分探索やら繰り返してると、結局シークが重くなってインデックスファイル作ってサクサクシークした方が速い。になってしまうんだよ。

2020-11-15 06:03:23
muken@混沌の良人 @ChaosSoulLover

質が悪いのはlibavformatがファイル自体が持ってるインデックスを信用してシークするので、実は正確な場所に永遠にたどり着けないパターンもあるのよね。 そうなると、メモリ上に保持しているインデックスも修正しないといけなくて、これもシーク時のコストになるっていう。

2020-11-15 06:08:14
muken@混沌の良人 @ChaosSoulLover

L-SMASH Worksのvideo decodeのコードがめちゃくちゃカオスになってる原因はPAFF/SAFF対応とストリーム中のパラメータ変更で、インデックス生成のコードがカオスになってるのはストリーム中のパラメータ変更やwmv周辺、altref frame, m2tsあたりのせい。

2020-11-15 06:17:55
muken@混沌の良人 @ChaosSoulLover

HE-AACもあったわ。あれマジ糞だよ。

2020-11-15 06:19:07
muken@混沌の良人 @ChaosSoulLover

ちょっとBD m2tsの話を補足すると、シークできないIDRがあって、これが実はBDのプレイリストにあたるmplsファイルにシークできるIDRの場所が記述されてるんだ。 だからmpls経由だと問題ないが、m2tsを直接シークすると映像がぶっ壊れることがある。 なのでインデックスファイルが必要なわけですね。 twitter.com/ChaosSoulLover…

2020-11-15 06:41:31
muken@混沌の良人 @ChaosSoulLover

libavformatではIDRは全てキーフレーム、すなわちシークできるポイント扱いなので、libavformatにBD m2tsでシークできるポイントを問い合わせると映像がぶっ壊れて出てくることがあるってわけ。 解決には、m2tsを一度全舐めしてIDRに対応するパラメータセットをインデックスファイルに記録するしかない

2020-11-15 06:44:59
muken@混沌の良人 @ChaosSoulLover

L-SMASH Worksでは前述のようにインデックスファイルに直接IDRに対応するパラメータセットをバイナリデータでコピーしているので、IDRだけしかないところにシークしてもちゃーんと映像がぶっ壊れずに、しかもそこから後方に更に一旦シークすることなく正しい出力ができるわけなのです。

2020-11-15 06:48:32
muken@混沌の良人 @ChaosSoulLover

このインデックスファイルが無くm2tsをトライアンドエラーで頑張ると、パラメータセットが付いてないIDRが頻出する場合、エラーを起こしては後ろに下がり、エラーを起こしては後ろに下がり、を繰り返してシークが超絶重くなります。

2020-11-15 06:50:23
muken@混沌の良人 @ChaosSoulLover

そもそもエラーに対するリトライ上限を設けていた場合、その頻度でシークが完全にままならなくなってしまうのですね。

2020-11-15 06:52:22
muken@混沌の良人 @ChaosSoulLover

このように読み込めるファイルフォーマットおよびそのファイルフォーマットが持つ機能を限定していかないと、インデックスファイル無しで、編集に堪えうるファイルリーダープラグインは作れないです。 そうしないと待ってる評価はDirectShow File Readerのような末路です。

2020-11-15 06:58:02
muken@混沌の良人 @ChaosSoulLover

ちなみにlibavformatのFLV demuxerのシークは、未読み込みの領域にシークしようとすると結局そこまでシーケンシャルリードが入ります。で、そこまで舐めた結果をメモリ上に記録します。 なんで、ほとんどインデックスファイルを作ってるのと変わらないです。ファイルに書き出してないだけ。

2020-11-15 07:03:21