@Override public void transform(Picture src, Picture dst) { if (src.getColor() != ColorSpace.RGB && src.getColor() != ColorSpace.BGR || dst.getColor() != ColorSpace.RGB && dst.getColor() != ColorSpace.BGR) { throw new IllegalArgumentException( "Expected RGB or BGR inputs, was: " + src.getColor() + ", " + dst.getColor()); } byte[] dataSrc = src.getPlaneData(0); byte[] dataDst = dst.getPlaneData(0); for (int i = 0; i < dataSrc.length; i += 3) { byte tmp = dataSrc[i + 2]; dataDst[i + 2] = dataSrc[i]; dataDst[i] = tmp; dataDst[i + 1] = dataSrc[i + 1]; } } }
public static final void putBlkPic(Picture dest, Picture src, int x, int y) { if (dest.getColor() != src.getColor()) throw new RuntimeException("Incompatible color"); for (int c = 0; c < dest.getColor().nComp; c++) { pubBlkOnePlane(dest.getPlaneData(c), dest.getPlaneWidth(c), src.getPlaneData(c), src.getPlaneWidth(c), src.getPlaneHeight(c), x >> dest.getColor().compWidth[c], y >> dest.getColor().compHeight[c]); } }
/** * Encode this picture into h.264 frame. Frame type will be selected by * encoder. */ public EncodedFrame encodeFrame(Picture pic, ByteBuffer _out) { if (pic.getColor() != ColorSpace.YUV420J) throw new IllegalArgumentException("Input picture color is not supported: " + pic.getColor()); if (frameNumber >= keyInterval) { frameNumber = 0; } SliceType sliceType = frameNumber == 0 ? SliceType.I : SliceType.P; boolean idr = frameNumber == 0; ByteBuffer data = doEncodeFrame(pic, _out, idr, frameNumber++, sliceType); return new EncodedFrame(data, idr); }
@Override public int estimateBufferSize(Picture frame) { int fullPlaneSize = frame.getWidth() * frame.getCroppedHeight(); ColorSpace color = frame.getColor(); int totalSize = 0; for (int i = 0; i < color.nComp; i++) { totalSize += (fullPlaneSize >> color.compWidth[i]) >> color.compHeight[i]; } return totalSize; }
public ByteBuffer encodeFrame(Picture picture) { if (picture.getColor() != ColorSpace.RGB) throw new IllegalArgumentException("Only RGB image can be stored in PPM"); ByteBuffer buffer = ByteBuffer.allocate(picture.getWidth() * picture.getHeight() * 3 + 200); buffer.put(JCodecUtil2.asciiString("P6 " + picture.getWidth() + " " + picture.getHeight() + " 255\n")); byte[][] data = picture.getData(); for (int i = 0; i < picture.getWidth() * picture.getHeight() * 3; i += 3) { buffer.put((byte) (data[0][i + 2] + 128)); buffer.put((byte) (data[0][i + 1] + 128)); buffer.put((byte) (data[0][i] + 128)); } buffer.flip(); return buffer; } }
@Override public LoanerPicture getPicture(int width, int height, ColorSpace color) { for (Picture picture : buffers) { if (picture.getWidth() == width && picture.getHeight() == height && picture.getColor() == color) { buffers.remove(picture); return new LoanerPicture(picture, 1); } } return new LoanerPicture(Picture.create(width, height, color), 1); }
public Frame cropped() { Picture cropped = super.cropped(); return new Frame(cropped.getWidth(), cropped.getHeight(), cropped.getData(), cropped.getColor(), null, frameNo, frameType, mvs, refsUsed, poc); }
public static BufferedImage toBufferedImage(Picture src) { if (src.getColor() != ColorSpace.BGR) { Picture bgr = Picture.createCropped(src.getWidth(), src.getHeight(), ColorSpace.BGR, src.getCrop()); if (src.getColor() == ColorSpace.RGB) { new RgbToBgr().transform(src, bgr); } else { Transform transform = ColorUtil.getTransform(src.getColor(), ColorSpace.RGB); transform.transform(src, bgr); new RgbToBgr().transform(bgr, bgr); } src = bgr; } BufferedImage dst = new BufferedImage(src.getCroppedWidth(), src.getCroppedHeight(), BufferedImage.TYPE_3BYTE_BGR); if (src.getCrop() == null) toBufferedImage(src, dst); else toBufferedImageCropped(src, dst); return dst; }
public void deblockFrame(Picture result) { ColorSpace color = result.getColor(); // for (int i = 0; i < shs.length; i++) // printMB(result.getPlaneData(2), result.getPlaneWidth(2), i, shs[i], // "!--!--!--!--!--!--!--!--!--!--!--!"); // printMB(result.getPlaneData(0), result.getPlaneWidth(0), 0, shs[0], // "!--!--!--!--!--!--!--!--!--!--!--!"); int[][] bsV = new int[4][4], bsH = new int[4][4]; for (int i = 0; i < di.shs.length; i++) { calcBsH(result, i, bsH); calcBsV(result, i, bsV); for (int c = 0; c < color.nComp; c++) { fillVerticalEdge(result, c, i, bsV); fillHorizontalEdge(result, c, i, bsH); // printMB(result.getPlaneData(1), result.getPlaneWidth(1), i, // shs[i], // "!**!**!**!**!--!--!--!--!--!--!--!"); } } // printMB(result.getPlaneData(0), result.getPlaneWidth(0), 235, // shs[235], "!**!**!**!**!--!--!--!--!--!--!--!"); }
public static Frame createFrame(Frame pic) { Picture comp = pic.createCompatible(); return new Frame(comp.getWidth(), comp.getHeight(), comp.getData(), comp.getColor(), pic.getCrop(), pic.frameNo, pic.frameType, pic.mvs, pic.refsUsed, pic.poc); }
public Picture decodeFrame(ByteBuffer data, byte[][] data2) { if (interlace) { Picture r1 = decodeField(data, data2, topFieldFirst ? 0 : 1, 2); Picture r2 = decodeField(data, data2, topFieldFirst ? 1 : 0, 2); return Picture.createPicture(r1.getWidth(), r1.getHeight() << 1, data2, r1.getColor()); } else { return decodeField(data, data2, 0, 1); } }
public static Picture fromBufferedImage(BufferedImage src, ColorSpace tgtColor) { Picture rgb = fromBufferedImageRGB(src); Transform tr = ColorUtil.getTransform(rgb.getColor(), tgtColor); Picture res = Picture.create(rgb.getWidth(), rgb.getHeight(), tgtColor); tr.transform(rgb, res); return res; }
@Override public boolean equals(Object obj) { if (obj == null || !(obj instanceof Picture)) return false; Picture other = (Picture) obj; if (other.getCroppedWidth() != getCroppedWidth() || other.getCroppedHeight() != getCroppedHeight() || other.getColor() != color) return false; for (int i = 0; i < getData().length; i++) if (!planeEquals(other, i)) return false; return true; }
@Override public LoanerPicture filter(Picture picture, PixelStore store) { Size pictureSize = picture.getSize(); if (resampler == null || currentColor != picture.getColor() || !pictureSize.equals(currentSize)) { currentColor = picture.getColor(); currentSize = picture.getSize(); targetSize = new Size(width & currentColor.getWidthMask(), height & currentColor.getHeightMask()); resampler = new LanczosResampler(currentSize, targetSize); } LoanerPicture dest = store.getPicture(targetSize.getWidth(), targetSize.getHeight(), currentColor); resampler.resample(picture, dest.getPicture()); return dest; }
@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())); }
public static void savePictureAsPPM(Picture pic, File file) throws IOException { Transform transform = ColorUtil.getTransform(pic.getColor(), ColorSpace.RGB); Picture rgb = Picture.create(pic.getWidth(), pic.getHeight(), ColorSpace.RGB); transform.transform(pic, rgb); NIOUtils.writeTo(new PPMEncoder().encodeFrame(rgb), file); }
@Override public Picture decodeField(ByteBuffer data, byte[][] data2, int field, int step) { Picture res = super.decodeField(data, data2, field, step); return new Picture(res.getWidth() >> 1, res.getHeight() >> 1, res.getData(), null, res.getColor(), 0, new Rect( 0, 0, res.getCroppedWidth() >> 1, res.getCroppedHeight() >> 1)); } }
@Override public Picture decodeField(ByteBuffer data, byte[][] data2, int field, int step) { Picture res = super.decodeField(data, data2, field, step); return new Picture(res.getWidth() >> 2, res.getHeight() >> 2, res.getData(), null, res.getColor(), 0, new Rect( 0, 0, res.getCroppedWidth() >> 2, res.getCroppedHeight() >> 2)); } }
public static void subImageWithFillPic8(Picture _in, Picture out, Rect rect) { int width = _in.getWidth(); int height = _in.getHeight(); ColorSpace color = _in.getColor(); byte[][] data = _in.getData(); for (int i = 0; i < data.length; i++) { subImageWithFill(data[i], width >> color.compWidth[i], height >> color.compHeight[i], out.getPlaneData(i), rect.getWidth() >> color.compWidth[i], rect.getHeight() >> color.compHeight[i], rect.getX() >> color.compWidth[i], rect.getY() >> color.compHeight[i]); } } }
@Override public LoanerPicture filter(Picture picture, PixelStore store) { if (transform == null) { transform = ColorUtil.getTransform(picture.getColor(), outputColor); Logger.debug("Creating transform: " + transform); } LoanerPicture outFrame = store.getPicture(picture.getWidth(), picture.getHeight(), outputColor); outFrame.getPicture().setCrop(picture.getCrop()); transform.transform(picture, outFrame.getPicture()); return outFrame; }