package org.mp4parser.muxer.tracks; import org.mp4parser.boxes.iso14496.part12.CompositionTimeToSample; import org.mp4parser.boxes.iso14496.part12.SampleDependencyTypeBox; import org.mp4parser.boxes.iso14496.part12.SampleDescriptionBox; import org.mp4parser.boxes.iso14496.part12.SubSampleInformationBox; import org.mp4parser.boxes.samplegrouping.GroupEntry; import org.mp4parser.muxer.*; import java.io.IOException; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Map; import static org.mp4parser.tools.CastUtils.l2i; /** * This is just a basic idea how things could work but they don't. */ public class SilenceTrackImpl implements Track { Track source; List<Sample> samples = new LinkedList<Sample>(); long[] decodingTimes; String name; public SilenceTrackImpl(Track ofType, long ms) { source = ofType; name = "" + ms + "ms silence"; if ("mp4a".equals(ofType.getSampleDescriptionBox().getSampleEntry().getType())) { int numFrames = l2i(getTrackMetaData().getTimescale() * ms / 1000 / 1024); decodingTimes = new long[numFrames]; Arrays.fill(decodingTimes, getTrackMetaData().getTimescale() * ms / numFrames / 1000); while (numFrames-- > 0) { samples.add(new SampleImpl((ByteBuffer) ByteBuffer.wrap(new byte[]{ 0x21, 0x10, 0x04, 0x60, (byte) 0x8c, 0x1c, }).rewind())); } } else { throw new RuntimeException("Tracks of type " + ofType.getClass().getSimpleName() + " are not supported"); } } public void close() throws IOException { // nothing to close } public SampleDescriptionBox getSampleDescriptionBox() { return source.getSampleDescriptionBox(); } public long[] getSampleDurations() { return decodingTimes; } public long getDuration() { long duration = 0; for (long delta : decodingTimes) { duration += delta; } return duration; } public TrackMetaData getTrackMetaData() { return source.getTrackMetaData(); } public String getHandler() { return source.getHandler(); } public List<Sample> getSamples() { return samples; } public SubSampleInformationBox getSubsampleInformationBox() { return null; } public List<CompositionTimeToSample.Entry> getCompositionTimeEntries() { return null; } public long[] getSyncSamples() { return null; } public List<SampleDependencyTypeBox.Entry> getSampleDependencies() { return null; } public String getName() { return name; } public List<Edit> getEdits() { return null; } public Map<GroupEntry, long[]> getSampleGroups() { return source.getSampleGroups(); } }