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
Binary files differ
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];