Changeset 9878

Show
Ignore:
Timestamp:
10/26/07 17:54:04 (3 years ago)
Author:
sys
Message:

swf2props : parsing des formats FLV et SWF

Location:
trunk
Files:
2 added
2 modified
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/Jav_CO/com/scenari/s/co/transform/swf/HTransformerSwfHeader.java

    r9867 r9878  
    4949import java.io.Writer; 
    5050 
    51 import com.scenari.ext.swf.FSHeader; 
     51import com.scenari.ext.swf.FlashHeader; 
     52import com.scenari.ext.swf.FlvHeader; 
     53import com.scenari.ext.swf.SwfHeader; 
    5254import com.scenari.s.co.transform.HTransformParams; 
    5355import com.scenari.s.co.transform.HTransformer; 
     
    8082         */ 
    8183        public void hTransform(Object pSrc, Object pRes, HTransformParams pParams) throws Exception { 
    82                 byte[] vData; 
    83                 FSHeader vHeader; 
     84                FlashHeader vHeader; 
    8485                InputStream vIn = null; 
    8586                 
     
    8990 
    9091                try { 
     92                        byte[] vData; 
     93                        InputStream vStream; 
    9194                        if (pSrc instanceof InputStream) { 
    9295                                vData = new byte[4096]; 
    93                                 ((InputStream) pSrc).read(vData); 
    94                                 vHeader = new FSHeader(vData, (InputStream)pSrc ); 
     96                                vStream = (InputStream) pSrc; 
    9597                        } else { 
    9698                                vData = new byte[Math.min((int)((File) pSrc).length(), 4096)]; 
     99                                //vIn sera clos dans la clause finally 
    97100                                vIn = new FileInputStream((File) pSrc); 
    98                                 vIn.read(vData); 
    99                                 vHeader = new FSHeader(vData, vIn); 
    100                         } 
     101                                vStream = vIn; 
     102                        } 
     103                        int vRead = vStream.read(vData); 
     104                        while(vRead != -1 && vRead < vData.length) { 
     105                                //On s'assure que la tableau a � enti�ment renseign�ou qu'on est �a fin du stream 
     106                                int vRead2 = vStream.read(vData, vRead, vData.length - vRead); 
     107                                if(vRead2==-1) break; 
     108                                vRead += vRead2; 
     109                        } 
     110                        vHeader = FlashHeader.buildHeader(vData, vStream); 
    101111         
    102112                        //Encoding 
     
    112122                        vXmlWriter = new HXmlWriterIO(vResult); 
    113123                        vXmlWriter.hWriteHeaderXml("utf-8"); 
    114                         vXmlWriter.hWriteStartTag("swfHeader"); 
    115                         vXmlWriter.hWriteAttribut("signature", vHeader.getSignature()); 
    116                         vXmlWriter.hWriteAttribut("version", HCharSeqUtil.hGetIntToString(vHeader.getVersion())); 
    117                         vXmlWriter.hWriteAttribut("frameRate", String.valueOf(vHeader.getFrameRate())); 
    118                         vXmlWriter.hWriteAttribut("numberOfFrames", String.valueOf(vHeader.getNumberOfFrames())); 
    119                         vXmlWriter.hWriteAttribut("x1", HCharSeqUtil.hGetIntToString(vHeader.getMinX())); 
    120                         vXmlWriter.hWriteAttribut("y1", HCharSeqUtil.hGetIntToString(vHeader.getMinY())); 
    121                         vXmlWriter.hWriteAttribut("x2", HCharSeqUtil.hGetIntToString(vHeader.getMaxX())); 
    122                         vXmlWriter.hWriteAttribut("y2", HCharSeqUtil.hGetIntToString(vHeader.getMaxY())); 
    123                         vXmlWriter.hWriteEndEmptyTag(); 
     124                        if(vHeader instanceof SwfHeader) { 
     125                                SwfHeader vSwfHeader = (SwfHeader)vHeader; 
     126                                vXmlWriter.hWriteStartTag("swfHeader"); 
     127                                vXmlWriter.hWriteAttribut("signature", vSwfHeader.getSignature()); 
     128                                vXmlWriter.hWriteAttribut("version", HCharSeqUtil.hGetIntToString(vSwfHeader.getVersion())); 
     129                                vXmlWriter.hWriteAttribut("frameRate", String.valueOf(vSwfHeader.getFrameRate())); 
     130                                vXmlWriter.hWriteAttribut("numberOfFrames", String.valueOf(vSwfHeader.getNumberOfFrames())); 
     131                                vXmlWriter.hWriteAttribut("x1", HCharSeqUtil.hGetIntToString(vSwfHeader.getMinX())); 
     132                                vXmlWriter.hWriteAttribut("y1", HCharSeqUtil.hGetIntToString(vSwfHeader.getMinY())); 
     133                                vXmlWriter.hWriteAttribut("x2", HCharSeqUtil.hGetIntToString(vSwfHeader.getMaxX())); 
     134                                vXmlWriter.hWriteAttribut("y2", HCharSeqUtil.hGetIntToString(vSwfHeader.getMaxY())); 
     135                                vXmlWriter.hWriteEndEmptyTag(); 
     136                        } else if(vHeader instanceof FlvHeader) { 
     137                                FlvHeader vFlvHeader = (FlvHeader)vHeader; 
     138                                vXmlWriter.hWriteStartTag("flvHeader"); 
     139                                vXmlWriter.hWriteAttribut("version", HCharSeqUtil.hGetIntToString(vFlvHeader.getVersion())); 
     140                                vXmlWriter.hWriteAttribut("hasAudio", String.valueOf(vFlvHeader.getHasAudio())); 
     141                                vXmlWriter.hWriteAttribut("hasVideo", String.valueOf(vFlvHeader.getHasVideo())); 
     142                                vXmlWriter.hWriteAttribut("duration", String.valueOf(vFlvHeader.getDuration())); 
     143                                vXmlWriter.hWriteAttribut("audioCodec", vFlvHeader.getAudioCodec()); 
     144                                vXmlWriter.hWriteAttribut("audioSampleRate", String.valueOf(vFlvHeader.getAudioCodec())); 
     145                                vXmlWriter.hWriteAttribut("audioSampleSize", String.valueOf(vFlvHeader.getAudioSampleSize())); 
     146                                vXmlWriter.hWriteAttribut("audioType", vFlvHeader.getAudioType()); 
     147                                vXmlWriter.hWriteAttribut("videoCodec", vFlvHeader.getVideoCodec()); 
     148                                vXmlWriter.hWriteAttribut("frameType", vFlvHeader.getFrameType()); 
     149                                vXmlWriter.hWriteAttribut("width", HCharSeqUtil.hGetIntToString(vFlvHeader.getWidth())); 
     150                                vXmlWriter.hWriteAttribut("height", HCharSeqUtil.hGetIntToString(vFlvHeader.getHeight())); 
     151                                vXmlWriter.hWriteEndEmptyTag(); 
     152                        } else { 
     153                                vXmlWriter.hWriteEmptyTag("formatUnknown"); 
     154                        } 
    124155                } catch (Exception e) { 
    125156                        throw (Exception) HLogMgr.hAddMessage(e, "Echec �'extraction des propri�s d'une image."); 
  • trunk/Jav_EXT/com/scenari/ext/swf/FSCoder.java

    r6119 r9878  
    11package com.scenari.ext.swf; 
    2  
    3  
     2/* 
     3 * FSCoder.java 
     4 *  
     5 * Copyright (c) 2001-2006 Flagstone Software Ltd. All rights reserved. 
     6 * 
     7 * Redistribution and use in source and binary forms, with or without modification,  
     8 * are permitted provided that the following conditions are met: 
     9 * 
     10 *  * Redistributions of source code must retain the above copyright notice, this 
     11 *    list of conditions and the following disclaimer. 
     12 *  * Redistributions in binary form must reproduce the above copyright notice,  
     13 *    this list of conditions and the following disclaimer in the documentation  
     14 *    and/or other materials provided with the distribution. 
     15 *  * Neither the name of Flagstone Software Ltd. nor the names of its contributors  
     16 *    may be used to endorse or promote products derived from this software  
     17 *    without specific prior written permission. 
     18 * 
     19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND  
     20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED  
     21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  
     22 * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  
     23 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,  
     24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,  
     25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  
     26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE  
     27 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED  
     28 * OF THE POSSIBILITY OF SUCH DAMAGE. 
     29 */ 
     30 
     31import java.io.InputStream; 
    432import java.io.UnsupportedEncodingException; 
    533 
     
    227255         */ 
    228256        public FSCoder(int order, int size) { 
    229                 clearContext(); 
    230  
    231257                byteOrder = order; 
    232258                data = new byte[size]; 
     
    249275         */ 
    250276        public FSCoder(int order, byte[] bytes) { 
    251                 clearContext(); 
    252  
    253277                byteOrder = order; 
    254278                data = bytes; 
     
    10291053 
    10301054        static final int DecodeGlyphs = 20; 
    1031  
    1032         int[] context = new int[21]; 
    1033  
    1034         private void clearContext() { 
    1035                 for (int i = 0; i < context.length; i++) 
    1036                         context[i] = 0; 
    1037         } 
    1038  
    1039         public int getContext(int key) { 
    1040                 return context[key]; 
    1041         } 
    1042  
    1043         public void setContext(int key, int value) { 
    1044                 context[key] = value; 
     1055         
     1056        /** 
     1057         * Format FLV : Reinitialise les data pour acc�r �n nouveau bloc de donn� situ� pOffset du pointeur courant 
     1058         * align� l'octet pr�; �ntuellement, en poursuivant la lecture du stream. 
     1059         * 
     1060         * @param pOffset d�lage en bits pour acc�r au d�t du bloc. Attention : pOffset ne peut PAS �e n�tif. 
     1061         * @return true si le bloc suivant a � trouv�false si plus de block. 
     1062         */ 
     1063        public boolean gotoNextBlock(int pByteOffset, InputStream pStreamForMoreData) throws Exception { 
     1064                int vOffset = pByteOffset; 
     1065                alignToByte(); 
     1066                int vByteRemainder = (end - ptr) >>> 3; 
     1067                if(vOffset > vByteRemainder){ 
     1068                        //L'offset d�sse la fin des datas disponibles. 
     1069                        vOffset -= vByteRemainder; 
     1070                        vByteRemainder = 0; 
     1071                } else if(vOffset>0) { 
     1072                        //L'offset nous d�ace dans les datas disponibles. 
     1073                        vByteRemainder -= vOffset; 
     1074                        vOffset = 0; 
     1075                } 
     1076                 
     1077                if(vByteRemainder > 0) { 
     1078                        //Il reste des data �r�rver (qui constituent le d�t du nouveau bloc), on les d�ace au d�t 
     1079                        System.arraycopy(data, data.length-vByteRemainder, data, 0, vByteRemainder); 
     1080                } else { 
     1081                        //On saute les octets restants 
     1082                        if(vOffset>0) pStreamForMoreData.skip(vOffset); 
     1083                } 
     1084 
     1085                ptr = 0; 
     1086                 
     1087                int vRead = vByteRemainder; 
     1088                while(vRead != -1 && vRead < data.length) { 
     1089                        int vRead2 = pStreamForMoreData.read(data, vRead, data.length - vRead); 
     1090                        if(vRead2 == -1) break; 
     1091                        vRead += vRead2; 
     1092                } 
     1093                return vRead > 0; 
    10451094        } 
    10461095} 
  • trunk/Jav_EXT/com/scenari/ext/swf/SwfHeader.java

    r9867 r9878  
    11package com.scenari.ext.swf; 
     2 
    23/* 
    3  * FSHeader.java 
     4 * Code inspir�e FSHeader.java pour la partie SWF : 
    45 *  
    56 * Copyright (c) 2001-2006 Flagstone Software Ltd. All rights reserved. 
     
    2829 * OF THE POSSIBILITY OF SUCH DAMAGE. 
    2930 */ 
    30 import java.io.File; 
    31 import java.io.FileInputStream; 
    32 import java.io.FileNotFoundException; 
     31 
    3332import java.io.IOException; 
    3433import java.io.InputStream; 
     
    3635import java.util.zip.Inflater; 
    3736 
     37public class SwfHeader extends FlashHeader { 
    3838 
    39 public final class FSHeader { 
    4039        public static void main(String[] args) { 
    4140                try { 
    42                         FSHeader header = new FSHeader(args[0]); 
     41                        SwfHeader header = new SwfHeader(args[0]); 
    4342 
    4443                        StringBuffer buffer = new StringBuffer(); 
    4544 
    4645                        buffer.append("File: ").append(args[0]).append("\n"); 
    47                         buffer.append("Signature: ").append(header.getSignature()).append( 
    48                                         "\n"); 
     46                        buffer.append("Signature: ").append(header.getSignature()).append("\n"); 
    4947                        buffer.append("Version: ").append(header.getVersion()).append("\n"); 
    5048                        buffer.append("Frame: "); 
    51                         buffer.append("(").append(header.getMinX()).append(",").append( 
    52                                         header.getMinY()).append(") "); 
    53                         buffer.append("(").append(header.getMaxX()).append(",").append( 
    54                                         header.getMaxY()).append(")\n"); 
    55                         buffer.append("Length: ").append(header.getLength() + " bytes") 
    56                                         .append("\n"); 
    57                         buffer.append("FrameRate: ").append( 
    58                                         header.getFrameRate() + " per second").append("\n"); 
    59                         buffer.append("Number Of Frames: ").append( 
    60                                         header.getNumberOfFrames()).append("\n"); 
     49                        buffer.append("(").append(header.getMinX()).append(",").append(header.getMinY()).append(") "); 
     50                        buffer.append("(").append(header.getMaxX()).append(",").append(header.getMaxY()).append(")\n"); 
     51                        buffer.append("Length: ").append(header.getLength() + " bytes").append("\n"); 
     52                        buffer.append("FrameRate: ").append(header.getFrameRate() + " per second").append("\n"); 
     53                        buffer.append("Number Of Frames: ").append(header.getNumberOfFrames()).append("\n"); 
    6154 
    6255                        System.out.println(buffer.toString()); 
     
    6659        } 
    6760 
    68         private String signature = null; 
     61        protected int fMinX = 0; 
    6962 
    70         private int version = 0; 
     63        protected int fMinY = 0; 
    7164 
    72         private int minX = 0; 
     65        protected int fMaxX = 0; 
    7366 
    74         private int minY = 0; 
     67        protected int fMaxY = 0; 
    7568 
    76         private int maxX = 0; 
     69        protected int fLength = 0; 
    7770 
    78         private int maxY = 0; 
     71        protected float fFrameRate = 0.0f; 
    7972 
    80         private int length = 0; 
     73        protected int fFrameCount = 0; 
    8174 
    82         private float frameRate = 0.0f; 
    83  
    84         private int frameCount = 0; 
    85          
    86         protected InputStream fStreamForMore = null; 
    87  
    88         public FSHeader(String filename) throws IOException, DataFormatException { 
     75        public SwfHeader(String filename) throws Exception { 
    8976                decodeFromFile(filename); 
    9077        } 
    9178 
    92         public FSHeader(byte[] pData) throws IOException, DataFormatException { 
    93                 decodeFromData(pData); 
     79        public SwfHeader(byte[] pData) throws IOException, DataFormatException { 
     80                decodeFromData(pData, null); 
    9481        } 
    9582 
    96         public FSHeader(byte[] pData, InputStream pStreamForMoreData) throws IOException, DataFormatException { 
    97                 fStreamForMore = pStreamForMoreData; 
    98                 decodeFromData(pData); 
    99         } 
    100  
    101         public String getSignature() { 
    102                 return signature; 
    103         } 
    104  
    105         public int getVersion() { 
    106                 return version; 
     83        public SwfHeader(byte[] pData, InputStream pStreamForMoreData) throws IOException, DataFormatException { 
     84                decodeFromData(pData, pStreamForMoreData); 
    10785        } 
    10886 
    10987        public int getLength() { 
    110                 return length; 
     88                return fLength; 
    11189        } 
    11290 
    11391        public int getMinX() { 
    114                 return minX; 
     92                return fMinX; 
    11593        } 
    11694 
    11795        public int getMaxX() { 
    118                 return maxX; 
     96                return fMaxX; 
    11997        } 
    12098 
    12199        public int getMinY() { 
    122                 return minY; 
     100                return fMinY; 
    123101        } 
    124102 
    125103        public int getMaxY() { 
    126                 return maxY; 
     104                return fMaxY; 
    127105        } 
    128106 
    129107        public float getFrameRate() { 
    130                 return frameRate; 
     108                return fFrameRate; 
    131109        } 
    132110 
    133111        public float getNumberOfFrames() { 
    134                 return frameCount; 
     112                return fFrameCount; 
    135113        } 
    136114 
    137         public void decodeFromFile(String fileName) throws FileNotFoundException, 
    138                         DataFormatException, IOException { 
    139                 FileInputStream fileContents = null; 
     115        public void decodeFromData(byte[] pBytes, InputStream pStreamForMoreData) throws DataFormatException, IOException { 
     116                FSCoder vCoder = null; 
    140117 
    141                 File swfFile = new File(fileName); 
     118                if (!isSwf(pBytes)) throw new DataFormatException("Data does not start with a valid Flash (SWF) signature."); 
    142119 
    143                 fileContents = new FileInputStream(swfFile); 
     120                if (pBytes[0] == 0x43) { 
     121                        vCoder = new FSCoder(FSCoder.LITTLE_ENDIAN, unzip(pBytes, pStreamForMoreData)); 
     122                } else { 
     123                        vCoder = new FSCoder(FSCoder.LITTLE_ENDIAN, pBytes); 
     124                } 
    144125 
    145                 int fileLength = (int) swfFile.length(); 
    146                 byte[] contents = new byte[fileLength]; 
     126                fSignature = vCoder.readString(3, "UTF8"); 
     127                fVersion = vCoder.readWord(1, false); 
     128                fLength = vCoder.readWord(4, false); 
    147129 
    148                 fileContents.read(contents); 
    149                 fileContents.close(); 
     130                vCoder.alignToByte(); 
    150131 
    151                 decodeFromData(contents); 
     132                int vFieldSize = vCoder.readBits(5, false); 
     133 
     134                fMinX = vCoder.readBits(vFieldSize, true); 
     135                fMaxX = vCoder.readBits(vFieldSize, true); 
     136                fMinY = vCoder.readBits(vFieldSize, true); 
     137                fMaxY = vCoder.readBits(vFieldSize, true); 
     138 
     139                vCoder.alignToByte(); 
     140 
     141                fFrameRate = vCoder.readFixedWord(1, 1); 
     142                fFrameCount = vCoder.readWord(2, false); 
    152143        } 
    153144 
    154         public void decodeFromData(byte[] bytes) throws DataFormatException, 
    155                         IOException { 
    156                 FSCoder coder = null; 
    157  
    158                 isFlash(bytes); 
    159  
    160                 if (bytes[0] == 0x43) 
    161                         coder = new FSCoder(FSCoder.LITTLE_ENDIAN, unzip(bytes)); 
    162                 else 
    163                         coder = new FSCoder(FSCoder.LITTLE_ENDIAN, bytes); 
    164  
    165                 signature = coder.readString(3, "UTF8"); 
    166                 version = coder.readWord(1, false); 
    167                 length = coder.readWord(4, false); 
    168  
    169                 coder.alignToByte(); 
    170  
    171                 int fieldSize = coder.readBits(5, false); 
    172  
    173                 minX = coder.readBits(fieldSize, true); 
    174                 maxX = coder.readBits(fieldSize, true); 
    175                 minY = coder.readBits(fieldSize, true); 
    176                 maxY = coder.readBits(fieldSize, true); 
    177  
    178                 coder.alignToByte(); 
    179  
    180                 frameRate = coder.readFixedWord(1, 1); 
    181                 frameCount = coder.readWord(2, false); 
     145        protected static boolean isSwf(byte[] pBytes) throws DataFormatException { 
     146                if (pBytes == null || pBytes.length < 8) return false; 
     147                return (pBytes[0] == 0x43 || pBytes[0] == 0x46) && pBytes[1] == 0x57 && pBytes[2] == 0x53; 
    182148        } 
    183149 
    184         private void isFlash(byte[] bytes) throws DataFormatException { 
    185                 if (bytes == null || bytes.length < 8) 
    186                         throw new DataFormatException("Flash data is null or empty."); 
    187  
    188                 boolean isFlash = (bytes[0] == 0x43 || bytes[0] == 0x46) 
    189                                 && bytes[1] == 0x57 && bytes[2] == 0x53; 
    190  
    191                 if (isFlash == false) 
    192                         throw new DataFormatException( 
    193                                         "Data does not start with a valid Flash signature."); 
    194         } 
    195  
    196         private byte[] unzip(byte[] bytes) throws DataFormatException { 
     150        private byte[] unzip(byte[] pBytes, InputStream pStreamForMoreData) throws DataFormatException { 
    197151                int movieLength = 0; 
    198152 
    199153                for (int i = 0; i < 4; i++) 
    200                         movieLength += (bytes[i + 4] & 0x000000FF) << (i * 8); 
     154                        movieLength += (pBytes[i + 4] & 0x000000FF) << (i * 8); 
    201155 
    202156                movieLength = Math.min(movieLength, 512); 
     
    206160 
    207161                for (int i = 0; i < 8; i++) 
    208                         data[i] = bytes[i]; 
     162                        data[i] = pBytes[i]; 
    209163 
    210164                int vRead = 0; 
    211165                Inflater inflater = new Inflater(); 
    212                 inflater.setInput(bytes, 8, bytes.length - 8); 
     166                inflater.setInput(pBytes, 8, pBytes.length - 8); 
    213167                vRead = inflater.inflate(data, 8, movieLength - 8) + 8; 
    214                 if(fStreamForMore != null) while(vRead < data.length && ! inflater.finished()) { 
     168                if (pStreamForMoreData != null) while (vRead < data.length && !inflater.finished()) { 
    215169                        try { 
    216                                 int vBytesRead = fStreamForMore.read(bytes); 
    217                                 inflater.setInput(bytes, 0, vBytesRead); 
     170                                int vBytesRead = pStreamForMoreData.read(pBytes); 
     171                                inflater.setInput(pBytes, 0, vBytesRead); 
    218172                                vRead += inflater.inflate(data, vRead, movieLength - vRead); 
    219                         } catch  (Exception e) { 
    220                                 // 
     173                        } catch (Exception e) { 
    221174                        } 
    222175                } 
    223176                inflater.end(); 
    224                  
     177 
    225178                return data; 
    226179        } 
     180         
     181 
     182        public String toString() { 
     183                StringBuffer vBuffer = new StringBuffer(); 
     184                vBuffer.append("Signature: ").append(getSignature()).append("\n"); 
     185                vBuffer.append("Version: ").append(getVersion()).append("\n"); 
     186                vBuffer.append("Frame: "); 
     187                vBuffer.append("(").append(getMinX()).append(",").append(getMinY()).append(") "); 
     188                vBuffer.append("(").append(getMaxX()).append(",").append(getMaxY()).append(")\n"); 
     189                vBuffer.append("Length: ").append(getLength() + " bytes").append("\n"); 
     190                vBuffer.append("FrameRate: ").append(getFrameRate() + " per second").append("\n"); 
     191                vBuffer.append("Number Of Frames: ").append(getNumberOfFrames()).append("\n"); 
     192                return vBuffer.toString(); 
     193        } 
    227194}