OSDN Git Service

Fix for ISSUE 3370836 - Overlay optmization.
authorDharmaray Kundargi <dharmaray@google.com>
Sat, 22 Jan 2011 00:58:31 +0000 (16:58 -0800)
committerDharmaray Kundargi <dharmaray@google.com>
Wed, 26 Jan 2011 08:38:02 +0000 (00:38 -0800)
Change-Id: I9c6657f6fdab0fa815201d8b26b8c90700663c12

libvideoeditor/lvpp/PreviewPlayer.cpp [changed mode: 0755->0644]
libvideoeditor/lvpp/PreviewPlayer.h [changed mode: 0755->0644]
libvideoeditor/lvpp/VideoEditorPreviewController.cpp
libvideoeditor/lvpp/VideoEditorPreviewController.h

old mode 100755 (executable)
new mode 100644 (file)
index 4738fdd..4d63a2f
@@ -143,7 +143,8 @@ PreviewPlayer::PreviewPlayer()
       mFrameRGBBuffer(NULL),
       mFrameYUVBuffer(NULL),
       mReportedWidth(0),
-      mReportedHeight(0) {
+      mReportedHeight(0),
+      mCurrFramingEffectIndex(0) {
 
     mVideoRenderer = NULL;
     mLastVideoBuffer = NULL;
@@ -158,23 +159,28 @@ PreviewPlayer::PreviewPlayer()
     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 @@ 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,10 +902,47 @@ 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) {
+
+    if (mCurrentVideoEffect != VIDEO_EFFECT_NONE) {
         err1 = doVideoPostProcessing();
         if(err1 != M4NO_ERROR) {
             LOGE("doVideoPostProcessing returned err");
@@ -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) {
 
old mode 100755 (executable)
new mode 100644 (file)
index ebbdec8..59448ad
@@ -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();
index 52aa87e..b76eac6 100755 (executable)
@@ -20,7 +20,7 @@
 #include "VideoEditorPreviewController.h"\r
 \r
 namespace android {\r
-\r
\r
 #define PREVIEW_THREAD_STACK_SIZE                           (65536)\r
 \r
 VideoEditorPreviewController::VideoEditorPreviewController()\r
@@ -738,7 +738,9 @@ M4OSA_ERR VideoEditorPreviewController::clearSurface(
 }\r
 \r
 M4OSA_ERR VideoEditorPreviewController::renderPreviewFrame(\r
-    const sp<Surface> &surface, VideoEditor_renderPreviewFrameStr* pFrameInfo) {\r
+            const sp<Surface> &surface,\r
+            VideoEditor_renderPreviewFrameStr* pFrameInfo,\r
+            VideoEditorCurretEditInfo *pCurrEditInfo) {\r
 \r
     M4OSA_ERR err = M4NO_ERROR;\r
     M4OSA_UInt32 i = 0, iIncrementedDuration = 0, tnTimeMs=0, framesize =0;\r
@@ -749,7 +751,9 @@ M4OSA_ERR VideoEditorPreviewController::renderPreviewFrame(
 \r
     // Get the Isurface to be passed to renderer\r
     mISurface = surface->getISurface();\r
-\r
+    if (pCurrEditInfo != NULL) {\r
+        pCurrEditInfo->overlaySettingsIndex = -1;\r
+    }\r
     // Delete previous renderer instance\r
     if(mTarget != NULL) {\r
         delete mTarget;\r
@@ -796,6 +800,32 @@ M4OSA_ERR VideoEditorPreviewController::renderPreviewFrame(
             }\r
         }\r
 \r
+        //Provide the overlay Update indication when there is an overlay effect\r
+        if (mCurrentVideoEffect == VIDEO_EFFECT_FRAMING) {\r
+            int index;\r
+            mCurrentVideoEffect = VIDEO_EFFECT_NONE; //never apply framing here.\r
+\r
+            // Find the effect in effectSettings array\r
+            for (index = 0; index < mNumberEffects; index++) {\r
+                if(mEffectsSettings[index].VideoEffectType ==\r
+                    M4xVSS_kVideoEffectType_Framing) {\r
+\r
+                    if((mEffectsSettings[index].uiStartTime <= pFrameInfo->timeMs) &&\r
+                        ((mEffectsSettings[index].uiStartTime+\r
+                        mEffectsSettings[index].uiDuration) >= pFrameInfo->timeMs))\r
+                    {\r
+                        break;\r
+                    }\r
+                }\r
+            }\r
+            if ((index < mNumberEffects) && (pCurrEditInfo != NULL)) {\r
+                pCurrEditInfo->overlaySettingsIndex = index;\r
+                LOGV("Framing index = %d", index);\r
+            } else {\r
+                LOGV("No framing effects found");\r
+            }\r
+        }\r
+\r
         if(mCurrentVideoEffect != VIDEO_EFFECT_NONE) {\r
             err = applyVideoEffect((M4OSA_Void *)pFrameStr->pBuffer,\r
              OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth,\r
@@ -958,9 +988,10 @@ M4OSA_ERR VideoEditorPreviewController::threadProc(M4OSA_Void* param) {
                 }\r
             }\r
             else {\r
+                M4OSA_UInt32 endArgs = 0;\r
                 if(pController->mJniCallback != NULL) {\r
                     pController->mJniCallback(\r
-                     pController->mJniCookie, MSG_TYPE_PREVIEW_END, 0);\r
+                     pController->mJniCookie, MSG_TYPE_PREVIEW_END, &endArgs);\r
                 }\r
                 pController->mPlayerState = VePlayerAutoStop;\r
 \r
@@ -1054,6 +1085,7 @@ void VideoEditorPreviewController::notify(
             LOGV("MEDIA_PREPARED");\r
             break;\r
         case MEDIA_PLAYBACK_COMPLETE:\r
+        {\r
             LOGV("notify:MEDIA_PLAYBACK_COMPLETE");\r
             pController->mPlayerState = VePlayerIdle;\r
 \r
@@ -1069,31 +1101,40 @@ void VideoEditorPreviewController::notify(
                  pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime\r
                   - pController->mClipList[pController->mCurrentClipNumber]->uiBeginCutTime;\r
             }\r
+\r
+            M4OSA_UInt32 playedDuration = clipDuration+pController->mCurrentPlayedDuration;\r
             pController->mJniCallback(\r
-             pController->mJniCookie, MSG_TYPE_PROGRESS_INDICATION,\r
-             (clipDuration+pController->mCurrentPlayedDuration));\r
+                 pController->mJniCookie, MSG_TYPE_PROGRESS_INDICATION,\r
+                 &playedDuration);\r
 \r
             M4OSA_semaphorePost(pController->mSemThreadWait);\r
             break;\r
-         case MEDIA_ERROR:\r
+        }\r
+        case MEDIA_ERROR:\r
+        {\r
+            int err_val = ext1;\r
           // Always log errors.\r
           // ext1: Media framework error code.\r
           // ext2: Implementation dependant error code.\r
             LOGE("MEDIA_ERROR; error (%d, %d)", ext1, ext2);\r
             if(pController->mJniCallback != NULL) {\r
                 pController->mJniCallback(pController->mJniCookie,\r
-                 MSG_TYPE_PLAYER_ERROR, ext1);\r
+                 MSG_TYPE_PLAYER_ERROR, &err_val);\r
             }\r
             break;\r
+        }\r
         case MEDIA_INFO:\r
+        {\r
+            int info_val = ext2;\r
             // ext1: Media framework error code.\r
             // ext2: Implementation dependant error code.\r
             //LOGW("MEDIA_INFO; info/warning (%d, %d)", ext1, ext2);\r
             if(pController->mJniCallback != NULL) {\r
                 pController->mJniCallback(pController->mJniCookie,\r
-                 MSG_TYPE_PROGRESS_INDICATION, ext2);\r
+                 MSG_TYPE_PROGRESS_INDICATION, &info_val);\r
             }\r
             break;\r
+        }\r
         case MEDIA_SEEK_COMPLETE:\r
             LOGV("MEDIA_SEEK_COMPLETE; Received seek complete");\r
             break;\r
@@ -1120,6 +1161,30 @@ void VideoEditorPreviewController::notify(
                     pController->mCurrentClipNumber+1);\r
             }\r
             break;\r
+        case 0xBBBBBBBB:\r
+        {\r
+            LOGV("VIDEO PLAYBACK, Update Overlay");\r
+            int overlayIndex = ext2;\r
+            VideoEditorCurretEditInfo *pEditInfo =\r
+                    (VideoEditorCurretEditInfo*)M4OSA_malloc(sizeof(VideoEditorCurretEditInfo),\r
+                    M4VS, (M4OSA_Char*)"Current Edit info");\r
+            //ext1 = 1; start the overlay display\r
+            //     = 2; Clear the overlay.\r
+            pEditInfo->overlaySettingsIndex = ext2;\r
+            pEditInfo->clipIndex = pController->mCurrentClipNumber;\r
+            LOGV("pController->mCurrentClipNumber = %d",pController->mCurrentClipNumber);\r
+            if (pController->mJniCallback != NULL) {\r
+                if (ext1 == 1) {\r
+                    pController->mJniCallback(pController->mJniCookie,\r
+                        MSG_TYPE_OVERLAY_UPDATE, pEditInfo);\r
+                } else {\r
+                    pController->mJniCallback(pController->mJniCookie,\r
+                        MSG_TYPE_OVERLAY_CLEAR, pEditInfo);\r
+                }\r
+            }\r
+            M4OSA_free((M4OSA_MemAddr32)pEditInfo);\r
+            break;\r
+        }\r
         default:\r
             LOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2);\r
             break;\r
index 5828c5f..d2a5645 100755 (executable)
@@ -53,7 +53,8 @@ typedef enum {
 \r
 \r
 // Callback mechanism from PreviewController to Jni  */\r
-typedef void (*jni_progress_callback_fct)(void* cookie, M4OSA_UInt32 msgType, M4OSA_UInt32 argc);\r
+typedef void (*jni_progress_callback_fct)(void* cookie, M4OSA_UInt32 msgType, void *argc);\r
+\r
 \r
 class VideoEditorPreviewController {\r
 \r
@@ -62,26 +63,27 @@ public:
     virtual ~VideoEditorPreviewController();\r
 \r
     M4OSA_ERR loadEditSettings(M4VSS3GPP_EditSettings* pSettings,\r
-     M4xVSS_AudioMixingSettings* bgmSettings);\r
+        M4xVSS_AudioMixingSettings* bgmSettings);\r
 \r
     M4OSA_ERR setSurface(const sp<Surface> &surface);\r
 \r
     M4OSA_ERR startPreview(M4OSA_UInt32 fromMS, M4OSA_Int32 toMs,\r
-     M4OSA_UInt16 callBackAfterFrameCount, M4OSA_Bool loop) ;\r
+        M4OSA_UInt16 callBackAfterFrameCount, M4OSA_Bool loop) ;\r
 \r
     M4OSA_ERR stopPreview();\r
 \r
     M4OSA_ERR renderPreviewFrame(const sp<Surface> &surface,\r
-     VideoEditor_renderPreviewFrameStr* pFrameInfo);\r
+        VideoEditor_renderPreviewFrameStr* pFrameInfo,\r
+        VideoEditorCurretEditInfo *pCurrEditInfo);\r
 \r
     M4OSA_ERR clearSurface(const sp<Surface> &surface,\r
      VideoEditor_renderPreviewFrameStr* pFrameInfo);\r
 \r
     M4OSA_Void setJniCallback(void* cookie,\r
-     jni_progress_callback_fct callbackFct);\r
+        jni_progress_callback_fct callbackFct);\r
 \r
     M4OSA_ERR setPreviewFrameRenderingMode(M4xVSS_MediaRendering mode,\r
-     M4VIDEOEDITING_VideoFrameSize outputVideoSize);\r
+        M4VIDEOEDITING_VideoFrameSize outputVideoSize);\r
 \r
 private:\r
     sp<VideoEditorPlayer> mVePlayer[NBPLAYER_INSTANCES];\r