private VideoFrameWithPacket removeFirstFixDuration(List<VideoFrameWithPacket> reorderBuffer) { Collections.sort(reorderBuffer); VideoFrameWithPacket frame = reorderBuffer.remove(0); if (!reorderBuffer.isEmpty()) { // Setting duration VideoFrameWithPacket nextFrame = reorderBuffer.get(0); frame.getPacket().setDuration(nextFrame.getPacket().getPts() - frame.getPacket().getPts()); } return frame; }
@Override public Packet inputVideoPacket() throws IOException { while (true) { Packet packet = getNextVideoPacket(); if (packet != null) videoPacketReorderBuffer.add(packet); if (packet == null || videoPacketReorderBuffer.size() > Transcoder.REORDER_BUFFER_SIZE) { if (videoPacketReorderBuffer.size() == 0) return null; Packet out = videoPacketReorderBuffer.remove(0); int duration = Integer.MAX_VALUE; for (Packet packet2 : videoPacketReorderBuffer) { int cand = (int) (packet2.getPts() - out.getPts()); if (cand > 0 && cand < duration) duration = cand; } if (duration != Integer.MAX_VALUE) out.setDuration(duration); return out; } } }
@Override public Packet nextFrame() throws IOException { if (lastFrame == null) lastFrame = nextFrameWithBuffer(null); if (lastFrame == null) return null; Packet toReturn = lastFrame; lastFrame = nextFrameWithBuffer(null); if (lastFrame != null) { lastKnownDuration = lastFrame.getPts() - toReturn.getPts(); } toReturn.setDuration(lastKnownDuration); return toReturn; }
@Override public Packet nextFrame() throws IOException { if (audioStash.size() == 0) { Packet nextFrame = nextFrameWithBuffer(null); if (nextFrame != null) { ByteBuffer data = nextFrame.getData(); Header adts = ADTSParser.read(data.duplicate()); long nextPts = nextFrame.getPts(); while (data.hasRemaining()) { ByteBuffer data2 = NIOUtils.read(data, adts.getSize()); Packet pkt = Packet.createPacketWithData(nextFrame, data2); pkt.setDuration((pkt.getTimescale() * 1024) / AACConts.AAC_SAMPLE_RATES[adts.getSamplingIndex()]); pkt.setPts(nextPts); nextPts += pkt.getDuration(); audioStash.add(pkt); if (data.hasRemaining()) adts = ADTSParser.read(data.duplicate()); } } } if (audioStash.size() == 0) return null; return audioStash.remove(0); } }
@Override public void addFrameInternal(Packet pkt, int entryNo) throws IOException { checkState(!finished, "The muxer track has finished muxing"); if (_timescale == NO_TIMESCALE_SET) { if (adtsHeader != null) { _timescale = adtsHeader.getSampleRate(); } else { _timescale = pkt.getTimescale(); } } if (_timescale != pkt.getTimescale()) { pkt.setPts((pkt.getPts() * _timescale) / pkt.getTimescale()); pkt.setDuration((pkt.getPts() * _timescale) / pkt.getDuration()); } if (adtsHeader != null) { pkt.setDuration(1024); } super.addFrameInternal(pkt, entryNo); }
pkt.setDuration((pkt.getPts() * _timescale) / pkt.getDuration());