public int process(Buffer in, Buffer out) { out.setMetaTo(in); if (in.isFlag(DISCARD)) { return CODEC_OK; } out.format = outputFormat; SeekableByteArrayOutputStream tmp; if (out.data instanceof byte[]) { tmp = new SeekableByteArrayOutputStream((byte[]) out.data); } else { tmp = new SeekableByteArrayOutputStream(); } Format vf = outputFormat; // Handle sub-image Rectangle r; int scanlineStride; if (in.data instanceof BufferedImage) { BufferedImage image = (BufferedImage) in.data; WritableRaster raster = image.getRaster(); scanlineStride = raster.getSampleModel().getWidth(); r = raster.getBounds(); r.x -= raster.getSampleModelTranslateX(); r.y -= raster.getSampleModelTranslateY(); } else { r = new Rectangle(0, 0, vf.get(WidthKey), vf.get(HeightKey)); scanlineStride = vf.get(WidthKey); } try { switch (vf.get(DepthKey)) { case 8: { writeKey8( tmp, getIndexed8(in), r.width, r.height, r.x + r.y * scanlineStride, scanlineStride); break; } case 16: { writeKey16( tmp, getRGB15(in), r.width, r.height, r.x + r.y * scanlineStride, scanlineStride); break; } case 24: { writeKey24( tmp, getRGB24(in), r.width, r.height, r.x + r.y * scanlineStride, scanlineStride); break; } case 32: { writeKey24( tmp, getARGB32(in), r.width, r.height, r.x + r.y * scanlineStride, scanlineStride); break; } default: { out.setFlag(DISCARD); return CODEC_FAILED; } } out.format = outputFormat; out.sampleCount = 1; out.setFlag(KEYFRAME); out.data = tmp.getBuffer(); out.offset = 0; out.length = (int) tmp.getStreamPosition(); return CODEC_OK; } catch (IOException ex) { ex.printStackTrace(); out.setFlag(DISCARD); return CODEC_FAILED; } }