public static Label[] getLabelsFromTrack(TrakBox trakBox) { return AudioSampleEntry.getLabelsFromSampleEntry((AudioSampleEntry) trakBox.getSampleEntries()[0]); }
@Override public DemuxerTrackMeta getMeta() { if(syncSamples == null) { return null; } int[] copyOf = Arrays.copyOf(syncSamples, syncSamples.length); for (int i = 0; i < copyOf.length; i++) copyOf[i]--; TrackType type = getType(); return new DemuxerTrackMeta(type == TrackType.VIDEO ? VIDEO : (type == TrackType.SOUND ? AUDIO : OTHER), copyOf, sizes.length, (double) duration / timescale, box.getCodedSize()); } }
/** * Calculates track duration considering edits * * @param track * @return */ public static long getEditedDuration(TrakBox track) { List<Edit> edits = track.getEdits(); if (edits == null) return track.getDuration(); long duration = 0; for (Edit edit : edits) { duration += edit.getDuration(); } return duration; }
public ChunkWriter(TrakBox trak, SeekableByteChannel[] inputs, SeekableByteChannel out) { this.buf = new byte[8092]; entries = trak.getSampleEntries(); ChunkOffsetsBox stco = trak.getStco(); ChunkOffsets64Box co64 = trak.getCo64(); int size; if (stco != null) size = stco.getChunkOffsets().length; else size = co64.getChunkOffsets().length; this.inputs = inputs; offsets = new long[size]; this.out = out; this.trak = trak; }
public void fixTimescale(int newTs) { int oldTs = getTimescale(); setTimescale(newTs); for (TrakBox trakBox : getTracks()) { trakBox.setDuration(rescale(trakBox.getDuration(), oldTs)); List<Edit> edits = trakBox.getEdits(); if (edits == null) continue; ListIterator<Edit> lit = edits.listIterator(); while (lit.hasNext()) { Edit edit = lit.next(); lit.set(new Edit(rescale(edit.getDuration(), oldTs), edit.getMediaTime(), edit.getRate())); } } setDuration(rescale(getDuration(), oldTs)); }
private void cleanDrefs(TrakBox trak) { MediaInfoBox minf = trak.getMdia().getMinf(); DataInfoBox dinf = trak.getMdia().getMinf().getDinf(); if (dinf == null) { dinf = DataInfoBox.createDataInfoBox(); minf.add(dinf); } DataRefBox dref = dinf.getDref(); if (dref == null) { dref = DataRefBox.createDataRefBox(); dinf.add(dref); } dref.getBoxes().clear(); dref.add(AliasBox.createSelfRef()); SampleEntry[] sampleEntries = trak.getSampleEntries(); for (int i = 0; i < sampleEntries.length; i++) { SampleEntry entry = sampleEntries[i]; entry.setDrefInd((short) 1); } }
if (videoTrack != null && videoTrack.getTimescale() != moov.getTimescale()) moov.fixTimescale(videoTrack.getTimescale()); TrakBox trakBox = tracks[i]; forceEditList(moov, trakBox); List<Edit> edits = trakBox.getEdits(); for (Slice cut : commands) { split(edits, cut.inSec, moov, trakBox); MovieBox clone = (MovieBox) NodeBox.cloneBox(moov, 16 * 1024 * 1024, BoxFactory.getDefault()); for (TrakBox trakBox : clone.getTracks()) { selectInner(trakBox.getEdits(), cut, moov, trakBox); selectOuter(trakBox.getEdits(), commands, moov, trakBox); trakBox.setEdits(trakBox.getEdits()); movDuration = max(movDuration, trakBox.getDuration());
public AbstractMP4DemuxerTrack(TrakBox trak) { no = trak.getTrackHeader().getNo(); type = MP4Demuxer.getTrackType(trak); sampleEntries = Box.findAll(trak, SampleEntry.class, "mdia", "minf", "stbl", "stsd", null); NodeBox stbl = trak.getMdia().getMinf().getStbl(); TimeToSampleBox stts = findFirst(stbl, TimeToSampleBox.class, "stts"); SampleToChunkBox stsc = findFirst(stbl, SampleToChunkBox.class, "stsc"); ChunkOffsetsBox stco = findFirst(stbl, ChunkOffsetsBox.class, "stco"); ChunkOffsets64Box co64 = findFirst(stbl, ChunkOffsets64Box.class, "co64"); timeToSamples = stts.getEntries(); sampleToChunks = stsc.getSampleToChunk(); chunkOffsets = stco != null ? stco.getChunkOffsets() : co64.getChunkOffsets(); for (TimeToSampleEntry ttse : timeToSamples) { duration += ttse.getSampleCount() * ttse.getSampleDuration(); } box = trak; timescale = trak.getTimescale(); }
public static void forceEditList(MovieBox movie, TrakBox trakBox) { List<Edit> edits = trakBox.getEdits(); if (edits == null || edits.size() == 0) { MovieHeaderBox mvhd = NodeBox.findFirst(movie, MovieHeaderBox.class, "mvhd"); edits = new ArrayList<Edit>(); trakBox.setEdits(edits); edits.add(new Edit((int) mvhd.getDuration(), 0, 1.0f)); trakBox.setEdits(edits); } }
TrakBox trak = new TrakBox(); Size dd = getDisplayDimensions(); TrackHeaderBox tkhd = new TrackHeaderBox(trackId, 0x10000, 0, 0, 0, 0x10000, 0, 0, 0, 0x40000000 }); tkhd.setFlags(0xf); trak.add(tkhd); trak.add(media); media.add(new MediaHeaderBox(timescale, totalFrames * frameDuration, 0, new Date().getTime(), new Date() .getTime(), 0));
public void setEdits(List<Edit> edits) { NodeBox edts = findFirst(this, NodeBox.class, "edts"); if (edts == null) { edts = new NodeBox(new Header("edts")); this.add(edts); } edts.removeChildren("elst"); edts.add(new EditListBox(edits)); getTrackHeader().setDuration(getEditedDuration(this)); }
public AbstractMP4DemuxerTrack(TrakBox trak) { no = trak.getTrackHeader().getNo(); type = TrakBox.getTrackType(trak); sampleEntries = NodeBox.findAllPath(trak, SampleEntry.class, new String[]{"mdia", "minf", "stbl", "stsd", null}); NodeBox stbl = trak.getMdia().getMinf().getStbl(); TimeToSampleBox stts = NodeBox.findFirst(stbl, TimeToSampleBox.class, "stts"); SampleToChunkBox stsc = NodeBox.findFirst(stbl, SampleToChunkBox.class, "stsc"); ChunkOffsetsBox stco = NodeBox.findFirst(stbl, ChunkOffsetsBox.class, "stco"); ChunkOffsets64Box co64 = NodeBox.findFirst(stbl, ChunkOffsets64Box.class, "co64"); timeToSamples = stts.getEntries(); sampleToChunks = stsc.getSampleToChunk(); chunkOffsets = stco != null ? stco.getChunkOffsets() : co64.getChunkOffsets(); for (int i = 0; i < timeToSamples.length; i++) { TimeToSampleEntry ttse = timeToSamples[i]; duration += ttse.getSampleCount() * ttse.getSampleDuration(); } box = trak; timescale = trak.getTimescale(); }
protected void putName(TrakBox trak) { if (name != null) { NodeBox udta = new NodeBox(new Header("udta")); udta.add(new NameBox(name)); trak.add(udta); } }
public boolean hasDataRef() { DataInfoBox dinf = getMdia().getMinf().getDinf(); if (dinf == null) { return false; } DataRefBox dref = dinf.getDref(); if (dref == null) return false; boolean result = false; for (Box box : dref.boxes) { result |= (((FullBox) box).getFlags() & 0x1) != 0x1; } return result; }
public boolean isVideo() { return "vide".equals(getHandlerType()); }
public void setAperture(Size sar, Size dar) { removeChildren("tapt"); NodeBox tapt = new NodeBox(new Header("tapt")); tapt.add(ClearApertureBox.createClearApertureBox(dar.getWidth(), dar.getHeight())); tapt.add(ProductionApertureBox.createProductionApertureBox(dar.getWidth(), dar.getHeight())); tapt.add(EncodedPixelBox.createEncodedPixelBox(sar.getWidth(), sar.getHeight())); add(tapt); }
public void setEdits(List<Edit> edits) { NodeBox edts = NodeBox.findFirst(this, NodeBox.class, "edts"); if (edts == null) { edts = new NodeBox(new Header("edts")); this.add(edts); } edts.removeChildren("elst"); edts.add(EditListBox.createEditListBox(edits)); getTrackHeader().setDuration(getEditedDuration(this)); }
/** * Splits track on the timevalue specified * * @param movie * @param track * @param tvMv * @return */ public static Pair<List<Edit>> split(MovieBox movie, TrakBox track, long tvMv) { return splitEdits(track.getEdits(), new Rational(track.getTimescale(), movie.getTimescale()), tvMv); }