OSDN Git Service

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