OSDN Git Service

Bug fix: 3405930 Crash editing overlay text
authorGil Dobjanschi <virgild@google.com>
Mon, 31 Jan 2011 09:16:32 +0000 (01:16 -0800)
committerGil Dobjanschi <virgild@google.com>
Mon, 31 Jan 2011 11:57:15 +0000 (03:57 -0800)
Change-Id: Icd304ef8dde2b41812b14857dc3c112cc22d578e

media/java/android/media/videoeditor/AudioTrack.java
media/java/android/media/videoeditor/Effect.java
media/java/android/media/videoeditor/MediaArtistNativeHelper.java
media/java/android/media/videoeditor/MediaImageItem.java
media/java/android/media/videoeditor/MediaItem.java
media/java/android/media/videoeditor/MediaVideoItem.java
media/java/android/media/videoeditor/Overlay.java
media/java/android/media/videoeditor/OverlayFrame.java
media/java/android/media/videoeditor/VideoEditorImpl.java

index 9e68a5d..eeace13 100755 (executable)
@@ -267,14 +267,16 @@ public class AudioTrack {
             throw new IllegalArgumentException("Volume set exceeds maximum allowed value");
         }
 
-         if (volumePercent < 0) {
+        if (volumePercent < 0) {
             throw new IllegalArgumentException("Invalid Volume ");
         }
-        mVolumePercent = volumePercent;
+
         /**
          *  Force update of preview settings
          */
         mMANativeHelper.setGeneratePreview(true);
+
+        mVolumePercent = volumePercent;
     }
 
     /**
@@ -294,11 +296,11 @@ public class AudioTrack {
      *         the volume of this Audio Track to 0.
      */
     public void setMute(boolean muted) {
-        mMuted = muted;
         /**
          *  Force update of preview settings
          */
         mMANativeHelper.setGeneratePreview(true);
+        mMuted = muted;
     }
 
     /**
@@ -363,14 +365,15 @@ public class AudioTrack {
             throw new IllegalArgumentException("Invalid end time; is < 0");
         }
 
-        mBeginBoundaryTimeMs = beginMs;
-        mEndBoundaryTimeMs = endMs;
-
-        mTimelineDurationMs = mEndBoundaryTimeMs - mBeginBoundaryTimeMs;
         /**
          *  Force update of preview settings
          */
         mMANativeHelper.setGeneratePreview(true);
+
+        mBeginBoundaryTimeMs = beginMs;
+        mEndBoundaryTimeMs = endMs;
+
+        mTimelineDurationMs = mEndBoundaryTimeMs - mBeginBoundaryTimeMs;
     }
 
     /**
@@ -412,11 +415,11 @@ public class AudioTrack {
      */
     public void disableLoop() {
         if (mLoop) {
-            mLoop = false;
             /**
              *  Force update of preview settings
              */
             mMANativeHelper.setGeneratePreview(true);
+            mLoop = false;
         }
     }
 
@@ -434,11 +437,11 @@ public class AudioTrack {
      */
     public void disableDucking() {
         if (mIsDuckingEnabled) {
-            mIsDuckingEnabled = false;
             /**
              *  Force update of preview settings
              */
             mMANativeHelper.setGeneratePreview(true);
+            mIsDuckingEnabled = false;
         }
     }
 
@@ -462,13 +465,14 @@ public class AudioTrack {
                     + duckedTrackVolume);
         }
 
-        mDuckingThreshold = threshold;
-        mDuckedTrackVolume = duckedTrackVolume;
-        mIsDuckingEnabled = true;
         /**
          *  Force update of preview settings
          */
         mMANativeHelper.setGeneratePreview(true);
+
+        mDuckingThreshold = threshold;
+        mDuckedTrackVolume = duckedTrackVolume;
+        mIsDuckingEnabled = true;
     }
 
     /**
index 3362d47..c6b0839 100755 (executable)
@@ -105,8 +105,7 @@ public abstract class Effect {
         final long oldDurationMs = mDurationMs;
         mDurationMs = durationMs;
 
-        mMediaItem.invalidateTransitions(mStartTimeMs, oldDurationMs,
-                                         mStartTimeMs, mDurationMs);
+        mMediaItem.invalidateTransitions(mStartTimeMs, oldDurationMs, mStartTimeMs, mDurationMs);
     }
 
     /**
@@ -130,11 +129,11 @@ public abstract class Effect {
             throw new IllegalArgumentException("Start time is too large");
         }
 
+        getMediaItem().getNativeContext().setGeneratePreview(true);
         final long oldStartTimeMs = mStartTimeMs;
         mStartTimeMs = startTimeMs;
 
-        mMediaItem.invalidateTransitions(oldStartTimeMs, mDurationMs,
-                                         mStartTimeMs, mDurationMs);
+        mMediaItem.invalidateTransitions(oldStartTimeMs, mDurationMs, mStartTimeMs, mDurationMs);
     }
 
     /**
@@ -163,8 +162,7 @@ public abstract class Effect {
         mStartTimeMs = startTimeMs;
         mDurationMs = durationMs;
 
-        mMediaItem.invalidateTransitions(oldStartTimeMs, oldDurationMs,
-                                         mStartTimeMs, mDurationMs);
+        mMediaItem.invalidateTransitions(oldStartTimeMs, oldDurationMs, mStartTimeMs, mDurationMs);
     }
 
     /**
index 27ea3c0..ba9403d 100644 (file)
@@ -20,9 +20,10 @@ import java.io.File;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.nio.IntBuffer;
-import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.concurrent.Semaphore;
+
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
@@ -39,22 +40,29 @@ import android.view.Surface;
  *This class provide Native methods to be used by MediaArtist {@hide}
  */
 class MediaArtistNativeHelper {
+    private static final String TAG = "MediaArtistNativeHelper";
 
     static {
         System.loadLibrary("videoeditor_jni");
     }
 
-    private final int MAX_THUMBNAIL_PERMITTED = 8;
+    private static final int MAX_THUMBNAIL_PERMITTED = 8;
+
+    public static final int TASK_LOADING_SETTINGS = 1;
+    public static final int TASK_ENCODING = 2;
+
+    /**
+     *  The resize paint
+     */
+    private static final Paint sResizePaint = new Paint(Paint.FILTER_BITMAP_FLAG);
 
     private final VideoEditor mVideoEditor;
 
-    public EditSettings mStoryBoardSettings;
+    private EditSettings mStoryBoardSettings;
 
     private String mOutputFilename;
 
-    EditSettings mEditSettings = null;
-
-    PreviewClipProperties mClipProperties = null;
+    private PreviewClipProperties mClipProperties = null;
 
     private EditSettings mPreviewEditSettings;
 
@@ -62,30 +70,24 @@ class MediaArtistNativeHelper {
 
     private AudioTrack mAudioTrack = null;
 
-    public boolean mInvalidatePreviewArray = true;
+    private boolean mInvalidatePreviewArray = true;
 
     private boolean mRegenerateAudio = true;
 
     private String mExportFilename = null;
 
-    private boolean mExportDone = false;
-
     private int mProgressToApp;
 
-    /**
-     *  The resize paint
+    /*
+     *  Semaphore to control preview calls
      */
-    private static final Paint sResizePaint = new Paint(Paint.FILTER_BITMAP_FLAG);
+    private final Semaphore mLock = new Semaphore(1, true);
 
     private String mRenderPreviewOverlayFile;
-    private int   mRenderPreviewRenderingMode;
+    private int mRenderPreviewRenderingMode;
 
     private boolean mIsFirstProgress;
 
-    public static final int TASK_LOADING_SETTINGS = 1;
-
-    public static final int TASK_ENCODING = 2;
-
     private static final String AUDIO_TRACK_PCM_FILE = "AudioPcm.pcm";
 
     // Processing indication
@@ -98,33 +100,25 @@ class MediaArtistNativeHelper {
     public static final int PROCESSING_INTERMEDIATE3 = 13;
     public static final int PROCESSING_EXPORT        = 20;
 
-    private int    mProcessingState;
+    private int mProcessingState;
     private Object mProcessingObject;
-
     private PreviewProgressListener mPreviewProgressListener;
     private ExportProgressListener mExportProgressListener;
     private ExtractAudioWaveformProgressListener mExtractAudioWaveformProgressListener;
-    private MediaProcessingProgressListener      mMediaProcessingProgressListener;
+    private MediaProcessingProgressListener mMediaProcessingProgressListener;
     private final String mProjectPath;
 
     private long mPreviewProgress;
 
     private String mAudioTrackPCMFilePath;
 
-    int mTotalClips = 0;
-
-    int mPreviewEffectsSize = 0;
+    private int mTotalClips = 0;
 
     private boolean mErrorFlagSet = false;
 
     @SuppressWarnings("unused")
     private int mManualEditContext;
 
-
-    List<Effect> mMediaEffectList;
-
-    List<Overlay> mMediaOverLayList;
-
     /* Listeners */
 
     /**
@@ -763,7 +757,6 @@ class MediaArtistNativeHelper {
 
         /** Internal error. */
         public static final int ERR_INTERNAL = 255;
-
     }
 
     /**
@@ -1203,9 +1196,8 @@ class MediaArtistNativeHelper {
     }
 
     /**
-     * Defines transition behaviours.
-     **/
-
+     * Defines transition behaviors.
+     */
     public static final class TransitionBehaviour {
 
         /** The transition uses an increasing speed. */
@@ -1230,7 +1222,9 @@ class MediaArtistNativeHelper {
         public static final int FAST_MIDDLE = 4;
     }
 
-    /** Defines settings for the background music. */
+    /**
+     * Defines settings for the background music.
+     */
     public static class BackgroundMusicSettings {
 
         /** Background music file. */
@@ -1273,7 +1267,6 @@ class MediaArtistNativeHelper {
         public int lowVolume;
 
         public boolean isLooping;
-
     }
 
     /** Defines settings for an effect. */
@@ -1568,7 +1561,6 @@ class MediaArtistNativeHelper {
         boolean bInDucking_enable;
 
         String pcmFilePath;
-
     }
 
     /** Encapsulates preview clips and effect settings */
@@ -1775,7 +1767,6 @@ class MediaArtistNativeHelper {
         public int audioVolumeValue;
 
         public String Id;
-
     }
 
     /**
@@ -1796,8 +1787,6 @@ class MediaArtistNativeHelper {
         if (mStoryBoardSettings == null)
             mStoryBoardSettings = new EditSettings();
 
-        mMediaEffectList = new ArrayList<Effect>();
-        mMediaOverLayList = new ArrayList<Overlay>();
         _init(mProjectPath, "null");
         mAudioTrackPCMFilePath = null;
     }
@@ -1879,7 +1868,7 @@ class MediaArtistNativeHelper {
                 case PROCESSING_NONE:
 
                 default:
-                    Log.e("MediaArtistNativeHelper", "ERROR unexpected State=" + mProcessingState);
+                    Log.e(TAG, "ERROR unexpected State=" + mProcessingState);
                     return;
             }
             if ((mProgressToApp != actualProgress) && (actualProgress != 0)) {
@@ -1888,8 +1877,7 @@ class MediaArtistNativeHelper {
 
                 if (mMediaProcessingProgressListener != null) {
                     // Send the progress indication
-                    mMediaProcessingProgressListener.onProgress(mProcessingObject,
-                                                                action,
+                    mMediaProcessingProgressListener.onProgress(mProcessingObject, action,
                                                                 actualProgress);
                 }
             }
@@ -1899,8 +1887,7 @@ class MediaArtistNativeHelper {
                     /*
                      *  Send the progress indication
                      */
-                    mMediaProcessingProgressListener.onProgress(mProcessingObject,
-                                                                action,
+                    mMediaProcessingProgressListener.onProgress(mProcessingObject, action,
                                                                 actualProgress);
                 }
                 mProgressToApp = 1;
@@ -1944,15 +1931,14 @@ class MediaArtistNativeHelper {
     /**
      * Release the native helper object
      */
-    public void releaseNativeHelper() {
+    void releaseNativeHelper() {
         try {
             release();
         } catch (IllegalStateException ex) {
-            Log.e("MediaArtistNativeHelper",
-            "Illegal State exeption caught in releaseNativeHelper");
+            Log.e(TAG, "Illegal State exeption caught in releaseNativeHelper");
             throw ex;
         } catch (RuntimeException ex) {
-            Log.e("MediaArtistNativeHelper", "Runtime exeption caught in releaseNativeHelper");
+            Log.e(TAG, "Runtime exeption caught in releaseNativeHelper");
             throw ex;
         }
     }
@@ -1962,9 +1948,7 @@ class MediaArtistNativeHelper {
      */
     @SuppressWarnings("unused")
     private void onAudioGraphExtractProgressUpdate(int progress, boolean isVideo) {
-
-        if ((mExtractAudioWaveformProgressListener != null) && (progress > 0))
-        {
+        if ((mExtractAudioWaveformProgressListener != null) && (progress > 0)) {
             mExtractAudioWaveformProgressListener.onProgress(progress);
         }
     }
@@ -1974,8 +1958,7 @@ class MediaArtistNativeHelper {
      *
      * @param effects The reference of EffectColor
      *
-     * @return The populated effect settings in EffectSettings
-     * reference
+     * @return The populated effect settings in EffectSettings reference
      */
     EffectSettings getEffectSettings(EffectColor effects) {
         EffectSettings effectSettings = new EffectSettings();
@@ -2017,8 +2000,7 @@ class MediaArtistNativeHelper {
      *
      * @param overlay The reference of OverlayFrame
      *
-     * @return The populated overlay settings in EffectSettings
-     * reference
+     * @return The populated overlay settings in EffectSettings reference
      */
     EffectSettings getOverlaySettings(OverlayFrame overlay) {
         EffectSettings effectSettings = new EffectSettings();
@@ -2039,7 +2021,7 @@ class MediaArtistNativeHelper {
                 try {
                     (overlay).save(mProjectPath);
                 } catch (IOException e) {
-                    Log.e("MediaArtistNativeHelper","getOverlaySettings : File not found");
+                    Log.e(TAG, "getOverlaySettings : File not found");
                 }
                 effectSettings.framingFile = overlay.getFilename();
             }
@@ -2098,13 +2080,12 @@ class MediaArtistNativeHelper {
         int aspectRatio;
         if (overlay.getMediaItem() instanceof MediaImageItem) {
             if (((MediaImageItem)overlay.getMediaItem()).getGeneratedImageClip() != null) {
-                //Kenburns was applied
+                // Ken Burns was applied
                 mediaItemHeight = ((MediaImageItem)overlay.getMediaItem()).getGeneratedClipHeight();
                 aspectRatio = getAspectRatio(
                     ((MediaImageItem)overlay.getMediaItem()).getGeneratedClipWidth()
                     , mediaItemHeight);
-            }
-            else {
+            } else {
                 //For image get the scaled height. Aspect ratio would remain the same
                 mediaItemHeight = ((MediaImageItem)overlay.getMediaItem()).getScaledHeight();
                 aspectRatio = overlay.getMediaItem().getAspectRatio();
@@ -2148,7 +2129,7 @@ class MediaArtistNativeHelper {
      *
      * @return The frame rate from one of the defined enum values
      */
-    public int GetClosestVideoFrameRate(int averageFrameRate) {
+    int GetClosestVideoFrameRate(int averageFrameRate) {
         if (averageFrameRate >= 25) {
             return VideoFrameRate.FR_30_FPS;
         } else if (averageFrameRate >= 20) {
@@ -2172,8 +2153,7 @@ class MediaArtistNativeHelper {
      * Helper function to adjust the effect or overlay start time
      * depending on the begin and end boundary time of meddia item
      */
-    public void adjustEffectsStartTimeAndDuration(EffectSettings lEffect,
-                                                  int beginCutTime,
+    public void adjustEffectsStartTimeAndDuration(EffectSettings lEffect, int beginCutTime,
                                                   int endCutTime) {
 
         int effectStartTime = 0;
@@ -2271,20 +2251,20 @@ class MediaArtistNativeHelper {
         try {
             err = nativeGenerateClip(editSettings);
         } catch (IllegalArgumentException ex) {
-            Log.e("MediaArtistNativeHelper","Illegal Argument exception in load settings");
+            Log.e(TAG, "Illegal Argument exception in load settings");
             return -1;
         } catch (IllegalStateException ex) {
-            Log.e("MediaArtistNativeHelper","Illegal state exception in load settings");
+            Log.e(TAG, "Illegal state exception in load settings");
             return -1;
         } catch (RuntimeException ex) {
-            Log.e("MediaArtistNativeHelper", "Runtime exception in load settings");
+            Log.e(TAG, "Runtime exception in load settings");
             return -1;
         }
         return err;
     }
 
     /**
-     * Init function to initialise the  ClipSettings reference to
+     * Init function to initialiZe the  ClipSettings reference to
      * default values
      *
      * @param lclipSettings The ClipSettings reference
@@ -2357,9 +2337,8 @@ class MediaArtistNativeHelper {
             //editSettings.videoFormat = VideoFormat.MPEG4;
             editSettings.videoFormat = VideoFormat.H264;
             editSettings.videoFrameRate = VideoFrameRate.FR_30_FPS;
-            editSettings.videoFrameSize = findVideoResolution(mVideoEditor.getAspectRatio(), m
-                    .getHeight());
-
+            editSettings.videoFrameSize = findVideoResolution(mVideoEditor.getAspectRatio(),
+                    m.getHeight());
         } else {
             MediaImageItem m = (MediaImageItem)lMediaItem;
             editSettings.audioBitrate = Bitrate.BR_64_KBPS;
@@ -2370,8 +2349,8 @@ class MediaArtistNativeHelper {
             editSettings.videoBitrate = Bitrate.BR_5_MBPS;
             editSettings.videoFormat = VideoFormat.H264;
             editSettings.videoFrameRate = VideoFrameRate.FR_30_FPS;
-            editSettings.videoFrameSize = findVideoResolution(mVideoEditor.getAspectRatio(), m
-                    .getScaledHeight());
+            editSettings.videoFrameSize = findVideoResolution(mVideoEditor.getAspectRatio(),
+                    m.getScaledHeight());
         }
 
         editSettings.outputFile = EffectClipPath;
@@ -2466,11 +2445,9 @@ class MediaArtistNativeHelper {
                 clip2Height = ((MediaImageItem)m2).getScaledHeight();
             }
             if (clip1Height > clip2Height) {
-                videoSize = findVideoResolution(mVideoEditor.getAspectRatio(),
-                                                                   clip1Height);
+                videoSize = findVideoResolution(mVideoEditor.getAspectRatio(), clip1Height);
             } else {
-                videoSize = findVideoResolution(mVideoEditor.getAspectRatio(),
-                                                                   clip2Height);
+                videoSize = findVideoResolution(mVideoEditor.getAspectRatio(), clip2Height);
             }
         } else if (m1 == null && m2 != null) {
             if (m2 instanceof MediaVideoItem) {
@@ -2478,16 +2455,14 @@ class MediaArtistNativeHelper {
             } else if (m2 instanceof MediaImageItem) {
                 clip2Height = ((MediaImageItem)m2).getScaledHeight();
             }
-            videoSize = findVideoResolution(mVideoEditor.getAspectRatio(),
-                                                                   clip2Height);
+            videoSize = findVideoResolution(mVideoEditor.getAspectRatio(), clip2Height);
         } else if (m1 != null && m2 == null) {
             if (m1 instanceof MediaVideoItem) {
                 clip1Height = m1.getHeight();
             } else if (m1 instanceof MediaImageItem) {
                 clip1Height = ((MediaImageItem)m1).getScaledHeight();
             }
-            videoSize = findVideoResolution(mVideoEditor.getAspectRatio(),
-                                                                   clip1Height);
+            videoSize = findVideoResolution(mVideoEditor.getAspectRatio(), clip1Height);
         }
         return videoSize;
     }
@@ -2542,7 +2517,7 @@ class MediaArtistNativeHelper {
      *
      * @param m1 Media item associated with effect
      * @param effectSettings The EffectSettings reference containing
-     * effect specific data
+     *      effect specific data
      * @param beginCutTime The begin cut time of the clip associated with effect
      * @param endCutTime The end cut time of the clip associated with effect
      * @param storyBoardTime The current story board time
@@ -2551,8 +2526,6 @@ class MediaArtistNativeHelper {
      */
     private int populateEffects(MediaItem m, EffectSettings[] effectSettings, int i,
             int beginCutTime, int endCutTime, int storyBoardTime) {
-        List<Effect> effects = m.getAllEffects();
-        List<Overlay> overlays = m.getAllOverlays();
 
         if (m.getBeginTransition() != null && m.getBeginTransition().getDuration() > 0
                 && m.getEndTransition() != null && m.getEndTransition().getDuration() > 0) {
@@ -2566,19 +2539,20 @@ class MediaArtistNativeHelper {
             beginCutTime += m.getBeginTransition().getDuration();
         }
 
+        final List<Effect> effects = m.getAllEffects();
+        final List<Overlay> overlays = m.getAllOverlays();
         for (Effect effect : effects) {
             if (effect instanceof EffectColor) {
                 effectSettings[i] = getEffectSettings((EffectColor)effect);
-                adjustEffectsStartTimeAndDuration(effectSettings[i],
-                                                      beginCutTime, endCutTime);
+                adjustEffectsStartTimeAndDuration(effectSettings[i], beginCutTime, endCutTime);
                 effectSettings[i].startTime += storyBoardTime;
                 i++;
             }
         }
+
         for (Overlay overlay : overlays) {
             effectSettings[i] = getOverlaySettings((OverlayFrame)overlay);
-            adjustEffectsStartTimeAndDuration(effectSettings[i],
-                                                      beginCutTime, endCutTime);
+            adjustEffectsStartTimeAndDuration(effectSettings[i], beginCutTime, endCutTime);
             effectSettings[i].startTime += storyBoardTime;
             i++;
         }
@@ -2596,31 +2570,24 @@ class MediaArtistNativeHelper {
                                          Properties clipProperties, MediaItem m) {
         if (m.getBeginTransition() != null && m.getBeginTransition().getDuration() > 0
                 && m.getEndTransition() != null && m.getEndTransition().getDuration() > 0) {
-
             clipSettings.beginCutTime += m.getBeginTransition().getDuration();
             clipSettings.endCutTime -= m.getEndTransition().getDuration();
-
         } else if (m.getBeginTransition() == null && m.getEndTransition() != null
                 && m.getEndTransition().getDuration() > 0) {
-
             clipSettings.endCutTime -= m.getEndTransition().getDuration();
-
         } else if (m.getEndTransition() == null && m.getBeginTransition() != null
                 && m.getBeginTransition().getDuration() > 0) {
-
             clipSettings.beginCutTime += m.getBeginTransition().getDuration();
         }
-        clipProperties.duration = clipSettings.endCutTime -
-                                                      clipSettings.beginCutTime;
+
+        clipProperties.duration = clipSettings.endCutTime - clipSettings.beginCutTime;
 
         if (clipProperties.videoDuration != 0) {
-            clipProperties.videoDuration = clipSettings.endCutTime -
-                                                      clipSettings.beginCutTime;
+            clipProperties.videoDuration = clipSettings.endCutTime - clipSettings.beginCutTime;
         }
 
         if (clipProperties.audioDuration != 0) {
-            clipProperties.audioDuration = clipSettings.endCutTime -
-                                                      clipSettings.beginCutTime;
+            clipProperties.audioDuration = clipSettings.endCutTime - clipSettings.beginCutTime;
         }
     }
 
@@ -2642,27 +2609,25 @@ class MediaArtistNativeHelper {
         editSettings.clipSettingsArray[index].clipPath = transition.getFilename();
         editSettings.clipSettingsArray[index].fileType = FileType.THREE_GPP;
         editSettings.clipSettingsArray[index].beginCutTime = 0;
-        editSettings.clipSettingsArray[index].endCutTime =
-                                                  (int)transition.getDuration();
-        editSettings.clipSettingsArray[index].mediaRendering =
-                                                   MediaRendering.BLACK_BORDERS;
+        editSettings.clipSettingsArray[index].endCutTime = (int)transition.getDuration();
+        editSettings.clipSettingsArray[index].mediaRendering = MediaRendering.BLACK_BORDERS;
+
         try {
             clipPropertiesArray.clipProperties[index] =
-                                   getMediaProperties(transition.getFilename());
+                getMediaProperties(transition.getFilename());
         } catch (Exception e) {
             throw new IllegalArgumentException("Unsupported file or file not found");
         }
+
         clipPropertiesArray.clipProperties[index].Id = null;
         clipPropertiesArray.clipProperties[index].audioVolumeValue = 100;
-        clipPropertiesArray.clipProperties[index].duration =
-                                                  (int)transition.getDuration();
+        clipPropertiesArray.clipProperties[index].duration = (int)transition.getDuration();
         if (clipPropertiesArray.clipProperties[index].videoDuration != 0) {
-            clipPropertiesArray.clipProperties[index].videoDuration =
-                                                  (int)transition.getDuration();
+            clipPropertiesArray.clipProperties[index].videoDuration = (int)transition.getDuration();
         }
+
         if (clipPropertiesArray.clipProperties[index].audioDuration != 0) {
-            clipPropertiesArray.clipProperties[index].audioDuration =
-                                                  (int)transition.getDuration();
+            clipPropertiesArray.clipProperties[index].audioDuration = (int)transition.getDuration();
         }
     }
 
@@ -2676,10 +2641,10 @@ class MediaArtistNativeHelper {
     private void adjustVolume(MediaItem m, PreviewClipProperties clipProperties,
                               int index) {
         if (m instanceof MediaVideoItem) {
-            boolean videoMuted = ((MediaVideoItem)m).isMuted();
+            final boolean videoMuted = ((MediaVideoItem)m).isMuted();
             if (videoMuted == false) {
-                mClipProperties.clipProperties[index].audioVolumeValue = ((MediaVideoItem)m)
-                .getVolume();
+                mClipProperties.clipProperties[index].audioVolumeValue =
+                    ((MediaVideoItem)m).getVolume();
             } else {
                 mClipProperties.clipProperties[index].audioVolumeValue = 0;
             }
@@ -2725,22 +2690,22 @@ class MediaArtistNativeHelper {
     private int populateMediaItemProperties(MediaItem m, int index, int maxHeight) {
         mPreviewEditSettings.clipSettingsArray[index] = new ClipSettings();
         if (m instanceof MediaVideoItem) {
-            mPreviewEditSettings.clipSettingsArray[index] = ((MediaVideoItem)m)
-            .getVideoClipProperties();
+            mPreviewEditSettings.clipSettingsArray[index] =
+                ((MediaVideoItem)m).getVideoClipProperties();
             if (((MediaVideoItem)m).getHeight() > maxHeight) {
                 maxHeight = ((MediaVideoItem)m).getHeight();
             }
         } else if (m instanceof MediaImageItem) {
-            mPreviewEditSettings.clipSettingsArray[index] = ((MediaImageItem)m)
-            .getImageClipProperties();
+            mPreviewEditSettings.clipSettingsArray[index] =
+                ((MediaImageItem)m).getImageClipProperties();
             if (((MediaImageItem)m).getScaledHeight() > maxHeight) {
                 maxHeight = ((MediaImageItem)m).getScaledHeight();
             }
         }
         /** + Handle the image files here */
         if (mPreviewEditSettings.clipSettingsArray[index].fileType == FileType.JPG) {
-            mPreviewEditSettings.clipSettingsArray[index].clipDecodedPath = ((MediaImageItem)m)
-            .getDecodedImageFileName();
+            mPreviewEditSettings.clipSettingsArray[index].clipDecodedPath =
+                ((MediaImageItem)m).getDecodedImageFileName();
 
             mPreviewEditSettings.clipSettingsArray[index].clipOriginalPath =
                          mPreviewEditSettings.clipSettingsArray[index].clipPath;
@@ -2758,8 +2723,7 @@ class MediaArtistNativeHelper {
 
         if (mediaBGMList.size() == 1) {
             mAudioTrack = mediaBGMList.get(0);
-        } else
-        {
+        } else {
             mAudioTrack = null;
         }
 
@@ -2792,41 +2756,31 @@ class MediaArtistNativeHelper {
             mAudioSettings.ducking_threshold = mAudioTrack.getDuckingThreshhold();
             mAudioSettings.bInDucking_enable = mAudioTrack.isDuckingEnabled();
             mAudioTrackPCMFilePath = String.format(mProjectPath + "/" + AUDIO_TRACK_PCM_FILE);
-            //String.format(mProjectPath + "/" + "AudioPcm" + ".pcm");
             mAudioSettings.pcmFilePath = mAudioTrackPCMFilePath;
 
-            mPreviewEditSettings.backgroundMusicSettings =
-                                                  new BackgroundMusicSettings();
-            mPreviewEditSettings.backgroundMusicSettings.file =
-                                                         mAudioTrackPCMFilePath;
-            mPreviewEditSettings.backgroundMusicSettings.fileType =
-                                                      mAudioProperties.fileType;
+            mPreviewEditSettings.backgroundMusicSettings = new BackgroundMusicSettings();
+            mPreviewEditSettings.backgroundMusicSettings.file = mAudioTrackPCMFilePath;
+            mPreviewEditSettings.backgroundMusicSettings.fileType = mAudioProperties.fileType;
             mPreviewEditSettings.backgroundMusicSettings.insertionTime =
-                                                     mAudioTrack.getStartTime();
-            mPreviewEditSettings.backgroundMusicSettings.volumePercent =
-                                                        mAudioTrack.getVolume();
-            mPreviewEditSettings.backgroundMusicSettings.beginLoop = mAudioTrack
-            .getBoundaryBeginTime();
+                mAudioTrack.getStartTime();
+            mPreviewEditSettings.backgroundMusicSettings.volumePercent = mAudioTrack.getVolume();
+            mPreviewEditSettings.backgroundMusicSettings.beginLoop =
+                mAudioTrack.getBoundaryBeginTime();
             mPreviewEditSettings.backgroundMusicSettings.endLoop =
                                                mAudioTrack.getBoundaryEndTime();
-            mPreviewEditSettings.backgroundMusicSettings.enableDucking = mAudioTrack
-            .isDuckingEnabled();
-            mPreviewEditSettings.backgroundMusicSettings.duckingThreshold = mAudioTrack
-            .getDuckingThreshhold();
-            mPreviewEditSettings.backgroundMusicSettings.lowVolume = mAudioTrack
-            .getDuckedTrackVolume();
-            mPreviewEditSettings.backgroundMusicSettings.isLooping =
-                                                        mAudioTrack.isLooping();
+            mPreviewEditSettings.backgroundMusicSettings.enableDucking =
+                mAudioTrack.isDuckingEnabled();
+            mPreviewEditSettings.backgroundMusicSettings.duckingThreshold =
+                mAudioTrack.getDuckingThreshhold();
+            mPreviewEditSettings.backgroundMusicSettings.lowVolume =
+                mAudioTrack.getDuckedTrackVolume();
+            mPreviewEditSettings.backgroundMusicSettings.isLooping = mAudioTrack.isLooping();
             mPreviewEditSettings.primaryTrackVolume = 100;
             mProcessingState  = PROCESSING_AUDIO_PCM;
             mProcessingObject = mAudioTrack;
         } else {
-            if (mAudioSettings != null) {
-                mAudioSettings = null;
-            }
-            if (mPreviewEditSettings.backgroundMusicSettings != null) {
-                mPreviewEditSettings.backgroundMusicSettings = null;
-            }
+            mAudioSettings = null;
+            mPreviewEditSettings.backgroundMusicSettings = null;
             mAudioTrackPCMFilePath = null;
         }
     }
@@ -2850,8 +2804,9 @@ class MediaArtistNativeHelper {
             final Iterator<Effect> ef = t.getAllEffects().iterator();
             while (ef.hasNext()) {
                 final Effect e = ef.next();
-                if (e instanceof EffectKenBurns)
+                if (e instanceof EffectKenBurns) {
                     totalEffects--;
+                }
             }
         }
         return totalEffects;
@@ -2869,7 +2824,7 @@ class MediaArtistNativeHelper {
      * @param listener The MediaProcessingProgressListener
      *
      */
-    public void previewStoryBoard(List<MediaItem> mediaItemsList,
+    void previewStoryBoard(List<MediaItem> mediaItemsList,
             List<Transition> mediaTransitionList, List<AudioTrack> mediaBGMList,
             MediaProcessingProgressListener listener) {
         if (mInvalidatePreviewArray) {
@@ -2888,8 +2843,9 @@ class MediaArtistNativeHelper {
 
             mTotalClips = mediaItemsList.size();
             for (Transition transition : mediaTransitionList) {
-                if (transition.getDuration() > 0)
+                if (transition.getDuration() > 0) {
                     mTotalClips++;
+                }
             }
 
             totalEffects = getTotalEffects(mediaItemsList);
@@ -2898,7 +2854,7 @@ class MediaArtistNativeHelper {
             mPreviewEditSettings.effectSettingsArray = new EffectSettings[totalEffects];
             mClipProperties.clipProperties = new Properties[mTotalClips];
 
-            /** record the call back progress listner */
+            /** record the call back progress listener */
             mMediaProcessingProgressListener = listener;
             mProgressToApp = 0;
 
@@ -2923,19 +2879,16 @@ class MediaArtistNativeHelper {
                         previewIndex++;
                     }
                     /* Populate media item properties */
-                    maxHeight = populateMediaItemProperties(lMediaItem,
-                                                            previewIndex,
-                                                            maxHeight);
+                    maxHeight = populateMediaItemProperties(lMediaItem, previewIndex, maxHeight);
                     /* Get the clip properties of the media item. */
-                    if (lMediaItem instanceof MediaImageItem)
-                    {
+                    if (lMediaItem instanceof MediaImageItem) {
                         int tmpCnt = 0;
                         boolean bEffectKbPresent = false;
-                        List<Effect> effectList = lMediaItem.getAllEffects();
+                        final List<Effect> effectList = lMediaItem.getAllEffects();
                         /**
-                         * check if Kenburns effect is present
+                         * Check if Ken Burns effect is present
                          */
-                        while ( tmpCnt < effectList.size()) {
+                        while (tmpCnt < effectList.size()) {
                             if (effectList.get(tmpCnt) instanceof EffectKenBurns) {
                                 bEffectKbPresent = true;
                                 break;
@@ -2960,9 +2913,7 @@ class MediaArtistNativeHelper {
                             mClipProperties.clipProperties[previewIndex].width = ((MediaImageItem)lMediaItem).getScaledWidth();
                             mClipProperties.clipProperties[previewIndex].height = ((MediaImageItem)lMediaItem).getScaledHeight();
                         }
-
-                    }else
-                    {
+                    } else {
                         try {
                             mClipProperties.clipProperties[previewIndex]
                                  = getMediaProperties(lMediaItem.getFilename());
@@ -3008,22 +2959,19 @@ class MediaArtistNativeHelper {
             if (!mErrorFlagSet) {
                 mPreviewEditSettings.videoFrameSize = findVideoResolution(mVideoEditor
                         .getAspectRatio(), maxHeight);
-                /*if (mediaBGMList.size() == 1) //for remove Audio check */ {
-                    populateBackgroundMusicProperties(mediaBGMList);
-                }
+                populateBackgroundMusicProperties(mediaBGMList);
+
                 /** call to native populate settings */
                 try {
                     nativePopulateSettings(mPreviewEditSettings, mClipProperties, mAudioSettings);
                 } catch (IllegalArgumentException ex) {
-                    Log.e("MediaArtistNativeHelper",
-                    "Illegal argument exception in nativePopulateSettings");
+                    Log.e(TAG, "Illegal argument exception in nativePopulateSettings");
                     throw ex;
                 } catch (IllegalStateException ex) {
-                    Log.e("MediaArtistNativeHelper",
-                    "Illegal state exception in nativePopulateSettings");
+                    Log.e(TAG, "Illegal state exception in nativePopulateSettings");
                     throw ex;
                 } catch (RuntimeException ex) {
-                    Log.e("MediaArtistNativeHelper", "Runtime exception in nativePopulateSettings");
+                    Log.e(TAG, "Runtime exception in nativePopulateSettings");
                     throw ex;
                 }
                 mInvalidatePreviewArray = false;
@@ -3048,7 +2996,7 @@ class MediaArtistNativeHelper {
      * the callback is needed
      * @param listener The PreviewProgressListener
      */
-    public void doPreview(Surface surface, long fromMs, long toMs, boolean loop,
+    void doPreview(Surface surface, long fromMs, long toMs, boolean loop,
             int callbackAfterFrameCount, PreviewProgressListener listener) {
         mPreviewProgress = fromMs;
         mIsFirstProgress = true;
@@ -3057,22 +3005,23 @@ class MediaArtistNativeHelper {
         if (!mInvalidatePreviewArray) {
             try {
                 /** Modify the image files names to rgb image files. */
-                for (int clipCnt = 0; clipCnt < mPreviewEditSettings.clipSettingsArray.length; clipCnt++) {
+                for (int clipCnt = 0; clipCnt < mPreviewEditSettings.clipSettingsArray.length;
+                    clipCnt++) {
                     if (mPreviewEditSettings.clipSettingsArray[clipCnt].fileType == FileType.JPG) {
-                        mPreviewEditSettings.clipSettingsArray[clipCnt].clipPath = mPreviewEditSettings.clipSettingsArray[clipCnt].clipDecodedPath;
+                        mPreviewEditSettings.clipSettingsArray[clipCnt].clipPath =
+                            mPreviewEditSettings.clipSettingsArray[clipCnt].clipDecodedPath;
                     }
                 }
                 nativePopulateSettings(mPreviewEditSettings, mClipProperties, mAudioSettings);
                 nativeStartPreview(surface, fromMs, toMs, callbackAfterFrameCount, loop);
             } catch (IllegalArgumentException ex) {
-                Log.e("MediaArtistNativeHelper",
-                "Illegal argument exception in nativeStartPreview");
+                Log.e(TAG, "Illegal argument exception in nativeStartPreview");
                 throw ex;
             } catch (IllegalStateException ex) {
-                Log.e("MediaArtistNativeHelper", "Illegal state exception in nativeStartPreview");
+                Log.e(TAG, "Illegal state exception in nativeStartPreview");
                 throw ex;
             } catch (RuntimeException ex) {
-                Log.e("MediaArtistNativeHelper", "Runtime exception in nativeStartPreview");
+                Log.e(TAG, "Runtime exception in nativeStartPreview");
                 throw ex;
             }
         }
@@ -3081,7 +3030,7 @@ class MediaArtistNativeHelper {
     /**
      * This function is responsible for stopping the preview
      */
-    public long stopPreview() {
+    long stopPreview() {
         nativeStopPreview();
         return mPreviewProgress;
     }
@@ -3099,48 +3048,48 @@ class MediaArtistNativeHelper {
      * @return The actual time from the story board at which the  frame was extracted
      * and rendered
      */
-    public long renderPreviewFrame(Surface surface, long time, int surfaceWidth,
+    long renderPreviewFrame(Surface surface, long time, int surfaceWidth,
             int surfaceHeight, VideoEditor.OverlayData overlayData) {
-        long timeMs = 0;
-        if (!mInvalidatePreviewArray) {
-            try {
-                for (int clipCnt = 0;
-                      clipCnt < mPreviewEditSettings.clipSettingsArray.length;
-                      clipCnt++) {
+        if (mInvalidatePreviewArray) {
+            throw new RuntimeException("Call generate preview first");
+        }
 
-                    if (mPreviewEditSettings.clipSettingsArray[clipCnt].fileType == FileType.JPG) {
-                        mPreviewEditSettings.clipSettingsArray[clipCnt].clipPath =
-                            mPreviewEditSettings.clipSettingsArray[clipCnt].clipDecodedPath;
-                    }
+        long timeMs = 0;
+        try {
+            for (int clipCnt = 0; clipCnt < mPreviewEditSettings.clipSettingsArray.length;
+                  clipCnt++) {
+                if (mPreviewEditSettings.clipSettingsArray[clipCnt].fileType == FileType.JPG) {
+                    mPreviewEditSettings.clipSettingsArray[clipCnt].clipPath =
+                        mPreviewEditSettings.clipSettingsArray[clipCnt].clipDecodedPath;
                 }
+            }
 
-                // Reset the render preview frame params that shall be set by native.
-                mRenderPreviewOverlayFile = null;
-                mRenderPreviewRenderingMode = MediaRendering.RESIZING;
-                nativePopulateSettings(mPreviewEditSettings, mClipProperties, mAudioSettings);
-                timeMs = (long)nativeRenderPreviewFrame(surface, time, surfaceWidth, surfaceHeight);
+            // Reset the render preview frame params that shall be set by native.
+            mRenderPreviewOverlayFile = null;
+            mRenderPreviewRenderingMode = MediaRendering.RESIZING;
 
-                if (mRenderPreviewOverlayFile != null) {
-                    overlayData.set(BitmapFactory.decodeFile(mRenderPreviewOverlayFile), mRenderPreviewRenderingMode);
-                } else {
-                    overlayData.setClear();
-                }
-            } catch (IllegalArgumentException ex) {
-                Log.e("MediaArtistNativeHelper",
-                "Illegal Argument exception in nativeRenderPreviewFrame");
-                throw ex;
-            } catch (IllegalStateException ex) {
-                Log.e("MediaArtistNativeHelper",
-                "Illegal state exception in nativeRenderPreviewFrame");
-                throw ex;
-            } catch (RuntimeException ex) {
-                Log.e("MediaArtistNativeHelper", "Runtime exception in nativeRenderPreviewFrame");
-                throw ex;
+            nativePopulateSettings(mPreviewEditSettings, mClipProperties, mAudioSettings);
+
+            timeMs = (long)nativeRenderPreviewFrame(surface, time, surfaceWidth, surfaceHeight);
+
+            if (mRenderPreviewOverlayFile != null) {
+                overlayData.set(BitmapFactory.decodeFile(mRenderPreviewOverlayFile),
+                        mRenderPreviewRenderingMode);
+            } else {
+                overlayData.setClear();
             }
-            return timeMs;
-        } else {
-            throw new RuntimeException("Call generate preview first");
+        } catch (IllegalArgumentException ex) {
+            Log.e(TAG, "Illegal Argument exception in nativeRenderPreviewFrame");
+            throw ex;
+        } catch (IllegalStateException ex) {
+            Log.e(TAG, "Illegal state exception in nativeRenderPreviewFrame");
+            throw ex;
+        } catch (RuntimeException ex) {
+            Log.e(TAG, "Runtime exception in nativeRenderPreviewFrame");
+            throw ex;
         }
+
+        return timeMs;
     }
 
     private void previewFrameEditInfo(String filename, int renderingMode) {
@@ -3162,24 +3111,20 @@ class MediaArtistNativeHelper {
      * @return The actual time from media item at which the  frame was extracted
      * and rendered
      */
-    public long renderMediaItemPreviewFrame(Surface surface, String filepath,
-                                            long time, int framewidth,
-                                            int frameheight) {
+    long renderMediaItemPreviewFrame(Surface surface, String filepath,
+                                            long time, int framewidth, int frameheight) {
         long timeMs = 0;
         try {
-
             timeMs = (long)nativeRenderMediaItemPreviewFrame(surface, filepath, framewidth,
                     frameheight, 0, 0, time);
         } catch (IllegalArgumentException ex) {
-            Log.e("MediaArtistNativeHelper",
-            "Illegal Argument exception in renderMediaItemPreviewFrame");
+            Log.e(TAG, "Illegal Argument exception in renderMediaItemPreviewFrame");
             throw ex;
         } catch (IllegalStateException ex) {
-            Log.e("MediaArtistNativeHelper",
-            "Illegal state exception in renderMediaItemPreviewFrame");
+            Log.e(TAG, "Illegal state exception in renderMediaItemPreviewFrame");
             throw ex;
         } catch (RuntimeException ex) {
-            Log.e("MediaArtistNativeHelper", "Runtime exception in renderMediaItemPreviewFrame");
+            Log.e(TAG, "Runtime exception in renderMediaItemPreviewFrame");
             throw ex;
         }
 
@@ -3191,7 +3136,18 @@ class MediaArtistNativeHelper {
      * and for generating the preview again
      */
     void setGeneratePreview(boolean isRequired) {
-        mInvalidatePreviewArray = isRequired;
+        boolean semAcquiredDone = false;
+        try {
+            lock();
+            semAcquiredDone = true;
+            mInvalidatePreviewArray = isRequired;
+        } catch (InterruptedException ex) {
+            Log.e(TAG, "Runtime exception in renderMediaItemPreviewFrame");
+        } finally {
+            if (semAcquiredDone) {
+                unlock();
+            }
+        }
     }
 
     /**
@@ -3210,7 +3166,7 @@ class MediaArtistNativeHelper {
      *
      * @return The calculated aspect ratio
      */
-    public int getAspectRatio(int w, int h) {
+    int getAspectRatio(int w, int h) {
         double apRatio = (double)(w) / (double)(h);
         BigDecimal bd = new BigDecimal(apRatio);
         bd = bd.setScale(3, BigDecimal.ROUND_HALF_UP);
@@ -3238,7 +3194,7 @@ class MediaArtistNativeHelper {
      *
      * @return The File type in JAVA layer
      */
-    public int getFileType(int fileType) {
+    int getFileType(int fileType) {
         int retValue = -1;
         switch (fileType) {
             case FileType.UNSUPPORTED:
@@ -3277,7 +3233,7 @@ class MediaArtistNativeHelper {
      *
      * @return The video codec type in JAVA layer
      */
-    public int getVideoCodecType(int codecType) {
+    int getVideoCodecType(int codecType) {
         int retValue = -1;
         switch (codecType) {
             case VideoFormat.H263:
@@ -3305,7 +3261,7 @@ class MediaArtistNativeHelper {
      *
      * @return The audio codec type in JAVA layer
      */
-    public int getAudioCodecType(int codecType) {
+    int getAudioCodecType(int codecType) {
         int retValue = -1;
         switch (codecType) {
             case AudioFormat.AMR_NB:
@@ -3331,7 +3287,7 @@ class MediaArtistNativeHelper {
      *
      * @return The frame rate as integer
      */
-    public int getFrameRate(int fps) {
+    int getFrameRate(int fps) {
         int retValue = -1;
         switch (fps) {
             case VideoFrameRate.FR_5_FPS:
@@ -3536,7 +3492,7 @@ class MediaArtistNativeHelper {
     }
 
     /**
-     * Calculates videdo resolution for output clip
+     * Calculates video resolution for output clip
      * based on clip's height and aspect ratio of storyboard
      *
      * @param aspectRatio The aspect ratio of story board
@@ -3580,8 +3536,7 @@ class MediaArtistNativeHelper {
             resolutions = MediaProperties.getSupportedResolutions(mVideoEditor.getAspectRatio());
             // Get the highest resolution
             maxResolution = resolutions[resolutions.length - 1];
-            retValue = findVideoResolution(mVideoEditor.getAspectRatio(),
-                                           maxResolution.second);
+            retValue = findVideoResolution(mVideoEditor.getAspectRatio(), maxResolution.second);
         }
 
         return retValue;
@@ -3595,12 +3550,12 @@ class MediaArtistNativeHelper {
      * @param height The height of clip
      * @param bitrate The bitrate at which the movie should be exported
      * @param mediaItemsList The media items list
-     * @param mediaTransitionList The transitons list
+     * @param mediaTransitionList The transitions list
      * @param mediaBGMList The background track list
      * @param listener The ExportProgressListener
      *
      */
-    public void export(String filePath, String projectDir, int height, int bitrate,
+    void export(String filePath, String projectDir, int height, int bitrate,
             List<MediaItem> mediaItemsList, List<Transition> mediaTransitionList,
             List<AudioTrack> mediaBGMList, ExportProgressListener listener) {
 
@@ -3672,8 +3627,10 @@ class MediaArtistNativeHelper {
         mPreviewEditSettings.transitionSettingsArray = new TransitionSettings[mTotalClips - 1];
         for (int index = 0; index < mTotalClips - 1; index++) {
             mPreviewEditSettings.transitionSettingsArray[index] = new TransitionSettings();
-            mPreviewEditSettings.transitionSettingsArray[index].videoTransitionType = VideoTransition.NONE;
-            mPreviewEditSettings.transitionSettingsArray[index].audioTransitionType = AudioTransition.NONE;
+            mPreviewEditSettings.transitionSettingsArray[index].videoTransitionType =
+                VideoTransition.NONE;
+            mPreviewEditSettings.transitionSettingsArray[index].audioTransitionType =
+                AudioTransition.NONE;
         }
         for (int clipCnt = 0; clipCnt < mPreviewEditSettings.clipSettingsArray.length; clipCnt++) {
             if (mPreviewEditSettings.clipSettingsArray[clipCnt].fileType == FileType.JPG) {
@@ -3690,192 +3647,40 @@ class MediaArtistNativeHelper {
             err = generateClip(mPreviewEditSettings);
             mProcessingState  = PROCESSING_NONE;
         } catch (IllegalArgumentException ex) {
-            Log.e("MediaArtistNativeHelper", "IllegalArgument for generateClip");
+            Log.e(TAG, "IllegalArgument for generateClip");
             throw ex;
         } catch (IllegalStateException ex) {
-            Log.e("MediaArtistNativeHelper", "IllegalStateExceptiont for generateClip");
+            Log.e(TAG, "IllegalStateExceptiont for generateClip");
             throw ex;
         } catch (RuntimeException ex) {
-            Log.e("MediaArtistNativeHelper", "RuntimeException for generateClip");
+            Log.e(TAG, "RuntimeException for generateClip");
             throw ex;
         }
 
         if (err != 0) {
-            Log.e("MediaArtistNativeHelper", "RuntimeException for generateClip");
-            throw new RuntimeException("generateClip failed with error="+err );
+            Log.e(TAG, "RuntimeException for generateClip");
+            throw new RuntimeException("generateClip failed with error=" + err);
         }
 
-        mExportDone = true;
         mExportProgressListener = null;
     }
 
     /**
-     * This method is responsible for exporting a movie
-     *
-     * @param filePath The output file path
-     * @param projectDir The output project directory
-     * @param height The height of clip
-     * @param bitrate The bitrate at which the movie should be exported
-     * @param audioCodec The audio codec to use
-     * @param videoCodec The video codec to use
-     * @param mediaItemsList The media items list
-     * @param mediaTransitionList The transitons list
-     * @param mediaBGMList The background track list
-     * @param listener The ExportProgressListener
+     * This methods takes care of stopping the Export process
      *
+     * @param The input file name for which export has to be stopped
      */
-    public void export(String filePath, String projectDir,int height,int bitrate,
-            int audioCodec,int videoCodec,List<MediaItem> mediaItemsList,
-            List<Transition> mediaTransitionList,List<AudioTrack> mediaBGMList,
-            ExportProgressListener listener) {
-
-        int outBitrate = 0;
-        mExportFilename = filePath;
-        previewStoryBoard(mediaItemsList, mediaTransitionList, mediaBGMList,null);
-        mExportProgressListener = listener;
-
-        mProgressToApp = 0;
-
-        switch (bitrate) {
-            case MediaProperties.BITRATE_28K:
-                outBitrate = Bitrate.BR_32_KBPS;
-                break;
-            case MediaProperties.BITRATE_40K:
-                outBitrate = Bitrate.BR_48_KBPS;
-                break;
-            case MediaProperties.BITRATE_64K:
-                outBitrate = Bitrate.BR_64_KBPS;
-                break;
-            case MediaProperties.BITRATE_96K:
-                outBitrate = Bitrate.BR_96_KBPS;
-                break;
-            case MediaProperties.BITRATE_128K:
-                outBitrate = Bitrate.BR_128_KBPS;
-                break;
-            case MediaProperties.BITRATE_192K:
-                outBitrate = Bitrate.BR_192_KBPS;
-                break;
-            case MediaProperties.BITRATE_256K:
-                outBitrate = Bitrate.BR_256_KBPS;
-                break;
-            case MediaProperties.BITRATE_384K:
-                outBitrate = Bitrate.BR_384_KBPS;
-                break;
-            case MediaProperties.BITRATE_512K:
-                outBitrate = Bitrate.BR_512_KBPS;
-                break;
-            case MediaProperties.BITRATE_800K:
-                outBitrate = Bitrate.BR_800_KBPS;
-                break;
-            case MediaProperties.BITRATE_2M:
-                outBitrate = Bitrate.BR_2_MBPS;
-                break;
-            case MediaProperties.BITRATE_5M:
-                outBitrate = Bitrate.BR_5_MBPS;
-                break;
-            case MediaProperties.BITRATE_8M:
-                outBitrate = Bitrate.BR_8_MBPS;
-                break;
-
-            default:
-                throw new IllegalArgumentException("Argument Bitrate incorrect");
-        }
-        mPreviewEditSettings.videoFrameRate = VideoFrameRate.FR_30_FPS;
-        mPreviewEditSettings.outputFile = mOutputFilename = filePath;
-
-        int aspectRatio = mVideoEditor.getAspectRatio();
-        mPreviewEditSettings.videoFrameSize = findVideoResolution(aspectRatio, height);
-        switch (audioCodec) {
-            case MediaProperties.ACODEC_AAC_LC:
-                mPreviewEditSettings.audioFormat = AudioFormat.AAC;
-                break;
-            case MediaProperties.ACODEC_AMRNB:
-                mPreviewEditSettings.audioFormat = AudioFormat.AMR_NB;
-                break;
-        }
-
-        switch (videoCodec) {
-            case MediaProperties.VCODEC_H263:
-                mPreviewEditSettings.videoFormat = VideoFormat.H263;
-                break;
-            case MediaProperties.VCODEC_H264BP:
-                mPreviewEditSettings.videoFormat = VideoFormat.H264;
-                break;
-            case MediaProperties.VCODEC_MPEG4:
-                mPreviewEditSettings.videoFormat = VideoFormat.MPEG4;
-                break;
-        }
-
-        mPreviewEditSettings.audioSamplingFreq = AudioSamplingFrequency.FREQ_32000;
-        mPreviewEditSettings.maxFileSize = 0;
-        mPreviewEditSettings.audioChannels = 2;
-        mPreviewEditSettings.videoBitrate = outBitrate;
-        mPreviewEditSettings.audioBitrate = Bitrate.BR_96_KBPS;
-
-        mPreviewEditSettings.transitionSettingsArray =
-                                        new TransitionSettings[mTotalClips - 1];
-        for (int index = 0; index < mTotalClips - 1; index++) {
-            mPreviewEditSettings.transitionSettingsArray[index] =
-                                                       new TransitionSettings();
-            mPreviewEditSettings.transitionSettingsArray[index].videoTransitionType =
-                                                                      VideoTransition.NONE;
-            mPreviewEditSettings.transitionSettingsArray[index].audioTransitionType =
-                                                                      AudioTransition.NONE;
-        }
-        for (int clipCnt = 0; clipCnt < mPreviewEditSettings.clipSettingsArray.length; clipCnt++) {
-            if (mPreviewEditSettings.clipSettingsArray[clipCnt].fileType == FileType.JPG) {
-                mPreviewEditSettings.clipSettingsArray[clipCnt].clipPath =
-                  mPreviewEditSettings.clipSettingsArray[clipCnt].clipOriginalPath;
-            }
-        }
-        nativePopulateSettings(mPreviewEditSettings, mClipProperties, mAudioSettings);
-
-        int err = 0;
+    void stop(String filename) {
         try {
-            mProcessingState  = PROCESSING_EXPORT;
-            mProcessingObject = null;
-            err = generateClip(mPreviewEditSettings);
-            mProcessingState  = PROCESSING_NONE;
-        } catch (IllegalArgumentException ex) {
-            Log.e("MediaArtistNativeHelper", "IllegalArgument for generateClip");
-            throw ex;
+            stopEncoding();
+            new File(mExportFilename).delete();
         } catch (IllegalStateException ex) {
-            Log.e("MediaArtistNativeHelper", "IllegalStateExceptiont for generateClip");
+            Log.e(TAG, "Illegal state exception in unload settings");
             throw ex;
         } catch (RuntimeException ex) {
-            Log.e("MediaArtistNativeHelper", "RuntimeException for generateClip");
+            Log.e(TAG, "Runtime exception in unload settings");
             throw ex;
         }
-
-        if (err != 0) {
-            Log.e("MediaArtistNativeHelper", "RuntimeException for generateClip");
-            throw new RuntimeException("generateClip failed with error="+err );
-        }
-
-        mExportDone = true;
-        mExportProgressListener = null;
-    }
-
-
-    /**
-     * This methods takes care of stopping the Export process
-     *
-     * @param The input file name for which export has to be stopped
-     */
-    public void stop(String filename) {
-        if (!mExportDone) {
-            try {
-                stopEncoding();
-            } catch (IllegalStateException ex) {
-                Log.e("MediaArtistNativeHelper", "Illegal state exception in unload settings");
-                throw ex;
-            } catch (RuntimeException ex) {
-                Log.e("MediaArtistNativeHelper", "Runtime exception in unload settings");
-                throw ex;
-            }
-
-            new File(mExportFilename).delete();
-        }
     }
 
     /**
@@ -3885,9 +3690,9 @@ class MediaArtistNativeHelper {
      * @param inputFile The inputFile
      * @param width The width of the output frame
      * @param height The height of the output frame
-     * @param timeMS The time in ms at which the frame hass to be extracted
+     * @param timeMS The time in ms at which the frame has to be extracted
      */
-    public Bitmap getPixels(String inputFile, int width, int height, long timeMS) {
+    Bitmap getPixels(String inputFile, int width, int height, long timeMS) {
         if (inputFile == null) {
             throw new IllegalArgumentException();
         }
@@ -3918,8 +3723,7 @@ class MediaArtistNativeHelper {
             /* Create a canvas to resize */
             final Canvas canvas = new Canvas(bitmap);
             canvas.drawBitmap(tempBitmap, new Rect(0, 0, newWidth, newHeight),
-                                          new Rect(0, 0, width, height),
-                                          sResizePaint);
+                                          new Rect(0, 0, width, height), sResizePaint);
         }
 
         if (tempBitmap != null) {
@@ -3961,50 +3765,49 @@ class MediaArtistNativeHelper {
         }
         int i = 0;
         int deltaTime = (int)(endMs - startMs) / thumbnailCount;
-        Bitmap[] bitmap = null;
+        Bitmap[] bitmaps = null;
 
         try {
             // This may result in out of Memory Error
             rgb888 = new int[thumbnailSize * thumbnailCount];
-            bitmap = new Bitmap[thumbnailCount];
+            bitmaps = new Bitmap[thumbnailCount];
         } catch (Throwable e) {
             // Allocating to new size with Fixed count
             try {
                 System.gc();
                 rgb888 = new int[thumbnailSize * MAX_THUMBNAIL_PERMITTED];
-                bitmap = new Bitmap[MAX_THUMBNAIL_PERMITTED];
+                bitmaps = new Bitmap[MAX_THUMBNAIL_PERMITTED];
                 thumbnailCount = MAX_THUMBNAIL_PERMITTED;
             } catch (Throwable ex) {
                 throw new RuntimeException("Memory allocation fails, thumbnail count too large: "+thumbnailCount);
             }
         }
         IntBuffer tmpBuffer = IntBuffer.allocate(thumbnailSize);
-        nativeGetPixelsList(filename, rgb888, newWidth, newHeight, deltaTime, thumbnailCount, startMs,
-                endMs);
+        nativeGetPixelsList(filename, rgb888, newWidth, newHeight, deltaTime, thumbnailCount,
+                startMs, endMs);
 
         for (; i < thumbnailCount; i++) {
-            bitmap[i] = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+            bitmaps[i] = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
             tmpBuffer.put(rgb888, (i * thumbnailSize), thumbnailSize);
             tmpBuffer.rewind();
 
             if ((newWidth == width) && (newHeight == height)) {
-                bitmap[i].copyPixelsFromBuffer(tmpBuffer);
+                bitmaps[i].copyPixelsFromBuffer(tmpBuffer);
             } else {
                 /* Copy the out rgb buffer to temp bitmap */
                 tempBitmap.copyPixelsFromBuffer(tmpBuffer);
 
                 /* Create a canvas to resize */
-                final Canvas canvas = new Canvas(bitmap[i]);
+                final Canvas canvas = new Canvas(bitmaps[i]);
                 canvas.drawBitmap(tempBitmap, new Rect(0, 0, newWidth, newHeight),
-                                              new Rect(0, 0, width, height),
-                                              sResizePaint);
+                                              new Rect(0, 0, width, height), sResizePaint);
             }
         }
 
         if (tempBitmap != null) {
             tempBitmap.recycle();
         }
-        return bitmap;
+        return bitmaps;
     }
 
     /**
@@ -4020,7 +3823,7 @@ class MediaArtistNativeHelper {
      * @param isVideo The flag to indicate if the file is video file or not
      *
      **/
-    public void generateAudioGraph(String uniqueId, String inFileName, String OutAudiGraphFileName,
+    void generateAudioGraph(String uniqueId, String inFileName, String OutAudiGraphFileName,
             int frameDuration, int audioChannels, int samplesCount,
             ExtractAudioWaveformProgressListener listener, boolean isVideo) {
         String tempPCMFileName;
@@ -4028,7 +3831,7 @@ class MediaArtistNativeHelper {
         mExtractAudioWaveformProgressListener = listener;
 
         /**
-         * in case of Video , first call will generate the PCM file to make the
+         * In case of Video, first call will generate the PCM file to make the
          * audio graph
          */
         if (isVideo) {
@@ -4036,6 +3839,7 @@ class MediaArtistNativeHelper {
         } else {
             tempPCMFileName = mAudioTrackPCMFilePath;
         }
+
         /**
          * For Video item, generate the PCM
          */
@@ -4046,19 +3850,46 @@ class MediaArtistNativeHelper {
         nativeGenerateAudioGraph(tempPCMFileName, OutAudiGraphFileName, frameDuration,
                 audioChannels, samplesCount);
 
-        /* once the audio graph file is generated, delete the pcm file */
+        /**
+         * Once the audio graph file is generated, delete the pcm file
+         */
         if (isVideo) {
             new File(tempPCMFileName).delete();
         }
     }
 
-    public void clearPreviewSurface(Surface surface) {
-       nativeClearSurface(surface);
+    void clearPreviewSurface(Surface surface) {
+        nativeClearSurface(surface);
+    }
+
+    /**
+     * Grab the semaphore which arbitrates access to the editor
+     *
+     * @throws InterruptedException
+     */
+    void lock() throws InterruptedException {
+        if (Log.isLoggable(TAG, Log.DEBUG)) {
+            Log.d(TAG, "lock: grabbing semaphore", new Throwable());
+        }
+        mLock.acquire();
+        if (Log.isLoggable(TAG, Log.DEBUG)) {
+            Log.d(TAG, "lock: grabbed semaphore");
+        }
+    }
+
+    /**
+     * Release the semaphore which arbitrates access to the editor
+     */
+    void unlock() {
+        if (Log.isLoggable(TAG, Log.DEBUG)) {
+            Log.d(TAG, "unlock: releasing semaphore");
+        }
+        mLock.release();
     }
 
     /**     Native Methods        */
     native Properties getMediaProperties(String file) throws IllegalArgumentException,
-    IllegalStateException, RuntimeException, Exception;
+            IllegalStateException, RuntimeException, Exception;
 
     /**
      * Get the version of ManualEdit.
@@ -4073,7 +3904,7 @@ class MediaArtistNativeHelper {
      * Returns the video thumbnail in an array of integers. Output format is
      * ARGB8888.
      *
-     * @param pixelArray the array that receives the pixelvalues
+     * @param pixelArray the array that receives the pixel values
      * @param width width of the video thumbnail
      * @param height height of the video thumbnail
      * @param timeMS desired time of the thumbnail in ms
@@ -4103,7 +3934,6 @@ class MediaArtistNativeHelper {
      */
     private native void nativeClearSurface(Surface surface);
 
-
     /**
      * Stops the encoding. This method should only be called after encoding has
      * started using method <code> startEncoding</code>
@@ -4113,7 +3943,6 @@ class MediaArtistNativeHelper {
     private native void stopEncoding() throws IllegalStateException, RuntimeException;
 
 
-
     private native void _init(String tempPath, String libraryPath)
             throws IllegalArgumentException, IllegalStateException, RuntimeException;
 
@@ -4121,7 +3950,7 @@ class MediaArtistNativeHelper {
             int callbackAfterFrameCount, boolean loop) throws IllegalArgumentException,
             IllegalStateException, RuntimeException;
 
-    private native void nativePopulateSettings(EditSettings mEditSettings,
+    private native void nativePopulateSettings(EditSettings editSettings,
             PreviewClipProperties mProperties, AudioSettings mAudioSettings)
     throws IllegalArgumentException, IllegalStateException, RuntimeException;
 
index 633e7ee..69088ed 100755 (executable)
@@ -294,6 +294,8 @@ public class MediaImageItem extends MediaItem {
             return;
         }
 
+        mMANativeHelper.setGeneratePreview(true);
+
         /**
          * Invalidate the end transitions if necessary.
          * This invalidation is necessary for the case in which an effect or
index a24b46e..d3ab051 100755 (executable)
@@ -176,6 +176,9 @@ public abstract class MediaItem {
             default:
                 throw new IllegalArgumentException("Invalid Rendering Mode");
         }
+
+        mMANativeHelper.setGeneratePreview(true);
+
         mRenderingMode = renderingMode;
         if (mBeginTransition != null) {
             mBeginTransition.invalidate();
@@ -184,7 +187,6 @@ public abstract class MediaItem {
         if (mEndTransition != null) {
             mEndTransition.invalidate();
         }
-        mMANativeHelper.setGeneratePreview(true);
     }
 
     /**
@@ -296,12 +298,11 @@ public abstract class MediaItem {
         mEffects.add(effect);
 
         invalidateTransitions(effect.getStartTime(), effect.getDuration());
-        if (mMANativeHelper != null) {
-            if (effect instanceof EffectKenBurns) {
-                mRegenerateClip = true;
-            }
-            mMANativeHelper.setGeneratePreview(true);
+
+        if (effect instanceof EffectKenBurns) {
+            mRegenerateClip = true;
         }
+        mMANativeHelper.setGeneratePreview(true);
     }
 
     /**
@@ -318,23 +319,23 @@ public abstract class MediaItem {
     public Effect removeEffect(String effectId) {
         for (Effect effect : mEffects) {
             if (effect.getId().equals(effectId)) {
+                mMANativeHelper.setGeneratePreview(true);
+
                 mEffects.remove(effect);
+
                 invalidateTransitions(effect.getStartTime(), effect.getDuration());
-                if (mMANativeHelper != null) {
-                    if (effect instanceof EffectKenBurns) {
-                        if (mGeneratedImageClip != null) {
-                            /**
-                             *  Delete the file
-                             */
-                            new File(mGeneratedImageClip).delete();
-                            /**
-                             *  Invalidate the filename
-                             */
-                            mGeneratedImageClip = null;
-                        }
-                        mRegenerateClip = false;
+                if (effect instanceof EffectKenBurns) {
+                    if (mGeneratedImageClip != null) {
+                        /**
+                         *  Delete the file
+                         */
+                        new File(mGeneratedImageClip).delete();
+                        /**
+                         *  Invalidate the filename
+                         */
+                        mGeneratedImageClip = null;
                     }
-                    mMANativeHelper.setGeneratePreview(true);
+                    mRegenerateClip = false;
                 }
                 return effect;
             }
@@ -448,9 +449,7 @@ public abstract class MediaItem {
 
         mOverlays.add(overlay);
         invalidateTransitions(overlay.getStartTime(), overlay.getDuration());
-        if (mMANativeHelper != null) {
-            mMANativeHelper.setGeneratePreview(true);
-        }
+        mMANativeHelper.setGeneratePreview(true);
     }
 
     /**
@@ -483,10 +482,9 @@ public abstract class MediaItem {
     public Overlay removeOverlay(String overlayId) {
         for (Overlay overlay : mOverlays) {
             if (overlay.getId().equals(overlayId)) {
+                mMANativeHelper.setGeneratePreview(true);
+
                 mOverlays.remove(overlay);
-                if (mMANativeHelper != null) {
-                    mMANativeHelper.setGeneratePreview(true);
-                }
                 if (overlay instanceof OverlayFrame) {
                     ((OverlayFrame)overlay).invalidate();
                 }
index 02155db..bbadd62 100755 (executable)
@@ -198,6 +198,8 @@ public class MediaVideoItem extends MediaItem {
             throw new IllegalArgumentException("setExtractBoundaries: Start time or end time is negative");
         }
 
+        mMANativeHelper.setGeneratePreview(true);
+
         if (beginMs != mBeginBoundaryTimeMs) {
             if (mBeginTransition != null) {
                 mBeginTransition.invalidate();
@@ -212,7 +214,6 @@ public class MediaVideoItem extends MediaItem {
 
         mBeginBoundaryTimeMs = beginMs;
         mEndBoundaryTimeMs = endMs;
-        mMANativeHelper.setGeneratePreview(true);
         adjustTransitions();
         mVideoEditor.updateTimelineDuration();
         /**
@@ -260,12 +261,11 @@ public class MediaVideoItem extends MediaItem {
             throw new IllegalArgumentException("Invalid Time duration");
         }
 
-        if ((width <=0) || (height <= 0)) {
+        if ((width <= 0) || (height <= 0)) {
             throw new IllegalArgumentException("Invalid Dimensions");
         }
 
-        return mMANativeHelper.getPixels(super.getFilename(),
-                width, height,timeMs);
+        return mMANativeHelper.getPixels(super.getFilename(), width, height,timeMs);
     }
 
     /*
@@ -610,6 +610,7 @@ public class MediaVideoItem extends MediaItem {
      * @param muted true to mute the media item
      */
     public void setMute(boolean muted) {
+        mMANativeHelper.setGeneratePreview(true);
         mMuted = muted;
         if (mBeginTransition != null) {
             mBeginTransition.invalidate();
@@ -617,7 +618,6 @@ public class MediaVideoItem extends MediaItem {
         if (mEndTransition != null) {
             mEndTransition.invalidate();
         }
-        mMANativeHelper.setGeneratePreview(true);
     }
 
     /**
index ec03966..a070eb4 100755 (executable)
@@ -106,7 +106,6 @@ public abstract class Overlay {
      * @param durationMs The duration in milliseconds
      */
     public void setDuration(long durationMs) {
-
         if (durationMs < 0) {
             throw new IllegalArgumentException("Invalid duration");
         }
@@ -115,11 +114,12 @@ public abstract class Overlay {
             throw new IllegalArgumentException("Duration is too large");
         }
 
+        getMediaItem().getNativeContext().setGeneratePreview(true);
+
         final long oldDurationMs = mDurationMs;
         mDurationMs = durationMs;
 
-        mMediaItem.invalidateTransitions(mStartTimeMs, oldDurationMs,
-                                         mStartTimeMs, mDurationMs);
+        mMediaItem.invalidateTransitions(mStartTimeMs, oldDurationMs, mStartTimeMs, mDurationMs);
     }
 
     /**
@@ -143,11 +143,12 @@ public abstract class Overlay {
             throw new IllegalArgumentException("Start time is too large");
         }
 
+        getMediaItem().getNativeContext().setGeneratePreview(true);
+
         final long oldStartTimeMs = mStartTimeMs;
         mStartTimeMs = startTimeMs;
 
-        mMediaItem.invalidateTransitions(oldStartTimeMs, mDurationMs,
-                                         mStartTimeMs, mDurationMs);
+        mMediaItem.invalidateTransitions(oldStartTimeMs, mDurationMs, mStartTimeMs, mDurationMs);
     }
 
     /**
@@ -161,14 +162,15 @@ public abstract class Overlay {
             throw new IllegalArgumentException("Invalid start time or duration");
         }
 
+        getMediaItem().getNativeContext().setGeneratePreview(true);
+
         final long oldStartTimeMs = mStartTimeMs;
         final long oldDurationMs = mDurationMs;
 
         mStartTimeMs = startTimeMs;
         mDurationMs = durationMs;
 
-        mMediaItem.invalidateTransitions(oldStartTimeMs, oldDurationMs,
-                                         mStartTimeMs, mDurationMs);
+        mMediaItem.invalidateTransitions(oldStartTimeMs, oldDurationMs, mStartTimeMs, mDurationMs);
     }
 
     /**
index 0a928fe..2bb9a1c 100755 (executable)
@@ -120,6 +120,10 @@ public class OverlayFrame extends Overlay {
      * @param bitmap The overlay bitmap.
      */
     public void setBitmap(Bitmap bitmap) {
+        getMediaItem().getNativeContext().setGeneratePreview(true);
+
+        invalidate();
+
         mBitmap = bitmap;
         if (mFilename != null) {
             /**
@@ -238,12 +242,16 @@ public class OverlayFrame extends Overlay {
      * Delete the overlay files
      */
     void invalidate() {
+        if (mBitmap != null) {
+            mBitmap.recycle();
+            mBitmap = null;
+        }
+
         if (mFilename != null) {
             new File(mFilename).delete();
             mFilename = null;
-            mBitmap.recycle();
-            mBitmap = null;
         }
+
         if (mBitmapFileName != null) {
             new File(mBitmapFileName).delete();
             mBitmapFileName = null;
index 54b3837..cc847ef 100755 (executable)
@@ -27,20 +27,17 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.Semaphore;
-
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 import org.xmlpull.v1.XmlSerializer;
 
+import android.graphics.Bitmap;
 import android.graphics.Rect;
 import android.util.Log;
 import android.util.Xml;
 import android.view.Surface;
 import android.view.SurfaceHolder;
 
-import android.graphics.Bitmap;
-
 /**
  * The VideoEditor implementation {@hide}
  */
@@ -54,15 +51,6 @@ public class VideoEditorImpl implements VideoEditor {
      *  The project filename
      */
     private static final String PROJECT_FILENAME = "videoeditor.xml";
-    /*
-     *  Semaphore to control preview calls
-     */
-    final Semaphore mPreviewSemaphore = new Semaphore(1, true);
-
-    /*
-     *  Semaphore to control export calls
-     */
-    final Semaphore mExportSemaphore = new Semaphore(1, true);
 
     /*
      *  XML tags
@@ -74,8 +62,7 @@ public class VideoEditorImpl implements VideoEditor {
     private static final String TAG_TRANSITION = "transition";
     private static final String TAG_OVERLAYS = "overlays";
     private static final String TAG_OVERLAY = "overlay";
-    private static final String TAG_OVERLAY_USER_ATTRIBUTES =
-                                                      "overlay_user_attributes";
+    private static final String TAG_OVERLAY_USER_ATTRIBUTES = "overlay_user_attributes";
     private static final String TAG_EFFECTS = "effects";
     private static final String TAG_EFFECT = "effect";
     private static final String TAG_AUDIO_TRACKS = "audio_tracks";
@@ -86,7 +73,6 @@ public class VideoEditorImpl implements VideoEditor {
     private static final String ATTR_AUDIO_WAVEFORM_FILENAME = "waveform";
     private static final String ATTR_RENDERING_MODE = "rendering_mode";
     private static final String ATTR_ASPECT_RATIO = "aspect_ratio";
-    private static final String ATTR_PREVIEW_PREPARE = "preview_prepare_invalid";
     private static final String ATTR_REGENERATE_PCM = "regeneratePCMFlag";
     private static final String ATTR_TYPE = "type";
     private static final String ATTR_DURATION = "duration";
@@ -116,18 +102,12 @@ public class VideoEditorImpl implements VideoEditor {
     private static final String ATTR_DUCK_ENABLED = "ducking_enabled";
     private static final String ATTR_DUCK_THRESHOLD = "ducking_threshold";
     private static final String ATTR_DUCKED_TRACK_VOLUME = "ducking_volume";
-    private static final String ATTR_GENERATED_IMAGE_CLIP =
-                                                         "generated_image_clip";
-    private static final String ATTR_GENERATED_TRANSITION_CLIP =
-                                                    "generated_transition_clip";
-    private static final String ATTR_IS_TRANSITION_GENERATED =
-                                                      "is_transition_generated";
-    private static final String ATTR_OVERLAY_RGB_FILENAME =
-                                                         "overlay_rgb_filename";
-    private static final String ATTR_OVERLAY_FRAME_WIDTH =
-                                                          "overlay_frame_width";
-    private static final String ATTR_OVERLAY_FRAME_HEIGHT =
-                                                         "overlay_frame_height";
+    private static final String ATTR_GENERATED_IMAGE_CLIP = "generated_image_clip";
+    private static final String ATTR_GENERATED_TRANSITION_CLIP = "generated_transition_clip";
+    private static final String ATTR_IS_TRANSITION_GENERATED = "is_transition_generated";
+    private static final String ATTR_OVERLAY_RGB_FILENAME = "overlay_rgb_filename";
+    private static final String ATTR_OVERLAY_FRAME_WIDTH = "overlay_frame_width";
+    private static final String ATTR_OVERLAY_FRAME_HEIGHT = "overlay_frame_height";
 
     /*
      *  Instance variables
@@ -143,7 +123,6 @@ public class VideoEditorImpl implements VideoEditor {
      * Private Object for calling native Methods via MediaArtistNativeHelper
      */
     private MediaArtistNativeHelper mMANativeHelper;
-    private VideoEditor veObject = null;
     private boolean mPreviewInProgress = false;
 
     /**
@@ -153,7 +132,6 @@ public class VideoEditorImpl implements VideoEditor {
      *        related to the project
      */
     public VideoEditorImpl(String projectPath) throws IOException {
-
         mMANativeHelper = new MediaArtistNativeHelper(projectPath, this);
         mProjectPath = projectPath;
         final File projectXml = new File(projectPath, PROJECT_FILENAME);
@@ -184,6 +162,7 @@ public class VideoEditorImpl implements VideoEditor {
         if (audioTrack == null) {
             throw new IllegalArgumentException("Audio Track is null");
         }
+
         if (mAudioTracks.size() == 1) {
             throw new IllegalArgumentException("No more tracks can be added");
         }
@@ -196,16 +175,16 @@ public class VideoEditorImpl implements VideoEditor {
         /*
          * Form the audio PCM file path
          */
-        String audioTrackPCMFilePath = String.format(mProjectPath + "/"
+        final String audioTrackPCMFilePath = String.format(mProjectPath + "/"
                     + "AudioPcm" + audioTrack.getId() + ".pcm");
 
         /*
          * Create PCM only if not generated in previous session
          */
-        if (new File(audioTrackPCMFilePath).exists())
-        {
+        if (new File(audioTrackPCMFilePath).exists()) {
             mMANativeHelper.setAudioflag(false);
         }
+
         mMANativeHelper.setGeneratePreview(true);
     }
 
@@ -223,15 +202,14 @@ public class VideoEditorImpl implements VideoEditor {
          * Add the Media item to MediaItem list
          */
         if (mMediaItems.contains(mediaItem)) {
-            throw new IllegalArgumentException("Media item already exists: " +
-            mediaItem.getId());
+            throw new IllegalArgumentException("Media item already exists: " + mediaItem.getId());
         }
 
         /*
          *  Invalidate the end transition if necessary
          */
         final int mediaItemsCount = mMediaItems.size();
-        if ( mediaItemsCount > 0) {
+        if (mediaItemsCount > 0) {
             removeTransitionAfter(mediaItemsCount - 1);
         }
 
@@ -258,6 +236,7 @@ public class VideoEditorImpl implements VideoEditor {
         if (transition == null) {
             throw new IllegalArgumentException("Null Transition");
         }
+
         final MediaItem beforeMediaItem = transition.getBeforeMediaItem();
         final MediaItem afterMediaItem = transition.getAfterMediaItem();
         /*
@@ -266,15 +245,16 @@ public class VideoEditorImpl implements VideoEditor {
         if (mMediaItems == null) {
             throw new IllegalArgumentException("No media items are added");
         }
-        if ((afterMediaItem != null) &&  (beforeMediaItem != null)) {
-            int afterMediaItemIndex = mMediaItems.indexOf(afterMediaItem);
-            int beforeMediaItemIndex = mMediaItems.indexOf(beforeMediaItem);
 
+        if ((afterMediaItem != null) &&  (beforeMediaItem != null)) {
+            final int afterMediaItemIndex = mMediaItems.indexOf(afterMediaItem);
+            final int beforeMediaItemIndex = mMediaItems.indexOf(beforeMediaItem);
 
             if ((afterMediaItemIndex == -1) || (beforeMediaItemIndex == -1)) {
                 throw new IllegalArgumentException
                     ("Either of the mediaItem is not found in the list");
             }
+
             if (afterMediaItemIndex != (beforeMediaItemIndex - 1) ) {
                 throw new IllegalArgumentException("MediaItems are not in sequence");
             }
@@ -334,9 +314,10 @@ public class VideoEditorImpl implements VideoEditor {
             case MediaProperties.ACODEC_AMRNB:
                 break;
 
-            default :
+            default: {
                 String message = "Unsupported audio codec type " + audioCodec;
                 throw new IllegalArgumentException(message);
+            }
         }
 
         switch (videoCodec) {
@@ -347,9 +328,10 @@ public class VideoEditorImpl implements VideoEditor {
             case MediaProperties.VCODEC_MPEG4:
                 break;
 
-            default :
+            default: {
                 String message = "Unsupported video codec type " + videoCodec;
                 throw new IllegalArgumentException(message);
+            }
         }
 
         export(filename, height, bitrate, listener);
@@ -360,13 +342,15 @@ public class VideoEditorImpl implements VideoEditor {
      */
     public void export(String filename, int height, int bitrate,
                        ExportProgressListener listener) throws IOException {
-        if ( filename == null) {
+        if (filename == null) {
             throw new IllegalArgumentException("export: filename is null");
         }
-        File tempPathFile = new File(filename);
+
+        final File tempPathFile = new File(filename);
         if (tempPathFile == null) {
             throw new IOException(filename + "can not be created");
         }
+
         if (mMediaItems.size() == 0) {
             throw new IllegalStateException("No MediaItems added");
         }
@@ -381,10 +365,12 @@ public class VideoEditorImpl implements VideoEditor {
             case MediaProperties.HEIGHT_720:
                 break;
 
-            default:
+            default: {
                 String message = "Unsupported height value " + height;
                 throw new IllegalArgumentException(message);
+            }
         }
+
         switch (bitrate) {
             case MediaProperties.BITRATE_28K:
                 break;
@@ -413,20 +399,24 @@ public class VideoEditorImpl implements VideoEditor {
             case MediaProperties.BITRATE_8M:
                 break;
 
-            default:
+            default: {
                 final String message = "Unsupported bitrate value " + bitrate;
                 throw new IllegalArgumentException(message);
+            }
         }
 
+        boolean semAcquireDone = false;
         try {
-            mExportSemaphore.acquire();
+            mMANativeHelper.lock();
+            semAcquireDone = true;
             mMANativeHelper.export(filename, mProjectPath, height,bitrate,
-                               mMediaItems, mTransitions, mAudioTracks,
-                               listener);
+                               mMediaItems, mTransitions, mAudioTracks, listener);
         } catch (InterruptedException  ex) {
             Log.e(TAG, "Sem acquire NOT successful in export");
         } finally {
-            mExportSemaphore.release();
+            if (semAcquireDone) {
+                mMANativeHelper.unlock();
+            }
         }
     }
 
@@ -436,18 +426,18 @@ public class VideoEditorImpl implements VideoEditor {
     public void generatePreview(MediaProcessingProgressListener listener) {
         boolean semAcquireDone = false;
         try {
-            mPreviewSemaphore.acquire();
+            mMANativeHelper.lock();
             semAcquireDone = true;
-            mMANativeHelper.setGeneratePreview(true);
+
             if ((mMediaItems.size() > 0) || (mAudioTracks.size() > 0)) {
-                mMANativeHelper.previewStoryBoard(mMediaItems, mTransitions,
-                        mAudioTracks, listener);
+                mMANativeHelper.previewStoryBoard(mMediaItems, mTransitions, mAudioTracks,
+                        listener);
             }
         } catch (InterruptedException  ex) {
             Log.e(TAG, "Sem acquire NOT successful in previewStoryBoard");
         } finally {
             if (semAcquireDone) {
-                mPreviewSemaphore.release();
+                mMANativeHelper.unlock();
             }
         }
     }
@@ -553,29 +543,28 @@ public class VideoEditorImpl implements VideoEditor {
 
         if (afterAudioTrackId == null) {
             mAudioTracks.add(0, audioTrack);
+            mMANativeHelper.setGeneratePreview(true);
         } else {
             final int audioTrackCount = mAudioTracks.size();
             for (int i = 0; i < audioTrackCount; i++) {
                 AudioTrack at = mAudioTracks.get(i);
                 if (at.getId().equals(afterAudioTrackId)) {
                     mAudioTracks.add(i + 1, audioTrack);
+                    mMANativeHelper.setGeneratePreview(true);
                     return;
                 }
             }
-            throw new IllegalArgumentException("AudioTrack not found: "
-                                                           + afterAudioTrackId);
+
+            throw new IllegalArgumentException("AudioTrack not found: " + afterAudioTrackId);
         }
-        mMANativeHelper.setGeneratePreview(true);
     }
 
     /*
      * {@inheritDoc}
      */
-    public synchronized void insertMediaItem(MediaItem mediaItem,
-                                             String afterMediaItemId) {
+    public synchronized void insertMediaItem(MediaItem mediaItem, String afterMediaItemId) {
         if (mMediaItems.contains(mediaItem)) {
-            throw new IllegalArgumentException("Media item already exists: "
-                                                           + mediaItem.getId());
+            throw new IllegalArgumentException("Media item already exists: " + mediaItem.getId());
         }
 
         if (afterMediaItemId == null) {
@@ -585,9 +574,11 @@ public class VideoEditorImpl implements VideoEditor {
                  */
                 removeTransitionBefore(0);
             }
+
             mMediaItems.add(0, mediaItem);
             computeTimelineDuration();
             generateProjectThumbnail();
+            mMANativeHelper.setGeneratePreview(true);
         } else {
             final int mediaItemCount = mMediaItems.size();
             for (int i = 0; i < mediaItemCount; i++) {
@@ -606,29 +597,25 @@ public class VideoEditorImpl implements VideoEditor {
                     return;
                 }
             }
-            throw new IllegalArgumentException("MediaItem not found: "
-                                                            + afterMediaItemId);
+
+            throw new IllegalArgumentException("MediaItem not found: " + afterMediaItemId);
         }
-        mMANativeHelper.setGeneratePreview(true);
     }
 
     /*
      * {@inheritDoc}
      */
-    public synchronized void moveAudioTrack(String audioTrackId,
-                                            String afterAudioTrackId) {
+    public synchronized void moveAudioTrack(String audioTrackId, String afterAudioTrackId) {
         throw new IllegalStateException("Not supported");
     }
 
     /*
      * {@inheritDoc}
      */
-    public synchronized void moveMediaItem(String mediaItemId,
-                                           String afterMediaItemId) {
+    public synchronized void moveMediaItem(String mediaItemId, String afterMediaItemId) {
         final MediaItem moveMediaItem = removeMediaItem(mediaItemId,true);
         if (moveMediaItem == null) {
-            throw new IllegalArgumentException("Target MediaItem not found: "
-                                                                 + mediaItemId);
+            throw new IllegalArgumentException("Target MediaItem not found: " + mediaItemId);
         }
 
         if (afterMediaItemId == null) {
@@ -643,6 +630,8 @@ public class VideoEditorImpl implements VideoEditor {
                  */
                 mMediaItems.add(0, moveMediaItem);
                 computeTimelineDuration();
+                mMANativeHelper.setGeneratePreview(true);
+
                 generateProjectThumbnail();
             } else {
                 throw new IllegalStateException("Cannot move media item (it is the only item)");
@@ -666,10 +655,8 @@ public class VideoEditorImpl implements VideoEditor {
                 }
             }
 
-            throw new IllegalArgumentException("MediaItem not found: "
-                                                            + afterMediaItemId);
+            throw new IllegalArgumentException("MediaItem not found: " + afterMediaItemId);
         }
-        mMANativeHelper.setGeneratePreview(true);
     }
 
     /*
@@ -681,16 +668,15 @@ public class VideoEditorImpl implements VideoEditor {
         mAudioTracks.clear();
         mTransitions.clear();
         mMANativeHelper.releaseNativeHelper();
-        if (mMANativeHelper!= null)
-            mMANativeHelper = null;
-        if (veObject != null)
-            veObject= null;
+        mMANativeHelper = null;
     }
 
     /*
      * {@inheritDoc}
      */
     public synchronized void removeAllMediaItems() {
+        mMANativeHelper.setGeneratePreview(true);
+
         mMediaItems.clear();
 
         /**
@@ -702,7 +688,6 @@ public class VideoEditorImpl implements VideoEditor {
         mTransitions.clear();
 
         mDurationMs = 0;
-        mMANativeHelper.setGeneratePreview(true);
         /**
          * If a thumbnail already exists, then delete it
          */
@@ -722,11 +707,10 @@ public class VideoEditorImpl implements VideoEditor {
             audioTrack.invalidate();
             mMANativeHelper.invalidatePcmFile();
             mMANativeHelper.setAudioflag(true);
-        }
-        else {
+            mMANativeHelper.setGeneratePreview(true);
+        else {
             throw new IllegalArgumentException(" No more audio tracks");
         }
-        mMANativeHelper.setGeneratePreview(true);
         return audioTrack;
     }
 
@@ -737,6 +721,7 @@ public class VideoEditorImpl implements VideoEditor {
         final String firstItemString = mMediaItems.get(0).getId();
         final MediaItem mediaItem = getMediaItem(mediaItemId);
         if (mediaItem != null) {
+            mMANativeHelper.setGeneratePreview(true);
             /**
              *  Remove the media item
              */
@@ -760,10 +745,10 @@ public class VideoEditorImpl implements VideoEditor {
             removeAdjacentTransitions(mediaItem);
             computeTimelineDuration();
         }
-        mMANativeHelper.setGeneratePreview(true);
+
         /**
          * If string equals first mediaItem, then
-         * generate Project thumbail
+         * generate Project thumbnail
          */
         if (firstItemString.equals(mediaItemId)) {
             generateProjectThumbnail();
@@ -784,6 +769,7 @@ public class VideoEditorImpl implements VideoEditor {
 
         final MediaItem mediaItem = getMediaItem(mediaItemId);
         if (mediaItem != null) {
+            mMANativeHelper.setGeneratePreview(true);
             /**
              *  Remove the media item
              */
@@ -794,7 +780,6 @@ public class VideoEditorImpl implements VideoEditor {
             removeAdjacentTransitions(mediaItem);
             computeTimelineDuration();
         }
-        mMANativeHelper.setGeneratePreview(true);
 
         /**
          * If string equals first mediaItem, then
@@ -812,10 +797,11 @@ public class VideoEditorImpl implements VideoEditor {
     public synchronized Transition removeTransition(String transitionId) {
         final Transition transition = getTransition(transitionId);
         if (transition == null) {
-            throw new IllegalStateException("Transition not found: "
-                                                                + transitionId);
+            throw new IllegalStateException("Transition not found: " + transitionId);
         }
 
+        mMANativeHelper.setGeneratePreview(true);
+
         /**
          *  Remove the transition references
          */
@@ -832,7 +818,6 @@ public class VideoEditorImpl implements VideoEditor {
         mTransitions.remove(transition);
         transition.invalidate();
         computeTimelineDuration();
-        mMANativeHelper.setGeneratePreview(true);
         return transition;
     }
 
@@ -841,63 +826,43 @@ public class VideoEditorImpl implements VideoEditor {
      */
     public long renderPreviewFrame(SurfaceHolder surfaceHolder, long timeMs,
                                     OverlayData overlayData) {
-        long result = 0;
-        int surfaceWidth = 0;
-        int surfaceHeight = 0;
-        Rect frame;
-
         if (surfaceHolder == null) {
             throw new IllegalArgumentException("Surface Holder is null");
         }
 
+        final Surface surface = surfaceHolder.getSurface();
+        if (surface == null) {
+            throw new IllegalArgumentException("Surface could not be retrieved from Surface holder");
+        }
+
         if (timeMs < 0) {
             throw new IllegalArgumentException("requested time not correct");
         } else if (timeMs > mDurationMs) {
             throw new IllegalArgumentException("requested time more than duration");
         }
-        if (mMANativeHelper != null) {
-            if (mMANativeHelper.mInvalidatePreviewArray) {
-                return -1;
-            }
-        }
-        else {
-            return -1;
-        }
-        boolean semAcquireDone = false;
 
-        try{
-            mPreviewSemaphore.acquire();
-            semAcquireDone = true;
-            Surface surface = surfaceHolder.getSurface();
-            frame = surfaceHolder.getSurfaceFrame();
-            surfaceWidth = frame.width();
-            surfaceHeight = frame.height();
+        long result = 0;
 
-            if (surface == null) {
-                throw new RuntimeException("Surface could not be retrieved from Surface holder");
-            }
+        boolean semAcquireDone = false;
+        try {
+            mMANativeHelper.lock();
+            semAcquireDone = true;
 
-            if (!mMANativeHelper.mInvalidatePreviewArray) {
-                if (mMediaItems.size() > 0) {
-                    result = mMANativeHelper.renderPreviewFrame(surface,
-                                             timeMs,surfaceWidth,surfaceHeight, overlayData);
-                }
-                else {
-                    result = 0;
-                }
-            }
-            else {
-                result = -1;
+            if (mMediaItems.size() > 0) {
+                final Rect frame = surfaceHolder.getSurfaceFrame();
+                result = mMANativeHelper.renderPreviewFrame(surface,
+                        timeMs, frame.width(), frame.height(), overlayData);
+            } else {
+                result = 0;
             }
-
         } catch (InterruptedException  ex) {
             Log.e(TAG, "Sem acquire NOT successful in renderPreviewFrame");
-        }
-        finally {
+        } finally {
             if (semAcquireDone) {
-                mPreviewSemaphore.release();
+                mMANativeHelper.unlock();
             }
         }
+
         return result;
     }
 
@@ -926,10 +891,6 @@ public class VideoEditorImpl implements VideoEditor {
                             mAspectRatio =
                                    Integer.parseInt(parser.getAttributeValue("",
                                    ATTR_ASPECT_RATIO));
-                            final boolean mInvalidatePreviewArray =
-                               Boolean.parseBoolean(parser.getAttributeValue("",
-                                    ATTR_PREVIEW_PREPARE));
-                            mMANativeHelper.setGeneratePreview(mInvalidatePreviewArray);
 
                             final boolean mRegenPCM =
                                Boolean.parseBoolean(parser.getAttributeValue("",
@@ -1126,7 +1087,7 @@ public class VideoEditorImpl implements VideoEditor {
             final String transitionFile = parser.getAttributeValue("",
                                                 ATTR_GENERATED_TRANSITION_CLIP);
 
-            if (new File(transitionFile).exists() == true) {
+            if (new File(transitionFile).exists()) {
                 transition.setFilename(transitionFile);
             } else {
                 transition.setFilename(null);
@@ -1300,8 +1261,6 @@ public class VideoEditorImpl implements VideoEditor {
         serializer.startTag("", TAG_PROJECT);
         serializer.attribute("",
                              ATTR_ASPECT_RATIO, Integer.toString(mAspectRatio));
-        serializer.attribute("", ATTR_PREVIEW_PREPARE,
-                        Boolean.toString(mMANativeHelper.getGeneratePreview()));
 
         serializer.attribute("", ATTR_REGENERATE_PCM,
                         Boolean.toString(mMANativeHelper.getAudioflag()));
@@ -1551,56 +1510,54 @@ public class VideoEditorImpl implements VideoEditor {
         if (surfaceHolder == null) {
             throw new IllegalArgumentException();
         }
+
+        final Surface surface = surfaceHolder.getSurface();
+        if (surface == null) {
+            throw new IllegalArgumentException("Surface could not be retrieved from surface holder");
+        }
+
         if (listener == null) {
             throw new IllegalArgumentException();
         }
+
         if (fromMs >= mDurationMs) {
-            throw new IllegalArgumentException("requested time not correct");
+            throw new IllegalArgumentException("Requested time not correct");
         }
 
         if (fromMs < 0) {
-            throw new IllegalArgumentException("requested time not correct");
+            throw new IllegalArgumentException("Requested time not correct");
         }
 
         boolean semAcquireDone = false;
         try{
-            mPreviewSemaphore.acquire();
+            mMANativeHelper.lock();
             semAcquireDone = true;
-        } catch (InterruptedException  ex) {
-            Log.e(TAG, "Sem acquire NOT successful in startPreview");
-        }
-
-        if (semAcquireDone) {
-            Surface mSurface = surfaceHolder.getSurface();
-
-            if (mSurface == null) {
-                throw new RuntimeException("Surface could not be retrieved from surface holder");
-            }
 
             if (mMediaItems.size() > 0) {
-                try {
-                    mMANativeHelper.previewStoryBoard(mMediaItems, mTransitions,
-                                                      mAudioTracks, null);
-                    mMANativeHelper.doPreview(mSurface, fromMs, toMs, loop,
-                                     callbackAfterFrameCount, listener);
-                    mPreviewInProgress = true;
-                } catch (IllegalArgumentException ex) {
-                    mPreviewSemaphore.release();
-                    Log.e(TAG, "Illegal Argument exception in do preview");
-                    throw ex;
-                } catch (IllegalStateException ex) {
-                    mPreviewSemaphore.release();
-                    Log.e(TAG, "Illegal State exception in do preview");
-                    throw ex;
-                } catch (RuntimeException ex) {
-                    mPreviewSemaphore.release();
-                    Log.e(TAG, "Runtime exception in do preview");
-                    throw ex;
-                }
+                mMANativeHelper.previewStoryBoard(mMediaItems, mTransitions,
+                                                  mAudioTracks, null);
+                mMANativeHelper.doPreview(surface, fromMs, toMs, loop,
+                                 callbackAfterFrameCount, listener);
+                mPreviewInProgress = true;
             }
             /**
              *  release on complete by calling stopPreview
              */
+        } catch (InterruptedException  ex) {
+            Log.e(TAG, "Sem acquire NOT successful in startPreview");
+        } catch (IllegalArgumentException ex) {
+            Log.e(TAG, "Illegal Argument exception in do preview");
+            throw ex;
+        } catch (IllegalStateException ex) {
+            Log.e(TAG, "Illegal State exception in do preview");
+            throw ex;
+        } catch (RuntimeException ex) {
+            Log.e(TAG, "Runtime exception in do preview");
+            throw ex;
+        } finally {
+            if (semAcquireDone) {
+                mMANativeHelper.unlock();
+            }
         }
     }
 
@@ -1614,10 +1571,9 @@ public class VideoEditorImpl implements VideoEditor {
             /**
              *  release the sem acquired in startPreview
              */
-            mPreviewSemaphore.release();
+            mMANativeHelper.unlock();
             return result;
-        }
-        else {
+        } else {
             return 0;
         }
     }
@@ -1662,6 +1618,7 @@ public class VideoEditorImpl implements VideoEditor {
             Transition t = it.next();
             if (t.getBeforeMediaItem() == mediaItem) {
                 it.remove();
+                mMANativeHelper.setGeneratePreview(true);
                 t.invalidate();
                 mediaItem.setBeginTransition(null);
                 if (index > 0) {
@@ -1684,6 +1641,7 @@ public class VideoEditorImpl implements VideoEditor {
             Transition t = it.next();
             if (t.getAfterMediaItem() == mediaItem) {
                 it.remove();
+                mMANativeHelper.setGeneratePreview(true);
                 t.invalidate();
                 mediaItem.setEndTransition(null);
                 /**
@@ -1730,22 +1688,22 @@ public class VideoEditorImpl implements VideoEditor {
         if (mMediaItems.size() > 0) {
             MediaItem mI = mMediaItems.get(0);
             /*
-             * Lets initialiZe the width for default aspect ratio i.e 16:9
+             * Lets initialize the width for default aspect ratio i.e 16:9
              */
             int height = 480;
             int width = 854;
             switch (mI.getAspectRatio()) {
                 case MediaProperties.ASPECT_RATIO_3_2:
-                    width =  720;
+                    width = 720;
                     break;
                 case MediaProperties.ASPECT_RATIO_4_3:
-                    width =  640;
+                    width = 640;
                     break;
                 case MediaProperties.ASPECT_RATIO_5_3:
-                    width =  800;
+                    width = 800;
                     break;
                 case MediaProperties.ASPECT_RATIO_11_9:
-                    width =  586;
+                    width = 586;
                     break;
                 case MediaProperties.ASPECT_RATIO_16_9:
                 case MediaProperties.ASPECT_RATIO_UNDEFINED:
@@ -1756,10 +1714,11 @@ public class VideoEditorImpl implements VideoEditor {
             try {
                 projectBitmap = mI.getThumbnail(width, height, 500);
             } catch (IllegalArgumentException e) {
-                throw new IllegalArgumentException ("Illegal Argument Error creating project thumbnail");
+                throw new IllegalArgumentException ("Illegal argument error creating project thumbnail");
             } catch (IOException e) {
                 throw new IllegalArgumentException ("IO Error creating project thumbnail");
             }
+
             try {
                 FileOutputStream stream = new FileOutputStream(mProjectPath + "/"
                                                           + THUMBNAIL_FILENAME);
@@ -1767,7 +1726,6 @@ public class VideoEditorImpl implements VideoEditor {
                 stream.flush();
                 stream.close();
             } catch (IOException e) {
-
                 throw new IllegalArgumentException ("Error creating project thumbnail");
             } finally {
                 projectBitmap.recycle();
@@ -1788,7 +1746,7 @@ public class VideoEditorImpl implements VideoEditor {
 
         final Surface surface = surfaceHolder.getSurface();
         if (surface == null) {
-            throw new RuntimeException("Surface could not be retrieved from surface holder");
+            throw new IllegalArgumentException("Surface could not be retrieved from surface holder");
         }
 
         if (mMANativeHelper != null) {