Skip to content

Commit c2e393f

Browse files
Ruei-sung LinAndroid (Google) Code Review
authored andcommitted
Merge "pseudo random number generator in shader with limited precisions" into jb-dev
2 parents a25079e + a75c7bb commit c2e393f

File tree

6 files changed

+87
-76
lines changed

6 files changed

+87
-76
lines changed

media/mca/filterpacks/java/android/filterpacks/imageproc/BitmapOverlayFilter.java

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ public class BitmapOverlayFilter extends Filter {
4646
private Program mProgram;
4747
private Frame mFrame;
4848

49-
private int mWidth = 0;
50-
private int mHeight = 0;
5149
private int mTarget = FrameFormat.TARGET_UNSPECIFIED;
5250

5351
private final String mOverlayShader =
@@ -113,41 +111,36 @@ public void process(FilterContext context) {
113111
initProgram(context, inputFormat.getTarget());
114112
}
115113

116-
// Check if the frame size has changed
117-
if (inputFormat.getWidth() != mWidth || inputFormat.getHeight() != mHeight) {
118-
mWidth = inputFormat.getWidth();
119-
mHeight = inputFormat.getHeight();
120-
121-
createBitmapFrame(context);
114+
if (mBitmap != null) {
115+
Frame frame = createBitmapFrame(context);
116+
// Process
117+
Frame[] inputs = {input, frame};
118+
mProgram.process(inputs, output);
119+
120+
frame.release();
121+
} else {
122+
output.setDataFromFrame(input);
122123
}
123124

124-
// Process
125-
Frame[] inputs = {input, mFrame};
126-
mProgram.process(inputs, output);
127-
128125
// Push output
129126
pushOutput("image", output);
130127

131128
// Release pushed frame
132129
output.release();
133130
}
134131

135-
private void createBitmapFrame(FilterContext context) {
136-
if (mBitmap != null) {
137-
FrameFormat format = ImageFormat.create(mBitmap.getWidth(),
138-
mBitmap.getHeight(),
139-
ImageFormat.COLORSPACE_RGBA,
140-
FrameFormat.TARGET_GPU);
132+
private Frame createBitmapFrame(FilterContext context) {
133+
FrameFormat format = ImageFormat.create(mBitmap.getWidth(),
134+
mBitmap.getHeight(),
135+
ImageFormat.COLORSPACE_RGBA,
136+
FrameFormat.TARGET_GPU);
141137

142-
if (mFrame != null) {
143-
mFrame.release();
144-
}
138+
Frame frame = context.getFrameManager().newFrame(format);
139+
frame.setBitmap(mBitmap);
145140

146-
mFrame = context.getFrameManager().newFrame(format);
147-
mFrame.setBitmap(mBitmap);
141+
mBitmap.recycle();
142+
mBitmap = null;
148143

149-
mBitmap.recycle();
150-
mBitmap = null;
151-
}
144+
return frame;
152145
}
153146
}

media/mca/filterpacks/java/android/filterpacks/imageproc/BlackWhiteFilter.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import android.filterfw.core.ShaderProgram;
2929
import android.filterfw.format.ImageFormat;
3030

31+
import java.util.Date;
3132
import java.util.Random;
3233

3334
public class BlackWhiteFilter extends Filter {
@@ -42,24 +43,30 @@ public class BlackWhiteFilter extends Filter {
4243
private int mTileSize = 640;
4344

4445
private Program mProgram;
46+
private Random mRandom;
4547

46-
private int mWidth = 0;
47-
private int mHeight = 0;
4848
private int mTarget = FrameFormat.TARGET_UNSPECIFIED;
4949

5050
private final String mBlackWhiteShader =
5151
"precision mediump float;\n" +
5252
"uniform sampler2D tex_sampler_0;\n" +
53+
"uniform vec2 seed;\n" +
5354
"uniform float black;\n" +
5455
"uniform float scale;\n" +
5556
"uniform float stepsize;\n" +
5657
"varying vec2 v_texcoord;\n" +
5758
"float rand(vec2 loc) {\n" +
58-
" return fract(sin(dot(loc, vec2(12.9898, 78.233))) * 43758.5453);\n" +
59+
" const float divide = 0.00048828125;\n" +
60+
" const float factor = 2048.0;\n" +
61+
" float value = sin(dot(loc, vec2(12.9898, 78.233)));\n" +
62+
" float residual = mod(dot(mod(loc, divide), vec2(0.9898, 0.233)), divide);\n" +
63+
" float part2 = mod(value, divide);\n" +
64+
" float part1 = value - part2;\n" +
65+
" return fract(0.5453 * part1 + factor * (part2 + residual));\n" +
5966
"}\n" +
6067
"void main() {\n" +
6168
" vec4 color = texture2D(tex_sampler_0, v_texcoord);\n" +
62-
" float dither = rand(v_texcoord);\n" +
69+
" float dither = rand(v_texcoord + seed);\n" +
6370
" vec3 xform = clamp((color.rgb - black) * scale, 0.0, 1.0);\n" +
6471
" vec3 temp = clamp((color.rgb + stepsize - black) * scale, 0.0, 1.0);\n" +
6572
" vec3 new_color = clamp(xform + (temp - xform) * (dither - 0.5), 0.0, 1.0);\n" +
@@ -68,6 +75,7 @@ public class BlackWhiteFilter extends Filter {
6875

6976
public BlackWhiteFilter(String name) {
7077
super(name);
78+
mRandom = new Random(new Date().getTime());
7179
}
7280

7381
@Override
@@ -100,10 +108,12 @@ public void initProgram(FilterContext context, int target) {
100108
private void updateParameters() {
101109
float scale = (mBlack != mWhite) ? 1.0f / (mWhite - mBlack) : 2000f;
102110
float stepsize = 1.0f / 255.0f;
103-
104111
mProgram.setHostValue("black", mBlack);
105112
mProgram.setHostValue("scale", scale);
106113
mProgram.setHostValue("stepsize", stepsize);
114+
115+
float seed[] = { mRandom.nextFloat(), mRandom.nextFloat() };
116+
mProgram.setHostValue("seed", seed);
107117
}
108118

109119
@Override
@@ -124,12 +134,6 @@ public void process(FilterContext context) {
124134
initProgram(context, inputFormat.getTarget());
125135
}
126136

127-
// Check if the frame size has changed
128-
if (inputFormat.getWidth() != mWidth || inputFormat.getHeight() != mHeight) {
129-
mWidth = inputFormat.getWidth();
130-
mHeight = inputFormat.getHeight();
131-
}
132-
133137
// Create output frame
134138
Frame output = context.getFrameManager().newFrame(inputFormat);
135139

media/mca/filterpacks/java/android/filterpacks/imageproc/DocumentaryFilter.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import android.filterfw.core.ShaderProgram;
2929
import android.filterfw.format.ImageFormat;
3030

31+
import java.util.Date;
3132
import java.util.Random;
3233

3334
public class DocumentaryFilter extends Filter {
@@ -36,6 +37,7 @@ public class DocumentaryFilter extends Filter {
3637
private int mTileSize = 640;
3738

3839
private Program mProgram;
40+
private Random mRandom;
3941

4042
private int mWidth = 0;
4143
private int mHeight = 0;
@@ -44,17 +46,24 @@ public class DocumentaryFilter extends Filter {
4446
private final String mDocumentaryShader =
4547
"precision mediump float;\n" +
4648
"uniform sampler2D tex_sampler_0;\n" +
49+
"uniform vec2 seed;\n" +
4750
"uniform float stepsize;\n" +
4851
"uniform float inv_max_dist;\n" +
4952
"uniform vec2 center;\n" +
5053
"varying vec2 v_texcoord;\n" +
5154
"float rand(vec2 loc) {\n" +
52-
" return fract(sin(dot(loc, vec2(12.9898, 78.233))) * 43758.5453);\n" +
55+
" const float divide = 0.00048828125;\n" +
56+
" const float factor = 2048.0;\n" +
57+
" float value = sin(dot(loc, vec2(12.9898, 78.233)));\n" +
58+
" float residual = mod(dot(mod(loc, divide), vec2(0.9898, 0.233)), divide);\n" +
59+
" float part2 = mod(value, divide);\n" +
60+
" float part1 = value - part2;\n" +
61+
" return fract(0.5453 * part1 + factor * (part2 + residual));\n" +
5362
"}\n" +
5463
"void main() {\n" +
5564
// black white
5665
" vec4 color = texture2D(tex_sampler_0, v_texcoord);\n" +
57-
" float dither = rand(v_texcoord);\n" +
66+
" float dither = rand(v_texcoord + seed);\n" +
5867
" vec3 xform = clamp(2.0 * color.rgb, 0.0, 1.0);\n" +
5968
" vec3 temp = clamp(2.0 * (color.rgb + stepsize), 0.0, 1.0);\n" +
6069
" vec3 new_color = clamp(xform + (temp - xform) * (dither - 0.5), 0.0, 1.0);\n" +
@@ -69,6 +78,8 @@ public class DocumentaryFilter extends Filter {
6978

7079
public DocumentaryFilter(String name) {
7180
super(name);
81+
Date date = new Date();
82+
mRandom = new Random(new Date().getTime());
7283
}
7384

7485
@Override
@@ -138,7 +149,9 @@ private void initParameters() {
138149
mProgram.setHostValue("center", center);
139150
mProgram.setHostValue("inv_max_dist", 1.0f / max_dist);
140151
mProgram.setHostValue("stepsize", 1.0f / 255.0f);
152+
153+
float seed[] = { mRandom.nextFloat(), mRandom.nextFloat() };
154+
mProgram.setHostValue("seed", seed);
141155
}
142156
}
143-
144157
}

media/mca/filterpacks/java/android/filterpacks/imageproc/GrainFilter.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import android.filterfw.geometry.Quad;
3131
import android.filterfw.geometry.Point;
3232

33+
import java.util.Date;
3334
import java.util.Random;
3435

3536
public class GrainFilter extends Filter {
@@ -49,14 +50,20 @@ public class GrainFilter extends Filter {
4950
private int mHeight = 0;
5051
private int mTarget = FrameFormat.TARGET_UNSPECIFIED;
5152

52-
private Random mRandom = new Random();
53+
private Random mRandom;
5354

5455
private final String mNoiseShader =
5556
"precision mediump float;\n" +
5657
"uniform vec2 seed;\n" +
5758
"varying vec2 v_texcoord;\n" +
5859
"float rand(vec2 loc) {\n" +
59-
" return fract(sin(dot(loc, vec2(12.9898, 78.233))) * 43758.5453);\n" +
60+
" const float divide = 0.00048828125;\n" +
61+
" const float factor = 2048.0;\n" +
62+
" float value = sin(dot(loc, vec2(12.9898, 78.233)));\n" +
63+
" float residual = mod(dot(mod(loc, divide), vec2(0.9898, 0.233)), divide);\n" +
64+
" float part2 = mod(value, divide);\n" +
65+
" float part1 = value - part2;\n" +
66+
" return fract(0.5453 * part1 + factor * (part2 + residual));\n" +
6067
"}\n" +
6168
"void main() {\n" +
6269
" gl_FragColor = vec4(rand(v_texcoord + seed), 0.0, 0.0, 1.0);\n" +
@@ -86,6 +93,7 @@ public class GrainFilter extends Filter {
8693

8794
public GrainFilter(String name) {
8895
super(name);
96+
mRandom = new Random(new Date().getTime());
8997
}
9098

9199
@Override

media/mca/filterpacks/java/android/filterpacks/imageproc/LomoishFilter.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,16 @@
2828
import android.filterfw.core.ShaderProgram;
2929
import android.filterfw.format.ImageFormat;
3030

31+
import java.util.Date;
32+
import java.util.Random;
33+
3134
public class LomoishFilter extends Filter {
3235

3336
@GenerateFieldPort(name = "tile_size", hasDefault = true)
3437
private int mTileSize = 640;
3538

3639
private Program mProgram;
40+
private Random mRandom;
3741

3842
private int mWidth = 0;
3943
private int mHeight = 0;
@@ -42,14 +46,21 @@ public class LomoishFilter extends Filter {
4246
private final String mLomoishShader =
4347
"precision mediump float;\n" +
4448
"uniform sampler2D tex_sampler_0;\n" +
49+
"uniform vec2 seed;\n" +
4550
"uniform float stepsizeX;\n" +
4651
"uniform float stepsizeY;\n" +
4752
"uniform float stepsize;\n" +
4853
"uniform vec2 center;\n" +
4954
"uniform float inv_max_dist;\n" +
5055
"varying vec2 v_texcoord;\n" +
5156
"float rand(vec2 loc) {\n" +
52-
" return fract(sin(dot(loc, vec2(12.9898, 78.233))) * 43758.5453);\n" +
57+
" const float divide = 0.00048828125;\n" +
58+
" const float factor = 2048.0;\n" +
59+
" float value = sin(dot(loc, vec2(12.9898, 78.233)));\n" +
60+
" float residual = mod(dot(mod(loc, divide), vec2(0.9898, 0.233)), divide);\n" +
61+
" float part2 = mod(value, divide);\n" +
62+
" float part1 = value - part2;\n" +
63+
" return fract(0.5453 * part1 + factor * (part2 + residual));\n" +
5364
"}\n" +
5465
"void main() {\n" +
5566
// sharpen
@@ -96,7 +107,7 @@ public class LomoishFilter extends Filter {
96107
" }\n" +
97108
" c_color.b = s_color.b * 0.5 + 0.25;\n" +
98109
// blackwhite
99-
" float dither = rand(v_texcoord);\n" +
110+
" float dither = rand(v_texcoord + seed);\n" +
100111
" vec3 xform = clamp((c_color.rgb - 0.15) * 1.53846, 0.0, 1.0);\n" +
101112
" vec3 temp = clamp((color.rgb + stepsize - 0.15) * 1.53846, 0.0, 1.0);\n" +
102113
" vec3 bw_color = clamp(xform + (temp - xform) * (dither - 0.5), 0.0, 1.0);\n" +
@@ -108,6 +119,7 @@ public class LomoishFilter extends Filter {
108119

109120
public LomoishFilter(String name) {
110121
super(name);
122+
mRandom = new Random(new Date().getTime());
111123
}
112124

113125
@Override
@@ -149,6 +161,9 @@ private void initParameters() {
149161
mProgram.setHostValue("stepsize", 1.0f / 255.0f);
150162
mProgram.setHostValue("stepsizeX", 1.0f / mWidth);
151163
mProgram.setHostValue("stepsizeY", 1.0f / mHeight);
164+
165+
float seed[] = { mRandom.nextFloat(), mRandom.nextFloat() };
166+
mProgram.setHostValue("seed", seed);
152167
}
153168
}
154169

media/mca/filterpacks/java/android/filterpacks/imageproc/RedEyeFilter.java

Lines changed: 10 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -114,14 +114,6 @@ public void initProgram(FilterContext context, int target) {
114114
mTarget = target;
115115
}
116116

117-
@Override
118-
public void tearDown(FilterContext context) {
119-
if (mRedEyeBitmap != null) {
120-
mRedEyeBitmap.recycle();
121-
mRedEyeBitmap = null;
122-
}
123-
}
124-
125117
@Override
126118
public void process(FilterContext context) {
127119
// Get input frame
@@ -140,10 +132,7 @@ public void process(FilterContext context) {
140132
if (inputFormat.getWidth() != mWidth || inputFormat.getHeight() != mHeight) {
141133
mWidth = inputFormat.getWidth();
142134
mHeight = inputFormat.getHeight();
143-
144-
createRedEyeBitmap();
145135
}
146-
147136
createRedEyeFrame(context);
148137

149138
// Process
@@ -168,29 +157,26 @@ public void fieldPortValueUpdated(String name, FilterContext context) {
168157
}
169158
}
170159

171-
private void createRedEyeBitmap() {
172-
if (mRedEyeBitmap != null) {
173-
mRedEyeBitmap.recycle();
174-
}
175-
160+
private void createRedEyeFrame(FilterContext context) {
176161
int bitmapWidth = mWidth / 2;
177162
int bitmapHeight = mHeight / 2;
178163

179-
mRedEyeBitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
180-
mCanvas.setBitmap(mRedEyeBitmap);
164+
Bitmap redEyeBitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
165+
mCanvas.setBitmap(redEyeBitmap);
181166
mPaint.setColor(Color.WHITE);
182167
mRadius = Math.max(MIN_RADIUS, RADIUS_RATIO * Math.min(bitmapWidth, bitmapHeight));
183168

184-
updateProgramParams();
185-
}
169+
for (int i = 0; i < mCenters.length; i += 2) {
170+
mCanvas.drawCircle(mCenters[i] * bitmapWidth, mCenters[i + 1] * bitmapHeight,
171+
mRadius, mPaint);
172+
}
186173

187-
private void createRedEyeFrame(FilterContext context) {
188-
FrameFormat format = ImageFormat.create(mRedEyeBitmap.getWidth() ,
189-
mRedEyeBitmap.getHeight(),
174+
FrameFormat format = ImageFormat.create(bitmapWidth, bitmapHeight,
190175
ImageFormat.COLORSPACE_RGBA,
191176
FrameFormat.TARGET_GPU);
192177
mRedEyeFrame = context.getFrameManager().newFrame(format);
193-
mRedEyeFrame.setBitmap(mRedEyeBitmap);
178+
mRedEyeFrame.setBitmap(redEyeBitmap);
179+
redEyeBitmap.recycle();
194180
}
195181

196182
private void updateProgramParams() {
@@ -199,13 +185,5 @@ private void updateProgramParams() {
199185
if ( mCenters.length % 2 == 1) {
200186
throw new RuntimeException("The size of center array must be even.");
201187
}
202-
203-
if (mRedEyeBitmap != null) {
204-
for (int i = 0; i < mCenters.length; i += 2) {
205-
mCanvas.drawCircle(mCenters[i] * mRedEyeBitmap.getWidth(),
206-
mCenters[i + 1] * mRedEyeBitmap.getHeight(),
207-
mRadius, mPaint);
208-
}
209-
}
210188
}
211189
}

0 commit comments

Comments
 (0)