OSDN Git Service

Move the format checking into process.
authorWei Hua <whua@google.com>
Thu, 21 Jul 2011 17:19:20 +0000 (10:19 -0700)
committerWei Hua <whua@google.com>
Thu, 21 Jul 2011 17:19:20 +0000 (10:19 -0700)
prepare() may not have the complete format.

Change-Id: I2245675df030564e1c652c934cbcdc16c0fc96f2

mca/filterpacks/imageproc/java/CropFilter.java
mca/filterpacks/imageproc/java/ResizeFilter.java
mca/filterpacks/imageproc/java/ToRGBAFilter.java
mca/filterpacks/imageproc/java/ToRGBFilter.java

index 506fd90..aff315b 100644 (file)
@@ -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();
 
index e8f195c..411e061 100644 (file)
@@ -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();
index 8e1b1a2..ab4814f 100644 (file)
@@ -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()));
index 82ca2d9..9258502 100644 (file)
@@ -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()));