diff options
author | Byunghun Jeon <bjeon@codeaurora.org> | 2015-09-02 10:47:03 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2015-10-13 06:46:48 -0700 |
commit | 8dac365eb932979db5ed64f24d3cda653611c907 (patch) | |
tree | 6e1fb038e43e396d0c1823dff71824efbcba2bc8 | |
parent | 04fc14ffefedadaf13bb14f2f91426a2eb0d45a1 (diff) | |
download | android_packages_apps_Gallery2-8dac365eb932979db5ed64f24d3cda653611c907.tar.gz android_packages_apps_Gallery2-8dac365eb932979db5ed64f24d3cda653611c907.tar.bz2 android_packages_apps_Gallery2-8dac365eb932979db5ed64f24d3cda653611c907.zip |
Gallery2: Use bitmap cache to reduce memory footprint
Use the bitmap cache mechanism to reuse bitmap memory
and reduce memory usage.
CRs-Fixed: 892007
Change-Id: I277906b55c1f62ac0fdf036b001e53935b2d407d
8 files changed, 148 insertions, 170 deletions
diff --git a/res/values/filtershow_strings.xml b/res/values/filtershow_strings.xml index fc75fb9b9..3a7a86354 100644 --- a/res/values/filtershow_strings.xml +++ b/res/values/filtershow_strings.xml @@ -340,5 +340,6 @@ <string name="fusion_pick_point">Pick Segment</string> <string name="fusion_pick_underlay">Pick Underlay</string> + <string name="dualcam_no_segment_toast">No segment found at this point</string> </resources> diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilter.java b/src/com/android/gallery3d/filtershow/filters/ImageFilter.java index 1fcd3008c..1a32e46e0 100644 --- a/src/com/android/gallery3d/filtershow/filters/ImageFilter.java +++ b/src/com/android/gallery3d/filtershow/filters/ImageFilter.java @@ -35,7 +35,7 @@ public abstract class ImageFilter implements Cloneable { // TODO: Temporary, for dogfood note memory issues with toasts for better // feedback. Remove this when filters actually work in low memory // situations. - private static Activity sActivity = null; + protected static Activity sActivity = null; public static void setActivityForMemoryToasts(Activity activity) { sActivity = activity; diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamFusion.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamFusion.java index bc181e33d..1e89f3361 100644 --- a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamFusion.java +++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamFusion.java @@ -37,18 +37,20 @@ import android.graphics.Point; import android.graphics.PorterDuff; import android.graphics.Rect; import android.util.Log; +import android.widget.Toast; +import com.android.gallery3d.R; +import com.android.gallery3d.filtershow.cache.BitmapCache; import com.android.gallery3d.filtershow.imageshow.MasterImage; import com.android.gallery3d.filtershow.pipeline.FilterEnvironment; import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine; public class ImageFilterDualCamFusion extends ImageFilter { private static final String TAG = ImageFilterDualCamFusion.class.getSimpleName(); + private static Toast sSegmentToast; private FilterDualCamFusionRepresentation mParameters; private Paint mPaint = new Paint(); - private Bitmap mFilteredBitmap = null; - private Point mPoint = null; public ImageFilterDualCamFusion() { mName = "Fusion"; @@ -68,14 +70,6 @@ public class ImageFilterDualCamFusion extends ImageFilter { } @Override - public void freeResources() { - if (mFilteredBitmap != null) - mFilteredBitmap.recycle(); - mFilteredBitmap = null; - mPoint = null; - } - - @Override public Bitmap apply(Bitmap bitmap, float scaleFactor, int quality) { if (getParameters() == null) { return bitmap; @@ -84,53 +78,53 @@ public class ImageFilterDualCamFusion extends ImageFilter { Point point = getParameters().getPoint(); if(!point.equals(-1,-1)) { - long startTime = System.currentTimeMillis(); - Log.e(TAG, "dual cam fusion - start processing: " + startTime); - - if(!point.equals(mPoint)) { - mPoint = point; - - if(mFilteredBitmap == null) { - Rect originalBounds = MasterImage.getImage().getOriginalBounds(); - int origW = originalBounds.width(); - int origH = originalBounds.height(); + Bitmap filteredBitmap = null; + Rect originalBounds = MasterImage.getImage().getOriginalBounds(); + int origW = originalBounds.width(); + int origH = originalBounds.height(); + + filteredBitmap = MasterImage.getImage().getBitmapCache().getBitmap(origW, origH, BitmapCache.FILTERS); + filteredBitmap.setHasAlpha(true); + + boolean result = DualCameraNativeEngine.getInstance().getForegroundImg(point.x, point.y, filteredBitmap); + + if(result == false) { + Log.e(TAG, "Imagelib API failed"); + sActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + if(sSegmentToast == null) { + sSegmentToast = Toast.makeText(sActivity, R.string.dualcam_no_segment_toast, Toast.LENGTH_SHORT); + } + sSegmentToast.show(); + } + }); + return bitmap; + } else { - mFilteredBitmap = Bitmap.createBitmap(origW, origH, Bitmap.Config.ARGB_8888); - mFilteredBitmap.setHasAlpha(true); + mPaint.reset(); + if(quality == FilterEnvironment.QUALITY_FINAL) { + mPaint.setAntiAlias(true); + mPaint.setFilterBitmap(true); + mPaint.setDither(true); } + bitmap.setHasAlpha(true); - boolean result = DualCameraNativeEngine.getInstance().getForegroundImg(mPoint.x, mPoint.y, - mFilteredBitmap); + Canvas canvas = new Canvas(bitmap); + int w = bitmap.getWidth(); + int h = bitmap.getHeight(); - if(result == false) { - Log.e(TAG, "Imagelib API failed"); - return bitmap; + canvas.drawColor(0, PorterDuff.Mode.CLEAR); + if(getEnvironment().getImagePreset().getDoApplyGeometry()) { + Matrix originalToScreen = getOriginalToScreenMatrix(w, h); + canvas.drawBitmap(filteredBitmap, originalToScreen, null); + } else { + canvas.drawBitmap(filteredBitmap, null, new Rect(0,0,w,h), null); } - } - mPaint.reset(); - if(quality == FilterEnvironment.QUALITY_FINAL) { - mPaint.setAntiAlias(true); - mPaint.setFilterBitmap(true); - mPaint.setDither(true); + MasterImage.getImage().getBitmapCache().cache(filteredBitmap); } - - bitmap.setHasAlpha(true); - - Canvas canvas = new Canvas(bitmap); - int w = bitmap.getWidth(); - int h = bitmap.getHeight(); - - canvas.drawColor(0, PorterDuff.Mode.CLEAR); - if(getEnvironment().getImagePreset().getDoApplyGeometry()) { - Matrix originalToScreen = getOriginalToScreenMatrix(w, h); - canvas.drawBitmap(mFilteredBitmap, originalToScreen, null); - } else { - canvas.drawBitmap(mFilteredBitmap, null, new Rect(0,0,w,h), null); - } - - Log.e(TAG, "dual cam fusion - finish processing: " + (System.currentTimeMillis()-startTime)); } return bitmap; diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java index b0acb1a70..3f12982a8 100644 --- a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java +++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java @@ -38,20 +38,22 @@ import android.graphics.Paint; import android.graphics.Point; import android.graphics.Rect; import android.util.Log; +import android.widget.Toast; +import com.android.gallery3d.R; +import com.android.gallery3d.filtershow.cache.BitmapCache; import com.android.gallery3d.filtershow.imageshow.MasterImage; import com.android.gallery3d.filtershow.pipeline.FilterEnvironment; import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine; public class ImageFilterDualCamSketch extends ImageFilter { private static final String TAG = ImageFilterDualCamSketch.class.getSimpleName(); + private static Toast sSegmentToast; private FilterDualCamSketchRepresentation mParameters; private Paint mPaint = new Paint(); - private Bitmap mFilteredBitmap = null; private Bitmap mSketchBm = null; private int mSketchResId = 0; - private Point mPoint = null; private Resources mResources = null; public FilterRepresentation getDefaultRepresentation() { @@ -73,15 +75,11 @@ public class ImageFilterDualCamSketch extends ImageFilter { @Override public void freeResources() { - if(mFilteredBitmap != null) - mFilteredBitmap.recycle(); if (mSketchBm != null) mSketchBm.recycle(); - mFilteredBitmap = null; mSketchBm = null; mSketchResId = 0; - mPoint = null; } @Override @@ -106,42 +104,49 @@ public class ImageFilterDualCamSketch extends ImageFilter { return bitmap; } - if(!point.equals(mPoint)) { - mPoint = point; + boolean result = false; + Bitmap filteredBitmap = null; - boolean result = false; + Rect originalBounds = MasterImage.getImage().getOriginalBounds(); + int origW = originalBounds.width(); + int origH = originalBounds.height(); - if(mFilteredBitmap == null) { - Rect originalBounds = MasterImage.getImage().getOriginalBounds(); - int origW = originalBounds.width(); - int origH = originalBounds.height(); + filteredBitmap = MasterImage.getImage().getBitmapCache().getBitmap(origW, origH, BitmapCache.FILTERS); - mFilteredBitmap = Bitmap.createBitmap(origW, origH, Bitmap.Config.ARGB_8888); - } + result = DualCameraNativeEngine.getInstance().applySketch(mSketchBm, point.x, point.y, filteredBitmap); - result = DualCameraNativeEngine.getInstance().applySketch(mSketchBm, mPoint.x, mPoint.y, mFilteredBitmap); + if(result == false) { + Log.e(TAG, "Imagelib API failed"); + sActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + if(sSegmentToast == null) { + sSegmentToast = Toast.makeText(sActivity, R.string.dualcam_no_segment_toast, Toast.LENGTH_SHORT); + } + sSegmentToast.show(); + } + }); + return bitmap; + } else { - if(result == false) { - Log.e(TAG, "Imagelib API failed"); - return bitmap; + if(quality == FilterEnvironment.QUALITY_FINAL) { + mPaint.reset(); + mPaint.setAntiAlias(true); + mPaint.setFilterBitmap(true); + mPaint.setDither(true); } - } - if(quality == FilterEnvironment.QUALITY_FINAL) { - mPaint.reset(); - mPaint.setAntiAlias(true); - mPaint.setFilterBitmap(true); - mPaint.setDither(true); - } + Canvas canvas = new Canvas(bitmap); + int w = bitmap.getWidth(); + int h = bitmap.getHeight(); + if(getEnvironment().getImagePreset().getDoApplyGeometry()) { + Matrix originalToScreen = getOriginalToScreenMatrix(w, h); + canvas.drawBitmap(filteredBitmap, originalToScreen, mPaint); + } else { + canvas.drawBitmap(filteredBitmap, null, new Rect(0,0,w,h), mPaint); + } - Canvas canvas = new Canvas(bitmap); - int w = bitmap.getWidth(); - int h = bitmap.getHeight(); - if(getEnvironment().getImagePreset().getDoApplyGeometry()) { - Matrix originalToScreen = getOriginalToScreenMatrix(w, h); - canvas.drawBitmap(mFilteredBitmap, originalToScreen, mPaint); - } else { - canvas.drawBitmap(mFilteredBitmap, null, new Rect(0,0,w,h), mPaint); + MasterImage.getImage().getBitmapCache().cache(filteredBitmap); } } diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamera.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamera.java index 31e7d0318..2e341708f 100644 --- a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamera.java +++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamera.java @@ -36,20 +36,20 @@ import android.graphics.Paint; import android.graphics.Point; import android.graphics.Rect; import android.util.Log; +import android.widget.Toast; import com.android.gallery3d.R; +import com.android.gallery3d.filtershow.cache.BitmapCache; import com.android.gallery3d.filtershow.imageshow.MasterImage; import com.android.gallery3d.filtershow.pipeline.FilterEnvironment; import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine; public class ImageFilterDualCamera extends ImageFilter { private static final String TAG = ImageFilterDualCamera.class.getSimpleName(); + private static Toast sSegmentToast; private FilterDualCamBasicRepresentation mParameters; private Paint mPaint = new Paint(); - private Bitmap mFilteredBitmap = null; - private Point mPoint = null; - private int mIntensity = -1; public FilterRepresentation getDefaultRepresentation() { return null; @@ -65,16 +65,6 @@ public class ImageFilterDualCamera extends ImageFilter { } @Override - public void freeResources() { - if(mFilteredBitmap != null) - mFilteredBitmap.recycle(); - - mFilteredBitmap = null; - mPoint = null; - mIntensity = -1; - } - - @Override public Bitmap apply(Bitmap bitmap, float scaleFactor, int quality) { if (getParameters() == null) { return bitmap; @@ -82,60 +72,67 @@ public class ImageFilterDualCamera extends ImageFilter { Point point = getParameters().getPoint(); int intensity = getParameters().getValue(); + Bitmap filteredBitmap = null; if(!point.equals(-1,-1)) { - // if parameters change, generate new filtered bitmap - if(!point.equals(mPoint) || mIntensity != intensity) { - mPoint = point; - mIntensity = intensity; - - if(mFilteredBitmap == null) { - Rect originalBounds = MasterImage.getImage().getOriginalBounds(); - int origW = originalBounds.width(); - int origH = originalBounds.height(); + Rect originalBounds = MasterImage.getImage().getOriginalBounds(); + int origW = originalBounds.width(); + int origH = originalBounds.height(); + + filteredBitmap = MasterImage.getImage().getBitmapCache().getBitmap(origW, origH, BitmapCache.FILTERS); + + boolean result = false; + + switch(mParameters.getTextId()) { + case R.string.focus: + result = DualCameraNativeEngine.getInstance().applyFocus(point.x, point.y, intensity, + filteredBitmap); + break; + case R.string.halo: + result = DualCameraNativeEngine.getInstance().applyHalo(point.x, point.y, intensity, + filteredBitmap); + break; + case R.string.blur: + result = DualCameraNativeEngine.getInstance().applyBokeh(point.x, point.y, intensity, + filteredBitmap); + break; + } - mFilteredBitmap = Bitmap.createBitmap(origW, origH, Bitmap.Config.ARGB_8888); - } + if(result == false) { + Log.e(TAG, "Imagelib API failed"); + sActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + if(sSegmentToast == null) { + sSegmentToast = Toast.makeText(sActivity, R.string.dualcam_no_segment_toast, Toast.LENGTH_SHORT); + } + sSegmentToast.show(); + } + }); + + return bitmap; + } else { - boolean result = false; - - switch(mParameters.getTextId()) { - case R.string.focus: - result = DualCameraNativeEngine.getInstance().applyFocus(mPoint.x, mPoint.y, mIntensity, - mFilteredBitmap); - break; - case R.string.halo: - result = DualCameraNativeEngine.getInstance().applyHalo(mPoint.x, mPoint.y, mIntensity, - mFilteredBitmap); - break; - case R.string.blur: - result = DualCameraNativeEngine.getInstance().applyBokeh(mPoint.x, mPoint.y, mIntensity, - mFilteredBitmap); - break; + if(quality == FilterEnvironment.QUALITY_FINAL) { + mPaint.reset(); + mPaint.setAntiAlias(true); + mPaint.setFilterBitmap(true); + mPaint.setDither(true); } - if(result == false) { - Log.e(TAG, "Imagelib API failed"); - return bitmap; + Canvas canvas = new Canvas(bitmap); + int w = bitmap.getWidth(); + int h = bitmap.getHeight(); + if(getEnvironment().getImagePreset().getDoApplyGeometry()) { + Matrix originalToScreen = getOriginalToScreenMatrix(w, h); + canvas.drawBitmap(filteredBitmap, originalToScreen, mPaint); + } else { + canvas.drawBitmap(filteredBitmap, null, new Rect(0,0,w,h), mPaint); } - } - if(quality == FilterEnvironment.QUALITY_FINAL) { - mPaint.reset(); - mPaint.setAntiAlias(true); - mPaint.setFilterBitmap(true); - mPaint.setDither(true); - } + MasterImage.getImage().getBitmapCache().cache(filteredBitmap); - Canvas canvas = new Canvas(bitmap); - int w = bitmap.getWidth(); - int h = bitmap.getHeight(); - if(getEnvironment().getImagePreset().getDoApplyGeometry()) { - Matrix originalToScreen = getOriginalToScreenMatrix(w, h); - canvas.drawBitmap(mFilteredBitmap, originalToScreen, mPaint); - } else { - canvas.drawBitmap(mFilteredBitmap, null, new Rect(0,0,w,h), mPaint); } } diff --git a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java index 2ef0b8362..ae6621406 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java +++ b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java @@ -876,17 +876,6 @@ public class MasterImage implements RenderingRequestCaller { return false; } - int primaryWidth = primaryBm.getWidth(); - int primaryHeight = primaryBm.getHeight(); - int primaryStride = primaryBm.getRowBytes(); - - Log.v(LOGTAG, "primary info: " + primaryWidth + "x" + primaryHeight + ", s:" + primaryStride); - - ByteBuffer primaryMpoBuffer = ByteBuffer.allocateDirect(primaryBm.getByteCount()); - primaryBm.copyPixelsToBuffer(primaryMpoBuffer); - primaryBm.recycle(); - primaryBm = null; - // check for pre-generated dm file String mpoFilepath = ImageLoader.getLocalPathFromUri(getActivity(), getUri()); String depthFilepath = MpoParser.getDepthmapFilepath(mpoFilepath); @@ -905,25 +894,20 @@ public class MasterImage implements RenderingRequestCaller { auxiliaryMpoData = null; if(auxiliaryBm == null) { + primaryBm.recycle(); + primaryBm = null; return false; } - int auxiliaryWidth = auxiliaryBm.getWidth(); - int auxiliaryHeight = auxiliaryBm.getHeight(); - int auxiliaryStride = auxiliaryBm.getRowBytes(); - - Log.v(LOGTAG, "auxiliary info: " + auxiliaryWidth + "x" + auxiliaryHeight + ", s:" + auxiliaryStride); + DualCameraNativeEngine.getInstance().initDepthMap( + primaryBm, auxiliaryBm, mpoFilepath, + DualCameraNativeEngine.getInstance().getCalibFilepath(mActivity)); - ByteBuffer auxiliaryMpoBuffer = ByteBuffer.allocateDirect(auxiliaryBm.getByteCount()); - auxiliaryBm.copyPixelsToBuffer(auxiliaryMpoBuffer); + primaryBm.recycle(); + primaryBm = null; auxiliaryBm.recycle(); auxiliaryBm = null; - DualCameraNativeEngine.getInstance().initDepthMap( - primaryMpoBuffer, primaryWidth, primaryHeight, primaryStride, - auxiliaryMpoBuffer, auxiliaryWidth, auxiliaryHeight, auxiliaryStride, - mpoFilepath, DualCameraNativeEngine.getInstance().getCalibFilepath(mActivity)); - Point size = new Point(); boolean result = DualCameraNativeEngine.getInstance().getDepthMapSize(size); if(result) { diff --git a/src/com/android/gallery3d/filtershow/pipeline/CacheProcessing.java b/src/com/android/gallery3d/filtershow/pipeline/CacheProcessing.java index f57383a8c..c2912ed78 100644 --- a/src/com/android/gallery3d/filtershow/pipeline/CacheProcessing.java +++ b/src/com/android/gallery3d/filtershow/pipeline/CacheProcessing.java @@ -28,7 +28,7 @@ import java.util.Vector; public class CacheProcessing { private static final String LOGTAG = "CacheProcessing"; - private static final boolean DEBUG = true; + private static final boolean DEBUG = false; private static final boolean NO_CACHING = false; private Vector<CacheStep> mSteps = new Vector<CacheStep>(); diff --git a/src/com/android/gallery3d/filtershow/tools/DualCameraNativeEngine.java b/src/com/android/gallery3d/filtershow/tools/DualCameraNativeEngine.java index 60b4d67e9..7764ececb 100644 --- a/src/com/android/gallery3d/filtershow/tools/DualCameraNativeEngine.java +++ b/src/com/android/gallery3d/filtershow/tools/DualCameraNativeEngine.java @@ -78,12 +78,9 @@ public class DualCameraNativeEngine { return calibFile.getAbsolutePath(); } - native public void initDepthMap(ByteBuffer primaryRGBA, int primaryWidth, int primaryHeight, int primaryStride, - ByteBuffer auxiliaryRGBA, int auxiliaryWidth, int auxiliaryHeight, int auxiliaryStride, - String mpoFilepath, String calibFilepath); + native public boolean initDepthMap(Bitmap primaryRGBA, Bitmap auxiliaryRGBA, String mpoFilepath, String calibFilepath); - native public void loadDepthMap(ByteBuffer primaryRGBA, int primaryWidth, int primaryHeight, int primaryStride, - ByteBuffer depthMap, int depthMapWidth, int depthMapHeight, int depthMapStride); + native public boolean loadDepthMap(Bitmap primaryRGBA, Bitmap depthMap); native public void releaseDepthMap(); |