Merge "Fix issue 3408285 Crash while generating KenBurns" into honeycomb
diff --git a/build/phone-hdpi-512-dalvik-heap.mk b/build/phone-hdpi-512-dalvik-heap.mk
index 630cf03..788b686 100644
--- a/build/phone-hdpi-512-dalvik-heap.mk
+++ b/build/phone-hdpi-512-dalvik-heap.mk
@@ -19,5 +19,5 @@
 
 PRODUCT_PROPERTY_OVERRIDES += \
     dalvik.vm.heapstartsize=5m \
-    dalvik.vm.growthlimit=32m \
+    dalvik.vm.heapgrowthlimit=32m \
     dalvik.vm.heapsize=128m
diff --git a/build/tablet-dalvik-heap.mk b/build/tablet-dalvik-heap.mk
index 37c3ec5..826a380 100644
--- a/build/tablet-dalvik-heap.mk
+++ b/build/tablet-dalvik-heap.mk
@@ -18,5 +18,5 @@
 
 PRODUCT_PROPERTY_OVERRIDES += \
     dalvik.vm.heapstartsize=5m \
-    dalvik.vm.growthlimit=48m \
+    dalvik.vm.heapgrowthlimit=48m \
     dalvik.vm.heapsize=256m
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index d3913dc..393412f 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -73,7 +73,6 @@
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.List;
 import java.util.WeakHashMap;
 
 /**
@@ -2375,6 +2374,7 @@
     })
     int mLayerType = LAYER_TYPE_NONE;
     Paint mLayerPaint;
+    Rect mLocalDirtyRect;
 
     /**
      * Simple constructor to use when creating a view from code.
@@ -8173,7 +8173,9 @@
         }
 
         mLayerType = layerType;
-        mLayerPaint = mLayerType == LAYER_TYPE_NONE ? null : (paint == null ? new Paint() : paint);
+        final boolean layerDisabled = mLayerType == LAYER_TYPE_NONE;
+        mLayerPaint = layerDisabled ? null : (paint == null ? new Paint() : paint);
+        mLocalDirtyRect = layerDisabled ? null : new Rect();
 
         invalidateParentCaches();
         invalidate(true);
@@ -8228,8 +8230,7 @@
             mAttachInfo.mHardwareCanvas = canvas;
             try {
                 canvas.setViewport(width, height);
-                // TODO: We should pass the dirty rect
-                canvas.onPreDraw(null);
+                canvas.onPreDraw(mLocalDirtyRect);
 
                 final int restoreCount = canvas.save();
 
@@ -8251,6 +8252,7 @@
                 canvas.onPostDraw();
                 mHardwareLayer.end(currentCanvas);
                 mAttachInfo.mHardwareCanvas = currentCanvas;
+                mLocalDirtyRect.setEmpty();
             }
         }
 
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index edfef769..09e1d89 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -3487,16 +3487,19 @@
                 if (child.mLayerType != LAYER_TYPE_NONE) {
                     mPrivateFlags |= INVALIDATED;
                     mPrivateFlags &= ~DRAWING_CACHE_VALID;
+                    child.mLocalDirtyRect.setEmpty();
                 }
                 do {
                     View view = null;
                     if (parent instanceof View) {
                         view = (View) parent;
-                        if (view.mLayerType != LAYER_TYPE_NONE &&
-                                view.getParent() instanceof View) {
-                            final View grandParent = (View) view.getParent();
-                            grandParent.mPrivateFlags |= INVALIDATED;
-                            grandParent.mPrivateFlags &= ~DRAWING_CACHE_VALID;
+                        if (view.mLayerType != LAYER_TYPE_NONE) {
+                            view.mLocalDirtyRect.setEmpty();
+                            if (view.getParent() instanceof View) {
+                                final View grandParent = (View) view.getParent();
+                                grandParent.mPrivateFlags |= INVALIDATED;
+                                grandParent.mPrivateFlags &= ~DRAWING_CACHE_VALID;
+                            }
                         }
                         if ((view.mPrivateFlags & DIRTY_MASK) != 0) {
                             // already marked dirty - we're done
@@ -3534,6 +3537,12 @@
                 // Make sure we do not set both flags at the same time
                 int opaqueFlag = isOpaque ? DIRTY_OPAQUE : DIRTY;
 
+                if (child.mLayerType != LAYER_TYPE_NONE) {
+                    mPrivateFlags |= INVALIDATED;
+                    mPrivateFlags &= ~DRAWING_CACHE_VALID;
+                    child.mLocalDirtyRect.union(dirty);
+                }
+
                 final int[] location = attachInfo.mInvalidateChildLocation;
                 location[CHILD_LEFT_INDEX] = child.mLeft;
                 location[CHILD_TOP_INDEX] = child.mTop;
@@ -3547,10 +3556,6 @@
                             (int) (boundingRect.bottom + 0.5f));
                 }
 
-                if (child.mLayerType != LAYER_TYPE_NONE) {
-                    mPrivateFlags |= INVALIDATED;
-                    mPrivateFlags &= ~DRAWING_CACHE_VALID;
-                }                
                 do {
                     View view = null;
                     if (parent instanceof View) {
@@ -3631,6 +3636,10 @@
                     location[CHILD_LEFT_INDEX] = left;
                     location[CHILD_TOP_INDEX] = top;
 
+                    if (mLayerType != LAYER_TYPE_NONE) {
+                        mLocalDirtyRect.union(dirty);
+                    }
+
                     return mParent;
                 }
             } else {
@@ -3639,8 +3648,11 @@
                 location[CHILD_LEFT_INDEX] = mLeft;
                 location[CHILD_TOP_INDEX] = mTop;
 
-                dirty.set(0, 0, mRight - location[CHILD_LEFT_INDEX],
-                        mBottom - location[CHILD_TOP_INDEX]);
+                dirty.set(0, 0, mRight - mLeft, mBottom - mTop);
+
+                if (mLayerType != LAYER_TYPE_NONE) {
+                    mLocalDirtyRect.union(dirty);
+                }
 
                 return mParent;
             }
diff --git a/core/res/res/drawable-hdpi/ic_emergency.png b/core/res/res/drawable-hdpi/ic_emergency.png
index b4465ff..89c05e3 100644
--- a/core/res/res/drawable-hdpi/ic_emergency.png
+++ b/core/res/res/drawable-hdpi/ic_emergency.png
Binary files differ
diff --git a/data/sounds/alarms/ogg/Cesium.ogg b/data/sounds/alarms/ogg/Cesium.ogg
index 76eca08..a8c379a 100644
--- a/data/sounds/alarms/ogg/Cesium.ogg
+++ b/data/sounds/alarms/ogg/Cesium.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/LowBattery.ogg b/data/sounds/effects/ogg/LowBattery.ogg
index c21218c..dfb5d88 100644
--- a/data/sounds/effects/ogg/LowBattery.ogg
+++ b/data/sounds/effects/ogg/LowBattery.ogg
Binary files differ
diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp
index 691f649..7379b63 100644
--- a/libs/hwui/LayerRenderer.cpp
+++ b/libs/hwui/LayerRenderer.cpp
@@ -16,8 +16,11 @@
 
 #define LOG_TAG "OpenGLRenderer"
 
+#include <ui/Rect.h>
+
 #include "LayerRenderer.h"
 #include "Properties.h"
+#include "Rect.h"
 
 namespace android {
 namespace uirenderer {
@@ -30,12 +33,25 @@
     LAYER_RENDERER_LOGD("Rendering into layer, fbo = %d", mLayer->fbo);
 
 #if RENDER_LAYERS_AS_REGIONS
-    mLayer->region.clear();
+    Rect dirty(left, top, right, bottom);
+    if (dirty.isEmpty() || (dirty.left <= 0 && dirty.top <= 0 &&
+            dirty.right >= mLayer->width && dirty.bottom >= mLayer->height)) {
+        mLayer->region.clear();
+        dirty.set(0.0f, 0.0f, mLayer->width, mLayer->height);
+    } else {
+        dirty.intersect(0.0f, 0.0f, mLayer->width, mLayer->height);
+        android::Rect r(dirty.left, dirty.top, dirty.right, dirty.bottom);
+        mLayer->region.subtractSelf(r);
+    }
 #endif
 
     glBindFramebuffer(GL_FRAMEBUFFER, mLayer->fbo);
 
+#if RENDER_LAYERS_AS_REGIONS
+    OpenGLRenderer::prepareDirty(dirty.left, dirty.top, dirty.right, dirty.bottom, opaque);
+#else
     OpenGLRenderer::prepareDirty(0.0f, 0.0f, mLayer->width, mLayer->height, opaque);
+#endif
 }
 
 void LayerRenderer::finish() {
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 2960395..90d6ea1 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -671,25 +671,7 @@
         finishDrawTexture();
 
 #if DEBUG_LAYERS_AS_REGIONS
-        uint32_t colors[] = {
-                0x7fff0000, 0x7f00ff00,
-                0x7f0000ff, 0x7fff00ff,
-        };
-
-        int offset = 0;
-        int32_t top = rects[0].top;
-        int i = 0;
-
-        for (size_t i = 0; i < count; i++) {
-            if (top != rects[i].top) {
-                offset ^= 0x2;
-                top = rects[i].top;
-            }
-
-            Rect r(rects[i].left, rects[i].top, rects[i].right, rects[i].bottom);
-            drawColorRect(r.left, r.top, r.right, r.bottom, colors[offset + (i & 0x1)],
-                    SkXfermode::kSrcOver_Mode);
-        }
+        drawRegionRects(layer->region);
 #endif
 
         layer->region.clear();
@@ -699,6 +681,32 @@
 #endif
 }
 
+void OpenGLRenderer::drawRegionRects(const Region& region) {
+#if DEBUG_LAYERS_AS_REGIONS
+    size_t count;
+    const android::Rect* rects = region.getArray(&count);
+
+    uint32_t colors[] = {
+            0x7fff0000, 0x7f00ff00,
+            0x7f0000ff, 0x7fff00ff,
+    };
+
+    int offset = 0;
+    int32_t top = rects[0].top;
+
+    for (size_t i = 0; i < count; i++) {
+        if (top != rects[i].top) {
+            offset ^= 0x2;
+            top = rects[i].top;
+        }
+
+        Rect r(rects[i].left, rects[i].top, rects[i].right, rects[i].bottom);
+        drawColorRect(r.left, r.top, r.right, r.bottom, colors[offset + (i & 0x1)],
+                SkXfermode::kSrcOver_Mode);
+    }
+#endif
+}
+
 void OpenGLRenderer::dirtyLayer(const float left, const float top,
         const float right, const float bottom, const mat4 transform) {
 #if RENDER_LAYERS_AS_REGIONS
@@ -1626,6 +1634,10 @@
                     GL_UNSIGNED_SHORT, layer->meshIndices);
 
             finishDrawTexture();
+
+#if DEBUG_LAYERS_AS_REGIONS
+            drawRegionRects(layer->region);
+#endif
         }
     }
 #else
diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h
index 64def03..7bbf034 100644
--- a/libs/hwui/OpenGLRenderer.h
+++ b/libs/hwui/OpenGLRenderer.h
@@ -455,6 +455,8 @@
     void setupDrawMesh(GLvoid* vertices, GLvoid* texCoords = NULL, GLuint vbo = 0);
     void finishDrawTexture();
 
+    void drawRegionRects(const Region& region);
+
     /**
      * Should be invoked every time the glScissor is modified.
      */
diff --git a/media/java/android/media/videoeditor/MediaArtistNativeHelper.java b/media/java/android/media/videoeditor/MediaArtistNativeHelper.java
index b8d1ca7..b9105cb 100644
--- a/media/java/android/media/videoeditor/MediaArtistNativeHelper.java
+++ b/media/java/android/media/videoeditor/MediaArtistNativeHelper.java
@@ -2064,6 +2064,20 @@
             effectSettings.alphaBlendingFadeInTimePercent = 100;
             effectSettings.alphaBlendingFadeOutTimePercent = 100;
             effectSettings.framingBuffer = null;
+
+            /*
+             * Set the resized RGB file dimensions
+             */
+            effectSettings.width = overlay.getResizedRGBSizeWidth();
+            if(effectSettings.width == 0) {
+                effectSettings.width = bitmap.getWidth();
+            }
+
+            effectSettings.height = overlay.getResizedRGBSizeHeight();
+            if(effectSettings.height == 0) {
+                effectSettings.height = bitmap.getHeight();
+            }
+
         }
 
         effectSettings.topLeftX = 0;
@@ -2098,6 +2112,11 @@
         return effectSettings;
     }
 
+     /* get Video Editor aspect ratio */
+    int nativeHelperGetAspectRatio() {
+        return mVideoEditor.getAspectRatio();
+    }
+
     /**
      * Sets the audio regenerate flag
      *
diff --git a/media/java/android/media/videoeditor/MediaItem.java b/media/java/android/media/videoeditor/MediaItem.java
index e3ef599..dfe0bae 100755
--- a/media/java/android/media/videoeditor/MediaItem.java
+++ b/media/java/android/media/videoeditor/MediaItem.java
@@ -187,6 +187,10 @@
         if (mEndTransition != null) {
             mEndTransition.invalidate();
         }
+
+        for (Overlay overlay : mOverlays) {
+            ((OverlayFrame)overlay).invalidateGeneratedFiles();
+        }
     }
 
     /**
diff --git a/media/java/android/media/videoeditor/OverlayFrame.java b/media/java/android/media/videoeditor/OverlayFrame.java
index 2bb9a1c..131f5f0 100755
--- a/media/java/android/media/videoeditor/OverlayFrame.java
+++ b/media/java/android/media/videoeditor/OverlayFrame.java
@@ -21,15 +21,19 @@
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
-
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Bitmap.CompressFormat;
-
 import java.io.DataOutputStream;
 import java.nio.ByteBuffer;
 import java.nio.IntBuffer;
 
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Bitmap.CompressFormat;
+import android.util.Pair;
+
+
 /**
  * This class is used to overlay an image on top of a media item.
  * {@hide}
@@ -46,6 +50,17 @@
     private int mOFHeight;
 
     /**
+     * resized RGB Image dimensions
+     */
+    private int mResizedRGBWidth;
+    private int mResizedRGBHeight;
+
+    /**
+     *  The resize paint
+     */
+    private static final Paint sResizePaint = new Paint(Paint.FILTER_BITMAP_FLAG);
+
+    /**
      * An object of this type cannot be instantiated by using the default
      * constructor
      */
@@ -74,6 +89,8 @@
         mBitmap = bitmap;
         mFilename = null;
         mBitmapFileName = null;
+        mResizedRGBWidth = 0;
+        mResizedRGBHeight = 0;
     }
 
     /**
@@ -95,6 +112,8 @@
         mBitmapFileName = filename;
         mBitmap = BitmapFactory.decodeFile(mBitmapFileName);
         mFilename = null;
+        mResizedRGBWidth = 0;
+        mResizedRGBHeight = 0;
     }
 
     /**
@@ -182,32 +201,23 @@
         mOFHeight = mBitmap.getHeight();
 
         mFilename = path + "/" + "Overlay" + getId() + ".rgb";
-        if (!(new File(mFilename).exists())) {
-            /**
-             * Save the image to a file ; as a rgb
-             */
-            final FileOutputStream fl = new FileOutputStream(mFilename);
-            final DataOutputStream dos = new DataOutputStream(fl);
 
-            /**
-             * populate the rgb file with bitmap data
-             */
-            final int [] framingBuffer = new int[mOFWidth];
-            ByteBuffer byteBuffer = ByteBuffer.allocate(framingBuffer.length * 4);
-            IntBuffer intBuffer;
+        /* resize and save rgb as per project aspect ratio */
+        MediaArtistNativeHelper nativeHelper = (super.getMediaItem()).getNativeContext();
 
-            byte[] array = byteBuffer.array();
-            int tmp = 0;
-            while(tmp < mOFHeight) {
-                mBitmap.getPixels(framingBuffer,0,mOFWidth,0,tmp,mOFWidth,1);
-                intBuffer = byteBuffer.asIntBuffer();
-                intBuffer.put(framingBuffer,0,mOFWidth);
-                dos.write(array);
-                tmp += 1;
-            }
-            fl.flush();
-            fl.close();
-        }
+        /* get height and width for story board aspect ratio */
+        final Pair<Integer, Integer> maxResolution;
+        final Pair<Integer, Integer>[] resolutions;
+        resolutions = MediaProperties.getSupportedResolutions(nativeHelper.nativeHelperGetAspectRatio());
+
+        // Get the highest resolution
+        maxResolution = resolutions[resolutions.length - 1];
+
+        /* Generate the rgb file with rendering mode */
+        generateOverlayWithRenderingMode (super.getMediaItem(), this,
+                maxResolution.second /* max Height */ ,
+                maxResolution.first /* max Width */);
+
         return mFilename;
     }
 
@@ -238,6 +248,30 @@
      void setOverlayFrameWidth(int width) {
          mOFWidth = width;
      }
+
+    /*
+     * Set the resized RGB widht and height
+     */
+     void setResizedRGBSize(int width, int height) {
+        mResizedRGBWidth = width;
+        mResizedRGBHeight = height;
+     }
+
+    /*
+     * Get the resized RGB Height
+     */
+     int getResizedRGBSizeHeight() {
+         return mResizedRGBHeight;
+     }
+
+    /*
+     * Get the resized RGB Width
+     */
+     int getResizedRGBSizeWidth() {
+         return mResizedRGBWidth;
+     }
+
+
     /**
      * Delete the overlay files
      */
@@ -257,4 +291,174 @@
             mBitmapFileName = null;
         }
     }
+
+     /**
+     * Delete the overlay related files
+     */
+    void invalidateGeneratedFiles() {
+        if (mFilename != null) {
+            new File(mFilename).delete();
+            mFilename = null;
+        }
+
+        if (mBitmapFileName != null) {
+            new File(mBitmapFileName).delete();
+            mBitmapFileName = null;
+        }
+    }
+
+    void generateOverlayWithRenderingMode (MediaItem mediaItemsList, OverlayFrame overlay, int height , int width)
+        throws FileNotFoundException, IOException {
+
+        final MediaItem t = mediaItemsList;
+
+        /* get the rendering mode */
+        int renderMode = t.getRenderingMode();
+
+        Bitmap overlayBitmap = ((OverlayFrame)overlay).getBitmap();
+
+        /*
+         * Check if the resize of Overlay is needed with rendering mode applied
+         * because of change in export dimensions
+         */
+        int resizedRGBFileHeight = ((OverlayFrame)overlay).getResizedRGBSizeHeight();
+        int resizedRGBFileWidth = ((OverlayFrame)overlay).getResizedRGBSizeWidth();
+
+        /* Get original bitmap width if it is not resized */
+        if(resizedRGBFileWidth == 0) {
+            resizedRGBFileWidth = overlayBitmap.getWidth();
+        }
+        /* Get original bitmap height if it is not resized */
+        if(resizedRGBFileHeight == 0) {
+            resizedRGBFileHeight = overlayBitmap.getHeight();
+        }
+
+        if (resizedRGBFileWidth != width || resizedRGBFileHeight != height
+            || (!(new File(((OverlayFrame)overlay).getFilename()).exists()))) {
+            /*
+             *  Create the canvas bitmap
+             */
+            final Bitmap destBitmap = Bitmap.createBitmap((int)width,
+                                                      (int)height,
+                                                      Bitmap.Config.ARGB_8888);
+            final Canvas overlayCanvas = new Canvas(destBitmap);
+            final Rect destRect;
+            final Rect srcRect;
+
+            switch (renderMode) {
+                case MediaItem.RENDERING_MODE_STRETCH: {
+                    destRect = new Rect(0, 0, overlayCanvas.getWidth(),
+                                             overlayCanvas.getHeight());
+                    srcRect = new Rect(0, 0, overlayBitmap.getWidth(),
+                                             overlayBitmap.getHeight());
+                    break;
+                }
+
+                case MediaItem.RENDERING_MODE_BLACK_BORDER: {
+                    int left, right, top, bottom;
+                    float aROverlayImage, aRCanvas;
+                    aROverlayImage = (float)(overlayBitmap.getWidth()) /
+                                     (float)(overlayBitmap.getHeight());
+
+                    aRCanvas = (float)(overlayCanvas.getWidth()) /
+                                     (float)(overlayCanvas.getHeight());
+
+                    if (aROverlayImage > aRCanvas) {
+                        int newHeight = ((overlayCanvas.getWidth() * overlayBitmap.getHeight())
+                                         / overlayBitmap.getWidth());
+                        left = 0;
+                        top  = (overlayCanvas.getHeight() - newHeight) / 2;
+                        right = overlayCanvas.getWidth();
+                        bottom = top + newHeight;
+                    } else {
+                        int newWidth = ((overlayCanvas.getHeight() * overlayBitmap.getWidth())
+                                            / overlayBitmap.getHeight());
+                        left = (overlayCanvas.getWidth() - newWidth) / 2;
+                        top  = 0;
+                        right = left + newWidth;
+                        bottom = overlayCanvas.getHeight();
+                    }
+
+                    destRect = new Rect(left, top, right, bottom);
+                    srcRect = new Rect(0, 0, overlayBitmap.getWidth(), overlayBitmap.getHeight());
+                    break;
+                }
+
+                case MediaItem.RENDERING_MODE_CROPPING: {
+                    // Calculate the source rect
+                    int left, right, top, bottom;
+                    float aROverlayImage, aRCanvas;
+                    aROverlayImage = (float)(overlayBitmap.getWidth()) /
+                                     (float)(overlayBitmap.getHeight());
+                    aRCanvas = (float)(overlayCanvas.getWidth()) /
+                                    (float)(overlayCanvas.getHeight());
+                    if (aROverlayImage < aRCanvas) {
+                        int newHeight = ((overlayBitmap.getWidth() * overlayCanvas.getHeight())
+                                   / overlayCanvas.getWidth());
+
+                        left = 0;
+                        top  = (overlayBitmap.getHeight() - newHeight) / 2;
+                        right = overlayBitmap.getWidth();
+                        bottom = top + newHeight;
+                    } else {
+                        int newWidth = ((overlayBitmap.getHeight() * overlayCanvas.getWidth())
+                                    / overlayCanvas.getHeight());
+                        left = (overlayBitmap.getWidth() - newWidth) / 2;
+                        top  = 0;
+                        right = left + newWidth;
+                        bottom = overlayBitmap.getHeight();
+                    }
+
+                    srcRect = new Rect(left, top, right, bottom);
+                    destRect = new Rect(0, 0, overlayCanvas.getWidth(), overlayCanvas.getHeight());
+                    break;
+                }
+
+                default: {
+                    throw new IllegalStateException("Rendering mode: " + renderMode);
+                }
+            }
+
+            overlayCanvas.drawBitmap(overlayBitmap, srcRect, destRect, sResizePaint);
+
+            /*
+             * Write to the dest file
+             */
+            String outFileName = ((OverlayFrame)overlay).getFilename();
+
+            /*
+             * Save the image to same rgb file
+             */
+            if (outFileName != null) {
+                new File(outFileName).delete();
+            }
+
+            final FileOutputStream fl = new FileOutputStream(outFileName);
+            final DataOutputStream dos = new DataOutputStream(fl);
+
+            /*
+             * Populate the rgb file with bitmap data
+             */
+            final int [] framingBuffer = new int[width];
+            ByteBuffer byteBuffer = ByteBuffer.allocate(framingBuffer.length * 4);
+            IntBuffer intBuffer;
+
+            byte[] array = byteBuffer.array();
+            int tmp = 0;
+            while(tmp < height) {
+                destBitmap.getPixels(framingBuffer,0,width,0,tmp,width,1);
+                intBuffer = byteBuffer.asIntBuffer();
+                intBuffer.put(framingBuffer,0,width);
+                dos.write(array);
+                tmp += 1;
+            }
+            fl.flush();
+            fl.close();
+
+            /*
+             * Set the resized RGB width and height
+             */
+            ((OverlayFrame)overlay).setResizedRGBSize(width, height);
+        }
+    }
 }
diff --git a/media/java/android/media/videoeditor/VideoEditorImpl.java b/media/java/android/media/videoeditor/VideoEditorImpl.java
index 8bbd8e8..7608c05 100755
--- a/media/java/android/media/videoeditor/VideoEditorImpl.java
+++ b/media/java/android/media/videoeditor/VideoEditorImpl.java
@@ -109,6 +109,8 @@
     private static final String ATTR_OVERLAY_RGB_FILENAME = "overlay_rgb_filename";
     private static final String ATTR_OVERLAY_FRAME_WIDTH = "overlay_frame_width";
     private static final String ATTR_OVERLAY_FRAME_HEIGHT = "overlay_frame_height";
+    private static final String ATTR_OVERLAY_RESIZED_RGB_FRAME_WIDTH = "resized_RGBframe_width";
+    private static final String ATTR_OVERLAY_RESIZED_RGB_FRAME_HEIGHT = "resized_RGBframe_height";
 
     /*
      *  Instance variables
@@ -867,7 +869,6 @@
                 mMANativeHelper.unlock();
             }
         }
-Log.i("VE_IMPL","renderPreviewFrame <--");
         return result;
     }
 
@@ -1154,6 +1155,15 @@
 
             ((OverlayFrame)overlay).setOverlayFrameWidth(overlayFrameWidth);
             ((OverlayFrame)overlay).setOverlayFrameHeight(overlayFrameHeight);
+
+            final int resizedRGBFrameWidth =
+                                   Integer.parseInt(parser.getAttributeValue("",
+                                   ATTR_OVERLAY_RESIZED_RGB_FRAME_WIDTH));
+            final int resizedRGBFrameHeight =
+                                   Integer.parseInt(parser.getAttributeValue("",
+                                   ATTR_OVERLAY_RESIZED_RGB_FRAME_HEIGHT));
+
+            ((OverlayFrame)overlay).setResizedRGBSize(resizedRGBFrameWidth, resizedRGBFrameHeight);
         }
 
         return overlay;
@@ -1340,6 +1350,11 @@
                                                  Integer.toString(overlayFrame.getOverlayFrameWidth()));
                             serializer.attribute("", ATTR_OVERLAY_FRAME_HEIGHT,
                                                  Integer.toString(overlayFrame.getOverlayFrameHeight()));
+                            serializer.attribute("", ATTR_OVERLAY_RESIZED_RGB_FRAME_WIDTH,
+                                                 Integer.toString(overlayFrame.getResizedRGBSizeWidth()));
+                            serializer.attribute("", ATTR_OVERLAY_RESIZED_RGB_FRAME_HEIGHT,
+                                                 Integer.toString(overlayFrame.getResizedRGBSizeHeight()));
+
                         }
 
                     }
@@ -1524,6 +1539,17 @@
         for (Transition transition : mTransitions) {
             transition.invalidate();
         }
+
+        final Iterator<MediaItem> it = mMediaItems.iterator();
+
+        while (it.hasNext()) {
+            final MediaItem t = it.next();
+            List<Overlay> overlayList = t.getAllOverlays();
+            for (Overlay overlay : overlayList) {
+
+                ((OverlayFrame)overlay).invalidateGeneratedFiles();
+            }
+        }
     }
 
     /*