All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jcodec.containers.mps.index.MTSIndex Maven / Gradle / Ivy

There is a newer version: 0.2.5
Show newest version
package org.jcodec.containers.mps.index;
import org.jcodec.common.RunLength.Integer;
import org.jcodec.common.io.NIOUtils;

import java.nio.ByteBuffer;

/**
 * This class is part of JCodec ( www.jcodec.org ) This software is distributed
 * under FreeBSD License
 * 
 * Represents index for MPEG TS stream, enables demuxers to do precise seek
 * 
 * Note: some values inside the MPSIndex are not expressed in bytes anymore, but
 * rather in integral MPEG TS packets.
 * 
 * @author The JCodec project
 * 
 */
public class MTSIndex {
    private MTSProgram[] programs;

    public static MTSProgram createMTSProgram(MPSIndex mpsIndex, int target) {
        MTSProgram m = new MTSProgram(mpsIndex.pesTokens, mpsIndex.pesStreamIds, mpsIndex.streams, target);
        return m;
    }
    
    public static class MTSProgram extends MPSIndex {
        private int targetGuid;

        public MTSProgram(long[] pesTokens, Integer pesStreamIds, MPSStreamIndex[] streams, int targetGuid) {
            super(pesTokens, pesStreamIds, streams);
            this.targetGuid = targetGuid;
        }

        public int getTargetGuid() {
            return targetGuid;
        }

        @Override
        public void serializeTo(ByteBuffer index) {
            index.putInt(targetGuid);
            super.serializeTo(index);
        }

        public static MTSProgram parse(ByteBuffer read) {
            int targetGuid = read.getInt();
            return createMTSProgram(MPSIndex.parseIndex(read), targetGuid);
        }
    }

    public MTSIndex(MTSProgram[] programs) {
        this.programs = programs;
    }

    public MTSProgram[] getPrograms() {
        return programs;
    }

    public static MTSIndex parse(ByteBuffer buf) {
        int numPrograms = buf.getInt();
        MTSProgram[] programs = new MTSProgram[numPrograms];
        for (int i = 0; i < numPrograms; i++) {
            int programDataSize = buf.getInt();
            programs[i] = MTSProgram.parse(NIOUtils.read(buf, programDataSize));
        }
        return new MTSIndex(programs);
    }

    public int estimateSize() {
        int totalSize = 64;
        for (MTSProgram mtsProgram : programs) {
            totalSize += 4 + mtsProgram.estimateSize();
        }
        return totalSize;
    }

    public void serializeTo(ByteBuffer buf) {
        buf.putInt(programs.length);
        for (MTSProgram mtsAnalyser : programs) {
            ByteBuffer dup = buf.duplicate();
            NIOUtils.skip(buf, 4);
            mtsAnalyser.serializeTo(buf);
            dup.putInt(buf.position() - dup.position() - 4);
        }
    }

    public ByteBuffer serialize() {
        ByteBuffer bb = ByteBuffer.allocate(estimateSize());
        serializeTo(bb);
        bb.flip();
        return bb;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy