package com.castlabs.dash.dashfragmenter.tracks; import com.castlabs.dash.helpers.BoxHelper; import com.castlabs.dash.helpers.DashHelper; import com.coremedia.iso.boxes.CompositionTimeToSample; import com.googlecode.mp4parser.authoring.Edit; import com.googlecode.mp4parser.authoring.Track; import com.googlecode.mp4parser.authoring.WrappingTrack; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Created by sannies on 04.11.2014. */ public class NegativeCtsInsteadOfEdit extends WrappingTrack { Track original; List<CompositionTimeToSample.Entry> ctts; List<Edit> edits; public NegativeCtsInsteadOfEdit(Track parent) { super(parent); this.original = parent; if (parent.getCompositionTimeEntries() != null && parent.getCompositionTimeEntries().size() > 0) { long currentTime = 0; int[] ptss = Arrays.copyOfRange(CompositionTimeToSample.blowupCompositionTimes(parent.getCompositionTimeEntries()), 0, 50); for (int j = 0; j < ptss.length; j++) { ptss[j] += currentTime; currentTime += parent.getSampleDurations()[j]; } Arrays.sort(ptss); ctts = parent.getCompositionTimeEntries(); for (CompositionTimeToSample.Entry ctt : ctts) { ctt.setOffset(ctt.getOffset() - ptss[0]); } List<Edit> orgEdits = original.getEdits(); double earliestTrackPresentationTime = DashHelper.getEarliestTrackPresentationTime(orgEdits); double adjustedStartTime = earliestTrackPresentationTime + (double)ptss[0] / original.getTrackMetaData().getTimescale(); edits = BoxHelper.getEdits(original, adjustedStartTime); } } @Override public List<CompositionTimeToSample.Entry> getCompositionTimeEntries() { return ctts; } @Override public List<Edit> getEdits() { return edits; } public static boolean benefitsFromChange(Track track) { List<Edit> edits = track.getEdits(); double decodingStartInMovie = DashHelper.getEarliestTrackPresentationTime(edits); if (decodingStartInMovie != 0) { double presentationStartInTrack = 0; if (track.getCompositionTimeEntries() != null && track.getCompositionTimeEntries().size() > 0) { long currentTime = 0; int[] ptss = Arrays.copyOfRange(CompositionTimeToSample.blowupCompositionTimes(track.getCompositionTimeEntries()), 0, 50); for (int j = 0; j < ptss.length; j++) { ptss[j] += currentTime; currentTime += track.getSampleDurations()[j]; } Arrays.sort(ptss); presentationStartInTrack = (double) ptss[0] / track.getTrackMetaData().getTimescale(); } if (presentationStartInTrack + decodingStartInMovie == 0) { return true; } else { return false; } } else { return false; } } @Override public String getName() { return "NegativeCtsInsteadOfEdit(" + this.original.getName() + ")"; } }