DefineBitsJPEG erroneous header

こちらで、SWF DefineBitsJPEG の erroneous header について触れられていたので、折角なので補足します。

経緯と推測

  • SWF v8 未満では仕様書で定義されていない
    • 仕様に無いけど Flash Lite の世界では erroneous header のノウハウが流通していた
  • SWF v8 の仕様書で errorneous header の定義が追加された
    • 但し「before version 8 of the SWF file format, could contain an errornous header」と限定。

といった流れです。

v8 未満に限定する所からして、以下の観点でのなし崩し的な追加だと思われます。

  • 現状追認
  • Flash Lite での処理性能重視
  • SOI+EOI で行けるという噂もあるけど表示できない処理系があるので、EOI+SOI を明記した方がベター。

取りうる対応

上記ブログの通りに、

  • version8 未満では errornous header を追加
  • version8 以降では JPEG chunk 入れ替え

が正しいと自分も思います。

仕様に明記されてなかった頃(v7以前)に実装された Flash Lite Player が心配ですが、
仕様を後付けした以上、Adobe さんも過去の処理系で検証してるでしょうし、自分が昔の携帯端末で実験した限りでも errornous header で失敗する例は見つけられなかったので、実質的に問題ないはずです。

個人的な所

自分がサービスやライブラリを開発する時は、過去の仕様に respect して全部 chunk 入れ替えしてましたが、見直そうと考えています。

JPEG の chunk 分解は byte 毎を scan する必要があって重たいんですよね。。
scan する必要のある Image 系 chunk が一番最後なのを仮定すれば、scan しなくて済みますが、世の中の (Flash Liteの) SWF が errornous header に傾くなら、それに合わせた方が良いと考えています。

更に蛇足

以上、推測が多くて済みません。
本当の事情は Adobe の中の人に聞かないと分かりませんが、実際に聞いたら色々話せない事が出てきそうなので、アプローチはしてません。コネないし。^^;