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.PATData;
13 import jtssplitter.data.PIDs;
14 import jtssplitter.data.PMTData;
17 * @author Administrator
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];
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++){
34 m2tp=new Mpeg2TSPacket();
40 PIDCount[m2tp.getPID()]++;
42 for (int i=0;i<8200;i++){
46 for (int i=0;i<188;i++){
49 String s=Integer.toBinaryString(it);
51 for (int i2=s.length();i2<8;i2++){
59 } catch (IOException ex) {
60 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
64 public void splitTS(String origpath,String destpath,int csch){
70 p_table=getFirstP_Table(origpath);
72 PIDs pidss=getTablePID(origpath,p_table);
73 p_table=pidss.Program_Table;
75 int pmt_pid=pidss.PMT_PID;
76 byte[] tb=new byte[188];
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);
85 boolean readend=false;
87 m2tpp=new Mpeg2TSPacket();
88 while (readend==false){
89 byte[] tstt=new byte[3];
95 m2tp=new Mpeg2TSPacket();
96 int ii=m2tpp.getPIDFirst(tstt);
97 boolean alreadyreaded=false;
98 for (int k=0;k<pids.length;k++){
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)){
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;
115 if (!Arrays.equals(pids, new_pids)){
119 }else if (readti>187){
129 if (alreadyreaded==false){
142 } catch (IOException ex) {
143 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
146 private void writeTS(byte[] tspacket,String path){
147 FileOutputStream fos = null;
149 fos = new FileOutputStream(path,true);
152 } catch (IOException ex) {
153 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
157 } catch (IOException ex) {
158 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
162 private PIDs getTablePID(String fpath,int p_table){
164 * PIDを取得し、これと思われる必要なPIDを抜き出す。
165 * @return プログラム番号(return[0])とPIDのリスト(return[1-])
167 FileInputStream in = null;
168 PIDs pids=new PIDs();
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];
180 for (int i = 0; i < imax ; i++) {
184 m2tp = new Mpeg2TSPacket();
189 for (int i2=0;i2<pat.size();i2++){
190 PATData patdd=pat.get(i2);
191 if (pat.get(i2).Program_TABLE==p_table){
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));
203 if ((i==imax-1)&&(pmt.size()==0)){
206 for (int i2=0;i2<pmt.size();i2++){
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);
214 if (ret.size()==itt){
219 PATData patd_det=new PATData();
220 for (int i=0;i<pat.size();i++){
221 if (pat.get(i).Program_TABLE==p_table){
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);
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);
245 } catch (IOException ex) {
246 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
250 } catch (IOException ex) {
251 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
256 private int getFirstP_Table(String fpath){
258 * PIDを取得し、これと思われる必要なPIDを抜き出す。
259 * @return プログラム番号(return[0])とPIDのリスト(return[1-])
261 FileInputStream in = null;
263 int[] pat_det=new int[2];
265 PATData patdd=new PATData();
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];
277 for (int i = 0; i < imax ; i++) {
281 m2tp = new Mpeg2TSPacket();
287 if ((i==imax-1)&&(pmt.size()==0)){
292 for (int i=0;i<pat.size();i++){
293 if (pat.get(i).Program_TABLE>0){
298 } catch (IOException ex) {
299 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
303 } catch (IOException ex) {
304 Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex);
307 return patdd.Program_TABLE;