Exemplo n.º 1
0
 function parseContent($tagCode, $content, $opts = array())
 {
     $reader = new IO_Bit();
     $reader->input($content);
     if ($tagCode == 59) {
         // DoInitAction
         $this->_spriteId = $reader->getUI16LE();
     }
     $i = 0;
     while ($reader->hasNextData(1)) {
         list($byteOffset, $dummy) = $reader->getOffset();
         $action = IO_SWF_Type_Action::parse($reader);
         list($nextByteOffset, $dummy) = $reader->getOffset();
         //
         $this->_byteOffsetTable[$i] = $byteOffset;
         $this->_byteSizeTable[$i] = $nextByteOffset - $byteOffset;
         $recordOffsetToByteOffset[$i] = $byteOffset;
         $byteOffsetToRecordOffset[$byteOffset] = $i;
         //
         $this->_actions[] = $action;
         $i++;
     }
     if ($i > 0) {
         $recordOffsetToByteOffset[$i] = $nextByteOffset;
         $byteOffsetToRecordOffset[$nextByteOffset] = $i;
         $byteOffsetToRecordOffset[$nextByteOffset] = $i;
     }
     $label_num = 0;
     foreach ($this->_actions as $i => $action) {
         if ($action['Code'] == 0x99) {
             // Jump
             $branch_offset = $action['BranchOffset'];
         } else {
             if ($action['Code'] == 0x9d) {
                 // If
                 $branch_offset = $action['Offset'];
             } else {
                 continue;
             }
         }
         $targetByteOffset = $recordOffsetToByteOffset[$i + 1] + $branch_offset;
         if (isset($byteOffsetToRecordOffset[$targetByteOffset])) {
             $targetRecordOffset = $byteOffsetToRecordOffset[$targetByteOffset];
             if (isset($this->_labels[$targetRecordOffset]) === false) {
                 $this->_labels[$targetRecordOffset] = $targetRecordOffset;
             }
             $this->_branches[$i] = $this->_labels[$targetRecordOffset];
         }
     }
 }
Exemplo n.º 2
0
 function parse($mididata)
 {
     $this->_mididata = $mididata;
     $reader = new IO_Bit();
     $reader->input($mididata);
     while ($reader->hasNextData(4)) {
         $chunk = $this->_parseChunk($reader);
         if (isset($chunk['header'])) {
             $this->header = $chunk;
         } elseif (isset($chunk['track'])) {
             $this->tracks[] = $chunk;
         } elseif (isset($chunk['xfinfo'])) {
             $this->xfinfo = $chunk;
         } elseif (isset($chunk['xfkaraoke'])) {
             $this->xfkaraoke = $chunk;
         } else {
             fprintf(STDERR, "Can't parse chunk.\n");
             break;
         }
     }
 }
Exemplo n.º 3
0
 function parseChunkData()
 {
     if (isset($this->detail)) {
         return;
     }
     $detailData = array();
     $id = $this->id;
     $reader = new IO_Bit();
     $reader->input($this->data);
     $this->data = null;
     // XXX
     switch ($id) {
         // INFO sub-chunks
         case 'ifil':
             $detailData['sfVersionMajor'] = $reader->getUI16LE();
             $detailData['sfVersionMinor'] = $reader->getUI16LE();
             break;
         case 'INAM':
             $detailData['sfName'] = $this->data;
             // String
             break;
         case 'isng':
             $detailData['sfEngine'] = $this->data;
             // String
             break;
         case 'IENG':
             $detailData['sfEngineers'] = $this->data;
             // String
             break;
         case 'ISFT':
             $detailData['sfTools'] = $this->data;
             // String
             break;
         case 'ICMT':
             $detailData['Comments'] = $this->data;
             // String
             break;
         case 'ICOP':
             $detailData['Copyright'] = $this->data;
             // String
             break;
             // sdta sub-chunks
         // sdta sub-chunks
         case 'smpl':
             $detailData['Samples'] = $this->data;
             // String
             break;
             // pdta sub-chunks
         // pdta sub-chunks
         case 'phdr':
             $detailData = array();
             while ($reader->hasNextData()) {
                 $preset = array();
                 $presetName = explode("", $reader->getData(20));
                 $preset['PresetName'] = $presetName[0];
                 $preset['Preset'] = $reader->getUI16LE();
                 $preset['Bank'] = $reader->getUI16LE();
                 $preset['PresetBagNdx'] = $reader->getUI16LE();
                 $preset['Library'] = $reader->getUI32LE();
                 $preset['Genre'] = $reader->getUI32LE();
                 $preset['MorphologyGenre'] = $reader->getUI32LE();
                 $detailData[] = $preset;
             }
             break;
         case 'pbag':
             $detailData = array();
             while ($reader->hasNextData()) {
                 $presetBag = array();
                 $presetBag['GenNdx'] = $reader->getUI16LE();
                 $presetBag['ModNdx'] = $reader->getUI16LE();
                 $detailData[] = $presetBag;
             }
             break;
         case 'pmod':
         case 'imod':
             $detailData = array();
             while ($reader->hasNextData()) {
                 $sfMod = array();
                 $sfMod['sfModSrcOper'] = IO_SoundFont_Modulator::parse($reader);
                 $sfMod['sfModDestOper'] = $reader->getUI16LE();
                 $sfMod['modAmount'] = $reader->getSI16LE();
                 $sfMod['sfModAmtSrcOper'] = IO_SoundFont_Modulator::parse($reader);
                 $sfMod['sfModTransOper'] = $reader->getUI16LE();
                 $detailData[] = $sfMod;
             }
             break;
         case 'pgen':
         case 'igen':
             $detailData = array();
             while ($reader->hasNextData()) {
                 $detailData[] = IO_SoundFont_Generator::parse($reader);
             }
             break;
         case 'inst':
             $detailData = array();
             while ($reader->hasNextData()) {
                 $sfInst = array();
                 $InstName = explode("", $reader->getData(20));
                 $sfInst['InstName'] = $InstName[0];
                 $sfInst['InstBagNdx'] = $reader->getSI16LE();
                 $detailData[] = $sfInst;
             }
             break;
         case 'ibag':
             $detailData = array();
             while ($reader->hasNextData()) {
                 $presetBag = array();
                 $presetBag['GenNdx'] = $reader->getUI16LE();
                 $presetBag['ModNdx'] = $reader->getUI16LE();
                 $detailData[] = $presetBag;
             }
             break;
         case 'shdr':
             $detailData = array();
             while ($reader->hasNextData()) {
                 $sfSample = array();
                 $SampleName = explode("", $reader->getData(20));
                 $sfSample['SampleName'] = $SampleName[0];
                 $sfSample['Start'] = $reader->getUI32LE();
                 $sfSample['End'] = $reader->getUI32LE();
                 $sfSample['StartLoop'] = $reader->getUI32LE();
                 $sfSample['EndLoop'] = $reader->getUI32LE();
                 $sfSample['SampleRate'] = $reader->getUI32LE();
                 $sfSample['OriginalPitch'] = $reader->getUI8();
                 $sfSample['PitchCorrection'] = $reader->getSI8();
                 $sfSample['SampleLink'] = $reader->getUI16LE();
                 $sfSample['SampleType'] = $reader->getUI16LE();
                 $detailData[] = $sfSample;
             }
             break;
         default:
             return;
             // nothing to do
             break;
     }
     $this->detail = $detailData;
 }
Exemplo n.º 4
0
Arquivo: JPEG.php Projeto: yoya/IO_SWF
 function _splitChunk($eoiFinish = true, $sosScan = true)
 {
     $bitin = new IO_Bit();
     $bitin->input($this->_jpegdata);
     while ($bitin->hasNextData()) {
         $marker1 = $bitin->getUI8();
         if ($marker1 != 0xff) {
             fprintf(STDERR, "dumpChunk: marker1=0x%02X", $marker1);
             return false;
         }
         $marker2 = $bitin->getUI8();
         switch ($marker2) {
             case 0xd8:
                 // SOI (Start of Image)
                 $this->_jpegChunk[] = array('marker' => $marker2, 'data' => null, 'length' => null);
                 continue;
             case 0xd9:
                 // EOI (End of Image)
                 $this->_jpegChunk[] = array('marker' => $marker2, 'data' => null, 'length' => null);
                 if ($eoiFinish) {
                     break 2;
                     // while break;
                 }
                 continue;
             case 0xda:
                 // SOS
                 if ($sosScan === false) {
                     $remainData = $bitin->getDataUntil(false);
                     $this->_jpegChunk[] = array('marker' => $marker2, 'data' => $remainData, 'length' => null);
                     break 2;
                     // while break;
                 }
             case 0xd0:
             case 0xd1:
             case 0xd2:
             case 0xd3:
                 // RST
             // RST
             case 0xd4:
             case 0xd5:
             case 0xd6:
             case 0xd7:
                 // RST
                 list($chunk_data_offset, $dummy) = $bitin->getOffset();
                 while (true) {
                     $next_marker1 = $bitin->getUI8();
                     if ($next_marker1 != 0xff) {
                         continue;
                     }
                     $next_marker2 = $bitin->getUI8();
                     if ($next_marker2 == 0x0) {
                         continue;
                     }
                     $bitin->incrementOffset(-2, 0);
                     // back from next marker
                     list($next_chunk_offset, $dummy) = $bitin->getOffset();
                     $length = $next_chunk_offset - $chunk_data_offset;
                     $bitin->setOffset($chunk_data_offset, 0);
                     $this->_jpegChunk[] = array('marker' => $marker2, 'data' => $bitin->getData($length), 'length' => null);
                     break;
                 }
                 break;
             default:
                 $length = $bitin->getUI16BE();
                 $this->_jpegChunk[] = array('marker' => $marker2, 'data' => $bitin->getData($length - 2), 'length' => $length);
                 continue;
         }
     }
 }
Exemplo n.º 5
0
Arquivo: MFi.php Projeto: yoya/IO_MFi
 function parse($mfidata)
 {
     $reader = new IO_Bit();
     $reader->input($mfidata);
     // Header Part
     $identifier = $reader->getData(4);
     if ($identifier != 'melo') {
         throw new Exception('Identifer($identifier) is not melo');
     }
     $this->headers['Identifier'] = $identifier;
     $fileLength = $reader->getUI32BE();
     $realFileLength = strlen($mfidata);
     if ($fileLength != $realFileLength - 8) {
         throw new Exception("FileLength({$fileLength}) is not real FileLength({$realFileLength}) - 8");
     }
     $this->headers['FileLength'] = $fileLength;
     $offsetToTrack = $reader->getUI16BE();
     $this->headers['OffsetToTrack'] = $offsetToTrack;
     $this->headers['DataTypeMajor'] = $reader->getUI8();
     $this->headers['DataTypeMinor'] = $reader->getUI8();
     $this->headers['NumberOfTrack'] = $reader->getUI8();
     // Data Information Part
     $reader_di = new IO_Bit();
     $reader_di->input($reader->getData($offsetToTrack - 3));
     $note_message_length_info = 0;
     while ($reader_di->hasNextData(6)) {
         $info = array();
         $identifer = $reader_di->getData(4);
         $length = $reader_di->getUI16BE();
         $info['Identifer'] = $identifer;
         $info['Length'] = $length;
         switch ($identifer) {
             case 'titl':
             case 'copy':
             case 'prot':
             case 'date':
                 $data = $reader_di->getData($length);
                 break;
             case 'sorc':
                 $data = $reader_di->getUI8($length);
                 break;
             case 'note':
             case 'exst':
                 $data = $reader_di->getUI16BE($length);
                 if ($identifer == 'note') {
                     $note_message_length_info = $data;
                 }
                 break;
             case 'vers':
                 $data = $reader_di->getUI32BE($length);
                 break;
         }
         $info['Data'] = $data;
         $this->datainfos[] = $info;
     }
     // Track Part
     while ($reader->hasNextData(8)) {
         $track = array();
         $track['Identifer'] = $reader->getData(4);
         $length = $reader->getUI32BE();
         $track['Length'] = $length;
         $reader_ev = new IO_Bit();
         $reader_ev->input($reader->getData($length));
         $track['Events'] = array();
         while ($reader_ev->hasNextData(3)) {
             $event = array();
             $event['DeltaTime'] = $reader_ev->getUI8();
             $statusInfo = $reader_ev->getUI8();
             $event['StatusInfo'] = $statusInfo;
             switch ($statusInfo) {
                 default:
                     $event['Data'] = $reader_ev->getUI8();
                     if ($note_message_length_info == 1) {
                         // MFi2
                         $event['Data2'] = $reader_ev->getUI8();
                     }
                     break;
                 case 0xff:
                     $statusInfo2 = $reader_ev->getUI8();
                     $event['StatusInfo2'] = $statusInfo2;
                     switch ($statusInfo2) {
                         default:
                             $event['Data'] = $reader_ev->getUI8();
                             break;
                         case 0xf0:
                         case 0xf1:
                         case 0xff:
                             $length = $reader_ev->getUI16BE();
                             $event['Length'] = $length;
                             $event['Data'] = $reader_ev->getData($length);
                             break;
                     }
             }
             $track['Events'][] = $event;
         }
         $this->tracks[] = $track;
     }
 }
Exemplo n.º 6
0
 function parseDataChunks(&$reader)
 {
     $chunks = array();
     while ($reader->hasNextData(8)) {
         $chunk = array();
         $chunkID = $reader->getData(4);
         $size = $reader->getUI32BE();
         $chunk['ID'] = $chunkID;
         $chunkID_3byte = substr($chunkID, 0, 3);
         $chunkID_4th_value = ord($chunkID[3]);
         switch ($chunkID_3byte) {
             case 'Dch':
                 $chunk['ID'] = $chunkID_3byte;
                 $chunk['CodeType'] = $chunkID_4th_value;
                 break;
             case 'MTR':
             case 'ATR':
             case 'GTR':
                 $chunk['ID'] = $chunkID_3byte;
                 $chunk['TrackNumber'] = $chunkID_4th_value;
                 break;
         }
         $chunk['Size'] = $size;
         switch (substr($chunkID, 0, 3)) {
             case 'CNT':
                 // CNTI: Contents Information Chunk
                 $chunk['Contents Class'] = $reader->getUI8();
                 $chunk['Contents Type'] = $reader->getUI8();
                 $chunk['Contents Code Type'] = $reader->getUI8();
                 $chunk['Copy Status'] = $reader->getUI8();
                 $chunk['Copy Counts'] = $reader->getUI8();
                 if ($size > 5) {
                     $chunk['Option'] = $reader->getData($size - 5);
                 }
                 break;
             case 'MTR':
                 // MTR*: Score Track Chunk
                 $chunk['Format Type'] = $reader->getUI8();
                 $chunk['Sequence Type'] = $reader->getUI8();
                 $chunk['Timebase D'] = $reader->getUI8();
                 $chunk['Timebase G'] = $reader->getUI8();
                 $chunk['Channnel Status'] = $reader->getUI16BE();
                 $data = $reader->getData($size - 6);
                 $reader_chunkdata = new IO_Bit();
                 $reader_chunkdata->input($data);
                 $this->seekToAlphabet($reader_chunkdata);
                 $chunk[$structure_type] = $this->parseDataChunks($reader_chunkdata);
                 break;
             case 'Mts':
                 // Mtsu, Mtsq, Mts
                 $data = $reader->getData($size);
                 $reader_tracks = new IO_Bit();
                 $reader_tracks->input($data);
                 switch ($chunkID) {
                     case 'Mtsu':
                         // Score Track Setup Data
                     // Score Track Setup Data
                     case 'Mtsq':
                         // Score Track Sequence Data
                         $tracks = array();
                         while ($reader_tracks->hasNextData(4)) {
                             $end_check = $reader_tracks->getUI32BE();
                             if ($end_check == 0) {
                                 break;
                             }
                             $reader_tracks->incrementOffset(-4, 0);
                             $track = array();
                             // Duration
                             if ($chunkID != 'Mtsu') {
                                 // Mtsu は Duration 無し
                                 $duration = $reader_tracks->getUI8();
                                 if ($duration & 0x80) {
                                     $duration = ($duration & 0x7f) << 8;
                                     $duration |= $reader_tracks->getUI8();
                                 }
                                 $track['Duration'] = $duration;
                             }
                             // Event
                             $event = $reader_tracks->getUI8();
                             $eventData = array();
                             if ($event != 0) {
                                 $eventData['Type'] = 'Note Message';
                                 $eventData['GetTime'] = $reader_tracks->getUI8();
                                 // Option ???
                             } else {
                                 $data1 = $reader_tracks->getUI8();
                                 $eventData['Channel'] = $data1 >> 6;
                                 if (($data1 & 0xf) == 0) {
                                     $eventData['Type'] = 'Program change';
                                 } elseif (($data1 & 0xf) == 1) {
                                     $eventData['Type'] = 'Bank Select';
                                 } else {
                                     $msg = sprintf("Unknow Event Data#1=0x%02x", $data1);
                                     //                                throw new Exception($msg);
                                     printf($msg . "\n");
                                     break 2;
                                 }
                                 $eventData['Value'] = $reader_tracks->getUI8();
                             }
                             $track['event'] = $tracks[] = $track;
                         }
                         $chunk['Tracks'] = $tracks;
                         break 2;
                 }
             default:
                 $data = $reader->getData($size);
                 if ($structure_type = $this->nestedChunkIDSize($chunkID)) {
                     $reader_chunkdata = new IO_Bit();
                     $reader_chunkdata->input($data);
                     $method = 'parseData' . $structure_type;
                     $chunk[$structure_type] = $this->{$method}($reader_chunkdata);
                 } else {
                     $chunk['Data'] = $data;
                 }
                 break;
         }
         //            var_dump($chunk);
         $chunks[] = $chunk;
     }
     return $chunks;
 }
Exemplo n.º 7
0
 static function parse(&$reader, $opts = array())
 {
     $action = array();
     $code = $reader->getUI8();
     $action['Code'] = $code;
     if ($code >= 0x80) {
         $length = $reader->getUI16LE();
         $action['Length'] = $length;
         switch ($code) {
             case 0x81:
                 // ActionGotoFrame
                 $action['Frame'] = $reader->getUI16LE();
                 break;
             case 0x83:
                 // ActionGetURL
                 $data = $reader->getData($length);
                 $strs = explode("", $data, 2 + 1);
                 $action['UrlString'] = $strs[0];
                 $action['TargetString'] = $strs[1];
                 break;
             case 0x88:
                 // ActionConstantPool
                 $count = $reader->getUI16LE();
                 $action['Count'] = $count;
                 $data = $reader->getData($length - 2);
                 $strs = explode("", $data, $count + 1);
                 $action['ConstantPool'] = array_splice($strs, 0, $count);
                 break;
             case 0x8a:
                 // ActionWaitForFrame
                 $action['Frame'] = $reader->getUI16LE();
                 $action['SkipCount'] = $reader->getUI8();
                 break;
             case 0x8b:
                 // ActionSetTarget
                 $data = $reader->getData($length);
                 $strs = explode("", $data, 1 + 1);
                 $action['TargetName'] = $strs[0];
                 break;
             case 0x8c:
                 // ActionSetTarget
                 $data = $reader->getData($length);
                 $strs = explode("", $data, 1 + 1);
                 $action['Label'] = $strs[0];
                 break;
             case 0x8d:
                 // ActionWaitForFrame2
                 $action['Frame'] = $reader->getUI16LE();
                 $action['SkipCount'] = $reader->getUI8();
                 break;
             case 0x8e:
                 // ActionDefineFunction2
                 $action['FunctionName'] = $reader->getDataUntil("");
                 $action['NumParams'] = $numParams = $reader->getUI16LE();
                 $action['RegisterCount'] = $reader->getUI8();
                 //
                 $action['PreloadParentFlag'] = $reader->getUIBit();
                 $action['PreloadBootFlag'] = $reader->getUIBit();
                 $action['SuppressSuperFlag'] = $reader->getUIBit();
                 $action['PreloadSuperFlag'] = $reader->getUIBit();
                 $action['SuppressArgumentsFlag'] = $reader->getUIBit();
                 $action['PreloadArgumentsFlag'] = $reader->getUIBit();
                 $action['SuppressThisFlag'] = $reader->getUIBit();
                 $action['PreloadThisFlag'] = $reader->getUIBit();
                 //
                 $action['(Reserve)'] = $reader->getUIBits(7);
                 $action['PreloadGlobalFlag'] = $reader->getUIBit();
                 //
                 $parameters = array();
                 for ($i = 0; $i < $numParams; $i++) {
                     $registerParam = array();
                     $registerParam['Register'] = $reader->getUI8();
                     $registerParam['ParamName'] = $reader->getDataUntil("");
                     $parameters[] = $registerParam;
                 }
                 $action['Parameters'] = $parameters;
                 $action['codeSize'] = $reader->getUI16LE();
                 break;
             case 0x96:
                 // ActionPush
                 $data = $reader->getData($length);
                 $values = array();
                 $values_reader = new IO_Bit();
                 $values_reader->input($data);
                 while ($values_reader->hasNextData()) {
                     $value = array();
                     $type = $values_reader->getUI8();
                     $value['Type'] = $type;
                     switch ($type) {
                         case 0:
                             // STRING
                             $value['String'] = IO_SWF_Type_String::parse($values_reader);
                             break;
                         case 1:
                             // Float
                             $value['Float'] = IO_SWF_Type_Float::parse($values_reader);
                             break;
                         case 2:
                             // null
                             $value['null'] = null;
                             break;
                         case 3:
                             // undefined
                             $value['undefined'] = null;
                             break;
                         case 4:
                             // RegisterNumber
                             $value['RegisterNumber'] = $values_reader->getUI8();
                             break;
                         case 5:
                             // Boolean
                             $value['Boolean'] = $values_reader->getUI8();
                             break;
                         case 6:
                             // Double
                             $value['Double'] = IO_SWF_Type_Double::parse($values_reader);
                             break;
                         case 7:
                             // Integer
                             $value['Integer'] = $values_reader->getUI32LE();
                             break;
                         case 8:
                             // Constant8
                             $value['Constant8'] = $values_reader->getUI8();
                             break;
                         case 9:
                             // Constant16
                             $value['Constant16'] = $values_reader->getUI16LE();
                             break;
                         default:
                             throw new IO_SWF_Exception("Illegal ActionPush value's type({$type})");
                     }
                     $values[] = $value;
                 }
                 $action['Values'] = $values;
                 break;
             case 0x99:
                 // ActionJump
                 $action['BranchOffset'] = $reader->getSI16LE();
                 break;
             case 0x9a:
                 // ActionGetURL2
                 //                $action['SendVarsMethod'] = $reader->getUIBits(2);
                 //                $action['(Reserved)'] = $reader->getUIBits(4);
                 //                $action['LoadTargetFlag'] = $reader->getUIBit();
                 //                $action['LoadVariablesFlag'] = $reader->getUIBit();
                 // swf_file_format_spec_v10 bug, field reverse.
                 $action['LoadVariablesFlag'] = $reader->getUIBit();
                 $action['LoadTargetFlag'] = $reader->getUIBit();
                 $action['(Reserved)'] = $reader->getUIBits(4);
                 $action['SendVarsMethod'] = $reader->getUIBits(2);
                 break;
             case 0x9d:
                 // ActionIf
                 $action['Offset'] = $reader->getSI16LE();
                 break;
             case 0x9f:
                 // ActionGotoFrame2
                 $action['(Reserved)'] = $reader->getUIBits(6);
                 $sceneBiasFlag = $reader->getUIBit();
                 $action['SceneBiasFlag'] = $sceneBiasFlag;
                 $action['PlayFlag'] = $reader->getUIBit();
                 if ($sceneBiasFlag == 1) {
                     $action['SceneBias'] = $reader->getUI16LE();
                 }
                 break;
             default:
                 if ($length > 0) {
                     $action['Data'] = $reader->getData($length);
                 }
                 break;
         }
     }
     return $action;
 }