OSDN Git Service

Ts Split Software Alpha(Not usable yet).
[rec10/rec10-git.git] / jTsSplitter / trunk / src / jtssplitter / Mpeg2TSPacket.java
1 package jtssplitter;
2 import java.util.ArrayList;
3 import java.util.zip.CRC32;
4 /*
5  * To change this template, choose Tools | Templates
6  * and open the template in the editor.
7  */
8
9 /**
10  *
11  * @author Administrator
12  */
13 public class Mpeg2TSPacket {
14     public String header;
15     public String payload;
16     public String adaptation;
17     //private ArrayList<TsDate> date=new ArrayList<TsDate>();
18     //date.add(new TsDate("Starter"))
19     public int type;//
20
21     private int starter;//0-7
22     private int transporterror;//本TSパケットの誤りを示す 1bit 8
23     private int payloadstart;//セクションの先頭バイトが入っているかどうか1bit 9
24     private int transport_priority;//1bit 10
25     private int PID;//tsパケットの種類 13bit 11-23
26     private int transport_scrambled;//2bit 00is " not scrambled" 24-25
27     private int adaptation_field;//2bit 26-27 01:adaptation fieldなしでおk 10は絶対いる 11はペイロードはアダプテーションに続く00は予約
28     private int continuity_counter;//連続性(PIDごとの通し番号) 4bit 28-31
29     //ここからアダプテーションフィールド(最後まで)
30     private int adaptation_length;//8bit 32-39
31     private int discontinuity;//1bit
32     private int random_access;//1bit ランダムアクセスの開始場所となる
33     private int ES_priority;//1bit プライオリティ
34     private int five_flag;//5bit
35     private ArrayList pat_list_now=new ArrayList();//[0]:番組番号 [1]:PMT PID
36     private ArrayList pat_list_all=new ArrayList();
37     private ArrayList pmt_list=new ArrayList();//[0]番組番号 [1]テーブルID
38     private int pointer_field;//8bit adaptation fieldの次?
39
40     private String payload_s;
41     //ここからオプションフィールド
42     //PCR42 OPCR42 
43     //ここまでオプションフィールド
44     private int staffing_byte;//
45     public Mpeg2TSPacket(){
46     }
47     public void readTS(byte[] ts){
48         /**
49          * 188バイトのtsから読み出したbyteを与える
50          */
51         String tsbyte=new String();
52         for (int i=0;i<188;i++){
53             int it=ts[i]& 0xFF;
54             String s=Integer.toBinaryString(it);
55             if ((s.length()<8)&(s.length()>0)){
56                     for (int i2=s.length();i2<8;i2++){
57                         s="0"+s;
58                     }
59             }
60             tsbyte=tsbyte+s;
61         }
62         header=tsbyte.substring(0,31);
63         payload=tsbyte.substring(32);
64         starter=TSString2Int(tsbyte,0,8);
65         transporterror=TSString2Int(tsbyte,8,1);
66         payloadstart=TSString2Int(tsbyte,9,1);
67         transport_priority=TSString2Int(tsbyte,10,1);
68         PID=TSString2Int(tsbyte,11,13);
69         adaptation_field=TSString2Int(tsbyte, 26, 2);
70         continuity_counter=TSString2Int(tsbyte, 28, 4);
71         payload="";
72         if (PID!=8191){
73             if (adaptation_field==1){
74                 pointer_field=TSString2Int(tsbyte, 32, 8);
75                 payload=tsbyte.substring(40);
76             }else if (adaptation_field==3){
77                 adaptation_length=TSString2Int(tsbyte,32,8);
78                 if (adaptation_length<188){
79                     adaptation_length=adaptation_length*8;
80                 }
81                 adaptation=tsbyte.substring(32,40+adaptation_length);
82                 pointer_field=TSString2Int(tsbyte, 40+adaptation_length, 8);
83                 payload=tsbyte.substring(48+adaptation_length);
84             }
85         }
86         if (PID==0){
87             //System.out.print("Pointer field ? : "+pointer_field+"\n");
88             pat_list_now=readPAT(payload);
89             pat_list_all.addAll(pat_list_now);
90             //System.out.print("ここから変更済み\n");
91             //readPAT(changePAT(payload));
92         }
93         for (int i=0;i<pat_list_now.size();i++){
94             int[] pid_temp=(int[])pat_list_now.get(i);
95             if ((PID==pid_temp[1])&&(PID!=0)){
96                 //System.out.println("PMT PID : 0x"+Integer.toHexString(PID));
97
98                 pmt_list.addAll(readPMT(payload,pid_temp[0]));
99             }
100         }
101         tsbyte="";
102     }
103     private ArrayList readPAT(String payload_temp){
104         /*
105          * payloadの文字列を入力して[intテーブル,int PID]のArrayListを返す。
106          */
107         int tableid;
108         int sectionlength;
109         ArrayList program_number=new ArrayList();
110         tableid=TSString2Int(payload_temp,0,8);
111         sectionlength=TSString2Int(payload_temp,12,12);//-40-32;
112         //int patnum=sectionlength*8-32;
113         int patnum=sectionlength*8-72;
114         patnum=patnum/32;
115         byte[] test=Stream2Byte(payload_temp);
116         String stest="";
117         for (int ij=0;ij<test.length;ij++){
118             int it=test[ij]& 0xFF;
119             String s=Integer.toBinaryString(it);
120             if (s.length()<8){
121                 for (int i2=s.length();i2<8;i2++){
122                     s="0"+s;
123                 }
124             }
125             stest=stest+s;
126         }
127         payload_temp=stest;
128         int nowbit=64;
129             //System.out.print(Integer.toString(patnum)+"\n");
130         for (int i=0;i<patnum;i++){
131             //System.out.print(payload_temp.substring(64+32*i,95+32*i+1)+"\n");
132             int[] pat=new int[2];
133             pat[0]=TSString2Int(payload_temp,64+32*i,16);
134             pat[1]=TSString2Int(payload_temp,32*i+64+19, 13);
135             //System.out.print("TABLE : "+Integer.toString(pat[0])+"\n");
136             //System.out.print("PMT PID : "+Integer.toString(pat[1])+"\n");
137             program_number.add(pat);
138         }
139         //System.out.print("TABLEID : "+Integer.toString(tableid)+" LENGTH = "+Integer.toString(sectionlength)+"\n");
140         //System.out.print(Integer.toBinaryString(TSString2Int(payload_temp,65,32))+"\n");
141         return program_number;
142     }
143     private ArrayList readPMT(String payload_temp,int PAT_TABLE){
144         ArrayList pmt_t=new ArrayList();
145         int tableid=TSString2Int(payload_temp,0,8);
146         int section_length=TSString2Int(payload_temp,12,12);
147         int program_info_length=TSString2Int(payload_temp,84,12);
148         boolean end=false;
149         int cur_point=96+program_info_length*8;
150         while (end!=true){
151             int pmt_stream_type=TSString2Int(payload_temp,cur_point,8);
152             int elementary_PID=TSString2Int(payload_temp,cur_point+11,13);
153             int es_length=TSString2Int(payload_temp,cur_point+28,12);
154             int[] pmt=new int[3];
155             pmt[0]=pmt_stream_type;
156             pmt[1]=elementary_PID;
157             pmt[2]=PAT_TABLE;
158             pmt_t.add(pmt);
159             System.out.print("Table : 0x"+Integer.toHexString(tableid)+" | Stream_type : 0x"+Integer.toHexString(pmt_stream_type)+" |elementary PID : 0x"+Integer.toHexString(elementary_PID)+"\n");
160             cur_point=cur_point+40+es_length*8;
161             if (cur_point>section_length*8){
162                 end=true;
163             }
164         }
165         return pmt_t;
166     }
167     private int TSString2Int(String s,int begin,int length){
168         //System.out.print(Integer.toString(begin)+"//"+Integer.toString(length)+"\n");
169         String st=s.substring(begin,begin+length);
170         int i=Integer.parseInt(st, 2);
171         return i;
172     }
173     public byte[] splitPAT(byte[] ts,int p_table){
174         /**
175          * 
176          * p_tableで指定された番組テーブルのみを取り出すPATを作る。
177          */
178         String tsbyte=new String();
179         for (int i=0;i<188;i++){
180             int it=ts[i]& 0xFF;
181             String s=Integer.toBinaryString(it);
182             if ((s.length()<8)&(s.length()>0)){
183                     for (int i2=s.length();i2<8;i2++){
184                         s="0"+s;
185                     }
186             }
187             tsbyte=tsbyte+s;
188         }
189         String tsheader="";
190         header=tsbyte.substring(0,31);
191         payload=tsbyte.substring(32);
192         starter=TSString2Int(tsbyte,0,8);
193         transporterror=TSString2Int(tsbyte,8,1);
194         payloadstart=TSString2Int(tsbyte,9,1);
195         transport_priority=TSString2Int(tsbyte,10,1);
196         PID=TSString2Int(tsbyte,11,13);
197         adaptation_field=TSString2Int(tsbyte, 26, 2);
198         continuity_counter=TSString2Int(tsbyte, 28, 4);
199         payload="";
200         if (PID!=8191){
201             if (adaptation_field==1){
202                 pointer_field=TSString2Int(tsbyte, 32, 8);
203                 tsheader=tsbyte.substring(0,40);
204                 payload=tsbyte.substring(40);
205             }else if (adaptation_field==3){
206                 int al=TSString2Int(tsbyte,32,8);
207                 if (al<188){
208                     al=al*8;
209                 }
210                 tsheader=tsbyte.substring(0,40);
211                 payload=tsbyte.substring(48+al);
212             }
213         }
214         if (PID==0){
215             //System.out.print("Pointer field ? : "+pointer_field+"\n");
216             payload=makePAT(payload, p_table);
217             //System.out.print("ここから変更済み\n");
218             //readPAT(changePAT(payload));
219         }
220         String rets = tsheader+payload;
221         return Stream2Byte(rets);
222     }
223     private String makePAT(String payload_temp,int Table){
224         int tableid;
225         int sectionlength;
226         ArrayList program_number=new ArrayList();
227         tableid=TSString2Int(payload_temp,0,8);
228         sectionlength=TSString2Int(payload_temp,12,12);//-40-32;
229         int patnum=sectionlength*8-72;
230         String rets=payload_temp.substring(0,12);//セクション長の前まで
231         int new_section_length=(2*32+32+40)/8;
232         rets=rets+Int2String(new_section_length,12);
233         rets=rets+payload_temp.substring(24,64);//ループ前まで
234         String loop = "";
235         patnum=patnum/32;
236         for (int i=0;i<patnum;i++){
237             //System.out.print(payload_temp.substring(64+32*i,95+32*i+1)+"\n");
238             int[] pat=new int[2];
239             pat[0]=TSString2Int(payload_temp,64+32*i,16);
240             pat[1]=TSString2Int(payload_temp,32*i+64+19, 13);
241             if (pat[0]==0){
242                 loop=payload_temp.substring(64+32*i,95+32*i+1);
243             }else if (pat[0]==Table){
244                 loop=loop+payload_temp.substring(64+32*i,95+32*i+1);
245                 i=patnum;
246             }
247         }
248         rets=rets+loop;
249         CRC32 crc=new CRC32();
250         for (int ipt=0;ipt*8+7<rets.length();ipt++){
251             String st=rets.substring(8*ipt,8*ipt+8);
252             int tt2=Integer.parseInt(st,2);
253             crc.update(tt2);
254         }
255         rets=rets+Long2String(crc.getValue(),32);
256         return rets;
257     }
258     private String Int2String(int num,int length){
259         String ret=Integer.toBinaryString(num);
260         if (ret.length()<length){
261             int it=length-ret.length();
262             for (int i=0;i<it;i++){
263                 ret="0"+ret;
264             }
265         }
266         return ret;
267     }
268     private String Long2String(long num,int length){
269         String ret=Long.toBinaryString(num);
270         if (ret.length()<length){
271             for (int i=0;i<length-ret.length();i++){
272                 ret="0"+ret;
273             }
274         }
275         return ret;
276     }
277     private byte[] Stream2Byte(String ts){
278         int len=ts.length()-ts.length()%8;
279         len=len/8;
280         byte[] ret=new byte[len];
281         for (int i=0;i<len;i++){
282             String tet=ts.substring(i*8,i*8+8);
283             int itt=TSString2Int(tet,0,8);
284             ret[i]=(byte)itt;
285         }
286         return ret;
287     }
288     public ArrayList getPAT(){
289         return pat_list_all;
290     }
291     public void setPAT(ArrayList pat){
292         pat_list_now=pat;
293         pat_list_all=pat;
294     }
295     public ArrayList getPMT(){
296         return pmt_list;
297     }
298     public void setPMT(ArrayList pmt){
299         pmt_list=pmt;
300     }
301     public int getPID(){
302         return PID;
303     }
304 }