OSDN Git Service

Ts Split Software Alpha(Fist PAT split implemented).
authorgn64_jp <gn64_jp@4e526526-5e11-4fc0-8910-f8fd03428081>
Mon, 26 Oct 2009 07:14:05 +0000 (07:14 +0000)
committergn64_jp <gn64_jp@4e526526-5e11-4fc0-8910-f8fd03428081>
Mon, 26 Oct 2009 07:14:05 +0000 (07:14 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/rec10@187 4e526526-5e11-4fc0-8910-f8fd03428081

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

index 3231323..618462c 100644 (file)
@@ -17,7 +17,7 @@ public class Main {
     public static void main(String[] args) {
         // TODO code application logic here
         Tsfile t1=new Tsfile();
-        //t1.readTs("D:\\jTssplitter\\test.ts.b25");
+        //t1.readTs("D:\\jTssplitter\\test-sp.ts");
         t1.splitTS("D:\\jTssplitter\\test.ts", "D:\\jTssplitter\\test-sp.ts",0);
     }
 
index 0da8fb2..f4936fc 100644 (file)
@@ -1,4 +1,5 @@
 package jtssplitter;
+
 import java.util.ArrayList;
 import java.util.zip.CRC32;
 /*
@@ -11,18 +12,18 @@ import java.util.zip.CRC32;
  * @author Administrator
  */
 public class Mpeg2TSPacket {
+
     public String header;
     public String payload;
     public String adaptation;
     //private ArrayList<TsDate> date=new ArrayList<TsDate>();
     //date.add(new TsDate("Starter"))
     public int type;//
-
     private int starter;//0-7
     private int transporterror;//本TSパケットの誤りを示す 1bit 8
     private int payloadstart;//セクションの先頭バイトが入っているかどうか1bit 9
     private int transport_priority;//1bit 10
-    private int PID;//tsパケットの種類 13bit 11-23
+    private int PID = -1;//tsパケットの種類 13bit 11-23
     private int transport_scrambled;//2bit 00is " not scrambled" 24-25
     private int adaptation_field;//2bit 26-27 01:adaptation fieldなしでおk 10は絶対いる 11はペイロードはアダプテーションに続く00は予約
     private int continuity_counter;//連続性(PIDごとの通し番号) 4bit 28-31
@@ -32,106 +33,108 @@ 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 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 int pointer_field;//8bit adaptation fieldの次?
-
     private String payload_s;
     //ここからオプションフィールド
     //PCR42 OPCR42 
     //ここまでオプションフィールド
     private int staffing_byte;//
-    public Mpeg2TSPacket(){
+
+    public Mpeg2TSPacket() {
     }
-    public void readTS(byte[] ts){
+
+    public void readTS(byte[] ts) {
         /**
          * 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;
-                    }
+        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;
+            tsbyte = tsbyte + s;
         }
-        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);
-        PID=TSString2Int(tsbyte,11,13);
-        adaptation_field=TSString2Int(tsbyte, 26, 2);
-        continuity_counter=TSString2Int(tsbyte, 28, 4);
-        payload="";
-        if (PID!=8191){
-            if (adaptation_field==1){
-                pointer_field=TSString2Int(tsbyte, 32, 8);
-                payload=tsbyte.substring(40);
-            }else if (adaptation_field==3){
-                adaptation_length=TSString2Int(tsbyte,32,8);
-                if (adaptation_length<188){
-                    adaptation_length=adaptation_length*8;
+        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);
+        PID = TSString2Int(tsbyte, 11, 13);
+        adaptation_field = TSString2Int(tsbyte, 26, 2);
+        continuity_counter = TSString2Int(tsbyte, 28, 4);
+        payload = "";
+        if (PID != 8191) {
+            if (adaptation_field == 1) {
+                pointer_field = TSString2Int(tsbyte, 32, 8);
+                payload = tsbyte.substring(40);
+            } else if (adaptation_field == 3) {
+                adaptation_length = TSString2Int(tsbyte, 32, 8);
+                if (adaptation_length < 184) {
+                    adaptation_length = adaptation_length * 8;
                 }
-                adaptation=tsbyte.substring(32,40+adaptation_length);
-                pointer_field=TSString2Int(tsbyte, 40+adaptation_length, 8);
-                payload=tsbyte.substring(48+adaptation_length);
+                //System.out.println(adaptation_length);
+                adaptation = tsbyte.substring(32, 40 + adaptation_length);
+                pointer_field = TSString2Int(tsbyte, 40 + adaptation_length, 8);
+                payload = tsbyte.substring(48 + adaptation_length);
             }
         }
-        if (PID==0){
+        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)){
+        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]));
+                pmt_list.addAll(readPMT(payload, pid_temp[0]));
             }
         }
-        tsbyte="";
+        tsbyte = "";
     }
-    private ArrayList readPAT(String payload_temp){
+
+    private ArrayList readPAT(String payload_temp) {
         /*
          * payloadの文字列を入力して[intテーブル,int PID]のArrayListを返す。
          */
         int tableid;
         int sectionlength;
-        ArrayList program_number=new ArrayList();
-        tableid=TSString2Int(payload_temp,0,8);
-        sectionlength=TSString2Int(payload_temp,12,12);//-40-32;
+        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);
-        String stest="";
-        for (int ij=0;ij<test.length;ij++){
-            int it=test[ij]& 0xFF;
-            String s=Integer.toBinaryString(it);
-            if (s.length()<8){
-                for (int i2=s.length();i2<8;i2++){
-                    s="0"+s;
+        int patnum = sectionlength * 8 - 72;
+        patnum = patnum / 32;
+        byte[] test = Stream2Byte(payload_temp);
+        String stest = "";
+        for (int ij = 0; ij < test.length; ij++) {
+            int it = test[ij] & 0xFF;
+            String s = Integer.toBinaryString(it);
+            if (s.length() < 8) {
+                for (int i2 = s.length(); i2 < 8; i2++) {
+                    s = "0" + s;
                 }
             }
-            stest=stest+s;
+            stest = stest + s;
         }
-        payload_temp=stest;
-        int nowbit=64;
-            //System.out.print(Integer.toString(patnum)+"\n");
-        for (int i=0;i<patnum;i++){
+        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);
+            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);
@@ -140,165 +143,353 @@ public class Mpeg2TSPacket {
         //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();
-        int tableid=TSString2Int(payload_temp,0,8);
-        int section_length=TSString2Int(payload_temp,12,12);
-        int program_info_length=TSString2Int(payload_temp,84,12);
-        boolean end=false;
-        int cur_point=96+program_info_length*8;
-        while (end!=true){
-            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;
+
+    private ArrayList readPMT(String payload_temp, int PAT_TABLE) {
+        ArrayList pmt_t = new ArrayList();
+        int tableid = TSString2Int(payload_temp, 0, 8);
+        int section_length = TSString2Int(payload_temp, 12, 12);
+        int program_info_length = TSString2Int(payload_temp, 84, 12);
+        boolean end = false;
+        int cur_point = 96 + program_info_length * 8;
+        while (end != true) {
+            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");
-            cur_point=cur_point+40+es_length*8;
-            if (cur_point>section_length*8){
-                end=true;
+            System.out.print("Table : 0x" + Integer.toHexString(tableid) + " | Stream_type : 0x" + Integer.toHexString(pmt_stream_type) + " |elementary PID : 0x" + Integer.toHexString(elementary_PID) + "\n");
+            cur_point = cur_point + 40 + es_length * 8;
+            if (cur_point > section_length * 8) {
+                end = true;
             }
         }
         return pmt_t;
     }
-    private int TSString2Int(String s,int begin,int length){
+
+    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);
+        String st = s.substring(begin, begin + length);
+        int i = Integer.parseInt(st, 2);
         return i;
     }
-    public byte[] splitPAT(byte[] ts,int p_table){
+
+    public byte[] splitPAT(byte[] ts, int p_table) {
         /**
          * 
          * p_tableで指定された番組テーブルのみを取り出すPATを作る。
          */
-        String tsbyte=new String();
+        /*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;
+        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;
+        }
         }
-        String tsheader="";
-        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);
-        PID=TSString2Int(tsbyte,11,13);
-        adaptation_field=TSString2Int(tsbyte, 26, 2);
-        continuity_counter=TSString2Int(tsbyte, 28, 4);
-        payload="";
-        if (PID!=8191){
-            if (adaptation_field==1){
-                pointer_field=TSString2Int(tsbyte, 32, 8);
-                tsheader=tsbyte.substring(0,40);
-                payload=tsbyte.substring(40);
-            }else if (adaptation_field==3){
-                int al=TSString2Int(tsbyte,32,8);
-                if (al<188){
-                    al=al*8;
+        tsbyte=tsbyte+s;
+        }*/
+        String tsbyte = byte2String(ts);
+        //System.out.println("Base");
+        //(tsbyte);
+        String tsheader = "";
+        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);
+        PID = TSString2Int(tsbyte, 11, 13);
+        adaptation_field = TSString2Int(tsbyte, 26, 2);
+        continuity_counter = TSString2Int(tsbyte, 28, 4);
+        int adaptation_length_t = TSString2Int(tsbyte, 32, 8);
+        payload = "";
+        if (PID != 8191) {
+            if (adaptation_field == 1) {
+                pointer_field = TSString2Int(tsbyte, 32, 8);
+                tsheader = tsbyte.substring(0, 40);
+                payload = tsbyte.substring(40);
+            } else if (adaptation_field == 3) {
+                if (adaptation_length_t < 188) {
+                    adaptation_length_t = adaptation_length_t * 8;
                 }
-                tsheader=tsbyte.substring(0,40);
-                payload=tsbyte.substring(48+al);
+                tsheader = tsbyte.substring(0, 48 + adaptation_length_t);
+                payload = tsbyte.substring(48 + adaptation_length_t);
             }
         }
-        if (PID==0){
+        if (PID == 0) {
             //System.out.print("Pointer field ? : "+pointer_field+"\n");
-            payload=makePAT(payload, p_table);
+            payload = makePAT(tsheader,payload, p_table);
             //System.out.print("ここから変更済み\n");
             //readPAT(changePAT(payload));
         }
-        String rets = tsheader+payload;
+        String rets = tsheader + payload;
+        //System.out.println("New");
+        //showPAT(rets);
         return Stream2Byte(rets);
     }
-    private String makePAT(String payload_temp,int Table){
+
+    private String makePAT(String tsheader,String payload_temp, int Table) {
         int tableid;
         int sectionlength;
-        ArrayList program_number=new ArrayList();
-        tableid=TSString2Int(payload_temp,0,8);
-        sectionlength=TSString2Int(payload_temp,12,12);//-40-32;
-        int patnum=sectionlength*8-72;
-        String rets=payload_temp.substring(0,12);//セクション長の前まで
-        int new_section_length=(2*32+32+40)/8;
-        rets=rets+Int2String(new_section_length,12);
-        rets=rets+payload_temp.substring(24,64);//ループ前まで
+        ArrayList program_number = new ArrayList();
+        tableid = TSString2Int(payload_temp, 0, 8);
+        sectionlength = TSString2Int(payload_temp, 12, 12);//-40-32;
+        int patnum = sectionlength * 8 - 72;
+        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);//ループ前まで
         String loop = "";
-        patnum=patnum/32;
-        for (int i=0;i<patnum;i++){
+        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);
-            if (pat[0]==0){
-                loop=payload_temp.substring(64+32*i,95+32*i+1);
-            }else if (pat[0]==Table){
-                loop=loop+payload_temp.substring(64+32*i,95+32*i+1);
-                i=patnum;
+            int[] pat = new int[2];
+            pat[0] = TSString2Int(payload_temp, 64 + 32 * i, 16);
+            pat[1] = TSString2Int(payload_temp, 32 * i + 64 + 19, 13);
+            if (pat[0] == 0) {
+                loop = loop+payload_temp.substring(64 + 32 * i, 95 + 32 * i + 1);
+            } else if (pat[0] == Table) {
+                loop = loop + payload_temp.substring(64 + 32 * i, 95 + 32 * i + 1);
+                i = patnum;
             }
         }
-        rets=rets+loop;
-        CRC32 crc=new CRC32();
-        for (int ipt=0;ipt*8+7<rets.length();ipt++){
-            String st=rets.substring(8*ipt,8*ipt+8);
-            int tt2=Integer.parseInt(st,2);
-            crc.update(tt2);
+        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));
+            }
         }
-        rets=rets+Long2String(crc.getValue(),32);
+
+        */
+        ////
+        int ill3 = payload_temp.length() - rets.length();
+        for (int ir = 0; ir < ill3; ir++) {
+            rets = rets + "1";
+        }
+        showPAT(tsheader+rets);
         return rets;
     }
-    private String Int2String(int num,int length){
-        String ret=Integer.toBinaryString(num);
-        if (ret.length()<length){
-            int it=length-ret.length();
-            for (int i=0;i<it;i++){
-                ret="0"+ret;
+    private String getCRC32(String s){
+        return getCRC32(Stream2Byte(s),1);
+    }
+    private String getCRC32(byte[] data,int offset) {
+        // x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1
+        int[] g = {1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1};
+        int[] shift_reg = new int[32];
+        long crc = 0;
+        byte crc32[] = new byte[4];
+
+        // Initialize shift register's to '1'
+        java.util.Arrays.fill(shift_reg, 1);
+
+        // Calculate nr of data bits, summa of bits
+        int nr_bits = (data.length - offset) * 8;
+
+        for (int bit_count = 0, bit_in_byte = 0, data_bit; bit_count < nr_bits; bit_count++) {
+            // Fetch bit from bitstream
+            data_bit = (data[offset] & 0x80 >>> (bit_in_byte++)) != 0 ? 1 : 0;
+
+            if ((bit_in_byte &= 7) == 0) {
+                offset++;
+            }
+
+            // Perform the shift and modula 2 addition
+            data_bit ^= shift_reg[31];
+
+            for (int i = 31; i > 0; i--) {
+                shift_reg[i] = g[i] == 1 ? (shift_reg[i - 1] ^ data_bit) : shift_reg[i - 1];
+            }
+
+            shift_reg[0] = data_bit;
+        }
+
+        for (int i = 0; i < 32; i++) {
+            crc = ((crc << 1) | (shift_reg[31 - i]));
+        }
+
+        for (int i = 0; i < 4; i++) {
+            crc32[i] = (byte) (0xFF & (crc >>> ((3 - i) * 8)));
+        }
+        String s=Long2String(crc, 32);
+        return s;
+    }
+
+
+    private String byte2String(byte[] b) {
+        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)) {
+                for (int i2 = s.length(); i2 < 8; i2++) {
+                    s = "0" + s;
+                }
+            }
+            ret = ret + s;
+        }
+        return ret;
+    }
+
+    private String byte2HexString(byte[] b) {
+        String ret = "";
+        for (int i = 0; i < b.length; i++) {
+            ret = ret + Integer.toHexString(b[i] & 0xFF);
+        }
+        return ret;
+    }
+
+    private boolean testCRC(String base, String ans, int begin_n, int end_n) {
+        String tests1 = base.substring(begin_n, end_n);
+        byte[] test1 = Stream2Byte(tests1);
+        int t32 = 0;
+        int begin = begin_n;
+        int end = end_n;
+        byte[] test2 = Stream2Byte(ans);
+        String tests2 = ans;
+        CRC32 crc = new CRC32();
+        crc.reset();
+        crc.update(test1);
+
+        if (crc.getValue() == Long.parseLong(tests2, 2)) {
+            System.out.print("正解が出ました。\n");
+            System.out.print("begin : " + Integer.toString(begin_n) + " end : " + Integer.toString(end_n));
+            
+            return true;
+        }
+        if (Long.parseLong(getCRC32(test1,1), 2) == Long.parseLong(tests2, 2)) {
+            System.out.print("正解が出ました。(getCRC)\n");
+            System.out.print("begin : " + Integer.toString(begin_n) + " end : " + Integer.toString(end_n));
+            return true;
+        }
+        if (Long.parseLong(getCRC32(test1,1), 2) == Long.parseLong(tests2, 2)) {
+            System.out.print("正解が出ました。(getCRC_2)\n");
+            System.out.println("begin : " + Integer.toString(begin_n) + " end : " + Integer.toString(end_n));
+            showPAT(base);
+            System.out.println("begin : " + base.substring(begin_n,begin_n+32));
+            System.out.println("near : " + base.substring(end_n-32, end_n));
+            System.out.println("near2: " + base.substring(end_n, end_n+32));
+            System.out.println("near3: " + base.substring(end_n+32, end_n+64));
+            return true;
+        }
+        return false;
+    }
+
+    private String Int2String(int num, int length) {
+        String ret = Integer.toBinaryString(num);
+        if (ret.length() < length) {
+            int it = length - ret.length();
+            for (int i = 0; i < it; i++) {
+                ret = "0" + ret;
             }
         }
         return ret;
     }
-    private String Long2String(long num,int length){
-        String ret=Long.toBinaryString(num);
-        if (ret.length()<length){
-            for (int i=0;i<length-ret.length();i++){
-                ret="0"+ret;
+
+    private String Long2String(long num, int length) {
+        String ret = Long.toBinaryString(num);
+        if (ret.length() < length) {
+            int it = length - ret.length();
+            for (int i = 0; i < it; i++) {
+                ret = "0" + ret;
             }
         }
         return ret;
     }
-    private byte[] Stream2Byte(String ts){
-        int len=ts.length()-ts.length()%8;
-        len=len/8;
-        byte[] ret=new byte[len];
-        for (int i=0;i<len;i++){
-            String tet=ts.substring(i*8,i*8+8);
-            int itt=TSString2Int(tet,0,8);
-            ret[i]=(byte)itt;
+
+    private byte[] Stream2Byte(String ts) {
+        int len = ts.length() - ts.length() % 8;
+        len = len / 8;
+        byte[] ret = new byte[len];
+        for (int i = 0; i < len; i++) {
+            String tet = ts.substring(i * 8, i * 8 + 8);
+            int itt = TSString2Int(tet, 0, 8);
+            ret[i] = (byte) itt;
         }
         return ret;
     }
-    public ArrayList getPAT(){
+
+    public ArrayList getPAT() {
         return pat_list_all;
     }
-    public void setPAT(ArrayList pat){
-        pat_list_now=pat;
-        pat_list_all=pat;
+
+    public void setPAT(ArrayList pat) {
+        pat_list_now = pat;
+        pat_list_all = pat;
     }
-    public ArrayList getPMT(){
+
+    public ArrayList getPMT() {
         return pmt_list;
     }
-    public void setPMT(ArrayList pmt){
-        pmt_list=pmt;
+
+    public void setPMT(ArrayList pmt) {
+        pmt_list = pmt;
     }
-    public int getPID(){
+
+    public int getPID() {
         return PID;
     }
-}
\ No newline at end of file
+
+    public void showPAT(String ts) {
+        System.out.println("先頭:" + ts.substring(0, 8));
+        System.out.println("" + ts.substring(8, 11));
+        System.out.println("PID:" + ts.substring(11, 24));
+        System.out.println("" + ts.substring(24, 32));
+        System.out.println("Adap_Len:" + ts.substring(32, 40));
+        System.out.println("TableID:" + ts.substring(40, 48));
+        System.out.println("" + ts.substring(48, 52));
+        System.out.println("len : " + ts.substring(52, 64) + "//" + Integer.toString(Integer.parseInt(ts.substring(52, 64), 2)));
+        System.out.println("TS ID:" + ts.substring(64, 80));
+        System.out.println("11:" + ts.substring(80, 82));
+        System.out.println("" + ts.substring(82, 104));
+        for (int i = 0; i < 10; i++) {
+            System.out.println(Integer.toString(i) + " : " + ts.substring(104 + 32 * i, 136 + 32 * i));
+        }
+        System.out.println("Length:" + Integer.toString(ts.length()));
+
+
+
+    }
+}
index 52bd461..a4476b5 100644 (file)
@@ -84,24 +84,30 @@ public class Tsfile {
             FileInputStream in = new FileInputStream(origpath);
             //int[] PIDCount=new int[8200];
             byte[] wbyte=null;
-            for (int i=0;i<3000;i++){
-                in.read(tb);
+            for (int i=0;in.read(tb)!=-1;i++){
+                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){
-                            wbyte=m2tp.splitPAT(tb,p_table);
+                            Mpeg2TSPacket m2tp2=new Mpeg2TSPacket();
+                            //m2tp2.readTS(tb);
+                            wbyte=m2tp2.splitPAT(tb,p_table);
+                            //wbyte=tb;
                         }else{
                             wbyte=tb;
                         }
                     }
                 }
-                FileOutputStream fos=new FileOutputStream(destpath,true);
-                fos.write(wbyte);
-                fos.close();
+                if (wbyte!=null){
+                    FileOutputStream fos=new FileOutputStream(destpath,true);
+                    fos.write(wbyte);
+                    fos.close();
+                }
             }
+            in.close();
             
         } catch (IOException ex) {
             Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
@@ -181,6 +187,7 @@ public class Tsfile {
                 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 {