OSDN Git Service

make it faster2.
[rec10/rec10-git.git] / jTsSplitter / trunk / src / jtssplitter / Mpeg2TSPacket_String.java
1 package jtssplitter;
2
3 import java.util.ArrayList;
4 import java.util.zip.CRC32;
5 import jtssplitter.data.PATData;
6 import jtssplitter.data.PMTData;
7 /*
8  * To change this template, choose Tools | Templates
9  * and open the template in the editor.
10  */
11
12 /**
13  *
14  * @author Administrator
15  */
16 public class Mpeg2TSPacket_String {
17
18     public String header;
19     public String payload;
20     public String adaptation;
21     //private ArrayList<TsDate> date=new ArrayList<TsDate>();
22     //date.add(new TsDate("Starter"))
23     public int type;//
24     private int starter;//0-7
25     private int transporterror;//本TSパケットの誤りを示す 1bit 8
26     private int payloadstart;//セクションの先頭バイトが入っているかどうか1bit 9
27     private int transport_priority;//1bit 10
28     private int PID = -1;//tsパケットの種類 13bit 11-23
29     private int transport_scrambled;//2bit 00is " not scrambled" 24-25
30     private int adaptation_field;//2bit 26-27 01:adaptation fieldなしでおk 10は絶対いる 11はペイロードはアダプテーションに続く00は予約
31     private int continuity_counter;//連続性(PIDごとの通し番号) 4bit 28-31
32     //ここからアダプテーションフィールド(最後まで)
33     private int adaptation_length;//8bit 32-39
34     private int discontinuity;//1bit
35     private int random_access;//1bit ランダムアクセスの開始場所となる
36     private int ES_priority;//1bit プライオリティ
37     private int five_flag;//5bit
38     private ArrayList<PATData> pat_list_now = new ArrayList<PATData>();//[0]:番組番号 [1]:PMT PID
39     private ArrayList<PATData> pat_list_all = new ArrayList<PATData>();
40     private ArrayList<PMTData> pmt_list = new ArrayList<PMTData>();//[0]番組番号 [1]テーブルID
41     private int pointer_field;//8bit adaptation fieldの次?
42     private String payload_s;
43     //ここからオプションフィールド
44     //PCR42 OPCR42 
45     //ここまでオプションフィールド
46     private int staffing_byte;//
47
48     public Mpeg2TSPacket_String() {
49     }
50     public int getPIDFirst(byte[] ts){
51         byte[] b=new byte[2];
52         b[0]=ts[1];
53         b[1]=ts[2];
54         //String s=byte2String(b);
55         //s=s.substring(3,16);
56         return Integer.parseInt(byte2String(b).substring(3,16),2);
57     }
58     public void readTS(byte[] ts) {
59         /**
60          * 188バイトのtsから読み出したbyteを与える
61          */
62         String tsbyte = byte2String(ts);
63         //header = tsbyte.substring(0, 31);
64         payload = tsbyte.substring(32);
65         //starter = TSString2Int(tsbyte, 0, 8);
66         //transporterror = TSString2Int(tsbyte, 8, 1);
67         //payloadstart = TSString2Int(tsbyte, 9, 1);
68         //transport_priority = TSString2Int(tsbyte, 10, 1);
69         PID = TSString2Int(tsbyte, 11, 13);
70         adaptation_field = TSString2Int(tsbyte, 26, 2);
71         //continuity_counter = TSString2Int(tsbyte, 28, 4);
72         payload = "";
73         if (PID != 8191) {
74             if (adaptation_field == 1) {
75                 pointer_field = TSString2Int(tsbyte, 32, 8);
76                 payload = tsbyte.substring(40);
77             } else if (adaptation_field == 3) {
78                 adaptation_length = TSString2Int(tsbyte, 32, 8);
79                 if (adaptation_length < 184) {
80                     adaptation_length = adaptation_length * 8;
81                 }
82                 //System.out.println(adaptation_length);
83                 adaptation = tsbyte.substring(32, 40 + adaptation_length);
84                 pointer_field = TSString2Int(tsbyte, 40 + adaptation_length, 8);
85                 payload = tsbyte.substring(48 + adaptation_length);
86             }
87         }
88         if (PID == 0) {
89             pat_list_now =readPAT(payload);
90             pat_list_all.addAll(pat_list_now);
91         }
92         for (int i = 0; i < pat_list_now.size(); i++) {
93             if ((PID == pat_list_now.get(i).PID) && (PID != 0)) {
94                 pmt_list.addAll(readPMT(payload, pat_list_now.get(i).Program_TABLE));
95             }
96         }
97         tsbyte = "";
98     }
99
100     private ArrayList<PATData> readPAT(String payload_temp) {
101         /*
102          * payloadの文字列を入力して[intテーブル,int PID]のArrayListを返す。
103          */
104         int tableid;
105         int sectionlength;
106         ArrayList program_number = new ArrayList();
107         tableid = TSString2Int(payload_temp, 0, 8);
108         sectionlength = TSString2Int(payload_temp, 12, 12);//-40-32;
109         int patnum = sectionlength * 8 - 72;
110         patnum = patnum / 32;
111         byte[] test = Stream2Byte(payload_temp);
112         String stest = "";
113         for (int ij = 0; ij < test.length; ij++) {
114             int it = test[ij] & 0xFF;
115             String s = Integer.toBinaryString(it);
116             if (s.length() < 8) {
117                 for (int i2 = s.length(); i2 < 8; i2++) {
118                     s = "0" + s;
119                 }
120             }
121             stest = stest + s;
122         }
123         payload_temp = stest;
124         int nowbit = 64;
125         for (int i = 0; i < patnum; i++) {
126             PATData patd=new PATData();
127             patd.Program_TABLE=TSString2Int(payload_temp, 64 + 32 * i, 16);
128             patd.PID=TSString2Int(payload_temp, 32 * i + 64 + 19, 13);
129             program_number.add(patd);
130         }
131         return program_number;
132     }
133
134     private ArrayList<PMTData> readPMT(String payload_temp, int PAT_TABLE) {
135         ArrayList<PMTData> pmt_t = new ArrayList<PMTData>();
136         int tableid = TSString2Int(payload_temp, 0, 8);
137         int section_length = TSString2Int(payload_temp, 12, 12);
138         int program_info_length = TSString2Int(payload_temp, 84, 12);
139         boolean end = false;
140         int cur_point = 96 + program_info_length * 8;
141         while (end != true) {
142             int pmt_stream_type = TSString2Int(payload_temp, cur_point, 8);
143             int elementary_PID = TSString2Int(payload_temp, cur_point + 11, 13);
144             int es_length = TSString2Int(payload_temp, cur_point + 28, 12);
145             PMTData pmtd=new PMTData();
146             pmtd.Stream_Type=pmt_stream_type;
147             pmtd.Program_Table=PAT_TABLE;
148             pmtd.Elementary_PID=elementary_PID;
149             pmt_t.add(pmtd);
150             cur_point = cur_point + 40 + es_length * 8;
151             if (cur_point > section_length * 8) {
152                 end = true;
153             }
154         }
155         return pmt_t;
156     }
157
158     private int TSString2Int(String s, int begin, int length) {
159         String st = s.substring(begin, begin + length);
160         int i = Integer.parseInt(st, 2);
161         return i;
162     }
163
164     public byte[] splitPAT(byte[] ts, int p_table) {
165         /**
166          * 
167          * p_tableで指定された番組テーブルのみを取り出すPATを作る。
168          */
169         String tsbyte = byte2String(ts);
170         String tsheader = "";
171         header = tsbyte.substring(0, 31);
172         payload = tsbyte.substring(32);
173         starter = TSString2Int(tsbyte, 0, 8);
174         transporterror = TSString2Int(tsbyte, 8, 1);
175         payloadstart = TSString2Int(tsbyte, 9, 1);
176         transport_priority = TSString2Int(tsbyte, 10, 1);
177         PID = TSString2Int(tsbyte, 11, 13);
178         adaptation_field = TSString2Int(tsbyte, 26, 2);
179         continuity_counter = TSString2Int(tsbyte, 28, 4);
180         int adaptation_length_t = TSString2Int(tsbyte, 32, 8);
181         payload = "";
182         if (PID != 8191) {
183             if (adaptation_field == 1) {
184                 pointer_field = TSString2Int(tsbyte, 32, 8);
185                 tsheader = tsbyte.substring(0, 40);
186                 payload = tsbyte.substring(40);
187             } else if (adaptation_field == 3) {
188                 if (adaptation_length_t < 188) {
189                     adaptation_length_t = adaptation_length_t * 8;
190                 }
191                 tsheader = tsbyte.substring(0, 48 + adaptation_length_t);
192                 payload = tsbyte.substring(48 + adaptation_length_t);
193             }
194         }
195         if (PID == 0) {
196             payload = makePAT(tsheader,payload, p_table);
197         }
198         String rets = tsheader + payload;
199         return Stream2Byte(rets);
200     }
201
202     private String makePAT(String tsheader,String payload_temp, int Table) {
203         int tableid;
204         int sectionlength;
205         ArrayList program_number = new ArrayList();
206         tableid = TSString2Int(payload_temp, 0, 8);
207         sectionlength = TSString2Int(payload_temp, 12, 12);//-40-32;
208         int patnum = sectionlength * 8 - 72;
209         String rets = "";//="00000000";//pointer field
210         rets = rets + payload_temp.substring(0, 12);//セクション長の前まで
211         int new_section_length = (2 * 32 + 32 + 40) / 8;
212
213         rets = rets + Int2String(new_section_length, 12);
214         rets = rets + payload_temp.substring(24, 64);//ループ前まで
215         String loop = "";
216         patnum = patnum / 32;
217         String crcnow = payload_temp.substring(64 + 32 * patnum, 64 + 32 * patnum + 32);
218         for (int i = 0; i < patnum; i++) {
219             int[] pat = new int[2];
220             pat[0] = TSString2Int(payload_temp, 64 + 32 * i, 16);
221             pat[1] = TSString2Int(payload_temp, 32 * i + 64 + 19, 13);
222             if (pat[0] == 0) {
223                 loop = loop+payload_temp.substring(64 + 32 * i, 95 + 32 * i + 1);
224             } else if (pat[0] == Table) {
225                 loop = loop + payload_temp.substring(64 + 32 * i, 95 + 32 * i + 1);
226                 i = patnum;
227             }
228         }
229         rets = rets + loop;
230         String s2=tsheader.substring(tsheader.length()-8);
231         s2=s2+rets;
232         String s = getCRC32(s2);
233         rets = rets + s;
234         int ill3 = payload_temp.length() - rets.length();
235         for (int ir = 0; ir < ill3; ir++) {
236             rets = rets + "1";
237         }
238         return rets;
239     }
240     private String getCRC32(String s){
241         return getCRC32(Stream2Byte(s),1);
242     }
243     private String getCRC32(byte[] data,int offset) {
244         // 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
245         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};
246         int[] shift_reg = new int[32];
247         long crc = 0;
248         byte crc32[] = new byte[4];
249
250         // Initialize shift register's to '1'
251         java.util.Arrays.fill(shift_reg, 1);
252
253         // Calculate nr of data bits, summa of bits
254         int nr_bits = (data.length - offset) * 8;
255
256         for (int bit_count = 0, bit_in_byte = 0, data_bit; bit_count < nr_bits; bit_count++) {
257             // Fetch bit from bitstream
258             data_bit = (data[offset] & 0x80 >>> (bit_in_byte++)) != 0 ? 1 : 0;
259
260             if ((bit_in_byte &= 7) == 0) {
261                 offset++;
262             }
263
264             // Perform the shift and modula 2 addition
265             data_bit ^= shift_reg[31];
266
267             for (int i = 31; i > 0; i--) {
268                 shift_reg[i] = g[i] == 1 ? (shift_reg[i - 1] ^ data_bit) : shift_reg[i - 1];
269             }
270
271             shift_reg[0] = data_bit;
272         }
273
274         for (int i = 0; i < 32; i++) {
275             crc = ((crc << 1) | (shift_reg[31 - i]));
276         }
277
278         for (int i = 0; i < 4; i++) {
279             crc32[i] = (byte) (0xFF & (crc >>> ((3 - i) * 8)));
280         }
281         String s=Long2String(crc, 32);
282         return s;
283     }
284
285     private String addzero(int num){
286         StringBuffer s2=new StringBuffer();
287         for (int i2 = 0; i2 < num; i2++) {
288             s2.append("0");// = "0" + s2;
289         }
290         return s2.toString();
291     }
292     private String byte2String(byte[] b) {
293         StringBuffer sb=new StringBuffer(8*b.length);
294         for (int i = 0; i < b.length; i++) {
295             StringBuffer sb2=new StringBuffer(8);
296             sb2.append(Integer.toBinaryString(b[i] & 0xFF));
297             if ((sb2.length() < 8) & (sb2.length() > 0)) {
298                 sb2.insert(0,addzero(8-sb2.length()));
299             }
300             String s3=sb2.toString();
301             sb.append(sb2);
302         }
303         return sb.toString();
304     }
305
306     private String byte2HexString(byte[] b) {
307         String ret = "";
308         for (int i = 0; i < b.length; i++) {
309             ret = ret + Integer.toHexString(b[i] & 0xFF);
310         }
311         return ret;
312     }
313
314     private boolean testCRC(String base, String ans, int begin_n, int end_n) {
315         String tests1 = base.substring(begin_n, end_n);
316         byte[] test1 = Stream2Byte(tests1);
317         int t32 = 0;
318         int begin = begin_n;
319         int end = end_n;
320         byte[] test2 = Stream2Byte(ans);
321         String tests2 = ans;
322         CRC32 crc = new CRC32();
323         crc.reset();
324         crc.update(test1);
325
326         if (crc.getValue() == Long.parseLong(tests2, 2)) {
327             System.out.print("正解が出ました。\n");
328             System.out.print("begin : " + Integer.toString(begin_n) + " end : " + Integer.toString(end_n));
329             
330             return true;
331         }
332         if (Long.parseLong(getCRC32(test1,1), 2) == Long.parseLong(tests2, 2)) {
333             System.out.print("正解が出ました。(getCRC)\n");
334             System.out.print("begin : " + Integer.toString(begin_n) + " end : " + Integer.toString(end_n));
335             return true;
336         }
337         if (Long.parseLong(getCRC32(test1,1), 2) == Long.parseLong(tests2, 2)) {
338             System.out.print("正解が出ました。(getCRC_2)\n");
339             System.out.println("begin : " + Integer.toString(begin_n) + " end : " + Integer.toString(end_n));
340             showPAT(base);
341             System.out.println("begin : " + base.substring(begin_n,begin_n+32));
342             System.out.println("near : " + base.substring(end_n-32, end_n));
343             System.out.println("near2: " + base.substring(end_n, end_n+32));
344             System.out.println("near3: " + base.substring(end_n+32, end_n+64));
345             return true;
346         }
347         return false;
348     }
349
350     private String Int2String(int num, int length) {
351         String ret = Integer.toBinaryString(num);
352         if (ret.length() < length) {
353             int it = length - ret.length();
354             for (int i = 0; i < it; i++) {
355                 ret = "0" + ret;
356             }
357         }
358         return ret;
359     }
360
361     private String Long2String(long num, int length) {
362         String ret = Long.toBinaryString(num);
363         if (ret.length() < length) {
364             int it = length - ret.length();
365             for (int i = 0; i < it; i++) {
366                 ret = "0" + ret;
367             }
368         }
369         return ret;
370     }
371
372     private byte[] Stream2Byte(String ts) {
373         int len = ts.length() - ts.length() % 8;
374         len = len / 8;
375         byte[] ret = new byte[len];
376         for (int i = 0; i < len; i++) {
377             String tet = ts.substring(i * 8, i * 8 + 8);
378             int itt = TSString2Int(tet, 0, 8);
379             ret[i] = (byte) itt;
380         }
381         return ret;
382     }
383
384     public ArrayList getPAT() {
385         return pat_list_all;
386     }
387
388     public void setPAT(ArrayList pat) {
389         pat_list_now = pat;
390         pat_list_all = pat;
391     }
392
393     public ArrayList getPMT() {
394         return pmt_list;
395     }
396
397     public void setPMT(ArrayList pmt) {
398         pmt_list = pmt;
399     }
400
401     public int getPID() {
402         return PID;
403     }
404
405     public void showPAT(String ts) {
406         System.out.println("先頭:" + ts.substring(0, 8));
407         System.out.println("" + ts.substring(8, 11));
408         System.out.println("PID:" + ts.substring(11, 24));
409         System.out.println("" + ts.substring(24, 32));
410         System.out.println("Adap_Len:" + ts.substring(32, 40));
411         System.out.println("TableID:" + ts.substring(40, 48));
412         System.out.println("" + ts.substring(48, 52));
413         System.out.println("len : " + ts.substring(52, 64) + "//" + Integer.toString(Integer.parseInt(ts.substring(52, 64), 2)));
414         System.out.println("TS ID:" + ts.substring(64, 80));
415         System.out.println("11:" + ts.substring(80, 82));
416         System.out.println("" + ts.substring(82, 104));
417         for (int i = 0; i < 10; i++) {
418             System.out.println(Integer.toString(i) + " : " + ts.substring(104 + 32 * i, 136 + 32 * i));
419         }
420         System.out.println("Length:" + Integer.toString(ts.length()));
421
422
423
424     }
425 }