OSDN Git Service

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