TITLE:Flash SWF フォーマット #contents ---- - ネタ元: http://www.m2osw.com/en/swf_alexref.html - 複数byte field は LittleEndian - 後は bit 処理が幾つか - タグは TLC(type,length,contents) 構造 * header [#header] +---------+----------------------+ | magic | \0 | file_length | +-------- +------+---------------+ <-3 bytes-><1 byte><-- 4 bytes --> ** magic: offset = 0 [#magic] - FWS or CWS の 3文字 + \0 terminate string - CWS の時は、ファイルサイズフィールド以降が zlib 圧縮される ** file_length: offset = 4 [#file_length] - LittleEndian 4 byte * header_movie [#header_movie] char align (byte境界に合わせる) | +-------+----------+----------+----------+----------+--- | size | x_min | x_max | y_min | y_max | .. +-------+----------+----------+----------+----------+--- <5 bits><size bits><size bits><size bits><size bits> ---+---------------------------------+------------------+ .. | frame_rate_dec | frame_rate_int | frame_rate_count | ---+---------------------------------+------------------+ <-- 1 byte --> <-- 1 byte --> <-- 2 bytes --> ** size: offset = 8 [#size] - 先頭 5 bits は、この後に続く {x,y}_{min_max} のフィールドサイズ ** {x,y}_{min_max}: offset=8 + 5(bits) + n*size(bits) (n は 0 数え) [#zabe493c] - 表示フレームの左上と右下の座標値 (単位は [[TWIPS]]) ** frame_rate_decimal: offset = 8 + 5(bits) + 4*size(bits) [#frame_rate_decimal] - frame_rate の小数部 ** frame_rate_integer: offset = 8 + 5(bits) + 4*size(bits) + 1 [#frame_rate_integer] - frame_rate の整数部 ** frame_rate_count: offset = 8 + 5(bits) + 4*size(bits) + 2 [#frame_rate_count] - frame_rate_count: frame 数 * tag block [#tag_block] - header + header_movie の後ろに TLC(Type|Length|Contents)形式で並ぶ +----------------------------------------------------+ | header | header_movie | tag_block | tag_block| ... | +----------------------------------------------------+ <-8bytes-> <- 可変長 -> <- 可変長 -- 数も可変 -- - tag block は contents の長さ(length)によって二種類のフォーマットに分かれる ** tag block の構造 (1) length < 0x3f [#tag_format1] +-------------------------------------+ | tag | length | contents | +-------------------------------------+ <-10bits-><-6bits-><-- length bytes --> <- Little Endian -> ** tag block の構造 (1) 0x3f <= length [#tag_format2] +------------------------------------------------------+ | tag | 0x3f | length | contents | +------------------------------------------------------+ <-10bits-><-6bits-><-- 4 bytes --> <-- length bytes --> <- Little Endian -> ** tag contents の構造 [#tag_contents] *** (0) End [#tag0] - ファイルの末尾に来る tag は必ずこれ +--------------+ | tag | length | | 0 | 0 | +--------------+ <- 2 bytes -> *** (6) DefineBitsJPEG [#tag6] - JPEG データが image_data にそのまま入る +-------------------------------------------------------------+ | tag | length | length | image_id | image_data | | 6 | 0x3f | | | | +-------------------------------------------------------------+ <-- 2 bytes --> <- 4 bytes -> <-2 bytes-> <-contents 残り全部-> <------------------ length ----> *** (21) DefineBitsJPEG2 [#tag21] - JPEG データの圧縮テーブルに関するセグメントが encoding_tables に、それ以外のセグメントが image_data に入る。 -- そのまま取り出しても JPEG ファイルにはならず、セグメントを並び替える必要がある。 --- 参考1 -> http://diary.awm.jp/~yoya/?20080203#200802031 --- 参考2 -> http://diary.awm.jp/~yoya/?20080203#200802033 --- 参考3 -> http://mp.i-revo.jp/user.php/wrckyapk/entry/7225.html -- JPEG データのセグメント構造については ([[Flash/JPEG]]) ←こちらにまとめる予定。 +-----------------------------------------+------------------------------+ | tag | length | length | image_id | encoding_tables | image_data | | 21 | 0x3f | | | | +------------------------------------------------------------------------+ <-- 2 bytes --> <- 4 bytes -> <-2 bytes-> <--- contents 残り全部 ---> <---------------- length ----------------> *** (35) DefineBitsJPEG3 [#tag35] - DefineBitsJPEG2 のデータに alpha channel (透明度)データが加わったもの -- これに画像のマスク値を乗せればスプライト的な表示が可能。 -- alpha channel は zlib 圧縮して保存。伸張すると画像左上の pixel から対応する順に透明度が並んでいる。 -- 参考 -> http://diary.awm.jp/~yoya/?20080213#200802132 +--------------------------------------------------------------- | tag | length | length | image_id | offset_to_alpha | .. | 35 | 0x3f | | | | +--------------------------------------------------------------- <-- 2 bytes --> <- 4 bytes -> <-2 bytes-> <-- 4 bytes --> <--- length (最後まで) --- ---+------------------------------+-------------------+ .. | encoding_tables | image_data | alpha(zlib圧縮) | ---+------------------------------+-------------------+ <-- offse_to_alpha --> <-contents 残り全部-> *** 作成中 [#aa0c7273] - http://www.m2osw.com/en/swf_alexref.html#tag_jpegtables - http://www.m2osw.com/en/swf_alexref.html#tag_defineedittext |