Fix for 3409334 Movie Studio "Force Close" after importing a 3gp video

Change-Id: I37949140a6c37a0c2d04221e220e7e267b6c7a02
diff --git a/libvideoeditor/lvpp/PreviewRenderer.cpp b/libvideoeditor/lvpp/PreviewRenderer.cpp
index c2b6fa9..cfded72 100755
--- a/libvideoeditor/lvpp/PreviewRenderer.cpp
+++ b/libvideoeditor/lvpp/PreviewRenderer.cpp
@@ -29,6 +29,83 @@
 

 namespace android {

 

+PreviewRenderer* PreviewRenderer::CreatePreviewRenderer (OMX_COLOR_FORMATTYPE colorFormat,

+        const sp<Surface> &surface,

+        size_t displayWidth, size_t displayHeight,

+        size_t decodedWidth, size_t decodedHeight,

+        int32_t rotationDegrees) {

+

+        PreviewRenderer* returnCtx =

+            new PreviewRenderer(colorFormat,

+            surface,

+            displayWidth, displayHeight,

+            decodedWidth, decodedHeight,

+            rotationDegrees);

+

+        int result = 0;

+

+        int halFormat;

+        switch (returnCtx->mColorFormat) {

+            case OMX_COLOR_FormatYUV420Planar:

+            {

+                halFormat = HAL_PIXEL_FORMAT_YV12;

+                returnCtx->mYUVMode = None;

+                break;

+            }

+            default:

+                halFormat = HAL_PIXEL_FORMAT_RGB_565;

+

+                returnCtx->mConverter = new ColorConverter(

+                        returnCtx->mColorFormat, OMX_COLOR_Format16bitRGB565);

+                CHECK(returnCtx->mConverter->isValid());

+                break;

+        }

+

+        CHECK(returnCtx->mSurface.get() != NULL);

+        CHECK(returnCtx->mDecodedWidth > 0);

+        CHECK(returnCtx->mDecodedHeight > 0);

+        CHECK(returnCtx->mConverter == NULL || returnCtx->mConverter->isValid());

+

+        result = native_window_set_usage(

+                    returnCtx->mSurface.get(),

+                    GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_OFTEN

+                    | GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP);

+

+        if ( result == 0 ) {

+            result = native_window_set_buffer_count(returnCtx->mSurface.get(), 3);

+

+            if (result == 0) {

+                result = native_window_set_buffers_geometry(

+                    returnCtx->mSurface.get(), returnCtx->mDecodedWidth, returnCtx->mDecodedHeight,

+                    halFormat);

+                if ( result == 0) {

+                    uint32_t transform;

+                    switch (rotationDegrees) {

+                        case 0: transform = 0; break;

+                        case 90: transform = HAL_TRANSFORM_ROT_90; break;

+                        case 180: transform = HAL_TRANSFORM_ROT_180; break;

+                        case 270: transform = HAL_TRANSFORM_ROT_270; break;

+                        default: transform = 0; break;

+                    }

+                    if (transform) {

+                        result = native_window_set_buffers_transform(

+                                    returnCtx->mSurface.get(), transform);

+

+                    }

+                }

+            }

+        }

+

+        if ( result != 0 )

+        {

+            /* free the ctx */

+            returnCtx->~PreviewRenderer();

+            return NULL;

+        }

+

+        return returnCtx;

+}

+

 PreviewRenderer::PreviewRenderer(

         OMX_COLOR_FORMATTYPE colorFormat,

         const sp<Surface> &surface,

@@ -43,61 +120,13 @@
       mDisplayHeight(displayHeight),

       mDecodedWidth(decodedWidth),

       mDecodedHeight(decodedHeight) {

+

     LOGV("input format = %d", mColorFormat);

     LOGV("display = %d x %d, decoded = %d x %d",

             mDisplayWidth, mDisplayHeight, mDecodedWidth, mDecodedHeight);

 

     mDecodedWidth = mDisplayWidth;

     mDecodedHeight = mDisplayHeight;

-

-    int halFormat;

-    switch (mColorFormat) {

-        case OMX_COLOR_FormatYUV420Planar:

-        {

-            halFormat = HAL_PIXEL_FORMAT_YV12;

-            mYUVMode = None;

-            break;

-        }

-        default:

-            halFormat = HAL_PIXEL_FORMAT_RGB_565;

-

-            mConverter = new ColorConverter(

-                    mColorFormat, OMX_COLOR_Format16bitRGB565);

-            CHECK(mConverter->isValid());

-            break;

-    }

-

-    CHECK(mSurface.get() != NULL);

-    CHECK(mDecodedWidth > 0);

-    CHECK(mDecodedHeight > 0);

-    CHECK(mConverter == NULL || mConverter->isValid());

-

-    CHECK_EQ(0,

-            native_window_set_usage(

-            mSurface.get(),

-            GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_OFTEN

-            | GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP));

-

-    CHECK_EQ(0, native_window_set_buffer_count(mSurface.get(), 3));

-

-    // Width must be multiple of 32???

-    CHECK_EQ(0, native_window_set_buffers_geometry(

-                mSurface.get(), mDecodedWidth, mDecodedHeight,

-                halFormat));

-

-    uint32_t transform;

-    switch (rotationDegrees) {

-        case 0: transform = 0; break;

-        case 90: transform = HAL_TRANSFORM_ROT_90; break;

-        case 180: transform = HAL_TRANSFORM_ROT_180; break;

-        case 270: transform = HAL_TRANSFORM_ROT_270; break;

-        default: transform = 0; break;

-    }

-

-    if (transform) {

-        CHECK_EQ(0, native_window_set_buffers_transform(

-                    mSurface.get(), transform));

-    }

 }

 

 PreviewRenderer::~PreviewRenderer() {