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) {
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
+import jtssplitter.data.PATData;
+import jtssplitter.data.PIDs;
+import jtssplitter.data.PMTData;
/**
*
* @author Administrator
*/
-public class Tsfile {
- private ArrayList tsstream=new ArrayList();
+public class Tsfile_String {
public void readTs(String fpath){
byte[] tb=new byte[188];
int[] ib=new int[188];
- ArrayList pat=new ArrayList();
- ArrayList pmt=new ArrayList();
+ ArrayList<PATData> pat=new ArrayList<PATData>();
+ ArrayList<PMTData> pmt=new ArrayList<PMTData>();
String[] sb=new String[188];
try {
FileInputStream in = new FileInputStream(fpath);
for (int i=0;i<3000;i++){
in.read(tb);
String last8;
- Mpeg2TSPacket m2tp;
- m2tp=new Mpeg2TSPacket();
+ Mpeg2TSPacket_String m2tp;
+ m2tp=new Mpeg2TSPacket_String();
m2tp.setPAT(pat);
m2tp.setPMT(pmt);
m2tp.readTS(tb);
}
for (int i=0;i<8200;i++){
if (PIDCount[i]>0){
- //System.out.print(Integer.toString(i)+" : "+Integer.toString(PIDCount[i])+"\n");
}
- //System.out.print(PIDCount[i]);
}
for (int i=0;i<188;i++){
int it=tb[i]& 0xFF;
s="0"+s;
}
sb[i]=s;
- //System.out.print(s+"\n");
}
-
- //s=s+"0"*(8-s.length());
}
- //System.out.print(Integer.toHexString(ib[0])+"\n");
- //System.out.print(s+"\n");
} catch (IOException ex) {
- Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+ Logger.getLogger(Tsfile_String.class.getName()).log(Level.SEVERE, null, ex);
}
}
}else{
p_table=getFirstP_Table(origpath);
}
- int[] pidst=getTablePID(origpath,p_table);
- p_table=pidst[0];
- pids=new int[pidst.length-1];
- for (int i=0;i<pidst.length-1;i++){
- pids[i]=pidst[i+1];
- }
+ PIDs pidss=getTablePID(origpath,p_table);
+ p_table=pidss.Program_Table;
+ pids=pidss.PIDs;
byte[] tb=new byte[188];
- int[] ib=new int[188];
- ArrayList pat=new ArrayList();
- ArrayList pmt=new ArrayList();
- String[] sb=new String[188];
try {
FileInputStream in = new FileInputStream(origpath);
FileOutputStream fos=new FileOutputStream(destpath,true);
- //int[] PIDCount=new int[8200];
+ BufferedInputStream bis=new BufferedInputStream(in);
+ BufferedOutputStream bos=new BufferedOutputStream(fos);
byte[] wbyte=null;
- for (int i=0;in.read(tb)!=-1;i++){
+ boolean end=false;
+ int ik=0;
+ boolean readend=false;
+ while (readend==false){
+ byte[] tstt=new byte[3];
+ bis.mark(188*2);
+ bis.reset();
wbyte=null;
- Mpeg2TSPacket m2tp;
- m2tp=new Mpeg2TSPacket();
- m2tp.readTS(tb);
- for (int j=0;j<pids.length;j++){
- if (m2tp.getPID()==pids[j]){
- if (m2tp.getPID()==0){
- Mpeg2TSPacket m2tp2=new Mpeg2TSPacket();
- //m2tp2.readTS(tb);
+ Mpeg2TSPacket_String m2tp;
+ m2tp=new Mpeg2TSPacket_String();
+ int ii=m2tp.getPIDFirst(tstt);
+ 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_String m2tp2=new Mpeg2TSPacket_String();
wbyte=m2tp2.splitPAT(tb,p_table);
- //wbyte=tb;
- }else{
+ }else if (readti>187){
wbyte=tb;
}
+ k=pids.length;
}
- }
+ ik++;
+ }
+ if (alreadyreaded==false){
+ bis.skip(188);
+ }
+ if (bis.available()<188){
+ readend=true;
+ }
if (wbyte!=null){
- fos.write(wbyte);
+ bos.write(wbyte);
}
}
+ bis.close();
+ bos.close();
in.close();
fos.close();
+
} catch (IOException ex) {
- Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+ Logger.getLogger(Tsfile_String.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void writeTS(byte[] tspacket,String path){
fos.write(tspacket);
fos.close();
} catch (IOException ex) {
- Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+ Logger.getLogger(Tsfile_String.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
fos.close();
} catch (IOException ex) {
- Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+ Logger.getLogger(Tsfile_String.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
- private int[] getTablePID(String fpath,int p_table){
+ private PIDs getTablePID(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 ret=new ArrayList();
+ ArrayList<Integer> ret=new ArrayList<Integer>();
byte[] tb = new byte[188];
int[] ib = new int[188];
- ArrayList pat = new ArrayList();
- ArrayList pmt = new ArrayList();
+ 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];
for (int i = 0; i < imax ; i++) {
in.read(tb);
String last8;
- Mpeg2TSPacket m2tp;
- m2tp = new Mpeg2TSPacket();
+ Mpeg2TSPacket_String m2tp;
+ m2tp = new Mpeg2TSPacket_String();
m2tp.setPAT(pat);
m2tp.setPMT(pmt);
m2tp.readTS(tb);
pat = m2tp.getPAT();
for (int i2=0;i2<pat.size();i2++){
- int[] il2=(int [])pat.get(i2);
- if (il2[0]==p_table){
+ PATData patdd=pat.get(i2);
+ if (pat.get(i2).Program_TABLE==p_table){
pat.clear();
- pat.add(il2);
+ pat.add(patdd);
m2tp.setPAT(pat);
}
}
- ArrayList pmtt=m2tp.getPMT();
+ ArrayList<PMTData> pmtt=m2tp.getPMT();
for (int i2=0;i2<pmtt.size();i2++){
if (!(pmt.contains(pmtt.get(i2)))){
pmt.add(pmtt.get(i2));
imax=imax+500;
}
for (int i2=0;i2<pmt.size();i2++){
- int[] il2=(int[])pmt.get(i2);
int itt=ret.size();
- if (p_table==il2[2]){
- if (!(ret.contains(il2[1]))){
- ret.add(il2[1]);
+ 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;
}
}
}
}
}
- int[] pat_det=new int[2];
+ PATData patd_det=new PATData();
for (int i=0;i<pat.size();i++){
- int[] ii2=(int[])pat.get(i);
- if (ii2[0]==p_table){
- pat_det[0]=ii2[0];
- pat_det[1]=ii2[1];
+ if (pat.get(i).Program_TABLE==p_table){
+ patd_det=pat.get(i);
i=pat.size();
}
}
ret.add(0);
- ret.add(pat_det[1]);
+ ret.add(patd_det.PID);
for (int i=0;i<pmt.size();i++){
- int[] il2=(int[])pmt.get(i);
- if (pat_det[0]==il2[2]){
- if (!(ret.contains(il2[1]))){
- ret.add(il2[1]);
+ if (patd_det.Program_TABLE==pmt.get(i).Program_Table){
+ if (!(ret.contains(pmt.get(i).Elementary_PID))){
+ ret.add(pmt.get(i).Elementary_PID);
}
}
}
- reti=new int[ret.size()+1];
- reti[0]=pat_det[0];
+ pids.Program_Table=patd_det.Program_TABLE;
+ pids.PIDs=new int[ret.size()];
for (int i=0;i<ret.size();i++){
- int retit=(Integer)ret.get(i);
- reti[i+1]=retit;
+ pids.PIDs[i]=ret.get(i);
}
in.close();
} catch (IOException ex) {
- Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+ Logger.getLogger(Tsfile_String.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
in.close();
} catch (IOException ex) {
- Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+ Logger.getLogger(Tsfile_String.class.getName()).log(Level.SEVERE, null, ex);
}
}
- return reti;
+ return pids;
}
private int getFirstP_Table(String fpath){
/**
FileInputStream in = null;
int[] reti=null;
int[] pat_det=new int[2];
- pat_det[0]=0;
+ //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 pat = new ArrayList();
- ArrayList pmt = new ArrayList();
+ 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];
for (int i = 0; i < imax ; i++) {
in.read(tb);
String last8;
- Mpeg2TSPacket m2tp;
- m2tp = new Mpeg2TSPacket();
+ Mpeg2TSPacket_String m2tp;
+ m2tp = new Mpeg2TSPacket_String();
m2tp.setPAT(pat);
m2tp.setPMT(pmt);
m2tp.readTS(tb);
pat = m2tp.getPAT();
pmt = m2tp.getPMT();
- //PIDCount[m2tp.getFirstP_Table()]++;
if ((i==imax-1)&&(pmt.size()==0)){
imax=imax+500;
}
}
for (int i=0;i<pat.size();i++){
- int[] ii2=(int[])pat.get(i);
- if (ii2[0]>0){
- pat_det[0]=ii2[0];
- pat_det[1]=ii2[1];
+ if (pat.get(i).Program_TABLE>0){
+ patdd=pat.get(i);
i=pat.size();
}
}
-
- /*ret.add(0);
- ret.add(pat_det[1]);
- for (int i=0;i<pmt.size();i++){
- int[] il2=(int[])pmt.get(i);
- if (pat_det[0]==il2[2]){
- if (!(ret.contains(il2[1]))){
- ret.add(il2[1]);
- }
- }
- }
- reti=new int[ret.size()+1];
- reti[0]=pat_det[0];
- for (int i=0;i<ret.size();i++){
- int retit=(Integer)ret.get(i);
- reti[i+1]=retit;
- }
- in.close();
- */
} catch (IOException ex) {
- Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+ Logger.getLogger(Tsfile_String.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
in.close();
} catch (IOException ex) {
- Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+ Logger.getLogger(Tsfile_String.class.getName()).log(Level.SEVERE, null, ex);
}
}
- return pat_det[0];
+ return patdd.Program_TABLE;
}
}
\ No newline at end of file