Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bc5a364b authored by Jason Sams's avatar Jason Sams Committed by Android Git Automerger
Browse files

am e65afdb1: Merge "Lighten grain and make live preview gpu friendly." into jb-mr1-dev

* commit 'e65afdb1':
  Lighten grain and make live preview gpu friendly.
parents d60801f7 e65afdb1
Loading
Loading
Loading
Loading
+25 −4
Original line number Diff line number Diff line
@@ -45,19 +45,40 @@ public class Grain extends TestBase {
        mScript.set_gNoiseStrength(s);
    }

    private int findHighBit(int v) {
        int bit = 0;
        while (v > 1) {
            bit++;
            v >>= 1;
        }
        return bit;
    }


    public void createTest(android.content.res.Resources res) {
        int width = mInPixelsAllocation.getType().getX();
        int height = mInPixelsAllocation.getType().getY();

        int noiseW = findHighBit(width);
        int noiseH = findHighBit(height);
        if (noiseW > 9) {
            noiseW = 9;
        }
        if (noiseH > 9) {
            noiseH = 9;
        }
        noiseW = 1 << noiseW;
        noiseH = 1 << noiseH;

        Type.Builder tb = new Type.Builder(mRS, Element.U8(mRS));
        tb.setX(width);
        tb.setY(height);
        tb.setX(noiseW);
        tb.setY(noiseH);
        mNoise = Allocation.createTyped(mRS, tb.create());
        mNoise2 = Allocation.createTyped(mRS, tb.create());

        mScript = new ScriptC_grain(mRS, res, R.raw.grain);
        mScript.set_gWidth(width);
        mScript.set_gHeight(height);
        mScript.set_gWMask(noiseW - 1);
        mScript.set_gHMask(noiseH - 1);
        mScript.set_gNoiseStrength(0.5f);
        mScript.set_gBlendSource(mNoise);
        mScript.set_gNoise(mNoise2);
+7 −7
Original line number Diff line number Diff line
@@ -38,15 +38,15 @@ void genRand(uchar *out) {
 *  1  2  1
 */

int32_t gWidth;
int32_t gHeight;
int32_t gWMask;
int32_t gHMask;

rs_allocation gBlendSource;
void blend9(uchar *out, uint32_t x, uint32_t y) {
    uint32_t x1 = min((int32_t)x+1, (int32_t)(gWidth -1));
    uint32_t x2 = max((int32_t)x-1, (int32_t)0);
    uint32_t y1 = min((int32_t)y+1, (int32_t)(gHeight -1));
    uint32_t y2 = max((int32_t)y-1, (int32_t)0);
    uint32_t x1 = (x-1) & gWMask;
    uint32_t x2 = (x+1) & gWMask;
    uint32_t y1 = (y-1) & gHMask;
    uint32_t y2 = (y+1) & gHMask;

    uint p00 = 56 *  rsGetElementAt_uchar(gBlendSource, x1, y1);
    uint p01 = 114 * rsGetElementAt_uchar(gBlendSource, x, y1);
@@ -78,7 +78,7 @@ float gNoiseStrength;
rs_allocation gNoise;
void root(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) {
    float4 ip = convert_float4(*in);
    float pnoise = (float) rsGetElementAt_uchar(gNoise, x, y);
    float pnoise = (float) rsGetElementAt_uchar(gNoise, x & gWMask, y & gHMask);

    float energy_level = ip.r + ip.g + ip.b;
    float energy_mask = (28.f - sqrt(energy_level)) * 0.03571f;
+1 −2
Original line number Diff line number Diff line
@@ -305,8 +305,7 @@ public class CameraPreviewActivity extends Activity

            long t1 = java.lang.System.currentTimeMillis();

            mFilterYuv.execute(data);
            mFilterYuv.copyOut(mCallbackBitmap);
            mFilterYuv.execute(data, mCallbackBitmap);

            long t2 = java.lang.System.currentTimeMillis();
            mTiming[mTimingSlot++] = t2 - t1;
+7 −22
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ public class RsYuv
    private Allocation mAllocationOut;
    private Allocation mAllocationIn;
    private ScriptC_yuv mScript;
    private ScriptIntrinsicYuvToRGB mYuv;

    RsYuv(RenderScript rs, Resources res, int width, int height) {
        mHeight = height;
@@ -50,6 +51,8 @@ public class RsYuv
        mScript = new ScriptC_yuv(mRS, res, R.raw.yuv);
        mScript.invoke_setSize(mWidth, mHeight);

        mYuv = ScriptIntrinsicYuvToRGB.create(rs, Element.RGBA_8888(mRS));

        Type.Builder tb = new Type.Builder(mRS, Element.RGBA_8888(mRS));
        tb.setX(mWidth);
        tb.setY(mHeight);
@@ -58,34 +61,16 @@ public class RsYuv
        mAllocationIn = Allocation.createSized(rs, Element.U8(mRS), (mHeight * mWidth) +
                                               ((mHeight / 2) * (mWidth / 2) * 2));

        mScript.bind_gYuvIn(mAllocationIn);
        mYuv.setInput(mAllocationIn);
    }

    private long mTiming[] = new long[50];
    private int mTimingSlot = 0;

    void execute(byte[] yuv) {
    void execute(byte[] yuv, Bitmap b) {
        mAllocationIn.copyFrom(yuv);
        mRS.finish();

        long t1 = java.lang.System.currentTimeMillis();
        mScript.forEach_root(mAllocationOut);
        mRS.finish();
        long t2 = java.lang.System.currentTimeMillis();

        mTiming[mTimingSlot++] = t2 - t1;
        if (mTimingSlot >= mTiming.length) {
            float total = 0;
            for (int i=0; i<mTiming.length; i++) {
                total += (float)mTiming[i];
            }
            total /= mTiming.length;
            Log.e("yuv", "core time = " + total);
            mTimingSlot = 0;
        }
    }

    void copyOut(Bitmap b) {
        mYuv.forEach(mAllocationOut);
        mScript.forEach_root(mAllocationOut, mAllocationOut);
        mAllocationOut.copyTo(b);
    }

+3 −9
Original line number Diff line number Diff line
@@ -3,8 +3,6 @@
#pragma rs java_package_name(com.android.rs.livepreview)
#pragma rs_fp_relaxed

uchar *gYuvIn;

static int gWidth;
static int gHeight;
static uchar crossProcess_tableR[256];
@@ -80,13 +78,9 @@ static uchar4 vignette(uchar4 color, uint32_t x, uint32_t y) {
    return convert_uchar4(c);
}

void root(uchar4 *out, uint32_t x, uint32_t y) {
    uchar Y = gYuvIn[(y * gWidth) + x];
    uchar *uv = &gYuvIn[gWidth * gHeight];
    uv += (((x>>1)<<1) + (y>>1) * gWidth);

    uchar4 p = rsYuvToRGBA_uchar4(Y, uv[1], uv[0]);
    p = crossProcess_i(p);
void root(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) {
    uchar4 p;
    p = crossProcess_i(*in);
    p = vignette(p, x, y);

    out->rgba = p;