Fix for ISSUE 3370836 - Overlay optmization.

Change-Id: I9c6657f6fdab0fa815201d8b26b8c90700663c12
diff --git a/libvideoeditor/lvpp/PreviewPlayer.cpp b/libvideoeditor/lvpp/PreviewPlayer.cpp
old mode 100755
new mode 100644
index 4738fdd..4d63a2f
--- a/libvideoeditor/lvpp/PreviewPlayer.cpp
+++ b/libvideoeditor/lvpp/PreviewPlayer.cpp
@@ -143,7 +143,8 @@
       mFrameRGBBuffer(NULL),
       mFrameYUVBuffer(NULL),
       mReportedWidth(0),
-      mReportedHeight(0) {
+      mReportedHeight(0),
+      mCurrFramingEffectIndex(0) {
 
     mVideoRenderer = NULL;
     mLastVideoBuffer = NULL;
@@ -158,23 +159,28 @@
     mCurrentVideoEffect = VIDEO_EFFECT_NONE;
     mProgressCbInterval = 0;
     mNumberDecVideoFrames = 0;
+    mOverlayUpdateEventPosted = false;
 
     mVideoEvent = new PreviewPlayerEvent(this, &PreviewPlayer::onVideoEvent);
     mVideoEventPending = false;
     mStreamDoneEvent = new PreviewPlayerEvent(this,
-     &AwesomePlayer::onStreamDone);
+         &AwesomePlayer::onStreamDone);
 
     mStreamDoneEventPending = false;
 
     mCheckAudioStatusEvent = new PreviewPlayerEvent(
-            this, &AwesomePlayer::onCheckAudioStatus);
+        this, &AwesomePlayer::onCheckAudioStatus);
 
     mAudioStatusEventPending = false;
 
     mProgressCbEvent = new PreviewPlayerEvent(this,
-     &PreviewPlayer::onProgressCbEvent);
+         &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 @@
         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,10 +902,47 @@
             setVideoPostProcessingNode(
              mEffectsSettings[i].VideoEffectType, FALSE);
         }
-
     }
 
-    if(mCurrentVideoEffect != VIDEO_EFFECT_NONE) {
+    //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) {
             LOGE("doVideoPostProcessing returned err");
@@ -1450,6 +1497,7 @@
     mQueue.postEvent(mProgressCbEvent);
 }
 
+
 void PreviewPlayer::onProgressCbEvent() {
     Mutex::Autolock autoLock(mLock);
     if (!mProgressCbEventPending) {
@@ -1467,6 +1515,32 @@
     }
 }
 
+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) {
 
diff --git a/libvideoeditor/lvpp/PreviewPlayer.h b/libvideoeditor/lvpp/PreviewPlayer.h
old mode 100755
new mode 100644
index ebbdec8..59448ad
--- a/libvideoeditor/lvpp/PreviewPlayer.h
+++ b/libvideoeditor/lvpp/PreviewPlayer.h
@@ -168,6 +168,7 @@
     M4OSA_UInt32 mAudioMixStoryBoardTS;
     M4OSA_UInt32 mCurrentMediaBeginCutTime;
     M4OSA_UInt32 mCurrentMediaVolumeValue;
+    M4OSA_UInt32 mCurrFramingEffectIndex;
 
     uint32_t mNumberEffects;
     uint32_t mPlayBeginTimeMsec;
@@ -179,6 +180,10 @@
     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 @@
     void postProgressCallbackEvent_l();
     void onProgressCbEvent();
 
+    void postOverlayUpdateEvent_l();
+    void onUpdateOverlayEvent();
+
     status_t setDataSource_l_jpg();
 
     status_t prepare_l();
diff --git a/libvideoeditor/lvpp/VideoEditorPreviewController.cpp b/libvideoeditor/lvpp/VideoEditorPreviewController.cpp
index 52aa87e..b76eac6 100755
--- a/libvideoeditor/lvpp/VideoEditorPreviewController.cpp
+++ b/libvideoeditor/lvpp/VideoEditorPreviewController.cpp
@@ -20,7 +20,7 @@
 #include "VideoEditorPreviewController.h"

 

 namespace android {

-

+ 

 #define PREVIEW_THREAD_STACK_SIZE                           (65536)

 

 VideoEditorPreviewController::VideoEditorPreviewController()

@@ -738,7 +738,9 @@
 }

 

 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 @@
 

     // 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 @@
             }

         }

 

+        //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 @@
                 }

             }

             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 @@
             LOGV("MEDIA_PREPARED");

             break;

         case MEDIA_PLAYBACK_COMPLETE:

+        {

             LOGV("notify:MEDIA_PLAYBACK_COMPLETE");

             pController->mPlayerState = VePlayerIdle;

 

@@ -1069,31 +1101,40 @@
                  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));

+                 pController->mJniCookie, MSG_TYPE_PROGRESS_INDICATION,

+                 &playedDuration);

 

             M4OSA_semaphorePost(pController->mSemThreadWait);

             break;

-         case MEDIA_ERROR:

+        }

+        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 @@
                     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;

diff --git a/libvideoeditor/lvpp/VideoEditorPreviewController.h b/libvideoeditor/lvpp/VideoEditorPreviewController.h
index 5828c5f..d2a5645 100755
--- a/libvideoeditor/lvpp/VideoEditorPreviewController.h
+++ b/libvideoeditor/lvpp/VideoEditorPreviewController.h
@@ -53,7 +53,8 @@
 

 

 // 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 {

 

@@ -62,26 +63,27 @@
     virtual ~VideoEditorPreviewController();

 

     M4OSA_ERR loadEditSettings(M4VSS3GPP_EditSettings* pSettings,

-     M4xVSS_AudioMixingSettings* bgmSettings);

+        M4xVSS_AudioMixingSettings* bgmSettings);

 

     M4OSA_ERR setSurface(const sp<Surface> &surface);

 

     M4OSA_ERR startPreview(M4OSA_UInt32 fromMS, M4OSA_Int32 toMs,

-     M4OSA_UInt16 callBackAfterFrameCount, M4OSA_Bool loop) ;

+        M4OSA_UInt16 callBackAfterFrameCount, M4OSA_Bool loop) ;

 

     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);

 

     M4OSA_Void setJniCallback(void* cookie,

-     jni_progress_callback_fct callbackFct);

+        jni_progress_callback_fct callbackFct);

 

     M4OSA_ERR setPreviewFrameRenderingMode(M4xVSS_MediaRendering mode,

-     M4VIDEOEDITING_VideoFrameSize outputVideoSize);

+        M4VIDEOEDITING_VideoFrameSize outputVideoSize);

 

 private:

     sp<VideoEditorPlayer> mVePlayer[NBPLAYER_INSTANCES];