import java.util.ArrayList;
import java.util.zip.CRC32;
+import jtssplitter.data.PATData;
+import jtssplitter.data.PMTData;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*
* @author Administrator
*/
-public class Mpeg2TSPacket {
+public class Mpeg2TSPacket_String {
public String header;
public String payload;
private int random_access;//1bit ランダムアクセスの開始場所となる
private int ES_priority;//1bit プライオリティ
private int five_flag;//5bit
- private ArrayList pat_list_now = new ArrayList();//[0]:番組番号 [1]:PMT PID
- private ArrayList pat_list_all = new ArrayList();
- private ArrayList pmt_list = new ArrayList();//[0]番組番号 [1]テーブルID
+ private ArrayList<PATData> pat_list_now = new ArrayList<PATData>();//[0]:番組番号 [1]:PMT PID
+ private ArrayList<PATData> pat_list_all = new ArrayList<PATData>();
+ private ArrayList<PMTData> pmt_list = new ArrayList<PMTData>();//[0]番組番号 [1]テーブルID
private int pointer_field;//8bit adaptation fieldの次?
private String payload_s;
//ここからオプションフィールド
//ここまでオプションフィールド
private int staffing_byte;//
- public Mpeg2TSPacket() {
+ public Mpeg2TSPacket_String() {
+ }
+ public int getPIDFirst(byte[] ts){
+ byte[] b=new byte[2];
+ b[0]=ts[1];
+ b[1]=ts[2];
+ //String s=byte2String(b);
+ //s=s.substring(3,16);
+ return Integer.parseInt(byte2String(b).substring(3,16),2);
}
-
public void readTS(byte[] ts) {
/**
* 188バイトのtsから読み出したbyteを与える
}
}
if (PID == 0) {
- //System.out.print("Pointer field ? : "+pointer_field+"\n");
- pat_list_now = readPAT(payload);
+ pat_list_now =readPAT(payload);
pat_list_all.addAll(pat_list_now);
- //System.out.print("ここから変更済み\n");
- //readPAT(changePAT(payload));
}
for (int i = 0; i < pat_list_now.size(); i++) {
- int[] pid_temp = (int[]) pat_list_now.get(i);
- if ((PID == pid_temp[1]) && (PID != 0)) {
- //System.out.println("PMT PID : 0x"+Integer.toHexString(PID));
- pmt_list.addAll(readPMT(payload, pid_temp[0]));
+ if ((PID == pat_list_now.get(i).PID) && (PID != 0)) {
+ pmt_list.addAll(readPMT(payload, pat_list_now.get(i).Program_TABLE));
}
}
tsbyte = "";
}
- private ArrayList readPAT(String payload_temp) {
+ private ArrayList<PATData> readPAT(String payload_temp) {
/*
* payloadの文字列を入力して[intテーブル,int PID]のArrayListを返す。
*/
ArrayList program_number = new ArrayList();
tableid = TSString2Int(payload_temp, 0, 8);
sectionlength = TSString2Int(payload_temp, 12, 12);//-40-32;
- //int patnum=sectionlength*8-32;
int patnum = sectionlength * 8 - 72;
patnum = patnum / 32;
byte[] test = Stream2Byte(payload_temp);
}
payload_temp = stest;
int nowbit = 64;
- //System.out.print(Integer.toString(patnum)+"\n");
for (int i = 0; i < patnum; i++) {
- //System.out.print(payload_temp.substring(64+32*i,95+32*i+1)+"\n");
- int[] pat = new int[2];
- pat[0] = TSString2Int(payload_temp, 64 + 32 * i, 16);
- pat[1] = TSString2Int(payload_temp, 32 * i + 64 + 19, 13);
- //System.out.print("TABLE : "+Integer.toString(pat[0])+"\n");
- //System.out.print("PMT PID : "+Integer.toString(pat[1])+"\n");
- program_number.add(pat);
+ 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);
}
- //System.out.print("TABLEID : "+Integer.toString(tableid)+" LENGTH = "+Integer.toString(sectionlength)+"\n");
- //System.out.print(Integer.toBinaryString(TSString2Int(payload_temp,65,32))+"\n");
return program_number;
}
- private ArrayList readPMT(String payload_temp, int PAT_TABLE) {
- ArrayList pmt_t = new ArrayList();
+ private ArrayList<PMTData> readPMT(String payload_temp, int PAT_TABLE) {
+ ArrayList<PMTData> pmt_t = new ArrayList<PMTData>();
int tableid = TSString2Int(payload_temp, 0, 8);
int section_length = TSString2Int(payload_temp, 12, 12);
int program_info_length = TSString2Int(payload_temp, 84, 12);
int pmt_stream_type = TSString2Int(payload_temp, cur_point, 8);
int elementary_PID = TSString2Int(payload_temp, cur_point + 11, 13);
int es_length = TSString2Int(payload_temp, cur_point + 28, 12);
- int[] pmt = new int[3];
- pmt[0] = pmt_stream_type;
- pmt[1] = elementary_PID;
- pmt[2] = PAT_TABLE;
- pmt_t.add(pmt);
- System.out.print("Table : 0x" + Integer.toHexString(tableid) + " | Stream_type : 0x" + Integer.toHexString(pmt_stream_type) + " |elementary PID : 0x" + Integer.toHexString(elementary_PID) + "\n");
+ PMTData pmtd=new PMTData();
+ pmtd.Stream_Type=pmt_stream_type;
+ pmtd.Program_Table=PAT_TABLE;
+ pmtd.Elementary_PID=elementary_PID;
+ pmt_t.add(pmtd);
cur_point = cur_point + 40 + es_length * 8;
if (cur_point > section_length * 8) {
end = true;
}
private int TSString2Int(String s, int begin, int length) {
- //System.out.print(Integer.toString(begin)+"//"+Integer.toString(length)+"\n");
String st = s.substring(begin, begin + length);
int i = Integer.parseInt(st, 2);
return i;
*
* p_tableで指定された番組テーブルのみを取り出すPATを作る。
*/
- /*String tsbyte=new String();
- for (int i=0;i<188;i++){
- int it=ts[i]& 0xFF;
- String s=Integer.toBinaryString(it);
- if ((s.length()<8)&(s.length()>0)){
- for (int i2=s.length();i2<8;i2++){
- s="0"+s;
- }
- }
- tsbyte=tsbyte+s;
- }*/
String tsbyte = byte2String(ts);
- //System.out.println("Base");
- //(tsbyte);
String tsheader = "";
header = tsbyte.substring(0, 31);
payload = tsbyte.substring(32);
}
}
if (PID == 0) {
- //System.out.print("Pointer field ? : "+pointer_field+"\n");
payload = makePAT(tsheader,payload, p_table);
- //System.out.print("ここから変更済み\n");
- //readPAT(changePAT(payload));
}
String rets = tsheader + payload;
- //System.out.println("New");
- //showPAT(rets);
return Stream2Byte(rets);
}
String rets = "";//="00000000";//pointer field
rets = rets + payload_temp.substring(0, 12);//セクション長の前まで
int new_section_length = (2 * 32 + 32 + 40) / 8;
- //int new_section_length = (5 * 32 + 32 + 40) / 8;
rets = rets + Int2String(new_section_length, 12);
rets = rets + payload_temp.substring(24, 64);//ループ前まで
patnum = patnum / 32;
String crcnow = payload_temp.substring(64 + 32 * patnum, 64 + 32 * patnum + 32);
for (int i = 0; i < patnum; i++) {
- //System.out.print(payload_temp.substring(64+32*i,95+32*i+1)+"\n");
int[] pat = new int[2];
pat[0] = TSString2Int(payload_temp, 64 + 32 * i, 16);
pat[1] = TSString2Int(payload_temp, 32 * i + 64 + 19, 13);
}
}
rets = rets + loop;
- //rets=rets+payload_temp.substring(64,64+32*patnum);
- //rets=payload_temp.substring(0,64+(32*patnum));
- //CRC32 crc = new CRC32();
String s2=tsheader.substring(tsheader.length()-8);
s2=s2+rets;
- //byte[] sb = Stream2Byte(s2);
- //crc.reset();
- //crc.update(sb);
String s = getCRC32(s2);
rets = rets + s;
-
- ////////////////////
-
- //rets=header+payload_temp.substring(0,64+(32*patnum));
- //String st=header.substring(header.length()-8)+payload_temp.substring(0,64+(32*patnum));
- //System.out.print("Collect0:" + crcnow + "\n");
- //System.out.print("Now0:" + getCRC32(st)+ "\n");
- //sb = Stream2Byte(tsheader + (payload_temp.substring(0, 64 + (32 * patnum))));
- /*
- crc.reset();
- crc.update(sb);
- long crcl = crc.getValue();
-
- System.out.print("Now :" + Long2String(crc.getValue(), 32) + "\n");
- //System.out.print("New3:"+s+"\n");
- //
- //
-
- String sss = tsheader + payload_temp;
- //System.out.print("Data:\n"+sss);
- for (int ib = 0; ib < sss.length() - 1; ib++) {
- for (int ie = ib + 1; ie < sss.length(); ie++) {
- if (testCRC(sss, crcnow, ib, ie)) {
- ib = sss.length();
- ie = sss.length();
-
- }
- //System.out.println(Integer.toString(ib)+":"+Integer.toString(ie));
- }
- }
-
- */
- ////
int ill3 = payload_temp.length() - rets.length();
for (int ir = 0; ir < ill3; ir++) {
rets = rets + "1";
}
- //showPAT(tsheader+rets);
return rets;
}
private String getCRC32(String s){
}
private String byte2String(byte[] b) {
StringBuffer sb=new StringBuffer(8*b.length);
- //String ret = "";
for (int i = 0; i < b.length; i++) {
StringBuffer sb2=new StringBuffer(8);
- //String s = Integer.toBinaryString(b[i] & 0xFF);
sb2.append(Integer.toBinaryString(b[i] & 0xFF));
- //if ((s.length() < 8) & (s.length() > 0)) {
- /*String s2="";
- for (int i2 = s.length(); i2 < 8; i2++) {
- s2 = "0" + s2;
- }
- s=s2+s;
- */
- //s=addzero(8-s.length())+s;
- //sb2.append(addzero(8-s.length()));
- //}
if ((sb2.length() < 8) & (sb2.length() > 0)) {
sb2.insert(0,addzero(8-sb2.length()));
}
String s3=sb2.toString();
- // ret = ret + s ;
sb.append(sb2);
}
- //if (!ret.matches(sb.toString())){
- // System.out.println("MisMatch");
- //}
- //return ret;
return sb.toString();
- /*
- *
- *StringBuffer sb= new StringBuffer();
- int cnt= b.length;
- for(int i= 0; i< cnt; i++){
- sb.append(Integer.toHexString( (b[i]>> 4) & 0x0F ) );
- sb.append(Integer.toHexString( b[i] & 0x0F ) );
- }
- return sb.toString();
- *
- *
- *
- */
- //StringBuffer sb=new StringBuffer();
- //int cnt=b.length;
- //for (int i=0;i<cnt;i++){
- // sb.append(Integer.toBinaryString(b[i] & 0xFF))
- //}
}
private String byte2HexString(byte[] b) {