/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.media.mpegts.field; import java.util.ArrayList; import java.util.List; import com.ttProject.media.extra.Bit; import com.ttProject.media.extra.Bit1; import com.ttProject.media.extra.Bit3; import com.ttProject.media.extra.Bit4; import com.ttProject.media.extra.Bit7; import com.ttProject.media.extra.Bit8; import com.ttProject.media.extra.BitLoader; import com.ttProject.nio.channels.IReadChannel; public class PtsField { // 0010 XXX1 XXXX XXXX XXXX XXX1 XXXX XXXX XXXX XXX1 // 0011 XXX1 XXXX XXXX XXXX XXX1 XXXX XXXX XXXX XXX1 // xの部分をつなぎ合わせたらptsデータとなります。 private Bit4 signature; private long pts; // 90.0fで割り算したら、ミリ秒データになる。 public void analyze(IReadChannel ch) throws Exception { signature = new Bit4(); Bit3 pts1 = new Bit3(); Bit1 ptsFlag1 = new Bit1(); Bit7 pts2 = new Bit7(); Bit8 pts3 = new Bit8(); Bit1 ptsFlag2 = new Bit1(); Bit7 pts4 = new Bit7(); Bit8 pts5 = new Bit8(); Bit1 ptsFlag3 = new Bit1(); BitLoader bitLoader = new BitLoader(ch); bitLoader.load(signature, pts1, ptsFlag1, pts2, pts3, ptsFlag2, pts4, pts5, ptsFlag3); if(ptsFlag1.get() != 0x01 || ptsFlag2.get() != 0x01 || ptsFlag3.get() != 0x01) { throw new Exception("セパレートフラグがおかしいです。"); } pts = (long)(((pts1.get() & 0xFFL) << 30) | (pts2.get() << 23) | (pts3.get() << 15) | (pts4.get() << 8) | pts5.get()); } public long getPts() { return pts; } public void setPts(long pts) { this.pts = pts; } public void setSignature(Bit4 signature) { this.signature = signature; } public List<Bit> getBits() { List<Bit> list = new ArrayList<Bit>(); list.add(signature); list.add(new Bit3((int)(pts >>> 30))); list.add(new Bit1(1)); list.add(new Bit7((int)(pts >>> 23))); list.add(new Bit8((int)(pts >>> 15))); list.add(new Bit1(1)); list.add(new Bit7((int)(pts >>> 8))); list.add(new Bit8((int)(pts & 0xFF))); list.add(new Bit1(1)); return list; } @Override public String toString() { StringBuilder data = new StringBuilder(); data.append("PtsField:"); data.append(" pts:").append(Long.toHexString(pts)).append("(").append(pts / 90000f).append(")"); return data.toString(); } }