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

Commit e6c0750c authored by Dharmaray Kundargi's avatar Dharmaray Kundargi
Browse files

Fix for ISSUE 3370836 - Overlay optmization.

Change-Id: I9c6657f6fdab0fa815201d8b26b8c90700663c12
parent 2177d443
Loading
Loading
Loading
Loading
+79 −5
Original line number Diff line number Diff line
@@ -143,7 +143,8 @@ PreviewPlayer::PreviewPlayer()
      mFrameRGBBuffer(NULL),
      mFrameYUVBuffer(NULL),
      mReportedWidth(0),
      mReportedHeight(0) {
      mReportedHeight(0),
      mCurrFramingEffectIndex(0) {

    mVideoRenderer = NULL;
    mLastVideoBuffer = NULL;
@@ -158,6 +159,7 @@ PreviewPlayer::PreviewPlayer()
    mCurrentVideoEffect = VIDEO_EFFECT_NONE;
    mProgressCbInterval = 0;
    mNumberDecVideoFrames = 0;
    mOverlayUpdateEventPosted = false;

    mVideoEvent = new PreviewPlayerEvent(this, &PreviewPlayer::onVideoEvent);
    mVideoEventPending = false;
@@ -174,7 +176,11 @@ PreviewPlayer::PreviewPlayer()
    mProgressCbEvent = new PreviewPlayerEvent(this,
         &PreviewPlayer::onProgressCbEvent);

    mOverlayUpdateEvent = new PreviewPlayerEvent(this,
        &PreviewPlayer::onUpdateOverlayEvent);
    mProgressCbEventPending = false;

    mOverlayUpdateEventPending = false;
    mResizedVideoBuffer = NULL;
    mVideoResizedOrCropped = false;
    mRenderingMode = (M4xVSS_MediaRendering)MEDIA_RENDERING_INVALID;
@@ -864,6 +870,10 @@ void PreviewPlayer::onVideoEvent() {
        mFlags |= VIDEO_AT_EOS;
        mFlags |= AUDIO_AT_EOS;
        LOGI("PreviewPlayer: onVideoEvent timeUs > mPlayEndTime; send EOS..");
        if (mOverlayUpdateEventPosted) {
            mOverlayUpdateEventPosted = false;
            postOverlayUpdateEvent_l();
        }
        postStreamDoneEvent_l(ERROR_END_OF_STREAM);
        return;
    }
@@ -892,9 +902,46 @@ void PreviewPlayer::onVideoEvent() {
            setVideoPostProcessingNode(
             mEffectsSettings[i].VideoEffectType, FALSE);
        }
    }

    //Provide the overlay Update indication when there is an overlay effect
    if (mCurrentVideoEffect == VIDEO_EFFECT_FRAMING) {
        mCurrentVideoEffect = VIDEO_EFFECT_NONE; //never apply framing here.
        if (!mOverlayUpdateEventPosted) {

            // Find the effect in effectSettings array
            int index;
            for (index = 0; index < mNumberEffects; index++) {
                M4OSA_UInt32 timeMs = mDecodedVideoTs/1000;
                M4OSA_UInt32 timeOffset = mDecVideoTsStoryBoard/1000;
                if(mEffectsSettings[index].VideoEffectType ==
                    M4xVSS_kVideoEffectType_Framing) {
                    if (((mEffectsSettings[index].uiStartTime + 1) <= timeMs + timeOffset) &&
                        ((mEffectsSettings[index].uiStartTime - 1 +
                        mEffectsSettings[index].uiDuration) >= timeMs + timeOffset))
                    {
                        break;
                    }
                }
            }
            if (index < mNumberEffects) {
                mCurrFramingEffectIndex = index;
                mOverlayUpdateEventPosted = true;
                postOverlayUpdateEvent_l();
                LOGV("Framing index = %d", mCurrFramingEffectIndex);
            } else {
                LOGV("No framing effects found");
            }
        }

    } else if (mOverlayUpdateEventPosted) {
        //Post the event when the overlay is no more valid
        LOGV("Overlay is Done");
        mOverlayUpdateEventPosted = false;
        postOverlayUpdateEvent_l();
    }


    if (mCurrentVideoEffect != VIDEO_EFFECT_NONE) {
        err1 = doVideoPostProcessing();
        if(err1 != M4NO_ERROR) {
@@ -1450,6 +1497,7 @@ void PreviewPlayer::postProgressCallbackEvent_l() {
    mQueue.postEvent(mProgressCbEvent);
}


void PreviewPlayer::onProgressCbEvent() {
    Mutex::Autolock autoLock(mLock);
    if (!mProgressCbEventPending) {
@@ -1467,6 +1515,32 @@ void PreviewPlayer::onProgressCbEvent() {
    }
}

void PreviewPlayer::postOverlayUpdateEvent_l() {
    if (mOverlayUpdateEventPending) {
        return;
    }
    mOverlayUpdateEventPending = true;
    mQueue.postEvent(mOverlayUpdateEvent);
}

void PreviewPlayer::onUpdateOverlayEvent() {
    Mutex::Autolock autoLock(mLock);

    if (!mOverlayUpdateEventPending) {
        return;
    }
    mOverlayUpdateEventPending = false;

    int updateState;
    if (mOverlayUpdateEventPosted) {
        updateState = 1;
    } else {
        updateState = 0;
    }
    notifyListener_l(0xBBBBBBBB, updateState, mCurrFramingEffectIndex);
}


void PreviewPlayer::setVideoPostProcessingNode(
                    M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable) {

+8 −0
Original line number Diff line number Diff line
@@ -168,6 +168,7 @@ private:
    M4OSA_UInt32 mAudioMixStoryBoardTS;
    M4OSA_UInt32 mCurrentMediaBeginCutTime;
    M4OSA_UInt32 mCurrentMediaVolumeValue;
    M4OSA_UInt32 mCurrFramingEffectIndex;

    uint32_t mNumberEffects;
    uint32_t mPlayBeginTimeMsec;
@@ -179,6 +180,10 @@ private:
    uint32_t mNumberDecVideoFrames; // Counter of number of video frames decoded
    sp<TimedEventQueue::Event> mProgressCbEvent;
    bool mProgressCbEventPending;
    sp<TimedEventQueue::Event> mOverlayUpdateEvent;
    bool mOverlayUpdateEventPending;
    bool mOverlayUpdateEventPosted;

    MediaBuffer *mResizedVideoBuffer;
    bool mVideoResizedOrCropped;
    M4xVSS_MediaRendering mRenderingMode;
@@ -205,6 +210,9 @@ private:
    void postProgressCallbackEvent_l();
    void onProgressCbEvent();

    void postOverlayUpdateEvent_l();
    void onUpdateOverlayEvent();

    status_t setDataSource_l_jpg();

    status_t prepare_l();
+74 −9
Original line number Diff line number Diff line
@@ -738,7 +738,9 @@ M4OSA_ERR VideoEditorPreviewController::clearSurface(
}

M4OSA_ERR VideoEditorPreviewController::renderPreviewFrame(
    const sp<Surface> &surface, VideoEditor_renderPreviewFrameStr* pFrameInfo) {
            const sp<Surface> &surface,
            VideoEditor_renderPreviewFrameStr* pFrameInfo,
            VideoEditorCurretEditInfo *pCurrEditInfo) {

    M4OSA_ERR err = M4NO_ERROR;
    M4OSA_UInt32 i = 0, iIncrementedDuration = 0, tnTimeMs=0, framesize =0;
@@ -749,7 +751,9 @@ M4OSA_ERR VideoEditorPreviewController::renderPreviewFrame(

    // Get the Isurface to be passed to renderer
    mISurface = surface->getISurface();

    if (pCurrEditInfo != NULL) {
        pCurrEditInfo->overlaySettingsIndex = -1;
    }
    // Delete previous renderer instance
    if(mTarget != NULL) {
        delete mTarget;
@@ -796,6 +800,32 @@ M4OSA_ERR VideoEditorPreviewController::renderPreviewFrame(
            }
        }

        //Provide the overlay Update indication when there is an overlay effect
        if (mCurrentVideoEffect == VIDEO_EFFECT_FRAMING) {
            int index;
            mCurrentVideoEffect = VIDEO_EFFECT_NONE; //never apply framing here.

            // Find the effect in effectSettings array
            for (index = 0; index < mNumberEffects; index++) {
                if(mEffectsSettings[index].VideoEffectType ==
                    M4xVSS_kVideoEffectType_Framing) {

                    if((mEffectsSettings[index].uiStartTime <= pFrameInfo->timeMs) &&
                        ((mEffectsSettings[index].uiStartTime+
                        mEffectsSettings[index].uiDuration) >= pFrameInfo->timeMs))
                    {
                        break;
                    }
                }
            }
            if ((index < mNumberEffects) && (pCurrEditInfo != NULL)) {
                pCurrEditInfo->overlaySettingsIndex = index;
                LOGV("Framing index = %d", index);
            } else {
                LOGV("No framing effects found");
            }
        }

        if(mCurrentVideoEffect != VIDEO_EFFECT_NONE) {
            err = applyVideoEffect((M4OSA_Void *)pFrameStr->pBuffer,
             OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth,
@@ -958,9 +988,10 @@ M4OSA_ERR VideoEditorPreviewController::threadProc(M4OSA_Void* param) {
                }
            }
            else {
                M4OSA_UInt32 endArgs = 0;
                if(pController->mJniCallback != NULL) {
                    pController->mJniCallback(
                     pController->mJniCookie, MSG_TYPE_PREVIEW_END, 0);
                     pController->mJniCookie, MSG_TYPE_PREVIEW_END, &endArgs);
                }
                pController->mPlayerState = VePlayerAutoStop;

@@ -1054,6 +1085,7 @@ void VideoEditorPreviewController::notify(
            LOGV("MEDIA_PREPARED");
            break;
        case MEDIA_PLAYBACK_COMPLETE:
        {
            LOGV("notify:MEDIA_PLAYBACK_COMPLETE");
            pController->mPlayerState = VePlayerIdle;

@@ -1069,31 +1101,40 @@ void VideoEditorPreviewController::notify(
                 pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime
                  - pController->mClipList[pController->mCurrentClipNumber]->uiBeginCutTime;
            }

            M4OSA_UInt32 playedDuration = clipDuration+pController->mCurrentPlayedDuration;
            pController->mJniCallback(
                 pController->mJniCookie, MSG_TYPE_PROGRESS_INDICATION,
             (clipDuration+pController->mCurrentPlayedDuration));
                 &playedDuration);

            M4OSA_semaphorePost(pController->mSemThreadWait);
            break;
        }
        case MEDIA_ERROR:
        {
            int err_val = ext1;
          // Always log errors.
          // ext1: Media framework error code.
          // ext2: Implementation dependant error code.
            LOGE("MEDIA_ERROR; error (%d, %d)", ext1, ext2);
            if(pController->mJniCallback != NULL) {
                pController->mJniCallback(pController->mJniCookie,
                 MSG_TYPE_PLAYER_ERROR, ext1);
                 MSG_TYPE_PLAYER_ERROR, &err_val);
            }
            break;
        }
        case MEDIA_INFO:
        {
            int info_val = ext2;
            // ext1: Media framework error code.
            // ext2: Implementation dependant error code.
            //LOGW("MEDIA_INFO; info/warning (%d, %d)", ext1, ext2);
            if(pController->mJniCallback != NULL) {
                pController->mJniCallback(pController->mJniCookie,
                 MSG_TYPE_PROGRESS_INDICATION, ext2);
                 MSG_TYPE_PROGRESS_INDICATION, &info_val);
            }
            break;
        }
        case MEDIA_SEEK_COMPLETE:
            LOGV("MEDIA_SEEK_COMPLETE; Received seek complete");
            break;
@@ -1120,6 +1161,30 @@ void VideoEditorPreviewController::notify(
                    pController->mCurrentClipNumber+1);
            }
            break;
        case 0xBBBBBBBB:
        {
            LOGV("VIDEO PLAYBACK, Update Overlay");
            int overlayIndex = ext2;
            VideoEditorCurretEditInfo *pEditInfo =
                    (VideoEditorCurretEditInfo*)M4OSA_malloc(sizeof(VideoEditorCurretEditInfo),
                    M4VS, (M4OSA_Char*)"Current Edit info");
            //ext1 = 1; start the overlay display
            //     = 2; Clear the overlay.
            pEditInfo->overlaySettingsIndex = ext2;
            pEditInfo->clipIndex = pController->mCurrentClipNumber;
            LOGV("pController->mCurrentClipNumber = %d",pController->mCurrentClipNumber);
            if (pController->mJniCallback != NULL) {
                if (ext1 == 1) {
                    pController->mJniCallback(pController->mJniCookie,
                        MSG_TYPE_OVERLAY_UPDATE, pEditInfo);
                } else {
                    pController->mJniCallback(pController->mJniCookie,
                        MSG_TYPE_OVERLAY_CLEAR, pEditInfo);
                }
            }
            M4OSA_free((M4OSA_MemAddr32)pEditInfo);
            break;
        }
        default:
            LOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2);
            break;
+8 −6
Original line number Diff line number Diff line
@@ -53,7 +53,8 @@ typedef enum {


// Callback mechanism from PreviewController to Jni  */
typedef void (*jni_progress_callback_fct)(void* cookie, M4OSA_UInt32 msgType, M4OSA_UInt32 argc);
typedef void (*jni_progress_callback_fct)(void* cookie, M4OSA_UInt32 msgType, void *argc);


class VideoEditorPreviewController {

@@ -72,7 +73,8 @@ public:
    M4OSA_ERR stopPreview();

    M4OSA_ERR renderPreviewFrame(const sp<Surface> &surface,
     VideoEditor_renderPreviewFrameStr* pFrameInfo);
        VideoEditor_renderPreviewFrameStr* pFrameInfo,
        VideoEditorCurretEditInfo *pCurrEditInfo);

    M4OSA_ERR clearSurface(const sp<Surface> &surface,
     VideoEditor_renderPreviewFrameStr* pFrameInfo);