Fix for the issue: TestPreviewWithTransition fails (4133108)

Change-Id: I53eb798f4f86e83f8a4668c7256241367c1ccbe4
diff --git a/libvideoeditor/lvpp/PreviewPlayer.cpp b/libvideoeditor/lvpp/PreviewPlayer.cpp
index babe957..8618221 100755
--- a/libvideoeditor/lvpp/PreviewPlayer.cpp
+++ b/libvideoeditor/lvpp/PreviewPlayer.cpp
@@ -594,9 +594,15 @@
         LOGV("MEDIA_PLAYBACK_COMPLETE");
         //pause before sending event
         pause_l(true /* at eos */);
+
+        //This lock is used to syncronize onStreamDone() in PreviewPlayer and
+        //stopPreview() in PreviewController
+        Mutex::Autolock autoLock(mLockControl);
         notifyListener_l(MEDIA_PLAYBACK_COMPLETE);
 
         mFlags |= AT_EOS;
+        LOGV("onStreamDone end");
+        return;
     }
 }
 
@@ -1490,6 +1496,16 @@
     return OK;
 }
 
+void PreviewPlayer::acquireLock() {
+    LOGV("acquireLock");
+    mLockControl.lock();
+}
+
+void PreviewPlayer::releaseLock() {
+    LOGV("releaseLock");
+    mLockControl.unlock();
+}
+
 status_t PreviewPlayer::resume() {
     LOGV("resume");
     Mutex::Autolock autoLock(mLock);
diff --git a/libvideoeditor/lvpp/PreviewPlayer.h b/libvideoeditor/lvpp/PreviewPlayer.h
old mode 100644
new mode 100755
index 0800115..b3a32bc
--- a/libvideoeditor/lvpp/PreviewPlayer.h
+++ b/libvideoeditor/lvpp/PreviewPlayer.h
@@ -68,6 +68,8 @@
 
     status_t suspend();
     status_t resume();
+    void acquireLock();
+    void releaseLock();
 
     status_t prepare();
     status_t setDataSource(
@@ -202,6 +204,7 @@
     bool mIsFiftiesEffectStarted;
     int64_t mImageFrameTimeUs;
     bool mStartNextPlayer;
+    mutable Mutex mLockControl;
 
     M4VIFI_UInt8*  mFrameRGBBuffer;
     M4VIFI_UInt8*  mFrameYUVBuffer;
diff --git a/libvideoeditor/lvpp/VideoEditorPlayer.cpp b/libvideoeditor/lvpp/VideoEditorPlayer.cpp
index fe99472..fbf005f 100755
--- a/libvideoeditor/lvpp/VideoEditorPlayer.cpp
+++ b/libvideoeditor/lvpp/VideoEditorPlayer.cpp
@@ -178,6 +178,16 @@
 status_t VideoEditorPlayer::resume() {

     LOGV("resume");

     return mPlayer->resume();

+}
+
+void VideoEditorPlayer::acquireLock() {
+    LOGV("acquireLock");
+    mPlayer->acquireLock();
+}
+

+void VideoEditorPlayer::releaseLock() {

+    LOGV("releaseLock");

+    mPlayer->releaseLock();

 }

 

 status_t VideoEditorPlayer::invoke(const Parcel &request, Parcel *reply) {

diff --git a/libvideoeditor/lvpp/VideoEditorPlayer.h b/libvideoeditor/lvpp/VideoEditorPlayer.h
index 1febef4..6c5ca24 100755
--- a/libvideoeditor/lvpp/VideoEditorPlayer.h
+++ b/libvideoeditor/lvpp/VideoEditorPlayer.h
@@ -116,8 +116,10 @@
     virtual status_t invoke(const Parcel &request, Parcel *reply);

     virtual void setAudioSink(const sp<AudioSink> &audioSink);

     virtual status_t suspend();

-    virtual status_t resume();

-

+    virtual status_t resume();
+    virtual void acquireLock();
+    virtual void releaseLock();

+
     virtual status_t getMetadata(

                         const media::Metadata::Filter& ids, Parcel *records);

 

diff --git a/libvideoeditor/lvpp/VideoEditorPreviewController.cpp b/libvideoeditor/lvpp/VideoEditorPreviewController.cpp
index 3e3d161..2e2ae22 100755
--- a/libvideoeditor/lvpp/VideoEditorPreviewController.cpp
+++ b/libvideoeditor/lvpp/VideoEditorPreviewController.cpp
@@ -681,10 +681,15 @@
                 // Return the last rendered frame time stamp

                 mVePlayer[mActivePlayerIndex]->getLastRenderedTimeMs(&lastRenderedFrameTimeMs);

             }

-

-            LOGV("stopPreview: clearing mVePlayer");

-            mVePlayer[playerInst].clear();

+
+            //This is used to syncronize onStreamDone() in PreviewPlayer and
+            //stopPreview() in PreviewController

+            sp<VideoEditorPlayer> temp = mVePlayer[playerInst];
+            temp->acquireLock();
+            LOGV("stopPreview: clearing mVePlayer");
+            mVePlayer[playerInst].clear();
             mVePlayer[playerInst] = NULL;

+            temp->releaseLock();
         }

     }

     LOGV("stopPreview: clear audioSink and audioPlayer");

@@ -1124,7 +1129,7 @@
              }

         }

         LOGV("threadProc: sem wait returned err = 0x%x", err);

-    }

+    }
 

     //Always return M4NO_ERROR to ensure the thread keeps running

     return M4NO_ERROR;

@@ -1186,7 +1191,8 @@
             {

                 Mutex::Autolock autoLock(pController->mLockSem);

                 if (pController->mSemThreadWait != NULL) {

-                    M4OSA_semaphorePost(pController->mSemThreadWait);

+                    M4OSA_semaphorePost(pController->mSemThreadWait);
+                    return;
                 }

             }