OSDN Git Service

5299ee490c6d37a190c0a442ef29eaaa6999c193
[rec10/rec10-git.git] / jTsSplitter / trunk / src / jtssplitter / Tsfile.java
1 /*
2  * To change this template, choose Tools | Templates
3  * and open the template in the editor.
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.EITData;
13 import jtssplitter.data.PATData;
14 import jtssplitter.data.PIDs;
15 import jtssplitter.data.PMTData;
16 /**
17  *
18  * @author Administrator
19  */
20 public class Tsfile {
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];
27         try {
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++){
32                 bis.read(tb);
33                 String last8;
34                 Mpeg2TSPacket m2tp;
35                 m2tp=new Mpeg2TSPacket();
36                 m2tp.setPAT(pat);
37                 m2tp.setPMT(pmt);
38                 m2tp.readTS(tb);
39                 pat=m2tp.getPAT();
40                 pmt=m2tp.getPMT();
41                 PIDCount[m2tp.getPID()]++;
42             }
43             for (int i=0;i<8200;i++){
44                 if (PIDCount[i]>0){
45                 }
46             }
47             for (int i=0;i<188;i++){
48                 int it=tb[i]& 0xFF;
49                 ib[i]=it;
50                 String s=Integer.toBinaryString(it);
51                 if (s.length()<8){
52                     for (int i2=s.length();i2<8;i2++){
53                         s="0"+s;
54                     }
55                 sb[i]=s;
56                 }
57             }
58             bis.close();
59             in.close();
60         } catch (IOException ex) {
61             Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
62         }
63
64     }
65     public void splitTS(String origpath,String destpath,int csch){
66         int[] pids=null;
67         int p_table=0;
68         if (csch>0){
69             p_table=csch;
70         }else{
71             p_table=getFirstP_Table(origpath);
72         }
73         PIDs pidss=getTablePID(origpath,p_table);
74         p_table=pidss.Program_Table;
75         pids=pidss.PIDs;
76         int pmt_pid=pidss.PMT_PID;
77         byte[] tb=new byte[188];
78         try {
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);
83             byte[] wbyte=null;
84             boolean end=false;
85             int ik=0;
86             boolean readend=false;
87             Mpeg2TSPacket m2tpp;
88             m2tpp=new Mpeg2TSPacket();
89             while (readend==false){
90                 byte[] tstt=new byte[3];
91                 bis.mark(188*2);
92                 bis.read(tstt);
93                 bis.reset();
94                 wbyte=null;
95                 Mpeg2TSPacket m2tp;
96                 m2tp=new Mpeg2TSPacket();
97                 int ii=m2tpp.getPIDFirst(tstt);
98                 boolean alreadyreaded=false;
99                 for (int k=0;k<pids.length;k++){
100                     if (ii==pids[k]){
101                         alreadyreaded=true;
102                         int readti=bis.read(tb);
103                         if ((ii==0)&&(readti>187)){
104                             //Mpeg2TSPacket m2tp2=new Mpeg2TSPacket();
105                             wbyte=m2tpp.splitPAT(tb,p_table);
106                         }else if ((ii==pmt_pid)&&(readti>187)){
107                             wbyte=tb;
108                             ArrayList<PMTData> pmtss=m2tpp.readPMT(tb, pmt_pid);
109                             if (pmtss.size()>0){
110                                 int[] new_pids=new int[pmtss.size()+3];
111                                 new_pids[pmtss.size()]=0;
112                                 new_pids[pmtss.size()+1]=pmt_pid;
113                                 new_pids[pmtss.size()+2]=pmtss.get(0).PCR_PID;
114                                 for (int i=0;i<pmtss.size();i++){
115                                     new_pids[i]=pmtss.get(i).Elementary_PID;
116                                 }
117                                 if (!Arrays.equals(pids, new_pids)){
118                                     pids=new_pids;
119                                 }
120                             }
121
122                         /*}else if ((ii==0x0012)&&(readti>187)){
123                             ArrayList<EITData> eitss=m2tpp.readEIT(tb);
124                          */
125                         }else if (readti>187){
126                             wbyte=tb;
127
128                         }else {
129                             readend=true;
130                         }
131                         k=pids.length;
132                     }
133                 ik++;
134             }
135             if (alreadyreaded==false){
136                 bis.skip(188);
137             }
138                 if (wbyte!=null){
139                     bos.write(wbyte);
140                 }
141             }
142             bis.close();
143             bos.flush();
144             bos.close();
145             in.close();
146             fos.close();
147
148         } catch (IOException ex) {
149             Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
150         }
151     }
152     private void writeTS(byte[] tspacket,String path){
153         FileOutputStream fos = null;
154         try {
155             fos = new FileOutputStream(path,true);
156             fos.write(tspacket);
157             fos.close();
158         } catch (IOException ex) {
159             Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
160         } finally {
161             try {
162                 fos.close();
163             } catch (IOException ex) {
164                 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
165             }
166         }
167     }
168     private PIDs getTablePID(String fpath,int p_table){
169         /**
170          * PIDを取得し、これと思われる必要なPIDを抜き出す。
171          * @return プログラム番号(return[0])とPIDのリスト(return[1-])
172          */
173         FileInputStream in = null;
174         PIDs pids=new PIDs();
175         int[] reti=null;
176         try {
177             ArrayList<Integer> ret=new ArrayList<Integer>();
178             byte[] tb = new byte[188];
179             int[] ib = new int[188];
180             ArrayList<PATData> pat = new ArrayList<PATData>();
181             ArrayList<PMTData> pmt = new ArrayList<PMTData>();
182             String[] sb = new String[188];
183             in = new FileInputStream(fpath);
184             //int[] PIDCount = new int[8200];
185             int imax=1000;
186             for (int i = 0; i < imax ; i++) {
187                 in.read(tb);
188                 String last8;
189                 Mpeg2TSPacket m2tp;
190                 m2tp = new Mpeg2TSPacket();
191                 m2tp.setPAT(pat);
192                 m2tp.setPMT(pmt);
193                 m2tp.readTS(tb);
194                 pat = m2tp.getPAT();
195                 for (int i2=0;i2<pat.size();i2++){
196                     PATData patdd=pat.get(i2);
197                     if (pat.get(i2).Program_TABLE==p_table){
198                         pat.clear();
199                         pat.add(patdd);
200                         m2tp.setPAT(pat);
201                     }
202                 }
203                 ArrayList<PMTData> pmtt=m2tp.getPMT();
204                 for (int i2=0;i2<pmtt.size();i2++){
205                     if (!(pmt.contains(pmtt.get(i2)))){
206                         pmt.add(pmtt.get(i2));
207                     }
208                 }
209                 if ((i==imax-1)&&(pmt.size()==0)){
210                     imax=imax+500;
211                 }
212                 for (int i2=0;i2<pmt.size();i2++){
213                     int itt=ret.size();
214                     if (p_table==pmt.get(i2).Program_Table){
215                         if (!(ret.contains(pmt.get(i2).Elementary_PID))){
216                             ret.add(pmt.get(i2).Elementary_PID);
217                             i=imax;
218                         }
219                     }
220                     if (ret.size()==itt){
221                         imax=imax+100;
222                     }
223                 }
224             }
225             PATData patd_det=new PATData();
226             for (int i=0;i<pat.size();i++){
227                 if (pat.get(i).Program_TABLE==p_table){
228                     patd_det=pat.get(i);
229                     i=pat.size();
230                 }
231             }
232             ret.add(0);
233             ret.add(patd_det.PID);
234             ret.add(pmt.get(0).Elementary_PID);
235             for (int i=0;i<pmt.size();i++){
236                 if (patd_det.Program_TABLE==pmt.get(i).Program_Table){
237                     if (!(ret.contains(pmt.get(i).Elementary_PID))){
238                         if ((pmt.get(i).Stream_Type==0x02)||(pmt.get(i).Stream_Type==0x0f)){
239                             ret.add(pmt.get(i).Elementary_PID);
240                         }
241                     }
242                 }
243             }
244             pids.PMT_PID=patd_det.PID;
245             pids.Program_Table=patd_det.Program_TABLE;
246             pids.PIDs=new int[ret.size()];
247             for (int i=0;i<ret.size();i++){
248                 pids.PIDs[i]=ret.get(i);
249             }
250             in.close();
251         } catch (IOException ex) {
252             Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
253         } finally {
254             try {
255                 in.close();
256             } catch (IOException ex) {
257                 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
258             }
259         }
260         return pids;
261     }
262     private int getFirstP_Table(String fpath){
263         /**
264          * PIDを取得し、これと思われる必要なPIDを抜き出す。
265          * @return プログラム番号(return[0])とPIDのリスト(return[1-])
266          */
267         FileInputStream in = null;
268         int[] reti=null;
269         int[] pat_det=new int[2];
270         //pat_det[0]=0;
271         PATData patdd=new PATData();
272         patdd.PID=0;
273         try {
274             ArrayList ret=new ArrayList();
275             byte[] tb = new byte[188];
276             int[] ib = new int[188];
277             ArrayList<PATData> pat = new ArrayList<PATData>();
278             ArrayList<PMTData> pmt = new ArrayList<PMTData>();
279             String[] sb = new String[188];
280             in = new FileInputStream(fpath);
281             //int[] PIDCount = new int[8200];
282             int imax=1000;
283             for (int i = 0; i < imax ; i++) {
284                 in.read(tb);
285                 String last8;
286                 Mpeg2TSPacket m2tp;
287                 m2tp = new Mpeg2TSPacket();
288                 m2tp.setPAT(pat);
289                 m2tp.setPMT(pmt);
290                 m2tp.readTS(tb);
291                 pat = m2tp.getPAT();
292                 pmt = m2tp.getPMT();
293                 if ((i==imax-1)&&(pmt.size()==0)){
294                     imax=imax+500;
295                 }
296             }
297             
298             for (int i=0;i<pat.size();i++){
299                 if (pat.get(i).Program_TABLE>0){
300                     patdd=pat.get(i);
301                     i=pat.size();
302                 }
303             }
304         } catch (IOException ex) {
305             Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
306         } finally {
307             try {
308                 in.close();
309             } catch (IOException ex) {
310                 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
311             }
312         }
313         return patdd.Program_TABLE;
314     }
315 }