OSDN Git Service

make it faster.
authorgn64_jp <gn64_jp@4e526526-5e11-4fc0-8910-f8fd03428081>
Tue, 27 Oct 2009 12:35:56 +0000 (12:35 +0000)
committergn64_jp <gn64_jp@4e526526-5e11-4fc0-8910-f8fd03428081>
Tue, 27 Oct 2009 12:35:56 +0000 (12:35 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/rec10@188 4e526526-5e11-4fc0-8910-f8fd03428081

jTsSplitter/trunk/src/jtssplitter/Main.java
jTsSplitter/trunk/src/jtssplitter/Mpeg2TSPacket.java
jTsSplitter/trunk/src/jtssplitter/Tsfile.java

index 618462c..16b450d 100644 (file)
@@ -14,11 +14,23 @@ public class Main {
     /**
      * @param args the command line arguments
      */
+    public static boolean debug_mode=false;
     public static void main(String[] args) {
         // TODO code application logic here
+        String inf,outf;
+        int ch=0;
+        if (args.length>1){
+            inf=args[0];
+            outf=args[1];
+            if (args.length>2){
+                ch=Integer.parseInt(args[2].trim(),10);
+            }
+        }
         Tsfile t1=new Tsfile();
         //t1.readTs("D:\\jTssplitter\\test-sp.ts");
-        t1.splitTS("D:\\jTssplitter\\test.ts", "D:\\jTssplitter\\test-sp.ts",0);
+        inf="D:\\jTssplitter\\test.ts";
+        outf="D:\\jTssplitter\\test-sp-profile.ts";
+        t1.splitTS(inf,outf,0);
     }
 
 }
index f4936fc..b7efe1e 100644 (file)
@@ -50,26 +50,16 @@ public class Mpeg2TSPacket {
         /**
          * 188バイトのtsから読み出したbyteを与える
          */
-        String tsbyte = new String();
-        for (int i = 0; i < 188; i++) {
-            int it = ts[i] & 0xFF;
-            String s = Integer.toBinaryString(it);
-            if ((s.length() < 8) & (s.length() > 0)) {
-                for (int i2 = s.length(); i2 < 8; i2++) {
-                    s = "0" + s;
-                }
-            }
-            tsbyte = tsbyte + s;
-        }
-        header = tsbyte.substring(0, 31);
+        String tsbyte = byte2String(ts);
+        //header = tsbyte.substring(0, 31);
         payload = tsbyte.substring(32);
-        starter = TSString2Int(tsbyte, 0, 8);
-        transporterror = TSString2Int(tsbyte, 8, 1);
-        payloadstart = TSString2Int(tsbyte, 9, 1);
-        transport_priority = TSString2Int(tsbyte, 10, 1);
+        //starter = TSString2Int(tsbyte, 0, 8);
+        //transporterror = TSString2Int(tsbyte, 8, 1);
+        //payloadstart = TSString2Int(tsbyte, 9, 1);
+        //transport_priority = TSString2Int(tsbyte, 10, 1);
         PID = TSString2Int(tsbyte, 11, 13);
         adaptation_field = TSString2Int(tsbyte, 26, 2);
-        continuity_counter = TSString2Int(tsbyte, 28, 4);
+        //continuity_counter = TSString2Int(tsbyte, 28, 4);
         payload = "";
         if (PID != 8191) {
             if (adaptation_field == 1) {
@@ -276,9 +266,9 @@ public class Mpeg2TSPacket {
         ////////////////////
         
         //rets=header+payload_temp.substring(0,64+(32*patnum));
-        String st=header.substring(header.length()-8)+payload_temp.substring(0,64+(32*patnum));
-        System.out.print("Collect0:" + crcnow + "\n");
-        System.out.print("Now0:" + getCRC32(st)+ "\n");
+        //String st=header.substring(header.length()-8)+payload_temp.substring(0,64+(32*patnum));
+        //System.out.print("Collect0:" + crcnow + "\n");
+        //System.out.print("Now0:" + getCRC32(st)+ "\n");
         //sb = Stream2Byte(tsheader + (payload_temp.substring(0, 64 + (32 * patnum))));
         /*
         crc.reset();
@@ -309,7 +299,7 @@ public class Mpeg2TSPacket {
         for (int ir = 0; ir < ill3; ir++) {
             rets = rets + "1";
         }
-        showPAT(tsheader+rets);
+        //showPAT(tsheader+rets);
         return rets;
     }
     private String getCRC32(String s){
@@ -357,20 +347,60 @@ public class Mpeg2TSPacket {
         return s;
     }
 
-
+    private String addzero(int num){
+        StringBuffer s2=new StringBuffer();
+        for (int i2 = 0; i2 < num; i2++) {
+            s2.append("0");// = "0" + s2;
+        }
+        return s2.toString();
+    }
     private String byte2String(byte[] b) {
-        String ret = "";
+        StringBuffer sb=new StringBuffer(8*b.length);
+        //String ret = "";
         for (int i = 0; i < b.length; i++) {
-            int it = b[i] & 0xFF;
-            String s = Integer.toBinaryString(it);
-            if ((s.length() < 8) & (s.length() > 0)) {
+            StringBuffer sb2=new StringBuffer(8);
+            //String s = Integer.toBinaryString(b[i] & 0xFF);
+            sb2.append(Integer.toBinaryString(b[i] & 0xFF));
+            //if ((s.length() < 8) & (s.length() > 0)) {
+                /*String s2="";
                 for (int i2 = s.length(); i2 < 8; i2++) {
-                    s = "0" + s;
+                    s2 = "0" + s2;
                 }
+                s=s2+s;
+                 */
+                //s=addzero(8-s.length())+s;
+                //sb2.append(addzero(8-s.length()));
+            //}
+            if ((sb2.length() < 8) & (sb2.length() > 0)) {
+                sb2.insert(0,addzero(8-sb2.length()));
             }
-            ret = ret + s;
+            String s3=sb2.toString();
+        //    ret = ret + s ;
+            sb.append(sb2);
         }
-        return ret;
+        //if (!ret.matches(sb.toString())){
+        //    System.out.println("MisMatch");
+        //}
+        //return ret;
+        return sb.toString();
+        /*
+         *
+         *StringBuffer sb= new StringBuffer();
+        int cnt= b.length;
+        for(int i= 0; i< cnt; i++){
+            sb.append(Integer.toHexString( (b[i]>> 4) & 0x0F ) );
+            sb.append(Integer.toHexString( b[i] & 0x0F ) );
+        }
+        return sb.toString();
+         *
+         *
+         *
+         */
+         //StringBuffer sb=new StringBuffer();
+         //int cnt=b.length;
+         //for (int i=0;i<cnt;i++){
+         //    sb.append(Integer.toBinaryString(b[i] & 0xFF))
+         //}
     }
 
     private String byte2HexString(byte[] b) {
index a4476b5..939ac47 100644 (file)
@@ -66,14 +66,15 @@ public class Tsfile {
         int[] pids=null;
         int p_table=0;
         if (csch>0){
-
+            p_table=csch;
         }else{
-            int[] pidst=getPID(origpath);
-            p_table=pidst[0];
-            pids=new int[pidst.length-1];
-            for (int i=0;i<pidst.length-1;i++){
-                pids[i]=pidst[i+1];
-            }
+            p_table=getFirstP_Table(origpath);
+        }
+        int[] pidst=getTablePID(origpath,p_table);
+        p_table=pidst[0];
+        pids=new int[pidst.length-1];
+        for (int i=0;i<pidst.length-1;i++){
+            pids[i]=pidst[i+1];
         }
         byte[] tb=new byte[188];
         int[] ib=new int[188];
@@ -82,6 +83,7 @@ public class Tsfile {
         String[] sb=new String[188];
         try {
             FileInputStream in = new FileInputStream(origpath);
+            FileOutputStream fos=new FileOutputStream(destpath,true);
             //int[] PIDCount=new int[8200];
             byte[] wbyte=null;
             for (int i=0;in.read(tb)!=-1;i++){
@@ -102,13 +104,11 @@ public class Tsfile {
                     }
                 }
                 if (wbyte!=null){
-                    FileOutputStream fos=new FileOutputStream(destpath,true);
                     fos.write(wbyte);
-                    fos.close();
                 }
             }
             in.close();
-            
+            fos.close();
         } catch (IOException ex) {
             Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
         }
@@ -129,7 +129,7 @@ public class Tsfile {
             }
         }
     }
-    private int[] getPID(String fpath){
+    private int[] getTablePID(String fpath,int p_table){
         /**
          * PIDを取得し、これと思われる必要なPIDを抜き出す。
          * @return プログラム番号(return[0])とPIDのリスト(return[1-])
@@ -155,17 +155,41 @@ public class Tsfile {
                 m2tp.setPMT(pmt);
                 m2tp.readTS(tb);
                 pat = m2tp.getPAT();
-                pmt = m2tp.getPMT();
-                //PIDCount[m2tp.getPID()]++;
+                for (int i2=0;i2<pat.size();i2++){
+                    int[] il2=(int [])pat.get(i2);
+                    if (il2[0]==p_table){
+                        pat.clear();
+                        pat.add(il2);
+                        m2tp.setPAT(pat);
+                    }
+                }
+                ArrayList pmtt=m2tp.getPMT();
+                for (int i2=0;i2<pmtt.size();i2++){
+                    if (!(pmt.contains(pmtt.get(i2)))){
+                        pmt.add(pmtt.get(i2));
+                    }
+                }
                 if ((i==imax-1)&&(pmt.size()==0)){
                     imax=imax+500;
                 }
+                for (int i2=0;i2<pmt.size();i2++){
+                    int[] il2=(int[])pmt.get(i2);
+                    int itt=ret.size();
+                    if (p_table==il2[2]){
+                        if (!(ret.contains(il2[1]))){
+                            ret.add(il2[1]);
+                            i=imax;
+                        }
+                    }
+                    if (ret.size()==itt){
+                        imax=imax+100;
+                    }
+                }
             }
-            
             int[] pat_det=new int[2];
             for (int i=0;i<pat.size();i++){
                 int[] ii2=(int[])pat.get(i);
-                if (ii2[0]>0){
+                if (ii2[0]==p_table){
                     pat_det[0]=ii2[0];
                     pat_det[1]=ii2[1];
                     i=pat.size();
@@ -199,4 +223,77 @@ public class Tsfile {
         }
         return reti;
     }
+    private int getFirstP_Table(String fpath){
+        /**
+         * PIDを取得し、これと思われる必要なPIDを抜き出す。
+         * @return プログラム番号(return[0])とPIDのリスト(return[1-])
+         */
+        FileInputStream in = null;
+        int[] reti=null;
+        int[] pat_det=new int[2];
+        pat_det[0]=0;
+        try {
+            ArrayList ret=new ArrayList();
+            byte[] tb = new byte[188];
+            int[] ib = new int[188];
+            ArrayList pat = new ArrayList();
+            ArrayList pmt = new ArrayList();
+            String[] sb = new String[188];
+            in = new FileInputStream(fpath);
+            //int[] PIDCount = new int[8200];
+            int imax=1000;
+            for (int i = 0; i < imax ; i++) {
+                in.read(tb);
+                String last8;
+                Mpeg2TSPacket m2tp;
+                m2tp = new Mpeg2TSPacket();
+                m2tp.setPAT(pat);
+                m2tp.setPMT(pmt);
+                m2tp.readTS(tb);
+                pat = m2tp.getPAT();
+                pmt = m2tp.getPMT();
+                //PIDCount[m2tp.getFirstP_Table()]++;
+                if ((i==imax-1)&&(pmt.size()==0)){
+                    imax=imax+500;
+                }
+            }
+            
+            for (int i=0;i<pat.size();i++){
+                int[] ii2=(int[])pat.get(i);
+                if (ii2[0]>0){
+                    pat_det[0]=ii2[0];
+                    pat_det[1]=ii2[1];
+                    i=pat.size();
+                }
+            }
+            
+            /*ret.add(0);
+            ret.add(pat_det[1]);
+            for (int i=0;i<pmt.size();i++){
+                int[] il2=(int[])pmt.get(i);
+                if (pat_det[0]==il2[2]){
+                    if (!(ret.contains(il2[1]))){
+                        ret.add(il2[1]);
+                    }
+                }
+            }
+            reti=new int[ret.size()+1];
+            reti[0]=pat_det[0];
+            for (int i=0;i<ret.size();i++){
+                int retit=(Integer)ret.get(i);
+                reti[i+1]=retit;
+            }
+            in.close();
+             */
+        } catch (IOException ex) {
+            Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+        } finally {
+            try {
+                in.close();
+            } catch (IOException ex) {
+                Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+            }
+        }
+        return pat_det[0];
+    }
 }
\ No newline at end of file