OSDN Git Service

stop using trunk directory in rectool
[rec10/rec10-git.git] / jTsSplitter / trunk / src / jtssplitter / Tsfile.java
index 6c39168..587243b 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
+ * jTsSplitter - java based mpeg2ts splitter.
+ * Copyright (C) 2009-2012 Yukikaze
  */
 
 package jtssplitter;
@@ -8,6 +8,7 @@ import java.util.ArrayList;
 import java.io.*;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import java.util.Arrays;
 import jtssplitter.data.PATData;
 import jtssplitter.data.PIDs;
 import jtssplitter.data.PMTData;
@@ -16,68 +17,32 @@ import jtssplitter.data.PMTData;
  * @author Administrator
  */
 public class Tsfile {
-    public void readTs(String fpath){
-        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];
-        try {
-            FileInputStream in = new FileInputStream(fpath);
-            int[] PIDCount=new int[8200];
-            for (int i=0;i<3000;i++){
-                in.read(tb);
-                String last8;
-                Mpeg2TSPacket m2tp;
-                m2tp=new Mpeg2TSPacket();
-                m2tp.setPAT(pat);
-                m2tp.setPMT(pmt);
-                m2tp.readTS(tb);
-                pat=m2tp.getPAT();
-                pmt=m2tp.getPMT();
-                PIDCount[m2tp.getPID()]++;
-            }
-            for (int i=0;i<8200;i++){
-                if (PIDCount[i]>0){
-                }
-            }
-            for (int i=0;i<188;i++){
-                int it=tb[i]& 0xFF;
-                ib[i]=it;
-                String s=Integer.toBinaryString(it);
-                if (s.length()<8){
-                    for (int i2=s.length();i2<8;i2++){
-                        s="0"+s;
-                    }
-                sb[i]=s;
-                }
-            }
-        } catch (IOException ex) {
-            Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
-        }
-
-    }
-    public void splitTS(String origpath,String destpath,int csch){
+    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(origpath);
+            p_table=getFirstP_Table_byte(origpath);
         }
-        PIDs pidss=getTablePID(origpath,p_table);
+        PIDs pidss=getTablePID_byte(origpath,p_table);
         p_table=pidss.Program_Table;
         pids=pidss.PIDs;
+        int pmt_pid=pidss.PMT_PID;
+        System.out.println("番組の同定終了");
+        System.out.println("Program Table : "+Integer.toString(p_table));
         byte[] tb=new byte[188];
         try {
             FileInputStream in = new FileInputStream(origpath);
-            FileOutputStream fos=new FileOutputStream(destpath,true);
+            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);
@@ -86,28 +51,96 @@ public class Tsfile {
                 wbyte=null;
                 Mpeg2TSPacket m2tp;
                 m2tp=new Mpeg2TSPacket();
-                int ii=m2tp.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]){
-                        alreadyreaded=true;
-                        int readti=bis.read(tb);
-                        if ((ii==0)&&(readti>187)){
-                            Mpeg2TSPacket m2tp2=new Mpeg2TSPacket();
-                            wbyte=m2tp2.splitPAT(tb,p_table);
-                        }else if (readti>187){
-                            wbyte=tb;
+                    if (alreadyreaded==false){
+                        if (ii==pids[k]){
+                            alreadyreaded=true;
+                            int readti=bis.read(tb);
+                            if ((ii==0)&&(readti>187)){
+                                Mpeg2TSPacket m2tp2=new Mpeg2TSPacket();
+                                m2tp2.readTS_byte(tb);
+                                ArrayList<PATData> pats=new ArrayList<PATData>();
+                                pats=m2tp2.getPAT();
+                                boolean containp_table=false;
+                                for (int iii=0;iii<pats.size();iii++){
+                                    if (pats.get(iii).Program_TABLE==p_table){
+                                        containp_table=true;
+                                    }else if (csch > 0){
+                                        containp_table=true;
+                                    }
+                                }
+                                if (!containp_table){
+                                    for (int iii=0;iii<pats.size();iii++){
+                                        if (pats.get(iii).Program_TABLE>0){
+                                            System.out.println("Program Tableの変更を検知"+Integer.toString(p_table)+" to "+Integer.toString(pats.get(iii).Program_TABLE));
+                                            p_table=pats.get(iii).Program_TABLE;
+                                            for (int it=0;it<pids.length;it++){
+                                                if (pids[it]==pmt_pid){
+                                                    pmt_pid=pats.get(iii).PID;
+                                                    pids[it]=pmt_pid;
+                                                }
+                                            }
+                                            iii=pats.size();
+                                        }
+                                    }
+                                }
+
+                                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;
+                                try{
+                                    pmtss=m2tpp.readPMTglobal_byte(tb, pmt_pid);
+                                }catch(Exception e){
+                                    pmtss=new ArrayList<PMTData>();
+                                }
+                                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;
                         }
-                        k=pids.length;
                     }
                 ik++;
             }
             if (alreadyreaded==false){
                 bis.skip(188);
             }
-            if (bis.available()<188){
-                readend=true;
-            }
                 if (wbyte!=null){
                     bos.write(wbyte);
                 }
@@ -122,23 +155,7 @@ public class Tsfile {
             Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
         }
     }
-    private void writeTS(byte[] tspacket,String path){
-        FileOutputStream fos = null;
-        try {
-            fos = new FileOutputStream(path,true);
-            fos.write(tspacket);
-            fos.close();
-        } catch (IOException ex) {
-            Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
-        } finally {
-            try {
-                fos.close();
-            } catch (IOException ex) {
-                Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
-            }
-        }
-    }
-    private PIDs getTablePID(String fpath,int p_table){
+    private PIDs getTablePID_byte(String fpath,int p_table){
         /**
          * PIDを取得し、これと思われる必要なPIDを抜き出す。
          * @return プログラム番号(return[0])とPIDのリスト(return[1-])
@@ -154,16 +171,19 @@ public class Tsfile {
             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);
+                if (in.read(tb)==-1){
+                    in.close();
+                    System.out.println("Program Table and PMT not found.");
+                    System.exit(1);
+                }
                 String last8;
                 Mpeg2TSPacket m2tp;
                 m2tp = new Mpeg2TSPacket();
                 m2tp.setPAT(pat);
                 m2tp.setPMT(pmt);
-                m2tp.readTS(tb);
+                m2tp.readTS_byte(tb);
                 pat = m2tp.getPAT();
                 for (int i2=0;i2<pat.size();i2++){
                     PATData patdd=pat.get(i2);
@@ -204,13 +224,17 @@ public class Tsfile {
             }
             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))){
-                        ret.add(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++){
@@ -228,7 +252,68 @@ public class Tsfile {
         }
         return pids;
     }
-    private int getFirstP_Table(String fpath){
+    public Integer[] getProgramNum_byte(String fpath){
+            /**
+             * PIDを取得し、これと思われる必要なPIDを抜き出す。
+             * @return プログラム番号(return[0])とPIDのリスト(return[1-])
+             */
+            FileInputStream in = null;
+            ArrayList<Integer> retti = new ArrayList<Integer>();
+            byte[] tb = new byte[188];
+            ArrayList<PATData> pat = new ArrayList<PATData>();
+            ArrayList<PATData> pat_ok = new ArrayList<PATData>();
+            ArrayList<PMTData> pmt = new ArrayList<PMTData>();
+            try {
+            in = new FileInputStream(fpath);
+            int imax = 7000;
+            int mmax = 20000;
+            for (int i = 0; i < imax; i++) {
+                if (in.read(tb) == -1) {
+                    in.close();
+                    System.out.println("Program Table not found.");
+                    System.exit(1);
+                }
+                String last8;
+                Mpeg2TSPacket m2tp;
+                m2tp = new Mpeg2TSPacket();
+                m2tp.setPAT(pat);
+                m2tp.setPMT(pmt);
+                m2tp.readTS_byte(tb);
+                pat = m2tp.getPAT();
+                pmt = 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));
+                    }
+                }
+
+                if (i>imax-10 && pat_ok.size()==0 && i<mmax){
+                    imax=imax+100;
+                }
+                for (int i3=0;i3<pmt.size();i3++){
+                    if (pmt.get(i3).Stream_Type==0x02){
+                        for (int i4=0;i4<pat.size();i4++){
+                            if (pmt.get(i3).Program_Table==pat.get(i4).Program_TABLE && !(pat_ok.contains(pat.get(i4)))){
+                                pat_ok.add(pat.get(i4));
+                            }
+                        }
+                    }
+                }
+            }
+            for (int i5 = 0; i5 < pat_ok.size(); i5++) {
+                PATData patdd = pat_ok.get(i5);
+                if ((patdd.Program_TABLE != 0) &&(!(retti.contains(patdd.Program_TABLE)))){
+                    retti.add(patdd.Program_TABLE);
+                }
+            }
+        } catch (IOException ex) {
+            Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        Integer[] rt=retti.toArray(new Integer[retti.size()]);
+        return rt;
+    }
+    private int getFirstP_Table_byte(String fpath){
         /**
          * PIDを取得し、これと思われる必要なPIDを抜き出す。
          * @return プログラム番号(return[0])とPIDのリスト(return[1-])
@@ -249,6 +334,7 @@ public class Tsfile {
             in = new FileInputStream(fpath);
             //int[] PIDCount = new int[8200];
             int imax=1000;
+            calc cal=new calc();
             for (int i = 0; i < imax ; i++) {
                 in.read(tb);
                 String last8;
@@ -256,14 +342,14 @@ public class Tsfile {
                 m2tp = new Mpeg2TSPacket();
                 m2tp.setPAT(pat);
                 m2tp.setPMT(pmt);
-                m2tp.readTS(tb);
+                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);