public static RunLength.Integer parse(ByteBuffer bb) { RunLength.Integer rl = new RunLength.Integer(); int recCount = bb.getInt(); for (int i = 0; i < recCount; i++) { int count = (bb.get() & 0xff) + 1; int value = bb.getInt(); rl.counts.add(count); rl.values.add(value); } return rl; }
private RunLength.Integer getValueStats(int[] values) { int[] copy = Platform.copyOfInt(values, values.length); Arrays.sort(copy); RunLength.Integer rl = new RunLength.Integer(); for (int i = 0; i < copy.length; i++) { int l = copy[i]; rl.add(l); } return rl; } }
public int estimateSize() { int sizeEstimate = (tokens.size() << 3) + streams.estimateSize() + 128; for (Integer stream : analyzers.keySet()) { sizeEstimate += analyzers.get(stream).estimateSize(); } return sizeEstimate; }
public void compress(int[] values, ByteBuffer bb) { RunLength.Integer rl = getValueStats(values); int[] counts = rl.getCounts(); int[] keys = rl.getValues(); int esc = Math.max(1, (1 << (MathUtil.log2(counts.length) - 2)) - 1); VLC vlc = buildCodes(counts, esc); int[] codes = vlc.getCodes(); int[] codeSizes = vlc.getCodeSizes(); bb.putInt(codes.length); for (int i = 0; i < codes.length; i++) { bb.put((byte) codeSizes[i]); bb.putShort((short) (codes[i] >>> 16)); bb.putInt(keys[i]); } BitWriter br = new BitWriter(bb); for (int j = 0; j < values.length; j++) { int l = values[j]; for (int i = 0; i < keys.length; i++) if (keys[i] == l) { vlc.writeVLC(br, i); if (codes[i] == esc) br.writeNBit(i, 16); } } br.flush(); }
public void serialize(ByteBuffer bb) { ByteBuffer dup = bb.duplicate(); int[] counts = getCounts(); int[] values = getValues(); NIOUtils.skip(bb, 4); int recCount = 0; for (int i = 0; i < counts.length; i++, recCount++) { int count = counts[i]; while (count >= 0x100) { bb.put((byte) 0xff); bb.putInt(values[i]); ++recCount; count -= 0x100; } bb.put((byte) (count - 1)); bb.putInt(values[i]); } dup.putInt(recCount); }
public int[] flattern() { int[] counts = getCounts(); int total = 0; for (int i = 0; i < counts.length; i++) { total += counts[i]; } int[] values = getValues(); int[] result = new int[total]; for (int i = 0, ind = 0; i < counts.length; i++) { for (int j = 0; j < counts[i]; j++, ind++) result[ind] = values[i]; } return result; } }
public static MPSIndex parseIndex(ByteBuffer index) { int pesCnt = index.getInt(); long[] pesTokens = new long[pesCnt]; for (int i = 0; i < pesCnt; i++) { pesTokens[i] = index.getLong(); } RunLength.Integer pesStreamId = RunLength.Integer.parse(index); int nStreams = index.getInt(); MPSStreamIndex[] streams = new MPSStreamIndex[nStreams]; for (int i = 0; i < nStreams; i++) { streams[i] = MPSStreamIndex.parseIndex(index); } return new MPSIndex(pesTokens, pesStreamId, streams); }
public int[] getValues() { finish(); return values.toArray(); }
protected void savePESMeta(int stream, long token) { tokens.add(token); streams.add(stream); }
public int estimateSize() { int size = (pesTokens.length << 3) + pesStreamIds.estimateSize(); for (MPSStreamIndex mpsStreamIndex : streams) { size += mpsStreamIndex.estimateSize(); } return size + 64; }
public void serializeTo(ByteBuffer index) { index.putInt(pesTokens.length); for (int i = 0; i < pesTokens.length; i++) { index.putLong(pesTokens[i]); } pesStreamIds.serialize(index); index.putInt(streams.length); for (MPSStreamIndex mpsStreamIndex : streams) { mpsStreamIndex.serialize(index); } }
public MPSRandomAccessDemuxer(SeekableByteChannel ch, MPSIndex mpsIndex) throws IOException { pesTokens = mpsIndex.getPesTokens(); pesStreamIds = mpsIndex.getPesStreamIds().flattern(); MPSStreamIndex[] streamIndices = mpsIndex.getStreams(); streams = new Stream[streamIndices.length]; for (int i = 0; i < streamIndices.length; i++) { streams[i] = newStream(ch, streamIndices[i]); } }
public BaseIndexer() { this.analyzers = new HashMap<Integer, BaseAnalyser>(); this.tokens = LongArrayList.createLongArrayList(); this.streams = new RunLength.Integer(); }