OSDN Git Service

fix to read correct Pointer_Field used in PAT.
[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 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 (ii==pids[k]){
62                         alreadyreaded=true;
63                         int readti=bis.read(tb);
64                         if ((ii==0)&&(readti>187)){
65                             Mpeg2TSPacket m2tp2=new Mpeg2TSPacket();
66                             m2tp2.readTS_byte(tb);
67                             ArrayList<PATData> pats=new ArrayList<PATData>();
68                             pats=m2tp2.getPAT();
69                             boolean containp_table=false;
70                             for (int iii=0;iii<pats.size();iii++){
71                                 if (pats.get(iii).Program_TABLE==p_table){
72                                     containp_table=true;
73                                 }
74                             }
75                             if (!containp_table){
76                                 for (int iii=0;iii<pats.size();iii++){
77                                     if (pats.get(iii).Program_TABLE>0){
78                                         System.out.println("Program Tableの変更を検知"+Integer.toString(p_table)+" to "+Integer.toString(pats.get(iii).Program_TABLE));
79                                         p_table=pats.get(iii).Program_TABLE;
80                                         for (int it=0;it<pids.length;it++){
81                                             if (pids[it]==pmt_pid){
82                                                 pmt_pid=pats.get(iii).PID;
83                                                 pids[it]=pmt_pid;
84                                             }
85                                         }
86                                         iii=pats.size();
87                                     }
88                                 }
89                             }
90
91                             wbyte=m2tpp.splitPAT_byte(tb,p_table);
92                             //wbyte=m2tpp.splitPAT(tb, p_table);
93                             /*byte[] wbytet=m2tpp.splitPAT(tb, p_table);
94                             for (int kk=0;kk<wbyte.length;kk++){
95                                 if (wbyte[kk]==wbytet[kk]){
96                                     //System.out.println(":match");
97                                 }else{
98                                     System.out.print(kk);
99                                     System.out.println(":not match");
100                                 }
101                             }*/
102                             //wbyte=wbytet;*/
103                         }else if ((ii==pmt_pid)&&(readti>187)){
104                             wbyte=tb;
105                             ArrayList<PMTData> pmtss=m2tpp.readPMTglobal_byte(tb, pmt_pid);
106                             if (pmtss.size()>0){
107                                 int[] new_pids=new int[pmtss.size()+3];
108                                 new_pids[pmtss.size()]=0;
109                                 new_pids[pmtss.size()+1]=pmt_pid;
110                                 new_pids[pmtss.size()+2]=pmtss.get(0).PCR_PID;
111                                 for (int i=0;i<pmtss.size();i++){
112                                     new_pids[i]=pmtss.get(i).Elementary_PID;
113                                 }
114                                 if (!Arrays.equals(pids, new_pids)){
115                                     pids=new_pids;
116                                 }
117                             }
118
119                         /*}else if ((ii==0x0012)&&(readti>187)){
120                             ArrayList<EITData> eitss=m2tpp.readEIT(tb);
121                          */
122                         }else if (readti>187){
123                             wbyte=tb;
124
125                         }else {
126                             readend=true;
127                         }
128                         k=pids.length;
129                     }
130                 ik++;
131             }
132             if (alreadyreaded==false){
133                 bis.skip(188);
134             }
135                 if (wbyte!=null){
136                     bos.write(wbyte);
137                 }
138             }
139             bis.close();
140             bos.flush();
141             bos.close();
142             in.close();
143             fos.close();
144
145         } catch (IOException ex) {
146             Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
147         }
148     }
149     private PIDs getTablePID_byte(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                 m2tp.readTS_byte(tb);
176                 pat = m2tp.getPAT();
177                 for (int i2=0;i2<pat.size();i2++){
178                     PATData patdd=pat.get(i2);
179                     if (pat.get(i2).Program_TABLE==p_table){
180                         pat.clear();
181                         pat.add(patdd);
182                         m2tp.setPAT(pat);
183                     }
184                 }
185                 ArrayList<PMTData> pmtt=m2tp.getPMT();
186                 for (int i2=0;i2<pmtt.size();i2++){
187                     if (!(pmt.contains(pmtt.get(i2)))){
188                         pmt.add(pmtt.get(i2));
189                     }
190                 }
191                 if ((i==imax-1)&&(pmt.size()==0)){
192                     imax=imax+500;
193                 }
194                 for (int i2=0;i2<pmt.size();i2++){
195                     int itt=ret.size();
196                     if (p_table==pmt.get(i2).Program_Table){
197                         if (!(ret.contains(pmt.get(i2).Elementary_PID))){
198                             ret.add(pmt.get(i2).Elementary_PID);
199                             i=imax;
200                         }
201                     }
202                     if (ret.size()==itt){
203                         imax=imax+100;
204                     }
205                 }
206             }
207             PATData patd_det=new PATData();
208             for (int i=0;i<pat.size();i++){
209                 if (pat.get(i).Program_TABLE==p_table){
210                     patd_det=pat.get(i);
211                     i=pat.size();
212                 }
213             }
214             ret.add(0);
215             ret.add(patd_det.PID);
216             ret.add(pmt.get(0).Elementary_PID);
217             for (int i=0;i<pmt.size();i++){
218                 if (patd_det.Program_TABLE==pmt.get(i).Program_Table){
219                     if (!(ret.contains(pmt.get(i).Elementary_PID))){
220                         if ((pmt.get(i).Stream_Type==0x02)||(pmt.get(i).Stream_Type==0x0f)){
221                             ret.add(pmt.get(i).Elementary_PID);
222                         }
223                     }
224                 }
225             }
226             pids.PMT_PID=patd_det.PID;
227             pids.Program_Table=patd_det.Program_TABLE;
228             pids.PIDs=new int[ret.size()];
229             for (int i=0;i<ret.size();i++){
230                 pids.PIDs[i]=ret.get(i);
231             }
232             in.close();
233         } catch (IOException ex) {
234             Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
235         } finally {
236             try {
237                 in.close();
238             } catch (IOException ex) {
239                 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
240             }
241         }
242         return pids;
243     }
244     private int getFirstP_Table_byte(String fpath){
245         /**
246          * PIDを取得し、これと思われる必要なPIDを抜き出す。
247          * @return プログラム番号(return[0])とPIDのリスト(return[1-])
248          */
249         FileInputStream in = null;
250         int[] reti=null;
251         int[] pat_det=new int[2];
252         //pat_det[0]=0;
253         PATData patdd=new PATData();
254         patdd.PID=0;
255         try {
256             ArrayList ret=new ArrayList();
257             byte[] tb = new byte[188];
258             int[] ib = new int[188];
259             ArrayList<PATData> pat = new ArrayList<PATData>();
260             ArrayList<PMTData> pmt = new ArrayList<PMTData>();
261             String[] sb = new String[188];
262             in = new FileInputStream(fpath);
263             //int[] PIDCount = new int[8200];
264             int imax=1000;
265             calc cal=new calc();
266             for (int i = 0; i < imax ; i++) {
267                 in.read(tb);
268                 String last8;
269                 Mpeg2TSPacket m2tp;
270                 m2tp = new Mpeg2TSPacket();
271                 m2tp.setPAT(pat);
272                 m2tp.setPMT(pmt);
273                 m2tp.readTS_byte(tb);
274                 pat = m2tp.getPAT();
275                 pmt = m2tp.getPMT();
276                 if ((i==imax-1)&&(pmt.size()==0)){
277                     imax=imax+500;
278                 }
279             }
280
281             for (int i=0;i<pat.size();i++){
282                 if (pat.get(i).Program_TABLE>0){
283                     patdd=pat.get(i);
284                     i=pat.size();
285                 }
286             }
287         } catch (IOException ex) {
288             Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
289         } finally {
290             try {
291                 in.close();
292             } catch (IOException ex) {
293                 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
294             }
295         }
296         return patdd.Program_TABLE;
297     }
298 }