diff --git a/libvideoeditor/lvpp/AudioPlayerBase.cpp b/libvideoeditor/lvpp/AudioPlayerBase.cpp
index 26c6a63..b45f9bf 100644
--- a/libvideoeditor/lvpp/AudioPlayerBase.cpp
+++ b/libvideoeditor/lvpp/AudioPlayerBase.cpp
@@ -86,7 +86,7 @@
 
     mFirstBufferResult = mSource->read(&mFirstBuffer);
     if (mFirstBufferResult == INFO_FORMAT_CHANGED) {
-        LOGV("INFO_FORMAT_CHANGED!!!");
+        ALOGV("INFO_FORMAT_CHANGED!!!");
 
         CHECK(mFirstBuffer == NULL);
         mFirstBufferResult = OK;
@@ -215,7 +215,7 @@
     }
 
     if (mInputBuffer != NULL) {
-        LOGV("AudioPlayerBase releasing input buffer.");
+        ALOGV("AudioPlayerBase releasing input buffer.");
 
         mInputBuffer->release();
         mInputBuffer = NULL;
@@ -302,7 +302,7 @@
 
 size_t AudioPlayerBase::fillBuffer(void *data, size_t size) {
     if (mNumFramesPlayed == 0) {
-        LOGV("AudioCallback");
+        ALOGV("AudioCallback");
     }
 
     if (mReachedEOS) {
@@ -382,12 +382,12 @@
                     int64_t timeToCompletionUs =
                         (1000000ll * numFramesPendingPlayout) / mSampleRate;
 
-                    LOGV("total number of frames played: %lld (%lld us)",
+                    ALOGV("total number of frames played: %lld (%lld us)",
                             (mNumFramesPlayed + numAdditionalFrames),
                             1000000ll * (mNumFramesPlayed + numAdditionalFrames)
                                 / mSampleRate);
 
-                    LOGV("%d frames left to play, %lld us (%.2f secs)",
+                    ALOGV("%d frames left to play, %lld us (%.2f secs)",
                          numFramesPendingPlayout,
                          timeToCompletionUs, timeToCompletionUs / 1E6);
 
@@ -407,7 +407,7 @@
                 ((mNumFramesPlayed + size_done / mFrameSize) * 1000000)
                     / mSampleRate;
 
-            LOGV("buffer->size() = %d, "
+            ALOGV("buffer->size() = %d, "
                  "mPositionTimeMediaUs=%.2f mPositionTimeRealUs=%.2f",
                  mInputBuffer->range_length(),
                  mPositionTimeMediaUs / 1E6, mPositionTimeRealUs / 1E6);
diff --git a/libvideoeditor/lvpp/DummyAudioSource.cpp b/libvideoeditor/lvpp/DummyAudioSource.cpp
index db1b573..a037d24 100755
--- a/libvideoeditor/lvpp/DummyAudioSource.cpp
+++ b/libvideoeditor/lvpp/DummyAudioSource.cpp
@@ -39,8 +39,8 @@
 /*  DEBUG LEVEL SETUP  */
 /*---------------------*/
 #define LOG1 LOGE    /*ERRORS Logging*/
-#define LOG2 LOGV    /*WARNING Logging*/
-#define LOG3 //LOGV    /*COMMENTS Logging*/
+#define LOG2 ALOGV    /*WARNING Logging*/
+#define LOG3 //ALOGV    /*COMMENTS Logging*/
 
 /*---------------------*/
 /*  CONSTANTS          */
diff --git a/libvideoeditor/lvpp/DummyVideoSource.cpp b/libvideoeditor/lvpp/DummyVideoSource.cpp
index 44be104..89c2407 100755
--- a/libvideoeditor/lvpp/DummyVideoSource.cpp
+++ b/libvideoeditor/lvpp/DummyVideoSource.cpp
@@ -33,8 +33,8 @@
 
 
 #define LOG1 LOGE    /*ERRORS Logging*/
-#define LOG2 LOGV    /*WARNING Logging*/
-#define LOG3 //LOGV    /*COMMENTS Logging*/
+#define LOG2 ALOGV    /*WARNING Logging*/
+#define LOG3 //ALOGV    /*COMMENTS Logging*/
 
 
 namespace android {
diff --git a/libvideoeditor/lvpp/PreviewPlayer.cpp b/libvideoeditor/lvpp/PreviewPlayer.cpp
index 349e9c2..bdb5ce4 100755
--- a/libvideoeditor/lvpp/PreviewPlayer.cpp
+++ b/libvideoeditor/lvpp/PreviewPlayer.cpp
@@ -201,11 +201,11 @@
 
     /* Add the support for Dummy audio*/
     if( !haveAudio ){
-        LOGV("PreviewPlayer: setDataSource_l Dummyaudiocreation started");
+        ALOGV("PreviewPlayer: setDataSource_l Dummyaudiocreation started");
 
         mAudioTrack = DummyAudioSource::Create(32000, 2, 20000,
                                               ((mPlayEndTimeMsec)*1000LL));
-        LOGV("PreviewPlayer: setDataSource_l Dummyauiosource created");
+        ALOGV("PreviewPlayer: setDataSource_l Dummyauiosource created");
         if(mAudioTrack != NULL) {
             haveAudio = true;
         }
@@ -221,17 +221,17 @@
 
 status_t PreviewPlayer::setDataSource_l_jpg() {
     M4OSA_ERR err = M4NO_ERROR;
-    LOGV("PreviewPlayer: setDataSource_l_jpg started");
+    ALOGV("PreviewPlayer: setDataSource_l_jpg started");
 
     mAudioSource = DummyAudioSource::Create(32000, 2, 20000,
                                           ((mPlayEndTimeMsec)*1000LL));
-    LOGV("PreviewPlayer: setDataSource_l_jpg Dummyaudiosource created");
+    ALOGV("PreviewPlayer: setDataSource_l_jpg Dummyaudiosource created");
     if(mAudioSource != NULL) {
         setAudioSource(mAudioSource);
     }
     status_t error = mAudioSource->start();
     if (error != OK) {
-        LOGV("Error starting dummy audio source");
+        ALOGV("Error starting dummy audio source");
         mAudioSource.clear();
         return err;
     }
@@ -380,7 +380,7 @@
     CHECK(!(mFlags & PLAYING));
     mAudioPlayer = audioPlayer;
 
-    LOGV("SetAudioPlayer");
+    ALOGV("SetAudioPlayer");
     mIsChangeSourceRequired = true;
     mVeAudioPlayer =
             (VideoEditorAudioPlayer*)mAudioPlayer;
@@ -389,7 +389,7 @@
     sp<MediaSource> anAudioSource = mVeAudioPlayer->getSource();
     if (anAudioSource == NULL) {
         // Audio player does not have any source set.
-        LOGV("setAudioPlayer: Audio player does not have any source set");
+        ALOGV("setAudioPlayer: Audio player does not have any source set");
         return OK;
     }
 
@@ -402,7 +402,7 @@
         const char *pVidSrcType;
         if (meta->findCString(kKeyDecoderComponent, &pVidSrcType)) {
             if (strcmp(pVidSrcType, "DummyVideoSource") != 0) {
-                LOGV(" Video clip with silent audio; need to change source");
+                ALOGV(" Video clip with silent audio; need to change source");
                 return OK;
             }
         }
@@ -427,7 +427,7 @@
 
                     // Stop the new audio source
                     // since we continue using old source
-                    LOGV("setAudioPlayer: stop new audio source");
+                    ALOGV("setAudioPlayer: stop new audio source");
                     mAudioSource->stop();
                 }
             }
@@ -447,7 +447,7 @@
     mStreamDoneEventPending = false;
 
     if (mStreamDoneStatus != ERROR_END_OF_STREAM) {
-        LOGV("MEDIA_ERROR %d", mStreamDoneStatus);
+        ALOGV("MEDIA_ERROR %d", mStreamDoneStatus);
 
         notifyListener_l(
                 MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus);
@@ -473,7 +473,7 @@
             postVideoEvent_l();
         }
     } else {
-        LOGV("MEDIA_PLAYBACK_COMPLETE");
+        ALOGV("MEDIA_PLAYBACK_COMPLETE");
         //pause before sending event
         pause_l(true /* at eos */);
 
@@ -499,7 +499,7 @@
             mFlags |= INFORMED_AV_EOS;
         }
         mFlags |= AT_EOS;
-        LOGV("onStreamDone end");
+        ALOGV("onStreamDone end");
         return;
     }
 }
@@ -572,7 +572,7 @@
             bool isAudioPlayerStarted = mVeAudioPlayer->isStarted();
 
             if (mIsChangeSourceRequired == true) {
-                LOGV("play_l: Change audio source required");
+                ALOGV("play_l: Change audio source required");
 
                 if (isAudioPlayerStarted == true) {
                     mVeAudioPlayer->pause();
@@ -602,7 +602,7 @@
                     }
                 }
             } else {
-                LOGV("play_l: No Source change required");
+                ALOGV("play_l: No Source change required");
                 mVeAudioPlayer->setAudioMixStoryBoardSkimTimeStamp(
                     mAudioMixStoryBoardTS, mCurrentMediaBeginCutTime,
                     mCurrentMediaVolumeValue);
@@ -708,7 +708,7 @@
                 mAudioTrack);
 
         if(aRawSource != NULL) {
-            LOGV("initAudioDecoder: new VideoEditorSRC");
+            ALOGV("initAudioDecoder: new VideoEditorSRC");
             mAudioSource = new VideoEditorSRC(aRawSource);
         }
     }
@@ -820,7 +820,7 @@
     if (!mVideoBuffer) {
         MediaSource::ReadOptions options;
         if (mSeeking != NO_SEEK) {
-            LOGV("LV PLAYER seeking to %lld us (%.2f secs)", mSeekTimeUs,
+            ALOGV("LV PLAYER seeking to %lld us (%.2f secs)", mSeekTimeUs,
                                                       mSeekTimeUs / 1E6);
 
             options.setSeekTo(
@@ -834,7 +834,7 @@
                 CHECK_EQ(mVideoBuffer, NULL);
 
                 if (err == INFO_FORMAT_CHANGED) {
-                    LOGV("LV PLAYER VideoSource signalled format change");
+                    ALOGV("LV PLAYER VideoSource signalled format change");
                     notifyVideoSize_l();
 
                     if (mVideoRenderer != NULL) {
@@ -852,10 +852,10 @@
                 // So video playback is complete, but we may still have
                 // a seek request pending that needs to be applied to the audio track
                 if (mSeeking != NO_SEEK) {
-                    LOGV("video stream ended while seeking!");
+                    ALOGV("video stream ended while seeking!");
                 }
                 finishSeekIfNecessary(-1);
-                LOGV("PreviewPlayer: onVideoEvent EOS reached.");
+                ALOGV("PreviewPlayer: onVideoEvent EOS reached.");
                 mFlags |= VIDEO_AT_EOS;
                 mFlags |= AUDIO_AT_EOS;
                 mOverlayUpdateEventPosted = false;
@@ -959,12 +959,12 @@
             // Let's display the first frame after seeking right away.
             latenessUs = 0;
         }
-        LOGV("Audio time stamp = %lld and video time stamp = %lld",
+        ALOGV("Audio time stamp = %lld and video time stamp = %lld",
                                             ts->getRealTimeUs(),timeUs);
         if (latenessUs > 40000) {
             // We're more than 40ms late.
 
-            LOGV("LV PLAYER we're late by %lld us (%.2f secs)",
+            ALOGV("LV PLAYER we're late by %lld us (%.2f secs)",
                                            latenessUs, latenessUs / 1E6);
 
             mVideoBuffer->release();
@@ -975,7 +975,7 @@
 
         if (latenessUs < -25000) {
             // We're more than 25ms early.
-            LOGV("We're more than 25ms early, lateness %lld", latenessUs);
+            ALOGV("We're more than 25ms early, lateness %lld", latenessUs);
 
             postVideoEvent_l(25000);
             return;
@@ -997,7 +997,7 @@
         mVideoBuffer = NULL;
         mFlags |= VIDEO_AT_EOS;
         mFlags |= AUDIO_AT_EOS;
-        LOGV("PreviewPlayer: onVideoEvent timeUs > mPlayEndTime; send EOS..");
+        ALOGV("PreviewPlayer: onVideoEvent timeUs > mPlayEndTime; send EOS..");
         mOverlayUpdateEventPosted = false;
         // Set the last decoded timestamp to duration
         mDecodedVideoTs = (mPlayEndTimeMsec*1000LL);
@@ -1057,15 +1057,15 @@
                 mCurrFramingEffectIndex = index;
                 mOverlayUpdateEventPosted = true;
                 postOverlayUpdateEvent_l();
-                LOGV("Framing index = %d", mCurrFramingEffectIndex);
+                ALOGV("Framing index = %d", mCurrFramingEffectIndex);
             } else {
-                LOGV("No framing effects found");
+                ALOGV("No framing effects found");
             }
         }
 
     } else if (mOverlayUpdateEventPosted) {
         //Post the event when the overlay is no more valid
-        LOGV("Overlay is Done");
+        ALOGV("Overlay is Done");
         mOverlayUpdateEventPosted = false;
         postOverlayUpdateEvent_l();
     }
@@ -1086,7 +1086,7 @@
 
     // if reached EndCutTime of clip, post EOS event
     if((timeUs/1000) >= mPlayEndTimeMsec) {
-        LOGV("PreviewPlayer: onVideoEvent EOS.");
+        ALOGV("PreviewPlayer: onVideoEvent EOS.");
         mFlags |= VIDEO_AT_EOS;
         mFlags |= AUDIO_AT_EOS;
         mOverlayUpdateEventPosted = false;
@@ -1178,7 +1178,7 @@
     }
 
     if (extractor == NULL) {
-        LOGV("PreviewPlayer::finishSetDataSource_l  extractor == NULL");
+        ALOGV("PreviewPlayer::finishSetDataSource_l  extractor == NULL");
         return setDataSource_l_jpg();
     }
 
@@ -1195,10 +1195,10 @@
 
 void PreviewPlayer::onPrepareAsyncEvent() {
     Mutex::Autolock autoLock(mLock);
-    LOGV("onPrepareAsyncEvent");
+    ALOGV("onPrepareAsyncEvent");
 
     if (mFlags & PREPARE_CANCELLED) {
-        LOGV("LV PLAYER prepare was cancelled before doing anything");
+        ALOGV("LV PLAYER prepare was cancelled before doing anything");
         abortPrepare(UNKNOWN_ERROR);
         return;
     }
@@ -1236,13 +1236,13 @@
 void PreviewPlayer::finishAsyncPrepare_l() {
     if (mIsAsyncPrepare) {
         if (mVideoSource == NULL) {
-            LOGV("finishAsyncPrepare_l: MEDIA_SET_VIDEO_SIZE 0 0 ");
+            ALOGV("finishAsyncPrepare_l: MEDIA_SET_VIDEO_SIZE 0 0 ");
             notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0);
         } else {
-            LOGV("finishAsyncPrepare_l: MEDIA_SET_VIDEO_SIZE");
+            ALOGV("finishAsyncPrepare_l: MEDIA_SET_VIDEO_SIZE");
             notifyVideoSize_l();
         }
-        LOGV("finishAsyncPrepare_l: MEDIA_PREPARED");
+        ALOGV("finishAsyncPrepare_l: MEDIA_PREPARED");
         notifyListener_l(MEDIA_PREPARED);
     }
 
@@ -1254,12 +1254,12 @@
 }
 
 void PreviewPlayer::acquireLock() {
-    LOGV("acquireLock");
+    ALOGV("acquireLock");
     mLockControl.lock();
 }
 
 void PreviewPlayer::releaseLock() {
-    LOGV("releaseLock");
+    ALOGV("releaseLock");
     mLockControl.unlock();
 }
 
@@ -1276,7 +1276,7 @@
 status_t PreviewPlayer::loadAudioMixSettings(
                     M4xVSS_AudioMixingSettings* pAudioMixSettings) {
 
-    LOGV("PreviewPlayer: loadAudioMixSettings: ");
+    ALOGV("PreviewPlayer: loadAudioMixSettings: ");
     mPreviewPlayerAudioMixSettings = pAudioMixSettings;
     return OK;
 }
@@ -1284,7 +1284,7 @@
 status_t PreviewPlayer::setAudioMixPCMFileHandle(
                     M4OSA_Context pAudioMixPCMFileHandle) {
 
-    LOGV("PreviewPlayer: setAudioMixPCMFileHandle: ");
+    ALOGV("PreviewPlayer: setAudioMixPCMFileHandle: ");
     mAudioMixPCMFileHandle = pAudioMixPCMFileHandle;
     return OK;
 }
@@ -1479,12 +1479,12 @@
 }
 
 status_t PreviewPlayer::readFirstVideoFrame() {
-    LOGV("PreviewPlayer::readFirstVideoFrame");
+    ALOGV("PreviewPlayer::readFirstVideoFrame");
 
     if (!mVideoBuffer) {
         MediaSource::ReadOptions options;
         if (mSeeking != NO_SEEK) {
-            LOGV("LV PLAYER seeking to %lld us (%.2f secs)", mSeekTimeUs,
+            ALOGV("LV PLAYER seeking to %lld us (%.2f secs)", mSeekTimeUs,
                     mSeekTimeUs / 1E6);
 
             options.setSeekTo(
@@ -1498,7 +1498,7 @@
                 CHECK_EQ(mVideoBuffer, NULL);
 
                 if (err == INFO_FORMAT_CHANGED) {
-                    LOGV("LV PLAYER VideoSource signalled format change");
+                    ALOGV("LV PLAYER VideoSource signalled format change");
                     notifyVideoSize_l();
 
                     if (mVideoRenderer != NULL) {
@@ -1512,7 +1512,7 @@
                     updateSizeToRender(mVideoSource->getFormat());
                     continue;
                 }
-                LOGV("PreviewPlayer: onVideoEvent EOS reached.");
+                ALOGV("PreviewPlayer: onVideoEvent EOS reached.");
                 mFlags |= VIDEO_AT_EOS;
                 mFlags |= AUDIO_AT_EOS;
                 postStreamDoneEvent_l(err);
diff --git a/libvideoeditor/lvpp/PreviewPlayerBase.cpp b/libvideoeditor/lvpp/PreviewPlayerBase.cpp
index aed26ef..62d7c1a 100644
--- a/libvideoeditor/lvpp/PreviewPlayerBase.cpp
+++ b/libvideoeditor/lvpp/PreviewPlayerBase.cpp
@@ -335,7 +335,7 @@
 
     mBitrate = totalBitRate;
 
-    LOGV("mBitrate = %lld bits/sec", mBitrate);
+    ALOGV("mBitrate = %lld bits/sec", mBitrate);
 
     bool haveAudio = false;
     bool haveVideo = false;
@@ -546,7 +546,7 @@
     int64_t videoLateByUs = audioTimeUs - mVideoTimeUs;
 
     if (!(mFlags & VIDEO_AT_EOS) && videoLateByUs > 300000ll) {
-        LOGV("video late by %lld ms.", videoLateByUs / 1000ll);
+        ALOGV("video late by %lld ms.", videoLateByUs / 1000ll);
 
         notifyListener_l(
                 MEDIA_INFO,
@@ -574,7 +574,7 @@
                 notifyListener_l(MEDIA_BUFFERING_UPDATE, 100);
             }
             if (mFlags & PREPARING) {
-                LOGV("cache has reached EOS, prepare is done.");
+                ALOGV("cache has reached EOS, prepare is done.");
                 finishAsyncPrepare_l();
             }
         } else {
@@ -609,7 +609,7 @@
                         play_l();
                         notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END);
                     } else if (mFlags & PREPARING) {
-                        LOGV("cache has filled up (> %d), prepare is done",
+                        ALOGV("cache has filled up (> %d), prepare is done",
                              kHighWaterMarkBytes);
                         finishAsyncPrepare_l();
                     }
@@ -621,7 +621,7 @@
     int64_t cachedDurationUs;
     bool eos;
     if (getCachedDuration_l(&cachedDurationUs, &eos)) {
-        LOGV("cachedDurationUs = %.2f secs, eos=%d",
+        ALOGV("cachedDurationUs = %.2f secs, eos=%d",
              cachedDurationUs / 1E6, eos);
 
         if ((mFlags & PLAYING) && !eos
@@ -640,7 +640,7 @@
                 play_l();
                 notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END);
             } else if (mFlags & PREPARING) {
-                LOGV("cache has filled up (%.2f secs), prepare is done",
+                ALOGV("cache has filled up (%.2f secs), prepare is done",
                      cachedDurationUs / 1E6);
                 finishAsyncPrepare_l();
             }
@@ -660,7 +660,7 @@
     mStreamDoneEventPending = false;
 
     if (mStreamDoneStatus != ERROR_END_OF_STREAM) {
-        LOGV("MEDIA_ERROR %d", mStreamDoneStatus);
+        ALOGV("MEDIA_ERROR %d", mStreamDoneStatus);
 
         notifyListener_l(
                 MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus);
@@ -686,7 +686,7 @@
             postVideoEvent_l();
         }
     } else {
-        LOGV("MEDIA_PLAYBACK_COMPLETE");
+        ALOGV("MEDIA_PLAYBACK_COMPLETE");
         notifyListener_l(MEDIA_PLAYBACK_COMPLETE);
 
         pause_l(true /* at eos */);
@@ -859,12 +859,12 @@
 
     int32_t displayWidth;
     if (meta->findInt32(kKeyDisplayWidth, &displayWidth)) {
-        LOGV("Display width changed (%d=>%d)", mDisplayWidth, displayWidth);
+        ALOGV("Display width changed (%d=>%d)", mDisplayWidth, displayWidth);
         mDisplayWidth = displayWidth;
     }
     int32_t displayHeight;
     if (meta->findInt32(kKeyDisplayHeight, &displayHeight)) {
-        LOGV("Display height changed (%d=>%d)", mDisplayHeight, displayHeight);
+        ALOGV("Display height changed (%d=>%d)", mDisplayHeight, displayHeight);
         mDisplayHeight = displayHeight;
     }
 
@@ -1126,7 +1126,7 @@
     seekAudioIfNecessary_l();
 
     if (!(mFlags & PLAYING)) {
-        LOGV("seeking while paused, sending SEEK_COMPLETE notification"
+        ALOGV("seeking while paused, sending SEEK_COMPLETE notification"
              " immediately.");
 
         notifyListener_l(MEDIA_SEEK_COMPLETE);
@@ -1255,7 +1255,7 @@
         flags |= OMXCodec::kEnableGrallocUsageProtected;
     }
 #endif
-    LOGV("initVideoDecoder flags=0x%x", flags);
+    ALOGV("initVideoDecoder flags=0x%x", flags);
     mVideoSource = OMXCodec::Create(
             mClient.interface(), mVideoTrack->getFormat(),
             false, // createEncoder
@@ -1293,7 +1293,7 @@
     }
 
     if (mAudioPlayer != NULL) {
-        LOGV("seeking audio to %lld us (%.2f secs).", videoTimeUs, videoTimeUs / 1E6);
+        ALOGV("seeking audio to %lld us (%.2f secs).", videoTimeUs, videoTimeUs / 1E6);
 
         // If we don't have a video time, seek audio to the originally
         // requested seek time instead.
@@ -1356,7 +1356,7 @@
     if (!mVideoBuffer) {
         MediaSource::ReadOptions options;
         if (mSeeking != NO_SEEK) {
-            LOGV("seeking to %lld us (%.2f secs)", mSeekTimeUs, mSeekTimeUs / 1E6);
+            ALOGV("seeking to %lld us (%.2f secs)", mSeekTimeUs, mSeekTimeUs / 1E6);
 
             options.setSeekTo(
                     mSeekTimeUs,
@@ -1372,7 +1372,7 @@
                 CHECK(mVideoBuffer == NULL);
 
                 if (err == INFO_FORMAT_CHANGED) {
-                    LOGV("VideoSource signalled format change.");
+                    ALOGV("VideoSource signalled format change.");
 
                     notifyVideoSize_l();
 
@@ -1387,7 +1387,7 @@
                 // a seek request pending that needs to be applied
                 // to the audio track.
                 if (mSeeking != NO_SEEK) {
-                    LOGV("video stream ended while seeking!");
+                    ALOGV("video stream ended while seeking!");
                 }
                 finishSeekIfNecessary(-1);
 
@@ -1491,7 +1491,7 @@
 
         if (latenessUs > 40000) {
             // We're more than 40ms late.
-            LOGV("we're late by %lld us (%.2f secs), dropping frame",
+            ALOGV("we're late by %lld us (%.2f secs), dropping frame",
                  latenessUs, latenessUs / 1E6);
             mVideoBuffer->release();
             mVideoBuffer = NULL;
diff --git a/libvideoeditor/lvpp/VideoEditorAudioPlayer.cpp b/libvideoeditor/lvpp/VideoEditorAudioPlayer.cpp
index 89a0450..0812ec3 100755
--- a/libvideoeditor/lvpp/VideoEditorAudioPlayer.cpp
+++ b/libvideoeditor/lvpp/VideoEditorAudioPlayer.cpp
@@ -37,7 +37,7 @@
         PreviewPlayerBase *observer)
     : AudioPlayerBase(audioSink, observer) {
 
-    LOGV("VideoEditorAudioPlayer");
+    ALOGV("VideoEditorAudioPlayer");
     mBGAudioPCMFileHandle = NULL;
     mAudioProcess = NULL;
     mBGAudioPCMFileLength = 0;
@@ -54,7 +54,7 @@
 
 VideoEditorAudioPlayer::~VideoEditorAudioPlayer() {
 
-    LOGV("~VideoEditorAudioPlayer");
+    ALOGV("~VideoEditorAudioPlayer");
     if (mStarted) {
         reset();
     }
@@ -76,7 +76,7 @@
     }
 
     if (mInputBuffer != NULL) {
-        LOGV("VideoEditorAudioPlayer releasing input buffer.");
+        ALOGV("VideoEditorAudioPlayer releasing input buffer.");
 
         mInputBuffer->release();
         mInputBuffer = NULL;
@@ -97,7 +97,7 @@
 }
 
 void VideoEditorAudioPlayer::setObserver(PreviewPlayerBase *observer) {
-    LOGV("setObserver");
+    ALOGV("setObserver");
     //CHECK(!mStarted);
     mObserver = observer;
 }
@@ -110,7 +110,7 @@
     Mutex::Autolock autoLock(mLock);
     CHECK(!mStarted);
     CHECK(mSource != NULL);
-    LOGV("Start");
+    ALOGV("Start");
     status_t err;
     M4OSA_ERR result = M4NO_ERROR;
     M4OSA_UInt32 startTime = 0;
@@ -157,12 +157,12 @@
         mBGAudioPCMFileTrimmedLength = mBGAudioPCMFileLength;
 
 
-        LOGV("VideoEditorAudioPlayer::start M4OSA_kFileReadGetFileSize = %lld",
+        ALOGV("VideoEditorAudioPlayer::start M4OSA_kFileReadGetFileSize = %lld",
                             mBGAudioPCMFileLength);
 
         // Get the duration in time of the audio BT
         if ( result == M4NO_ERROR ) {
-         LOGV("VEAP: channels = %d freq = %d",
+         ALOGV("VEAP: channels = %d freq = %d",
          mAudioMixSettings->uiNbChannels,  mAudioMixSettings->uiSamplingFrequency);
 
             // No trim
@@ -171,7 +171,7 @@
                     mAudioMixSettings->uiNbChannels))*1000 ) /
                     mAudioMixSettings->uiSamplingFrequency;
 
-            LOGV("VideoEditorAudioPlayer:: beginCutMs %d , endCutMs %d",
+            ALOGV("VideoEditorAudioPlayer:: beginCutMs %d , endCutMs %d",
                     (unsigned int) mAudioMixSettings->beginCutMs,
                     (unsigned int) mAudioMixSettings->endCutMs);
 
@@ -212,15 +212,15 @@
                     sizeof(M4OSA_UInt16)) / 1000; /*make to sec from ms*/
             }
 
-            LOGV("VideoEditorAudioPlayer: file duration recorded : %lld",
+            ALOGV("VideoEditorAudioPlayer: file duration recorded : %lld",
                     mBGAudioPCMFileDuration);
         }
 
         // Last played location to be seeked at for next media item
         if ( result == M4NO_ERROR ) {
-            LOGV("VideoEditorAudioPlayer::mBGAudioStoryBoardSkimTimeStamp %lld",
+            ALOGV("VideoEditorAudioPlayer::mBGAudioStoryBoardSkimTimeStamp %lld",
                     mBGAudioStoryBoardSkimTimeStamp);
-            LOGV("VideoEditorAudioPlayer::uiAddCts %d",
+            ALOGV("VideoEditorAudioPlayer::uiAddCts %d",
                     mAudioMixSettings->uiAddCts);
             if (mBGAudioStoryBoardSkimTimeStamp >= mAudioMixSettings->uiAddCts) {
                 startTime = (mBGAudioStoryBoardSkimTimeStamp -
@@ -230,7 +230,7 @@
                 // do nothing
             }
 
-            LOGV("VideoEditorAudioPlayer::startTime %d", startTime);
+            ALOGV("VideoEditorAudioPlayer::startTime %d", startTime);
             seekTimeStamp = 0;
             if (startTime) {
                 if (startTime >= mBGAudioPCMFileDuration) {
@@ -276,7 +276,7 @@
 
     mFirstBufferResult = mSource->read(&mFirstBuffer);
     if (mFirstBufferResult == INFO_FORMAT_CHANGED) {
-        LOGV("INFO_FORMAT_CHANGED!!!");
+        ALOGV("INFO_FORMAT_CHANGED!!!");
 
         CHECK(mFirstBuffer == NULL);
         mFirstBufferResult = OK;
@@ -384,7 +384,7 @@
 
 void VideoEditorAudioPlayer::reset() {
 
-    LOGV("reset");
+    ALOGV("reset");
     AudioPlayerBase::reset();
 
     // Capture the current seek point
@@ -478,8 +478,8 @@
                           (mPositionTimeMediaUs - mSeekTimeUs)) >=
                           (int64_t)(mAudioMixSettings->uiAddCts * 1000)) {
 
-                        LOGV("VideoEditorAudioPlayer::INSIDE MIXING");
-                        LOGV("Checking %lld <= %lld",
+                        ALOGV("VideoEditorAudioPlayer::INSIDE MIXING");
+                        ALOGV("Checking %lld <= %lld",
                             mBGAudioPCMFileSeekPoint-mBGAudioPCMFileOriginalSeekPoint,
                             mBGAudioPCMFileTrimmedLength);
 
@@ -495,7 +495,7 @@
                         pPTMdata = (M4OSA_Int16*) ((uint8_t*) mInputBuffer->data()
                                 + mInputBuffer->range_offset());
 
-                        LOGV("mix with background malloc to do len %d", len);
+                        ALOGV("mix with background malloc to do len %d", len);
 
                         bgFrame.m_dataAddress = (M4OSA_UInt16*)M4OSA_32bitAlignedMalloc( len, 1,
                                                        (M4OSA_Char*)"bgFrame");
@@ -505,7 +505,7 @@
                                                     (M4OSA_Char*)"mixFrame");
                         mixFrame.m_bufferSize = len;
 
-                        LOGV("mix with bgm with size %lld", mBGAudioPCMFileLength);
+                        ALOGV("mix with bgm with size %lld", mBGAudioPCMFileLength);
 
                         CHECK(mInputBuffer->meta_data()->findInt64(kKeyTime,
                                          &mPositionTimeMediaUs));
@@ -514,11 +514,11 @@
                              mBGAudioPCMFileOriginalSeekPoint <=
                               (mBGAudioPCMFileTrimmedLength - len)) {
 
-                            LOGV("Checking mBGAudioPCMFileHandle %d",
+                            ALOGV("Checking mBGAudioPCMFileHandle %d",
                                 (unsigned int)mBGAudioPCMFileHandle);
 
                             if (mBGAudioPCMFileHandle != M4OSA_NULL) {
-                                LOGV("fillBuffer seeking file to %lld",
+                                ALOGV("fillBuffer seeking file to %lld",
                                     mBGAudioPCMFileSeekPoint);
 
                             // TODO : 32bits required for OSAL
@@ -539,7 +539,7 @@
                                        (M4OSA_UInt32*)&len);
                                 if (err == M4WAR_NO_DATA_YET ) {
 
-                                    LOGV("fillBuffer End of file reached");
+                                    ALOGV("fillBuffer End of file reached");
                                     err = M4NO_ERROR;
 
                                     // We reached the end of file
@@ -550,7 +550,7 @@
                                           mAudioMixSettings->uiSamplingFrequency) *
                                           mAudioMixSettings->uiNbChannels *
                                            sizeof(M4OSA_UInt16)) / 1000;
-                                        LOGV("fillBuffer Looping \
+                                        ALOGV("fillBuffer Looping \
                                             to mBGAudioPCMFileSeekPoint %lld",
                                             mBGAudioPCMFileSeekPoint);
                                     }
@@ -563,10 +563,10 @@
                                         }
                                     }
                                 } else if (err != M4NO_ERROR ) {
-                                     LOGV("fileReadData for audio err %d", err);
+                                     ALOGV("fileReadData for audio err %d", err);
                                 } else {
                                     mBGAudioPCMFileSeekPoint += len;
-                                    LOGV("fillBuffer mBGAudioPCMFileSeekPoint \
+                                    ALOGV("fillBuffer mBGAudioPCMFileSeekPoint \
                                          %lld", mBGAudioPCMFileSeekPoint);
 
                                     // Assign the ptr data to primary track
@@ -617,7 +617,7 @@
             Mutex::Autolock autoLock(mLock);
 
             if (status != OK) {
-                LOGV("fillBuffer: mSource->read returned err %d", status);
+                ALOGV("fillBuffer: mSource->read returned err %d", status);
                 if (mObserver && !mReachedEOS) {
                     postEOS = true;
                 }
@@ -634,7 +634,7 @@
                 ((mNumFramesPlayed + size_done / mFrameSize) * 1000000)
                     / mSampleRate;
 
-            LOGV("buffer->size() = %d, "
+            ALOGV("buffer->size() = %d, "
                      "mPositionTimeMediaUs=%.2f mPositionTimeRealUs=%.2f",
                  mInputBuffer->range_length(),
                  mPositionTimeMediaUs / 1E6, mPositionTimeRealUs / 1E6);
diff --git a/libvideoeditor/lvpp/VideoEditorBGAudioProcessing.cpp b/libvideoeditor/lvpp/VideoEditorBGAudioProcessing.cpp
index e3bbdf2..80e76d4 100755
--- a/libvideoeditor/lvpp/VideoEditorBGAudioProcessing.cpp
+++ b/libvideoeditor/lvpp/VideoEditorBGAudioProcessing.cpp
@@ -23,7 +23,7 @@
 
 VideoEditorBGAudioProcessing::VideoEditorBGAudioProcessing() {
 
-    LOGV("VideoEditorBGAudioProcessing:: Construct  VideoEditorBGAudioProcessing ");
+    ALOGV("VideoEditorBGAudioProcessing:: Construct  VideoEditorBGAudioProcessing ");
 
     mAudVolArrIndex = 0;
     mDoDucking = 0;
@@ -53,7 +53,7 @@
     M4AM_Buffer16* pBackgroundTrack = (M4AM_Buffer16*)pBTBuffer;
     M4AM_Buffer16* pMixedOutBuffer  = (M4AM_Buffer16*)pOutBuffer;
 
-    LOGV("VideoEditorBGAudioProcessing::lvProcessAudioMixNDuck \
+    ALOGV("VideoEditorBGAudioProcessing::lvProcessAudioMixNDuck \
         pPTBuffer 0x%x pBTBuffer 0x%x pOutBuffer 0x%x", pPTBuffer,
         pBTBuffer, pOutBuffer);
 
@@ -107,7 +107,7 @@
 
         mAudioVolumeArray[mAudVolArrIndex] = getDecibelSound(peakDbValue);
 
-        LOGV("VideoEditorBGAudioProcessing:: getDecibelSound %d",
+        ALOGV("VideoEditorBGAudioProcessing:: getDecibelSound %d",
             mAudioVolumeArray[mAudVolArrIndex]);
 
         // WINDOW_SIZE is 10 by default
@@ -155,7 +155,7 @@
 
     // Mixing Logic
 
-    LOGV("VideoEditorBGAudioProcessing:: Out of Ducking analysis uiPCMsize\
+    ALOGV("VideoEditorBGAudioProcessing:: Out of Ducking analysis uiPCMsize\
         %d %f %f", mDoDucking, mDuckingFactor,mBTVolLevel);
 
     while (uiPCMsize-- > 0) {
@@ -199,12 +199,12 @@
         pBTMdata1++;
         pPTMdata2++;
     }
-    //LOGV("VideoEditorBGAudioProcessing:: Copy final out ");
+    //ALOGV("VideoEditorBGAudioProcessing:: Copy final out ");
     memcpy((void *)pMixedOutBuffer->m_dataAddress,
         (void *)pBackgroundTrack->m_dataAddress,
         pBackgroundTrack->m_bufferSize);
 
-    LOGV("VideoEditorBGAudioProcessing::lvProcessAudioMixNDuck EXIT");
+    ALOGV("VideoEditorBGAudioProcessing::lvProcessAudioMixNDuck EXIT");
     return result;
 }
 
@@ -221,7 +221,7 @@
 void VideoEditorBGAudioProcessing ::veSetAudioProcessingParams(
         const veAudMixSettings& gInputParams) {
 
-    LOGV("VideoEditorBGAudioProcessing:: ENTER lvSetAudioProcessingParams ");
+    ALOGV("VideoEditorBGAudioProcessing:: ENTER lvSetAudioProcessingParams ");
     mDucking_enable       = gInputParams.lvInDucking_enable;
     mDucking_lowVolume    = gInputParams.lvInDucking_lowVolume;
     mDucking_threshold    = gInputParams.lvInDucking_threshold;
@@ -241,7 +241,7 @@
     mDoDucking            = 0;
     mDuckingFactor        = 1.0; // default
 
-    LOGV("VideoEditorBGAudioProcessing::  ducking_enable 0x%x \
+    ALOGV("VideoEditorBGAudioProcessing::  ducking_enable 0x%x \
         ducking_lowVolume %f  ducking_threshold %d  fPTVolLevel %f BTVolLevel %f",
         mDucking_enable, mDucking_lowVolume, mDucking_threshold,
         mPTVolLevel, mPTVolLevel);
@@ -257,7 +257,7 @@
     } else {
         mChannelConversion   = 0;
     }
-    LOGV("VideoEditorBGAudioProcessing:: EXIT veSetAudioProcessingParams ");
+    ALOGV("VideoEditorBGAudioProcessing:: EXIT veSetAudioProcessingParams ");
 }
 
 
diff --git a/libvideoeditor/lvpp/VideoEditorPlayer.cpp b/libvideoeditor/lvpp/VideoEditorPlayer.cpp
index 90a5821..993f6f4 100755
--- a/libvideoeditor/lvpp/VideoEditorPlayer.cpp
+++ b/libvideoeditor/lvpp/VideoEditorPlayer.cpp
@@ -31,12 +31,12 @@
 VideoEditorPlayer::VideoEditorPlayer(NativeWindowRenderer* renderer)
     : mPlayer(new PreviewPlayer(renderer)) {
 
-    LOGV("VideoEditorPlayer");
+    ALOGV("VideoEditorPlayer");
     mPlayer->setListener(this);
 }
 
 VideoEditorPlayer::~VideoEditorPlayer() {
-    LOGV("~VideoEditorPlayer");
+    ALOGV("~VideoEditorPlayer");
 
     reset();
     mVeAudioSink.clear();
@@ -46,7 +46,7 @@
 }
 
 status_t VideoEditorPlayer::initCheck() {
-    LOGV("initCheck");
+    ALOGV("initCheck");
     return OK;
 }
 
@@ -71,21 +71,21 @@
 }
 
 status_t VideoEditorPlayer::setVideoSurface(const sp<Surface> &surface) {
-    LOGV("setVideoSurface");
+    ALOGV("setVideoSurface");
 
     mPlayer->setSurface(surface);
     return OK;
 }
 
 status_t VideoEditorPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
-    LOGV("setVideoSurfaceTexture");
+    ALOGV("setVideoSurfaceTexture");
 
     mPlayer->setSurfaceTexture(surfaceTexture);
     return OK;
 }
 
 status_t VideoEditorPlayer::prepare() {
-    LOGV("prepare");
+    ALOGV("prepare");
     return mPlayer->prepare();
 }
 
@@ -94,33 +94,33 @@
 }
 
 status_t VideoEditorPlayer::start() {
-    LOGV("start");
+    ALOGV("start");
     return mPlayer->play();
 }
 
 status_t VideoEditorPlayer::stop() {
-    LOGV("stop");
+    ALOGV("stop");
     return pause();
 }
 
 status_t VideoEditorPlayer::pause() {
-    LOGV("pause");
+    ALOGV("pause");
     return mPlayer->pause();
 }
 
 bool VideoEditorPlayer::isPlaying() {
-    LOGV("isPlaying");
+    ALOGV("isPlaying");
     return mPlayer->isPlaying();
 }
 
 status_t VideoEditorPlayer::seekTo(int msec) {
-    LOGV("seekTo");
+    ALOGV("seekTo");
     status_t err = mPlayer->seekTo((int64_t)msec * 1000);
     return err;
 }
 
 status_t VideoEditorPlayer::getCurrentPosition(int *msec) {
-    LOGV("getCurrentPosition");
+    ALOGV("getCurrentPosition");
     int64_t positionUs;
     status_t err = mPlayer->getPosition(&positionUs);
 
@@ -133,7 +133,7 @@
 }
 
 status_t VideoEditorPlayer::getDuration(int *msec) {
-    LOGV("getDuration");
+    ALOGV("getDuration");
 
     int64_t durationUs;
     status_t err = mPlayer->getDuration(&durationUs);
@@ -148,38 +148,38 @@
 }
 
 status_t VideoEditorPlayer::reset() {
-    LOGV("reset");
+    ALOGV("reset");
     mPlayer->reset();
     return OK;
 }
 
 status_t VideoEditorPlayer::setLooping(int loop) {
-    LOGV("setLooping");
+    ALOGV("setLooping");
     return mPlayer->setLooping(loop);
 }
 
 status_t VideoEditorPlayer::setParameter(int key, const Parcel &request) {
-    LOGV("setParameter");
+    ALOGV("setParameter");
     return mPlayer->setParameter(key, request);
 }
 
 status_t VideoEditorPlayer::getParameter(int key, Parcel *reply) {
-    LOGV("getParameter");
+    ALOGV("getParameter");
     return mPlayer->getParameter(key, reply);
 }
 
 player_type VideoEditorPlayer::playerType() {
-    LOGV("playerType");
+    ALOGV("playerType");
     return STAGEFRIGHT_PLAYER;
 }
 
 void VideoEditorPlayer::acquireLock() {
-    LOGV("acquireLock");
+    ALOGV("acquireLock");
     mPlayer->acquireLock();
 }
 
 void VideoEditorPlayer::releaseLock() {
-    LOGV("releaseLock");
+    ALOGV("releaseLock");
     mPlayer->releaseLock();
 }
 
@@ -222,20 +222,20 @@
 
 status_t VideoEditorPlayer::loadEffectsSettings(
     M4VSS3GPP_EffectSettings* pEffectSettings, int nEffects) {
-    LOGV("loadEffectsSettings");
+    ALOGV("loadEffectsSettings");
     return mPlayer->loadEffectsSettings(pEffectSettings, nEffects);
 }
 
 status_t VideoEditorPlayer::loadAudioMixSettings(
     M4xVSS_AudioMixingSettings* pAudioMixSettings) {
-    LOGV("VideoEditorPlayer: loadAudioMixSettings");
+    ALOGV("VideoEditorPlayer: loadAudioMixSettings");
     return mPlayer->loadAudioMixSettings(pAudioMixSettings);
 }
 
 status_t VideoEditorPlayer::setAudioMixPCMFileHandle(
     M4OSA_Context pAudioMixPCMFileHandle) {
 
-    LOGV("VideoEditorPlayer: loadAudioMixSettings");
+    ALOGV("VideoEditorPlayer: loadAudioMixSettings");
     return mPlayer->setAudioMixPCMFileHandle(pAudioMixPCMFileHandle);
 }
 
@@ -244,28 +244,28 @@
     M4OSA_UInt32 currentMediaBeginCutTime,
     M4OSA_UInt32 primaryTrackVolValue) {
 
-    LOGV("VideoEditorPlayer: loadAudioMixSettings");
+    ALOGV("VideoEditorPlayer: loadAudioMixSettings");
     return mPlayer->setAudioMixStoryBoardParam(audioMixStoryBoardTS,
      currentMediaBeginCutTime, primaryTrackVolValue);
 }
 
 status_t VideoEditorPlayer::setPlaybackBeginTime(uint32_t msec) {
-    LOGV("setPlaybackBeginTime");
+    ALOGV("setPlaybackBeginTime");
     return mPlayer->setPlaybackBeginTime(msec);
 }
 
 status_t VideoEditorPlayer::setPlaybackEndTime(uint32_t msec) {
-    LOGV("setPlaybackEndTime");
+    ALOGV("setPlaybackEndTime");
     return mPlayer->setPlaybackEndTime(msec);
 }
 
 status_t VideoEditorPlayer::setStoryboardStartTime(uint32_t msec) {
-    LOGV("setStoryboardStartTime");
+    ALOGV("setStoryboardStartTime");
     return mPlayer->setStoryboardStartTime(msec);
 }
 
 status_t VideoEditorPlayer::setProgressCallbackInterval(uint32_t cbInterval) {
-    LOGV("setProgressCallbackInterval");
+    ALOGV("setProgressCallbackInterval");
     return mPlayer->setProgressCallbackInterval(cbInterval);
 }
 
@@ -273,12 +273,12 @@
     M4xVSS_MediaRendering mode,
     M4VIDEOEDITING_VideoFrameSize outputVideoSize) {
 
-    LOGV("setMediaRenderingMode");
+    ALOGV("setMediaRenderingMode");
     return mPlayer->setMediaRenderingMode(mode, outputVideoSize);
 }
 
 status_t VideoEditorPlayer::resetJniCallbackTimeStamp() {
-    LOGV("resetJniCallbackTimeStamp");
+    ALOGV("resetJniCallbackTimeStamp");
     return mPlayer->resetJniCallbackTimeStamp();
 }
 
@@ -387,12 +387,12 @@
 
     // Check argument "bufferCount" against the mininum buffer count
     if (bufferCount < mMinBufferCount) {
-        LOGV("bufferCount (%d) is too small and increased to %d",
+        ALOGV("bufferCount (%d) is too small and increased to %d",
             bufferCount, mMinBufferCount);
         bufferCount = mMinBufferCount;
 
     }
-    LOGV("open(%u, %d, %d, %d)", sampleRate, channelCount, format, bufferCount);
+    ALOGV("open(%u, %d, %d, %d)", sampleRate, channelCount, format, bufferCount);
     if (mTrack) close();
     int afSampleRate;
     int afFrameCount;
@@ -437,7 +437,7 @@
         return NO_INIT;
     }
 
-    LOGV("setVolume");
+    ALOGV("setVolume");
     t->setVolume(mLeftVolume, mRightVolume);
     mMsecsPerFrame = 1.e3 / (float) sampleRate;
     mLatency = t->latency();
@@ -447,7 +447,7 @@
 
 void VideoEditorPlayer::VeAudioOutput::start() {
 
-    LOGV("start");
+    ALOGV("start");
     if (mTrack) {
         mTrack->setVolume(mLeftVolume, mRightVolume);
         mTrack->start();
@@ -467,7 +467,7 @@
 
     LOG_FATAL_IF(mCallback != NULL, "Don't call write if supplying a callback.");
 
-    //LOGV("write(%p, %u)", buffer, size);
+    //ALOGV("write(%p, %u)", buffer, size);
     if (mTrack) {
         snoopWrite(buffer, size);
         ssize_t ret = mTrack->write(buffer, size);
@@ -479,32 +479,32 @@
 
 void VideoEditorPlayer::VeAudioOutput::stop() {
 
-    LOGV("stop");
+    ALOGV("stop");
     if (mTrack) mTrack->stop();
 }
 
 void VideoEditorPlayer::VeAudioOutput::flush() {
 
-    LOGV("flush");
+    ALOGV("flush");
     if (mTrack) mTrack->flush();
 }
 
 void VideoEditorPlayer::VeAudioOutput::pause() {
 
-    LOGV("VeAudioOutput::pause");
+    ALOGV("VeAudioOutput::pause");
     if (mTrack) mTrack->pause();
 }
 
 void VideoEditorPlayer::VeAudioOutput::close() {
 
-    LOGV("close");
+    ALOGV("close");
     delete mTrack;
     mTrack = 0;
 }
 
 void VideoEditorPlayer::VeAudioOutput::setVolume(float left, float right) {
 
-    LOGV("setVolume(%f, %f)", left, right);
+    ALOGV("setVolume(%f, %f)", left, right);
     mLeftVolume = left;
     mRightVolume = right;
     if (mTrack) {
@@ -515,7 +515,7 @@
 // static
 void VideoEditorPlayer::VeAudioOutput::CallbackWrapper(
         int event, void *cookie, void *info) {
-    //LOGV("VeAudioOutput::callbackwrapper");
+    //ALOGV("VeAudioOutput::callbackwrapper");
     if (event != AudioTrack::EVENT_MORE_DATA) {
         return;
     }
diff --git a/libvideoeditor/lvpp/VideoEditorPreviewController.cpp b/libvideoeditor/lvpp/VideoEditorPreviewController.cpp
index 3140b46..5350cb6 100755
--- a/libvideoeditor/lvpp/VideoEditorPreviewController.cpp
+++ b/libvideoeditor/lvpp/VideoEditorPreviewController.cpp
@@ -52,7 +52,7 @@
       mOutputVideoHeight(0),
       bStopThreadInProgress(false),
       mSemThreadWait(NULL) {
-    LOGV("VideoEditorPreviewController");
+    ALOGV("VideoEditorPreviewController");
     mRenderingMode = M4xVSS_kBlackBorders;
     mIsFiftiesEffectStarted = false;
 
@@ -64,13 +64,13 @@
 VideoEditorPreviewController::~VideoEditorPreviewController() {
     M4OSA_UInt32 i = 0;
     M4OSA_ERR err = M4NO_ERROR;
-    LOGV("~VideoEditorPreviewController");
+    ALOGV("~VideoEditorPreviewController");
 
     // Stop the thread if its still running
     if(mThreadContext != NULL) {
         err = M4OSA_threadSyncStop(mThreadContext);
         if(err != M4NO_ERROR) {
-            LOGV("~VideoEditorPreviewController: error 0x%x \
+            ALOGV("~VideoEditorPreviewController: error 0x%x \
             in trying to stop thread", err);
             // Continue even if error
         }
@@ -88,7 +88,7 @@
     for (int playerInst=0; playerInst<NBPLAYER_INSTANCES;
          playerInst++) {
         if(mVePlayer[playerInst] != NULL) {
-            LOGV("clearing mVePlayer %d", playerInst);
+            ALOGV("clearing mVePlayer %d", playerInst);
             mVePlayer[playerInst].clear();
         }
     }
@@ -139,7 +139,7 @@
 
     mOverlayState = OVERLAY_CLEAR;
 
-    LOGV("~VideoEditorPreviewController returns");
+    ALOGV("~VideoEditorPreviewController returns");
 }
 
 M4OSA_ERR VideoEditorPreviewController::loadEditSettings(
@@ -149,12 +149,12 @@
     M4VIFI_UInt8 *tmp = NULL;
     M4OSA_ERR err = M4NO_ERROR;
 
-    LOGV("loadEditSettings");
-    LOGV("loadEditSettings Channels = %d, sampling Freq %d",
+    ALOGV("loadEditSettings");
+    ALOGV("loadEditSettings Channels = %d, sampling Freq %d",
           bgmSettings->uiNbChannels, bgmSettings->uiSamplingFrequency  );
           bgmSettings->uiSamplingFrequency = 32000;
 
-    LOGV("loadEditSettings Channels = %d, sampling Freq %d",
+    ALOGV("loadEditSettings Channels = %d, sampling Freq %d",
           bgmSettings->uiNbChannels, bgmSettings->uiSamplingFrequency  );
     Mutex::Autolock autoLock(mLock);
 
@@ -202,7 +202,7 @@
 
     if(mClipList == NULL) {
         mNumberClipsInStoryBoard = pSettings->uiClipNumber;
-        LOGV("loadEditSettings: # of Clips = %d", mNumberClipsInStoryBoard);
+        ALOGV("loadEditSettings: # of Clips = %d", mNumberClipsInStoryBoard);
 
         mClipList = (M4VSS3GPP_ClipSettings**)M4OSA_32bitAlignedMalloc(
          sizeof(M4VSS3GPP_ClipSettings*)*pSettings->uiClipNumber, M4VS,
@@ -262,7 +262,7 @@
 
     if(mEffectsSettings == NULL) {
         mNumberEffects = pSettings->nbEffects;
-        LOGV("loadEditSettings: mNumberEffects = %d", mNumberEffects);
+        ALOGV("loadEditSettings: mNumberEffects = %d", mNumberEffects);
 
         if(mNumberEffects != 0) {
             mEffectsSettings = (M4VSS3GPP_EffectSettings*)M4OSA_32bitAlignedMalloc(
@@ -412,7 +412,7 @@
 }
 
 M4OSA_ERR VideoEditorPreviewController::setSurface(const sp<Surface> &surface) {
-    LOGV("setSurface");
+    ALOGV("setSurface");
     Mutex::Autolock autoLock(mLock);
 
     mSurface = surface;
@@ -425,7 +425,7 @@
 
     M4OSA_ERR err = M4NO_ERROR;
     M4OSA_UInt32 i = 0, iIncrementedDuration = 0;
-    LOGV("startPreview");
+    ALOGV("startPreview");
 
     if(fromMS > (M4OSA_UInt32)toMs) {
         LOGE("startPreview: fromMS > toMs");
@@ -440,7 +440,7 @@
     // If already started, then stop preview first
     for(int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {
         if(mVePlayer[playerInst] != NULL) {
-            LOGV("startPreview: stopping previously started preview playback");
+            ALOGV("startPreview: stopping previously started preview playback");
             stopPreview();
             break;
         }
@@ -448,7 +448,7 @@
 
     // If renderPreview was called previously, then delete Renderer object first
     if(mTarget != NULL) {
-        LOGV("startPreview: delete previous PreviewRenderer");
+        ALOGV("startPreview: delete previous PreviewRenderer");
         delete mTarget;
         mTarget = NULL;
     }
@@ -465,10 +465,10 @@
     getVideoSizeByResolution(mOutputVideoSize, &width, &height);
     mNativeWindowRenderer = new NativeWindowRenderer(mSurface, width, height);
 
-    LOGV("startPreview: loop = %d", loop);
+    ALOGV("startPreview: loop = %d", loop);
     mPreviewLooping = loop;
 
-    LOGV("startPreview: callBackAfterFrameCount = %d", callBackAfterFrameCount);
+    ALOGV("startPreview: callBackAfterFrameCount = %d", callBackAfterFrameCount);
     mCallBackAfterFrameCnt = callBackAfterFrameCount;
 
     for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {
@@ -477,24 +477,24 @@
             LOGE("startPreview:Error creating VideoEditorPlayer %d",playerInst);
             return M4ERR_ALLOC;
         }
-        LOGV("startPreview: object created");
+        ALOGV("startPreview: object created");
 
         mVePlayer[playerInst]->setNotifyCallback(this,(notify_callback_f)notify);
-        LOGV("startPreview: notify callback set");
+        ALOGV("startPreview: notify callback set");
 
         mVePlayer[playerInst]->loadEffectsSettings(mEffectsSettings,
          mNumberEffects);
-        LOGV("startPreview: effects settings loaded");
+        ALOGV("startPreview: effects settings loaded");
 
         mVePlayer[playerInst]->loadAudioMixSettings(mBackgroundAudioSetting);
-        LOGV("startPreview: AudioMixSettings settings loaded");
+        ALOGV("startPreview: AudioMixSettings settings loaded");
 
         mVePlayer[playerInst]->setAudioMixPCMFileHandle(mAudioMixPCMFileHandle);
-        LOGV("startPreview: AudioMixPCMFileHandle set");
+        ALOGV("startPreview: AudioMixPCMFileHandle set");
 
         mVePlayer[playerInst]->setProgressCallbackInterval(
          mCallBackAfterFrameCnt);
-        LOGV("startPreview: setProgressCallBackInterval");
+        ALOGV("startPreview: setProgressCallBackInterval");
     }
 
     mPlayerState = VePlayerIdle;
@@ -507,7 +507,7 @@
         mVideoStoryBoardTimeMsUptoFirstPreviewClip = 0;
     }
     else {
-        LOGV("startPreview: fromMS=%d", fromMS);
+        ALOGV("startPreview: fromMS=%d", fromMS);
         if(fromMS >= mClipTotalDuration) {
             LOGE("startPreview: fromMS >= mClipTotalDuration");
             return M4ERR_PARAMETER;
@@ -547,7 +547,7 @@
          mFirstPreviewClipBeginTime,
          mClipList[i]->ClipProperties.uiClipAudioVolumePercentage);
 
-        LOGV("startPreview:setAudioMixStoryBoardSkimTimeStamp set %d cuttime \
+        ALOGV("startPreview:setAudioMixStoryBoardSkimTimeStamp set %d cuttime \
          %d", fromMS, mFirstPreviewClipBeginTime);
     }
 
@@ -558,14 +558,14 @@
     mActivePlayerIndex = 0;
 
     if(toMs == -1) {
-        LOGV("startPreview: Preview till end of storyboard");
+        ALOGV("startPreview: Preview till end of storyboard");
         mNumberClipsToPreview = mNumberClipsInStoryBoard;
         // Save original value
         mLastPreviewClipEndTime =
          mClipList[mNumberClipsToPreview-1]->uiEndCutTime;
     }
     else {
-        LOGV("startPreview: toMs=%d", toMs);
+        ALOGV("startPreview: toMs=%d", toMs);
         if((M4OSA_UInt32)toMs > mClipTotalDuration) {
             LOGE("startPreview: toMs > mClipTotalDuration");
             return M4ERR_PARAMETER;
@@ -624,14 +624,14 @@
     }
     bStopThreadInProgress = false;
 
-    LOGV("startPreview: process thread started");
+    ALOGV("startPreview: process thread started");
     return M4NO_ERROR;
 }
 
 M4OSA_UInt32 VideoEditorPreviewController::stopPreview() {
     M4OSA_ERR err = M4NO_ERROR;
     uint32_t lastRenderedFrameTimeMs = 0;
-    LOGV("stopPreview");
+    ALOGV("stopPreview");
 
     // Stop the thread
     if(mThreadContext != NULL) {
@@ -645,7 +645,7 @@
 
         err = M4OSA_threadSyncStop(mThreadContext);
         if(err != M4NO_ERROR) {
-            LOGV("stopPreview: error 0x%x in trying to stop thread", err);
+            ALOGV("stopPreview: error 0x%x in trying to stop thread", err);
             // Continue even if error
         }
 
@@ -663,7 +663,7 @@
         Mutex::Autolock autoLock(mLockSem);
         if(mSemThreadWait != NULL) {
             err = M4OSA_semaphoreClose(mSemThreadWait);
-            LOGV("stopPreview: close semaphore returns 0x%x", err);
+            ALOGV("stopPreview: close semaphore returns 0x%x", err);
             mSemThreadWait = NULL;
         }
     }
@@ -671,7 +671,7 @@
     for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {
         if(mVePlayer[playerInst] != NULL) {
             if(mVePlayer[playerInst]->isPlaying()) {
-                LOGV("stop the player first");
+                ALOGV("stop the player first");
                 mVePlayer[playerInst]->stop();
             }
             if (playerInst == mActivePlayerIndex) {
@@ -683,13 +683,13 @@
             //stopPreview() in PreviewController
             sp<VideoEditorPlayer> temp = mVePlayer[playerInst];
             temp->acquireLock();
-            LOGV("stopPreview: clearing mVePlayer");
+            ALOGV("stopPreview: clearing mVePlayer");
             mVePlayer[playerInst].clear();
             mVePlayer[playerInst] = NULL;
             temp->releaseLock();
         }
     }
-    LOGV("stopPreview: clear audioSink and audioPlayer");
+    ALOGV("stopPreview: clear audioSink and audioPlayer");
     mVEAudioSink.clear();
     if (mVEAudioPlayer) {
         delete mVEAudioPlayer;
@@ -719,7 +719,7 @@
     mOutputVideoWidth = 0;
     mOutputVideoHeight = 0;
 
-    LOGV("stopPreview() lastRenderedFrameTimeMs %ld", lastRenderedFrameTimeMs);
+    ALOGV("stopPreview() lastRenderedFrameTimeMs %ld", lastRenderedFrameTimeMs);
     return lastRenderedFrameTimeMs;
 }
 
@@ -730,7 +730,7 @@
     VideoEditor_renderPreviewFrameStr* pFrameStr = pFrameInfo;
     M4OSA_UInt32 outputBufferWidth =0, outputBufferHeight=0;
     M4VIFI_ImagePlane planeOut[3];
-    LOGV("Inside preview clear frame");
+    ALOGV("Inside preview clear frame");
 
     Mutex::Autolock autoLock(mLock);
 
@@ -760,7 +760,7 @@
     uint8_t* outBuffer;
     size_t outBufferStride = 0;
 
-    LOGV("doMediaRendering CALL getBuffer()");
+    ALOGV("doMediaRendering CALL getBuffer()");
     mTarget->getBufferYV12(&outBuffer, &outBufferStride);
 
     // Set the output YUV420 plane to be compatible with YV12 format
@@ -885,9 +885,9 @@
             }
             if ((index < mNumberEffects) && (pCurrEditInfo != NULL)) {
                 pCurrEditInfo->overlaySettingsIndex = index;
-                LOGV("Framing index = %d", index);
+                ALOGV("Framing index = %d", index);
             } else {
-                LOGV("No framing effects found");
+                ALOGV("No framing effects found");
             }
         }
 
@@ -945,7 +945,7 @@
 
 M4OSA_Void VideoEditorPreviewController::setJniCallback(void* cookie,
     jni_progress_callback_fct callbackFct) {
-    //LOGV("setJniCallback");
+    //ALOGV("setJniCallback");
     mJniCookie = cookie;
     mJniCallback = callbackFct;
 }
@@ -957,21 +957,21 @@
     VideoEditorPreviewController *pController =
      (VideoEditorPreviewController *)param;
 
-    LOGV("preparePlayer: instance %d file %d", playerInstance, index);
+    ALOGV("preparePlayer: instance %d file %d", playerInstance, index);
 
     pController->mVePlayer[playerInstance]->setDataSource(
     (const char *)pController->mClipList[index]->pFile, NULL);
-    LOGV("preparePlayer: setDataSource instance %s",
+    ALOGV("preparePlayer: setDataSource instance %s",
      (const char *)pController->mClipList[index]->pFile);
 
     pController->mVePlayer[playerInstance]->setVideoSurface(
      pController->mSurface);
-    LOGV("preparePlayer: setVideoSurface");
+    ALOGV("preparePlayer: setVideoSurface");
 
     pController->mVePlayer[playerInstance]->setMediaRenderingMode(
      pController->mClipList[index]->xVSS.MediaRendering,
      pController->mOutputVideoSize);
-    LOGV("preparePlayer: setMediaRenderingMode");
+    ALOGV("preparePlayer: setMediaRenderingMode");
 
     if((M4OSA_UInt32)index == pController->mStartingClipIndex) {
         pController->mVePlayer[playerInstance]->setPlaybackBeginTime(
@@ -981,35 +981,35 @@
         pController->mVePlayer[playerInstance]->setPlaybackBeginTime(
         pController->mClipList[index]->uiBeginCutTime);
     }
-    LOGV("preparePlayer: setPlaybackBeginTime(%d)",
+    ALOGV("preparePlayer: setPlaybackBeginTime(%d)",
      pController->mClipList[index]->uiBeginCutTime);
 
     pController->mVePlayer[playerInstance]->setPlaybackEndTime(
      pController->mClipList[index]->uiEndCutTime);
-    LOGV("preparePlayer: setPlaybackEndTime(%d)",
+    ALOGV("preparePlayer: setPlaybackEndTime(%d)",
      pController->mClipList[index]->uiEndCutTime);
 
     if(pController->mClipList[index]->FileType == M4VIDEOEDITING_kFileType_ARGB8888) {
         pController->mVePlayer[playerInstance]->setImageClipProperties(
                  pController->mClipList[index]->ClipProperties.uiVideoWidth,
                  pController->mClipList[index]->ClipProperties.uiVideoHeight);
-        LOGV("preparePlayer: setImageClipProperties");
+        ALOGV("preparePlayer: setImageClipProperties");
     }
 
     pController->mVePlayer[playerInstance]->prepare();
-    LOGV("preparePlayer: prepared");
+    ALOGV("preparePlayer: prepared");
 
     if(pController->mClipList[index]->uiBeginCutTime > 0) {
         pController->mVePlayer[playerInstance]->seekTo(
          pController->mClipList[index]->uiBeginCutTime);
 
-        LOGV("preparePlayer: seekTo(%d)",
+        ALOGV("preparePlayer: seekTo(%d)",
          pController->mClipList[index]->uiBeginCutTime);
     }
     pController->mVePlayer[pController->mCurrentPlayer]->setAudioPlayer(pController->mVEAudioPlayer);
 
     pController->mVePlayer[playerInstance]->readFirstVideoFrame();
-    LOGV("preparePlayer: readFirstVideoFrame of clip");
+    ALOGV("preparePlayer: readFirstVideoFrame of clip");
 
     return err;
 }
@@ -1020,7 +1020,7 @@
     VideoEditorPreviewController *pController =
      (VideoEditorPreviewController *)param;
 
-    LOGV("inside threadProc");
+    ALOGV("inside threadProc");
     if(pController->mPlayerState == VePlayerIdle) {
         (pController->mCurrentClipNumber)++;
 
@@ -1092,7 +1092,7 @@
 
         pController->mVePlayer[pController->mCurrentPlayer]->setStoryboardStartTime(
          pController->mCurrentPlayedDuration);
-        LOGV("threadProc: setStoryboardStartTime");
+        ALOGV("threadProc: setStoryboardStartTime");
 
         // Set the next clip duration for Audio mix here
         if((M4OSA_UInt32)pController->mCurrentClipNumber != pController->mStartingClipIndex) {
@@ -1102,7 +1102,7 @@
              pController->mClipList[index]->uiBeginCutTime,
              pController->mClipList[index]->ClipProperties.uiClipAudioVolumePercentage);
 
-            LOGV("threadProc: setAudioMixStoryBoardParam fromMS %d \
+            ALOGV("threadProc: setAudioMixStoryBoardParam fromMS %d \
              ClipBeginTime %d", pController->mCurrentPlayedDuration +
              pController->mClipList[index]->uiBeginCutTime,
              pController->mClipList[index]->uiBeginCutTime,
@@ -1112,12 +1112,12 @@
         pController->mActivePlayerIndex = pController->mCurrentPlayer;
 
         pController->mVePlayer[pController->mCurrentPlayer]->start();
-        LOGV("threadProc: started");
+        ALOGV("threadProc: started");
 
         pController->mPlayerState = VePlayerBusy;
 
     } else if(pController->mPlayerState == VePlayerAutoStop) {
-        LOGV("Preview completed..auto stop the player");
+        ALOGV("Preview completed..auto stop the player");
     } else if ((pController->mPlayerState == VePlayerBusy) && (pController->mPrepareReqest)) {
         // Prepare the player here
         pController->mPrepareReqest = M4OSA_FALSE;
@@ -1129,13 +1129,13 @@
         }
     } else {
         if (!pController->bStopThreadInProgress) {
-            LOGV("threadProc: state busy...wait for sem");
+            ALOGV("threadProc: state busy...wait for sem");
             if (pController->mSemThreadWait != NULL) {
                 err = M4OSA_semaphoreWait(pController->mSemThreadWait,
                  M4OSA_WAIT_FOREVER);
              }
         }
-        LOGV("threadProc: sem wait returned err = 0x%x", err);
+        ALOGV("threadProc: sem wait returned err = 0x%x", err);
     }
 
     //Always return M4NO_ERROR to ensure the thread keeps running
@@ -1152,10 +1152,10 @@
     uint32_t clipDuration = 0;
     switch (msg) {
         case MEDIA_NOP: // interface test message
-            LOGV("MEDIA_NOP");
+            ALOGV("MEDIA_NOP");
             break;
         case MEDIA_PREPARED:
-            LOGV("MEDIA_PREPARED");
+            ALOGV("MEDIA_PREPARED");
             break;
         case MEDIA_PLAYBACK_COMPLETE:
         {
@@ -1232,16 +1232,16 @@
             break;
         }
         case MEDIA_SEEK_COMPLETE:
-            LOGV("MEDIA_SEEK_COMPLETE; Received seek complete");
+            ALOGV("MEDIA_SEEK_COMPLETE; Received seek complete");
             break;
         case MEDIA_BUFFERING_UPDATE:
-            LOGV("MEDIA_BUFFERING_UPDATE; buffering %d", ext1);
+            ALOGV("MEDIA_BUFFERING_UPDATE; buffering %d", ext1);
             break;
         case MEDIA_SET_VIDEO_SIZE:
-            LOGV("MEDIA_SET_VIDEO_SIZE; New video size %d x %d", ext1, ext2);
+            ALOGV("MEDIA_SET_VIDEO_SIZE; New video size %d x %d", ext1, ext2);
             break;
         case 0xAAAAAAAA:
-            LOGV("VIDEO PLAYBACK ALMOST over, prepare next player");
+            ALOGV("VIDEO PLAYBACK ALMOST over, prepare next player");
             // Select next player and prepare it
             // If there is a clip after this one
             if ((M4OSA_UInt32)(pController->mCurrentClipNumber+1) <
@@ -1262,7 +1262,7 @@
             break;
         case 0xBBBBBBBB:
         {
-            LOGV("VIDEO PLAYBACK, Update Overlay");
+            ALOGV("VIDEO PLAYBACK, Update Overlay");
             int overlayIndex = ext2;
             VideoEditorCurretEditInfo *pEditInfo =
                     (VideoEditorCurretEditInfo*)M4OSA_32bitAlignedMalloc(sizeof(VideoEditorCurretEditInfo),
@@ -1271,7 +1271,7 @@
             //     = 2; Clear the overlay.
             pEditInfo->overlaySettingsIndex = ext2;
             pEditInfo->clipIndex = pController->mCurrentClipNumber;
-            LOGV("pController->mCurrentClipNumber = %d",pController->mCurrentClipNumber);
+            ALOGV("pController->mCurrentClipNumber = %d",pController->mCurrentClipNumber);
             if (pController->mJniCallback != NULL) {
                 if (ext1 == 1) {
                     pController->mOverlayState = OVERLAY_UPDATE;
@@ -1287,7 +1287,7 @@
             break;
         }
         default:
-            LOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2);
+            ALOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2);
             break;
     }
 }
@@ -1404,7 +1404,7 @@
 status_t VideoEditorPreviewController::setPreviewFrameRenderingMode(
     M4xVSS_MediaRendering mode, M4VIDEOEDITING_VideoFrameSize outputVideoSize) {
 
-    LOGV("setMediaRenderingMode: outputVideoSize = %d", outputVideoSize);
+    ALOGV("setMediaRenderingMode: outputVideoSize = %d", outputVideoSize);
     mRenderingMode = mode;
 
     status_t err = OK;
@@ -1438,7 +1438,7 @@
     uint8_t* outBuffer;
     size_t outBufferStride = 0;
 
-    LOGV("doMediaRendering CALL getBuffer()");
+    ALOGV("doMediaRendering CALL getBuffer()");
     mTarget->getBufferYV12(&outBuffer, &outBufferStride);
 
     // Set the output YUV420 plane to be compatible with YV12 format
diff --git a/libvideoeditor/lvpp/VideoEditorSRC.cpp b/libvideoeditor/lvpp/VideoEditorSRC.cpp
index 1ea32ef..194e3a6 100755
--- a/libvideoeditor/lvpp/VideoEditorSRC.cpp
+++ b/libvideoeditor/lvpp/VideoEditorSRC.cpp
@@ -28,7 +28,7 @@
 namespace android {
 
 VideoEditorSRC::VideoEditorSRC(const sp<MediaSource> &source) {
-    LOGV("VideoEditorSRC::VideoEditorSRC %p(%p)", this, source.get());
+    ALOGV("VideoEditorSRC::VideoEditorSRC %p(%p)", this, source.get());
     mSource = source;
     mResampler = NULL;
     mChannelCnt = 0;
@@ -57,13 +57,13 @@
 }
 
 VideoEditorSRC::~VideoEditorSRC() {
-    LOGV("VideoEditorSRC::~VideoEditorSRC %p(%p)", this, mSource.get());
+    ALOGV("VideoEditorSRC::~VideoEditorSRC %p(%p)", this, mSource.get());
     stop();
 }
 
 status_t VideoEditorSRC::start(MetaData *params) {
     CHECK(!mStarted);
-    LOGV("VideoEditorSRC:start %p(%p)", this, mSource.get());
+    ALOGV("VideoEditorSRC:start %p(%p)", this, mSource.get());
 
     // Set resampler if required
     checkAndSetResampler();
@@ -77,7 +77,7 @@
 }
 
 status_t VideoEditorSRC::stop() {
-    LOGV("VideoEditorSRC::stop %p(%p)", this, mSource.get());
+    ALOGV("VideoEditorSRC::stop %p(%p)", this, mSource.get());
     if (!mStarted) return OK;
     if (mBuffer) {
         mBuffer->release();
@@ -97,13 +97,13 @@
 }
 
 sp<MetaData> VideoEditorSRC::getFormat() {
-    LOGV("VideoEditorSRC::getFormat");
+    ALOGV("VideoEditorSRC::getFormat");
     return mOutputFormat;
 }
 
 status_t VideoEditorSRC::read(
         MediaBuffer **buffer_out, const ReadOptions *options) {
-    LOGV("VideoEditorSRC::read %p(%p)", this, mSource.get());
+    ALOGV("VideoEditorSRC::read %p(%p)", this, mSource.get());
     *buffer_out = NULL;
 
     if (!mStarted) {
@@ -115,7 +115,7 @@
         int64_t seekTimeUs;
         ReadOptions::SeekMode mode = ReadOptions::SEEK_PREVIOUS_SYNC;
         if (options && options->getSeekTo(&seekTimeUs, &mode)) {
-            LOGV("read Seek %lld", seekTimeUs);
+            ALOGV("read Seek %lld", seekTimeUs);
             mSeekTimeUs = seekTimeUs;
             mSeekMode = mode;
         }
@@ -159,7 +159,7 @@
         MediaBuffer *aBuffer;
         status_t err = mSource->read(&aBuffer, options);
         if (err != OK) {
-            LOGV("read returns err = %d", err);
+            ALOGV("read returns err = %d", err);
         }
 
         if (err == INFO_FORMAT_CHANGED) {
@@ -180,7 +180,7 @@
 }
 
 status_t VideoEditorSRC::getNextBuffer(AudioBufferProvider::Buffer *pBuffer) {
-    LOGV("Requesting %d, chan = %d", pBuffer->frameCount, mChannelCnt);
+    ALOGV("Requesting %d, chan = %d", pBuffer->frameCount, mChannelCnt);
     uint32_t done = 0;
     uint32_t want = pBuffer->frameCount * mChannelCnt * 2;
     pBuffer->raw = malloc(want);
@@ -191,7 +191,7 @@
             // if we seek, reset the initial time stamp and accumulated time
             ReadOptions options;
             if (mSeekTimeUs >= 0) {
-                LOGV("%p cacheMore_l Seek requested = %lld", this, mSeekTimeUs);
+                ALOGV("%p cacheMore_l Seek requested = %lld", this, mSeekTimeUs);
                 ReadOptions::SeekMode mode = mSeekMode;
                 options.setSeekTo(mSeekTimeUs, mode);
                 mSeekTimeUs = -1;
@@ -208,7 +208,7 @@
             }
 
             if (err == INFO_FORMAT_CHANGED) {
-                LOGV("getNextBuffer: source read returned INFO_FORMAT_CHANGED");
+                ALOGV("getNextBuffer: source read returned INFO_FORMAT_CHANGED");
                 // At this point we cannot switch to a new AudioResampler because
                 // we are in a callback called by the AudioResampler itself. So
                 // just remember the fact that the format has changed, and let
@@ -219,7 +219,7 @@
 
             // EOS or some other error
             if (err != OK) {
-                LOGV("EOS or some err: %d", err);
+                ALOGV("EOS or some err: %d", err);
                 stop();
                 return err;
             }
@@ -230,7 +230,7 @@
                 int64_t curTS;
                 sp<MetaData> from = mBuffer->meta_data();
                 from->findInt64(kKeyTime, &curTS);
-                LOGV("setting mInitialTimeStampUs to %lld", mInitialTimeStampUs);
+                ALOGV("setting mInitialTimeStampUs to %lld", mInitialTimeStampUs);
                 mInitialTimeStampUs = curTS;
             }
         }
@@ -256,7 +256,7 @@
     }
 
     pBuffer->frameCount = done / (mChannelCnt * 2);
-    LOGV("getNextBuffer done %d", pBuffer->frameCount);
+    ALOGV("getNextBuffer done %d", pBuffer->frameCount);
     return OK;
 }
 
@@ -268,7 +268,7 @@
 }
 
 void VideoEditorSRC::checkAndSetResampler() {
-    LOGV("checkAndSetResampler");
+    ALOGV("checkAndSetResampler");
 
     sp<MetaData> format = mSource->getFormat();
     const char *mime;
@@ -291,7 +291,7 @@
     }
 
     if (mSampleRate != mOutputSampleRate || mChannelCnt != 2) {
-        LOGV("Resampling required (in rate %d, out rate %d, in channel %d)",
+        ALOGV("Resampling required (in rate %d, out rate %d, in channel %d)",
             mSampleRate, mOutputSampleRate, mChannelCnt);
 
         mResampler = AudioResampler::create(
@@ -303,7 +303,7 @@
         mResampler->setSampleRate(mSampleRate);
         mResampler->setVolume(UNITY_GAIN, UNITY_GAIN);
     } else {
-        LOGV("Resampling not required (%d = %d)", mSampleRate, mOutputSampleRate);
+        ALOGV("Resampling not required (%d = %d)", mSampleRate, mOutputSampleRate);
     }
 }
 
diff --git a/libvideoeditor/lvpp/VideoEditorTools.cpp b/libvideoeditor/lvpp/VideoEditorTools.cpp
index f1a6c58..94fc61f 100755
--- a/libvideoeditor/lvpp/VideoEditorTools.cpp
+++ b/libvideoeditor/lvpp/VideoEditorTools.cpp
@@ -3167,7 +3167,7 @@
 
     }
     else {
-        LOGV(" YUV buffer reuse");
+        ALOGV(" YUV buffer reuse");
         framingCtx->FramingYuv = (M4VIFI_ImagePlane*)M4OSA_32bitAlignedMalloc(
             3*sizeof(M4VIFI_ImagePlane), M4VS, (M4OSA_Char*)"YUV");
 
@@ -3218,7 +3218,7 @@
      colorEffect);
 
     if(err != M4NO_ERROR) {
-        LOGV("M4VSS3GPP_externalVideoEffectColor(%d) error %d",
+        ALOGV("M4VSS3GPP_externalVideoEffectColor(%d) error %d",
             colorEffect, err);
 
         if(NULL != buffer1) {
@@ -3545,7 +3545,7 @@
         }
     }
 
-    LOGV("doMediaRendering CALL getBuffer()");
+    ALOGV("doMediaRendering CALL getBuffer()");
     // Set the output YUV420 plane to be compatible with YV12 format
     // W & H even
     // YVU instead of YUV
@@ -3570,7 +3570,7 @@
         tempOutputBuffer = M4OSA_NULL;
     }
     if(err != M4NO_ERROR) {
-        LOGV("doVideoPostProcessing: applyRenderingMode returned err=%d",err);
+        ALOGV("doVideoPostProcessing: applyRenderingMode returned err=%d",err);
         return err;
     }
     return M4NO_ERROR;
