private void detectFrameType(Packet inVideoPacket) { if (inputVideoCodec.v2 != Codec.H264) { return; } inVideoPacket.setFrameType( H264Utils.isByteBufferIDRSlice(inVideoPacket.getData()) ? FrameType.KEY : FrameType.INTER); }
@Override public void outputVideoFrame(VideoFrameWithPacket videoFrame) throws IOException { if (!outputFormat.isVideo() || outputVideoCodec == null) return; Packet outputVideoPacket; ByteBuffer buffer = bufferStore.get(); int bufferSize = videoEncoder.estimateBufferSize(videoFrame.getFrame().getPicture()); if (buffer == null || bufferSize < buffer.capacity()) { buffer = ByteBuffer.allocate(bufferSize); bufferStore.set(buffer); } buffer.clear(); Picture frame = videoFrame.getFrame().getPicture(); EncodedFrame enc = encodeVideo(frame, buffer); outputVideoPacket = Packet.createPacketWithData(videoFrame.getPacket(), NIOUtils.clone(enc.getData())); outputVideoPacket.setFrameType(enc.isKeyFrame() ? FrameType.KEY : FrameType.INTER); outputVideoPacket(outputVideoPacket, org.jcodec.common.VideoCodecMeta.createSimpleVideoCodecMeta(new Size(frame.getWidth(), frame.getHeight()), frame.getColor())); }
@Override public void addFrame(Packet pkt) throws IOException { if (codec == Codec.H264) { ByteBuffer result = pkt.getData(); if (pkt.frameType == FrameType.UNKNOWN) { pkt.setFrameType(H264Utils.isByteBufferIDRSlice(result) ? FrameType.KEY : FrameType.INTER); } H264Utils.wipePSinplace(result, spsList, ppsList); result = H264Utils.encodeMOVPacket(result); pkt = Packet.createPacketWithData(pkt, result); } else if (codec == Codec.AAC) { ByteBuffer result = pkt.getData(); adtsHeader = ADTSParser.read(result); // System.out.println(String.format("crc_absent: %d, num_aac_frames: %d, size: %d, remaining: %d, %d, %d, %d", // adtsHeader.getCrcAbsent(), adtsHeader.getNumAACFrames(), adtsHeader.getSize(), result.remaining(), // adtsHeader.getObjectType(), adtsHeader.getSamplingIndex(), adtsHeader.getChanConfig())); pkt = Packet.createPacketWithData(pkt, result); } super.addFrame(pkt); }