3 import java.util.ArrayList;
4 import java.util.zip.CRC32;
5 import jtssplitter.data.PATData;
6 import jtssplitter.data.PMTData;
8 * To change this template, choose Tools | Templates
9 * and open the template in the editor.
14 * @author Administrator
16 public class Mpeg2TSPacket_String {
19 public String payload;
20 public String adaptation;
21 //private ArrayList<TsDate> date=new ArrayList<TsDate>();
22 //date.add(new TsDate("Starter"))
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;
46 private int staffing_byte;//
48 public Mpeg2TSPacket_String() {
50 public int getPIDFirst(byte[] ts){
54 //String s=byte2String(b);
55 //s=s.substring(3,16);
56 return Integer.parseInt(byte2String(b).substring(3,16),2);
58 public void readTS(byte[] ts) {
60 * 188バイトのtsから読み出したbyteを与える
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);
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;
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);
89 pat_list_now =readPAT(payload);
90 pat_list_all.addAll(pat_list_now);
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));
100 private ArrayList<PATData> readPAT(String payload_temp) {
102 * payloadの文字列を入力して[intテーブル,int PID]のArrayListを返す。
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);
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++) {
123 payload_temp = stest;
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);
131 return program_number;
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);
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;
150 cur_point = cur_point + 40 + es_length * 8;
151 if (cur_point > section_length * 8) {
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);
164 public byte[] splitPAT(byte[] ts, int p_table) {
167 * p_tableで指定された番組テーブルのみを取り出すPATを作る。
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);
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;
191 tsheader = tsbyte.substring(0, 48 + adaptation_length_t);
192 payload = tsbyte.substring(48 + adaptation_length_t);
196 payload = makePAT(tsheader,payload, p_table);
198 String rets = tsheader + payload;
199 return Stream2Byte(rets);
202 private String makePAT(String tsheader,String payload_temp, int Table) {
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;
213 rets = rets + Int2String(new_section_length, 12);
214 rets = rets + payload_temp.substring(24, 64);//ループ前まで
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);
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);
230 String s2=tsheader.substring(tsheader.length()-8);
232 String s = getCRC32(s2);
234 int ill3 = payload_temp.length() - rets.length();
235 for (int ir = 0; ir < ill3; ir++) {
240 private String getCRC32(String s){
241 return getCRC32(Stream2Byte(s),1);
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];
248 byte crc32[] = new byte[4];
250 // Initialize shift register's to '1'
251 java.util.Arrays.fill(shift_reg, 1);
253 // Calculate nr of data bits, summa of bits
254 int nr_bits = (data.length - offset) * 8;
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;
260 if ((bit_in_byte &= 7) == 0) {
264 // Perform the shift and modula 2 addition
265 data_bit ^= shift_reg[31];
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];
271 shift_reg[0] = data_bit;
274 for (int i = 0; i < 32; i++) {
275 crc = ((crc << 1) | (shift_reg[31 - i]));
278 for (int i = 0; i < 4; i++) {
279 crc32[i] = (byte) (0xFF & (crc >>> ((3 - i) * 8)));
281 String s=Long2String(crc, 32);
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;
290 return s2.toString();
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()));
300 String s3=sb2.toString();
303 return sb.toString();
306 private String byte2HexString(byte[] b) {
308 for (int i = 0; i < b.length; i++) {
309 ret = ret + Integer.toHexString(b[i] & 0xFF);
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);
320 byte[] test2 = Stream2Byte(ans);
322 CRC32 crc = new CRC32();
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));
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));
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));
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));
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++) {
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++) {
372 private byte[] Stream2Byte(String ts) {
373 int len = ts.length() - ts.length() % 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);
384 public ArrayList getPAT() {
388 public void setPAT(ArrayList pat) {
393 public ArrayList getPMT() {
397 public void setPMT(ArrayList pmt) {
401 public int getPID() {
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));
420 System.out.println("Length:" + Integer.toString(ts.length()));