• 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 は 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


Reload   Diff   Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes