OSDN Git Service

fix to ignore broken Ts.
[rec10/rec10-git.git] / jTsSplitter / trunk / src / jtssplitter / Tsfile.java
1 /*
2  * jTsSplitter - java based mpeg2ts splitter.
3  * Copyright (C) 2009-2010 Yukikaze
4  */
5
6 package jtssplitter;
7 import java.util.ArrayList;
8 import java.io.*;
9 import java.util.logging.Level;
10 import java.util.logging.Logger;
11 import java.util.Arrays;
12 import jtssplitter.data.PATData;
13 import jtssplitter.data.PIDs;
14 import jtssplitter.data.PMTData;
15 /**
16  *
17  * @author Administrator
18  */
19 public class Tsfile {
20     public void splitTS_byte(String origpath,String destpath,int csch){
21         int[] pids=null;
22         int p_table=0;
23         if (csch>0){
24             p_table=csch;
25         }else{
26             p_table=getFirstP_Table_byte(origpath);
27         }
28         PIDs pidss=getTablePID_byte(origpath,p_table);
29         p_table=pidss.Program_Table;
30         pids=pidss.PIDs;
31         int pmt_pid=pidss.PMT_PID;
32         System.out.println("番組の同定終了");
33         System.out.println("Program Table : "+Integer.toString(p_table));
34         byte[] tb=new byte[188];
35         try {
36             FileInputStream in = new FileInputStream(origpath);
37             FileOutputStream fos=new FileOutputStream(destpath);
38             BufferedInputStream bis=new BufferedInputStream(in,128*188);
39             BufferedOutputStream bos=new BufferedOutputStream(fos);
40             byte[] wbyte=null;
41             boolean end=false;
42             int ik=0;
43             boolean readend=false;
44             Mpeg2TSPacket m2tpp;
45             m2tpp=new Mpeg2TSPacket();
46             while (readend==false){
47                 byte[] tstt=new byte[3];
48                 bis.mark(188*2);
49                 bis.read(tstt);
50                 bis.reset();
51                 wbyte=null;
52                 Mpeg2TSPacket m2tp;
53                 m2tp=new Mpeg2TSPacket();
54                 //int ii=m2tpp.getPIDFirst(tstt);
55                 int ii=m2tpp.getPIDFirst_byte(tstt);
56                 //if (ii!=i2){
57                 //    System.out.println("not match");
58                 //}
59                 boolean alreadyreaded=false;
60                 for (int k=0;k<pids.length;k++){
61                     if (alreadyreaded==false){
62                         if (ii==pids[k]){
63                             alreadyreaded=true;
64                             int readti=bis.read(tb);
65                             if ((ii==0)&&(readti>187)){
66                                 Mpeg2TSPacket m2tp2=new Mpeg2TSPacket();
67                                 m2tp2.readTS_byte(tb);
68                                 ArrayList<PATData> pats=new ArrayList<PATData>();
69                                 pats=m2tp2.getPAT();
70                                 boolean containp_table=false;
71                                 for (int iii=0;iii<pats.size();iii++){
72                                     if (pats.get(iii).Program_TABLE==p_table){
73                                         containp_table=true;
74                                     }
75                                 }
76                                 if (!containp_table){
77                                     for (int iii=0;iii<pats.size();iii++){
78                                         if (pats.get(iii).Program_TABLE>0){
79                                             System.out.println("Program Tableの変更を検知"+Integer.toString(p_table)+" to "+Integer.toString(pats.get(iii).Program_TABLE));
80                                             p_table=pats.get(iii).Program_TABLE;
81                                             for (int it=0;it<pids.length;it++){
82                                                 if (pids[it]==pmt_pid){
83                                                     pmt_pid=pats.get(iii).PID;
84                                                     pids[it]=pmt_pid;
85                                                 }
86                                             }
87                                             iii=pats.size();
88                                         }
89                                     }
90                                 }
91
92                                 wbyte=m2tpp.splitPAT_byte(tb,p_table);
93                                 //wbyte=m2tpp.splitPAT(tb, p_table);
94                                 /*byte[] wbytet=m2tpp.splitPAT(tb, p_table);
95                                 for (int kk=0;kk<wbyte.length;kk++){
96                                     if (wbyte[kk]==wbytet[kk]){
97                                         //System.out.println(":match");
98                                     }else{
99                                         System.out.print(kk);
100                                         System.out.println(":not match");
101                                     }
102                                 }*/
103                                 //wbyte=wbytet;*/
104                             }else if ((ii==pmt_pid)&&(readti>187)){
105                                 wbyte=tb;
106                                 ArrayList<PMTData> pmtss=m2tpp.readPMTglobal_byte(tb, pmt_pid);
107                                 if (pmtss.size()>0){
108                                     int[] new_pids=new int[pmtss.size()+3];
109                                     new_pids[pmtss.size()]=0;
110                                     new_pids[pmtss.size()+1]=pmt_pid;
111                                     new_pids[pmtss.size()+2]=pmtss.get(0).PCR_PID;
112                                     for (int i=0;i<pmtss.size();i++){
113                                         new_pids[i]=pmtss.get(i).Elementary_PID;
114                                     }
115                                     if (!Arrays.equals(pids, new_pids)){
116                                         pids=new_pids;
117                                     }
118                                 }
119
120                             /*}else if ((ii==0x0012)&&(readti>187)){
121                                 ArrayList<EITData> eitss=m2tpp.readEIT(tb);
122                              */
123                             }else if (readti>187){
124                                 wbyte=tb;
125
126                             }else {
127                                 readend=true;
128                             }
129                             k=pids.length;
130                         }
131                     }
132                 ik++;
133             }
134             if (alreadyreaded==false){
135                 bis.skip(188);
136             }
137                 if (wbyte!=null){
138                     bos.write(wbyte);
139                 }
140             }
141             bis.close();
142             bos.flush();
143             bos.close();
144             in.close();
145             fos.close();
146
147         } catch (IOException ex) {
148             Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
149         }
150     }
151     private PIDs getTablePID_byte(String fpath,int p_table){
152         /**
153          * PIDを取得し、これと思われる必要なPIDを抜き出す。
154          * @return プログラム番号(return[0])とPIDのリスト(return[1-])
155          */
156         FileInputStream in = null;
157         PIDs pids=new PIDs();
158         int[] reti=null;
159         try {
160             ArrayList<Integer> ret=new ArrayList<Integer>();
161             byte[] tb = new byte[188];
162             int[] ib = new int[188];
163             ArrayList<PATData> pat = new ArrayList<PATData>();
164             ArrayList<PMTData> pmt = new ArrayList<PMTData>();
165             String[] sb = new String[188];
166             in = new FileInputStream(fpath);
167             int imax=1000;
168             for (int i = 0; i < imax ; i++) {
169                 if (in.read(tb)==-1){
170                     in.close();
171                     System.out.println("Program Table and PMT not found.");
172                     System.exit(1);
173                 }
174                 String last8;
175                 Mpeg2TSPacket m2tp;
176                 m2tp = new Mpeg2TSPacket();
177                 m2tp.setPAT(pat);
178                 m2tp.setPMT(pmt);
179                 m2tp.readTS_byte(tb);
180                 pat = m2tp.getPAT();
181                 for (int i2=0;i2<pat.size();i2++){
182                     PATData patdd=pat.get(i2);
183                     if (pat.get(i2).Program_TABLE==p_table){
184                         pat.clear();
185                         pat.add(patdd);
186                         m2tp.setPAT(pat);
187                     }
188                 }
189                 ArrayList<PMTData> pmtt=m2tp.getPMT();
190                 for (int i2=0;i2<pmtt.size();i2++){
191                     if (!(pmt.contains(pmtt.get(i2)))){
192                         pmt.add(pmtt.get(i2));
193                     }
194                 }
195                 if ((i==imax-1)&&(pmt.size()==0)){
196                     imax=imax+500;
197                 }
198                 for (int i2=0;i2<pmt.size();i2++){
199                     int itt=ret.size();
200                     if (p_table==pmt.get(i2).Program_Table){
201                         if (!(ret.contains(pmt.get(i2).Elementary_PID))){
202                             ret.add(pmt.get(i2).Elementary_PID);
203                             i=imax;
204                         }
205                     }
206                     if (ret.size()==itt){
207                         imax=imax+100;
208                     }
209                 }
210             }
211             PATData patd_det=new PATData();
212             for (int i=0;i<pat.size();i++){
213                 if (pat.get(i).Program_TABLE==p_table){
214                     patd_det=pat.get(i);
215                     i=pat.size();
216                 }
217             }
218             ret.add(0);
219             ret.add(patd_det.PID);
220             ret.add(pmt.get(0).Elementary_PID);
221             for (int i=0;i<pmt.size();i++){
222                 if (patd_det.Program_TABLE==pmt.get(i).Program_Table){
223                     if (!(ret.contains(pmt.get(i).Elementary_PID))){
224                         if ((pmt.get(i).Stream_Type==0x02)||(pmt.get(i).Stream_Type==0x0f)){
225                             ret.add(pmt.get(i).Elementary_PID);
226                         }
227                     }
228                 }
229             }
230             pids.PMT_PID=patd_det.PID;
231             pids.Program_Table=patd_det.Program_TABLE;
232             pids.PIDs=new int[ret.size()];
233             for (int i=0;i<ret.size();i++){
234                 pids.PIDs[i]=ret.get(i);
235             }
236             in.close();
237         } catch (IOException ex) {
238             Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
239         } finally {
240             try {
241                 in.close();
242             } catch (IOException ex) {
243                 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
244             }
245         }
246         return pids;
247     }
248     private int getFirstP_Table_byte(String fpath){
249         /**
250          * PIDを取得し、これと思われる必要なPIDを抜き出す。
251          * @return プログラム番号(return[0])とPIDのリスト(return[1-])
252          */
253         FileInputStream in = null;
254         int[] reti=null;
255         int[] pat_det=new int[2];
256         //pat_det[0]=0;
257         PATData patdd=new PATData();
258         patdd.PID=0;
259         try {
260             ArrayList ret=new ArrayList();
261             byte[] tb = new byte[188];
262             int[] ib = new int[188];
263             ArrayList<PATData> pat = new ArrayList<PATData>();
264             ArrayList<PMTData> pmt = new ArrayList<PMTData>();
265             String[] sb = new String[188];
266             in = new FileInputStream(fpath);
267             //int[] PIDCount = new int[8200];
268             int imax=1000;
269             calc cal=new calc();
270             for (int i = 0; i < imax ; i++) {
271                 in.read(tb);
272                 String last8;
273                 Mpeg2TSPacket m2tp;
274                 m2tp = new Mpeg2TSPacket();
275                 m2tp.setPAT(pat);
276                 m2tp.setPMT(pmt);
277                 m2tp.readTS_byte(tb);
278                 pat = m2tp.getPAT();
279                 pmt = m2tp.getPMT();
280                 if ((i==imax-1)&&(pmt.size()==0)){
281                     imax=imax+500;
282                 }
283             }
284
285             for (int i=0;i<pat.size();i++){
286                 if (pat.get(i).Program_TABLE>0){
287                     patdd=pat.get(i);
288                     i=pat.size();
289                 }
290             }
291         } catch (IOException ex) {
292             Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
293         } finally {
294             try {
295                 in.close();
296             } catch (IOException ex) {
297                 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
298             }
299         }
300         return patdd.Program_TABLE;
301     }
302 }