diff options
Diffstat (limited to 'isoparser/src/main/java/com/googlecode/mp4parser/authoring/.svn/text-base/Mp4TrackImpl.java.svn-base')
-rw-r--r-- | isoparser/src/main/java/com/googlecode/mp4parser/authoring/.svn/text-base/Mp4TrackImpl.java.svn-base | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/isoparser/src/main/java/com/googlecode/mp4parser/authoring/.svn/text-base/Mp4TrackImpl.java.svn-base b/isoparser/src/main/java/com/googlecode/mp4parser/authoring/.svn/text-base/Mp4TrackImpl.java.svn-base new file mode 100644 index 0000000..3bff1a5 --- /dev/null +++ b/isoparser/src/main/java/com/googlecode/mp4parser/authoring/.svn/text-base/Mp4TrackImpl.java.svn-base @@ -0,0 +1,219 @@ +/* + * Copyright 2012 Sebastian Annies, Hamburg + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.googlecode.mp4parser.authoring; + +import com.coremedia.iso.boxes.*; +import com.coremedia.iso.boxes.fragment.*; +import com.coremedia.iso.boxes.mdat.SampleList; + +import java.nio.ByteBuffer; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import static com.googlecode.mp4parser.util.CastUtils.l2i; + +/** + * Represents a single track of an MP4 file. + */ +public class Mp4TrackImpl extends AbstractTrack { + private List<ByteBuffer> samples; + private SampleDescriptionBox sampleDescriptionBox; + private List<TimeToSampleBox.Entry> decodingTimeEntries; + private List<CompositionTimeToSample.Entry> compositionTimeEntries; + private long[] syncSamples = new long[0]; + private List<SampleDependencyTypeBox.Entry> sampleDependencies; + private TrackMetaData trackMetaData = new TrackMetaData(); + private String handler; + private AbstractMediaHeaderBox mihd; + + public Mp4TrackImpl(TrackBox trackBox) { + final long trackId = trackBox.getTrackHeaderBox().getTrackId(); + samples = new SampleList(trackBox); + SampleTableBox stbl = trackBox.getMediaBox().getMediaInformationBox().getSampleTableBox(); + handler = trackBox.getMediaBox().getHandlerBox().getHandlerType(); + + mihd = trackBox.getMediaBox().getMediaInformationBox().getMediaHeaderBox(); + decodingTimeEntries = new LinkedList<TimeToSampleBox.Entry>(); + compositionTimeEntries = new LinkedList<CompositionTimeToSample.Entry>(); + sampleDependencies = new LinkedList<SampleDependencyTypeBox.Entry>(); + + decodingTimeEntries.addAll(stbl.getTimeToSampleBox().getEntries()); + if (stbl.getCompositionTimeToSample() != null) { + compositionTimeEntries.addAll(stbl.getCompositionTimeToSample().getEntries()); + } + if (stbl.getSampleDependencyTypeBox() != null) { + sampleDependencies.addAll(stbl.getSampleDependencyTypeBox().getEntries()); + } + if (stbl.getSyncSampleBox() != null) { + syncSamples = stbl.getSyncSampleBox().getSampleNumber(); + } + + + sampleDescriptionBox = stbl.getSampleDescriptionBox(); + final List<MovieExtendsBox> movieExtendsBoxes = trackBox.getParent().getBoxes(MovieExtendsBox.class); + if (movieExtendsBoxes.size() > 0) { + for (MovieExtendsBox mvex : movieExtendsBoxes) { + final List<TrackExtendsBox> trackExtendsBoxes = mvex.getBoxes(TrackExtendsBox.class); + for (TrackExtendsBox trex : trackExtendsBoxes) { + if (trex.getTrackId() == trackId) { + List<Long> syncSampleList = new LinkedList<Long>(); + + long sampleNumber = 1; + for (MovieFragmentBox movieFragmentBox : trackBox.getIsoFile().getBoxes(MovieFragmentBox.class)) { + List<TrackFragmentBox> trafs = movieFragmentBox.getBoxes(TrackFragmentBox.class); + for (TrackFragmentBox traf : trafs) { + if (traf.getTrackFragmentHeaderBox().getTrackId() == trackId) { + List<TrackRunBox> truns = traf.getBoxes(TrackRunBox.class); + for (TrackRunBox trun : truns) { + final TrackFragmentHeaderBox tfhd = ((TrackFragmentBox) trun.getParent()).getTrackFragmentHeaderBox(); + boolean first = true; + for (TrackRunBox.Entry entry : trun.getEntries()) { + if (trun.isSampleDurationPresent()) { + if (decodingTimeEntries.size() == 0 || + decodingTimeEntries.get(decodingTimeEntries.size() - 1).getDelta() != entry.getSampleDuration()) { + decodingTimeEntries.add(new TimeToSampleBox.Entry(1, entry.getSampleDuration())); + } else { + TimeToSampleBox.Entry e = decodingTimeEntries.get(decodingTimeEntries.size() - 1); + e.setCount(e.getCount() + 1); + } + } else { + if (tfhd.hasDefaultSampleDuration()) { + decodingTimeEntries.add(new TimeToSampleBox.Entry(1, tfhd.getDefaultSampleDuration())); + } else { + decodingTimeEntries.add(new TimeToSampleBox.Entry(1, trex.getDefaultSampleDuration())); + } + } + + if (trun.isSampleCompositionTimeOffsetPresent()) { + if (compositionTimeEntries.size() == 0 || + compositionTimeEntries.get(compositionTimeEntries.size() - 1).getOffset() != entry.getSampleCompositionTimeOffset()) { + compositionTimeEntries.add(new CompositionTimeToSample.Entry(1, l2i(entry.getSampleCompositionTimeOffset()))); + } else { + CompositionTimeToSample.Entry e = compositionTimeEntries.get(compositionTimeEntries.size() - 1); + e.setCount(e.getCount() + 1); + } + } + final SampleFlags sampleFlags; + if (trun.isSampleFlagsPresent()) { + sampleFlags = entry.getSampleFlags(); + } else { + if (first && trun.isFirstSampleFlagsPresent()) { + sampleFlags = trun.getFirstSampleFlags(); + } else { + if (tfhd.hasDefaultSampleFlags()) { + sampleFlags = tfhd.getDefaultSampleFlags(); + } else { + sampleFlags = trex.getDefaultSampleFlags(); + } + } + } + if (sampleFlags != null && !sampleFlags.isSampleIsDifferenceSample()) { + //iframe + syncSampleList.add(sampleNumber); + } + sampleNumber++; + first = false; + } + } + } + } + } + // Warning: Crappy code + long[] oldSS = syncSamples; + syncSamples = new long[syncSamples.length + syncSampleList.size()]; + System.arraycopy(oldSS, 0, syncSamples, 0, oldSS.length); + final Iterator<Long> iterator = syncSampleList.iterator(); + int i = oldSS.length; + while (iterator.hasNext()) { + Long syncSampleNumber = iterator.next(); + syncSamples[i++] = syncSampleNumber; + } + } + } + } + } + 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 List<ByteBuffer> 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 String getHandler() { + return handler; + } + + public AbstractMediaHeaderBox getMediaHeaderBox() { + return mihd; + } + + public SubSampleInformationBox getSubsampleInformationBox() { + return null; + } + + @Override + public String toString() { + return "Mp4TrackImpl{" + + "handler='" + handler + '\'' + + '}'; + } +} |