FileDocCategorySizeDatePackage
FisheyeFilter.javaAPI DocAndroid 5.1 API5636Thu Mar 12 22:22:30 GMT 2015android.filterpacks.imageproc

FisheyeFilter

public class FisheyeFilter extends android.filterfw.core.Filter
hide

Fields Summary
private static final String
TAG
private float
mScale
private int
mTileSize
private android.filterfw.core.Program
mProgram
private int
mWidth
private int
mHeight
private int
mTarget
private static final String
mFisheyeShader
Constructors Summary
public FisheyeFilter(String name)


       
        super(name);
    
Methods Summary
public voidfieldPortValueUpdated(java.lang.String name, android.filterfw.core.FilterContext context)

        if (mProgram != null) {
            updateProgramParams();
        }
    
public android.filterfw.core.FrameFormatgetOutputFormat(java.lang.String portName, android.filterfw.core.FrameFormat inputFormat)

        return inputFormat;
    
public voidinitProgram(android.filterfw.core.FilterContext context, int target)

        switch (target) {
            case FrameFormat.TARGET_GPU:
                ShaderProgram shaderProgram = new ShaderProgram(context, mFisheyeShader);
                shaderProgram.setMaximumTileSize(mTileSize);
                mProgram = shaderProgram;
                break;

            default:
                throw new RuntimeException("Filter FisheyeFilter does not support frames of " +
                    "target " + target + "!");
        }
        mTarget = target;
    
public voidprocess(android.filterfw.core.FilterContext context)

        // Get input frame
        Frame input = pullInput("image");
        FrameFormat inputFormat = input.getFormat();

        // Create output frame
        Frame output = context.getFrameManager().newFrame(inputFormat);

        // Create program if not created already
        if (mProgram == null || inputFormat.getTarget() != mTarget) {
            initProgram(context, inputFormat.getTarget());
        }

        // Check if the frame size has changed
        if (inputFormat.getWidth() != mWidth || inputFormat.getHeight() != mHeight) {
            updateFrameSize(inputFormat.getWidth(), inputFormat.getHeight());
        }

        // Process
        mProgram.process(input, output);

        // Push output
        pushOutput("image", output);

        // Release pushed frame
        output.release();
    
public voidsetupPorts()

        addMaskedInputPort("image", ImageFormat.create(ImageFormat.COLORSPACE_RGBA));
        addOutputBasedOnInput("image", "image");
    
private voidupdateFrameSize(int width, int height)

        mWidth = width;
        mHeight = height;

        updateProgramParams();
    
private voidupdateProgramParams()

        final float pi = 3.14159265f;
        float scale[] = new float[2];
        if (mWidth > mHeight) {
          scale[0] = 1f;
          scale[1] = ((float) mHeight) / mWidth;
        } else {
          scale[0] = ((float) mWidth) / mHeight;
          scale[1] = 1f;
        }
        float alpha = mScale * 2.0f + 0.75f;
        float bound2 = 0.25f * (scale[0] * scale[0] + scale[1] * scale[1]);
        float bound = (float) Math.sqrt(bound2);
        float radius = 1.15f * bound;
        float radius2 = radius * radius;
        float max_radian = 0.5f * pi -
            (float) Math.atan(alpha / bound * (float) Math.sqrt(radius2 - bound2));
        float factor = bound / max_radian;

        mProgram.setHostValue("scale", scale);
        mProgram.setHostValue("radius2",radius2);
        mProgram.setHostValue("factor", factor);
        mProgram.setHostValue("alpha", alpha);