OSDN Git Service

make it very speedy.
authorgn64_jp <gn64_jp@4e526526-5e11-4fc0-8910-f8fd03428081>
Mon, 23 Nov 2009 14:11:16 +0000 (14:11 +0000)
committergn64_jp <gn64_jp@4e526526-5e11-4fc0-8910-f8fd03428081>
Mon, 23 Nov 2009 14:11:16 +0000 (14:11 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/rec10@238 4e526526-5e11-4fc0-8910-f8fd03428081

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

index 527ffce..2d39df2 100644 (file)
@@ -33,6 +33,7 @@ public class Main {
             }
         }
         Tsfile t1 = new Tsfile();
-        t1.splitTS(inf, outf, ch);
+        //t1.splitTS(inf, outf, ch);
+        t1.splitTS_byte(inf, outf, ch);
     }
 }
index 8fa9a12..7c2128f 100644 (file)
@@ -1,13 +1,18 @@
 package jtssplitter;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import java.util.zip.CRC32;
 import jtssplitter.data.PATData;
 import jtssplitter.data.PMTData;
 import jtssplitter.data.Descriptor;
 import jtssplitter.data.EITData;
 import jtssplitter.data.Video_stream_descriptor;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 /*
  * To change this template, choose Tools | Templates
  * and open the template in the editor.
@@ -19,10 +24,14 @@ import jtssplitter.data.Video_stream_descriptor;
  */
 public class Mpeg2TSPacket {
     //TSのヘッダーを格納する
+
     public String header;
     public String payload;
     public String adaptation;
-    public byte[] bPAT_payload=null;
+    public byte[] header_byte;
+    public byte[] payload_byte;
+    public byte[] adaptation_byte;
+    public byte[] bPAT_payload = null;
     //private ArrayList<TsDate> date=new ArrayList<TsDate>();
     //date.add(new TsDate("Starter"))
     public int type;//
@@ -52,15 +61,24 @@ public class Mpeg2TSPacket {
 
     public Mpeg2TSPacket() {
     }
-    public int getPIDFirst(byte[] ts){
-        byte[] b=new byte[2];
-        b[0]=ts[1];
-        b[1]=ts[2];
-        //String s=byte2String2(b);
-        //s=s.substring(3,16);
 
-        return Integer.parseInt(byte2String2(b).substring(3,16),2);
+    public int getPIDFirst(byte[] ts) {
+        byte[] b = new byte[2];
+        b[0] = ts[1];
+        b[1] = ts[2];
+        String s=byte2String2(b);
+        s=s.substring(3,16);
+        return Integer.parseInt(byte2String2(b).substring(3, 16), 2);
+    }
+    public int getPIDFirst_byte(byte[] ts) {
+        calc cal=new calc();
+        byte[] b = new byte[2];
+        b[0] = ts[1];
+        b[1] = ts[2];
+        return cal.byte2int(b,3,13);
+        //return cal.byte2int(ts,11,13);
     }
+
     public void readTS(byte[] ts) {
         /**
          * 188バイトのtsから読み出したbyteを与える
@@ -82,7 +100,7 @@ public class Mpeg2TSPacket {
                 payload = tsbyte.substring(40);
             } else if (adaptation_field == 3) {
                 adaptation_length = TSString2Int(tsbyte, 32, 8);
-                if ((adaptation_length < 184)&((tsbyte.length()-adaptation_length*8)>48)) {
+                if ((adaptation_length < 184) & ((tsbyte.length() - adaptation_length * 8) > 48)) {
                     adaptation_length = adaptation_length * 8;
                 }
                 adaptation = tsbyte.substring(32, 40 + adaptation_length);
@@ -91,7 +109,7 @@ public class Mpeg2TSPacket {
             }
         }
         if (PID == 0) {
-            pat_list_now =readPAT(payload);
+            pat_list_now = readPAT(payload);
             pat_list_all.addAll(pat_list_now);
         }
         for (int i = 0; i < pat_list_now.size(); i++) {
@@ -102,6 +120,51 @@ public class Mpeg2TSPacket {
         tsbyte = "";
     }
 
+    public void readTS_byte(byte[] ts) {
+        /**
+         * 188バイトのtsから読み出したbyteを与える
+         */
+        calc cal = new calc();
+        String tsbyte = byte2String2(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);
+        //PID = TSString2Int(tsbyte, 11, 13);
+        PID = cal.byte2int(ts, 11, 13);
+        adaptation_field = cal.byte2int(ts, 26, 2);
+        //continuity_counter = TSString2Int(tsbyte, 28, 4);
+        payload = "";
+        if (PID != 8191) {
+            if (adaptation_field == 1) {
+                pointer_field = cal.byte2int(ts, 32, 8);
+                payload_byte = cal.byte2subbyte(ts, 5, ts.length - 5);
+            } else if (adaptation_field == 3) {
+                adaptation_length = cal.byte2int(ts, 32, 8);
+                if ((adaptation_length < 184) & ((ts.length * 8 - adaptation_length * 8) > 48)) {
+                    adaptation_length = adaptation_length * 8;
+                }
+                adaptation_byte = cal.byte2subbyte(ts, 4, 1 + adaptation_length / 8);
+                payload_byte = cal.byte2subbyte(ts, 6 + adaptation_length / 8, ts.length - 6 - adaptation_length / 8);
+                pointer_field = cal.byte2int(ts, 40 + adaptation_length, 8);
+            }
+        }
+        if (payload_byte!=null){
+            if (PID == 0) {
+                pat_list_now = readPAT_byte(payload_byte);
+                pat_list_all.addAll(pat_list_now);
+            }
+            for (int i = 0; i < pat_list_now.size(); i++) {
+                if ((PID == pat_list_now.get(i).PID) && (PID != 0)) {
+                    pmt_list.addAll(readPMT_byte(payload_byte, pat_list_now.get(i).Program_TABLE));
+                }
+            }
+        }
+        tsbyte = "";
+    }
+
     private ArrayList<PATData> readPAT(String payload_temp) {
         /*
          * payloadの文字列を入力して[intテーブル,int PID]のArrayListを返す。
@@ -128,9 +191,30 @@ public class Mpeg2TSPacket {
         payload_temp = stest;
         int nowbit = 64;
         for (int i = 0; i < patnum; i++) {
-            PATData patd=new PATData();
-            patd.Program_TABLE=TSString2Int(payload_temp, 64 + 32 * i, 16);
-            patd.PID=TSString2Int(payload_temp, 32 * i + 64 + 19, 13);
+            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);
+        }
+        return program_number;
+    }
+
+    private ArrayList<PATData> readPAT_byte(byte[] payload_temp) {
+        /*
+         * payloadの文字列を入力して[intテーブル,int PID]のArrayListを返す。
+         */
+        int tableid;
+        int sectionlength;
+        calc cal = new calc();
+        ArrayList program_number = new ArrayList();
+        tableid = cal.byte2int(payload_temp, 0, 8);
+        sectionlength = cal.byte2int(payload_temp, 12, 12);//-40-32;
+        int patnum = sectionlength * 8 - 72;
+        patnum = patnum / 32;
+        for (int i = 0; i < patnum; i++) {
+            PATData patd = new PATData();
+            patd.Program_TABLE = cal.byte2int(payload_temp, 64 + 32 * i, 16);
+            patd.PID = cal.byte2int(payload_temp, 32 * i + 64 + 19, 13);
             program_number.add(patd);
         }
         return program_number;
@@ -144,86 +228,189 @@ public class Mpeg2TSPacket {
         int program_info_length = TSString2Int(payload_temp, 84, 12);
         boolean end = false;
         int cur_point = 96 + program_info_length * 8;
-        if (cur_point>section_length*8){
-            end=true;
+        if (cur_point > section_length * 8) {
+            end = true;
         }
         while (end != true) {
-            String gs=payload_temp.substring(cur_point+8,cur_point+11);
-            if (gs.matches("111")&&payload_temp.length()>cur_point+40){
+            String gs = payload_temp.substring(cur_point + 8, cur_point + 11);
+            if (gs.matches("111") && payload_temp.length() > cur_point + 40) {
                 int pmt_stream_type = TSString2Int(payload_temp, cur_point, 8);
                 int elementary_PID = TSString2Int(payload_temp, cur_point + 11, 13);
                 //System.out.println(Integer.toString(cur_point)+" :  "+Integer.toString(section_length*8));
                 int es_length = TSString2Int(payload_temp, cur_point + 28, 12);
                 /*if (pmt_stream_type==0x02){
-                    Descriptor des=new Descriptor();
-                    Object a=des.getDescriptors(payload_temp.substring(cur_point + 40,cur_point + 40+es_length*8));
+                Descriptor des=new Descriptor();
+                Object a=des.getDescriptors(payload_temp.substring(cur_point + 40,cur_point + 40+es_length*8));
                 }else if(pmt_stream_type==0x0f){
-                    Descriptor des=new Descriptor();
-                    Object a=des.getDescriptors(payload_temp.substring(cur_point + 40,cur_point + 40+es_length*8));
+                Descriptor des=new Descriptor();
+                Object a=des.getDescriptors(payload_temp.substring(cur_point + 40,cur_point + 40+es_length*8));
                 }*/
 
-                
-                PMTData pmtd=new PMTData();
-                if ((pmt_stream_type==0x02)||(pmt_stream_type==0x0f)){
-                    pmtd.Stream_Type=pmt_stream_type;
-                    pmtd.Program_Table=PAT_TABLE;
-                    pmtd.Elementary_PID=elementary_PID;
-                    pmtd.PCR_PID=pcr_pid;
+
+                PMTData pmtd = new PMTData();
+                if ((pmt_stream_type == 0x02) || (pmt_stream_type == 0x0f)) {
+                    pmtd.Stream_Type = pmt_stream_type;
+                    pmtd.Program_Table = PAT_TABLE;
+                    pmtd.Elementary_PID = elementary_PID;
+                    pmtd.PCR_PID = pcr_pid;
                     pmt_t.add(pmtd);
                 }
                 cur_point = cur_point + 40 + es_length * 8;
                 //System.out.println(Integer.toString(cur_point)+" :  "+Integer.toString(section_length*8));
-                if ((cur_point > section_length * 8 - 1)|| (cur_point>payload_temp.length()-11)) {
+                if ((cur_point > section_length * 8 - 1) || (cur_point > payload_temp.length() - 11)) {
                     end = true;
                 }
-            }else{
-                end=true;
+            } else {
+                end = true;
             }
         }
         return pmt_t;
     }
+
+    private ArrayList<PMTData> readPMT_byte(byte[] payload_temp, int PAT_TABLE) {
+        ArrayList<PMTData> pmt_t = new ArrayList<PMTData>();
+        calc cal = new calc();
+        int tableid = cal.byte2int(payload_temp, 0, 8);
+        int section_length = cal.byte2int(payload_temp, 12, 12);
+        int pcr_pid = cal.byte2int(payload_temp, 67, 13);
+        int program_info_length = cal.byte2int(payload_temp, 84, 12);
+        boolean end = false;
+        int cur_point = 96 + program_info_length * 8;
+        if (cur_point > section_length * 8) {
+            end = true;
+        }
+        while (end != true) {
+            if (cal.byte2int(payload_temp, cur_point + 8, 3) == 7 && cal.byte2int(payload_temp, cur_point + 24, 4) == 15 && payload_temp.length * 8 > cur_point + 40) {
+                int pmt_stream_type = cal.byte2int(payload_temp, cur_point, 8);
+                int elementary_PID = cal.byte2int(payload_temp, cur_point + 11, 13);
+                //System.out.println(Integer.toString(cur_point)+" :  "+Integer.toString(section_length*8));
+                int es_length = cal.byte2int(payload_temp, cur_point + 28, 12);
+                /*if (pmt_stream_type==0x02){
+                Descriptor des=new Descriptor();
+                Object a=des.getDescriptors(payload_temp.substring(cur_point + 40,cur_point + 40+es_length*8));
+                }else if(pmt_stream_type==0x0f){
+                Descriptor des=new Descriptor();
+                Object a=des.getDescriptors(payload_temp.substring(cur_point + 40,cur_point + 40+es_length*8));
+                }*/
+
+
+                PMTData pmtd = new PMTData();
+                if ((pmt_stream_type == 0x02) || (pmt_stream_type == 0x0f)) {
+                    pmtd.Stream_Type = pmt_stream_type;
+                    pmtd.Program_Table = PAT_TABLE;
+                    pmtd.Elementary_PID = elementary_PID;
+                    pmtd.PCR_PID = pcr_pid;
+                    pmt_t.add(pmtd);
+                }
+                cur_point = cur_point + 40 + es_length * 8;
+                //System.out.println(Integer.toString(cur_point)+" :  "+Integer.toString(section_length*8));
+                if ((cur_point > section_length * 8 - 1) || (cur_point > payload_temp.length * 8 - 11)) {
+                    end = true;
+                }
+            } else {
+                end = true;
+            }
+        }
+        return pmt_t;
+    }
+
     public ArrayList<EITData> readEIT(byte[] ts) {
-        String payload_temp=getPayload(ts);
+        String payload_temp = getPayload(ts);
         int tableid = TSString2Int(payload_temp, 0, 8);
         int section_length = TSString2Int(payload_temp, 12, 12);
         int program_number = TSString2Int(payload_temp, 24, 16);
-        boolean current_next_indicator= (TSString2Int(payload_temp, 47, 1)==1);
+        boolean current_next_indicator = (TSString2Int(payload_temp, 47, 1) == 1);
         int section_number = TSString2Int(payload_temp, 48, 8);
-        int curpoint=112;
-        ArrayList<EITData> ret=new ArrayList<EITData>();
-        while (curpoint<24+section_length*8-32){
-            EITData eitd=new EITData();
-            eitd.current_newt_indicator=current_next_indicator;
+        int curpoint = 112;
+        ArrayList<EITData> ret = new ArrayList<EITData>();
+        while (curpoint < 24 + section_length * 8 - 32) {
+            EITData eitd = new EITData();
+            eitd.current_newt_indicator = current_next_indicator;
             eitd.event_id = TSString2Int(payload_temp, curpoint, 16);
-            eitd.program_number=program_number;
+            eitd.program_number = program_number;
             eitd.section_number = section_number;
-            int des_len=TSString2Int(payload_temp, curpoint+84, 12);
-            Descriptor des=new Descriptor();
-            eitd.descriptors=des.getDescriptors(payload_temp.substring(curpoint+96,curpoint+84+des_len*8));
+            int des_len = TSString2Int(payload_temp, curpoint + 84, 12);
+            Descriptor des = new Descriptor();
+            eitd.descriptors = des.getDescriptors(payload_temp.substring(curpoint + 96, curpoint + 84 + des_len * 8));
             ret.add(eitd);
-            curpoint=curpoint+84+des_len*8;
+            curpoint = curpoint + 84 + des_len * 8;
         }
         return ret;
     }
+
     private int TSString2Int(String s, int begin, int length) {
         String st = s.substring(begin, begin + length);
         int i = Integer.parseInt(st, 2);
         return i;
     }
 
+    public byte[] splitPAT_byte(byte[] ts, int p_table) {
+        /**
+         *
+         * p_tableで指定された番組テーブルのみを取り出すPATを作る。
+         */
+        int matchnum = 0;
+        byte[] tbb = new byte[ts.length - 4];
+        System.arraycopy(ts, 4, tbb, 0, tbb.length);
+        if (bPAT_payload != null) {
+            if (Arrays.equals(tbb, bPAT_payload)) {
+                byte[] retb = new byte[188];
+                System.arraycopy(ts, 0, retb, 0, 4);
+                System.arraycopy(bPAT_payload, 0, retb, 4, 184);
+                return retb;
+            }
+        }
+        calc cal = new calc();
+        String tsbyte = byte2String2(ts);
+        String tsheader = "";
+        header_byte = cal.byte2subbyte(ts, 0, 4);
+        byte[] pointer_byte=cal.byte2subbyte(ts, 4, 1);
+        payload_byte = cal.byte2subbyte(ts, 4, ts.length - 4);
+        starter = cal.byte2int(ts, 0, 8);
+        transporterror = cal.byte2int(ts, 8, 1);
+        payloadstart = cal.byte2int(ts, 9, 1);
+        transport_priority = cal.byte2int(ts, 10, 1);
+        PID = cal.byte2int(ts, 11, 13);
+        adaptation_field = cal.byte2int(ts, 26, 2);
+        continuity_counter = cal.byte2int(ts, 28, 4);
+        int adaptation_length_t = cal.byte2int(ts, 32, 8);
+        if (PID != 8191) {
+            if (adaptation_field == 1) {
+                pointer_field = cal.byte2int(ts, 32, 8);
+                payload_byte = cal.byte2subbyte(ts, 5, ts.length - 5);
+            } else if (adaptation_field == 3) {
+                if (adaptation_length_t < 188) {
+                    adaptation_length_t = adaptation_length_t * 8;
+                }
+                payload_byte = cal.byte2subbyte(ts, 6 + adaptation_length_t / 8, ts.length - 6 - adaptation_length_t / 8);
+            }
+        }
+        if (PID == 0) {
+            //showPAT(tsbyte);
+            payload_byte = makePAT_byte(pointer_byte,payload_byte, p_table);
+            //payload_byte = cal.String2Byte(makePAT(cal.byte2String2(header_byte), cal.byte2String2(payload_byte), p_table));
+            bPAT_payload = payload_byte;
+        }
+        ByteArrayOutputStream baos = new ByteArrayOutputStream(ts.length);
+        baos.write(header_byte, 0, header_byte.length);
+        baos.write(pointer_byte,0,pointer_byte.length);
+        baos.write(payload_byte, 0, payload_byte.length);
+        return baos.toByteArray();
+    }
+
     public byte[] splitPAT(byte[] ts, int p_table) {
         /**
-         * 
+         *
          * p_tableで指定された番組テーブルのみを取り出すPATを作る。
          */
-        int matchnum=0;
-        byte[] tbb=new byte[ts.length-4];
-        System.arraycopy(ts,4,tbb,0,tbb.length);
-        if (bPAT_payload!=null){
-            if (Arrays.equals(tbb, bPAT_payload)){
-                byte[] retb=new byte[188];
-                System.arraycopy(ts,0,retb,0,4);
-                System.arraycopy(bPAT_payload,0,retb,4,184);
+        int matchnum = 0;
+        byte[] tbb = new byte[ts.length - 4];
+        System.arraycopy(ts, 4, tbb, 0, tbb.length);
+        if (bPAT_payload != null) {
+            if (Arrays.equals(tbb, bPAT_payload)) {
+                byte[] retb = new byte[188];
+                System.arraycopy(ts, 0, retb, 0, 4);
+                System.arraycopy(bPAT_payload, 0, retb, 4, 184);
                 return retb;
             }
         }
@@ -255,17 +442,17 @@ public class Mpeg2TSPacket {
         }
         if (PID == 0) {
             //showPAT(tsbyte);
-            payload = makePAT(tsheader,payload, p_table);
-            byte[] retb=String2Byte(payload);
-            bPAT_payload=retb;
+            payload = makePAT(tsheader, payload, p_table);
+            byte[] retb = String2Byte(payload);
+            bPAT_payload = retb;
         }
         String rets = tsheader + payload;
         return String2Byte(rets);
     }
 
-    private String makePAT(String tsheader,String payload_temp, int Table) {
+    private String makePAT(String tsheader, String payload_temp, int Table) {
         int sectionlength;
-        StringBuffer sb=new StringBuffer();
+        StringBuffer sb = new StringBuffer();
         //ArrayList program_number = new ArrayList();
         //System.out.println("Pay:"+payload_temp);
         //int tableid = TSString2Int(payload_temp, 0, 8);
@@ -273,7 +460,7 @@ public class Mpeg2TSPacket {
         int patnum = sectionlength * 8 - 72;
         //String rets = "";//="00000000";//pointer field
         //rets = rets + payload_temp.substring(0, 12);//セクション長の前まで
-        sb.append(payload_temp.substring(0,12));
+        sb.append(payload_temp.substring(0, 12));
         int new_section_length = (2 * 32 + 32 + 40) / 8;
         sb.append(Int2String(new_section_length, 12));
         sb.append(payload_temp.substring(24, 64));
@@ -295,8 +482,8 @@ public class Mpeg2TSPacket {
                 i = patnum;
             }
         }
-        String s2=tsheader.substring(tsheader.length()-8);
-        s2=s2+sb.toString();
+        String s2 = tsheader.substring(tsheader.length() - 8);
+        s2 = s2 + sb.toString();
         String s = getCRC32(s2);
         sb.append(s);
         //rets = rets + s;
@@ -307,10 +494,50 @@ public class Mpeg2TSPacket {
         }
         return sb.toString();
     }
-    private String getCRC32(String s){
-        return getCRC32(String2Byte(s),1);
+
+    private byte[] makePAT_byte(byte[] pointer_field, byte[] payload_temp, int Table) {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream(payload_temp.length);
+        int sectionlength;
+        calc cal = new calc();
+        sectionlength = cal.byte2int(payload_temp, 12, 12); //-40-32;
+        int patnum = sectionlength * 8 - 72;
+        baos.write(payload_temp, 0, 1);
+        int new_section_length = (2 * 32 + 32 + 40) / 8;
+        baos.write(cal.joinByte((byte) cal.byte2int(payload_temp, 8, 4), (byte) (new_section_length & 0xF00), 4));
+        baos.write((byte) (new_section_length & 0xFF));
+        baos.write(payload_temp, 3, 5);
+        patnum = patnum / 32;
+        int nowt = 8;
+        for (int i = 0; i < patnum; i++) {
+            int[] pat = new int[2];
+            pat[0] = cal.byte2int(payload_temp, 64 + 32 * i, 16);
+            pat[1] = cal.byte2int(payload_temp, 32 * i + 64 + 19, 13);
+            if (pat[0] == 0) {
+                baos.write(payload_temp, nowt, 4);
+                nowt = nowt + 4;
+                } else if (pat[0] == Table) {
+                baos.write(payload_temp, nowt, 4);
+                nowt = nowt + 4;
+                i = patnum;
+            }
+        }
+        ByteArrayOutputStream baoscrc=new ByteArrayOutputStream(nowt+1);
+        baoscrc.write(pointer_field[0]);
+        baoscrc.write(baos.toByteArray(), 0, baos.size());
+        byte[] crc = getCRC32_byte(baoscrc.toByteArray(), 1);
+        baos.write(crc, 0, crc.length);
+        int ill3 = payload_temp.length - baos.size();
+        for (int ir = 0; ir < ill3; ir++) {
+            baos.write(0xFF);
+            }
+        return baos.toByteArray();
+    }
+
+    private String getCRC32(String s) {
+        return getCRC32(String2Byte(s), 1);
     }
-    private String getCRC32(byte[] data,int offset) {
+
+    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];
@@ -348,12 +575,53 @@ public class Mpeg2TSPacket {
         for (int i = 0; i < 4; i++) {
             crc32[i] = (byte) (0xFF & (crc >>> ((3 - i) * 8)));
         }
-        String s=Long2String(crc, 32);
+        String s = Long2String(crc, 32);
         return s;
     }
 
-    private String addzero(int num){
-        switch (num){
+    private byte[] getCRC32_byte(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)));
+        }
+        return crc32;
+    }
+
+    private String addzero(int num) {
+        switch (num) {
             case 0:
                 return "";
             case 1:
@@ -373,51 +641,53 @@ public class Mpeg2TSPacket {
             case 8:
                 return "00000000";
             default:
-                StringBuffer sb=new StringBuffer();
-                for (int i=0;i<num;i++){
+                StringBuffer sb = new StringBuffer();
+                for (int i = 0; i < num; i++) {
                     sb.append("0");
                 }
                 return sb.toString();
         }
     }
+
     private String byte2String(byte[] b) {
-        StringBuffer sb=new StringBuffer(8*b.length);
+        StringBuffer sb = new StringBuffer(8 * b.length);
         for (int i = 0; i < b.length; i++) {
-            StringBuffer sb2=new StringBuffer(8);
+            StringBuffer sb2 = new StringBuffer(8);
             sb2.append(Integer.toBinaryString(b[i] & 0xFF));
             if ((sb2.length() < 8) & (sb2.length() > 0)) {
-                sb2.insert(0,addzero(8-sb2.length()));
+                sb2.insert(0, addzero(8 - sb2.length()));
             }
             sb.append(sb2);
         }
         return sb.toString();
     }
-    private String byte2String2(byte[] b){
-        int bl=b.length;
-        bl=bl-bl%8;
-        bl=bl/8;
-        StringBuffer sb=new StringBuffer();
-        for (int i=0;i<bl;i++){
-            long retl=0;
-            for (int j=0;j<8;j++){
-                retl=retl<<8;
-                int ri=b[i*8+j]&0xFF;
-                retl=retl+ri;
+
+    private String byte2String2(byte[] b) {
+        int bl = b.length;
+        bl = bl - bl % 8;
+        bl = bl / 8;
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0; i < bl; i++) {
+            long retl = 0;
+            for (int j = 0; j < 8; j++) {
+                retl = retl << 8;
+                int ri = b[i * 8 + j] & 0xFF;
+                retl = retl + ri;
             }
-            sb.append(Long2String(retl,64));
-        }
-        int bl2=b.length%8;
-        bl2=(bl2-bl2%4)/4;
-        for (int i=0;i<bl2;i++){
-            int reti=0;
-            for (int j=0;j<4;j++){
-                reti=reti<<8;
-                reti=reti+(b[bl*8+4*i+j]&0xFF);
+            sb.append(Long2String(retl, 64));
+        }
+        int bl2 = b.length % 8;
+        bl2 = (bl2 - bl2 % 4) / 4;
+        for (int i = 0; i < bl2; i++) {
+            int reti = 0;
+            for (int j = 0; j < 4; j++) {
+                reti = reti << 8;
+                reti = reti + (b[bl * 8 + 4 * i + j] & 0xFF);
             }
-            sb.append(Int2String(reti,32));
+            sb.append(Int2String(reti, 32));
         }
-        for (int i=0;i<(b.length%8)%4;i++){
-            sb.append(Int2String(b[bl*8+bl2*4+i]&0xFF,8));
+        for (int i = 0; i < (b.length % 8) % 4; i++) {
+            sb.append(Int2String(b[bl * 8 + bl2 * 4 + i] & 0xFF, 8));
         }
         return sb.toString();
     }
@@ -445,22 +715,22 @@ public class Mpeg2TSPacket {
         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)) {
+        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)) {
+        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));
+            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;
@@ -521,13 +791,14 @@ public class Mpeg2TSPacket {
     public int getPID() {
         return PID;
     }
-    public String getPayload(byte[] ts){
+
+    public String getPayload(byte[] ts) {
         /**
          * 188バイトのtsから読み出したbyteを与える
          */
         String tsbyte = byte2String2(ts);
         //header = tsbyte.substring(0, 31);
-        String ret_payload="";
+        String ret_payload = "";
         //starter = TSString2Int(tsbyte, 0, 8);
         //transporterror = TSString2Int(tsbyte, 8, 1);
         //payloadstart = TSString2Int(tsbyte, 9, 1);
@@ -540,7 +811,7 @@ public class Mpeg2TSPacket {
                 ret_payload = tsbyte.substring(40);
             } else if (af == 3) {
                 int al = TSString2Int(tsbyte, 32, 8);
-                if ((al < 184)&((tsbyte.length()-al*8)>48)) {
+                if ((al < 184) & ((tsbyte.length() - al * 8) > 48)) {
                     al = al * 8;
                 }
                 ret_payload = tsbyte.substring(48 + al);
@@ -548,10 +819,46 @@ public class Mpeg2TSPacket {
         }
         return ret_payload;
     }
-    public ArrayList<PMTData> readPMT(byte[] ts,int TABLE_NUM){
-        String payload=getPayload(ts);
-        return readPMT(payload, TABLE_NUM);
+
+    public byte[] getPayload_byte(byte[] ts) {
+        /**
+         * 188バイトのtsから読み出したbyteを与える
+         */
+        calc cal = new calc();
+        String tsbyte = byte2String2(ts);
+        //header = tsbyte.substring(0, 31);
+        byte[] retb = null;
+        //starter = TSString2Int(tsbyte, 0, 8);
+        //transporterror = TSString2Int(tsbyte, 8, 1);
+        //payloadstart = TSString2Int(tsbyte, 9, 1);
+        //transport_priority = TSString2Int(tsbyte, 10, 1);
+        int pid = cal.byte2int(ts, 11, 13);
+        int af = cal.byte2int(ts, 26, 2);
+        //continuity_counter = TSString2Int(tsbyte, 28, 4);
+        if (pid != 8191) {
+            if (af == 1) {
+                retb = cal.byte2subbyte(ts, 5, ts.length - 5);
+            } else if (af == 3) {
+                int al = cal.byte2int(ts, 32, 8);
+                if ((al < 184) & ((ts.length * 8 - al * 8) > 48)) {
+                    al = al * 8;
+                }
+                retb = cal.byte2subbyte(ts, 6 + al / 8, ts.length - 6 - al / 8);
+            }
+        }
+        return retb;
     }
+
+    public ArrayList<PMTData> readPMT(byte[] ts, int TABLE_NUM) {
+        String payloadt = getPayload(ts);
+        return readPMT(payloadt, TABLE_NUM);
+    }
+
+    public ArrayList<PMTData> readPMTglobal_byte(byte[] ts, int TABLE_NUM) {
+        byte[] payloadt = getPayload_byte(ts);
+        return readPMT_byte(payloadt, TABLE_NUM);
+    }
+
     public void showPAT(String ts) {
         System.out.println("先頭:" + ts.substring(0, 8));
         System.out.println("" + ts.substring(8, 11));
index 5299ee4..1ddcc1c 100644 (file)
@@ -94,7 +94,11 @@ public class Tsfile {
                 wbyte=null;
                 Mpeg2TSPacket m2tp;
                 m2tp=new Mpeg2TSPacket();
-                int ii=m2tpp.getPIDFirst(tstt);
+                //int ii=m2tpp.getPIDFirst(tstt);
+                int ii=m2tpp.getPIDFirst_byte(tstt);
+                //if (ii!=i2){
+                //    System.out.println("not match");
+                //}
                 boolean alreadyreaded=false;
                 for (int k=0;k<pids.length;k++){
                     if (ii==pids[k]){
@@ -149,6 +153,110 @@ public class Tsfile {
             Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
         }
     }
+
+    public void splitTS_byte(String origpath,String destpath,int csch){
+        int[] pids=null;
+        int p_table=0;
+        if (csch>0){
+            p_table=csch;
+        }else{
+            p_table=getFirstP_Table_byte(origpath);
+        }
+        PIDs pidss=getTablePID_byte(origpath,p_table);
+        p_table=pidss.Program_Table;
+        pids=pidss.PIDs;
+        int pmt_pid=pidss.PMT_PID;
+        byte[] tb=new byte[188];
+        try {
+            FileInputStream in = new FileInputStream(origpath);
+            FileOutputStream fos=new FileOutputStream(destpath);
+            BufferedInputStream bis=new BufferedInputStream(in,128*188);
+            BufferedOutputStream bos=new BufferedOutputStream(fos);
+            byte[] wbyte=null;
+            boolean end=false;
+            int ik=0;
+            boolean readend=false;
+            Mpeg2TSPacket m2tpp;
+            m2tpp=new Mpeg2TSPacket();
+            while (readend==false){
+                byte[] tstt=new byte[3];
+                bis.mark(188*2);
+                bis.read(tstt);
+                bis.reset();
+                wbyte=null;
+                Mpeg2TSPacket m2tp;
+                m2tp=new Mpeg2TSPacket();
+                //int ii=m2tpp.getPIDFirst(tstt);
+                int ii=m2tpp.getPIDFirst_byte(tstt);
+                //if (ii!=i2){
+                //    System.out.println("not match");
+                //}
+                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 m2tp2=new Mpeg2TSPacket();
+                            wbyte=m2tpp.splitPAT_byte(tb,p_table);
+                            //wbyte=m2tpp.splitPAT(tb, p_table);
+                            /*byte[] wbytet=m2tpp.splitPAT(tb, p_table);
+                            for (int kk=0;kk<wbyte.length;kk++){
+                                if (wbyte[kk]==wbytet[kk]){
+                                    //System.out.println(":match");
+                                }else{
+                                    System.out.print(kk);
+                                    System.out.println(":not match");
+                                }
+                            }*/
+                            //wbyte=wbytet;*/
+                        }else if ((ii==pmt_pid)&&(readti>187)){
+                            wbyte=tb;
+                            ArrayList<PMTData> pmtss=m2tpp.readPMTglobal_byte(tb, pmt_pid);
+                            if (pmtss.size()>0){
+                                int[] new_pids=new int[pmtss.size()+3];
+                                new_pids[pmtss.size()]=0;
+                                new_pids[pmtss.size()+1]=pmt_pid;
+                                new_pids[pmtss.size()+2]=pmtss.get(0).PCR_PID;
+                                for (int i=0;i<pmtss.size();i++){
+                                    new_pids[i]=pmtss.get(i).Elementary_PID;
+                                }
+                                if (!Arrays.equals(pids, new_pids)){
+                                    pids=new_pids;
+                                }
+                            }
+
+                        /*}else if ((ii==0x0012)&&(readti>187)){
+                            ArrayList<EITData> eitss=m2tpp.readEIT(tb);
+                         */
+                        }else if (readti>187){
+                            wbyte=tb;
+
+                        }else {
+                            readend=true;
+                        }
+                        k=pids.length;
+                    }
+                ik++;
+            }
+            if (alreadyreaded==false){
+                bis.skip(188);
+            }
+                if (wbyte!=null){
+                    bos.write(wbyte);
+                }
+            }
+            bis.close();
+            bos.flush();
+            bos.close();
+            in.close();
+            fos.close();
+
+        } catch (IOException ex) {
+            Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+        }
+    }
+
     private void writeTS(byte[] tspacket,String path){
         FileOutputStream fos = null;
         try {
@@ -259,6 +367,100 @@ public class Tsfile {
         }
         return pids;
     }
+    private PIDs getTablePID_byte(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<Integer> ret=new ArrayList<Integer>();
+            byte[] tb = new byte[188];
+            int[] ib = new int[188];
+            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];
+            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();
+                for (int i2=0;i2<pat.size();i2++){
+                    PATData patdd=pat.get(i2);
+                    if (pat.get(i2).Program_TABLE==p_table){
+                        pat.clear();
+                        pat.add(patdd);
+                        m2tp.setPAT(pat);
+                    }
+                }
+                ArrayList<PMTData> 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 itt=ret.size();
+                    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;
+                        }
+                    }
+                    if (ret.size()==itt){
+                        imax=imax+100;
+                    }
+                }
+            }
+            PATData patd_det=new PATData();
+            for (int i=0;i<pat.size();i++){
+                if (pat.get(i).Program_TABLE==p_table){
+                    patd_det=pat.get(i);
+                    i=pat.size();
+                }
+            }
+            ret.add(0);
+            ret.add(patd_det.PID);
+            ret.add(pmt.get(0).Elementary_PID);
+            for (int i=0;i<pmt.size();i++){
+                if (patd_det.Program_TABLE==pmt.get(i).Program_Table){
+                    if (!(ret.contains(pmt.get(i).Elementary_PID))){
+                        if ((pmt.get(i).Stream_Type==0x02)||(pmt.get(i).Stream_Type==0x0f)){
+                            ret.add(pmt.get(i).Elementary_PID);
+                        }
+                    }
+                }
+            }
+            pids.PMT_PID=patd_det.PID;
+            pids.Program_Table=patd_det.Program_TABLE;
+            pids.PIDs=new int[ret.size()];
+            for (int i=0;i<ret.size();i++){
+                pids.PIDs[i]=ret.get(i);
+            }
+            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 pids;
+    }
     private int getFirstP_Table(String fpath){
         /**
          * PIDを取得し、これと思われる必要なPIDを抜き出す。
@@ -312,4 +514,59 @@ public class Tsfile {
         }
         return patdd.Program_TABLE;
     }
+
+
+    private int getFirstP_Table_byte(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;
+        PATData patdd=new PATData();
+        patdd.PID=0;
+        try {
+            ArrayList ret=new ArrayList();
+            byte[] tb = new byte[188];
+            int[] ib = new int[188];
+            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];
+            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_byte(tb);
+                pat = m2tp.getPAT();
+                pmt = m2tp.getPMT();
+                if ((i==imax-1)&&(pmt.size()==0)){
+                    imax=imax+500;
+                }
+            }
+
+            for (int i=0;i<pat.size();i++){
+                if (pat.get(i).Program_TABLE>0){
+                    patdd=pat.get(i);
+                    i=pat.size();
+                }
+            }
+        } 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 patdd.Program_TABLE;
+    }
 }
\ No newline at end of file
index 35e5fe8..ae790dd 100644 (file)
@@ -30,7 +30,6 @@ public class calc {
         }
         return ret;
     }
-
     public byte[] String2Byte(String ts) {
         //StringBuffer sb=new StringBuffer(ts);
         int len = ts.length() - ts.length() % 8;
@@ -43,6 +42,15 @@ public class calc {
         }
         return ret;
     }
+    public byte joinByte(byte b1,byte b2,int b2length){
+        byte ret=(byte)(b1<<(b2length)&0xFF+b2&0xFF);
+        return ret;
+    }
+    public byte joinByte(byte b1,byte b2,int b2len,byte b3,int b3len){
+        byte ret=joinByte(b1,b2,b2len);
+        ret=joinByte(ret, b3, b3len);
+        return ret;
+    }
     public String byte2String(byte[] b) {
         StringBuffer sb=new StringBuffer(8*b.length);
         for (int i = 0; i < b.length; i++) {
@@ -168,6 +176,9 @@ public class calc {
             }else{
                 ret=ret+((b[a+i]&0xFF)<<((bb-a-i-1)*8+((startbit+length)%8)));
             }
+            if (b.length-1-a==i){
+                i=bb-a+1;
+            }
         }
         return ret;
     }