package com.googlecode.mp4parser.authoring; import com.coremedia.iso.boxes.AbstractMediaHeaderBox; import com.coremedia.iso.boxes.CompositionTimeToSample; import com.coremedia.iso.boxes.HintMediaHeaderBox; import com.coremedia.iso.boxes.MediaHeaderBox; import com.coremedia.iso.boxes.NullMediaHeaderBox; import com.coremedia.iso.boxes.SampleDependencyTypeBox; import com.coremedia.iso.boxes.SampleDescriptionBox; import com.coremedia.iso.boxes.SampleTableBox; import com.coremedia.iso.boxes.SoundMediaHeaderBox; import com.coremedia.iso.boxes.TimeToSampleBox; import com.coremedia.iso.boxes.TrackBox; import com.coremedia.iso.boxes.TrackHeaderBox; import com.coremedia.iso.boxes.VideoMediaHeaderBox; import com.coremedia.iso.boxes.mdat.SampleList; import java.util.List; /** * Represents a single track of an MP4 file. */ public class Mp4TrackImpl extends AbstractTrack { private SampleList samples; private SampleDescriptionBox sampleDescriptionBox; private List<TimeToSampleBox.Entry> decodingTimeEntries; private List<CompositionTimeToSample.Entry> compositionTimeEntries; private long[] syncSamples; private List<SampleDependencyTypeBox.Entry> sampleDependencies; private TrackMetaData trackMetaData = new TrackMetaData(); private Type type; public Mp4TrackImpl(TrackBox trackBox) { samples = new SampleList(trackBox); SampleTableBox stbl = trackBox.getMediaBox().getMediaInformationBox().getSampleTableBox(); AbstractMediaHeaderBox mihd = trackBox.getMediaBox().getMediaInformationBox().getMediaHeaderBox(); if (mihd instanceof VideoMediaHeaderBox) { type = Type.VIDEO; } else if (mihd instanceof SoundMediaHeaderBox) { type = Type.SOUND; } else if (mihd instanceof HintMediaHeaderBox) { type = Type.HINT; } else if (mihd instanceof NullMediaHeaderBox) { type = Type.NULL; } else { type = Type.UNKNOWN; } sampleDescriptionBox = stbl.getSampleDescriptionBox(); decodingTimeEntries = stbl.getTimeToSampleBox().getEntries(); if (stbl.getCompositionTimeToSample() != null) { compositionTimeEntries = stbl.getCompositionTimeToSample().getEntries(); } if (stbl.getSyncSampleBox() != null) { syncSamples = stbl.getSyncSampleBox().getSampleNumber(); } if (stbl.getSampleDependencyTypeBox() != null) { sampleDependencies = stbl.getSampleDependencyTypeBox().getEntries(); } MediaHeaderBox mdhd = trackBox.getMediaBox().getMediaHeaderBox(); TrackHeaderBox tkhd = trackBox.getTrackHeaderBox(); setEnabled(tkhd.isEnabled()); setInMovie(tkhd.isInMovie()); setInPoster(tkhd.isInPoster()); setInPreview(tkhd.isInPreview()); trackMetaData.setTrackId(tkhd.getTrackId()); trackMetaData.setCreationTime(DateHelper.convert(mdhd.getCreationTime())); trackMetaData.setLanguage(mdhd.getLanguage()); System.err.println(mdhd.getModificationTime()); System.err.println(DateHelper.convert(mdhd.getModificationTime())); System.err.println(DateHelper.convert(DateHelper.convert(mdhd.getModificationTime()))); System.err.println(DateHelper.convert(DateHelper.convert(DateHelper.convert(mdhd.getModificationTime())))); trackMetaData.setModificationTime(DateHelper.convert(mdhd.getModificationTime())); trackMetaData.setTimescale(mdhd.getTimescale()); trackMetaData.setHeight(tkhd.getHeight()); trackMetaData.setWidth(tkhd.getWidth()); trackMetaData.setLayer(tkhd.getLayer()); } public SampleList getSamples() { return samples; } public SampleDescriptionBox getSampleDescriptionBox() { return sampleDescriptionBox; } public List<TimeToSampleBox.Entry> getDecodingTimeEntries() { return decodingTimeEntries; } public List<CompositionTimeToSample.Entry> getCompositionTimeEntries() { return compositionTimeEntries; } public long[] getSyncSamples() { return syncSamples; } public List<SampleDependencyTypeBox.Entry> getSampleDependencies() { return sampleDependencies; } public TrackMetaData getTrackMetaData() { return trackMetaData; } public Type getType() { return type; } }