2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
7 import java.util.ArrayList;
9 import java.util.logging.Level;
10 import java.util.logging.Logger;
11 import java.util.Arrays;
12 import jtssplitter.data.EITData;
13 import jtssplitter.data.PATData;
14 import jtssplitter.data.PIDs;
15 import jtssplitter.data.PMTData;
18 * @author Administrator
21 public void readTs(String fpath){
22 byte[] tb=new byte[188];
23 int[] ib=new int[188];
24 ArrayList<PATData> pat=new ArrayList<PATData>();
25 ArrayList<PMTData> pmt=new ArrayList<PMTData>();
26 String[] sb=new String[188];
28 FileInputStream in = new FileInputStream(fpath);
29 BufferedInputStream bis=new BufferedInputStream(in);
30 int[] PIDCount=new int[8200];
31 for (int i=0;i<3000;i++){
35 m2tp=new Mpeg2TSPacket();
41 PIDCount[m2tp.getPID()]++;
43 for (int i=0;i<8200;i++){
47 for (int i=0;i<188;i++){
50 String s=Integer.toBinaryString(it);
52 for (int i2=s.length();i2<8;i2++){
60 } catch (IOException ex) {
61 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
65 public void splitTS(String origpath,String destpath,int csch){
71 p_table=getFirstP_Table(origpath);
73 PIDs pidss=getTablePID(origpath,p_table);
74 p_table=pidss.Program_Table;
76 int pmt_pid=pidss.PMT_PID;
77 byte[] tb=new byte[188];
79 FileInputStream in = new FileInputStream(origpath);
80 FileOutputStream fos=new FileOutputStream(destpath);
81 BufferedInputStream bis=new BufferedInputStream(in,128*188);
82 BufferedOutputStream bos=new BufferedOutputStream(fos);
86 boolean readend=false;
88 m2tpp=new Mpeg2TSPacket();
89 while (readend==false){
90 byte[] tstt=new byte[3];
96 m2tp=new Mpeg2TSPacket();
97 //int ii=m2tpp.getPIDFirst(tstt);
98 int ii=m2tpp.getPIDFirst_byte(tstt);
100 // System.out.println("not match");
102 boolean alreadyreaded=false;
103 for (int k=0;k<pids.length;k++){
106 int readti=bis.read(tb);
107 if ((ii==0)&&(readti>187)){
108 //Mpeg2TSPacket m2tp2=new Mpeg2TSPacket();
109 wbyte=m2tpp.splitPAT(tb,p_table);
110 }else if ((ii==pmt_pid)&&(readti>187)){
112 ArrayList<PMTData> pmtss=m2tpp.readPMT(tb, pmt_pid);
114 int[] new_pids=new int[pmtss.size()+3];
115 new_pids[pmtss.size()]=0;
116 new_pids[pmtss.size()+1]=pmt_pid;
117 new_pids[pmtss.size()+2]=pmtss.get(0).PCR_PID;
118 for (int i=0;i<pmtss.size();i++){
119 new_pids[i]=pmtss.get(i).Elementary_PID;
121 if (!Arrays.equals(pids, new_pids)){
126 /*}else if ((ii==0x0012)&&(readti>187)){
127 ArrayList<EITData> eitss=m2tpp.readEIT(tb);
129 }else if (readti>187){
139 if (alreadyreaded==false){
152 } catch (IOException ex) {
153 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
157 public void splitTS_byte(String origpath,String destpath,int csch){
163 p_table=getFirstP_Table_byte(origpath);
165 PIDs pidss=getTablePID_byte(origpath,p_table);
166 p_table=pidss.Program_Table;
168 int pmt_pid=pidss.PMT_PID;
169 byte[] tb=new byte[188];
171 FileInputStream in = new FileInputStream(origpath);
172 FileOutputStream fos=new FileOutputStream(destpath);
173 BufferedInputStream bis=new BufferedInputStream(in,128*188);
174 BufferedOutputStream bos=new BufferedOutputStream(fos);
178 boolean readend=false;
180 m2tpp=new Mpeg2TSPacket();
181 while (readend==false){
182 byte[] tstt=new byte[3];
188 m2tp=new Mpeg2TSPacket();
189 //int ii=m2tpp.getPIDFirst(tstt);
190 int ii=m2tpp.getPIDFirst_byte(tstt);
192 // System.out.println("not match");
194 boolean alreadyreaded=false;
195 for (int k=0;k<pids.length;k++){
198 int readti=bis.read(tb);
199 if ((ii==0)&&(readti>187)){
200 //Mpeg2TSPacket m2tp2=new Mpeg2TSPacket();
201 wbyte=m2tpp.splitPAT_byte(tb,p_table);
202 //wbyte=m2tpp.splitPAT(tb, p_table);
203 /*byte[] wbytet=m2tpp.splitPAT(tb, p_table);
204 for (int kk=0;kk<wbyte.length;kk++){
205 if (wbyte[kk]==wbytet[kk]){
206 //System.out.println(":match");
208 System.out.print(kk);
209 System.out.println(":not match");
213 }else if ((ii==pmt_pid)&&(readti>187)){
215 ArrayList<PMTData> pmtss=m2tpp.readPMTglobal_byte(tb, pmt_pid);
217 int[] new_pids=new int[pmtss.size()+3];
218 new_pids[pmtss.size()]=0;
219 new_pids[pmtss.size()+1]=pmt_pid;
220 new_pids[pmtss.size()+2]=pmtss.get(0).PCR_PID;
221 for (int i=0;i<pmtss.size();i++){
222 new_pids[i]=pmtss.get(i).Elementary_PID;
224 if (!Arrays.equals(pids, new_pids)){
229 /*}else if ((ii==0x0012)&&(readti>187)){
230 ArrayList<EITData> eitss=m2tpp.readEIT(tb);
232 }else if (readti>187){
242 if (alreadyreaded==false){
255 } catch (IOException ex) {
256 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
260 private void writeTS(byte[] tspacket,String path){
261 FileOutputStream fos = null;
263 fos = new FileOutputStream(path,true);
266 } catch (IOException ex) {
267 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
271 } catch (IOException ex) {
272 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
276 private PIDs getTablePID(String fpath,int p_table){
278 * PIDを取得し、これと思われる必要なPIDを抜き出す。
279 * @return プログラム番号(return[0])とPIDのリスト(return[1-])
281 FileInputStream in = null;
282 PIDs pids=new PIDs();
285 ArrayList<Integer> ret=new ArrayList<Integer>();
286 byte[] tb = new byte[188];
287 int[] ib = new int[188];
288 ArrayList<PATData> pat = new ArrayList<PATData>();
289 ArrayList<PMTData> pmt = new ArrayList<PMTData>();
290 String[] sb = new String[188];
291 in = new FileInputStream(fpath);
292 //int[] PIDCount = new int[8200];
294 for (int i = 0; i < imax ; i++) {
298 m2tp = new Mpeg2TSPacket();
303 for (int i2=0;i2<pat.size();i2++){
304 PATData patdd=pat.get(i2);
305 if (pat.get(i2).Program_TABLE==p_table){
311 ArrayList<PMTData> pmtt=m2tp.getPMT();
312 for (int i2=0;i2<pmtt.size();i2++){
313 if (!(pmt.contains(pmtt.get(i2)))){
314 pmt.add(pmtt.get(i2));
317 if ((i==imax-1)&&(pmt.size()==0)){
320 for (int i2=0;i2<pmt.size();i2++){
322 if (p_table==pmt.get(i2).Program_Table){
323 if (!(ret.contains(pmt.get(i2).Elementary_PID))){
324 ret.add(pmt.get(i2).Elementary_PID);
328 if (ret.size()==itt){
333 PATData patd_det=new PATData();
334 for (int i=0;i<pat.size();i++){
335 if (pat.get(i).Program_TABLE==p_table){
341 ret.add(patd_det.PID);
342 ret.add(pmt.get(0).Elementary_PID);
343 for (int i=0;i<pmt.size();i++){
344 if (patd_det.Program_TABLE==pmt.get(i).Program_Table){
345 if (!(ret.contains(pmt.get(i).Elementary_PID))){
346 if ((pmt.get(i).Stream_Type==0x02)||(pmt.get(i).Stream_Type==0x0f)){
347 ret.add(pmt.get(i).Elementary_PID);
352 pids.PMT_PID=patd_det.PID;
353 pids.Program_Table=patd_det.Program_TABLE;
354 pids.PIDs=new int[ret.size()];
355 for (int i=0;i<ret.size();i++){
356 pids.PIDs[i]=ret.get(i);
359 } catch (IOException ex) {
360 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
364 } catch (IOException ex) {
365 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
370 private PIDs getTablePID_byte(String fpath,int p_table){
372 * PIDを取得し、これと思われる必要なPIDを抜き出す。
373 * @return プログラム番号(return[0])とPIDのリスト(return[1-])
375 FileInputStream in = null;
376 PIDs pids=new PIDs();
379 ArrayList<Integer> ret=new ArrayList<Integer>();
380 byte[] tb = new byte[188];
381 int[] ib = new int[188];
382 ArrayList<PATData> pat = new ArrayList<PATData>();
383 ArrayList<PMTData> pmt = new ArrayList<PMTData>();
384 String[] sb = new String[188];
385 in = new FileInputStream(fpath);
386 //int[] PIDCount = new int[8200];
388 for (int i = 0; i < imax ; i++) {
392 m2tp = new Mpeg2TSPacket();
397 for (int i2=0;i2<pat.size();i2++){
398 PATData patdd=pat.get(i2);
399 if (pat.get(i2).Program_TABLE==p_table){
405 ArrayList<PMTData> pmtt=m2tp.getPMT();
406 for (int i2=0;i2<pmtt.size();i2++){
407 if (!(pmt.contains(pmtt.get(i2)))){
408 pmt.add(pmtt.get(i2));
411 if ((i==imax-1)&&(pmt.size()==0)){
414 for (int i2=0;i2<pmt.size();i2++){
416 if (p_table==pmt.get(i2).Program_Table){
417 if (!(ret.contains(pmt.get(i2).Elementary_PID))){
418 ret.add(pmt.get(i2).Elementary_PID);
422 if (ret.size()==itt){
427 PATData patd_det=new PATData();
428 for (int i=0;i<pat.size();i++){
429 if (pat.get(i).Program_TABLE==p_table){
435 ret.add(patd_det.PID);
436 ret.add(pmt.get(0).Elementary_PID);
437 for (int i=0;i<pmt.size();i++){
438 if (patd_det.Program_TABLE==pmt.get(i).Program_Table){
439 if (!(ret.contains(pmt.get(i).Elementary_PID))){
440 if ((pmt.get(i).Stream_Type==0x02)||(pmt.get(i).Stream_Type==0x0f)){
441 ret.add(pmt.get(i).Elementary_PID);
446 pids.PMT_PID=patd_det.PID;
447 pids.Program_Table=patd_det.Program_TABLE;
448 pids.PIDs=new int[ret.size()];
449 for (int i=0;i<ret.size();i++){
450 pids.PIDs[i]=ret.get(i);
453 } catch (IOException ex) {
454 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
458 } catch (IOException ex) {
459 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
464 private int getFirstP_Table(String fpath){
466 * PIDを取得し、これと思われる必要なPIDを抜き出す。
467 * @return プログラム番号(return[0])とPIDのリスト(return[1-])
469 FileInputStream in = null;
471 int[] pat_det=new int[2];
473 PATData patdd=new PATData();
476 ArrayList ret=new ArrayList();
477 byte[] tb = new byte[188];
478 int[] ib = new int[188];
479 ArrayList<PATData> pat = new ArrayList<PATData>();
480 ArrayList<PMTData> pmt = new ArrayList<PMTData>();
481 String[] sb = new String[188];
482 in = new FileInputStream(fpath);
483 //int[] PIDCount = new int[8200];
485 for (int i = 0; i < imax ; i++) {
489 m2tp = new Mpeg2TSPacket();
495 if ((i==imax-1)&&(pmt.size()==0)){
500 for (int i=0;i<pat.size();i++){
501 if (pat.get(i).Program_TABLE>0){
506 } catch (IOException ex) {
507 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
511 } catch (IOException ex) {
512 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
515 return patdd.Program_TABLE;
519 private int getFirstP_Table_byte(String fpath){
521 * PIDを取得し、これと思われる必要なPIDを抜き出す。
522 * @return プログラム番号(return[0])とPIDのリスト(return[1-])
524 FileInputStream in = null;
526 int[] pat_det=new int[2];
528 PATData patdd=new PATData();
531 ArrayList ret=new ArrayList();
532 byte[] tb = new byte[188];
533 int[] ib = new int[188];
534 ArrayList<PATData> pat = new ArrayList<PATData>();
535 ArrayList<PMTData> pmt = new ArrayList<PMTData>();
536 String[] sb = new String[188];
537 in = new FileInputStream(fpath);
538 //int[] PIDCount = new int[8200];
540 for (int i = 0; i < imax ; i++) {
544 m2tp = new Mpeg2TSPacket();
547 m2tp.readTS_byte(tb);
550 if ((i==imax-1)&&(pmt.size()==0)){
555 for (int i=0;i<pat.size();i++){
556 if (pat.get(i).Program_TABLE>0){
561 } catch (IOException ex) {
562 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
566 } catch (IOException ex) {
567 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
570 return patdd.Program_TABLE;