OSDN Git Service

lots of bug fixes.
[rec10/rec10-git.git] / jTsSplitter / trunk / src / jtssplitter / Mpeg2TSPacket.java
index ad51975..39e79e0 100644 (file)
@@ -1,9 +1,12 @@
 package jtssplitter;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.zip.CRC32;
 import jtssplitter.data.PATData;
 import jtssplitter.data.PMTData;
+import jtssplitter.data.Descriptor;
+import jtssplitter.data.Video_stream_descriptor;
 /*
  * To change this template, choose Tools | Templates
  * and open the template in the editor.
@@ -136,6 +139,7 @@ public class Mpeg2TSPacket {
         ArrayList<PMTData> pmt_t = new ArrayList<PMTData>();
         int tableid = TSString2Int(payload_temp, 0, 8);
         int section_length = TSString2Int(payload_temp, 12, 12);
+        int pcr_pid = TSString2Int(payload_temp, 67, 13);
         int program_info_length = TSString2Int(payload_temp, 84, 12);
         boolean end = false;
         int cur_point = 96 + program_info_length * 8;
@@ -149,11 +153,23 @@ public class Mpeg2TSPacket {
                 int elementary_PID = TSString2Int(payload_temp, cur_point + 11, 13);
                 //System.out.println(Integer.toString(cur_point)+" :  "+Integer.toString(section_length*8));
                 int es_length = TSString2Int(payload_temp, cur_point + 28, 12);
+                if (pmt_stream_type==0x02){
+                    Descriptor des=new Descriptor();
+                    Object a=des.getDescriptors(payload_temp.substring(cur_point + 40,cur_point + 40+es_length*8));
+                }else if(pmt_stream_type==0x0f){
+                    Descriptor des=new Descriptor();
+                    Object a=des.getDescriptors(payload_temp.substring(cur_point + 40,cur_point + 40+es_length*8));
+                }
+
+                
                 PMTData pmtd=new PMTData();
-                pmtd.Stream_Type=pmt_stream_type;
-                pmtd.Program_Table=PAT_TABLE;
-                pmtd.Elementary_PID=elementary_PID;
-                pmt_t.add(pmtd);
+                if ((pmt_stream_type==0x02)||(pmt_stream_type==0x0f)){
+                    pmtd.Stream_Type=pmt_stream_type;
+                    pmtd.Program_Table=PAT_TABLE;
+                    pmtd.Elementary_PID=elementary_PID;
+                    pmtd.PCR_PID=pcr_pid;
+                    pmt_t.add(pmtd);
+                }
                 cur_point = cur_point + 40 + es_length * 8;
                 //System.out.println(Integer.toString(cur_point)+" :  "+Integer.toString(section_length));
                 if (cur_point > section_length * 8 - 1) {
@@ -179,22 +195,15 @@ public class Mpeg2TSPacket {
          */
         int matchnum=0;
         byte[] tbb=new byte[ts.length-4];
-        for (int i=0;i<ts.length-4;i++){
-            tbb[i]=ts[4+i];
-            if (bPAT_payload!=null){
-                if (ts[4+i]==bPAT_payload[i]){
-                    matchnum++;
-                }
+        System.arraycopy(ts,4,tbb,0,tbb.length);
+        if (bPAT_payload!=null){
+            if (Arrays.equals(tbb, bPAT_payload)){
+                byte[] retb=new byte[188];
+                System.arraycopy(ts,0,retb,0,4);
+                System.arraycopy(bPAT_payload,0,retb,4,184);
+                return retb;
             }
         }
-        if (matchnum==ts.length-4){
-            byte[] retb=new byte[188];
-            System.arraycopy(ts,0,retb,0,4);
-            System.arraycopy(bPAT_payload,0,retb,4,184);
-            return retb;
-        }else{
-            bPAT_payload=tbb;
-        }
         String tsbyte = byte2String2(ts);
         String tsheader = "";
         header = tsbyte.substring(0, 31);
@@ -224,6 +233,8 @@ public class Mpeg2TSPacket {
         if (PID == 0) {
             //showPAT(tsbyte);
             payload = makePAT(tsheader,payload, p_table);
+            byte[] retb=String2Byte(payload);
+            bPAT_payload=retb;
         }
         String rets = tsheader + payload;
         return String2Byte(rets);
@@ -467,7 +478,7 @@ public class Mpeg2TSPacket {
         return ret;
     }
 
-    public ArrayList getPAT() {
+    public ArrayList<PATData> getPAT() {
         return pat_list_all;
     }
 
@@ -476,7 +487,7 @@ public class Mpeg2TSPacket {
         pat_list_all = pat;
     }
 
-    public ArrayList getPMT() {
+    public ArrayList<PMTData> getPMT() {
         return pmt_list;
     }
 
@@ -487,7 +498,37 @@ public class Mpeg2TSPacket {
     public int getPID() {
         return PID;
     }
-
+    public String getPayload(byte[] ts){
+        /**
+         * 188バイトのtsから読み出したbyteを与える
+         */
+        String tsbyte = byte2String2(ts);
+        //header = tsbyte.substring(0, 31);
+        String ret_payload="";
+        //starter = TSString2Int(tsbyte, 0, 8);
+        //transporterror = TSString2Int(tsbyte, 8, 1);
+        //payloadstart = TSString2Int(tsbyte, 9, 1);
+        //transport_priority = TSString2Int(tsbyte, 10, 1);
+        int pid = TSString2Int(tsbyte, 11, 13);
+        int af = TSString2Int(tsbyte, 26, 2);
+        //continuity_counter = TSString2Int(tsbyte, 28, 4);
+        if (pid != 8191) {
+            if (af == 1) {
+                ret_payload = tsbyte.substring(40);
+            } else if (af == 3) {
+                int al = TSString2Int(tsbyte, 32, 8);
+                if ((al < 184)&((tsbyte.length()-al*8)>48)) {
+                    al = al * 8;
+                }
+                ret_payload = tsbyte.substring(48 + al);
+            }
+        }
+        return ret_payload;
+    }
+    public ArrayList<PMTData> readPMT(byte[] ts,int TABLE_NUM){
+        String payload=getPayload(ts);
+        return readPMT(payload, TABLE_NUM);
+    }
     public void showPAT(String ts) {
         System.out.println("先頭:" + ts.substring(0, 8));
         System.out.println("" + ts.substring(8, 11));