OSDN Git Service

make it faster2.
[rec10/rec10-git.git] / jTsSplitter / trunk / src / jtssplitter / Mpeg2TSPacket_String.java
@@ -2,6 +2,8 @@ package jtssplitter;
 
 import java.util.ArrayList;
 import java.util.zip.CRC32;
+import jtssplitter.data.PATData;
+import jtssplitter.data.PMTData;
 /*
  * To change this template, choose Tools | Templates
  * and open the template in the editor.
@@ -11,7 +13,7 @@ import java.util.zip.CRC32;
  *
  * @author Administrator
  */
-public class Mpeg2TSPacket {
+public class Mpeg2TSPacket_String {
 
     public String header;
     public String payload;
@@ -33,9 +35,9 @@ public class Mpeg2TSPacket {
     private int random_access;//1bit ランダムアクセスの開始場所となる
     private int ES_priority;//1bit プライオリティ
     private int five_flag;//5bit
-    private ArrayList pat_list_now = new ArrayList();//[0]:番組番号 [1]:PMT PID
-    private ArrayList pat_list_all = new ArrayList();
-    private ArrayList pmt_list = new ArrayList();//[0]番組番号 [1]テーブルID
+    private ArrayList<PATData> pat_list_now = new ArrayList<PATData>();//[0]:番組番号 [1]:PMT PID
+    private ArrayList<PATData> pat_list_all = new ArrayList<PATData>();
+    private ArrayList<PMTData> pmt_list = new ArrayList<PMTData>();//[0]番組番号 [1]テーブルID
     private int pointer_field;//8bit adaptation fieldの次?
     private String payload_s;
     //ここからオプションフィールド
@@ -43,9 +45,16 @@ public class Mpeg2TSPacket {
     //ここまでオプションフィールド
     private int staffing_byte;//
 
-    public Mpeg2TSPacket() {
+    public Mpeg2TSPacket_String() {
+    }
+    public int getPIDFirst(byte[] ts){
+        byte[] b=new byte[2];
+        b[0]=ts[1];
+        b[1]=ts[2];
+        //String s=byte2String(b);
+        //s=s.substring(3,16);
+        return Integer.parseInt(byte2String(b).substring(3,16),2);
     }
-
     public void readTS(byte[] ts) {
         /**
          * 188バイトのtsから読み出したbyteを与える
@@ -77,23 +86,18 @@ public class Mpeg2TSPacket {
             }
         }
         if (PID == 0) {
-            //System.out.print("Pointer field ? : "+pointer_field+"\n");
-            pat_list_now = readPAT(payload);
+            pat_list_now =readPAT(payload);
             pat_list_all.addAll(pat_list_now);
-            //System.out.print("ここから変更済み\n");
-            //readPAT(changePAT(payload));
         }
         for (int i = 0; i < pat_list_now.size(); i++) {
-            int[] pid_temp = (int[]) pat_list_now.get(i);
-            if ((PID == pid_temp[1]) && (PID != 0)) {
-                //System.out.println("PMT PID : 0x"+Integer.toHexString(PID));
-                pmt_list.addAll(readPMT(payload, pid_temp[0]));
+            if ((PID == pat_list_now.get(i).PID) && (PID != 0)) {
+                pmt_list.addAll(readPMT(payload, pat_list_now.get(i).Program_TABLE));
             }
         }
         tsbyte = "";
     }
 
-    private ArrayList readPAT(String payload_temp) {
+    private ArrayList<PATData> readPAT(String payload_temp) {
         /*
          * payloadの文字列を入力して[intテーブル,int PID]のArrayListを返す。
          */
@@ -102,7 +106,6 @@ public class Mpeg2TSPacket {
         ArrayList program_number = new ArrayList();
         tableid = TSString2Int(payload_temp, 0, 8);
         sectionlength = TSString2Int(payload_temp, 12, 12);//-40-32;
-        //int patnum=sectionlength*8-32;
         int patnum = sectionlength * 8 - 72;
         patnum = patnum / 32;
         byte[] test = Stream2Byte(payload_temp);
@@ -119,23 +122,17 @@ public class Mpeg2TSPacket {
         }
         payload_temp = stest;
         int nowbit = 64;
-        //System.out.print(Integer.toString(patnum)+"\n");
         for (int i = 0; i < patnum; i++) {
-            //System.out.print(payload_temp.substring(64+32*i,95+32*i+1)+"\n");
-            int[] pat = new int[2];
-            pat[0] = TSString2Int(payload_temp, 64 + 32 * i, 16);
-            pat[1] = TSString2Int(payload_temp, 32 * i + 64 + 19, 13);
-            //System.out.print("TABLE : "+Integer.toString(pat[0])+"\n");
-            //System.out.print("PMT PID : "+Integer.toString(pat[1])+"\n");
-            program_number.add(pat);
+            PATData patd=new PATData();
+            patd.Program_TABLE=TSString2Int(payload_temp, 64 + 32 * i, 16);
+            patd.PID=TSString2Int(payload_temp, 32 * i + 64 + 19, 13);
+            program_number.add(patd);
         }
-        //System.out.print("TABLEID : "+Integer.toString(tableid)+" LENGTH = "+Integer.toString(sectionlength)+"\n");
-        //System.out.print(Integer.toBinaryString(TSString2Int(payload_temp,65,32))+"\n");
         return program_number;
     }
 
-    private ArrayList readPMT(String payload_temp, int PAT_TABLE) {
-        ArrayList pmt_t = new ArrayList();
+    private ArrayList<PMTData> readPMT(String payload_temp, int PAT_TABLE) {
+        ArrayList<PMTData> pmt_t = new ArrayList<PMTData>();
         int tableid = TSString2Int(payload_temp, 0, 8);
         int section_length = TSString2Int(payload_temp, 12, 12);
         int program_info_length = TSString2Int(payload_temp, 84, 12);
@@ -145,12 +142,11 @@ public class Mpeg2TSPacket {
             int pmt_stream_type = TSString2Int(payload_temp, cur_point, 8);
             int elementary_PID = TSString2Int(payload_temp, cur_point + 11, 13);
             int es_length = TSString2Int(payload_temp, cur_point + 28, 12);
-            int[] pmt = new int[3];
-            pmt[0] = pmt_stream_type;
-            pmt[1] = elementary_PID;
-            pmt[2] = PAT_TABLE;
-            pmt_t.add(pmt);
-            System.out.print("Table : 0x" + Integer.toHexString(tableid) + " | Stream_type : 0x" + Integer.toHexString(pmt_stream_type) + " |elementary PID : 0x" + Integer.toHexString(elementary_PID) + "\n");
+            PMTData pmtd=new PMTData();
+            pmtd.Stream_Type=pmt_stream_type;
+            pmtd.Program_Table=PAT_TABLE;
+            pmtd.Elementary_PID=elementary_PID;
+            pmt_t.add(pmtd);
             cur_point = cur_point + 40 + es_length * 8;
             if (cur_point > section_length * 8) {
                 end = true;
@@ -160,7 +156,6 @@ public class Mpeg2TSPacket {
     }
 
     private int TSString2Int(String s, int begin, int length) {
-        //System.out.print(Integer.toString(begin)+"//"+Integer.toString(length)+"\n");
         String st = s.substring(begin, begin + length);
         int i = Integer.parseInt(st, 2);
         return i;
@@ -171,20 +166,7 @@ public class Mpeg2TSPacket {
          * 
          * p_tableで指定された番組テーブルのみを取り出すPATを作る。
          */
-        /*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;
-        }*/
         String tsbyte = byte2String(ts);
-        //System.out.println("Base");
-        //(tsbyte);
         String tsheader = "";
         header = tsbyte.substring(0, 31);
         payload = tsbyte.substring(32);
@@ -211,14 +193,9 @@ public class Mpeg2TSPacket {
             }
         }
         if (PID == 0) {
-            //System.out.print("Pointer field ? : "+pointer_field+"\n");
             payload = makePAT(tsheader,payload, p_table);
-            //System.out.print("ここから変更済み\n");
-            //readPAT(changePAT(payload));
         }
         String rets = tsheader + payload;
-        //System.out.println("New");
-        //showPAT(rets);
         return Stream2Byte(rets);
     }
 
@@ -232,7 +209,6 @@ public class Mpeg2TSPacket {
         String rets = "";//="00000000";//pointer field
         rets = rets + payload_temp.substring(0, 12);//セクション長の前まで
         int new_section_length = (2 * 32 + 32 + 40) / 8;
-        //int new_section_length = (5 * 32 + 32 + 40) / 8;
 
         rets = rets + Int2String(new_section_length, 12);
         rets = rets + payload_temp.substring(24, 64);//ループ前まで
@@ -240,7 +216,6 @@ public class Mpeg2TSPacket {
         patnum = patnum / 32;
         String crcnow = payload_temp.substring(64 + 32 * patnum, 64 + 32 * patnum + 32);
         for (int i = 0; i < patnum; i++) {
-            //System.out.print(payload_temp.substring(64+32*i,95+32*i+1)+"\n");
             int[] pat = new int[2];
             pat[0] = TSString2Int(payload_temp, 64 + 32 * i, 16);
             pat[1] = TSString2Int(payload_temp, 32 * i + 64 + 19, 13);
@@ -252,54 +227,14 @@ public class Mpeg2TSPacket {
             }
         }
         rets = rets + loop;
-        //rets=rets+payload_temp.substring(64,64+32*patnum);
-        //rets=payload_temp.substring(0,64+(32*patnum));
-        //CRC32 crc = new CRC32();
         String s2=tsheader.substring(tsheader.length()-8);
         s2=s2+rets;
-        //byte[] sb = Stream2Byte(s2);
-        //crc.reset();
-        //crc.update(sb);
         String s = getCRC32(s2);
         rets = rets + s;
-
-        ////////////////////
-        
-        //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");
-        //sb = Stream2Byte(tsheader + (payload_temp.substring(0, 64 + (32 * patnum))));
-        /*
-        crc.reset();
-        crc.update(sb);
-        long crcl = crc.getValue();
-
-        System.out.print("Now     :" + Long2String(crc.getValue(), 32) + "\n");
-        //System.out.print("New3:"+s+"\n");
-        //
-        //
-
-        String sss = tsheader + payload_temp;
-        //System.out.print("Data:\n"+sss);
-        for (int ib = 0; ib < sss.length() - 1; ib++) {
-            for (int ie = ib + 1; ie < sss.length(); ie++) {
-                if (testCRC(sss, crcnow, ib, ie)) {
-                    ib = sss.length();
-                    ie = sss.length();
-
-                }
-                //System.out.println(Integer.toString(ib)+":"+Integer.toString(ie));
-            }
-        }
-
-        */
-        ////
         int ill3 = payload_temp.length() - rets.length();
         for (int ir = 0; ir < ill3; ir++) {
             rets = rets + "1";
         }
-        //showPAT(tsheader+rets);
         return rets;
     }
     private String getCRC32(String s){
@@ -356,51 +291,16 @@ public class Mpeg2TSPacket {
     }
     private String byte2String(byte[] b) {
         StringBuffer sb=new StringBuffer(8*b.length);
-        //String ret = "";
         for (int i = 0; i < b.length; i++) {
             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++) {
-                    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()));
             }
             String s3=sb2.toString();
-        //    ret = ret + s ;
             sb.append(sb2);
         }
-        //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) {