package jtssplitter;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import java.util.zip.CRC32;
import jtssplitter.data.PATData;
import jtssplitter.data.PMTData;
import jtssplitter.data.Descriptor;
import jtssplitter.data.EITData;
import jtssplitter.data.Video_stream_descriptor;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
public class Mpeg2TSPacket {
//TSのヘッダーを格納する
+
public String header;
public String payload;
public String adaptation;
- public byte[] bPAT_payload=null;
+ public byte[] header_byte;
+ public byte[] payload_byte;
+ public byte[] adaptation_byte;
+ public byte[] bPAT_payload = null;
//private ArrayList<TsDate> date=new ArrayList<TsDate>();
//date.add(new TsDate("Starter"))
public int type;//
public Mpeg2TSPacket() {
}
- public int getPIDFirst(byte[] ts){
- byte[] b=new byte[2];
- b[0]=ts[1];
- b[1]=ts[2];
- //String s=byte2String2(b);
- //s=s.substring(3,16);
- return Integer.parseInt(byte2String2(b).substring(3,16),2);
+ public int getPIDFirst(byte[] ts) {
+ byte[] b = new byte[2];
+ b[0] = ts[1];
+ b[1] = ts[2];
+ String s=byte2String2(b);
+ s=s.substring(3,16);
+ return Integer.parseInt(byte2String2(b).substring(3, 16), 2);
+ }
+ public int getPIDFirst_byte(byte[] ts) {
+ calc cal=new calc();
+ byte[] b = new byte[2];
+ b[0] = ts[1];
+ b[1] = ts[2];
+ return cal.byte2int(b,3,13);
+ //return cal.byte2int(ts,11,13);
}
+
public void readTS(byte[] ts) {
/**
* 188バイトのtsから読み出したbyteを与える
payload = tsbyte.substring(40);
} else if (adaptation_field == 3) {
adaptation_length = TSString2Int(tsbyte, 32, 8);
- if ((adaptation_length < 184)&((tsbyte.length()-adaptation_length*8)>48)) {
+ if ((adaptation_length < 184) & ((tsbyte.length() - adaptation_length * 8) > 48)) {
adaptation_length = adaptation_length * 8;
}
adaptation = tsbyte.substring(32, 40 + adaptation_length);
}
}
if (PID == 0) {
- pat_list_now =readPAT(payload);
+ pat_list_now = readPAT(payload);
pat_list_all.addAll(pat_list_now);
}
for (int i = 0; i < pat_list_now.size(); i++) {
tsbyte = "";
}
+ public void readTS_byte(byte[] ts) {
+ /**
+ * 188バイトのtsから読み出したbyteを与える
+ */
+ calc cal = new calc();
+ String tsbyte = byte2String2(ts);
+ //header = tsbyte.substring(0, 31);
+ payload = tsbyte.substring(32);
+ //starter = TSString2Int(tsbyte, 0, 8);
+ //transporterror = TSString2Int(tsbyte, 8, 1);
+ //payloadstart = TSString2Int(tsbyte, 9, 1);
+ //transport_priority = TSString2Int(tsbyte, 10, 1);
+ //PID = TSString2Int(tsbyte, 11, 13);
+ PID = cal.byte2int(ts, 11, 13);
+ adaptation_field = cal.byte2int(ts, 26, 2);
+ //continuity_counter = TSString2Int(tsbyte, 28, 4);
+ payload = "";
+ if (PID != 8191) {
+ if (adaptation_field == 1) {
+ pointer_field = cal.byte2int(ts, 32, 8);
+ payload_byte = cal.byte2subbyte(ts, 5, ts.length - 5);
+ } else if (adaptation_field == 3) {
+ adaptation_length = cal.byte2int(ts, 32, 8);
+ if ((adaptation_length < 184) & ((ts.length * 8 - adaptation_length * 8) > 48)) {
+ adaptation_length = adaptation_length * 8;
+ }
+ adaptation_byte = cal.byte2subbyte(ts, 4, 1 + adaptation_length / 8);
+ payload_byte = cal.byte2subbyte(ts, 6 + adaptation_length / 8, ts.length - 6 - adaptation_length / 8);
+ pointer_field = cal.byte2int(ts, 40 + adaptation_length, 8);
+ }
+ }
+ if (payload_byte!=null){
+ if (PID == 0) {
+ pat_list_now = readPAT_byte(payload_byte);
+ pat_list_all.addAll(pat_list_now);
+ }
+ for (int i = 0; i < pat_list_now.size(); i++) {
+ if ((PID == pat_list_now.get(i).PID) && (PID != 0)) {
+ pmt_list.addAll(readPMT_byte(payload_byte, pat_list_now.get(i).Program_TABLE));
+ }
+ }
+ }
+ tsbyte = "";
+ }
+
private ArrayList<PATData> readPAT(String payload_temp) {
/*
* payloadの文字列を入力して[intテーブル,int PID]のArrayListを返す。
payload_temp = stest;
int nowbit = 64;
for (int i = 0; i < patnum; i++) {
- PATData patd=new PATData();
- patd.Program_TABLE=TSString2Int(payload_temp, 64 + 32 * i, 16);
- patd.PID=TSString2Int(payload_temp, 32 * i + 64 + 19, 13);
+ 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);
+ }
+ return program_number;
+ }
+
+ private ArrayList<PATData> readPAT_byte(byte[] payload_temp) {
+ /*
+ * payloadの文字列を入力して[intテーブル,int PID]のArrayListを返す。
+ */
+ int tableid;
+ int sectionlength;
+ calc cal = new calc();
+ ArrayList program_number = new ArrayList();
+ tableid = cal.byte2int(payload_temp, 0, 8);
+ sectionlength = cal.byte2int(payload_temp, 12, 12);//-40-32;
+ int patnum = sectionlength * 8 - 72;
+ patnum = patnum / 32;
+ for (int i = 0; i < patnum; i++) {
+ PATData patd = new PATData();
+ patd.Program_TABLE = cal.byte2int(payload_temp, 64 + 32 * i, 16);
+ patd.PID = cal.byte2int(payload_temp, 32 * i + 64 + 19, 13);
program_number.add(patd);
}
return program_number;
int program_info_length = TSString2Int(payload_temp, 84, 12);
boolean end = false;
int cur_point = 96 + program_info_length * 8;
- if (cur_point>section_length*8){
- end=true;
+ if (cur_point > section_length * 8) {
+ end = true;
}
while (end != true) {
- String gs=payload_temp.substring(cur_point+8,cur_point+11);
- if (gs.matches("111")&&payload_temp.length()>cur_point+40){
+ String gs = payload_temp.substring(cur_point + 8, cur_point + 11);
+ if (gs.matches("111") && payload_temp.length() > cur_point + 40) {
int pmt_stream_type = TSString2Int(payload_temp, cur_point, 8);
int elementary_PID = TSString2Int(payload_temp, cur_point + 11, 13);
//System.out.println(Integer.toString(cur_point)+" : "+Integer.toString(section_length*8));
int es_length = TSString2Int(payload_temp, cur_point + 28, 12);
/*if (pmt_stream_type==0x02){
- Descriptor des=new Descriptor();
- Object a=des.getDescriptors(payload_temp.substring(cur_point + 40,cur_point + 40+es_length*8));
+ Descriptor des=new Descriptor();
+ Object a=des.getDescriptors(payload_temp.substring(cur_point + 40,cur_point + 40+es_length*8));
}else if(pmt_stream_type==0x0f){
- Descriptor des=new Descriptor();
- Object a=des.getDescriptors(payload_temp.substring(cur_point + 40,cur_point + 40+es_length*8));
+ Descriptor des=new Descriptor();
+ Object a=des.getDescriptors(payload_temp.substring(cur_point + 40,cur_point + 40+es_length*8));
}*/
-
- PMTData pmtd=new PMTData();
- if ((pmt_stream_type==0x02)||(pmt_stream_type==0x0f)){
- pmtd.Stream_Type=pmt_stream_type;
- pmtd.Program_Table=PAT_TABLE;
- pmtd.Elementary_PID=elementary_PID;
- pmtd.PCR_PID=pcr_pid;
+
+ PMTData pmtd = new PMTData();
+ if ((pmt_stream_type == 0x02) || (pmt_stream_type == 0x0f)) {
+ pmtd.Stream_Type = pmt_stream_type;
+ pmtd.Program_Table = PAT_TABLE;
+ pmtd.Elementary_PID = elementary_PID;
+ pmtd.PCR_PID = pcr_pid;
pmt_t.add(pmtd);
}
cur_point = cur_point + 40 + es_length * 8;
//System.out.println(Integer.toString(cur_point)+" : "+Integer.toString(section_length*8));
- if ((cur_point > section_length * 8 - 1)|| (cur_point>payload_temp.length()-11)) {
+ if ((cur_point > section_length * 8 - 1) || (cur_point > payload_temp.length() - 11)) {
end = true;
}
- }else{
- end=true;
+ } else {
+ end = true;
}
}
return pmt_t;
}
+
+ private ArrayList<PMTData> readPMT_byte(byte[] payload_temp, int PAT_TABLE) {
+ ArrayList<PMTData> pmt_t = new ArrayList<PMTData>();
+ calc cal = new calc();
+ int tableid = cal.byte2int(payload_temp, 0, 8);
+ int section_length = cal.byte2int(payload_temp, 12, 12);
+ int pcr_pid = cal.byte2int(payload_temp, 67, 13);
+ int program_info_length = cal.byte2int(payload_temp, 84, 12);
+ boolean end = false;
+ int cur_point = 96 + program_info_length * 8;
+ if (cur_point > section_length * 8) {
+ end = true;
+ }
+ while (end != true) {
+ if (cal.byte2int(payload_temp, cur_point + 8, 3) == 7 && cal.byte2int(payload_temp, cur_point + 24, 4) == 15 && payload_temp.length * 8 > cur_point + 40) {
+ int pmt_stream_type = cal.byte2int(payload_temp, cur_point, 8);
+ int elementary_PID = cal.byte2int(payload_temp, cur_point + 11, 13);
+ //System.out.println(Integer.toString(cur_point)+" : "+Integer.toString(section_length*8));
+ int es_length = cal.byte2int(payload_temp, cur_point + 28, 12);
+ /*if (pmt_stream_type==0x02){
+ Descriptor des=new Descriptor();
+ Object a=des.getDescriptors(payload_temp.substring(cur_point + 40,cur_point + 40+es_length*8));
+ }else if(pmt_stream_type==0x0f){
+ Descriptor des=new Descriptor();
+ Object a=des.getDescriptors(payload_temp.substring(cur_point + 40,cur_point + 40+es_length*8));
+ }*/
+
+
+ PMTData pmtd = new PMTData();
+ if ((pmt_stream_type == 0x02) || (pmt_stream_type == 0x0f)) {
+ pmtd.Stream_Type = pmt_stream_type;
+ pmtd.Program_Table = PAT_TABLE;
+ pmtd.Elementary_PID = elementary_PID;
+ pmtd.PCR_PID = pcr_pid;
+ pmt_t.add(pmtd);
+ }
+ cur_point = cur_point + 40 + es_length * 8;
+ //System.out.println(Integer.toString(cur_point)+" : "+Integer.toString(section_length*8));
+ if ((cur_point > section_length * 8 - 1) || (cur_point > payload_temp.length * 8 - 11)) {
+ end = true;
+ }
+ } else {
+ end = true;
+ }
+ }
+ return pmt_t;
+ }
+
public ArrayList<EITData> readEIT(byte[] ts) {
- String payload_temp=getPayload(ts);
+ String payload_temp = getPayload(ts);
int tableid = TSString2Int(payload_temp, 0, 8);
int section_length = TSString2Int(payload_temp, 12, 12);
int program_number = TSString2Int(payload_temp, 24, 16);
- boolean current_next_indicator= (TSString2Int(payload_temp, 47, 1)==1);
+ boolean current_next_indicator = (TSString2Int(payload_temp, 47, 1) == 1);
int section_number = TSString2Int(payload_temp, 48, 8);
- int curpoint=112;
- ArrayList<EITData> ret=new ArrayList<EITData>();
- while (curpoint<24+section_length*8-32){
- EITData eitd=new EITData();
- eitd.current_newt_indicator=current_next_indicator;
+ int curpoint = 112;
+ ArrayList<EITData> ret = new ArrayList<EITData>();
+ while (curpoint < 24 + section_length * 8 - 32) {
+ EITData eitd = new EITData();
+ eitd.current_newt_indicator = current_next_indicator;
eitd.event_id = TSString2Int(payload_temp, curpoint, 16);
- eitd.program_number=program_number;
+ eitd.program_number = program_number;
eitd.section_number = section_number;
- int des_len=TSString2Int(payload_temp, curpoint+84, 12);
- Descriptor des=new Descriptor();
- eitd.descriptors=des.getDescriptors(payload_temp.substring(curpoint+96,curpoint+84+des_len*8));
+ int des_len = TSString2Int(payload_temp, curpoint + 84, 12);
+ Descriptor des = new Descriptor();
+ eitd.descriptors = des.getDescriptors(payload_temp.substring(curpoint + 96, curpoint + 84 + des_len * 8));
ret.add(eitd);
- curpoint=curpoint+84+des_len*8;
+ curpoint = curpoint + 84 + des_len * 8;
}
return ret;
}
+
private int TSString2Int(String s, int begin, int length) {
String st = s.substring(begin, begin + length);
int i = Integer.parseInt(st, 2);
return i;
}
+ public byte[] splitPAT_byte(byte[] ts, int p_table) {
+ /**
+ *
+ * p_tableで指定された番組テーブルのみを取り出すPATを作る。
+ */
+ int matchnum = 0;
+ byte[] tbb = new byte[ts.length - 4];
+ System.arraycopy(ts, 4, tbb, 0, tbb.length);
+ if (bPAT_payload != null) {
+ if (Arrays.equals(tbb, bPAT_payload)) {
+ byte[] retb = new byte[188];
+ System.arraycopy(ts, 0, retb, 0, 4);
+ System.arraycopy(bPAT_payload, 0, retb, 4, 184);
+ return retb;
+ }
+ }
+ calc cal = new calc();
+ String tsbyte = byte2String2(ts);
+ String tsheader = "";
+ header_byte = cal.byte2subbyte(ts, 0, 4);
+ byte[] pointer_byte=cal.byte2subbyte(ts, 4, 1);
+ payload_byte = cal.byte2subbyte(ts, 4, ts.length - 4);
+ starter = cal.byte2int(ts, 0, 8);
+ transporterror = cal.byte2int(ts, 8, 1);
+ payloadstart = cal.byte2int(ts, 9, 1);
+ transport_priority = cal.byte2int(ts, 10, 1);
+ PID = cal.byte2int(ts, 11, 13);
+ adaptation_field = cal.byte2int(ts, 26, 2);
+ continuity_counter = cal.byte2int(ts, 28, 4);
+ int adaptation_length_t = cal.byte2int(ts, 32, 8);
+ if (PID != 8191) {
+ if (adaptation_field == 1) {
+ pointer_field = cal.byte2int(ts, 32, 8);
+ payload_byte = cal.byte2subbyte(ts, 5, ts.length - 5);
+ } else if (adaptation_field == 3) {
+ if (adaptation_length_t < 188) {
+ adaptation_length_t = adaptation_length_t * 8;
+ }
+ payload_byte = cal.byte2subbyte(ts, 6 + adaptation_length_t / 8, ts.length - 6 - adaptation_length_t / 8);
+ }
+ }
+ if (PID == 0) {
+ //showPAT(tsbyte);
+ payload_byte = makePAT_byte(pointer_byte,payload_byte, p_table);
+ //payload_byte = cal.String2Byte(makePAT(cal.byte2String2(header_byte), cal.byte2String2(payload_byte), p_table));
+ bPAT_payload = payload_byte;
+ }
+ ByteArrayOutputStream baos = new ByteArrayOutputStream(ts.length);
+ baos.write(header_byte, 0, header_byte.length);
+ baos.write(pointer_byte,0,pointer_byte.length);
+ baos.write(payload_byte, 0, payload_byte.length);
+ return baos.toByteArray();
+ }
+
public byte[] splitPAT(byte[] ts, int p_table) {
/**
- *
+ *
* p_tableで指定された番組テーブルのみを取り出すPATを作る。
*/
- int matchnum=0;
- byte[] tbb=new byte[ts.length-4];
- System.arraycopy(ts,4,tbb,0,tbb.length);
- if (bPAT_payload!=null){
- if (Arrays.equals(tbb, bPAT_payload)){
- byte[] retb=new byte[188];
- System.arraycopy(ts,0,retb,0,4);
- System.arraycopy(bPAT_payload,0,retb,4,184);
+ int matchnum = 0;
+ byte[] tbb = new byte[ts.length - 4];
+ System.arraycopy(ts, 4, tbb, 0, tbb.length);
+ if (bPAT_payload != null) {
+ if (Arrays.equals(tbb, bPAT_payload)) {
+ byte[] retb = new byte[188];
+ System.arraycopy(ts, 0, retb, 0, 4);
+ System.arraycopy(bPAT_payload, 0, retb, 4, 184);
return retb;
}
}
}
if (PID == 0) {
//showPAT(tsbyte);
- payload = makePAT(tsheader,payload, p_table);
- byte[] retb=String2Byte(payload);
- bPAT_payload=retb;
+ payload = makePAT(tsheader, payload, p_table);
+ byte[] retb = String2Byte(payload);
+ bPAT_payload = retb;
}
String rets = tsheader + payload;
return String2Byte(rets);
}
- private String makePAT(String tsheader,String payload_temp, int Table) {
+ private String makePAT(String tsheader, String payload_temp, int Table) {
int sectionlength;
- StringBuffer sb=new StringBuffer();
+ StringBuffer sb = new StringBuffer();
//ArrayList program_number = new ArrayList();
//System.out.println("Pay:"+payload_temp);
//int tableid = TSString2Int(payload_temp, 0, 8);
int patnum = sectionlength * 8 - 72;
//String rets = "";//="00000000";//pointer field
//rets = rets + payload_temp.substring(0, 12);//セクション長の前まで
- sb.append(payload_temp.substring(0,12));
+ sb.append(payload_temp.substring(0, 12));
int new_section_length = (2 * 32 + 32 + 40) / 8;
sb.append(Int2String(new_section_length, 12));
sb.append(payload_temp.substring(24, 64));
i = patnum;
}
}
- String s2=tsheader.substring(tsheader.length()-8);
- s2=s2+sb.toString();
+ String s2 = tsheader.substring(tsheader.length() - 8);
+ s2 = s2 + sb.toString();
String s = getCRC32(s2);
sb.append(s);
//rets = rets + s;
}
return sb.toString();
}
- private String getCRC32(String s){
- return getCRC32(String2Byte(s),1);
+
+ private byte[] makePAT_byte(byte[] pointer_field, byte[] payload_temp, int Table) {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream(payload_temp.length);
+ int sectionlength;
+ calc cal = new calc();
+ sectionlength = cal.byte2int(payload_temp, 12, 12); //-40-32;
+ int patnum = sectionlength * 8 - 72;
+ baos.write(payload_temp, 0, 1);
+ int new_section_length = (2 * 32 + 32 + 40) / 8;
+ baos.write(cal.joinByte((byte) cal.byte2int(payload_temp, 8, 4), (byte) (new_section_length & 0xF00), 4));
+ baos.write((byte) (new_section_length & 0xFF));
+ baos.write(payload_temp, 3, 5);
+ patnum = patnum / 32;
+ int nowt = 8;
+ for (int i = 0; i < patnum; i++) {
+ int[] pat = new int[2];
+ pat[0] = cal.byte2int(payload_temp, 64 + 32 * i, 16);
+ pat[1] = cal.byte2int(payload_temp, 32 * i + 64 + 19, 13);
+ if (pat[0] == 0) {
+ baos.write(payload_temp, nowt, 4);
+ nowt = nowt + 4;
+ } else if (pat[0] == Table) {
+ baos.write(payload_temp, nowt, 4);
+ nowt = nowt + 4;
+ i = patnum;
+ }
+ }
+ ByteArrayOutputStream baoscrc=new ByteArrayOutputStream(nowt+1);
+ baoscrc.write(pointer_field[0]);
+ baoscrc.write(baos.toByteArray(), 0, baos.size());
+ byte[] crc = getCRC32_byte(baoscrc.toByteArray(), 1);
+ baos.write(crc, 0, crc.length);
+ int ill3 = payload_temp.length - baos.size();
+ for (int ir = 0; ir < ill3; ir++) {
+ baos.write(0xFF);
+ }
+ return baos.toByteArray();
+ }
+
+ private String getCRC32(String s) {
+ return getCRC32(String2Byte(s), 1);
}
- private String getCRC32(byte[] data,int offset) {
+
+ private String getCRC32(byte[] data, int offset) {
// 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
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};
int[] shift_reg = new int[32];
for (int i = 0; i < 4; i++) {
crc32[i] = (byte) (0xFF & (crc >>> ((3 - i) * 8)));
}
- String s=Long2String(crc, 32);
+ String s = Long2String(crc, 32);
return s;
}
- private String addzero(int num){
- switch (num){
+ private byte[] getCRC32_byte(byte[] data, int offset) {
+ // 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
+ 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};
+ int[] shift_reg = new int[32];
+ long crc = 0;
+ byte crc32[] = new byte[4];
+
+ // Initialize shift register's to '1'
+ java.util.Arrays.fill(shift_reg, 1);
+
+ // Calculate nr of data bits, summa of bits
+ int nr_bits = (data.length - offset) * 8;
+
+ for (int bit_count = 0, bit_in_byte = 0, data_bit; bit_count < nr_bits; bit_count++) {
+ // Fetch bit from bitstream
+ data_bit = (data[offset] & 0x80 >>> (bit_in_byte++)) != 0 ? 1 : 0;
+
+ if ((bit_in_byte &= 7) == 0) {
+ offset++;
+ }
+
+ // Perform the shift and modula 2 addition
+ data_bit ^= shift_reg[31];
+
+ for (int i = 31; i > 0; i--) {
+ shift_reg[i] = g[i] == 1 ? (shift_reg[i - 1] ^ data_bit) : shift_reg[i - 1];
+ }
+
+ shift_reg[0] = data_bit;
+ }
+
+ for (int i = 0; i < 32; i++) {
+ crc = ((crc << 1) | (shift_reg[31 - i]));
+ }
+
+ for (int i = 0; i < 4; i++) {
+ crc32[i] = (byte) (0xFF & (crc >>> ((3 - i) * 8)));
+ }
+ return crc32;
+ }
+
+ private String addzero(int num) {
+ switch (num) {
case 0:
return "";
case 1:
case 8:
return "00000000";
default:
- StringBuffer sb=new StringBuffer();
- for (int i=0;i<num;i++){
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < num; i++) {
sb.append("0");
}
return sb.toString();
}
}
+
private String byte2String(byte[] b) {
- StringBuffer sb=new StringBuffer(8*b.length);
+ StringBuffer sb = new StringBuffer(8 * b.length);
for (int i = 0; i < b.length; i++) {
- StringBuffer sb2=new StringBuffer(8);
+ StringBuffer sb2 = new StringBuffer(8);
sb2.append(Integer.toBinaryString(b[i] & 0xFF));
if ((sb2.length() < 8) & (sb2.length() > 0)) {
- sb2.insert(0,addzero(8-sb2.length()));
+ sb2.insert(0, addzero(8 - sb2.length()));
}
sb.append(sb2);
}
return sb.toString();
}
- private String byte2String2(byte[] b){
- int bl=b.length;
- bl=bl-bl%8;
- bl=bl/8;
- StringBuffer sb=new StringBuffer();
- for (int i=0;i<bl;i++){
- long retl=0;
- for (int j=0;j<8;j++){
- retl=retl<<8;
- int ri=b[i*8+j]&0xFF;
- retl=retl+ri;
+
+ private String byte2String2(byte[] b) {
+ int bl = b.length;
+ bl = bl - bl % 8;
+ bl = bl / 8;
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < bl; i++) {
+ long retl = 0;
+ for (int j = 0; j < 8; j++) {
+ retl = retl << 8;
+ int ri = b[i * 8 + j] & 0xFF;
+ retl = retl + ri;
}
- sb.append(Long2String(retl,64));
- }
- int bl2=b.length%8;
- bl2=(bl2-bl2%4)/4;
- for (int i=0;i<bl2;i++){
- int reti=0;
- for (int j=0;j<4;j++){
- reti=reti<<8;
- reti=reti+(b[bl*8+4*i+j]&0xFF);
+ sb.append(Long2String(retl, 64));
+ }
+ int bl2 = b.length % 8;
+ bl2 = (bl2 - bl2 % 4) / 4;
+ for (int i = 0; i < bl2; i++) {
+ int reti = 0;
+ for (int j = 0; j < 4; j++) {
+ reti = reti << 8;
+ reti = reti + (b[bl * 8 + 4 * i + j] & 0xFF);
}
- sb.append(Int2String(reti,32));
+ sb.append(Int2String(reti, 32));
}
- for (int i=0;i<(b.length%8)%4;i++){
- sb.append(Int2String(b[bl*8+bl2*4+i]&0xFF,8));
+ for (int i = 0; i < (b.length % 8) % 4; i++) {
+ sb.append(Int2String(b[bl * 8 + bl2 * 4 + i] & 0xFF, 8));
}
return sb.toString();
}
if (crc.getValue() == Long.parseLong(tests2, 2)) {
System.out.print("正解が出ました。\n");
System.out.print("begin : " + Integer.toString(begin_n) + " end : " + Integer.toString(end_n));
-
+
return true;
}
- if (Long.parseLong(getCRC32(test1,1), 2) == Long.parseLong(tests2, 2)) {
+ if (Long.parseLong(getCRC32(test1, 1), 2) == Long.parseLong(tests2, 2)) {
System.out.print("正解が出ました。(getCRC)\n");
System.out.print("begin : " + Integer.toString(begin_n) + " end : " + Integer.toString(end_n));
return true;
}
- if (Long.parseLong(getCRC32(test1,1), 2) == Long.parseLong(tests2, 2)) {
+ if (Long.parseLong(getCRC32(test1, 1), 2) == Long.parseLong(tests2, 2)) {
System.out.print("正解が出ました。(getCRC_2)\n");
System.out.println("begin : " + Integer.toString(begin_n) + " end : " + Integer.toString(end_n));
showPAT(base);
- System.out.println("begin : " + base.substring(begin_n,begin_n+32));
- System.out.println("near : " + base.substring(end_n-32, end_n));
- System.out.println("near2: " + base.substring(end_n, end_n+32));
- System.out.println("near3: " + base.substring(end_n+32, end_n+64));
+ System.out.println("begin : " + base.substring(begin_n, begin_n + 32));
+ System.out.println("near : " + base.substring(end_n - 32, end_n));
+ System.out.println("near2: " + base.substring(end_n, end_n + 32));
+ System.out.println("near3: " + base.substring(end_n + 32, end_n + 64));
return true;
}
return false;
public int getPID() {
return PID;
}
- public String getPayload(byte[] ts){
+
+ public String getPayload(byte[] ts) {
/**
* 188バイトのtsから読み出したbyteを与える
*/
String tsbyte = byte2String2(ts);
//header = tsbyte.substring(0, 31);
- String ret_payload="";
+ String ret_payload = "";
//starter = TSString2Int(tsbyte, 0, 8);
//transporterror = TSString2Int(tsbyte, 8, 1);
//payloadstart = TSString2Int(tsbyte, 9, 1);
ret_payload = tsbyte.substring(40);
} else if (af == 3) {
int al = TSString2Int(tsbyte, 32, 8);
- if ((al < 184)&((tsbyte.length()-al*8)>48)) {
+ if ((al < 184) & ((tsbyte.length() - al * 8) > 48)) {
al = al * 8;
}
ret_payload = tsbyte.substring(48 + al);
}
return ret_payload;
}
- public ArrayList<PMTData> readPMT(byte[] ts,int TABLE_NUM){
- String payload=getPayload(ts);
- return readPMT(payload, TABLE_NUM);
+
+ public byte[] getPayload_byte(byte[] ts) {
+ /**
+ * 188バイトのtsから読み出したbyteを与える
+ */
+ calc cal = new calc();
+ String tsbyte = byte2String2(ts);
+ //header = tsbyte.substring(0, 31);
+ byte[] retb = null;
+ //starter = TSString2Int(tsbyte, 0, 8);
+ //transporterror = TSString2Int(tsbyte, 8, 1);
+ //payloadstart = TSString2Int(tsbyte, 9, 1);
+ //transport_priority = TSString2Int(tsbyte, 10, 1);
+ int pid = cal.byte2int(ts, 11, 13);
+ int af = cal.byte2int(ts, 26, 2);
+ //continuity_counter = TSString2Int(tsbyte, 28, 4);
+ if (pid != 8191) {
+ if (af == 1) {
+ retb = cal.byte2subbyte(ts, 5, ts.length - 5);
+ } else if (af == 3) {
+ int al = cal.byte2int(ts, 32, 8);
+ if ((al < 184) & ((ts.length * 8 - al * 8) > 48)) {
+ al = al * 8;
+ }
+ retb = cal.byte2subbyte(ts, 6 + al / 8, ts.length - 6 - al / 8);
+ }
+ }
+ return retb;
}
+
+ public ArrayList<PMTData> readPMT(byte[] ts, int TABLE_NUM) {
+ String payloadt = getPayload(ts);
+ return readPMT(payloadt, TABLE_NUM);
+ }
+
+ public ArrayList<PMTData> readPMTglobal_byte(byte[] ts, int TABLE_NUM) {
+ byte[] payloadt = getPayload_byte(ts);
+ return readPMT_byte(payloadt, TABLE_NUM);
+ }
+
public void showPAT(String ts) {
System.out.println("先頭:" + ts.substring(0, 8));
System.out.println("" + ts.substring(8, 11));
wbyte=null;
Mpeg2TSPacket m2tp;
m2tp=new Mpeg2TSPacket();
- int ii=m2tpp.getPIDFirst(tstt);
+ //int ii=m2tpp.getPIDFirst(tstt);
+ int ii=m2tpp.getPIDFirst_byte(tstt);
+ //if (ii!=i2){
+ // System.out.println("not match");
+ //}
boolean alreadyreaded=false;
for (int k=0;k<pids.length;k++){
if (ii==pids[k]){
Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
}
}
+
+ public void splitTS_byte(String origpath,String destpath,int csch){
+ int[] pids=null;
+ int p_table=0;
+ if (csch>0){
+ p_table=csch;
+ }else{
+ p_table=getFirstP_Table_byte(origpath);
+ }
+ PIDs pidss=getTablePID_byte(origpath,p_table);
+ p_table=pidss.Program_Table;
+ pids=pidss.PIDs;
+ int pmt_pid=pidss.PMT_PID;
+ byte[] tb=new byte[188];
+ try {
+ FileInputStream in = new FileInputStream(origpath);
+ FileOutputStream fos=new FileOutputStream(destpath);
+ BufferedInputStream bis=new BufferedInputStream(in,128*188);
+ BufferedOutputStream bos=new BufferedOutputStream(fos);
+ byte[] wbyte=null;
+ boolean end=false;
+ int ik=0;
+ boolean readend=false;
+ Mpeg2TSPacket m2tpp;
+ m2tpp=new Mpeg2TSPacket();
+ while (readend==false){
+ byte[] tstt=new byte[3];
+ bis.mark(188*2);
+ bis.read(tstt);
+ bis.reset();
+ wbyte=null;
+ Mpeg2TSPacket m2tp;
+ m2tp=new Mpeg2TSPacket();
+ //int ii=m2tpp.getPIDFirst(tstt);
+ int ii=m2tpp.getPIDFirst_byte(tstt);
+ //if (ii!=i2){
+ // System.out.println("not match");
+ //}
+ boolean alreadyreaded=false;
+ for (int k=0;k<pids.length;k++){
+ if (ii==pids[k]){
+ alreadyreaded=true;
+ int readti=bis.read(tb);
+ if ((ii==0)&&(readti>187)){
+ //Mpeg2TSPacket m2tp2=new Mpeg2TSPacket();
+ wbyte=m2tpp.splitPAT_byte(tb,p_table);
+ //wbyte=m2tpp.splitPAT(tb, p_table);
+ /*byte[] wbytet=m2tpp.splitPAT(tb, p_table);
+ for (int kk=0;kk<wbyte.length;kk++){
+ if (wbyte[kk]==wbytet[kk]){
+ //System.out.println(":match");
+ }else{
+ System.out.print(kk);
+ System.out.println(":not match");
+ }
+ }*/
+ //wbyte=wbytet;*/
+ }else if ((ii==pmt_pid)&&(readti>187)){
+ wbyte=tb;
+ ArrayList<PMTData> pmtss=m2tpp.readPMTglobal_byte(tb, pmt_pid);
+ if (pmtss.size()>0){
+ int[] new_pids=new int[pmtss.size()+3];
+ new_pids[pmtss.size()]=0;
+ new_pids[pmtss.size()+1]=pmt_pid;
+ new_pids[pmtss.size()+2]=pmtss.get(0).PCR_PID;
+ for (int i=0;i<pmtss.size();i++){
+ new_pids[i]=pmtss.get(i).Elementary_PID;
+ }
+ if (!Arrays.equals(pids, new_pids)){
+ pids=new_pids;
+ }
+ }
+
+ /*}else if ((ii==0x0012)&&(readti>187)){
+ ArrayList<EITData> eitss=m2tpp.readEIT(tb);
+ */
+ }else if (readti>187){
+ wbyte=tb;
+
+ }else {
+ readend=true;
+ }
+ k=pids.length;
+ }
+ ik++;
+ }
+ if (alreadyreaded==false){
+ bis.skip(188);
+ }
+ if (wbyte!=null){
+ bos.write(wbyte);
+ }
+ }
+ bis.close();
+ bos.flush();
+ bos.close();
+ in.close();
+ fos.close();
+
+ } catch (IOException ex) {
+ Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+
private void writeTS(byte[] tspacket,String path){
FileOutputStream fos = null;
try {
}
return pids;
}
+ private PIDs getTablePID_byte(String fpath,int p_table){
+ /**
+ * PIDを取得し、これと思われる必要なPIDを抜き出す。
+ * @return プログラム番号(return[0])とPIDのリスト(return[1-])
+ */
+ FileInputStream in = null;
+ PIDs pids=new PIDs();
+ int[] reti=null;
+ try {
+ ArrayList<Integer> ret=new ArrayList<Integer>();
+ byte[] tb = new byte[188];
+ int[] ib = new int[188];
+ ArrayList<PATData> pat = new ArrayList<PATData>();
+ ArrayList<PMTData> pmt = new ArrayList<PMTData>();
+ String[] sb = new String[188];
+ in = new FileInputStream(fpath);
+ //int[] PIDCount = new int[8200];
+ int imax=1000;
+ for (int i = 0; i < imax ; i++) {
+ in.read(tb);
+ String last8;
+ Mpeg2TSPacket m2tp;
+ m2tp = new Mpeg2TSPacket();
+ m2tp.setPAT(pat);
+ m2tp.setPMT(pmt);
+ m2tp.readTS(tb);
+ pat = m2tp.getPAT();
+ for (int i2=0;i2<pat.size();i2++){
+ PATData patdd=pat.get(i2);
+ if (pat.get(i2).Program_TABLE==p_table){
+ pat.clear();
+ pat.add(patdd);
+ m2tp.setPAT(pat);
+ }
+ }
+ ArrayList<PMTData> pmtt=m2tp.getPMT();
+ for (int i2=0;i2<pmtt.size();i2++){
+ if (!(pmt.contains(pmtt.get(i2)))){
+ pmt.add(pmtt.get(i2));
+ }
+ }
+ if ((i==imax-1)&&(pmt.size()==0)){
+ imax=imax+500;
+ }
+ for (int i2=0;i2<pmt.size();i2++){
+ int itt=ret.size();
+ if (p_table==pmt.get(i2).Program_Table){
+ if (!(ret.contains(pmt.get(i2).Elementary_PID))){
+ ret.add(pmt.get(i2).Elementary_PID);
+ i=imax;
+ }
+ }
+ if (ret.size()==itt){
+ imax=imax+100;
+ }
+ }
+ }
+ PATData patd_det=new PATData();
+ for (int i=0;i<pat.size();i++){
+ if (pat.get(i).Program_TABLE==p_table){
+ patd_det=pat.get(i);
+ i=pat.size();
+ }
+ }
+ ret.add(0);
+ ret.add(patd_det.PID);
+ ret.add(pmt.get(0).Elementary_PID);
+ for (int i=0;i<pmt.size();i++){
+ if (patd_det.Program_TABLE==pmt.get(i).Program_Table){
+ if (!(ret.contains(pmt.get(i).Elementary_PID))){
+ if ((pmt.get(i).Stream_Type==0x02)||(pmt.get(i).Stream_Type==0x0f)){
+ ret.add(pmt.get(i).Elementary_PID);
+ }
+ }
+ }
+ }
+ pids.PMT_PID=patd_det.PID;
+ pids.Program_Table=patd_det.Program_TABLE;
+ pids.PIDs=new int[ret.size()];
+ for (int i=0;i<ret.size();i++){
+ pids.PIDs[i]=ret.get(i);
+ }
+ in.close();
+ } catch (IOException ex) {
+ Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+ } finally {
+ try {
+ in.close();
+ } catch (IOException ex) {
+ Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+ return pids;
+ }
private int getFirstP_Table(String fpath){
/**
* PIDを取得し、これと思われる必要なPIDを抜き出す。
}
return patdd.Program_TABLE;
}
+
+
+ private int getFirstP_Table_byte(String fpath){
+ /**
+ * PIDを取得し、これと思われる必要なPIDを抜き出す。
+ * @return プログラム番号(return[0])とPIDのリスト(return[1-])
+ */
+ FileInputStream in = null;
+ int[] reti=null;
+ int[] pat_det=new int[2];
+ //pat_det[0]=0;
+ PATData patdd=new PATData();
+ patdd.PID=0;
+ try {
+ ArrayList ret=new ArrayList();
+ byte[] tb = new byte[188];
+ int[] ib = new int[188];
+ ArrayList<PATData> pat = new ArrayList<PATData>();
+ ArrayList<PMTData> pmt = new ArrayList<PMTData>();
+ String[] sb = new String[188];
+ in = new FileInputStream(fpath);
+ //int[] PIDCount = new int[8200];
+ int imax=1000;
+ for (int i = 0; i < imax ; i++) {
+ in.read(tb);
+ String last8;
+ Mpeg2TSPacket m2tp;
+ m2tp = new Mpeg2TSPacket();
+ m2tp.setPAT(pat);
+ m2tp.setPMT(pmt);
+ m2tp.readTS_byte(tb);
+ pat = m2tp.getPAT();
+ pmt = m2tp.getPMT();
+ if ((i==imax-1)&&(pmt.size()==0)){
+ imax=imax+500;
+ }
+ }
+
+ for (int i=0;i<pat.size();i++){
+ if (pat.get(i).Program_TABLE>0){
+ patdd=pat.get(i);
+ i=pat.size();
+ }
+ }
+ } catch (IOException ex) {
+ Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+ } finally {
+ try {
+ in.close();
+ } catch (IOException ex) {
+ Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+ return patdd.Program_TABLE;
+ }
}
\ No newline at end of file