2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
7 import java.util.ArrayList;
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;
18 * @author Administrator
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];
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++){
35 m2tp=new Mpeg2TSPacket();
41 PIDCount[m2tp.getPID()]++;
43 for (int i=0;i<8200;i++){
47 for (int i=0;i<188;i++){
50 String s=Integer.toBinaryString(it);
52 for (int i2=s.length();i2<8;i2++){
60 } catch (IOException ex) {
61 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
65 public void splitTS(String origpath,String destpath,int csch){
71 p_table=getFirstP_Table(origpath);
73 PIDs pidss=getTablePID(origpath,p_table);
74 p_table=pidss.Program_Table;
76 int pmt_pid=pidss.PMT_PID;
77 byte[] tb=new byte[188];
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);
86 boolean readend=false;
88 m2tpp=new Mpeg2TSPacket();
89 while (readend==false){
90 byte[] tstt=new byte[3];
96 m2tp=new Mpeg2TSPacket();
97 int ii=m2tpp.getPIDFirst(tstt);
98 boolean alreadyreaded=false;
99 for (int k=0;k<pids.length;k++){
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)){
108 ArrayList<PMTData> pmtss=m2tpp.readPMT(tb, pmt_pid);
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;
117 if (!Arrays.equals(pids, new_pids)){
122 /*}else if ((ii==0x0012)&&(readti>187)){
123 ArrayList<EITData> eitss=m2tpp.readEIT(tb);
125 }else if (readti>187){
135 if (alreadyreaded==false){
148 } catch (IOException ex) {
149 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
152 private void writeTS(byte[] tspacket,String path){
153 FileOutputStream fos = null;
155 fos = new FileOutputStream(path,true);
158 } catch (IOException ex) {
159 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
163 } catch (IOException ex) {
164 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
168 private PIDs getTablePID(String fpath,int p_table){
170 * PIDを取得し、これと思われる必要なPIDを抜き出す。
171 * @return プログラム番号(return[0])とPIDのリスト(return[1-])
173 FileInputStream in = null;
174 PIDs pids=new PIDs();
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];
186 for (int i = 0; i < imax ; i++) {
190 m2tp = new Mpeg2TSPacket();
195 for (int i2=0;i2<pat.size();i2++){
196 PATData patdd=pat.get(i2);
197 if (pat.get(i2).Program_TABLE==p_table){
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));
209 if ((i==imax-1)&&(pmt.size()==0)){
212 for (int i2=0;i2<pmt.size();i2++){
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);
220 if (ret.size()==itt){
225 PATData patd_det=new PATData();
226 for (int i=0;i<pat.size();i++){
227 if (pat.get(i).Program_TABLE==p_table){
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);
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);
251 } catch (IOException ex) {
252 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
256 } catch (IOException ex) {
257 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
262 private int getFirstP_Table(String fpath){
264 * PIDを取得し、これと思われる必要なPIDを抜き出す。
265 * @return プログラム番号(return[0])とPIDのリスト(return[1-])
267 FileInputStream in = null;
269 int[] pat_det=new int[2];
271 PATData patdd=new PATData();
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];
283 for (int i = 0; i < imax ; i++) {
287 m2tp = new Mpeg2TSPacket();
293 if ((i==imax-1)&&(pmt.size()==0)){
298 for (int i=0;i<pat.size();i++){
299 if (pat.get(i).Program_TABLE>0){
304 } catch (IOException ex) {
305 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
309 } catch (IOException ex) {
310 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
313 return patdd.Program_TABLE;