2 import java.util.ArrayList;
3 import java.util.zip.CRC32;
5 * To change this template, choose Tools | Templates
6 * and open the template in the editor.
11 * @author Administrator
13 public class Mpeg2TSPacket {
15 public String payload;
16 public String adaptation;
17 //private ArrayList<TsDate> date=new ArrayList<TsDate>();
18 //date.add(new TsDate("Starter"))
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の次?
40 private String payload_s;
44 private int staffing_byte;//
45 public Mpeg2TSPacket(){
47 public void readTS(byte[] ts){
49 * 188バイトのtsから読み出したbyteを与える
51 String tsbyte=new String();
52 for (int i=0;i<188;i++){
54 String s=Integer.toBinaryString(it);
55 if ((s.length()<8)&(s.length()>0)){
56 for (int i2=s.length();i2<8;i2++){
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);
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;
81 adaptation=tsbyte.substring(32,40+adaptation_length);
82 pointer_field=TSString2Int(tsbyte, 40+adaptation_length, 8);
83 payload=tsbyte.substring(48+adaptation_length);
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));
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));
98 pmt_list.addAll(readPMT(payload,pid_temp[0]));
103 private ArrayList readPAT(String payload_temp){
105 * payloadの文字列を入力して[intテーブル,int PID]のArrayListを返す。
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;
115 byte[] test=Stream2Byte(payload_temp);
117 for (int ij=0;ij<test.length;ij++){
118 int it=test[ij]& 0xFF;
119 String s=Integer.toBinaryString(it);
121 for (int i2=s.length();i2<8;i2++){
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);
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;
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);
149 int cur_point=96+program_info_length*8;
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;
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){
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);
173 public byte[] splitPAT(byte[] ts,int p_table){
176 * p_tableで指定された番組テーブルのみを取り出すPATを作る。
178 String tsbyte=new String();
179 for (int i=0;i<188;i++){
181 String s=Integer.toBinaryString(it);
182 if ((s.length()<8)&(s.length()>0)){
183 for (int i2=s.length();i2<8;i2++){
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);
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);
210 tsheader=tsbyte.substring(0,40);
211 payload=tsbyte.substring(48+al);
215 //System.out.print("Pointer field ? : "+pointer_field+"\n");
216 payload=makePAT(payload, p_table);
217 //System.out.print("ここから変更済み\n");
218 //readPAT(changePAT(payload));
220 String rets = tsheader+payload;
221 return Stream2Byte(rets);
223 private String makePAT(String payload_temp,int Table){
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);//ループ前まで
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);
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);
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);
255 rets=rets+Long2String(crc.getValue(),32);
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++){
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++){
277 private byte[] Stream2Byte(String ts){
278 int len=ts.length()-ts.length()%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);
288 public ArrayList getPAT(){
291 public void setPAT(ArrayList pat){
295 public ArrayList getPMT(){
298 public void setPMT(ArrayList pmt){