From d5c22e90f2e4b45c62cfb31819edf727620a06dc Mon Sep 17 00:00:00 2001 From: gn64_jp Date: Sat, 5 Dec 2009 13:31:43 +0000 Subject: [PATCH] simplify many codes and fix Housoudaigaku splitting error. git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/rec10@300 4e526526-5e11-4fc0-8910-f8fd03428081 --- jTsSplitter/trunk/src/jtssplitter/Main.java | 3 - .../trunk/src/jtssplitter/Mpeg2TSPacket.java | 412 ++++----------------- jTsSplitter/trunk/src/jtssplitter/Tsfile.java | 306 +-------------- jTsSplitter/trunk/src/jtssplitter/calc.java | 57 +++ 4 files changed, 135 insertions(+), 643 deletions(-) diff --git a/jTsSplitter/trunk/src/jtssplitter/Main.java b/jTsSplitter/trunk/src/jtssplitter/Main.java index 60de520..84fd802 100644 --- a/jTsSplitter/trunk/src/jtssplitter/Main.java +++ b/jTsSplitter/trunk/src/jtssplitter/Main.java @@ -32,10 +32,7 @@ public class Main { ch = Integer.parseInt(args[2].trim(), 10); } } - inf="C:\\Users\\yukikaze\\Desktop\\21test.ts"; - outf="C:\\Users\\yukikaze\\Desktop\\21test_new11.ts"; Tsfile t1 = new Tsfile(); - //t1.splitTS(inf, outf, ch); t1.splitTS_byte(inf, outf, ch); } } diff --git a/jTsSplitter/trunk/src/jtssplitter/Mpeg2TSPacket.java b/jTsSplitter/trunk/src/jtssplitter/Mpeg2TSPacket.java index a1c0adf..fabb24b 100644 --- a/jTsSplitter/trunk/src/jtssplitter/Mpeg2TSPacket.java +++ b/jTsSplitter/trunk/src/jtssplitter/Mpeg2TSPacket.java @@ -1,17 +1,11 @@ package jtssplitter; -import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.zip.CRC32; import jtssplitter.data.PATData; import jtssplitter.data.PMTData; import jtssplitter.data.Descriptor; import jtssplitter.data.EITData; -import jtssplitter.data.Video_stream_descriptor; -import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; /* * To change this template, choose Tools | Templates @@ -62,70 +56,22 @@ public class Mpeg2TSPacket { public Mpeg2TSPacket() { } - public int getPIDFirst(byte[] ts) { - byte[] b = new byte[2]; - b[0] = ts[1]; - b[1] = ts[2]; - String s=byte2String2(b); - s=s.substring(3,16); - return Integer.parseInt(byte2String2(b).substring(3, 16), 2); - } public int getPIDFirst_byte(byte[] ts) { - calc cal=new calc(); + calc cal = new calc(); byte[] b = new byte[2]; b[0] = ts[1]; b[1] = ts[2]; - return cal.byte2int(b,3,13); + return cal.byte2int(b, 3, 13); //return cal.byte2int(ts,11,13); } - public void readTS(byte[] ts) { - /** - * 188バイトのtsから読み出したbyteを与える - */ - String tsbyte = byte2String2(ts); - //header = tsbyte.substring(0, 31); - payload = tsbyte.substring(32); - //starter = TSString2Int(tsbyte, 0, 8); - //transporterror = TSString2Int(tsbyte, 8, 1); - //payloadstart = TSString2Int(tsbyte, 9, 1); - //transport_priority = TSString2Int(tsbyte, 10, 1); - PID = TSString2Int(tsbyte, 11, 13); - adaptation_field = TSString2Int(tsbyte, 26, 2); - //continuity_counter = TSString2Int(tsbyte, 28, 4); - payload = ""; - if (PID != 8191) { - if (adaptation_field == 1) { - pointer_field = TSString2Int(tsbyte, 32, 8); - payload = tsbyte.substring(40); - } else if (adaptation_field == 3) { - adaptation_length = TSString2Int(tsbyte, 32, 8); - if ((adaptation_length < 184) & ((tsbyte.length() - adaptation_length * 8) > 48)) { - adaptation_length = adaptation_length * 8; - } - adaptation = tsbyte.substring(32, 40 + adaptation_length); - pointer_field = TSString2Int(tsbyte, 40 + adaptation_length, 8); - payload = tsbyte.substring(48 + adaptation_length); - } - } - if (PID == 0) { - pat_list_now = readPAT(payload); - pat_list_all.addAll(pat_list_now); - } - for (int i = 0; i < pat_list_now.size(); i++) { - if ((PID == pat_list_now.get(i).PID) && (PID != 0)) { - pmt_list.addAll(readPMT(payload, pat_list_now.get(i).Program_TABLE)); - } - } - tsbyte = ""; - } - public void readTS_byte(byte[] ts) { /** * 188バイトのtsから読み出したbyteを与える */ calc cal = new calc(); String tsbyte = byte2String2(ts); + boolean begin_payload_unit = cal.byte2int(ts, 9, 1) == 1; //header = tsbyte.substring(0, 31); payload = tsbyte.substring(32); //starter = TSString2Int(tsbyte, 0, 8); @@ -139,20 +85,39 @@ public class Mpeg2TSPacket { payload = ""; if (PID != 8191) { if (adaptation_field == 1) { - pointer_field = cal.byte2int(ts, 32, 8); - payload_byte = cal.byte2subbyte(ts, 5, ts.length - 5); + if (begin_payload_unit) { + pointer_field = cal.byte2int(ts, 32, 8); + if ((ts.length - 5 - pointer_field) < (5 + pointer_field)) { + payload_byte = null; + } else { + payload_byte = cal.byte2subbyte(ts, 5 + pointer_field, ts.length - 5 - pointer_field); + } + } else { + payload_byte = cal.byte2subbyte(ts, 4, ts.length - 4); + } } else if (adaptation_field == 3) { adaptation_length = cal.byte2int(ts, 32, 8); if ((adaptation_length < 184) & ((ts.length * 8 - adaptation_length * 8) > 48)) { adaptation_length = adaptation_length * 8; } adaptation_byte = cal.byte2subbyte(ts, 4, 1 + adaptation_length / 8); - payload_byte = cal.byte2subbyte(ts, 6 + adaptation_length / 8, ts.length - 6 - adaptation_length / 8); - pointer_field = cal.byte2int(ts, 40 + adaptation_length, 8); + if (begin_payload_unit) { + pointer_field = cal.byte2int(ts, 40 + adaptation_length, 8); + if ((ts.length - 6 - (adaptation_length / 8) - pointer_field) < (6 + (adaptation_length / 8) + pointer_field)) { + payload_byte = null; + } else { + payload_byte = cal.byte2subbyte(ts, 6 + (adaptation_length / 8) + pointer_field, ts.length - 6 - (adaptation_length / 8) - pointer_field); + } + } else { + payload_byte = cal.byte2subbyte(ts, 5 + adaptation_length / 8, ts.length - 5 - adaptation_length / 8); + } + } else { + payload_byte = null; } } - if (payload_byte!=null){ - if (PID == 0) { + if (payload_byte != null) { + if ((PID == 0) && (begin_payload_unit)) { + //cal.showPAT(tsbyte); pat_list_now = readPAT_byte(payload_byte); pat_list_all.addAll(pat_list_now); } @@ -165,40 +130,6 @@ public class Mpeg2TSPacket { tsbyte = ""; } - private ArrayList readPAT(String payload_temp) { - /* - * payloadの文字列を入力して[intテーブル,int PID]のArrayListを返す。 - */ - int tableid; - int sectionlength; - ArrayList program_number = new ArrayList(); - tableid = TSString2Int(payload_temp, 0, 8); - sectionlength = TSString2Int(payload_temp, 12, 12);//-40-32; - int patnum = sectionlength * 8 - 72; - patnum = patnum / 32; - byte[] test = String2Byte(payload_temp); - String stest = ""; - for (int ij = 0; ij < test.length; ij++) { - int it = test[ij] & 0xFF; - String s = Integer.toBinaryString(it); - if (s.length() < 8) { - for (int i2 = s.length(); i2 < 8; i2++) { - s = "0" + s; - } - } - stest = stest + s; - } - payload_temp = stest; - int nowbit = 64; - for (int i = 0; i < patnum; i++) { - PATData patd = new PATData(); - patd.Program_TABLE = TSString2Int(payload_temp, 64 + 32 * i, 16); - patd.PID = TSString2Int(payload_temp, 32 * i + 64 + 19, 13); - program_number.add(patd); - } - return program_number; - } - private ArrayList readPAT_byte(byte[] payload_temp) { /* * payloadの文字列を入力して[intテーブル,int PID]のArrayListを返す。 @@ -212,61 +143,17 @@ public class Mpeg2TSPacket { int patnum = sectionlength * 8 - 72; patnum = patnum / 32; for (int i = 0; i < patnum; i++) { - PATData patd = new PATData(); - patd.Program_TABLE = cal.byte2int(payload_temp, 64 + 32 * i, 16); - patd.PID = cal.byte2int(payload_temp, 32 * i + 64 + 19, 13); - program_number.add(patd); - } - return program_number; - } - - private ArrayList readPMT(String payload_temp, int PAT_TABLE) { - ArrayList pmt_t = new ArrayList(); - 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; - if (cur_point > section_length * 8) { - end = true; - } - while (end != true) { - String gs = payload_temp.substring(cur_point + 8, cur_point + 11); - if (gs.matches("111") && payload_temp.length() > cur_point + 40) { - int pmt_stream_type = TSString2Int(payload_temp, cur_point, 8); - 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(); - 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); + if (payload_temp.length * 8 > 64 + 32 * i + 96) { + if (cal.byte2int(payload_temp, 64 + 32 * i + 16, 3) == 7) { + PATData patd = new PATData(); + patd.Program_TABLE = cal.byte2int(payload_temp, 64 + 32 * i, 16); + patd.PID = cal.byte2int(payload_temp, 32 * i + 64 + 19, 13); + program_number.add(patd); } - cur_point = cur_point + 40 + es_length * 8; - //System.out.println(Integer.toString(cur_point)+" : "+Integer.toString(section_length*8)); - if ((cur_point > section_length * 8 - 1) || (cur_point > payload_temp.length() - 11)) { - end = true; - } - } else { - end = true; } } - return pmt_t; + return program_number; } - private ArrayList readPMT_byte(byte[] payload_temp, int PAT_TABLE) { ArrayList pmt_t = new ArrayList(); calc cal = new calc(); @@ -349,7 +236,6 @@ public class Mpeg2TSPacket { * * p_tableで指定された番組テーブルのみを取り出すPATを作る。 */ - int matchnum = 0; byte[] tbb = new byte[ts.length - 4]; System.arraycopy(ts, 4, tbb, 0, tbb.length); if (bPAT_payload != null) { @@ -361,143 +247,60 @@ public class Mpeg2TSPacket { } } calc cal = new calc(); - String tsbyte = byte2String2(ts); - String tsheader = ""; header_byte = cal.byte2subbyte(ts, 0, 4); - byte[] pointer_byte=cal.byte2subbyte(ts, 4, 1); + byte[] pointer_byte = cal.byte2subbyte(ts, 4, 1); payload_byte = cal.byte2subbyte(ts, 4, ts.length - 4); starter = cal.byte2int(ts, 0, 8); + boolean begin_payload_unit = cal.byte2int(ts, 9, 1) == 1; transporterror = cal.byte2int(ts, 8, 1); payloadstart = cal.byte2int(ts, 9, 1); transport_priority = cal.byte2int(ts, 10, 1); PID = cal.byte2int(ts, 11, 13); adaptation_field = cal.byte2int(ts, 26, 2); continuity_counter = cal.byte2int(ts, 28, 4); - int adaptation_length_t = cal.byte2int(ts, 32, 8); - if (PID != 8191) { - if (adaptation_field == 1) { + if (adaptation_field == 1) { + if (begin_payload_unit) { pointer_field = cal.byte2int(ts, 32, 8); - payload_byte = cal.byte2subbyte(ts, 5, ts.length - 5); - } else if (adaptation_field == 3) { - if (adaptation_length_t < 188) { - adaptation_length_t = adaptation_length_t * 8; + if ((ts.length - 5 - pointer_field) < (5 + pointer_field)) { + payload_byte = null; + } else { + payload_byte = cal.byte2subbyte(ts, 5 + pointer_field, ts.length - 5 - pointer_field); } - payload_byte = cal.byte2subbyte(ts, 6 + adaptation_length_t / 8, ts.length - 6 - adaptation_length_t / 8); + } else { + payload_byte = cal.byte2subbyte(ts, 4, ts.length - 4); } - } - if (PID == 0) { - //showPAT(tsbyte); - payload_byte = makePAT_byte(pointer_byte,payload_byte, p_table); - /*byte[] bpayload=cal.String2Byte(makePAT(cal.byte2String2(header_byte), cal.byte2String2(payload_byte), p_table)); - if (!Arrays.equals(payload_byte, bpayload)){ - System.out.println("not match"); - }else{ - System.out.println("match"); - }*/ - bPAT_payload = payload_byte; - } - ByteArrayOutputStream baos = new ByteArrayOutputStream(ts.length); - baos.write(header_byte, 0, header_byte.length); - baos.write(pointer_byte,0,pointer_byte.length); - baos.write(payload_byte, 0, payload_byte.length); - return baos.toByteArray(); - } - - public byte[] splitPAT(byte[] ts, int p_table) { - /** - * - * p_tableで指定された番組テーブルのみを取り出すPATを作る。 - */ - int matchnum = 0; - byte[] tbb = new byte[ts.length - 4]; - 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; + } else if (adaptation_field == 3) { + adaptation_length = cal.byte2int(ts, 32, 8); + if ((adaptation_length < 184) & ((ts.length * 8 - adaptation_length * 8) > 48)) { + adaptation_length = adaptation_length * 8; } - } - String tsbyte = byte2String2(ts); - String tsheader = ""; - header = tsbyte.substring(0, 31); - payload = tsbyte.substring(32); - starter = TSString2Int(tsbyte, 0, 8); - transporterror = TSString2Int(tsbyte, 8, 1); - payloadstart = TSString2Int(tsbyte, 9, 1); - transport_priority = TSString2Int(tsbyte, 10, 1); - PID = TSString2Int(tsbyte, 11, 13); - adaptation_field = TSString2Int(tsbyte, 26, 2); - continuity_counter = TSString2Int(tsbyte, 28, 4); - int adaptation_length_t = TSString2Int(tsbyte, 32, 8); - payload = ""; - if (PID != 8191) { - if (adaptation_field == 1) { - pointer_field = TSString2Int(tsbyte, 32, 8); - tsheader = tsbyte.substring(0, 40); - payload = tsbyte.substring(40); - } else if (adaptation_field == 3) { - if (adaptation_length_t < 188) { - adaptation_length_t = adaptation_length_t * 8; + adaptation_byte = cal.byte2subbyte(ts, 4, 1 + adaptation_length / 8); + if (begin_payload_unit) { + pointer_field = cal.byte2int(ts, 40 + adaptation_length, 8); + if ((ts.length - 6 - (adaptation_length / 8) - pointer_field) < (6 + (adaptation_length / 8) + pointer_field)) { + payload_byte = null; + } else { + payload_byte = cal.byte2subbyte(ts, 6 + (adaptation_length / 8) + pointer_field, ts.length - 6 - (adaptation_length / 8) - pointer_field); } - tsheader = tsbyte.substring(0, 48 + adaptation_length_t); - payload = tsbyte.substring(48 + adaptation_length_t); + } else { + payload_byte = cal.byte2subbyte(ts, 5 + adaptation_length / 8, ts.length - 5 - adaptation_length / 8); } + } else { + payload_byte = null; } - 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); - } - - private String makePAT(String tsheader, String payload_temp, int Table) { - int sectionlength; - StringBuffer sb = new StringBuffer(); - //ArrayList program_number = new ArrayList(); - //System.out.println("Pay:"+payload_temp); - //int tableid = TSString2Int(payload_temp, 0, 8); - sectionlength = TSString2Int(payload_temp, 12, 12);//-40-32; - int patnum = sectionlength * 8 - 72; - //String rets = "";//="00000000";//pointer field - //rets = rets + payload_temp.substring(0, 12);//セクション長の前まで - sb.append(payload_temp.substring(0, 12)); - int new_section_length = (2 * 32 + 32 + 40) / 8; - sb.append(Int2String(new_section_length, 12)); - sb.append(payload_temp.substring(24, 64)); - //rets = rets + Int2String(new_section_length, 12); - //rets = rets + payload_temp.substring(24, 64);//ループ前まで - String loop = ""; - patnum = patnum / 32; - //String crcnow = payload_temp.substring(64 + 32 * patnum, 64 + 32 * patnum + 32); - for (int i = 0; i < patnum; i++) { - int[] pat = new int[2]; - pat[0] = TSString2Int(payload_temp, 64 + 32 * i, 16); - pat[1] = TSString2Int(payload_temp, 32 * i + 64 + 19, 13); - if (pat[0] == 0) { - sb.append(payload_temp.substring(64 + 32 * i, 95 + 32 * i + 1)); - //loop = loop+payload_temp.substring(64 + 32 * i, 95 + 32 * i + 1); - } else if (pat[0] == Table) { - sb.append(payload_temp.substring(64 + 32 * i, 95 + 32 * i + 1)); - //loop = loop + payload_temp.substring(64 + 32 * i, 95 + 32 * i + 1); - i = patnum; - } + if ((PID == 0) && (begin_payload_unit) && (payload_byte != null)) { + payload_byte = makePAT_byte(pointer_byte, payload_byte, p_table); + bPAT_payload = payload_byte; } - String s2 = tsheader.substring(tsheader.length() - 8); - s2 = s2 + sb.toString(); - String s = getCRC32(s2); - sb.append(s); - //rets = rets + s; - int ill3 = payload_temp.length() - sb.length(); - for (int ir = 0; ir < ill3; ir++) { - sb.append("1"); - //rets = rets + "1"; + if (payload_byte != null) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(ts.length); + baos.write(header_byte, 0, header_byte.length); + baos.write(pointer_byte, 0, pointer_byte.length); + baos.write(payload_byte, 0, payload_byte.length); + return baos.toByteArray(); + } else { + return null; } - return sb.toString(); } private byte[] makePAT_byte(byte[] pointer_field, byte[] payload_temp, int Table) { @@ -518,15 +321,15 @@ public class Mpeg2TSPacket { pat[0] = cal.byte2int(payload_temp, 64 + 32 * i, 16); pat[1] = cal.byte2int(payload_temp, 32 * i + 64 + 19, 13); if (pat[0] == 0) { - baos.write(payload_temp, 8+4*i, 4); + baos.write(payload_temp, 8 + 4 * i, 4); nowt = nowt + 4; } else if (pat[0] == Table) { - baos.write(payload_temp, 8+4*i, 4); + baos.write(payload_temp, 8 + 4 * i, 4); nowt = nowt + 4; i = patnum; } } - ByteArrayOutputStream baoscrc=new ByteArrayOutputStream(nowt+1); + ByteArrayOutputStream baoscrc = new ByteArrayOutputStream(nowt + 1); baoscrc.write(pointer_field[0]); baoscrc.write(baos.toByteArray(), 0, baos.size()); byte[] crc = getCRC32_byte(baoscrc.toByteArray(), 1); @@ -534,7 +337,7 @@ public class Mpeg2TSPacket { int ill3 = payload_temp.length - baos.size(); for (int ir = 0; ir < ill3; ir++) { baos.write(0xFF); - } + } return baos.toByteArray(); } @@ -654,19 +457,6 @@ public class Mpeg2TSPacket { } } - private String byte2String(byte[] b) { - StringBuffer sb = new StringBuffer(8 * b.length); - for (int i = 0; i < b.length; i++) { - StringBuffer sb2 = new StringBuffer(8); - sb2.append(Integer.toBinaryString(b[i] & 0xFF)); - if ((sb2.length() < 8) & (sb2.length() > 0)) { - sb2.insert(0, addzero(8 - sb2.length())); - } - sb.append(sb2); - } - return sb.toString(); - } - private String byte2String2(byte[] b) { int bl = b.length; bl = bl - bl % 8; @@ -697,50 +487,6 @@ public class Mpeg2TSPacket { return sb.toString(); } - private String byte2HexString(byte[] b) { - String ret = ""; - for (int i = 0; i < b.length; i++) { - ret = ret + Integer.toHexString(b[i] & 0xFF); - } - return ret; - } - - private boolean testCRC(String base, String ans, int begin_n, int end_n) { - String tests1 = base.substring(begin_n, end_n); - byte[] test1 = String2Byte(tests1); - int t32 = 0; - int begin = begin_n; - int end = end_n; - byte[] test2 = String2Byte(ans); - String tests2 = ans; - CRC32 crc = new CRC32(); - crc.reset(); - crc.update(test1); - - if (crc.getValue() == Long.parseLong(tests2, 2)) { - System.out.print("正解が出ました。\n"); - System.out.print("begin : " + Integer.toString(begin_n) + " end : " + Integer.toString(end_n)); - - return true; - } - if (Long.parseLong(getCRC32(test1, 1), 2) == Long.parseLong(tests2, 2)) { - System.out.print("正解が出ました。(getCRC)\n"); - System.out.print("begin : " + Integer.toString(begin_n) + " end : " + Integer.toString(end_n)); - return true; - } - if (Long.parseLong(getCRC32(test1, 1), 2) == Long.parseLong(tests2, 2)) { - System.out.print("正解が出ました。(getCRC_2)\n"); - System.out.println("begin : " + Integer.toString(begin_n) + " end : " + Integer.toString(end_n)); - showPAT(base); - System.out.println("begin : " + base.substring(begin_n, begin_n + 32)); - System.out.println("near : " + base.substring(end_n - 32, end_n)); - System.out.println("near2: " + base.substring(end_n, end_n + 32)); - System.out.println("near3: " + base.substring(end_n + 32, end_n + 64)); - return true; - } - return false; - } - private String Int2String(int num, int length) { String ret = Integer.toBinaryString(num); if (ret.length() < length) { @@ -854,11 +600,6 @@ public class Mpeg2TSPacket { return retb; } - public ArrayList readPMT(byte[] ts, int TABLE_NUM) { - String payloadt = getPayload(ts); - return readPMT(payloadt, TABLE_NUM); - } - public ArrayList readPMTglobal_byte(byte[] ts, int TABLE_NUM) { byte[] payloadt = getPayload_byte(ts); return readPMT_byte(payloadt, TABLE_NUM); @@ -880,8 +621,5 @@ public class Mpeg2TSPacket { System.out.println(Integer.toString(i) + " : " + ts.substring(104 + 32 * i, 136 + 32 * i)); } System.out.println("Length:" + Integer.toString(ts.length())); - - - } } diff --git a/jTsSplitter/trunk/src/jtssplitter/Tsfile.java b/jTsSplitter/trunk/src/jtssplitter/Tsfile.java index 79b450c..7bcc4cc 100644 --- a/jTsSplitter/trunk/src/jtssplitter/Tsfile.java +++ b/jTsSplitter/trunk/src/jtssplitter/Tsfile.java @@ -9,7 +9,6 @@ import java.io.*; import java.util.logging.Level; import java.util.logging.Logger; import java.util.Arrays; -import jtssplitter.data.EITData; import jtssplitter.data.PATData; import jtssplitter.data.PIDs; import jtssplitter.data.PMTData; @@ -18,142 +17,6 @@ import jtssplitter.data.PMTData; * @author Administrator */ public class Tsfile { - public void readTs(String fpath){ - byte[] tb=new byte[188]; - int[] ib=new int[188]; - ArrayList pat=new ArrayList(); - ArrayList pmt=new ArrayList(); - String[] sb=new String[188]; - try { - FileInputStream in = new FileInputStream(fpath); - BufferedInputStream bis=new BufferedInputStream(in); - int[] PIDCount=new int[8200]; - for (int i=0;i<3000;i++){ - bis.read(tb); - String last8; - Mpeg2TSPacket m2tp; - m2tp=new Mpeg2TSPacket(); - m2tp.setPAT(pat); - m2tp.setPMT(pmt); - m2tp.readTS(tb); - pat=m2tp.getPAT(); - pmt=m2tp.getPMT(); - PIDCount[m2tp.getPID()]++; - } - for (int i=0;i<8200;i++){ - if (PIDCount[i]>0){ - } - } - for (int i=0;i<188;i++){ - int it=tb[i]& 0xFF; - ib[i]=it; - String s=Integer.toBinaryString(it); - if (s.length()<8){ - for (int i2=s.length();i2<8;i2++){ - s="0"+s; - } - sb[i]=s; - } - } - bis.close(); - in.close(); - } catch (IOException ex) { - Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex); - } - - } - public void splitTS(String origpath,String destpath,int csch){ - int[] pids=null; - int p_table=0; - if (csch>0){ - p_table=csch; - }else{ - p_table=getFirstP_Table(origpath); - } - PIDs pidss=getTablePID(origpath,p_table); - p_table=pidss.Program_Table; - pids=pidss.PIDs; - int pmt_pid=pidss.PMT_PID; - byte[] tb=new byte[188]; - try { - FileInputStream in = new FileInputStream(origpath); - FileOutputStream fos=new FileOutputStream(destpath); - BufferedInputStream bis=new BufferedInputStream(in,128*188); - BufferedOutputStream bos=new BufferedOutputStream(fos); - byte[] wbyte=null; - boolean end=false; - int ik=0; - boolean readend=false; - Mpeg2TSPacket m2tpp; - m2tpp=new Mpeg2TSPacket(); - while (readend==false){ - byte[] tstt=new byte[3]; - bis.mark(188*2); - bis.read(tstt); - bis.reset(); - wbyte=null; - Mpeg2TSPacket m2tp; - m2tp=new Mpeg2TSPacket(); - //int ii=m2tpp.getPIDFirst(tstt); - int ii=m2tpp.getPIDFirst_byte(tstt); - //if (ii!=i2){ - // System.out.println("not match"); - //} - boolean alreadyreaded=false; - for (int k=0;k187)){ - //Mpeg2TSPacket m2tp2=new Mpeg2TSPacket(); - wbyte=m2tpp.splitPAT(tb,p_table); - }else if ((ii==pmt_pid)&&(readti>187)){ - wbyte=tb; - ArrayList pmtss=m2tpp.readPMT(tb, pmt_pid); - if (pmtss.size()>0){ - int[] new_pids=new int[pmtss.size()+3]; - new_pids[pmtss.size()]=0; - new_pids[pmtss.size()+1]=pmt_pid; - new_pids[pmtss.size()+2]=pmtss.get(0).PCR_PID; - for (int i=0;i187)){ - ArrayList eitss=m2tpp.readEIT(tb); - */ - }else if (readti>187){ - wbyte=tb; - - }else { - readend=true; - } - k=pids.length; - } - ik++; - } - if (alreadyreaded==false){ - bis.skip(188); - } - if (wbyte!=null){ - bos.write(wbyte); - } - } - bis.close(); - bos.flush(); - bos.close(); - in.close(); - fos.close(); - - } catch (IOException ex) { - Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex); - } - } - public void splitTS_byte(String origpath,String destpath,int csch){ int[] pids=null; int p_table=0; @@ -166,6 +29,8 @@ public class Tsfile { p_table=pidss.Program_Table; pids=pidss.PIDs; int pmt_pid=pidss.PMT_PID; + System.out.println("番組の同定終了"); + System.out.println("Program Table : "+Integer.toString(p_table)); byte[] tb=new byte[188]; try { FileInputStream in = new FileInputStream(origpath); @@ -256,117 +121,6 @@ public class Tsfile { Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex); } } - - private void writeTS(byte[] tspacket,String path){ - FileOutputStream fos = null; - try { - fos = new FileOutputStream(path,true); - fos.write(tspacket); - fos.close(); - } catch (IOException ex) { - Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex); - } finally { - try { - fos.close(); - } catch (IOException ex) { - Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex); - } - } - } - private PIDs getTablePID(String fpath,int p_table){ - /** - * PIDを取得し、これと思われる必要なPIDを抜き出す。 - * @return プログラム番号(return[0])とPIDのリスト(return[1-]) - */ - FileInputStream in = null; - PIDs pids=new PIDs(); - int[] reti=null; - try { - ArrayList ret=new ArrayList(); - byte[] tb = new byte[188]; - int[] ib = new int[188]; - ArrayList pat = new ArrayList(); - ArrayList pmt = new ArrayList(); - String[] sb = new String[188]; - in = new FileInputStream(fpath); - //int[] PIDCount = new int[8200]; - int imax=1000; - for (int i = 0; i < imax ; i++) { - in.read(tb); - String last8; - Mpeg2TSPacket m2tp; - m2tp = new Mpeg2TSPacket(); - m2tp.setPAT(pat); - m2tp.setPMT(pmt); - m2tp.readTS(tb); - pat = m2tp.getPAT(); - for (int i2=0;i2 pmtt=m2tp.getPMT(); - for (int i2=0;i2 pat = new ArrayList(); - ArrayList pmt = new ArrayList(); - String[] sb = new String[188]; - in = new FileInputStream(fpath); - //int[] PIDCount = new int[8200]; - int imax=1000; - for (int i = 0; i < imax ; i++) { - in.read(tb); - String last8; - Mpeg2TSPacket m2tp; - m2tp = new Mpeg2TSPacket(); - m2tp.setPAT(pat); - m2tp.setPMT(pmt); - m2tp.readTS(tb); - pat = m2tp.getPAT(); - pmt = m2tp.getPMT(); - if ((i==imax-1)&&(pmt.size()==0)){ - imax=imax+500; - } - } - - for (int i=0;i0){ - patdd=pat.get(i); - i=pat.size(); - } - } - } catch (IOException ex) { - Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex); - } finally { - try { - in.close(); - } catch (IOException ex) { - Logger.getLogger(Tsfile.class.getName()).log(Level.SEVERE, null, ex); - } - } - return patdd.Program_TABLE; - } - - private int getFirstP_Table_byte(String fpath){ /** * PIDを取得し、これと思われる必要なPIDを抜き出す。 @@ -538,6 +237,7 @@ public class Tsfile { in = new FileInputStream(fpath); //int[] PIDCount = new int[8200]; int imax=1000; + calc cal=new calc(); for (int i = 0; i < imax ; i++) { in.read(tb); String last8; diff --git a/jTsSplitter/trunk/src/jtssplitter/calc.java b/jTsSplitter/trunk/src/jtssplitter/calc.java index ae790dd..48a580c 100644 --- a/jTsSplitter/trunk/src/jtssplitter/calc.java +++ b/jTsSplitter/trunk/src/jtssplitter/calc.java @@ -223,4 +223,61 @@ public class calc { } return ret; } + public void showPAT(String ts) { + System.out.println("先頭:" + ts.substring(0, 8)); + System.out.println("" + ts.substring(8, 11)); + System.out.println("PID:" + ts.substring(11, 24)); + System.out.println("" + ts.substring(24, 32)); + System.out.println("Adap_Len:" + ts.substring(32, 40)); + System.out.println("TableID:" + ts.substring(40, 48)); + System.out.println("" + ts.substring(48, 52)); + System.out.println("len : " + ts.substring(52, 64) + "//" + Integer.toString(Integer.parseInt(ts.substring(52, 64), 2))); + System.out.println("TS ID:" + ts.substring(64, 80)); + System.out.println("11:" + ts.substring(80, 82)); + System.out.println("" + ts.substring(82, 104)); + for (int i = 0; i < 10; i++) { + System.out.println(Integer.toString(i) + " : " + ts.substring(104 + 32 * i, 136 + 32 * i)); + } + System.out.println("Length:" + Integer.toString(ts.length())); + } + public byte[] getCRC32_byte(byte[] data, int offset) { + // x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 + int[] g = {1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1}; + int[] shift_reg = new int[32]; + long crc = 0; + byte crc32[] = new byte[4]; + + // Initialize shift register's to '1' + java.util.Arrays.fill(shift_reg, 1); + + // Calculate nr of data bits, summa of bits + int nr_bits = (data.length - offset) * 8; + + for (int bit_count = 0, bit_in_byte = 0, data_bit; bit_count < nr_bits; bit_count++) { + // Fetch bit from bitstream + data_bit = (data[offset] & 0x80 >>> (bit_in_byte++)) != 0 ? 1 : 0; + + if ((bit_in_byte &= 7) == 0) { + offset++; + } + + // Perform the shift and modula 2 addition + data_bit ^= shift_reg[31]; + + for (int i = 31; i > 0; i--) { + shift_reg[i] = g[i] == 1 ? (shift_reg[i - 1] ^ data_bit) : shift_reg[i - 1]; + } + + shift_reg[0] = data_bit; + } + + for (int i = 0; i < 32; i++) { + crc = ((crc << 1) | (shift_reg[31 - i])); + } + + for (int i = 0; i < 4; i++) { + crc32[i] = (byte) (0xFF & (crc >>> ((3 - i) * 8))); + } + return crc32; + } } -- 2.11.0