package com.castlabs.dash.helpers; import com.coremedia.iso.boxes.Container; import com.coremedia.iso.boxes.EditListBox; import com.coremedia.iso.boxes.MediaHeaderBox; import com.coremedia.iso.boxes.MovieHeaderBox; import com.coremedia.iso.boxes.fragment.TrackRunBox; import com.googlecode.mp4parser.util.Path; import java.util.List; public class Timing { public static long getDuration(TrackRunBox trun) { long[] ptss = new long[trun.getEntries().size()]; long duration = 0; for (int j = 0; j < ptss.length; j++) { duration += trun.getEntries().get(j).getSampleDuration(); } return duration; } public static long[] getPtss(TrackRunBox trun) { long currentTime = 0; long[] ptss = new long[trun.getEntries().size()]; for (int j = 0; j < ptss.length; j++) { ptss[j] = currentTime + trun.getEntries().get(j).getSampleCompositionTimeOffset(); currentTime += trun.getEntries().get(j).getSampleDuration(); } return ptss; } public static long getTimeMappingEditTime(Container file) { final EditListBox editList = Path.getPath(file, "/moov[0]/trak[0]/edts[0]/elst[0]"); final MediaHeaderBox mdhd = Path.getPath(file, "/moov[0]/trak[0]/mdia[0]/mdhd[0]"); final MovieHeaderBox mvhd = Path.getPath(file, "/moov[0]/mvhd[0]"); if (editList != null) { double editStartTime = 0; final List<EditListBox.Entry> entries = editList.getEntries(); boolean acceptDwell = true; boolean acceptEdit = true; for (EditListBox.Entry edit : entries) { if (edit.getMediaTime() == -1 && !acceptDwell) { throw new RuntimeException("Cannot accept edit list for processing (1)"); } if (edit.getMediaTime() >= 0 && !acceptEdit) { throw new RuntimeException("Cannot accept edit list for processing (2)"); } if (edit.getMediaTime() == -1) { assert mvhd != null; editStartTime -= (double) edit.getSegmentDuration() / mvhd.getTimescale(); } else /* if edit.getMediaTime() >= 0 */ { assert mdhd != null; editStartTime += (double) edit.getMediaTime() / mdhd.getTimescale(); acceptEdit = false; acceptDwell = false; } } assert mdhd != null; return (long) (editStartTime * mdhd.getTimescale()); } return 0; } }