protected void createTrun(StreamingTrack streamingTrack, TrackFragmentBox parent, List<StreamingSample> samples) { TrackRunBox trun = new TrackRunBox(); trun.setVersion(1); trun.setSampleDurationPresent(true); trun.setSampleSizePresent(true); List<TrackRunBox.Entry> entries = new ArrayList<TrackRunBox.Entry>(samples.size()); trun.setSampleCompositionTimeOffsetPresent(streamingTrack.getTrackExtension(CompositionTimeTrackExtension.class) != null); trun.setSampleFlagsPresent(defaultSampleFlagsTrackExtension == null); if (trun.isSampleCompositionTimeOffsetPresent()) { CompositionTimeSampleExtension compositionTimeSampleExtension = streamingSample.getSampleExtension(CompositionTimeSampleExtension.class); assert compositionTimeSampleExtension != null : "CompositionTimeSampleExtension missing even though CompositionTimeTrackExtension was present"; trun.setEntries(entries);
List<TrackFragmentRandomAccessBox.Entry> offset2timeEntriesThisTrun = new LinkedList<TrackFragmentRandomAccessBox.Entry>(); TrackRunBox trun = truns.get(j); for (int k = 0; k < trun.getEntries().size(); k++) { TrackRunBox.Entry trunEntry = trun.getEntries().get(k); SampleFlags sf; if (k == 0 && trun.isFirstSampleFlagsPresent()) { sf = trun.getFirstSampleFlags(); } else if (trun.isSampleFlagsPresent()) { sf = trunEntry.getSampleFlags(); } else { if (offset2timeEntriesThisTrun.size() == trun.getEntries().size() && trun.getEntries().size() > 0) {
@Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("TrackRunBox"); sb.append("{sampleCount=").append(entries.size()); sb.append(", dataOffset=").append(dataOffset); sb.append(", dataOffsetPresent=").append(isDataOffsetPresent()); sb.append(", sampleSizePresent=").append(isSampleSizePresent()); sb.append(", sampleDurationPresent=").append(isSampleDurationPresent()); sb.append(", sampleFlagsPresentPresent=").append(isSampleFlagsPresent()); sb.append(", sampleCompositionTimeOffsetPresent=").append(isSampleCompositionTimeOffsetPresent()); sb.append(", firstSampleFlags=").append(firstSampleFlags); sb.append('}'); return sb.toString(); }
if (trun.getEntries().size() <= (sampleIndexWithInTraf - previousTrunsSize)) { previousTrunsSize += trun.getEntries().size(); } else { List<TrackRunBox.Entry> trackRunEntries = trun.getEntries(); final TrackFragmentHeaderBox tfhd = trackFragmentBox.getTrackFragmentHeaderBox(); boolean sampleSizePresent = trun.isSampleSizePresent(); boolean hasDefaultSampleSize = tfhd.hasDefaultSampleSize(); long defaultSampleSize = 0; if (trun.isDataOffsetPresent()) { offset += trun.getDataOffset();
final TrackFragmentHeaderBox tfhd = traf.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()) { if (trun.isSampleCompositionTimeOffsetPresent()) { if (compositionTimeEntries.size() == 0 || compositionTimeEntries.get(compositionTimeEntries.size() - 1).getOffset() != entry.getSampleCompositionTimeOffset()) { if (trun.isSampleFlagsPresent()) { sampleFlags = entry.getSampleFlags(); } else { if (first && trun.isFirstSampleFlagsPresent()) { sampleFlags = trun.getFirstSampleFlags(); } else { if (tfhd.hasDefaultSampleFlags()) {
log.debug("trun - {}", trun); if (trun.isDataOffsetPresent()) { dataOffsets.add(trun.getDataOffset()); videoSampleCount += trun.getSampleCount(); List<TrackRunBox.Entry> recs = trun.getEntries(); log.info("TrackRunBox contains {} entries", recs.size()); for (TrackRunBox.Entry rec : recs) { log.info("Entry: {}", rec); if (trun.isSampleCompositionTimeOffsetPresent()) { CompositionTimeToSample.Entry ctts = new CompositionTimeToSample.Entry((int) trun.getSampleCount(), (int) rec.getSampleCompositionTimeOffset()); compositionTimes.add(ctts); if (trun.isSampleDurationPresent()) { videoSampleDuration += rec.getSampleDuration();
boolean allFllowingSame = true; for (TrackRunBox.Entry entry : trun.getEntries()) { if (first == null) { first = entry.getSampleFlags(); trun.setSampleFlagsPresent(false); trun.setFirstSampleFlags(first); tfhd.setDefaultSampleFlags(second);
private Box createMoof(StreamingTrack streamingTrack, List<StreamingSample> samples) { MovieFragmentBox moof = new MovieFragmentBox(); createMfhd(sequenceNumber, moof); createTraf(streamingTrack, moof, samples); TrackRunBox firstTrun = moof.getTrackRunBoxes().get(0); firstTrun.setDataOffset(1); // dummy to make size correct firstTrun.setDataOffset((int) (8 + moof.getSize())); // mdat header + moof size return moof; }
int sampleNo = 0; for (int i = 0; i < saioOffsets.length; i++) { int numSamples = truns.get(i).getEntries().size(); long offset = saioOffsets[i]; long length = 0;
public long[] getSampleCompositionTimeOffsets() { if (isSampleCompositionTimeOffsetPresent()) { long[] result = new long[entries.size()]; for (int i = 0; i < result.length; i++) { result[i] = entries.get(i).getSampleCompositionTimeOffset(); } return result; } return null; }
final TrackFragmentHeaderBox tfhd = traf.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()) { if (trun.isSampleCompositionTimeOffsetPresent()) { if (compositionTimeEntries.size() == 0 || compositionTimeEntries.get(compositionTimeEntries.size() - 1).getOffset() != entry.getSampleCompositionTimeOffset()) { if (trun.isSampleFlagsPresent()) { sampleFlags = entry.getSampleFlags(); } else { if (first && trun.isFirstSampleFlagsPresent()) { sampleFlags = trun.getFirstSampleFlags(); } else { if (tfhd.hasDefaultSampleFlags()) {
log.debug("trun - {}", trun); if (trun.isDataOffsetPresent()) { dataOffsets.add(trun.getDataOffset()); videoSampleCount += trun.getSampleCount(); List<TrackRunBox.Entry> recs = trun.getEntries(); log.info("TrackRunBox contains {} entries", recs.size()); for (TrackRunBox.Entry rec : recs) { log.info("Entry: {}", rec); if (trun.isSampleCompositionTimeOffsetPresent()) { CompositionTimeToSample.Entry ctts = new CompositionTimeToSample.Entry((int) trun.getSampleCount(), (int) rec.getSampleCompositionTimeOffset()); compositionTimes.add(ctts); if (trun.isSampleDurationPresent()) { videoSampleDuration += rec.getSampleDuration();
if (trun.getEntries().size() <= (sampleIndexWithInTraf - previousTrunsSize)) { previousTrunsSize += trun.getEntries().size(); } else { List<TrackRunBox.Entry> trackRunEntries = trun.getEntries(); final TrackFragmentHeaderBox tfhd = trackFragmentBox.getTrackFragmentHeaderBox(); boolean sampleSizePresent = trun.isSampleSizePresent(); boolean hasDefaultSampleSize = tfhd.hasDefaultSampleSize(); long defaultSampleSize = 0; if (trun.isDataOffsetPresent()) { offset += trun.getDataOffset();
/** * Creates a 'moof' box for a given sequence of samples. * * @param startSample low endpoint (inclusive) of the sample sequence * @param endSample high endpoint (exclusive) of the sample sequence * @param track source of the samples * @param sequenceNumber the fragment index of the requested list of samples * @return the list of TrackRun boxes. */ protected ParsableBox createMoof(long startSample, long endSample, Track track, int sequenceNumber) { MovieFragmentBox moof = new MovieFragmentBox(); createMfhd(startSample, endSample, track, sequenceNumber, moof); createTraf(startSample, endSample, track, sequenceNumber, moof); TrackRunBox firstTrun = moof.getTrackRunBoxes().get(0); firstTrun.setDataOffset(1); // dummy to make size correct firstTrun.setDataOffset((int) (8 + moof.getSize())); // mdat header + moof size return moof; }
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 long[] getSampleCompositionTimeOffsets() { if (isSampleCompositionTimeOffsetPresent()) { long[] result = new long[entries.size()]; for (int i = 0; i < result.length; i++) { result[i] = entries.get(i).getSampleCompositionTimeOffset(); } return result; } return null; }
TrackRunBox trun = new TrackRunBox(); trun.setVersion(1); long[] sampleSizes = getSampleSizes(startSample, endSample, track, sequenceNumber); trun.setSampleDurationPresent(true); trun.setSampleSizePresent(true); List<TrackRunBox.Entry> entries = new ArrayList<TrackRunBox.Entry>(l2i(endSample - startSample)); trun.setSampleCompositionTimeOffsetPresent(compositionTimeEntriesLeft > 0); track.getSyncSamples() != null && track.getSyncSamples().length != 0); trun.setSampleFlagsPresent(sampleFlagsRequired); trun.setEntries(entries);
@Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("TrackRunBox"); sb.append("{sampleCount=").append(entries.size()); sb.append(", dataOffset=").append(dataOffset); sb.append(", dataOffsetPresent=").append(isDataOffsetPresent()); sb.append(", sampleSizePresent=").append(isSampleSizePresent()); sb.append(", sampleDurationPresent=").append(isSampleDurationPresent()); sb.append(", sampleFlagsPresentPresent=").append(isSampleFlagsPresent()); sb.append(", sampleCompositionTimeOffsetPresent=").append(isSampleCompositionTimeOffsetPresent()); sb.append(", firstSampleFlags=").append(firstSampleFlags); sb.append('}'); return sb.toString(); }
public static SampleFlags getSampleFlags(int i, TrackRunBox trun, org.mp4parser.boxes.iso14496.part12.TrackExtendsBox trex) { return trun.isFirstSampleFlagsPresent() ? trun.getFirstSampleFlags() : (trun.isSampleFlagsPresent() ? trun.getEntries().get(i).getSampleFlags() : trex.getDefaultSampleFlags()); }
/** * Creates a 'moof' box for a given sequence of samples. * * @param startSample low endpoint (inclusive) of the sample sequence * @param endSample high endpoint (exclusive) of the sample sequence * @param track source of the samples * @param sequenceNumber the fragment index of the requested list of samples * @return the list of TrackRun boxes. */ protected ParsableBox createMoof(long startSample, long endSample, Track track, int sequenceNumber) { MovieFragmentBox moof = new MovieFragmentBox(); createMfhd(startSample, endSample, track, sequenceNumber, moof); createTraf(startSample, endSample, track, sequenceNumber, moof); TrackRunBox firstTrun = moof.getTrackRunBoxes().get(0); firstTrun.setDataOffset(1); // dummy to make size correct firstTrun.setDataOffset((int) (8 + moof.getSize())); // mdat header + moof size return moof; }