def parse_swf_head(self): "swf_header" self.magic = self.swf_read(3) self.version = ord(self.swf_read(1)) self.file_length = le4byte(self.swf_read(4)) "swf_header_movie" # twips 関連のヘッダは、今は飛ばす rectbits = ord(self.swf_read(1)) >> 3 total_bytes = int(ceil((5 + rectbits * 4) / 8.0)) self.swf_read(total_bytes - 1) # frame 関連 self.frame_rate_decimal = ord(self.swf_read(1)) self.frame_rate_integer = ord(self.swf_read(1)) self.frame_count = le2byte(self.swf_read(2)) # ヘッダー, twips, frame データを取っておく self.swf_head = self.swf[:self.swf_pos] if DEBUG: print "magic: %s\nver: %d\nlen: %d\n" \ "frame_rate: %d.%d\ncount: %d\n" % ( \ self.magic, self.version, self.file_length, self.frame_rate_integer, self.frame_rate_decimal, self.frame_count)
def replace_lossless(self, block, image_data): """ DefineBitsLossless, DefineBitsLossless2 を置き換える関数 画像を置き換える際に行うこと 1. lossless データの置き換え 2. ヘッダーの length の置き換え 3. tag block での length の置き換え 4. width, height, format データの置き換え """ tag_raw = block['value'][:2] old_length = block['block_len'] # block['value'][2:6] と同じはず image_id = le2byte(block['value'][6:8]) # format = ord(block['value'][8]) # 1. g = Image2lossless(image_data, block['tag']) fv_read = g.convert() new_length = len(fv_read) + 7 # 2. self.file_length += (new_length - old_length) # 3. block['block_len'] = new_length # 4. block['value'] = \ tag_raw + \ _h32(new_length) + \ _h16(image_id) + \ g.get_lossless_format() + \ _h16(g.width()) + \ _h16(g.height()) + \ fv_read
def replace_images(self, images): for block in self.swf_blocks: if block['tag'] in (20, 21, 36): image_id = le2byte(block['value'][6:8]) if image_id in images: if block['tag'] in (20, 36): # DefineBitsLossless, DefineBitsLossless2 self.replace_lossless(block, images[image_id]) elif block['tag'] == 21: # DefineBitsJPEG2 self.replace_jpeg(block, images[image_id])
def parse_swfblock(self): swf_block_start = self.swf_pos swf_tag = le2byte(self.swf_read(2)) block_len = swf_tag & 0x3f if block_len == 0x3f: block_len = le4byte(self.swf_read(4)) swf_tag = swf_tag >> 6 if swf_tag == 0: return None try: swf_tag_name = swf_tag_name_entry[swf_tag] except KeyError: swf_tag_name = "Unknown" ret = {} ret['block_start'] = swf_block_start ret['tag'] = swf_tag ret['block_len'] = block_len ret['tag_name'] = swf_tag_name self.swf_pos += block_len ret['value'] = self.swf[swf_block_start:self.swf_pos] return ret
def parse_swfblock(self): block_start = self.offset tag = le2byte(self.read(2)) block_len = tag & 0x3f if block_len == 0x3f: block_len = le4byte(self.read(4)) tag = tag >> 6 content_offset = self.offset - block_start self.offset += block_len args = [ tag, block_len, content_offset, self.value[block_start:self.offset], self.base_block, self.swf] if tag in SWF_TAG: return SWF_TAG[tag](*args) else: return SwfBlock(*args)