OSDN Git Service

make it faster2.
authorgn64_jp <gn64_jp@4e526526-5e11-4fc0-8910-f8fd03428081>
Wed, 28 Oct 2009 09:02:26 +0000 (09:02 +0000)
committergn64_jp <gn64_jp@4e526526-5e11-4fc0-8910-f8fd03428081>
Wed, 28 Oct 2009 09:02:26 +0000 (09:02 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/rec10@190 4e526526-5e11-4fc0-8910-f8fd03428081

jTsSplitter/trunk/src/jtssplitter/Main.java
jTsSplitter/trunk/src/jtssplitter/Mpeg2TSPacket_String.java [moved from jTsSplitter/trunk/src/jtssplitter/Mpeg2TSPacket.java with 73% similarity]
jTsSplitter/trunk/src/jtssplitter/Tsfile_String.java [moved from jTsSplitter/trunk/src/jtssplitter/Tsfile.java with 57% similarity]

index c37ebab..4c27c67 100644 (file)
@@ -26,7 +26,7 @@ public class Main {
                 ch=Integer.parseInt(args[2].trim(),10);
             }
         }
-        Tsfile t1=new Tsfile();
+        Tsfile_String t1=new Tsfile_String();
         //t1.readTs("D:\\jTssplitter\\test-sp.ts");
         inf="/home/ftpusr/ftp-tmp/tester/testcs30.tsmix";
         outf="/home/ftpusr/ftp-tmp/tester/test.tssp.ts";
@@ -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) {
@@ -8,17 +8,19 @@ import java.util.ArrayList;
 import java.io.*;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import jtssplitter.data.PATData;
+import jtssplitter.data.PIDs;
+import jtssplitter.data.PMTData;
 /**
  *
  * @author Administrator
  */
-public class Tsfile {
-    private ArrayList tsstream=new ArrayList();
+public class Tsfile_String {
     public void readTs(String fpath){
         byte[] tb=new byte[188];
         int[] ib=new int[188];
-        ArrayList pat=new ArrayList();
-        ArrayList pmt=new ArrayList();
+        ArrayList<PATData> pat=new ArrayList<PATData>();
+        ArrayList<PMTData> pmt=new ArrayList<PMTData>();
         String[] sb=new String[188];
         try {
             FileInputStream in = new FileInputStream(fpath);
@@ -26,8 +28,8 @@ public class Tsfile {
             for (int i=0;i<3000;i++){
                 in.read(tb);
                 String last8;
-                Mpeg2TSPacket m2tp;
-                m2tp=new Mpeg2TSPacket();
+                Mpeg2TSPacket_String m2tp;
+                m2tp=new Mpeg2TSPacket_String();
                 m2tp.setPAT(pat);
                 m2tp.setPMT(pmt);
                 m2tp.readTS(tb);
@@ -37,9 +39,7 @@ public class Tsfile {
             }
             for (int i=0;i<8200;i++){
                 if (PIDCount[i]>0){
-                    //System.out.print(Integer.toString(i)+" : "+Integer.toString(PIDCount[i])+"\n");
                 }
-                //System.out.print(PIDCount[i]);
             }
             for (int i=0;i<188;i++){
                 int it=tb[i]& 0xFF;
@@ -50,15 +50,10 @@ public class Tsfile {
                         s="0"+s;
                     }
                 sb[i]=s;
-                //System.out.print(s+"\n");
                 }
-            
-                //s=s+"0"*(8-s.length());
             }
-            //System.out.print(Integer.toHexString(ib[0])+"\n");
-            //System.out.print(s+"\n");
         } catch (IOException ex) {
-            Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+            Logger.getLogger(Tsfile_String.class.getName()).log(Level.SEVERE, null, ex);
         }
 
     }
@@ -70,47 +65,59 @@ public class Tsfile {
         }else{
             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];
-        }
+        PIDs pidss=getTablePID(origpath,p_table);
+        p_table=pidss.Program_Table;
+        pids=pidss.PIDs;
         byte[] tb=new byte[188];
-        int[] ib=new int[188];
-        ArrayList pat=new ArrayList();
-        ArrayList pmt=new ArrayList();
-        String[] sb=new String[188];
         try {
             FileInputStream in = new FileInputStream(origpath);
             FileOutputStream fos=new FileOutputStream(destpath,true);
-            //int[] PIDCount=new int[8200];
+            BufferedInputStream bis=new BufferedInputStream(in);
+            BufferedOutputStream bos=new BufferedOutputStream(fos);
             byte[] wbyte=null;
-            for (int i=0;in.read(tb)!=-1;i++){
+            boolean end=false;
+            int ik=0;
+            boolean readend=false;
+            while (readend==false){
+                byte[] tstt=new byte[3];
+                bis.mark(188*2);
+                bis.reset();
                 wbyte=null;
-                Mpeg2TSPacket m2tp;
-                m2tp=new Mpeg2TSPacket();
-                m2tp.readTS(tb);
-                for (int j=0;j<pids.length;j++){
-                    if (m2tp.getPID()==pids[j]){
-                        if (m2tp.getPID()==0){
-                            Mpeg2TSPacket m2tp2=new Mpeg2TSPacket();
-                            //m2tp2.readTS(tb);
+                Mpeg2TSPacket_String m2tp;
+                m2tp=new Mpeg2TSPacket_String();
+                int ii=m2tp.getPIDFirst(tstt);
+                boolean alreadyreaded=false;
+                for (int k=0;k<pids.length;k++){
+                    if (ii==pids[k]){
+                        alreadyreaded=true;
+                        int readti=bis.read(tb);
+                        if ((ii==0)&&(readti>187)){
+                            Mpeg2TSPacket_String m2tp2=new Mpeg2TSPacket_String();
                             wbyte=m2tp2.splitPAT(tb,p_table);
-                            //wbyte=tb;
-                        }else{
+                        }else if (readti>187){
                             wbyte=tb;
                         }
+                        k=pids.length;
                     }
-                }
+                ik++;
+            }
+            if (alreadyreaded==false){
+                bis.skip(188);
+            }
+            if (bis.available()<188){
+                readend=true;
+            }
                 if (wbyte!=null){
-                    fos.write(wbyte);
+                    bos.write(wbyte);
                 }
             }
+            bis.close();
+            bos.close();
             in.close();
             fos.close();
+
         } catch (IOException ex) {
-            Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+            Logger.getLogger(Tsfile_String.class.getName()).log(Level.SEVERE, null, ex);
         }
     }
     private void writeTS(byte[] tspacket,String path){
@@ -120,28 +127,29 @@ public class Tsfile {
             fos.write(tspacket);
             fos.close();
         } catch (IOException ex) {
-            Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+            Logger.getLogger(Tsfile_String.class.getName()).log(Level.SEVERE, null, ex);
         } finally {
             try {
                 fos.close();
             } catch (IOException ex) {
-                Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+                Logger.getLogger(Tsfile_String.class.getName()).log(Level.SEVERE, null, ex);
             }
         }
     }
-    private int[] getTablePID(String fpath,int p_table){
+    private PIDs getTablePID(String fpath,int p_table){
         /**
          * PIDを取得し、これと思われる必要なPIDを抜き出す。
          * @return プログラム番号(return[0])とPIDのリスト(return[1-])
          */
         FileInputStream in = null;
+        PIDs pids=new PIDs();
         int[] reti=null;
         try {
-            ArrayList ret=new ArrayList();
+            ArrayList<Integer> ret=new ArrayList<Integer>();
             byte[] tb = new byte[188];
             int[] ib = new int[188];
-            ArrayList pat = new ArrayList();
-            ArrayList pmt = new ArrayList();
+            ArrayList<PATData> pat = new ArrayList<PATData>();
+            ArrayList<PMTData> pmt = new ArrayList<PMTData>();
             String[] sb = new String[188];
             in = new FileInputStream(fpath);
             //int[] PIDCount = new int[8200];
@@ -149,21 +157,21 @@ public class Tsfile {
             for (int i = 0; i < imax ; i++) {
                 in.read(tb);
                 String last8;
-                Mpeg2TSPacket m2tp;
-                m2tp = new Mpeg2TSPacket();
+                Mpeg2TSPacket_String m2tp;
+                m2tp = new Mpeg2TSPacket_String();
                 m2tp.setPAT(pat);
                 m2tp.setPMT(pmt);
                 m2tp.readTS(tb);
                 pat = m2tp.getPAT();
                 for (int i2=0;i2<pat.size();i2++){
-                    int[] il2=(int [])pat.get(i2);
-                    if (il2[0]==p_table){
+                    PATData patdd=pat.get(i2);
+                    if (pat.get(i2).Program_TABLE==p_table){
                         pat.clear();
-                        pat.add(il2);
+                        pat.add(patdd);
                         m2tp.setPAT(pat);
                     }
                 }
-                ArrayList pmtt=m2tp.getPMT();
+                ArrayList<PMTData> pmtt=m2tp.getPMT();
                 for (int i2=0;i2<pmtt.size();i2++){
                     if (!(pmt.contains(pmtt.get(i2)))){
                         pmt.add(pmtt.get(i2));
@@ -173,11 +181,10 @@ public class Tsfile {
                     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]);
+                    if (p_table==pmt.get(i2).Program_Table){
+                        if (!(ret.contains(pmt.get(i2).Elementary_PID))){
+                            ret.add(pmt.get(i2).Elementary_PID);
                             i=imax;
                         }
                     }
@@ -186,42 +193,38 @@ public class Tsfile {
                     }
                 }
             }
-            int[] pat_det=new int[2];
+            PATData patd_det=new PATData();
             for (int i=0;i<pat.size();i++){
-                int[] ii2=(int[])pat.get(i);
-                if (ii2[0]==p_table){
-                    pat_det[0]=ii2[0];
-                    pat_det[1]=ii2[1];
+                if (pat.get(i).Program_TABLE==p_table){
+                    patd_det=pat.get(i);
                     i=pat.size();
                 }
             }
             ret.add(0);
-            ret.add(pat_det[1]);
+            ret.add(patd_det.PID);
             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]);
+                if (patd_det.Program_TABLE==pmt.get(i).Program_Table){
+                    if (!(ret.contains(pmt.get(i).Elementary_PID))){
+                        ret.add(pmt.get(i).Elementary_PID);
                     }
                 }
             }
-            reti=new int[ret.size()+1];
-            reti[0]=pat_det[0];
+            pids.Program_Table=patd_det.Program_TABLE;
+            pids.PIDs=new int[ret.size()];
             for (int i=0;i<ret.size();i++){
-                int retit=(Integer)ret.get(i);
-                reti[i+1]=retit;
+                pids.PIDs[i]=ret.get(i);
             }
             in.close();
         } catch (IOException ex) {
-            Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+            Logger.getLogger(Tsfile_String.class.getName()).log(Level.SEVERE, null, ex);
         } finally {
             try {
                 in.close();
             } catch (IOException ex) {
-                Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+                Logger.getLogger(Tsfile_String.class.getName()).log(Level.SEVERE, null, ex);
             }
         }
-        return reti;
+        return pids;
     }
     private int getFirstP_Table(String fpath){
         /**
@@ -231,13 +234,15 @@ public class Tsfile {
         FileInputStream in = null;
         int[] reti=null;
         int[] pat_det=new int[2];
-        pat_det[0]=0;
+        //pat_det[0]=0;
+        PATData patdd=new PATData();
+        patdd.PID=0;
         try {
             ArrayList ret=new ArrayList();
             byte[] tb = new byte[188];
             int[] ib = new int[188];
-            ArrayList pat = new ArrayList();
-            ArrayList pmt = new ArrayList();
+            ArrayList<PATData> pat = new ArrayList<PATData>();
+            ArrayList<PMTData> pmt = new ArrayList<PMTData>();
             String[] sb = new String[188];
             in = new FileInputStream(fpath);
             //int[] PIDCount = new int[8200];
@@ -245,55 +250,33 @@ public class Tsfile {
             for (int i = 0; i < imax ; i++) {
                 in.read(tb);
                 String last8;
-                Mpeg2TSPacket m2tp;
-                m2tp = new Mpeg2TSPacket();
+                Mpeg2TSPacket_String m2tp;
+                m2tp = new Mpeg2TSPacket_String();
                 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];
+                if (pat.get(i).Program_TABLE>0){
+                    patdd=pat.get(i);
                     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);
+            Logger.getLogger(Tsfile_String.class.getName()).log(Level.SEVERE, null, ex);
         } finally {
             try {
                 in.close();
             } catch (IOException ex) {
-                Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+                Logger.getLogger(Tsfile_String.class.getName()).log(Level.SEVERE, null, ex);
             }
         }
-        return pat_det[0];
+        return patdd.Program_TABLE;
     }
 }
\ No newline at end of file