streamingSample.addSampleExtension(sfse); if (compositionOffsets != null && !compositionOffsets.isEmpty()) { final long compositionOffset = compositionOffsets.get(0).getOffset(); if (compositionOffsets.get(0).getCount() == 1) { compositionOffsets.remove(0); } else { compositionOffsets.get(0).setCount(compositionOffsets.get(0).getCount() - 1);
new CompositionTimeToSample.Entry(1, l2i(sample.getSampleExtension(CompositionTimeSampleExtension.class).getCompositionTimeOffset())));
log.info("Entry: {}", rec); if (trun.isSampleCompositionTimeOffsetPresent()) { CompositionTimeToSample.Entry ctts = new CompositionTimeToSample.Entry((int) trun.getSampleCount(), (int) rec.getSampleCompositionTimeOffset()); compositionTimes.add(ctts);
log.info("Entry: {}", rec); if (trun.isSampleCompositionTimeOffsetPresent()) { CompositionTimeToSample.Entry ctts = new CompositionTimeToSample.Entry((int) trun.getSampleCount(), (int) rec.getSampleCompositionTimeOffset()); compositionTimes.add(ctts);
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);
compositionTimeEntries != null && compositionTimeEntries.size() > 0 ? compositionTimeEntries.toArray(new CompositionTimeToSample.Entry[compositionTimeEntries.size()]) : null; long compositionTimeEntriesLeft = compositionTimeQueue != null ? compositionTimeQueue[compositionTimeQueueIndex].getCount() : -1; compositionTimeEntriesLeft = compositionTimeQueue[compositionTimeQueueIndex].getCount(); entry.setSampleCompositionTimeOffset(compositionTimeQueue[compositionTimeQueueIndex].getOffset()); if (--compositionTimeEntriesLeft == 0 && (compositionTimeQueue.length - compositionTimeQueueIndex) > 1) { compositionTimeQueueIndex++; compositionTimeEntriesLeft = compositionTimeQueue[compositionTimeQueueIndex].getCount();
compositionTimeEntries != null && compositionTimeEntries.size() > 0 ? compositionTimeEntries.toArray(new CompositionTimeToSample.Entry[compositionTimeEntries.size()]) : null; long compositionTimeEntriesLeft = compositionTimeQueue != null ? compositionTimeQueue[compositionTimeQueueIndex].getCount() : -1; compositionTimeEntriesLeft = compositionTimeQueue[compositionTimeQueueIndex].getCount(); entry.setSampleCompositionTimeOffset(compositionTimeQueue[compositionTimeQueueIndex].getOffset()); if (--compositionTimeEntriesLeft == 0 && (compositionTimeQueue.length - compositionTimeQueueIndex) > 1) { compositionTimeQueueIndex++; compositionTimeEntriesLeft = compositionTimeQueue[compositionTimeQueueIndex].getCount();
static List<CompositionTimeToSample.Entry> getCompositionTimeEntries(List<CompositionTimeToSample.Entry> origSamples, long fromSample, long toSample) { if (origSamples != null && !origSamples.isEmpty()) { long current = 0; ListIterator<CompositionTimeToSample.Entry> e = origSamples.listIterator(); ArrayList<CompositionTimeToSample.Entry> nuList = new ArrayList<CompositionTimeToSample.Entry>(); // Skip while not yet reached: CompositionTimeToSample.Entry currentEntry; while ((currentEntry = e.next()).getCount() + current <= fromSample) { current += currentEntry.getCount(); } // Take just a bit from the next if (currentEntry.getCount() + current >= toSample) { nuList.add(new CompositionTimeToSample.Entry((int) (toSample - fromSample), currentEntry.getOffset())); return nuList; // done in one step } else { nuList.add(new CompositionTimeToSample.Entry((int) (currentEntry.getCount() + current - fromSample), currentEntry.getOffset())); } current += currentEntry.getCount(); while (e.hasNext() && (currentEntry = e.next()).getCount() + current < toSample) { nuList.add(currentEntry); current += currentEntry.getCount(); } nuList.add(new CompositionTimeToSample.Entry((int) (toSample - current), currentEntry.getOffset())); return nuList; } else { return null; } }
public List<CompositionTimeToSample.Entry> getCompositionTimeEntries() { if (tracks[0].getCompositionTimeEntries() != null && !tracks[0].getCompositionTimeEntries().isEmpty()) { List<int[]> lists = new LinkedList<int[]>(); for (Track track : tracks) { lists.add(CompositionTimeToSample.blowupCompositionTimes(track.getCompositionTimeEntries())); } LinkedList<CompositionTimeToSample.Entry> compositionTimeEntries = new LinkedList<CompositionTimeToSample.Entry>(); for (int[] list : lists) { for (int compositionTime : list) { if (compositionTimeEntries.isEmpty() || compositionTimeEntries.getLast().getOffset() != compositionTime) { CompositionTimeToSample.Entry e = new CompositionTimeToSample.Entry(1, compositionTime); compositionTimeEntries.add(e); } else { CompositionTimeToSample.Entry e = compositionTimeEntries.getLast(); e.setCount(e.getCount() + 1); } } } return compositionTimeEntries; } else { return null; } }
public void calcCtts() { int pTime = 0; int lastPoc = -1; for (int j = 0; j < pictureOrderCounts.length; j++) { int minIndex = 0; int minValue = Integer.MAX_VALUE; for (int i = Math.max(0, j - 128); i < Math.min(pictureOrderCounts.length, j + 128); i++) { if (pictureOrderCounts[i] > lastPoc && pictureOrderCounts[i] < minValue) { minIndex = i; minValue = pictureOrderCounts[i]; } } lastPoc = pictureOrderCounts[minIndex]; pictureOrderCounts[minIndex] = pTime++; } for (int i = 0; i < pictureOrderCounts.length; i++) { ctts.add(new CompositionTimeToSample.Entry(1, pictureOrderCounts[i] - i)); } pictureOrderCounts = new int[0]; }
/** * Decompresses the list of entries and returns the list of composition times. * * @param entries composition time to sample entries in compressed form * @return decoding time per sample */ public static int[] blowupCompositionTimes(List<CompositionTimeToSample.Entry> entries) { long numOfSamples = 0; for (CompositionTimeToSample.Entry entry : entries) { numOfSamples += entry.getCount(); } assert numOfSamples <= Integer.MAX_VALUE; int[] decodingTime = new int[(int) numOfSamples]; int current = 0; for (CompositionTimeToSample.Entry entry : entries) { for (int i = 0; i < entry.getCount(); i++) { decodingTime[current++] = entry.getOffset(); } } return decodingTime; }
/** * Adjusting the composition times is easy. Just scale it by the factor - that's it. There is no rounding * error summing up. * * @param source * @param timeScaleFactor * @return */ static List<CompositionTimeToSample.Entry> adjustCtts(List<CompositionTimeToSample.Entry> source, double timeScaleFactor) { if (source != null) { List<CompositionTimeToSample.Entry> entries2 = new ArrayList<CompositionTimeToSample.Entry>(source.size()); for (CompositionTimeToSample.Entry entry : source) { entries2.add(new CompositionTimeToSample.Entry(entry.getCount(), (int) Math.round(timeScaleFactor * entry.getOffset()))); } return entries2; } else { return null; } }
@Override public void _parseDetails(ByteBuffer content) { parseVersionAndFlags(content); int numberOfEntries = CastUtils.l2i(IsoTypeReader.readUInt32(content)); entries = new ArrayList<Entry>(numberOfEntries); for (int i = 0; i < numberOfEntries; i++) { Entry e = new Entry(CastUtils.l2i(IsoTypeReader.readUInt32(content)), content.getInt()); entries.add(e); } }
List<CompositionTimeToSample.Entry> adjustCtts() { List<CompositionTimeToSample.Entry> origCtts = this.source.getCompositionTimeEntries(); if (origCtts != null) { List<CompositionTimeToSample.Entry> entries2 = new ArrayList<CompositionTimeToSample.Entry>(origCtts.size()); for (CompositionTimeToSample.Entry entry : origCtts) { entries2.add(new CompositionTimeToSample.Entry(entry.getCount(), entry.getOffset() / timeScaleDivisor)); } return entries2; } else { return null; } }
static List<CompositionTimeToSample.Entry> adjustCtts(List<CompositionTimeToSample.Entry> source, int timeScaleFactor) { if (source != null) { List<CompositionTimeToSample.Entry> entries2 = new ArrayList<CompositionTimeToSample.Entry>(source.size()); for (CompositionTimeToSample.Entry entry : source) { entries2.add(new CompositionTimeToSample.Entry(entry.getCount(), timeScaleFactor * entry.getOffset())); } return entries2; } else { return null; } }