というわけで、某ADVゲームシステムでなんか独自っぽい動画フォーマットがあったので解析してDirectShowのフィルタを作ってみました。
解析1時間、組み込み4時間、デバッグ2時間、といったところでした。
まあ、自分でも思うのは18禁ゲームシステムのレベルで独自フォーマットなんてやろうとしてもそれほどいいものはどうしても作れないわけですしね・・・。
実際に自分が使っている各種ファイルフォーマットも汎用の有名なやつからみれば結局はデータの解析をできる限り遅らせる程度の意味しかないわけですしね。
それでも「やらないよりはまし」だと思います。ぶっこ抜かれは悲しい(というのは前にも書いたことがあるような記憶が)です。
たま~にこういうのをやらないと自分の解析の腕がさび付いてしまうので気に入ったのだけちょっとやってみるようにしています。
こういう風に書くことはあっても公開することが基本的にないものなのでどうかとも思いますが。
見た人にこのフォーマットのヒントだけ。
先頭4byteに直接”MJPG”ってもろにMotion-JPEGっぽいフォーマットですよ~って書いてあるので解析は簡単だと思います。
微妙にRIFFっぽい感じ(“fmt “とかセクションっぽい記号が混じっていた)でしたが、OggVorbisの埋め込み+JPEG圧縮データのフレーム情報という組み合わせです。
時間情報をたどるのがやっかいで、ヘッダには動画系情報としては合計時間とフレーム数しかないのでフレームレート情報がありません。
フレームレート、という概念ではなく、各フレームに開始時間がある形なのでシークするときにフレームの時間情報を毎回読み取って正しい位置へのシークが必要になるのが面倒です。
再生時にはこのフレームの位置情報などをキャッシュしておけばシークが高速になるので楽なのですが。
なぜかNullFrameが有効になっているのもちょっと疑問でした。意味がとりづらかったですがとりあえず塗りつぶしだけで無視しましたが・・・。
これでわかる人がいたら私がびっくりです。
そしてとある麻雀ゲームではじめて理牌なしというルールを体験してみました。
はじめはかなり戸惑いますね。わからないうちはわかりやすくするために喰いまくるのがおすすめです。
たぶん清一色なんてやろうものなら待ちがわからなくなってどうしようもなくなること請け合いです。平和でさえ作れなかったですし。
そもそもこれを作ったのは、それなりに高速デコードが可能なJPEGに、
α値のチャンクを埋め込んで手軽に時間を掛けずに、
透過情報付き動画の再生機構を作るのが目的だったので、
そちらが考えている動画の趣旨とは違うものでしょうね。
あと、動画の構造は某MJPEGの奴を参考に作っただけです。