com.googlecode.mp4parser.authoring.tracks.AppendTrack Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of isoparser Show documentation
Show all versions of isoparser Show documentation
A generic parser and writer for all ISO 14496 based files (MP4, Quicktime, DCF, PDCF, ...)
package com.googlecode.mp4parser.authoring.tracks;
import com.coremedia.iso.IsoBufferWrapper;
import com.coremedia.iso.IsoOutputStream;
import com.coremedia.iso.boxes.CompositionTimeToSample;
import com.coremedia.iso.boxes.SampleDependencyTypeBox;
import com.coremedia.iso.boxes.SampleDescriptionBox;
import com.coremedia.iso.boxes.TimeToSampleBox;
import com.googlecode.mp4parser.authoring.AbstractTrack;
import com.googlecode.mp4parser.authoring.Track;
import com.googlecode.mp4parser.authoring.TrackMetaData;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
/**
* Appends two or more Tracks
of the same type. No only that the type must be equal
* also the decoder settings must be the same.
*/
public class AppendTrack extends AbstractTrack {
Track[] tracks;
public AppendTrack(Track... tracks) throws IOException {
this.tracks = tracks;
byte[] referenceSampleDescriptionBox = null;
for (Track track : tracks) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
track.getSampleDescriptionBox().getBox(new IsoOutputStream(baos));
if (referenceSampleDescriptionBox == null) {
referenceSampleDescriptionBox = baos.toByteArray();
} else if (!Arrays.equals(referenceSampleDescriptionBox, baos.toByteArray())) {
throw new IOException("Cannot append " + track + " to " + tracks[0] + " since their Sample Description Boxes differ");
}
}
}
public List getSamples() {
ArrayList lists = new ArrayList();
for (Track track : tracks) {
lists.addAll(track.getSamples());
}
return lists;
}
public SampleDescriptionBox getSampleDescriptionBox() {
return tracks[0].getSampleDescriptionBox();
}
public List getDecodingTimeEntries() {
if (tracks[0].getDecodingTimeEntries() != null && !tracks[0].getDecodingTimeEntries().isEmpty()) {
List lists = new LinkedList();
for (Track track : tracks) {
lists.add(TimeToSampleBox.blowupTimeToSamples(track.getDecodingTimeEntries()));
}
LinkedList returnDecodingEntries = new LinkedList();
for (long[] list : lists) {
for (long nuDecodingTime : list) {
if (returnDecodingEntries.isEmpty() || returnDecodingEntries.getLast().getDelta() != nuDecodingTime) {
TimeToSampleBox.Entry e = new TimeToSampleBox.Entry(1, nuDecodingTime);
returnDecodingEntries.add(e);
} else {
TimeToSampleBox.Entry e = returnDecodingEntries.getLast();
e.setCount(e.getCount() + 1);
}
}
}
return returnDecodingEntries;
} else {
return null;
}
}
public List getCompositionTimeEntries() {
if (tracks[0].getCompositionTimeEntries() != null && !tracks[0].getCompositionTimeEntries().isEmpty()) {
List lists = new LinkedList();
for (Track track : tracks) {
lists.add(CompositionTimeToSample.blowupCompositionTimes(track.getCompositionTimeEntries()));
}
LinkedList compositionTimeEntries = new LinkedList();
for (int[] list : lists) {
for (int compositionTime : list) {
if (compositionTimeEntries.isEmpty() || compositionTimeEntries.getLast().getOffset() != compositionTime) {
CompositionTimeToSample.Entry e = new CompositionTimeToSample.Entry(1, compositionTime);
compositionTimeEntries.add(e);
} else {
CompositionTimeToSample.Entry e = compositionTimeEntries.getLast();
e.setCount(e.getCount() + 1);
}
}
}
return compositionTimeEntries;
} else {
return null;
}
}
public long[] getSyncSamples() {
if (tracks[0].getSyncSamples() != null && tracks[0].getSyncSamples().length > 0) {
int numSyncSamples = 0;
for (Track track : tracks) {
numSyncSamples += track.getSyncSamples().length;
}
long[] returnSyncSamples = new long[numSyncSamples];
int pos = 0;
for (Track track : tracks) {
for (long l : track.getSyncSamples()) {
returnSyncSamples[pos++] = l;
}
}
return returnSyncSamples;
} else {
return null;
}
}
public List getSampleDependencies() {
if (tracks[0].getSampleDependencies() != null && !tracks[0].getSampleDependencies().isEmpty()) {
List list = new LinkedList();
for (Track track : tracks) {
list.addAll(track.getSampleDependencies());
}
return list;
} else {
return null;
}
}
public TrackMetaData getTrackMetaData() {
return tracks[0].getTrackMetaData();
}
public Type getType() {
return tracks[0].getType();
}
}