From 262a009cbd3e4eab125246cf70f110ad3cd6c75e Mon Sep 17 00:00:00 2001 From: Wei Hua Date: Thu, 21 Jul 2011 10:19:20 -0700 Subject: [PATCH] Move the format checking into process. prepare() may not have the complete format. Change-Id: I2245675df030564e1c652c934cbcdc16c0fc96f2 --- mca/filterpacks/imageproc/java/CropFilter.java | 11 ++++++++--- mca/filterpacks/imageproc/java/ResizeFilter.java | 10 +++++++--- mca/filterpacks/imageproc/java/ToRGBAFilter.java | 9 ++++++--- mca/filterpacks/imageproc/java/ToRGBFilter.java | 9 ++++++--- 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/mca/filterpacks/imageproc/java/CropFilter.java b/mca/filterpacks/imageproc/java/CropFilter.java index 506fd90c..aff315bc 100644 --- a/mca/filterpacks/imageproc/java/CropFilter.java +++ b/mca/filterpacks/imageproc/java/CropFilter.java @@ -41,6 +41,7 @@ import android.util.Log; public class CropFilter extends Filter { private Program mProgram; + private FrameFormat mLastFormat = null; @GenerateFieldPort(name = "owidth") private int mOutputWidth = -1; @@ -68,10 +69,12 @@ public class CropFilter extends Filter { return outputFormat; } - @Override - public void prepare(FilterContext context) { + protected void createProgram(FilterContext context, FrameFormat format) { // TODO: Add CPU version - switch (getInputFormat("image").getTarget()) { + if (mLastFormat != null && mLastFormat.getTarget() == format.getTarget()) return; + mLastFormat = format; + mProgram = null; + switch (format.getTarget()) { case FrameFormat.TARGET_GPU: mProgram = ShaderProgram.createIdentity(context); break; @@ -87,6 +90,8 @@ public class CropFilter extends Filter { Frame imageFrame = pullInput("image"); Frame boxFrame = pullInput("box"); + createProgram(env, imageFrame.getFormat()); + // Get the box Quad box = (Quad)boxFrame.getObjectValue(); diff --git a/mca/filterpacks/imageproc/java/ResizeFilter.java b/mca/filterpacks/imageproc/java/ResizeFilter.java index e8f195ce..411e061d 100644 --- a/mca/filterpacks/imageproc/java/ResizeFilter.java +++ b/mca/filterpacks/imageproc/java/ResizeFilter.java @@ -48,6 +48,8 @@ public class ResizeFilter extends Filter { private boolean mGenerateMipMap = false; private Program mProgram; + private FrameFormat mLastFormat = null; + private MutableFrameFormat mOutputFormat; private int mInputChannels; @@ -66,9 +68,10 @@ public class ResizeFilter extends Filter { return inputFormat; } - @Override - protected void prepare(FilterContext context) { - switch (getInputFormat("image").getTarget()) { + protected void createProgram(FilterContext context, FrameFormat format) { + if (mLastFormat != null && mLastFormat.getTarget() == format.getTarget()) return; + mLastFormat = format; + switch (format.getTarget()) { case FrameFormat.TARGET_NATIVE: throw new RuntimeException("Native ResizeFilter not implemented yet!"); @@ -86,6 +89,7 @@ public class ResizeFilter extends Filter { public void process(FilterContext env) { // Get input frame Frame input = pullInput("image"); + createProgram(env, input.getFormat()); // Create output frame MutableFrameFormat outputFormat = input.getFormat().mutableCopy(); diff --git a/mca/filterpacks/imageproc/java/ToRGBAFilter.java b/mca/filterpacks/imageproc/java/ToRGBAFilter.java index 8e1b1a27..ab4814fd 100644 --- a/mca/filterpacks/imageproc/java/ToRGBAFilter.java +++ b/mca/filterpacks/imageproc/java/ToRGBAFilter.java @@ -38,6 +38,7 @@ public class ToRGBAFilter extends Filter { private int mInputBPP; private Program mProgram; + private FrameFormat mLastFormat = null; public ToRGBAFilter(String name) { super(name); @@ -64,9 +65,10 @@ public class ToRGBAFilter extends Filter { return result; } - @Override - public void prepare(FilterContext context) { - mInputBPP = getInputFormat("image").getBytesPerSample(); + public void createProgram(FilterContext context, FrameFormat format) { + mInputBPP = format.getBytesPerSample(); + if (mLastFormat != null && mLastFormat.getBytesPerSample() == mInputBPP) return; + mLastFormat = format; switch (mInputBPP) { case 1: mProgram = new NativeProgram("filterpack_imageproc", "gray_to_rgba"); @@ -83,6 +85,7 @@ public class ToRGBAFilter extends Filter { public void process(FilterContext context) { // Get input frame Frame input = pullInput("image"); + createProgram(context, input.getFormat()); // Create output frame Frame output = context.getFrameManager().newFrame(getConvertedFormat(input.getFormat())); diff --git a/mca/filterpacks/imageproc/java/ToRGBFilter.java b/mca/filterpacks/imageproc/java/ToRGBFilter.java index 82ca2d93..9258502e 100644 --- a/mca/filterpacks/imageproc/java/ToRGBFilter.java +++ b/mca/filterpacks/imageproc/java/ToRGBFilter.java @@ -38,6 +38,7 @@ public class ToRGBFilter extends Filter { private int mInputBPP; private Program mProgram; + private FrameFormat mLastFormat = null; public ToRGBFilter(String name) { super(name); @@ -64,9 +65,10 @@ public class ToRGBFilter extends Filter { return result; } - @Override - public void prepare(FilterContext context) { - mInputBPP = getInputFormat("image").getBytesPerSample(); + public void createProgram(FilterContext context, FrameFormat format) { + mInputBPP = format.getBytesPerSample(); + if (mLastFormat != null && mLastFormat.getBytesPerSample() == mInputBPP) return; + mLastFormat = format; switch (mInputBPP) { case 1: mProgram = new NativeProgram("filterpack_imageproc", "gray_to_rgb"); @@ -83,6 +85,7 @@ public class ToRGBFilter extends Filter { public void process(FilterContext context) { // Get input frame Frame input = pullInput("image"); + createProgram(context, input.getFormat()); // Create output frame Frame output = context.getFrameManager().newFrame(getConvertedFormat(input.getFormat())); -- 2.11.0