- The added line is THIS COLOR.
- The deleted line is THIS COLOR.
TITLE:Flash SWF フォーマット
#contents
----
- ネタ元: http://www.m2osw.com/en/swf_alexref.html
- 複数 byte field は Little Endian
- 可変長フィールドの 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 (zero terminated string)
- CWS の時は、file_length の後ろ(=header_movie 以降全て)のデータが zlib 圧縮される
** file_length: offset = 4 [#file_length]
- Little Endian 4 byte
- SWF ファイル全体の 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_integral: offset = 8 + 5(bits) + 4*size(bits) + 1 [#frame_rate_integral]
- 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 or something[#tag_format2]
+------------------------------------------------------+
| tag | 0x3f | length | contents |
+------------------------------------------------------+
<-10bits-><-6bits-><-- 4 bytes --> <-- length bytes -->
<- Little Endian ->
- DefineBitJpeg* のように length の値に関係なく(0x3f 以下でも)このフォーマットを使う tag があるので注意。
** tag contents の構造 [#tag_contents]
*** (0) End [#tag0]
- SWF ファイルの末尾に来る 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 (又は、別の tag である JPEGTables の方)に、それ以外のセグメントが image_data に入る。
-- そのまま取り出しても JPEG ファイルにはならず、セグメントを並び替える必要がある。
-- 各々、SOI(Start of Image)、EOI(End of Image) マーカーでくくるので、SOI,EOI が2つある妙な 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>#tag21]] のデータに alpha channel (透明度)データが加わったもの
-- これに画像のマスク値を乗せればスプライト的な表示が可能。
-- alpha channel は zlib 圧縮して格納。伸張すると画像左上の pixel から対応する順に透明度の値(1byte)が並んでいる。
-- 参考 -> 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圧縮) |
.. | encoding_tables | image_data | alpha(zlib圧縮) |
---+------------------------------+-------------------+
<-- offse_to_alpha --> <-contents 残り全部->
*** (90) DefineBitsJPEG4 [#tag90]
- [[DefineBitsJPEG3>#tag35]] のデータに deblock_param (デブロッキングフィルタの値)データが加わったもの
-- deblock_param は 2 byte
+---------------------------------------------------------------
| tag | length | length | image_id | offset_to_alpha | ..
| 90 | 0x3f | | | |
+---------------------------------------------------------------
<-- 2 bytes --> <- 4 bytes -> <-2 bytes-> <-- 4 bytes -->
<--- length (最後まで) ---
---+-------------+-----------------+------------+-------------------+
.. |deblock_param| encoding_tables | image_data | alpha(zlib圧縮) |
---+-------------+-----------------+------------+-------------------+
<- 2 bytes -> <----- offset_to_alpha ------> <-contents 残り全部->
*** 作成予定 [#aa0c7273]
- JPEGTables
-- http://www.m2osw.com/en/swf_alexref.html#tag_jpegtables
- DefineEditText
-- http://www.m2osw.com/en/swf_alexref.html#tag_defineedittext