@Override public Packet nextFrameWithBuffer(ByteBuffer buf) throws IOException { PESPacket pkt; if (_pending.size() > 0) { pkt = _pending.remove(0); } else { while ((pkt = demuxer.nextPacket(demuxer.getBuffer())) != null && pkt.streamId != streamId) demuxer.addToStream(pkt); } return pkt == null ? null : Packet.createPacket(pkt.data, pkt.pts, 90000, 0, frameNo++, FrameType.UNKNOWN, null); }
@Override public Packet nextFrame() throws IOException { ByteBuffer data = NIOUtils.fetchFromChannel(ch, frameSize * FRAMES_PER_PKT); if (!data.hasRemaining()) return null; long oldPts = pts; int duration = data.remaining() / frameSize; pts += duration; return Packet.createPacket(data, oldPts, header.getFormat().getFrameRate(), data.remaining() / frameSize, frameNo++, FrameType.KEY, null); }
@Override public Packet nextFrame() throws IOException { if (frameIdx > blocks.size()) return null; MkvBlock b = blocks.get(blockIdx).block; if (b == null) throw new RuntimeException("Something somewhere went wrong."); if (b.frames == null || b.frames.length == 0) { /** * This part could be moved withing yet-another inner class, say * MKVPacket to that channel is actually rean only when * Packet.getData() is executed. */ demuxer.channel.setPosition(b.dataOffset); ByteBuffer data = ByteBuffer.allocate(b.dataLen); demuxer.channel.read(data); b.readFrames(data); } ByteBuffer data = b.frames[frameInBlockIdx].duplicate(); frameInBlockIdx++; frameIdx++; if (frameInBlockIdx >= b.frames.length) { blockIdx++; frameInBlockIdx = 0; } return Packet.createPacket(data, b.absoluteTimecode, (int) Math.round(samplingFrequency), 1, 0, FrameType.KEY, ZERO_TAPE_TIMECODE); }
data.put(aFrame); return Packet.createPacket(data, firstBlockInAPacket.absoluteTimecode, (int) Math.round(samplingFrequency), packetFrames.size(), 0, FrameType.KEY, ZERO_TAPE_TIMECODE);
@Override public Packet nextFrame() throws IOException { if (frameIdx >= blocks.size()) return null; MkvBlock b = blocks.get(frameIdx); if (b == null) throw new RuntimeException("Something somewhere went wrong."); frameIdx++; /** * This part could be moved withing yet-another inner class, say * MKVPacket to that channel is actually read only when * Packet.getData() is executed. */ demuxer.channel.setPosition(b.dataOffset); ByteBuffer data = ByteBuffer.allocate(b.dataLen); demuxer.channel.read(data); data.flip(); b.readFrames(data.duplicate()); long duration = 1; if (frameIdx < blocks.size()) duration = blocks.get(frameIdx).absoluteTimecode - b.absoluteTimecode; ByteBuffer result = b.frames[0].duplicate(); if (codec == Codec.H264) { result = H264Utils.decodeMOVPacket(result, avcC); } return Packet.createPacket(result, b.absoluteTimecode, demuxer.timescale, duration, frameIdx - 1, b._keyFrame ? FrameType.KEY : FrameType.INTER, ZERO_TAPE_TIMECODE); }
private Packet _nextFrame(ByteBuffer buf) throws IOException { seekToFrame(); if (curFrame >= fsizes.length) return null; int fs = fsizes[curFrame]; ByteBuffer result = buf.duplicate(); result.limit(result.position() + fs); while (result.hasRemaining()) { if (pesBuf.hasRemaining()) { result.put(NIOUtils.read(pesBuf, Math.min(pesBuf.remaining(), result.remaining()))); } else { ++curPesIdx; long posShift = 0; while (demuxer.pesStreamIds[curPesIdx] != streamId) { posShift += MPSIndex.pesLen(demuxer.pesTokens[curPesIdx]) + MPSIndex.leadingSize(demuxer.pesTokens[curPesIdx]); ++curPesIdx; } skip(posShift + MPSIndex.leadingSize(demuxer.pesTokens[curPesIdx])); int pesLen = MPSIndex.pesLen(demuxer.pesTokens[curPesIdx]); pesBuf = fetch(pesLen); MPSUtils.readPESHeader(pesBuf, 0); } } result.flip(); Packet pkt = Packet.createPacket(result, fpts[curFrame], MPEG_TIMESCALE, fdur[curFrame], curFrame, sync.length == 0 || Arrays.binarySearch(sync, curFrame) >= 0 ? FrameType.KEY : FrameType.INTER, null); curFrame++; return pkt; }
/** * Encodes a frame into a movie. * * @param pic * @throws IOException */ public void encodeNativeFrame(Picture pic) throws IOException { if (pic.getColor() != ColorSpace.RGB) throw new IllegalArgumentException("The input images is expected in RGB color."); ColorSpace sinkColor = sink.getInputColor(); LoanerPicture toEncode; if (sinkColor != null) { toEncode = pixelStore.getPicture(pic.getWidth(), pic.getHeight(), sinkColor); transform.transform(pic, toEncode.getPicture()); } else { toEncode = new LoanerPicture(pic, 0); } Packet pkt = Packet.createPacket(null, timestamp, fps.getNum(), fps.getDen(), frameNo, FrameType.KEY, null); sink.outputVideoFrame(new VideoFrameWithPacket(pkt, toEncode)); if (sinkColor != null) pixelStore.putBack(toEncode); timestamp += fps.getDen(); frameNo++; }