Methods Summary |
---|
static java.util.List | adjustCtts(java.util.List source, double timeScaleFactor)Adjusting the composition times is easy. Just scale it by the factor - that's it. There is no rounding
error summing up.
if (source != null) {
List<CompositionTimeToSample.Entry> entries2 = new ArrayList<CompositionTimeToSample.Entry>(source.size());
for (CompositionTimeToSample.Entry entry : source) {
entries2.add(new CompositionTimeToSample.Entry(entry.getCount(), (int) Math.round(timeScaleFactor * entry.getOffset())));
}
return entries2;
} else {
return null;
}
|
static java.util.List | adjustTts(java.util.List source, double timeScaleFactor, long[] syncSample, long[] syncSampleTimes)
long[] sourceArray = TimeToSampleBox.blowupTimeToSamples(source);
long summedDurations = 0;
LinkedList<TimeToSampleBox.Entry> entries2 = new LinkedList<TimeToSampleBox.Entry>();
for (int i = 1; i <= sourceArray.length; i++) {
long duration = sourceArray[i - 1];
long x = Math.round(timeScaleFactor * duration);
TimeToSampleBox.Entry last = entries2.peekLast();
int ssIndex;
if ((ssIndex = Arrays.binarySearch(syncSample, i + 1)) >= 0) {
// we are at the sample before sync point
if (syncSampleTimes[ssIndex] != summedDurations) {
long correction = syncSampleTimes[ssIndex] - (summedDurations + x);
LOG.finest(String.format("Sample %d %d / %d - correct by %d", i, summedDurations, syncSampleTimes[ssIndex], correction));
x += correction;
}
}
summedDurations += x;
if (last == null) {
entries2.add(new TimeToSampleBox.Entry(1, x));
} else if (last.getDelta() != x) {
entries2.add(new TimeToSampleBox.Entry(1, x));
} else {
last.setCount(last.getCount() + 1);
}
}
return entries2;
|
public java.util.List | getCompositionTimeEntries()
return ctts;
|
public java.util.List | getDecodingTimeEntries()
return tts;
|
public java.lang.String | getHandler()
return source.getHandler();
|
public Box | getMediaHeaderBox()
return source.getMediaHeaderBox();
|
public java.util.List | getSampleDependencies()
return source.getSampleDependencies();
|
public SampleDescriptionBox | getSampleDescriptionBox()
return source.getSampleDescriptionBox();
|
public java.util.List | getSamples()
return source.getSamples();
|
public SubSampleInformationBox | getSubsampleInformationBox()
return source.getSubsampleInformationBox();
|
public long[] | getSyncSamples()
return source.getSyncSamples();
|
private static long[] | getTimes(com.googlecode.mp4parser.authoring.Track track, long[] syncSamples, long targetTimeScale)
long[] syncSampleTimes = new long[syncSamples.length];
Queue<TimeToSampleBox.Entry> timeQueue = new LinkedList<TimeToSampleBox.Entry>(track.getDecodingTimeEntries());
int currentSample = 1; // first syncsample is 1
long currentDuration = 0;
long currentDelta = 0;
int currentSyncSampleIndex = 0;
long left = 0;
while (currentSample <= syncSamples[syncSamples.length - 1]) {
if (currentSample++ == syncSamples[currentSyncSampleIndex]) {
syncSampleTimes[currentSyncSampleIndex++] = (currentDuration * targetTimeScale) / track.getTrackMetaData().getTimescale();
}
if (left-- == 0) {
TimeToSampleBox.Entry entry = timeQueue.poll();
left = entry.getCount() - 1;
currentDelta = entry.getDelta();
}
currentDuration += currentDelta;
}
return syncSampleTimes;
|
public com.googlecode.mp4parser.authoring.TrackMetaData | getTrackMetaData()
TrackMetaData trackMetaData = (TrackMetaData) source.getTrackMetaData().clone();
trackMetaData.setTimescale(timeScale);
return trackMetaData;
|
public boolean | isEnabled()
return source.isEnabled();
|
public boolean | isInMovie()
return source.isInMovie();
|
public boolean | isInPoster()
return source.isInPoster();
|
public boolean | isInPreview()
return source.isInPreview();
|
public java.lang.String | toString()
return "ChangeTimeScaleTrack{" +
"source=" + source +
'}";
|