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

Commit 5b695fb0 authored by Santosh Madhava's avatar Santosh Madhava Committed by Android Git Automerger
Browse files

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

* commit 'b70708552e0d20b007b815c60968e6e2f5d21ce5':
  Fix for 3409334 Movie Studio "Force Close" after importing a 3gp video
parents 4f728ffd bfece17c
Loading
Loading
Loading
Loading
+61 −16
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
 * limitations under the License.
 */


#define LOG_NDEBUG 1
#define LOG_TAG "PreviewPlayer"
#include <utils/Log.h>
@@ -75,19 +76,34 @@ private:


struct PreviewLocalRenderer : public PreviewPlayerRenderer {
    PreviewLocalRenderer(

    static PreviewLocalRenderer* initPreviewLocalRenderer (
            bool previewOnly,
            OMX_COLOR_FORMATTYPE colorFormat,
            const sp<Surface> &surface,
            size_t displayWidth, size_t displayHeight,
            size_t decodedWidth, size_t decodedHeight,
            int32_t rotationDegrees = 0)
        : mTarget(NULL) {
            init(previewOnly,
                 colorFormat, surface,
    {
        PreviewLocalRenderer* mLocalRenderer = new
            PreviewLocalRenderer(
                previewOnly,
                colorFormat,
                surface,
                displayWidth, displayHeight,
                decodedWidth, decodedHeight,
                rotationDegrees);

        if ( mLocalRenderer->init(previewOnly,
                 colorFormat, surface,
                 displayWidth, displayHeight,
                 decodedWidth, decodedHeight,
                 rotationDegrees) != OK )
        {
            delete mLocalRenderer;
            return NULL;
        }
        return mLocalRenderer;
    }

    virtual void render(MediaBuffer *buffer) {
@@ -114,7 +130,18 @@ protected:
private:
    PreviewRenderer *mTarget;

    void init(
    PreviewLocalRenderer(
            bool previewOnly,
            OMX_COLOR_FORMATTYPE colorFormat,
            const sp<Surface> &surface,
            size_t displayWidth, size_t displayHeight,
            size_t decodedWidth, size_t decodedHeight,
            int32_t rotationDegrees = 0)
        : mTarget(NULL) {
    }


    int init(
            bool previewOnly,
            OMX_COLOR_FORMATTYPE colorFormat,
            const sp<Surface> &surface,
@@ -126,16 +153,21 @@ private:
    PreviewLocalRenderer &operator=(const PreviewLocalRenderer &);;
};

void PreviewLocalRenderer::init(
int PreviewLocalRenderer::init(
        bool previewOnly,
        OMX_COLOR_FORMATTYPE colorFormat,
        const sp<Surface> &surface,
        size_t displayWidth, size_t displayHeight,
        size_t decodedWidth, size_t decodedHeight,
        int32_t rotationDegrees) {
    mTarget = new PreviewRenderer(

    mTarget = PreviewRenderer::CreatePreviewRenderer (
            colorFormat, surface, displayWidth, displayHeight,
            decodedWidth, decodedHeight, rotationDegrees);
    if (mTarget == M4OSA_NULL) {
        return UNKNOWN_ERROR;
    }
    return OK;
}

PreviewPlayer::PreviewPlayer()
@@ -538,7 +570,7 @@ VideoEditorAudioPlayer *mVePlayer;
}


void PreviewPlayer::initRenderer_l() {
status_t PreviewPlayer::initRenderer_l() {
    if (mSurface != NULL || mISurface != NULL) {
        sp<MetaData> meta = mVideoSource->getFormat();

@@ -560,14 +592,21 @@ void PreviewPlayer::initRenderer_l() {
        // allocate their buffers in local address space.
        if(mVideoRenderer == NULL) {

            mVideoRenderer = new PreviewLocalRenderer(
            mVideoRenderer = PreviewLocalRenderer:: initPreviewLocalRenderer (
                false,  // previewOnly
                (OMX_COLOR_FORMATTYPE)format,
                mSurface,
                mOutputVideoWidth, mOutputVideoHeight,
                mOutputVideoWidth, mOutputVideoHeight);

            if ( mVideoRenderer == NULL )
            {
                return UNKNOWN_ERROR;
            }
            return OK;
        }
    }
    return OK;
}


@@ -749,7 +788,10 @@ void PreviewPlayer::onVideoEvent() {
                    CHECK(meta->findInt32(kKeyHeight, &mReportedHeight));
                    if (mVideoRenderer != NULL) {
                        mVideoRendererIsPreview = false;
                        initRenderer_l();
                        err = initRenderer_l();
                           if ( err != OK )
                        postStreamDoneEvent_l(err); // santosh

                    }
                    continue;
                }
@@ -874,7 +916,9 @@ void PreviewPlayer::onVideoEvent() {
    if (mVideoRendererIsPreview || mVideoRenderer == NULL) {
        mVideoRendererIsPreview = false;

        initRenderer_l();
        status_t err = initRenderer_l();
        if ( err != OK )
        postStreamDoneEvent_l(err); // santosh
    }

    // If timestamp exceeds endCutTime of clip, donot render
@@ -887,7 +931,7 @@ void PreviewPlayer::onVideoEvent() {
        mVideoBuffer = NULL;
        mFlags |= VIDEO_AT_EOS;
        mFlags |= AUDIO_AT_EOS;
        LOGI("PreviewPlayer: onVideoEvent timeUs > mPlayEndTime; send EOS..");
        LOGV("PreviewPlayer: onVideoEvent timeUs > mPlayEndTime; send EOS..");
        if (mOverlayUpdateEventPosted) {
            mOverlayUpdateEventPosted = false;
            postOverlayUpdateEvent_l();
@@ -1114,7 +1158,7 @@ void PreviewPlayer::onPrepareAsyncEvent() {
    LOGV("onPrepareAsyncEvent");

    if (mFlags & PREPARE_CANCELLED) {
        LOGI("LV PLAYER prepare was cancelled before doing anything");
        LOGV("LV PLAYER prepare was cancelled before doing anything");
        abortPrepare(UNKNOWN_ERROR);
        return;
    }
@@ -1275,7 +1319,7 @@ status_t PreviewPlayer::resume() {

    if (state->mLastVideoFrame && (mSurface != NULL || mISurface != NULL)) {
        mVideoRenderer =
            new PreviewLocalRenderer(
            PreviewLocalRenderer::initPreviewLocalRenderer(
                    true,  // previewOnly
                    (OMX_COLOR_FORMATTYPE)state->mColorFormat,
                    mSurface,
@@ -1731,7 +1775,9 @@ status_t PreviewPlayer::readFirstVideoFrame() {

                    if (mVideoRenderer != NULL) {
                        mVideoRendererIsPreview = false;
                        initRenderer_l();
                        err = initRenderer_l();
                        if ( err != OK )
                                postStreamDoneEvent_l(err); // santosh
                    }
                    continue;
                }
@@ -1756,7 +1802,6 @@ status_t PreviewPlayer::readFirstVideoFrame() {
            if((videoTimeUs/1000) < mPlayBeginTimeMsec) {
                // buffers are before begin cut time
                // ignore them
                //LOGI("PreviewPlayer: Ignoring buffers before begin cut time");
                mVideoBuffer->release();
                mVideoBuffer = NULL;
                continue;
+1 −1
Original line number Diff line number Diff line
@@ -120,7 +120,7 @@ private:
    void reset_l();
    void partial_reset_l();
    status_t play_l();
    void initRenderer_l();
    status_t initRenderer_l();
    status_t initAudioDecoder();
    status_t initVideoDecoder(uint32_t flags = 0);
    void onVideoEvent();
+78 −49
Original line number Diff line number Diff line
@@ -29,62 +29,56 @@

namespace android {

PreviewRenderer::PreviewRenderer(
        OMX_COLOR_FORMATTYPE colorFormat,
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)
    : mColorFormat(colorFormat),
      mConverter(NULL),
      mYUVMode(None),
      mSurface(surface),
      mDisplayWidth(displayWidth),
      mDisplayHeight(displayHeight),
      mDecodedWidth(decodedWidth),
      mDecodedHeight(decodedHeight) {
    LOGV("input format = %d", mColorFormat);
    LOGV("display = %d x %d, decoded = %d x %d",
            mDisplayWidth, mDisplayHeight, mDecodedWidth, mDecodedHeight);
        int32_t rotationDegrees) {

    mDecodedWidth = mDisplayWidth;
    mDecodedHeight = mDisplayHeight;
        PreviewRenderer* returnCtx =
            new PreviewRenderer(colorFormat,
            surface,
            displayWidth, displayHeight,
            decodedWidth, decodedHeight,
            rotationDegrees);

        int result = 0;

        int halFormat;
    switch (mColorFormat) {
        switch (returnCtx->mColorFormat) {
            case OMX_COLOR_FormatYUV420Planar:
            {
                halFormat = HAL_PIXEL_FORMAT_YV12;
            mYUVMode = None;
                returnCtx->mYUVMode = None;
                break;
            }
            default:
                halFormat = HAL_PIXEL_FORMAT_RGB_565;

            mConverter = new ColorConverter(
                    mColorFormat, OMX_COLOR_Format16bitRGB565);
            CHECK(mConverter->isValid());
                returnCtx->mConverter = new ColorConverter(
                        returnCtx->mColorFormat, OMX_COLOR_Format16bitRGB565);
                CHECK(returnCtx->mConverter->isValid());
                break;
        }

    CHECK(mSurface.get() != NULL);
    CHECK(mDecodedWidth > 0);
    CHECK(mDecodedHeight > 0);
    CHECK(mConverter == NULL || mConverter->isValid());
        CHECK(returnCtx->mSurface.get() != NULL);
        CHECK(returnCtx->mDecodedWidth > 0);
        CHECK(returnCtx->mDecodedHeight > 0);
        CHECK(returnCtx->mConverter == NULL || returnCtx->mConverter->isValid());

    CHECK_EQ(0,
            native_window_set_usage(
            mSurface.get(),
        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));

    CHECK_EQ(0, native_window_set_buffer_count(mSurface.get(), 3));
                    | GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP);

    // Width must be multiple of 32???
    CHECK_EQ(0, native_window_set_buffers_geometry(
                mSurface.get(), mDecodedWidth, mDecodedHeight,
                halFormat));
        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;
@@ -93,11 +87,46 @@ PreviewRenderer::PreviewRenderer(
                        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));
                        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,
        size_t displayWidth, size_t displayHeight,
        size_t decodedWidth, size_t decodedHeight,
        int32_t rotationDegrees)
    : mColorFormat(colorFormat),
      mConverter(NULL),
      mYUVMode(None),
      mSurface(surface),
      mDisplayWidth(displayWidth),
      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;
}

PreviewRenderer::~PreviewRenderer() {
+13 −6
Original line number Diff line number Diff line
@@ -25,14 +25,15 @@
#include <ui/GraphicBufferMapper.h>
#include "SoftwareRenderer.h"


namespace android {

class Surface;

class PreviewRenderer {
public:
    PreviewRenderer(
            OMX_COLOR_FORMATTYPE colorFormat,

static PreviewRenderer* CreatePreviewRenderer (OMX_COLOR_FORMATTYPE colorFormat,
        const sp<Surface> &surface,
        size_t displayWidth, size_t displayHeight,
        size_t decodedWidth, size_t decodedHeight,
@@ -52,6 +53,12 @@ public:
    }

private:
    PreviewRenderer(
            OMX_COLOR_FORMATTYPE colorFormat,
            const sp<Surface> &surface,
            size_t displayWidth, size_t displayHeight,
            size_t decodedWidth, size_t decodedHeight,
            int32_t rotationDegrees);
    enum YUVMode {
        None,
        YUV420ToYUV420sp,
+9 −3
Original line number Diff line number Diff line
@@ -705,9 +705,11 @@ M4OSA_ERR VideoEditorPreviewController::clearSurface(

    // Initialize the renderer
    if(mTarget == NULL) {
        mTarget = new PreviewRenderer(

        mTarget = PreviewRenderer::CreatePreviewRenderer(
            OMX_COLOR_FormatYUV420Planar, surface, outputBufferWidth, outputBufferHeight,
            outputBufferWidth, outputBufferHeight, 0);

        if(mTarget == NULL) {
            LOGE("renderPreviewFrame: cannot create PreviewRenderer");
            return M4ERR_ALLOC;
@@ -750,7 +752,6 @@ M4OSA_ERR VideoEditorPreviewController::renderPreviewFrame(
    M4OSA_UInt32 i = 0, iIncrementedDuration = 0, tnTimeMs=0, framesize =0;
    VideoEditor_renderPreviewFrameStr* pFrameStr = pFrameInfo;
    M4VIFI_UInt8 *pixelArray = NULL;

    Mutex::Autolock autoLock(mLock);

    // Get the Isurface to be passed to renderer
@@ -774,9 +775,14 @@ M4OSA_ERR VideoEditorPreviewController::renderPreviewFrame(

    // Initialize the renderer
    if(mTarget == NULL) {
        mTarget = new PreviewRenderer(
        /*mTarget = new PreviewRenderer(
            OMX_COLOR_FormatYUV420Planar, surface, mOutputVideoWidth, mOutputVideoHeight,
            mOutputVideoWidth, mOutputVideoHeight, 0);*/

         mTarget = PreviewRenderer::CreatePreviewRenderer(
            OMX_COLOR_FormatYUV420Planar, surface, mOutputVideoWidth, mOutputVideoHeight,
            mOutputVideoWidth, mOutputVideoHeight, 0);

        if(mTarget == NULL) {
            LOGE("renderPreviewFrame: cannot create PreviewRenderer");
            return M4ERR_ALLOC;