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;
diff --git a/libvideoeditor/vss/src/M4VD_EXTERNAL_BitstreamParser.c b/libvideoeditor/vss/src/M4VD_EXTERNAL_BitstreamParser.c
index d1015d5..91952d0 100755
--- a/libvideoeditor/vss/src/M4VD_EXTERNAL_BitstreamParser.c
+++ b/libvideoeditor/vss/src/M4VD_EXTERNAL_BitstreamParser.c
@@ -505,7 +505,7 @@
     }
 
     constraintSet3 = (pDSI[index+2] & 0x10);
-    LOGV("getAVCProfileAndLevel profile_byte %d, level_byte: %d constrain3flag",
+    ALOGV("getAVCProfileAndLevel profile_byte %d, level_byte: %d constrain3flag",
           pDSI[index+1], pDSI[index+3], constraintSet3);
 
     switch (pDSI[index+1]) {
@@ -586,7 +586,7 @@
         default:
             *pLevel = M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL;
     }
-    LOGV("getAVCProfileAndLevel profile %ld level %ld", *pProfile, *pLevel);
+    ALOGV("getAVCProfileAndLevel profile %ld level %ld", *pProfile, *pLevel);
     return M4NO_ERROR;
 }
 
@@ -606,7 +606,7 @@
         *pLevel = M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL;
         return M4ERR_PARAMETER;
     }
-    LOGV("getH263ProfileAndLevel profile_byte %d, level_byte",
+    ALOGV("getH263ProfileAndLevel profile_byte %d, level_byte",
           pDSI[6], pDSI[5]);
     /* get the H263 level */
     switch (pDSI[5]) {
@@ -670,7 +670,7 @@
         default:
            *pProfile = M4VIDEOEDITING_VIDEO_UNKNOWN_PROFILE;
     }
-    LOGV("getH263ProfileAndLevel profile %ld level %ld", *pProfile, *pLevel);
+    ALOGV("getH263ProfileAndLevel profile %ld level %ld", *pProfile, *pLevel);
     return M4NO_ERROR;
 }
 
@@ -682,7 +682,7 @@
     if ((pProfile == M4OSA_NULL) || (pLevel == M4OSA_NULL)) {
         return M4ERR_PARAMETER;
     }
-    LOGV("getMPEG4ProfileAndLevel profileAndLevel %d", profileAndLevel);
+    ALOGV("getMPEG4ProfileAndLevel profileAndLevel %d", profileAndLevel);
     length = sizeof(mpeg4ProfileLevelTable) /sizeof(mpeg4ProfileLevelTable[0]);
     *pProfile = M4VIDEOEDITING_VIDEO_UNKNOWN_PROFILE;
     *pLevel = M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL;
@@ -693,6 +693,6 @@
             break;
         }
     }
-    LOGV("getMPEG4ProfileAndLevel profile %ld level %ld", *pProfile, *pLevel);
+    ALOGV("getMPEG4ProfileAndLevel profile %ld level %ld", *pProfile, *pLevel);
     return M4NO_ERROR;
 }
diff --git a/libvideoeditor/vss/stagefrightshells/inc/VideoEditorUtils.h b/libvideoeditor/vss/stagefrightshells/inc/VideoEditorUtils.h
index 3e61291..a21b21d 100755
--- a/libvideoeditor/vss/stagefrightshells/inc/VideoEditorUtils.h
+++ b/libvideoeditor/vss/stagefrightshells/inc/VideoEditorUtils.h
@@ -44,7 +44,7 @@
 #define VIDEOEDITOR_CHECK(test, errCode) \
 { \
     if( !(test) ) { \
-        LOGV("!!! %s (L%d) check failed : " #test ", yields error 0x%.8x", \
+        ALOGV("!!! %s (L%d) check failed : " #test ", yields error 0x%.8x", \
             __FILE__, __LINE__, errCode); \
         err = (errCode); \
         goto cleanUp; \
diff --git a/libvideoeditor/vss/stagefrightshells/src/VideoEditor3gpReader.cpp b/libvideoeditor/vss/stagefrightshells/src/VideoEditor3gpReader.cpp
index 3c27673..cf0edb7 100755
--- a/libvideoeditor/vss/stagefrightshells/src/VideoEditor3gpReader.cpp
+++ b/libvideoeditor/vss/stagefrightshells/src/VideoEditor3gpReader.cpp
@@ -387,7 +387,7 @@
     M4OSA_ERR err = M4NO_ERROR;
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext , M4ERR_PARAMETER);
 
-    LOGV("VideoEditor3gpReader_create begin");
+    ALOGV("VideoEditor3gpReader_create begin");
 
     /* Context allocation & initialization */
     SAFE_MALLOC(pC, VideoEditor3gpReader_Context, 1, "VideoEditor3gpReader");
@@ -411,11 +411,11 @@
 
 cleanUp:
     if ( M4NO_ERROR == err ) {
-        LOGV("VideoEditor3gpReader_create no error");
+        ALOGV("VideoEditor3gpReader_create no error");
     } else {
-        LOGV("VideoEditor3gpReader_create ERROR 0x%X", err);
+        ALOGV("VideoEditor3gpReader_create ERROR 0x%X", err);
     }
-    LOGV("VideoEditor3gpReader_create end ");
+    ALOGV("VideoEditor3gpReader_create end ");
     return err;
 }
 
@@ -433,7 +433,7 @@
     M4OSA_ERR err = M4NO_ERROR;
     VideoEditor3gpReader_Context* pC = M4OSA_NULL;
 
-    LOGV("VideoEditor3gpReader_destroy begin");
+    ALOGV("VideoEditor3gpReader_destroy begin");
 
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
     pC = (VideoEditor3gpReader_Context*)pContext;
@@ -447,14 +447,14 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditor3gpReader_destroy no error");
+        ALOGV("VideoEditor3gpReader_destroy no error");
     }
     else
     {
-        LOGV("VideoEditor3gpReader_destroy ERROR 0x%X", err);
+        ALOGV("VideoEditor3gpReader_destroy ERROR 0x%X", err);
     }
 
-    LOGV("VideoEditor3gpReader_destroy end ");
+    ALOGV("VideoEditor3gpReader_destroy end ");
     return err;
 }
 
@@ -477,19 +477,19 @@
     VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)pContext;
     M4OSA_ERR err = M4NO_ERROR;
 
-    LOGV("VideoEditor3gpReader_open start ");
+    ALOGV("VideoEditor3gpReader_open start ");
     M4OSA_DEBUG_IF1((M4OSA_NULL == pC),  M4ERR_PARAMETER,
         "VideoEditor3gpReader_open: invalid context pointer");
     M4OSA_DEBUG_IF1((M4OSA_NULL == pFileDescriptor), M4ERR_PARAMETER,
         "VideoEditor3gpReader_open: invalid pointer pFileDescriptor");
 
-    LOGV("VideoEditor3gpReader_open Datasource start %s",
+    ALOGV("VideoEditor3gpReader_open Datasource start %s",
         (char*)pFileDescriptor);
     //pC->mDataSource = DataSource::CreateFromURI((char*)pFileDescriptor);
     pC->mDataSource = new FileSource ((char*)pFileDescriptor);
 
     if (pC->mDataSource == NULL) {
-        LOGV("VideoEditor3gpReader_open Datasource error");
+        ALOGV("VideoEditor3gpReader_open Datasource error");
         return M4ERR_PARAMETER;
     }
 
@@ -497,7 +497,7 @@
         MEDIA_MIMETYPE_CONTAINER_MPEG4);
 
     if (pC->mExtractor == NULL) {
-        LOGV("VideoEditor3gpReader_open extractor error");
+        ALOGV("VideoEditor3gpReader_open extractor error");
         return M4ERR_PARAMETER;
     }
 
@@ -505,11 +505,11 @@
     sp<MetaData> meta = pC->mExtractor->getMetaData();
     meta->findInt32(kKeyIsDRM, &isDRMProtected);
     if (isDRMProtected) {
-        LOGV("VideoEditorMp3Reader_open error - DRM Protected");
+        ALOGV("VideoEditorMp3Reader_open error - DRM Protected");
         return M4ERR_UNSUPPORTED_MEDIA_TYPE;
     }
 
-    LOGV("VideoEditor3gpReader_open end ");
+    ALOGV("VideoEditor3gpReader_open end ");
     return err;
 }
 
@@ -529,13 +529,13 @@
     M4_AccessUnit *pAU;
     M4OSA_ERR err = M4NO_ERROR;
 
-    LOGV("VideoEditor3gpReader_close begin");
+    ALOGV("VideoEditor3gpReader_close begin");
 
     M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
         "VideoEditor3gpReader_close: invalid context pointer");
 
     if (pC->mAudioStreamHandler) {
-        LOGV("VideoEditor3gpReader_close Audio");
+        ALOGV("VideoEditor3gpReader_close Audio");
 
         if (M4OSA_NULL != pC->mAudioStreamHandler->m_pDecoderSpecificInfo) {
             free(pC->mAudioStreamHandler->\
@@ -575,7 +575,7 @@
         pC->mAudioSource.clear();
     }
     if (pC->mVideoStreamHandler) {
-        LOGV("VideoEditor3gpReader_close Video ");
+        ALOGV("VideoEditor3gpReader_close Video ");
 
         if(M4OSA_NULL != pC->mVideoStreamHandler->m_pDecoderSpecificInfo) {
             free(pC->mVideoStreamHandler->\
@@ -607,7 +607,7 @@
     pC->mExtractor.clear();
     pC->mDataSource.clear();
 
-    LOGV("VideoEditor3gpReader_close end");
+    ALOGV("VideoEditor3gpReader_close end");
     return err;
 }
 
@@ -635,7 +635,7 @@
     VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)context;
     M4OSA_ERR err = M4NO_ERROR;
 
-    LOGV("VideoEditor3gpReader_getOption begin %d", optionId);
+    ALOGV("VideoEditor3gpReader_getOption begin %d", optionId);
 
     M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
         "invalid context pointer");
@@ -645,23 +645,23 @@
     switch (optionId) {
     case M4READER_kOptionID_Duration:
         {
-            LOGV("VideoEditor3gpReader_getOption duration %d",pC->mMaxDuration);
+            ALOGV("VideoEditor3gpReader_getOption duration %d",pC->mMaxDuration);
             *(M4OSA_Time*)pValue = pC->mMaxDuration;
         }
         break;
     case M4READER_kOptionID_Version:
         /* not used */
-        LOGV("VideoEditor3gpReader_getOption: M4READER_kOptionID_Version");
+        ALOGV("VideoEditor3gpReader_getOption: M4READER_kOptionID_Version");
         break;
 
     case M4READER_kOptionID_Copyright:
         /* not used */
-        LOGV(">>>>>>>   M4READER_kOptionID_Copyright");
+        ALOGV(">>>>>>>   M4READER_kOptionID_Copyright");
         break;
 
     case M4READER_kOptionID_CreationTime:
         /* not used */
-        LOGV("VideoEditor3gpReader_getOption M4READER_kOptionID_CreationTime");
+        ALOGV("VideoEditor3gpReader_getOption M4READER_kOptionID_CreationTime");
     break;
 
     case M4READER_kOptionID_Bitrate:
@@ -672,13 +672,13 @@
                 M4OSA_UInt32 ui32Tmp = (M4OSA_UInt32)pC->mMaxDuration;
                 *pBitrate = (M4OSA_UInt32)(pC->mFileSize * 8000.0 / pC->mMaxDuration);
             }
-            LOGV("VideoEditor3gpReader_getOption bitrate %ld", *pBitrate);
+            ALOGV("VideoEditor3gpReader_getOption bitrate %ld", *pBitrate);
         }
     break;
     case M4READER_3GP_kOptionID_H263Properties:
         {
             if(M4OSA_NULL == pC->mVideoStreamHandler) {
-                LOGV("VideoEditor3gpReader_getOption no videoStream retrieved");
+                ALOGV("VideoEditor3gpReader_getOption no videoStream retrieved");
 
                 err = M4ERR_NO_VIDEO_STREAM_RETRIEVED_YET;
                 break;
@@ -686,7 +686,7 @@
             if((M4DA_StreamTypeVideoH263 != pC->mVideoStreamHandler->\
                 m_streamType) || (pC->mVideoStreamHandler->\
                 m_decoderSpecificInfoSize < 7)) {
-                LOGV("VideoEditor3gpReader_getOption DSI Size %d",
+                ALOGV("VideoEditor3gpReader_getOption DSI Size %d",
                     pC->mVideoStreamHandler->m_decoderSpecificInfoSize);
 
                 err = M4ERR_VIDEO_NOT_H263;
@@ -699,50 +699,50 @@
                 pC->mVideoStreamHandler->m_pDecoderSpecificInfo[6];
             ((M4READER_3GP_H263Properties *)pValue)->uiLevel =
                 pC->mVideoStreamHandler->m_pDecoderSpecificInfo[5];
-            LOGV("VideoEditor3gpReader_getOption M4READER_3GP_kOptionID_\
+            ALOGV("VideoEditor3gpReader_getOption M4READER_3GP_kOptionID_\
             H263Properties end");
         }
         break;
     case M4READER_3GP_kOptionID_PurpleLabsDrm:
-        LOGV("VideoEditor3gpReaderOption M4READER_3GP_kOptionID_PurpleLabsDrm");
+        ALOGV("VideoEditor3gpReaderOption M4READER_3GP_kOptionID_PurpleLabsDrm");
         /* not used */
         break;
 
     case M4READER_kOptionID_GetNumberOfAudioAu:
         /* not used */
-        LOGV("VideoEditor3gpReadeOption M4READER_kOptionID_GetNumberOfAudioAu");
+        ALOGV("VideoEditor3gpReadeOption M4READER_kOptionID_GetNumberOfAudioAu");
     break;
 
     case M4READER_kOptionID_GetNumberOfVideoAu:
         /* not used */
-        LOGV("VideoEditor3gpReader_getOption :GetNumberOfVideoAu");
+        ALOGV("VideoEditor3gpReader_getOption :GetNumberOfVideoAu");
     break;
 
     case M4READER_kOptionID_GetMetadata:
         /* not used */
-        LOGV("VideoEditor3gpReader_getOption M4READER_kOptionID_GetMetadata");
+        ALOGV("VideoEditor3gpReader_getOption M4READER_kOptionID_GetMetadata");
     break;
 
     case M4READER_kOptionID_3gpFtypBox:
         /* used only for SEMC */
-        LOGV("VideoEditor3gpReader_getOption M4READER_kOptionID_3gpFtypBox");
+        ALOGV("VideoEditor3gpReader_getOption M4READER_kOptionID_3gpFtypBox");
         err = M4ERR_BAD_OPTION_ID; //check this
         break;
 
 #ifdef OPTIONID_GET_NEXT_VIDEO_CTS
     case M4READER_3GP_kOptionID_getNextVideoCTS:
         /* not used */
-        LOGV("VideoEditor3gpReader_getOption: getNextVideoCTS");
+        ALOGV("VideoEditor3gpReader_getOption: getNextVideoCTS");
         break;
 #endif
     default:
         {
             err = M4ERR_BAD_OPTION_ID;
-            LOGV("VideoEditor3gpReader_getOption M4ERR_BAD_OPTION_ID");
+            ALOGV("VideoEditor3gpReader_getOption M4ERR_BAD_OPTION_ID");
         }
         break;
     }
-    LOGV("VideoEditor3gpReader_getOption end: optionID: x%x", optionId);
+    ALOGV("VideoEditor3gpReader_getOption end: optionID: x%x", optionId);
     return err;
 }
 /**
@@ -770,7 +770,7 @@
     M4OSA_DEBUG_IF1((M4OSA_NULL == pValue), M4ERR_PARAMETER,
         "invalid value pointer");
 
-    LOGV("VideoEditor3gpReader_setOption begin %d",optionId);
+    ALOGV("VideoEditor3gpReader_setOption begin %d",optionId);
 
     switch(optionId) {
         case M4READER_kOptionID_SetOsaFileReaderFctsPtr:
@@ -790,12 +790,12 @@
 
         default:
         {
-            LOGV("VideoEditor3gpReader_setOption: returns M4ERR_BAD_OPTION_ID");
+            ALOGV("VideoEditor3gpReader_setOption: returns M4ERR_BAD_OPTION_ID");
             err = M4ERR_BAD_OPTION_ID;
         }
         break;
     }
-    LOGV("VideoEditor3gpReader_setOption end ");
+    ALOGV("VideoEditor3gpReader_setOption end ");
     return err;
 }
 /**
@@ -822,7 +822,7 @@
     M4OSA_DEBUG_IF1((pAccessUnit == 0),    M4ERR_PARAMETER,
         "VideoEditor3gpReader_fillAuStruct: invalid pointer to M4_AccessUnit");
 
-    LOGV("VideoEditor3gpReader_fillAuStruct begin");
+    ALOGV("VideoEditor3gpReader_fillAuStruct begin");
 
     /* Initialize pAccessUnit structure */
     pAccessUnit->m_size         = 0;
@@ -834,7 +834,7 @@
     pAccessUnit->m_streamID     = pStreamHandler->m_streamId;
     pAccessUnit->m_structSize   = sizeof(M4_AccessUnit);
 
-    LOGV("VideoEditor3gpReader_fillAuStruct end");
+    ALOGV("VideoEditor3gpReader_fillAuStruct end");
     return M4NO_ERROR;
 }
 
@@ -864,14 +864,14 @@
     M4OSA_DEBUG_IF1((pTime == 0), M4ERR_PARAMETER,
         "VideoEditor3gpReader_jump: invalid time pointer");
 
-    LOGV("VideoEditor3gpReader_jump begin");
+    ALOGV("VideoEditor3gpReader_jump begin");
 
     if (*pTime == (pStreamHandler->m_duration)) {
         *pTime -= 1;
     }
     time64 = (M4OSA_Time)*pTime;
 
-    LOGV("VideoEditor3gpReader_jump time us %ld ", time64);
+    ALOGV("VideoEditor3gpReader_jump time us %ld ", time64);
 
     if ((pC->mAudioStreamHandler != M4OSA_NULL) &&
             (pStreamHandler->m_streamId == pC->mAudioStreamHandler->m_streamId))
@@ -883,7 +883,7 @@
         time64 = time64 * 1000; /* Convert the time into micro sec */
         pC->mAudioSeeking = M4OSA_TRUE;
         pC->mAudioSeekTime = time64;
-        LOGV("VideoEditor3gpReader_jump AUDIO time us %ld ", time64);
+        ALOGV("VideoEditor3gpReader_jump AUDIO time us %ld ", time64);
     } else if ((pC->mVideoStreamHandler != M4OSA_NULL) &&
             (pStreamHandler->m_streamId == pC->mVideoStreamHandler->m_streamId))
             {
@@ -894,17 +894,17 @@
         time64 = time64 * 1000; /* Convert the time into micro sec */
         pC->mVideoSeeking = M4OSA_TRUE;
         pC->mVideoSeekTime = time64;
-        LOGV("VideoEditor3gpReader_jump VIDEO time us %ld ", time64);
+        ALOGV("VideoEditor3gpReader_jump VIDEO time us %ld ", time64);
     } else {
-        LOGV("VideoEditor3gpReader_jump passed StreamHandler is not known\n");
+        ALOGV("VideoEditor3gpReader_jump passed StreamHandler is not known\n");
         return M4ERR_PARAMETER;
     }
     time64 = time64 / 1000; /* Convert the time into milli sec */
-    LOGV("VideoEditor3gpReader_jump time ms before seekset %ld ", time64);
+    ALOGV("VideoEditor3gpReader_jump time ms before seekset %ld ", time64);
 
     *pTime = (M4OSA_Int32)time64;
 
-    LOGV("VideoEditor3gpReader_jump end");
+    ALOGV("VideoEditor3gpReader_jump end");
     err = M4NO_ERROR;
     return err;
 }
@@ -931,21 +931,21 @@
     M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
         "VideoEditor3gpReader_reset: invalid pointer to M4_StreamHandler");
 
-    LOGV("VideoEditor3gpReader_reset begin");
+    ALOGV("VideoEditor3gpReader_reset begin");
 
     if (pStreamHandler == (M4_StreamHandler*)pC->mAudioStreamHandler) {
         pAu = &pC->mAudioAu;
     } else if (pStreamHandler == (M4_StreamHandler*)pC->mVideoStreamHandler) {
         pAu = &pC->mVideoAu;
     } else {
-        LOGV("VideoEditor3gpReader_reset passed StreamHandler is not known\n");
+        ALOGV("VideoEditor3gpReader_reset passed StreamHandler is not known\n");
         return M4ERR_PARAMETER;
     }
 
     pAu->CTS = time64;
     pAu->DTS = time64;
 
-    LOGV("VideoEditor3gpReader_reset end");
+    ALOGV("VideoEditor3gpReader_reset end");
     return err;
 }
 
@@ -982,13 +982,13 @@
     M4OSA_DEBUG_IF1((pAccessUnit == 0),    M4ERR_PARAMETER,
         "VideoEditor3gpReader_getNextAu: invalid pointer to M4_AccessUnit");
 
-    LOGV("VideoEditor3gpReader_getNextAu begin");
+    ALOGV("VideoEditor3gpReader_getNextAu begin");
 
     if (pStreamHandler == (M4_StreamHandler*)pC->mAudioStreamHandler) {
-        LOGV("VideoEditor3gpReader_getNextAu audio stream");
+        ALOGV("VideoEditor3gpReader_getNextAu audio stream");
         pAu = &pC->mAudioAu;
         if (pC->mAudioSeeking == M4OSA_TRUE) {
-            LOGV("VideoEditor3gpReader_getNextAu audio seek time: %ld",
+            ALOGV("VideoEditor3gpReader_getNextAu audio seek time: %ld",
                 pC->mAudioSeekTime);
             options.setSeekTo(pC->mAudioSeekTime);
             pC->mAudioSource->read(&mMediaBuffer, &options);
@@ -999,7 +999,7 @@
             pC->mAudioSeeking = M4OSA_FALSE;
             flag = M4OSA_TRUE;
         } else {
-            LOGV("VideoEditor3gpReader_getNextAu audio no seek:");
+            ALOGV("VideoEditor3gpReader_getNextAu audio no seek:");
             pC->mAudioSource->read(&mMediaBuffer, &options);
             if (mMediaBuffer != NULL) {
                 mMediaBuffer->meta_data()->findInt64(kKeyTime,
@@ -1007,27 +1007,27 @@
             }
         }
     } else if (pStreamHandler == (M4_StreamHandler*)pC->mVideoStreamHandler) {
-        LOGV("VideoEditor3gpReader_getNextAu video steram ");
+        ALOGV("VideoEditor3gpReader_getNextAu video steram ");
         pAu = &pC->mVideoAu;
         if(pC->mVideoSeeking == M4OSA_TRUE) {
             flag = M4OSA_TRUE;
-            LOGV("VideoEditor3gpReader_getNextAu seek: %ld",pC->mVideoSeekTime);
+            ALOGV("VideoEditor3gpReader_getNextAu seek: %ld",pC->mVideoSeekTime);
             options.setSeekTo(pC->mVideoSeekTime,
                 MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC);
             do
             {
                 if (mMediaBuffer != NULL) {
-                    LOGV("VideoEditor3gpReader_getNextAu free the MediaBuffer");
+                    ALOGV("VideoEditor3gpReader_getNextAu free the MediaBuffer");
                     mMediaBuffer->release();
                 }
                 error = pC->mVideoSource->read(&mMediaBuffer, &options);
-                LOGV("VE3gpReader_getNextAu MediaBuffer %x , error %d",
+                ALOGV("VE3gpReader_getNextAu MediaBuffer %x , error %d",
                     mMediaBuffer, error);
                 if (mMediaBuffer != NULL)
                 {
                     if (mMediaBuffer->meta_data()->findInt32(kKeyIsSyncFrame,
                         &i32Tmp) && i32Tmp) {
-                            LOGV("SYNC FRAME FOUND--%d", i32Tmp);
+                            ALOGV("SYNC FRAME FOUND--%d", i32Tmp);
                         pAu->attribute = AU_RAP;
                     }
                     else {
@@ -1041,17 +1041,17 @@
                 options.clearSeekTo();
             } while(tempTime64 < pC->mVideoSeekTime);
 
-            LOGV("VE3gpReader_getNextAu: video  time with seek  = %lld:",
+            ALOGV("VE3gpReader_getNextAu: video  time with seek  = %lld:",
                 tempTime64);
             pC->mVideoSeeking = M4OSA_FALSE;
         } else {
-            LOGV("VideoEditor3gpReader_getNextAu video no seek:");
+            ALOGV("VideoEditor3gpReader_getNextAu video no seek:");
             pC->mVideoSource->read(&mMediaBuffer, &options);
 
             if(mMediaBuffer != NULL) {
                 if (mMediaBuffer->meta_data()->findInt32(kKeyIsSyncFrame,
                     &i32Tmp) && i32Tmp) {
-                    LOGV("SYNC FRAME FOUND--%d", i32Tmp);
+                    ALOGV("SYNC FRAME FOUND--%d", i32Tmp);
                     pAu->attribute = AU_RAP;
                 }
                 else {
@@ -1059,14 +1059,14 @@
                 }
                 mMediaBuffer->meta_data()->findInt64(kKeyTime,
                     (int64_t*)&tempTime64);
-                LOGV("VE3gpReader_getNextAu: video no seek time = %lld:",
+                ALOGV("VE3gpReader_getNextAu: video no seek time = %lld:",
                     tempTime64);
             }else {
-                LOGV("VE3gpReader_getNextAu:video no seek time buffer is NULL");
+                ALOGV("VE3gpReader_getNextAu:video no seek time buffer is NULL");
             }
         }
     } else {
-        LOGV("VideoEditor3gpReader_getNextAu M4ERR_PARAMETER");
+        ALOGV("VideoEditor3gpReader_getNextAu M4ERR_PARAMETER");
         return M4ERR_PARAMETER;
     }
 
@@ -1077,14 +1077,14 @@
                 free((M4OSA_Int32*)pAu->dataAddress);
                 pAu->dataAddress = NULL;
             }
-            LOGV("Buffer lenght = %d ,%d",(mMediaBuffer->range_length() +\
+            ALOGV("Buffer lenght = %d ,%d",(mMediaBuffer->range_length() +\
                 3) & ~0x3,(mMediaBuffer->range_length()));
 
             pAu->dataAddress = (M4OSA_Int32*)M4OSA_32bitAlignedMalloc(
                 (mMediaBuffer->range_length() + 3) & ~0x3,M4READER_3GP,
                     (M4OSA_Char*)"pAccessUnit->m_dataAddress" );
             if(pAu->dataAddress == NULL) {
-                LOGV("VideoEditor3gpReader_getNextAu malloc failed");
+                ALOGV("VideoEditor3gpReader_getNextAu malloc failed");
                 return M4ERR_ALLOC;
             }
         }
@@ -1100,7 +1100,7 @@
             M4OSA_UInt8 *lbuffer;
 
             lbuffer = (M4OSA_UInt8 *) pAu->dataAddress;
-            LOGV("pAccessUnit->m_dataAddress size = %x",size);
+            ALOGV("pAccessUnit->m_dataAddress size = %x",size);
 
             lbuffer[0] = (size >> 24) & 0xFF;
             lbuffer[1] = (size >> 16) & 0xFF;
@@ -1111,7 +1111,7 @@
         pAu->CTS = tempTime64;
 
         pAu->CTS = pAu->CTS / 1000; //converting the microsec to millisec
-        LOGV("VideoEditor3gpReader_getNextAu CTS = %ld",pAu->CTS);
+        ALOGV("VideoEditor3gpReader_getNextAu CTS = %ld",pAu->CTS);
 
         pAu->DTS  = pAu->CTS;
         if (pStreamHandler == (M4_StreamHandler*)pC->mAudioStreamHandler) {
@@ -1127,7 +1127,7 @@
         pAccessUnit->m_attribute = pAu->attribute;
 
     } else {
-        LOGV("VideoEditor3gpReader_getNextAu: M4WAR_NO_MORE_AU (EOS) reached");
+        ALOGV("VideoEditor3gpReader_getNextAu: M4WAR_NO_MORE_AU (EOS) reached");
         pAccessUnit->m_size = 0;
         err = M4WAR_NO_MORE_AU;
     }
@@ -1135,7 +1135,7 @@
 
     pAu->nbFrag = 0;
     mMediaBuffer = NULL;
-    LOGV("VideoEditor3gpReader_getNextAu end ");
+    ALOGV("VideoEditor3gpReader_getNextAu end ");
 
     return err;
 }
@@ -1425,7 +1425,7 @@
     M4OSA_Int32  ptempTime;
     M4OSA_Int32  avgFPS=0;
 
-    LOGV("VideoEditor3gpReader_getNextStreamHandler begin");
+    ALOGV("VideoEditor3gpReader_getNextStreamHandler begin");
 
     M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER,
         "VideoEditor3gpReader_getNextStreamHandler: invalid context");
@@ -1438,7 +1438,7 @@
     temp = pC->mCurrTrack;
 
     if(temp >= trackCount) {
-        LOGV("VideoEditor3gpReader_getNextStreamHandler error = %d",
+        ALOGV("VideoEditor3gpReader_getNextStreamHandler error = %d",
             M4WAR_NO_MORE_STREAM);
         return (M4WAR_NO_MORE_STREAM);
     } else {
@@ -1452,7 +1452,7 @@
 
             *pMediaFamily = M4READER_kMediaFamilyVideo;
             haveVideo = true;
-            LOGV("VideoEditor3gpReader_getNextStreamHandler getTrack called");
+            ALOGV("VideoEditor3gpReader_getNextStreamHandler getTrack called");
             if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) {
                 streamType = M4DA_StreamTypeVideoMpeg4Avc;
             } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_H263)) {
@@ -1460,9 +1460,9 @@
             } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_MPEG4)) {
                 streamType = M4DA_StreamTypeVideoMpeg4;
             } else {
-                LOGV("VideoEditor3gpReaderGetNextStreamHandler streamTypeNONE");
+                ALOGV("VideoEditor3gpReaderGetNextStreamHandler streamTypeNONE");
             }
-            LOGV("VideoEditor3gpReader_getNextStreamHandler: stream type: %d ",
+            ALOGV("VideoEditor3gpReader_getNextStreamHandler: stream type: %d ",
                 streamType);
 
             if(streamType != M4DA_StreamTypeUnknown) {
@@ -1488,14 +1488,14 @@
                 ((*pStreamHandler)->m_duration) =
                     (int32_t)((Duration)/1000); // conversion to mS
                 pC->mMaxDuration = ((*pStreamHandler)->m_duration);
-                LOGV("VideoEditor3gpReader_getNextStreamHandler m_duration %d",
+                ALOGV("VideoEditor3gpReader_getNextStreamHandler m_duration %d",
                     (*pStreamHandler)->m_duration);
 
                 off64_t fileSize = 0;
                 pC->mDataSource->getSize(&fileSize);
                 pC->mFileSize  = fileSize;
 
-                LOGV("VideoEditor3gpReader_getNextStreamHandler m_fileSize %d",
+                ALOGV("VideoEditor3gpReader_getNextStreamHandler m_fileSize %d",
                     pC->mFileSize);
 
                 meta->findInt32(kKeyMaxInputSize, (int32_t*)&(maxAUSize));
@@ -1503,22 +1503,22 @@
                     maxAUSize = 70000;
                 }
                 (*pStreamHandler)->m_maxAUSize = maxAUSize;
-                LOGV("<<<<<<<<<<   video: mMaxAUSize from MP4 extractor: %d",
+                ALOGV("<<<<<<<<<<   video: mMaxAUSize from MP4 extractor: %d",
                     (*pStreamHandler)->m_maxAUSize);
 
                 ((M4_StreamHandler*)pVideoStreamHandler)->m_averageBitRate =
                         (pC->mFileSize * 8000)/pC->mMaxDuration;
-                LOGV("VideoEditor3gpReader_getNextStreamHandler m_averageBitrate %d",
+                ALOGV("VideoEditor3gpReader_getNextStreamHandler m_averageBitrate %d",
                     ((M4_StreamHandler*)pVideoStreamHandler)->m_averageBitRate);
 
 
                 meta->findInt32(kKeyFrameRate,
                     (int32_t*)&(avgFPS));
-                LOGV("<<<<<<<<<<   video: Average FPS from MP4 extractor: %d",
+                ALOGV("<<<<<<<<<<   video: Average FPS from MP4 extractor: %d",
                     avgFPS);
 
                 pVideoStreamHandler->m_averageFrameRate =(M4OSA_Float) avgFPS;
-                LOGV("<<<<<<<<<<   video: Average FPS from MP4 extractor in FLOAT: %f",
+                ALOGV("<<<<<<<<<<   video: Average FPS from MP4 extractor in FLOAT: %f",
                     pVideoStreamHandler->m_averageFrameRate);
 
                 // Get the video rotation degree
@@ -1557,7 +1557,7 @@
                         (*pStreamHandler)->m_pH264DecoderSpecificInfo = M4OSA_NULL;
                         (*pStreamHandler)->m_H264decoderSpecificInfoSize = 0;
                     } else {
-                        LOGV("VE_getNextStreamHandler: H263 dsi not found");
+                        ALOGV("VE_getNextStreamHandler: H263 dsi not found");
                         (*pStreamHandler)->m_pDecoderSpecificInfo = M4OSA_NULL;
                         (*pStreamHandler)->m_decoderSpecificInfoSize = 0;
                         (*pStreamHandler)->m_H264decoderSpecificInfoSize = 0;
@@ -1575,13 +1575,13 @@
                                 decoderSpecificInfoSize, M4READER_3GP,
                                 (M4OSA_Char*)"H264 DecoderSpecific" );
                             if (M4OSA_NULL == DecoderSpecificInfo) {
-                                LOGV("VideoEditor3gp_getNextStream is NULL ");
+                                ALOGV("VideoEditor3gp_getNextStream is NULL ");
                                 return M4ERR_ALLOC;
                             }
                             memcpy((void *)DecoderSpecificInfo,
                                 (void *)data, decoderSpecificInfoSize);
                         } else {
-                            LOGV("DSI Size %d", decoderSpecificInfoSize);
+                            ALOGV("DSI Size %d", decoderSpecificInfoSize);
                             DecoderSpecificInfo = M4OSA_NULL;
                         }
                     }
@@ -1594,7 +1594,7 @@
                     if (M4NO_ERROR != err) {
                         return err;
                     }
-                    LOGV("decsize %d, h264decsize %d: %d", (*pStreamHandler)->\
+                    ALOGV("decsize %d, h264decsize %d: %d", (*pStreamHandler)->\
                         m_decoderSpecificInfoSize, (*pStreamHandler)->\
                         m_H264decoderSpecificInfoSize);
 
@@ -1619,7 +1619,7 @@
 
                         esds.getCodecSpecificInfo(&codec_specific_data,
                             &codec_specific_data_size);
-                        LOGV("VE MP4 dsisize: %d, %x", codec_specific_data_size,
+                        ALOGV("VE MP4 dsisize: %d, %x", codec_specific_data_size,
                             codec_specific_data);
 
                         (*pStreamHandler)->m_decoderSpecificInfoSize =
@@ -1646,17 +1646,17 @@
                         (*pStreamHandler)->m_H264decoderSpecificInfoSize = 0;
                     }
                 } else {
-                    LOGV("VideoEditor3gpReader_getNextStream NO video stream");
+                    ALOGV("VideoEditor3gpReader_getNextStream NO video stream");
                     return M4ERR_READER_UNKNOWN_STREAM_TYPE;
                 }
             }
             else {
-                LOGV("VideoEditor3gpReader_getNextStream NO video stream");
+                ALOGV("VideoEditor3gpReader_getNextStream NO video stream");
                 return M4ERR_READER_UNKNOWN_STREAM_TYPE;
             }
 
         } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) {
-            LOGV("VideoEditor3gpReader_getNextStream audio getTrack called");
+            ALOGV("VideoEditor3gpReader_getNextStream audio getTrack called");
             pC->mAudioSource = pC->mExtractor->getTrack(pC->mCurrTrack);
             pC->mAudioSource->start();
             *pMediaFamily = M4READER_kMediaFamilyAudio;
@@ -1669,13 +1669,13 @@
             else if(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) {
                 streamType = M4DA_StreamTypeAudioAac;
             } else {
-                LOGV("VideoEditor3gpReader_getNextStrea streamtype Unknown ");
+                ALOGV("VideoEditor3gpReader_getNextStrea streamtype Unknown ");
             }
             if(streamType != M4DA_StreamTypeUnknown) {
                 pC->mStreamType = streamType;
                 pC->mStreamId = pC->mCurrTrack;
 
-                LOGV("VE streamtype %d ,id %d",  streamType, pC->mCurrTrack);
+                ALOGV("VE streamtype %d ,id %d",  streamType, pC->mCurrTrack);
 
                 pAudioStreamHandler = (M4_AudioStreamHandler*)M4OSA_32bitAlignedMalloc
                     (sizeof(M4_AudioStreamHandler), M4READER_3GP,
@@ -1703,7 +1703,7 @@
                     maxAUSize = 70000;
                 }
                 (*pStreamHandler)->m_maxAUSize = maxAUSize;
-                LOGV("VE Audio mMaxAUSize from MP4 extractor: %d", maxAUSize);
+                ALOGV("VE Audio mMaxAUSize from MP4 extractor: %d", maxAUSize);
             }
             if((M4DA_StreamTypeAudioAmrNarrowBand == streamType) ||
                 (M4DA_StreamTypeAudioAmrWideBand == streamType)) {
@@ -1779,7 +1779,7 @@
                     esds.getCodecSpecificInfo(&codec_specific_data,
                         &codec_specific_data_size);
 
-                    LOGV("VEdsi %d,%x",codec_specific_data_size,
+                    ALOGV("VEdsi %d,%x",codec_specific_data_size,
                         codec_specific_data);
 
                     (*pStreamHandler)->m_decoderSpecificInfoSize =
@@ -1801,15 +1801,15 @@
                     }
                 }
             } else {
-                LOGV("VideoEditor3gpReader_getNextStream mStreamType: none ");
+                ALOGV("VideoEditor3gpReader_getNextStream mStreamType: none ");
                 return M4ERR_READER_UNKNOWN_STREAM_TYPE;
             }
         } else {
-            LOGV("VE noaudio-video stream:pC->mCurrTrack = %d ",pC->mCurrTrack);
+            ALOGV("VE noaudio-video stream:pC->mCurrTrack = %d ",pC->mCurrTrack);
             pC->mCurrTrack++; //Increment current track to get the next track
             return M4ERR_READER_UNKNOWN_STREAM_TYPE;
         }
-        LOGV("VE StreamType: %d, stremhandler %x",streamType, *pStreamHandler );
+        ALOGV("VE StreamType: %d, stremhandler %x",streamType, *pStreamHandler );
         (*pStreamHandler)->m_streamType = streamType;
         (*pStreamHandler)->m_streamId   = pC->mStreamId;
         (*pStreamHandler)->m_pUserData  = M4OSA_NULL;
@@ -1822,7 +1822,7 @@
         (*pStreamHandler)->m_duration = (int32_t)(Duration / 1000);
 
         pC->mMaxDuration = ((*pStreamHandler)->m_duration);
-        LOGV("VE str duration duration: %d ", (*pStreamHandler)->m_duration);
+        ALOGV("VE str duration duration: %d ", (*pStreamHandler)->m_duration);
 
         /* In AAC case: Put the first AU in pAudioStreamHandler->m_pUserData
          *since decoder has to know if stream contains SBR data(Implicit sig) */
@@ -1877,14 +1877,14 @@
         }
     }
     pC->mCurrTrack++; //Increment the current track to get next track
-    LOGV("pC->mCurrTrack = %d",pC->mCurrTrack);
+    ALOGV("pC->mCurrTrack = %d",pC->mCurrTrack);
 
     if (!haveAudio && !haveVideo) {
         *pMediaFamily=M4READER_kMediaFamilyUnknown;
         return M4ERR_READER_UNKNOWN_STREAM_TYPE;
     }
 Error:
-    LOGV("VideoEditor3gpReader_getNextStreamHandler end error = %d",err);
+    ALOGV("VideoEditor3gpReader_getNextStreamHandler end error = %d",err);
     return err;
 }
 
@@ -1899,7 +1899,7 @@
     int64_t tempTime64 = 0;
     status_t error;
 
-    LOGV("VideoEditor3gpReader_getPrevRapTime begin");
+    ALOGV("VideoEditor3gpReader_getPrevRapTime begin");
 
     M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER,
         "VideoEditor3gpReader_getPrevRapTime: invalid context");
@@ -1913,7 +1913,7 @@
 
     time64 = (M4OSA_Time)*pTime * 1000;
 
-    LOGV("VideoEditor3gpReader_getPrevRapTime seek time: %ld",time64);
+    ALOGV("VideoEditor3gpReader_getPrevRapTime seek time: %ld",time64);
     options.setSeekTo(time64, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC);
     error = pC->mVideoSource->read(&mMediaBuffer, &options);
     if (error != OK) {
@@ -1923,13 +1923,13 @@
     }
 
     mMediaBuffer->meta_data()->findInt64(kKeyTime, (int64_t*)&tempTime64);
-    LOGV("VideoEditor3gpReader_getPrevRapTime read time %ld, %x", tempTime64,
+    ALOGV("VideoEditor3gpReader_getPrevRapTime read time %ld, %x", tempTime64,
         mMediaBuffer);
 
     *pTime = (M4OSA_Int32)(tempTime64 / 1000);
 
     if(mMediaBuffer != M4OSA_NULL) {
-        LOGV(" mMediaBuffer size = %d length %d", mMediaBuffer->size(),
+        ALOGV(" mMediaBuffer size = %d length %d", mMediaBuffer->size(),
             mMediaBuffer->range_length());
         mMediaBuffer->release();
         mMediaBuffer = M4OSA_NULL;
@@ -1937,11 +1937,11 @@
     options.clearSeekTo();
 
     if(error != OK) {
-        LOGV("VideoEditor3gpReader_getPrevRapTime end \
+        ALOGV("VideoEditor3gpReader_getPrevRapTime end \
             M4WAR_READER_INFORMATION_NOT_PRESENT");
         return M4WAR_READER_INFORMATION_NOT_PRESENT;
     } else {
-        LOGV("VideoEditor3gpReader_getPrevRapTime end: err %x", err);
+        ALOGV("VideoEditor3gpReader_getPrevRapTime end: err %x", err);
         err = M4NO_ERROR;
         return err;
     }
@@ -1958,8 +1958,8 @@
     VIDEOEDITOR_CHECK(M4OSA_NULL != pRdrGlobalInterface, M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(M4OSA_NULL != pRdrDataInterface, M4ERR_PARAMETER);
 
-    LOGV("VideoEditor3gpReader_getInterface begin");
-    LOGV("VideoEditor3gpReader_getInterface %d 0x%x 0x%x", *pMediaType,
+    ALOGV("VideoEditor3gpReader_getInterface begin");
+    ALOGV("VideoEditor3gpReader_getInterface %d 0x%x 0x%x", *pMediaType,
         *pRdrGlobalInterface,*pRdrDataInterface);
 
     SAFE_MALLOC(*pRdrGlobalInterface, M4READER_GlobalInterface, 1,
@@ -1990,14 +1990,14 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditor3gpReader_getInterface no error");
+        ALOGV("VideoEditor3gpReader_getInterface no error");
     } else {
         SAFE_FREE(*pRdrGlobalInterface);
         SAFE_FREE(*pRdrDataInterface);
 
-        LOGV("VideoEditor3gpReader_getInterface ERROR 0x%X", err);
+        ALOGV("VideoEditor3gpReader_getInterface ERROR 0x%X", err);
     }
-    LOGV("VideoEditor3gpReader_getInterface end");
+    ALOGV("VideoEditor3gpReader_getInterface end");
     return err;
 }
 
diff --git a/libvideoeditor/vss/stagefrightshells/src/VideoEditorAudioDecoder.cpp b/libvideoeditor/vss/stagefrightshells/src/VideoEditorAudioDecoder.cpp
index 38e667c..62ec51a 100755
--- a/libvideoeditor/vss/stagefrightshells/src/VideoEditorAudioDecoder.cpp
+++ b/libvideoeditor/vss/stagefrightshells/src/VideoEditorAudioDecoder.cpp
@@ -136,14 +136,14 @@
     status_t err = OK;
 
     if( CREATED != mState ) {
-        LOGV("VideoEditorAudioDecoderSource::start: invalid state %d", mState);
+        ALOGV("VideoEditorAudioDecoderSource::start: invalid state %d", mState);
         return UNKNOWN_ERROR;
     }
 
     mState = STARTED;
 
 cleanUp:
-    LOGV("VideoEditorAudioDecoderSource::start END (0x%x)", err);
+    ALOGV("VideoEditorAudioDecoderSource::start END (0x%x)", err);
     return err;
 }
 
@@ -151,10 +151,10 @@
     Mutex::Autolock autolock(mLock);
     status_t err = OK;
 
-    LOGV("VideoEditorAudioDecoderSource::stop begin");
+    ALOGV("VideoEditorAudioDecoderSource::stop begin");
 
     if( STARTED != mState ) {
-        LOGV("VideoEditorAudioDecoderSource::stop: invalid state %d", mState);
+        ALOGV("VideoEditorAudioDecoderSource::stop: invalid state %d", mState);
         return UNKNOWN_ERROR;
     }
 
@@ -169,13 +169,13 @@
 
     mState = CREATED;
 
-    LOGV("VideoEditorAudioDecoderSource::stop END (0x%x)", err);
+    ALOGV("VideoEditorAudioDecoderSource::stop END (0x%x)", err);
     return err;
 }
 
 sp<MetaData> VideoEditorAudioDecoderSource::getFormat() {
 
-    LOGV("VideoEditorAudioDecoderSource::getFormat");
+    ALOGV("VideoEditorAudioDecoderSource::getFormat");
     return mFormat;
 }
 
@@ -191,7 +191,7 @@
                pAccessUnit);
 
     if (lerr == M4WAR_NO_MORE_AU) {
-        LOGV("readBufferFromReader : EOS");
+        ALOGV("readBufferFromReader : EOS");
         return NULL;
     }
 
@@ -213,7 +213,7 @@
      (VideoEditorAudioDecoder_Context *)mDecShellContext;
 
     if ( STARTED != mState ) {
-        LOGV("VideoEditorAudioDecoderSource::read invalid state %d", mState);
+        ALOGV("VideoEditorAudioDecoderSource::read invalid state %d", mState);
         return UNKNOWN_ERROR;
     }
 
@@ -238,7 +238,7 @@
     VideoEditorAudioDecoder_Context* pDecContext =
      (VideoEditorAudioDecoder_Context *)mDecShellContext;
 
-    LOGV("VideoEditorAudioDecoderSource::storeBuffer begin");
+    ALOGV("VideoEditorAudioDecoderSource::storeBuffer begin");
 
     // If the user didn't give us a buffer, get it from the reader.
     if(buffer == NULL) {
@@ -251,7 +251,7 @@
     }
 
     mBuffers.push(buffer);
-    LOGV("VideoEditorAudioDecoderSource::storeBuffer END");
+    ALOGV("VideoEditorAudioDecoderSource::storeBuffer END");
 }
 
 /********************
@@ -278,7 +278,7 @@
     VIDEOEDITOR_CHECK(32 >= nbBits, M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK((*pOffset + nbBits) <= 8*dataSize, M4ERR_PARAMETER);
 
-    LOGV("VideoEditorAudioDecoder_getBits begin");
+    ALOGV("VideoEditorAudioDecoder_getBits begin");
 
     startByte   = (*pOffset) >> 3;
     endByte     = (*pOffset + nbBits) >> 3;
@@ -308,11 +308,11 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioDecoder_getBits no error");
+        ALOGV("VideoEditorAudioDecoder_getBits no error");
     } else {
-        LOGV("VideoEditorAudioDecoder_getBits ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioDecoder_getBits ERROR 0x%X", err);
     }
-    LOGV("VideoEditorAudioDecoder_getBits end");
+    ALOGV("VideoEditorAudioDecoder_getBits end");
     return err;
 }
 
@@ -330,7 +330,7 @@
     M4OSA_UInt32 offset = 0;
     M4OSA_Int32 result = 0;
 
-    LOGV("VideoEditorAudioDecoder_parse_AAC_DSI begin");
+    ALOGV("VideoEditorAudioDecoder_parse_AAC_DSI begin");
 
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pDSI, M4ERR_PARAMETER);
@@ -356,7 +356,7 @@
             pProperties->aSBRPresent = 1;
             break;
         default:
-            LOGV("parse_AAC_DSI ERROR : object type %d is not supported",
+            ALOGV("parse_AAC_DSI ERROR : object type %d is not supported",
                 result);
             VIDEOEDITOR_CHECK(!"invalid AAC object type", M4ERR_BAD_OPTION_ID);
             break;
@@ -381,11 +381,11 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioDecoder_parse_AAC_DSI no error");
+        ALOGV("VideoEditorAudioDecoder_parse_AAC_DSI no error");
     } else {
-        LOGV("VideoEditorAudioDecoder_parse_AAC_DSI ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioDecoder_parse_AAC_DSI ERROR 0x%X", err);
     }
-    LOGV("VideoEditorAudioDecoder_parse_AAC_DSI end");
+    ALOGV("VideoEditorAudioDecoder_parse_AAC_DSI end");
     return err;
 }
 
@@ -397,7 +397,7 @@
     M4OSA_ERR err = M4NO_ERROR;
     VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
 
-    LOGV("VideoEditorAudioDecoder_destroy begin");
+    ALOGV("VideoEditorAudioDecoder_destroy begin");
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
 
@@ -415,15 +415,15 @@
 
     SAFE_FREE(pDecoderContext);
     pContext = M4OSA_NULL;
-    LOGV("VideoEditorAudioDecoder_destroy : DONE");
+    ALOGV("VideoEditorAudioDecoder_destroy : DONE");
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioDecoder_destroy no error");
+        ALOGV("VideoEditorAudioDecoder_destroy no error");
     } else {
-        LOGV("VideoEditorAudioDecoder_destroy ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioDecoder_destroy ERROR 0x%X", err);
     }
-    LOGV("VideoEditorAudioDecoder_destroy : end");
+    ALOGV("VideoEditorAudioDecoder_destroy : end");
     return err;
 }
 
@@ -438,7 +438,7 @@
     const char* mime = NULL;
     uint32_t codecFlags = 0;
 
-    LOGV("VideoEditorAudioDecoder_create begin: decoderType %d", decoderType);
+    ALOGV("VideoEditorAudioDecoder_create begin: decoderType %d", decoderType);
 
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext,       M4ERR_PARAMETER);
@@ -455,7 +455,7 @@
     pDecoderContext->readerErrCode = M4NO_ERROR;
     pDecoderContext->timeStampMs = -1;
 
-    LOGV("VideoEditorAudioDecoder_create : maxAUSize %d",
+    ALOGV("VideoEditorAudioDecoder_create : maxAUSize %d",
         pDecoderContext->mAudioStreamHandler->m_basicProperties.m_maxAUSize);
 
     // Create the meta data for the decoder
@@ -564,7 +564,7 @@
     // Get the output channels, the decoder might overwrite the input metadata
     pDecoderContext->mDecoder->getFormat()->findInt32(kKeyChannelCount,
         &pDecoderContext->mNbOutputChannels);
-    LOGV("VideoEditorAudioDecoder_create : output chan %d",
+    ALOGV("VideoEditorAudioDecoder_create : output chan %d",
         pDecoderContext->mNbOutputChannels);
 
     // Start the decoder
@@ -572,15 +572,15 @@
     VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE);
 
     *pContext = pDecoderContext;
-    LOGV("VideoEditorAudioDecoder_create : DONE");
+    ALOGV("VideoEditorAudioDecoder_create : DONE");
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioDecoder_create no error");
+        ALOGV("VideoEditorAudioDecoder_create no error");
     } else {
         VideoEditorAudioDecoder_destroy(pDecoderContext);
         *pContext = M4OSA_NULL;
-        LOGV("VideoEditorAudioDecoder_create ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioDecoder_create ERROR 0x%X", err);
     }
     return err;
 }
@@ -622,7 +622,7 @@
     VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
     MediaBuffer* buffer = NULL;
 
-    LOGV("VideoEditorAudioDecoder_processInputBuffer begin");
+    ALOGV("VideoEditorAudioDecoder_processInputBuffer begin");
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
 
@@ -639,11 +639,11 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioDecoder_processInputBuffer no error");
+        ALOGV("VideoEditorAudioDecoder_processInputBuffer no error");
     } else {
-        LOGV("VideoEditorAudioDecoder_processInputBuffer ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioDecoder_processInputBuffer ERROR 0x%X", err);
     }
-    LOGV("VideoEditorAudioDecoder_processInputBuffer end");
+    ALOGV("VideoEditorAudioDecoder_processInputBuffer end");
     return err;
 }
 
@@ -655,7 +655,7 @@
     int64_t i64Tmp = 0;
     status_t result = OK;
 
-    LOGV("VideoEditorAudioDecoder_processOutputBuffer begin");
+    ALOGV("VideoEditorAudioDecoder_processOutputBuffer begin");
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(M4OSA_NULL != buffer, M4ERR_PARAMETER);
@@ -701,12 +701,12 @@
     // Release the buffer
     buffer->release();
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioDecoder_processOutputBuffer no error");
+        ALOGV("VideoEditorAudioDecoder_processOutputBuffer no error");
     } else {
         pOuputBuffer->m_bufferSize = 0;
-        LOGV("VideoEditorAudioDecoder_processOutputBuffer ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioDecoder_processOutputBuffer ERROR 0x%X", err);
     }
-    LOGV("VideoEditorAudioDecoder_processOutputBuffer end");
+    ALOGV("VideoEditorAudioDecoder_processOutputBuffer end");
     return err;
 }
 
@@ -718,7 +718,7 @@
     status_t result = OK;
     MediaBuffer* outputBuffer = NULL;
 
-    LOGV("VideoEditorAudioDecoder_step begin");
+    ALOGV("VideoEditorAudioDecoder_step begin");
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
 
@@ -733,7 +733,7 @@
     // Read
     result = pDecoderContext->mDecoder->read(&outputBuffer, NULL);
     if (INFO_FORMAT_CHANGED == result) {
-        LOGV("VideoEditorAudioDecoder_step: Audio decoder \
+        ALOGV("VideoEditorAudioDecoder_step: Audio decoder \
          returned INFO_FORMAT_CHANGED");
         CHECK(outputBuffer == NULL);
         sp<MetaData> meta = pDecoderContext->mDecoder->getFormat();
@@ -741,8 +741,8 @@
 
         CHECK(meta->findInt32(kKeySampleRate, &sampleRate));
         CHECK(meta->findInt32(kKeyChannelCount, &channelCount));
-        LOGV("VideoEditorAudioDecoder_step: samplingFreq = %d", sampleRate);
-        LOGV("VideoEditorAudioDecoder_step: channelCnt = %d", channelCount);
+        ALOGV("VideoEditorAudioDecoder_step: samplingFreq = %d", sampleRate);
+        ALOGV("VideoEditorAudioDecoder_step: channelCnt = %d", channelCount);
         pDecoderContext->mAudioStreamHandler->m_samplingFrequency =
          (uint32_t)sampleRate;
         pDecoderContext->mAudioStreamHandler->m_nbChannels =
@@ -751,7 +751,7 @@
 
         return M4WAR_INFO_FORMAT_CHANGE;
     } else if (ERROR_END_OF_STREAM == result) {
-        LOGV("VideoEditorAudioDecoder_step: Audio decoder \
+        ALOGV("VideoEditorAudioDecoder_step: Audio decoder \
          returned ERROR_END_OF_STREAM");
         pDecoderContext->readerErrCode = M4WAR_NO_MORE_AU;
         return M4WAR_NO_MORE_AU;
@@ -766,18 +766,18 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioDecoder_step no error");
+        ALOGV("VideoEditorAudioDecoder_step no error");
     } else {
-        LOGV("VideoEditorAudioDecoder_step ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioDecoder_step ERROR 0x%X", err);
     }
-    LOGV("VideoEditorAudioDecoder_step end");
+    ALOGV("VideoEditorAudioDecoder_step end");
     return err;
 }
 
 M4OSA_ERR VideoEditorAudioDecoder_getVersion(M4_VersionInfo* pVersionInfo) {
     M4OSA_ERR err = M4NO_ERROR;
 
-    LOGV("VideoEditorAudioDecoder_getVersion begin");
+    ALOGV("VideoEditorAudioDecoder_getVersion begin");
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pVersionInfo, M4ERR_PARAMETER);
 
@@ -788,11 +788,11 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioDecoder_getVersion no error");
+        ALOGV("VideoEditorAudioDecoder_getVersion no error");
     } else {
-        LOGV("VideoEditorAudioDecoder_getVersion ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioDecoder_getVersion ERROR 0x%X", err);
     }
-    LOGV("VideoEditorAudioDecoder_getVersion end");
+    ALOGV("VideoEditorAudioDecoder_getVersion end");
     return err;
 }
 
@@ -802,7 +802,7 @@
     M4OSA_ERR err = M4NO_ERROR;
     VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
 
-    LOGV("VideoEditorAudioDecoder_setOption begin 0x%X", optionID);
+    ALOGV("VideoEditorAudioDecoder_setOption begin 0x%X", optionID);
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
 
@@ -810,24 +810,24 @@
 
     switch( optionID ) {
         case M4AD_kOptionID_UserParam:
-            LOGV("VideoEditorAudioDecodersetOption UserParam is not supported");
+            ALOGV("VideoEditorAudioDecodersetOption UserParam is not supported");
             err = M4ERR_NOT_IMPLEMENTED;
             break;
 
         case M4AD_kOptionID_3gpReaderInterface:
-            LOGV("VideoEditorAudioDecodersetOption 3gpReaderInterface");
+            ALOGV("VideoEditorAudioDecodersetOption 3gpReaderInterface");
             pDecoderContext->m_pReader =
              (M4READER_DataInterface *)optionValue;
             break;
 
         case M4AD_kOptionID_AudioAU:
-            LOGV("VideoEditorAudioDecodersetOption AudioAU");
+            ALOGV("VideoEditorAudioDecodersetOption AudioAU");
             pDecoderContext->m_pNextAccessUnitToDecode =
              (M4_AccessUnit *)optionValue;
             break;
 
         default:
-            LOGV("VideoEditorAudioDecoder_setOption  unsupported optionId 0x%X",
+            ALOGV("VideoEditorAudioDecoder_setOption  unsupported optionId 0x%X",
                 optionID);
             VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_BAD_OPTION_ID);
             break;
@@ -835,11 +835,11 @@
 
 cleanUp:
     if( ((M4OSA_UInt32)M4NO_ERROR == err) || ((M4OSA_UInt32)M4ERR_NOT_IMPLEMENTED == err) ) {
-        LOGV("VideoEditorAudioDecoder_setOption error 0x%X", err);
+        ALOGV("VideoEditorAudioDecoder_setOption error 0x%X", err);
     } else {
-        LOGV("VideoEditorAudioDecoder_setOption ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioDecoder_setOption ERROR 0x%X", err);
     }
-    LOGV("VideoEditorAudioDecoder_setOption end");
+    ALOGV("VideoEditorAudioDecoder_setOption end");
     return err;
 }
 
@@ -849,7 +849,7 @@
     M4OSA_ERR err = M4NO_ERROR;
     VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
 
-    LOGV("VideoEditorAudioDecoder_getOption begin: optionID 0x%X", optionID);
+    ALOGV("VideoEditorAudioDecoder_getOption begin: optionID 0x%X", optionID);
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
 
@@ -876,7 +876,7 @@
             break;
 
         default:
-            LOGV("VideoEditorAudioDecoder_getOption unsupported optionId 0x%X",
+            ALOGV("VideoEditorAudioDecoder_getOption unsupported optionId 0x%X",
                 optionID);
             VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_BAD_OPTION_ID);
             break;
@@ -884,11 +884,11 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioDecoder_getOption no error");
+        ALOGV("VideoEditorAudioDecoder_getOption no error");
     } else {
-        LOGV("VideoEditorAudioDecoder_getOption ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioDecoder_getOption ERROR 0x%X", err);
     }
-    LOGV("VideoEditorAudioDecoder_getOption end");
+    ALOGV("VideoEditorAudioDecoder_getOption end");
     return err;
 }
 
@@ -901,7 +901,7 @@
     VIDEOEDITOR_CHECK(M4OSA_NULL != pDecoderType, M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(M4OSA_NULL != pDecoderInterface, M4ERR_PARAMETER);
 
-    LOGV("VideoEditorAudioDecoder_getInterface begin %d 0x%x 0x%x",
+    ALOGV("VideoEditorAudioDecoder_getInterface begin %d 0x%x 0x%x",
         decoderType, pDecoderType, pDecoderInterface);
 
     SAFE_MALLOC(*pDecoderInterface, M4AD_Interface, 1,
@@ -927,7 +927,7 @@
                 VideoEditorAudioDecoder_create_MP3;
             break;
         default:
-            LOGV("VEAD_getInterface ERROR: unsupported type %d", decoderType);
+            ALOGV("VEAD_getInterface ERROR: unsupported type %d", decoderType);
             VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_PARAMETER);
         break;
     }
@@ -946,12 +946,12 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioDecoder_getInterface no error");
+        ALOGV("VideoEditorAudioDecoder_getInterface no error");
     } else {
         *pDecoderInterface = M4OSA_NULL;
-        LOGV("VideoEditorAudioDecoder_getInterface ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioDecoder_getInterface ERROR 0x%X", err);
     }
-    LOGV("VideoEditorAudioDecoder_getInterface end");
+    ALOGV("VideoEditorAudioDecoder_getInterface end");
     return err;
 }
 
@@ -960,14 +960,14 @@
 
 M4OSA_ERR VideoEditorAudioDecoder_getInterface_AAC(M4AD_Type* pDecoderType,
         M4AD_Interface** pDecoderInterface) {
-    LOGV("TEST: AAC VideoEditorAudioDecoder_getInterface no error");
+    ALOGV("TEST: AAC VideoEditorAudioDecoder_getInterface no error");
     return VideoEditorAudioDecoder_getInterface(
         M4AD_kTypeAAC, pDecoderType, pDecoderInterface);
 }
 
 M4OSA_ERR VideoEditorAudioDecoder_getInterface_AMRNB(M4AD_Type* pDecoderType,
         M4AD_Interface** pDecoderInterface) {
-    LOGV("TEST: AMR VideoEditorAudioDecoder_getInterface no error");
+    ALOGV("TEST: AMR VideoEditorAudioDecoder_getInterface no error");
     return VideoEditorAudioDecoder_getInterface(
         M4AD_kTypeAMRNB, pDecoderType, pDecoderInterface);
 }
diff --git a/libvideoeditor/vss/stagefrightshells/src/VideoEditorAudioEncoder.cpp b/libvideoeditor/vss/stagefrightshells/src/VideoEditorAudioEncoder.cpp
index 588428e..631177b 100755
--- a/libvideoeditor/vss/stagefrightshells/src/VideoEditorAudioEncoder.cpp
+++ b/libvideoeditor/vss/stagefrightshells/src/VideoEditorAudioEncoder.cpp
@@ -82,7 +82,7 @@
 sp<VideoEditorAudioEncoderSource> VideoEditorAudioEncoderSource::Create(
     const sp<MetaData> &format) {
 
-    LOGV("VideoEditorAudioEncoderSource::Create");
+    ALOGV("VideoEditorAudioEncoderSource::Create");
     sp<VideoEditorAudioEncoderSource> aSource =
         new VideoEditorAudioEncoderSource(format);
 
@@ -96,12 +96,12 @@
         mNbBuffer(0),
         mState(CREATED),
         mEncFormat(format) {
-    LOGV("VideoEditorAudioEncoderSource::VideoEditorAudioEncoderSource");
+    ALOGV("VideoEditorAudioEncoderSource::VideoEditorAudioEncoderSource");
 }
 
 
 VideoEditorAudioEncoderSource::~VideoEditorAudioEncoderSource() {
-    LOGV("VideoEditorAudioEncoderSource::~VideoEditorAudioEncoderSource");
+    ALOGV("VideoEditorAudioEncoderSource::~VideoEditorAudioEncoderSource");
 
     if( STARTED == mState ) {
         stop();
@@ -111,10 +111,10 @@
 status_t VideoEditorAudioEncoderSource::start(MetaData *meta) {
     status_t err = OK;
 
-    LOGV("VideoEditorAudioEncoderSource::start");
+    ALOGV("VideoEditorAudioEncoderSource::start");
 
     if( CREATED != mState ) {
-        LOGV("VideoEditorAudioEncoderSource::start ERROR : invalid state %d",
+        ALOGV("VideoEditorAudioEncoderSource::start ERROR : invalid state %d",
             mState);
         return UNKNOWN_ERROR;
     }
@@ -122,17 +122,17 @@
     mState = STARTED;
 
 cleanUp:
-    LOGV("VideoEditorAudioEncoderSource::start END (0x%x)", err);
+    ALOGV("VideoEditorAudioEncoderSource::start END (0x%x)", err);
     return err;
 }
 
 status_t VideoEditorAudioEncoderSource::stop() {
     status_t err = OK;
 
-    LOGV("VideoEditorAudioEncoderSource::stop");
+    ALOGV("VideoEditorAudioEncoderSource::stop");
 
     if( STARTED != mState ) {
-        LOGV("VideoEditorAudioEncoderSource::stop ERROR: invalid state %d",
+        ALOGV("VideoEditorAudioEncoderSource::stop ERROR: invalid state %d",
             mState);
         return UNKNOWN_ERROR;
     }
@@ -145,18 +145,18 @@
         mFirstBufferLink = mFirstBufferLink->nextLink;
         delete tmpLink;
     }
-    LOGV("VideoEditorAudioEncoderSource::stop : %d buffer remained", i);
+    ALOGV("VideoEditorAudioEncoderSource::stop : %d buffer remained", i);
     mFirstBufferLink = NULL;
     mLastBufferLink = NULL;
 
     mState = CREATED;
 
-    LOGV("VideoEditorAudioEncoderSource::stop END (0x%x)", err);
+    ALOGV("VideoEditorAudioEncoderSource::stop END (0x%x)", err);
     return err;
 }
 
 sp<MetaData> VideoEditorAudioEncoderSource::getFormat() {
-    LOGV("VideoEditorAudioEncoderSource::getFormat");
+    ALOGV("VideoEditorAudioEncoderSource::getFormat");
     return mEncFormat;
 }
 
@@ -166,17 +166,17 @@
     status_t err = OK;
     MediaBufferChain* tmpLink = NULL;
 
-    LOGV("VideoEditorAudioEncoderSource::read");
+    ALOGV("VideoEditorAudioEncoderSource::read");
 
     if ( STARTED != mState ) {
-        LOGV("VideoEditorAudioEncoderSource::read ERROR : invalid state %d",
+        ALOGV("VideoEditorAudioEncoderSource::read ERROR : invalid state %d",
             mState);
         return UNKNOWN_ERROR;
     }
 
     if( NULL == mFirstBufferLink ) {
         *buffer = NULL;
-        LOGV("VideoEditorAudioEncoderSource::read : EOS");
+        ALOGV("VideoEditorAudioEncoderSource::read : EOS");
         return ERROR_END_OF_STREAM;
     }
     *buffer = mFirstBufferLink->buffer;
@@ -189,14 +189,14 @@
     delete tmpLink;
     mNbBuffer--;
 
-    LOGV("VideoEditorAudioEncoderSource::read END (0x%x)", err);
+    ALOGV("VideoEditorAudioEncoderSource::read END (0x%x)", err);
     return err;
 }
 
 int32_t VideoEditorAudioEncoderSource::storeBuffer(MediaBuffer *buffer) {
     status_t err = OK;
 
-    LOGV("VideoEditorAudioEncoderSource::storeBuffer");
+    ALOGV("VideoEditorAudioEncoderSource::storeBuffer");
 
     MediaBufferChain* newLink = new MediaBufferChain;
     newLink->buffer = buffer;
@@ -209,7 +209,7 @@
     mLastBufferLink = newLink;
     mNbBuffer++;
 
-    LOGV("VideoEditorAudioEncoderSource::storeBuffer END");
+    ALOGV("VideoEditorAudioEncoderSource::storeBuffer END");
     return mNbBuffer;
 }
 
@@ -241,7 +241,7 @@
     M4OSA_ERR err = M4NO_ERROR;
     VideoEditorAudioEncoder_Context* pEncoderContext = M4OSA_NULL;
 
-    LOGV("VideoEditorAudioEncoder_cleanup begin");
+    ALOGV("VideoEditorAudioEncoder_cleanup begin");
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
     pEncoderContext = (VideoEditorAudioEncoder_Context*)pContext;
 
@@ -251,11 +251,11 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioEncoder_cleanup no error");
+        ALOGV("VideoEditorAudioEncoder_cleanup no error");
     } else {
-        LOGV("VideoEditorAudioEncoder_cleanup ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioEncoder_cleanup ERROR 0x%X", err);
     }
-    LOGV("VideoEditorAudioEncoder_cleanup end");
+    ALOGV("VideoEditorAudioEncoder_cleanup end");
     return err;
 }
 
@@ -265,7 +265,7 @@
     M4OSA_ERR err = M4NO_ERROR;
     VideoEditorAudioEncoder_Context* pEncoderContext = M4OSA_NULL;
 
-    LOGV(" VideoEditorAudioEncoder_init begin: format %d", format);
+    ALOGV(" VideoEditorAudioEncoder_init begin: format %d", format);
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
 
     SAFE_MALLOC(pEncoderContext, VideoEditorAudioEncoder_Context, 1,
@@ -276,13 +276,13 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioEncoder_init no error");
+        ALOGV("VideoEditorAudioEncoder_init no error");
     } else {
         VideoEditorAudioEncoder_cleanup(pEncoderContext);
         *pContext = M4OSA_NULL;
-        LOGV("VideoEditorAudioEncoder_init ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioEncoder_init ERROR 0x%X", err);
     }
-    LOGV("VideoEditorAudioEncoder_init end");
+    ALOGV("VideoEditorAudioEncoder_init end");
     return err;
 }
 
@@ -306,7 +306,7 @@
     M4OSA_ERR err = M4NO_ERROR;
     VideoEditorAudioEncoder_Context* pEncoderContext = M4OSA_NULL;
 
-    LOGV("VideoEditorAudioEncoder_close begin");
+    ALOGV("VideoEditorAudioEncoder_close begin");
 
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
     pEncoderContext = (VideoEditorAudioEncoder_Context*)pContext;
@@ -318,23 +318,23 @@
     pEncoderContext->mClient.disconnect();
     pEncoderContext->mEncoderSource.clear();
 
-    LOGV("AudioEncoder_close:IN %d frames,OUT %d frames from %lld to %lld",
+    ALOGV("AudioEncoder_close:IN %d frames,OUT %d frames from %lld to %lld",
         pEncoderContext->mNbInputFrames,
         pEncoderContext->mNbOutputFrames, pEncoderContext->mFirstOutputCts,
         pEncoderContext->mLastOutputCts);
 
     if( pEncoderContext->mNbInputFrames != pEncoderContext->mNbInputFrames ) {
-        LOGV("VideoEditorAudioEncoder_close:some frames were not encoded %d %d",
+        ALOGV("VideoEditorAudioEncoder_close:some frames were not encoded %d %d",
             pEncoderContext->mNbInputFrames, pEncoderContext->mNbInputFrames);
     }
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioEncoder_close no error");
+        ALOGV("VideoEditorAudioEncoder_close no error");
     } else {
-        LOGV("VideoEditorAudioEncoder_close ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioEncoder_close ERROR 0x%X", err);
     }
-    LOGV("VideoEditorAudioEncoder_close begin end");
+    ALOGV("VideoEditorAudioEncoder_close begin end");
     return err;
 }
 
@@ -350,7 +350,7 @@
     int32_t iNbChannel = 0;
     uint32_t codecFlags = 0;
 
-    LOGV("VideoEditorAudioEncoder_open begin");
+    ALOGV("VideoEditorAudioEncoder_open begin");
 
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(M4OSA_NULL != pParams,  M4ERR_PARAMETER);
@@ -366,7 +366,7 @@
     pEncoderContext->mLastOutputCts  = -1;
 
     // Allocate & initialize the encoding parameters
-    LOGV("VideoEditorAudioEncoder_open : params F=%d CN=%d BR=%d F=%d",
+    ALOGV("VideoEditorAudioEncoder_open : params F=%d CN=%d BR=%d F=%d",
         pParams->Frequency, pParams->ChannelNum, pParams->Bitrate,
         pParams->Format);
     SAFE_MALLOC(pEncoderContext->mCodecParams, M4ENCODER_AudioParams, 1,
@@ -475,16 +475,16 @@
         buffer->release();
         *pDSI = pEncoderContext->mDSI;
     }
-    LOGV("VideoEditorAudioEncoder_open : DONE");
+    ALOGV("VideoEditorAudioEncoder_open : DONE");
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioEncoder_open no error");
+        ALOGV("VideoEditorAudioEncoder_open no error");
     } else {
         VideoEditorAudioEncoder_close(pEncoderContext);
-        LOGV("VideoEditorAudioEncoder_open ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioEncoder_open ERROR 0x%X", err);
     }
-    LOGV("VideoEditorAudioEncoder_open end");
+    ALOGV("VideoEditorAudioEncoder_open end");
     return err;
 }
 
@@ -497,7 +497,7 @@
     MediaBuffer* buffer = NULL;
     int32_t nbBuffer = 0;
 
-    LOGV("VideoEditorAudioEncoder_processInputBuffer begin");
+    ALOGV("VideoEditorAudioEncoder_processInputBuffer begin");
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
 
     pEncoderContext = (VideoEditorAudioEncoder_Context*)pContext;
@@ -512,27 +512,27 @@
                 pInBuffer->pTableBufferSize[0]);
             break;
         default:
-            LOGV("VEAE_processInputBuffer unsupported channel configuration %d",
+            ALOGV("VEAE_processInputBuffer unsupported channel configuration %d",
                 pEncoderContext->mCodecParams->ChannelNum);
             VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_PARAMETER);
             break;
     }
 
-    LOGV("VideoEditorAudioEncoder_processInputBuffer : store %d bytes",
+    ALOGV("VideoEditorAudioEncoder_processInputBuffer : store %d bytes",
         buffer->range_length());
     // Push the buffer to the source
     nbBuffer = pEncoderContext->mEncoderSource->storeBuffer(buffer);
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioEncoder_processInputBuffer no error");
+        ALOGV("VideoEditorAudioEncoder_processInputBuffer no error");
     } else {
         if( NULL != buffer ) {
             buffer->release();
         }
-        LOGV("VideoEditorAudioEncoder_processInputBuffer ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioEncoder_processInputBuffer ERROR 0x%X", err);
     }
-    LOGV("VideoEditorAudioEncoder_processInputBuffer end");
+    ALOGV("VideoEditorAudioEncoder_processInputBuffer end");
     return err;
 }
 
@@ -546,7 +546,7 @@
     int64_t i64Tmp = 0;
     status_t result = OK;
 
-    LOGV("VideoEditorAudioEncoder_processOutputBuffer begin");
+    ALOGV("VideoEditorAudioEncoder_processOutputBuffer begin");
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext,   M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(M4OSA_NULL != buffer,     M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(M4OSA_NULL != pOutBuffer, M4ERR_PARAMETER);
@@ -556,7 +556,7 @@
     // Process the returned AU
     if( 0 == buffer->range_length() ) {
         // Encoder has no data yet, nothing unusual
-        LOGV("VideoEditorAudioEncoder_processOutputBuffer : buffer is empty");
+        ALOGV("VideoEditorAudioEncoder_processOutputBuffer : buffer is empty");
         pOutBuffer->pTableBufferSize[0] = 0;
         goto cleanUp;
     }
@@ -587,11 +587,11 @@
     // Release the buffer
     buffer->release();
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioEncoder_processOutputBuffer no error");
+        ALOGV("VideoEditorAudioEncoder_processOutputBuffer no error");
     } else {
-        LOGV("VideoEditorAudioEncoder_processOutputBuffer ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioEncoder_processOutputBuffer ERROR 0x%X", err);
     }
-    LOGV("VideoEditorAudioEncoder_processOutputBuffer end");
+    ALOGV("VideoEditorAudioEncoder_processOutputBuffer end");
     return err;
 }
 
@@ -602,7 +602,7 @@
     status_t result = OK;
     MediaBuffer* buffer = NULL;
 
-    LOGV("VideoEditorAudioEncoder_step begin");
+    ALOGV("VideoEditorAudioEncoder_step begin");
 
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext,   M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(M4OSA_NULL != pInBuffer,  M4ERR_PARAMETER);
@@ -626,11 +626,11 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioEncoder_step no error");
+        ALOGV("VideoEditorAudioEncoder_step no error");
     } else {
-        LOGV("VideoEditorAudioEncoder_step ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioEncoder_step ERROR 0x%X", err);
     }
-    LOGV("VideoEditorAudioEncoder_step end");
+    ALOGV("VideoEditorAudioEncoder_step end");
     return err;
 }
 
@@ -639,14 +639,14 @@
     M4OSA_ERR err = M4NO_ERROR;
     VideoEditorAudioEncoder_Context* pEncoderContext = M4OSA_NULL;
 
-    LOGV("VideoEditorAudioEncoder_getOption begin optionID 0x%X", optionID);
+    ALOGV("VideoEditorAudioEncoder_getOption begin optionID 0x%X", optionID);
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
 
     pEncoderContext = (VideoEditorAudioEncoder_Context*)pContext;
 
     switch( optionID ) {
         default:
-            LOGV("VideoEditorAudioEncoder_getOption: unsupported optionId 0x%X",
+            ALOGV("VideoEditorAudioEncoder_getOption: unsupported optionId 0x%X",
                 optionID);
             VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_BAD_OPTION_ID);
             break;
@@ -654,11 +654,11 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioEncoder_getOption no error");
+        ALOGV("VideoEditorAudioEncoder_getOption no error");
     } else {
-        LOGV("VideoEditorAudioEncoder_getOption ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioEncoder_getOption ERROR 0x%X", err);
     }
-    LOGV("VideoEditorAudioEncoder_getOption end");
+    ALOGV("VideoEditorAudioEncoder_getOption end");
     return err;
 }
 
@@ -671,7 +671,7 @@
     VIDEOEDITOR_CHECK(M4OSA_NULL != pFormat,           M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(M4OSA_NULL != pEncoderInterface, M4ERR_PARAMETER);
 
-    LOGV("VideoEditorAudioEncoder_getInterface 0x%x 0x%x",pFormat,
+    ALOGV("VideoEditorAudioEncoder_getInterface 0x%x 0x%x",pFormat,
         pEncoderInterface);
     SAFE_MALLOC(*pEncoderInterface, M4ENCODER_AudioGlobalInterface, 1,
         "AudioEncoder");
@@ -696,7 +696,7 @@
         }
         default:
         {
-            LOGV("VideoEditorAudioEncoder_getInterface: unsupported format %d",
+            ALOGV("VideoEditorAudioEncoder_getInterface: unsupported format %d",
                 format);
             VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_PARAMETER);
         break;
@@ -710,10 +710,10 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorAudioEncoder_getInterface no error");
+        ALOGV("VideoEditorAudioEncoder_getInterface no error");
     } else {
         *pEncoderInterface = M4OSA_NULL;
-        LOGV("VideoEditorAudioEncoder_getInterface ERROR 0x%X", err);
+        ALOGV("VideoEditorAudioEncoder_getInterface ERROR 0x%X", err);
     }
     return err;
 }
@@ -737,7 +737,7 @@
 M4OSA_ERR VideoEditorAudioEncoder_getInterface_MP3(
         M4ENCODER_AudioFormat* pFormat,
         M4ENCODER_AudioGlobalInterface** pEncoderInterface) {
-    LOGV("VideoEditorAudioEncoder_getInterface_MP3 no error");
+    ALOGV("VideoEditorAudioEncoder_getInterface_MP3 no error");
 
     return VideoEditorAudioEncoder_getInterface(
         M4ENCODER_kMP3, pFormat, pEncoderInterface);
diff --git a/libvideoeditor/vss/stagefrightshells/src/VideoEditorBuffer.c b/libvideoeditor/vss/stagefrightshells/src/VideoEditorBuffer.c
index edd1e7c..98919d2 100755
--- a/libvideoeditor/vss/stagefrightshells/src/VideoEditorBuffer.c
+++ b/libvideoeditor/vss/stagefrightshells/src/VideoEditorBuffer.c
@@ -54,7 +54,7 @@
     M4OSA_ERR lerr = M4NO_ERROR;
     VIDEOEDITOR_BUFFER_Pool* pool;
 
-    LOGV("VIDEOEDITOR_BUFFER_allocatePool : ppool = 0x%x nbBuffers = %d ",
+    ALOGV("VIDEOEDITOR_BUFFER_allocatePool : ppool = 0x%x nbBuffers = %d ",
         ppool, nbBuffers);
 
     pool = M4OSA_NULL;
@@ -67,7 +67,7 @@
         goto VIDEOEDITOR_BUFFER_allocatePool_Cleanup;
     }
 
-    LOGV("VIDEOEDITOR_BUFFER_allocatePool : Allocating Pool buffers");
+    ALOGV("VIDEOEDITOR_BUFFER_allocatePool : Allocating Pool buffers");
     pool->pNXPBuffer = M4OSA_NULL;
     pool->pNXPBuffer = (VIDEOEDITOR_BUFFER_Buffer*)M4OSA_32bitAlignedMalloc(
                             sizeof(VIDEOEDITOR_BUFFER_Buffer)*nbBuffers,
@@ -79,7 +79,7 @@
         goto VIDEOEDITOR_BUFFER_allocatePool_Cleanup;
     }
 
-    LOGV("VIDEOEDITOR_BUFFER_allocatePool : Allocating Pool name buffer");
+    ALOGV("VIDEOEDITOR_BUFFER_allocatePool : Allocating Pool name buffer");
     pool->poolName = M4OSA_NULL;
     pool->poolName = (M4OSA_Char*)M4OSA_32bitAlignedMalloc(
         VIDEOEDITOR_BUFFEPOOL_MAX_NAME_SIZE,VIDEOEDITOR_BUFFER_EXTERNAL,
@@ -90,7 +90,7 @@
         goto VIDEOEDITOR_BUFFER_allocatePool_Cleanup;
     }
 
-    LOGV("VIDEOEDITOR_BUFFER_allocatePool : Assigning Pool name buffer");
+    ALOGV("VIDEOEDITOR_BUFFER_allocatePool : Assigning Pool name buffer");
 
     memset((void *)pool->poolName, 0,VIDEOEDITOR_BUFFEPOOL_MAX_NAME_SIZE);
     memcpy((void *)pool->poolName, (void *)poolName,
@@ -106,7 +106,7 @@
         VIDEOEDITOR_SAFE_FREE(pool);
     }
     *ppool = pool;
-    LOGV("VIDEOEDITOR_BUFFER_allocatePool END");
+    ALOGV("VIDEOEDITOR_BUFFER_allocatePool END");
 
     return lerr;
 }
@@ -125,7 +125,7 @@
     M4OSA_ERR err;
     M4OSA_UInt32  j = 0;
 
-    LOGV("VIDEOEDITOR_BUFFER_freePool : ppool = 0x%x", ppool);
+    ALOGV("VIDEOEDITOR_BUFFER_freePool : ppool = 0x%x", ppool);
 
     err = M4NO_ERROR;
 
@@ -168,7 +168,7 @@
     M4OSA_Bool bFound = M4OSA_FALSE;
     M4OSA_UInt32 i, ibuf;
 
-    LOGV("VIDEOEDITOR_BUFFER_getBuffer from %s in state=%d",
+    ALOGV("VIDEOEDITOR_BUFFER_getBuffer from %s in state=%d",
         ppool->poolName, desiredState);
 
     ibuf = 0;
@@ -185,7 +185,7 @@
 
     if(!bFound)
     {
-        LOGV("VIDEOEDITOR_BUFFER_getBuffer No buffer available in state %d",
+        ALOGV("VIDEOEDITOR_BUFFER_getBuffer No buffer available in state %d",
             desiredState);
         *pNXPBuffer = M4OSA_NULL;
         return M4ERR_NO_BUFFER_AVAILABLE;
@@ -194,7 +194,7 @@
     /* case where a buffer has been found */
     *pNXPBuffer = &(ppool->pNXPBuffer[ibuf]);
 
-    LOGV("VIDEOEDITOR_BUFFER_getBuffer: idx = %d", ibuf);
+    ALOGV("VIDEOEDITOR_BUFFER_getBuffer: idx = %d", ibuf);
 
     return(err);
 }
@@ -258,7 +258,7 @@
     }
     if(M4OSA_FALSE == bFound)
     {
-        LOGV("VIDEOEDITOR_BUFFER_getOldestBuffer WARNING no buffer available");
+        ALOGV("VIDEOEDITOR_BUFFER_getOldestBuffer WARNING no buffer available");
         err = M4ERR_NO_BUFFER_AVAILABLE;
     }
     return err;
diff --git a/libvideoeditor/vss/stagefrightshells/src/VideoEditorMp3Reader.cpp b/libvideoeditor/vss/stagefrightshells/src/VideoEditorMp3Reader.cpp
index e9e23a3..153d732 100755
--- a/libvideoeditor/vss/stagefrightshells/src/VideoEditorMp3Reader.cpp
+++ b/libvideoeditor/vss/stagefrightshells/src/VideoEditorMp3Reader.cpp
@@ -88,7 +88,7 @@
 
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
 
-    LOGV("VideoEditorMp3Reader_create begin");
+    ALOGV("VideoEditorMp3Reader_create begin");
 
     /* Context allocation & initialization */
     SAFE_MALLOC(pReaderContext, VideoEditorMp3Reader_Context, 1,
@@ -101,11 +101,11 @@
 
 cleanUp:
     if (M4NO_ERROR == err) {
-        LOGV("VideoEditorMp3Reader_create no error");
+        ALOGV("VideoEditorMp3Reader_create no error");
     } else {
-        LOGV("VideoEditorMp3Reader_create ERROR 0x%X", err);
+        ALOGV("VideoEditorMp3Reader_create ERROR 0x%X", err);
     }
-    LOGV("VideoEditorMp3Reader_create end");
+    ALOGV("VideoEditorMp3Reader_create end");
     return err;
 }
 
@@ -124,16 +124,16 @@
         (VideoEditorMp3Reader_Context*)pContext;
 
     VIDEOEDITOR_CHECK(M4OSA_NULL != pReaderContext, M4ERR_PARAMETER);
-    LOGV("VideoEditorMp3Reader_destroy begin");
+    ALOGV("VideoEditorMp3Reader_destroy begin");
 
     SAFE_FREE(pReaderContext);
 cleanUp:
     if (M4NO_ERROR == err) {
-        LOGV("VideoEditorMp3Reader_destroy no error");
+        ALOGV("VideoEditorMp3Reader_destroy no error");
     } else {
-        LOGV("VideoEditorMp3Reader_destroy ERROR 0x%X", err);
+        ALOGV("VideoEditorMp3Reader_destroy ERROR 0x%X", err);
     }
-    LOGV("VideoEditorMp3Reader_destroy end");
+    ALOGV("VideoEditorMp3Reader_destroy end");
     return err;
 }
 /**
@@ -156,30 +156,30 @@
     (VideoEditorMp3Reader_Context*)context;
     M4OSA_ERR err = M4NO_ERROR;
 
-    LOGV("VideoEditorMp3Reader_open begin");
+    ALOGV("VideoEditorMp3Reader_open begin");
     /* Check function parameters*/
     M4OSA_DEBUG_IF1((M4OSA_NULL == pReaderContext),  M4ERR_PARAMETER,
         "VideoEditorMp3Reader_open: invalid context pointer");
     M4OSA_DEBUG_IF1((M4OSA_NULL == pFileDescriptor), M4ERR_PARAMETER,
         "VideoEditorMp3Reader_open: invalid pointer pFileDescriptor");
 
-    LOGV("VideoEditorMp3Reader_open Datasource start %s",
+    ALOGV("VideoEditorMp3Reader_open Datasource start %s",
         (char*)pFileDescriptor);
     pReaderContext->mDataSource = new FileSource ((char*)pFileDescriptor);
-    LOGV("VideoEditorMp3Reader_open Datasource end");
+    ALOGV("VideoEditorMp3Reader_open Datasource end");
 
     if (pReaderContext->mDataSource == NULL) {
-        LOGV("VideoEditorMp3Reader_open Datasource error");
+        ALOGV("VideoEditorMp3Reader_open Datasource error");
         return UNKNOWN_ERROR;
     }
 
-    LOGV("VideoEditorMp3Reader_open extractor start");
+    ALOGV("VideoEditorMp3Reader_open extractor start");
     pReaderContext->mExtractor = MediaExtractor::Create(
         pReaderContext->mDataSource,MEDIA_MIMETYPE_AUDIO_MPEG);
-    LOGV("VideoEditorMp3Reader_open extractor end");
+    ALOGV("VideoEditorMp3Reader_open extractor end");
 
     if (pReaderContext->mExtractor == NULL)    {
-        LOGV("VideoEditorMp3Reader_open extractor error");
+        ALOGV("VideoEditorMp3Reader_open extractor error");
         return UNKNOWN_ERROR;
     }
     pReaderContext->mStreamNumber = 0;
@@ -188,11 +188,11 @@
     sp<MetaData> meta = pReaderContext->mExtractor->getMetaData();
     meta->findInt32(kKeyIsDRM, &isDRMProtected);
     if (isDRMProtected) {
-        LOGV("VideoEditorMp3Reader_open error - DRM Protected");
+        ALOGV("VideoEditorMp3Reader_open error - DRM Protected");
         return M4ERR_UNSUPPORTED_MEDIA_TYPE;
     }
 
-    LOGV("VideoEditorMp3Reader_open end");
+    ALOGV("VideoEditorMp3Reader_open end");
     return err;
 }
 /**
@@ -209,7 +209,7 @@
         (VideoEditorMp3Reader_Context*)context;
     M4OSA_ERR err = M4NO_ERROR;
 
-    LOGV("VideoEditorMp3Reader_close begin");
+    ALOGV("VideoEditorMp3Reader_close begin");
     /* Check function parameters */
     M4OSA_DEBUG_IF1((M4OSA_NULL == pReaderContext), M4ERR_PARAMETER,
             "VideoEditorMp3Reader_close: invalid context pointer");
@@ -240,7 +240,7 @@
     pReaderContext->mExtractor.clear();
     pReaderContext->mDataSource.clear();
 
-    LOGV("VideoEditorMp3Reader_close end ");
+    ALOGV("VideoEditorMp3Reader_close end ");
     return err;
 }
 /**
@@ -265,7 +265,7 @@
         (VideoEditorMp3Reader_Context*)context;
     M4OSA_ERR err = M4NO_ERROR;
 
-    LOGV("VideoEditorMp3Reader_getOption begin: optionId= %d ",(int)optionId);
+    ALOGV("VideoEditorMp3Reader_getOption begin: optionId= %d ",(int)optionId);
 
     M4OSA_DEBUG_IF1((M4OSA_NULL == pReaderContext), M4ERR_PARAMETER,
         "invalid value pointer");
@@ -275,7 +275,7 @@
     switch(optionId) {
     case M4READER_kOptionID_Duration:
         {
-            LOGV("Mp3Reader duration=%ld",pReaderContext->mMaxDuration);
+            ALOGV("Mp3Reader duration=%ld",pReaderContext->mMaxDuration);
             *(M4OSA_Time*)pValue = pReaderContext->mMaxDuration;
         }
         break;
@@ -304,11 +304,11 @@
 
     default :
         {
-            LOGV("VideoEditorMp3Reader_getOption:  M4ERR_BAD_OPTION_ID");
+            ALOGV("VideoEditorMp3Reader_getOption:  M4ERR_BAD_OPTION_ID");
             err = M4ERR_BAD_OPTION_ID;
         }
     }
-    LOGV("VideoEditorMp3Reader_getOption end ");
+    ALOGV("VideoEditorMp3Reader_getOption end ");
     return err;
 }
 /**
@@ -334,7 +334,7 @@
         (VideoEditorMp3Reader_Context*)context;
     M4OSA_ERR err = M4NO_ERROR;
 
-    LOGV("VideoEditorMp3Reader_Context begin: optionId: %d Value: %d ",
+    ALOGV("VideoEditorMp3Reader_Context begin: optionId: %d Value: %d ",
         (int)optionId,(int)pValue);
 
     M4OSA_DEBUG_IF1((M4OSA_NULL == pReaderContext), M4ERR_PARAMETER,
@@ -349,7 +349,7 @@
             err = M4NO_ERROR;
         }
     }
-    LOGV("VideoEditorMp3Reader_Context end ");
+    ALOGV("VideoEditorMp3Reader_Context end ");
     return err;
 }
 /**
@@ -373,7 +373,7 @@
     M4SYS_AccessUnit* pAu;
     M4OSA_Time time64 = (M4OSA_Time)*pTime;
 
-    LOGV("VideoEditorMp3Reader_jump begin");
+    ALOGV("VideoEditorMp3Reader_jump begin");
     M4OSA_DEBUG_IF1((pReaderContext == 0), M4ERR_PARAMETER,
         "VideoEditorMp3Reader_jump: invalid context");
     M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
@@ -385,27 +385,27 @@
         mAudioStreamHandler){
         pAu = &pReaderContext->mAudioAu;
     } else {
-        LOGV("VideoEditorMp3Reader_jump: passed StreamHandler is not known");
+        ALOGV("VideoEditorMp3Reader_jump: passed StreamHandler is not known");
         return M4ERR_PARAMETER;
     }
 
     streamIdArray[0] = pStreamHandler->m_streamId;
     streamIdArray[1] = 0;
 
-    LOGV("VideoEditorMp3Reader_jump time ms %ld ", time64);
+    ALOGV("VideoEditorMp3Reader_jump time ms %ld ", time64);
 
     pAu->CTS = time64;
     pAu->DTS = time64;
 
     time64 = time64 * 1000; /* Convert the time into micro sec */
-    LOGV("VideoEditorMp3Reader_jump time us %ld ", time64);
+    ALOGV("VideoEditorMp3Reader_jump time us %ld ", time64);
 
     pReaderContext->mSeeking = M4OSA_TRUE;
     pReaderContext->mSeekTime = time64;
 
     time64 = time64 / 1000; /* Convert the time into milli sec */
     *pTime = (M4OSA_Int32)time64;
-    LOGV("VideoEditorMp3Reader_jump end ");
+    ALOGV("VideoEditorMp3Reader_jump end ");
     return err;
 }
 /**
@@ -439,7 +439,7 @@
     sp<MetaData> meta = NULL;
     int64_t Duration;
 
-    LOGV("VideoEditorMp3Reader_getNextStream begin");
+    ALOGV("VideoEditorMp3Reader_getNextStream begin");
     M4OSA_DEBUG_IF1((pReaderContext == 0),      M4ERR_PARAMETER,
         "VideoEditorMp3Reader_getNextStream: invalid context");
     M4OSA_DEBUG_IF1((pMediaFamily == 0),        M4ERR_PARAMETER,
@@ -447,14 +447,14 @@
     M4OSA_DEBUG_IF1((pStreamHandlerParam == 0), M4ERR_PARAMETER,
         "VideoEditorMp3Reader_getNextStream: invalid pointer to StreamHandler");
 
-    LOGV("VideoEditorMp3Reader_getNextStream stream number = %d",
+    ALOGV("VideoEditorMp3Reader_getNextStream stream number = %d",
         pReaderContext->mStreamNumber);
     if (pReaderContext->mStreamNumber >= 1) {
-        LOGV("VideoEditorMp3Reader_getNextStream max number of stream reached");
+        ALOGV("VideoEditorMp3Reader_getNextStream max number of stream reached");
         return M4WAR_NO_MORE_STREAM;
     }
     pReaderContext->mStreamNumber = pReaderContext->mStreamNumber + 1;
-    LOGV("VideoEditorMp3Reader_getNextStream number of Tracks%d",
+    ALOGV("VideoEditorMp3Reader_getNextStream number of Tracks%d",
         pReaderContext->mExtractor->countTracks());
     for (temp = 0; temp < pReaderContext->mExtractor->countTracks(); temp++) {
         meta = pReaderContext->mExtractor->getTrackMetaData(temp);
@@ -474,7 +474,7 @@
     }
 
     if (!haveAudio) {
-        LOGV("VideoEditorMp3Reader_getNextStream no more stream ");
+        ALOGV("VideoEditorMp3Reader_getNextStream no more stream ");
         pReaderContext->mDataSource.clear();
         return M4WAR_NO_MORE_STREAM;
     }
@@ -487,7 +487,7 @@
 
     meta->findInt32(kKeyBitRate, (int32_t*)&streamDesc.averageBitrate);
     meta->findInt32(kKeySampleRate, (int32_t*)&streamDesc.timeScale);
-    LOGV("Bitrate = %d, SampleRate = %d duration = %lld",
+    ALOGV("Bitrate = %d, SampleRate = %d duration = %lld",
         streamDesc.averageBitrate,streamDesc.timeScale,Duration/1000);
 
     streamDesc.streamType = M4SYS_kMP3;
@@ -503,7 +503,7 @@
         (M4OSA_Char*)"M4_AudioStreamHandler");
 
     if (pAudioStreamHandler == M4OSA_NULL) {
-        LOGV("VideoEditorMp3Reader_getNextStream malloc failed");
+        ALOGV("VideoEditorMp3Reader_getNextStream malloc failed");
         pReaderContext->mMediaSource->stop();
         pReaderContext->mMediaSource.clear();
         pReaderContext->mDataSource.clear();
@@ -517,7 +517,7 @@
     pAudioStreamHandler->m_structSize = sizeof(M4_AudioStreamHandler);
 
     if (meta == NULL) {
-        LOGV("VideoEditorMp3Reader_getNextStream meta is NULL");
+        ALOGV("VideoEditorMp3Reader_getNextStream meta is NULL");
     }
 
     pAudioStreamHandler->m_samplingFrequency = streamDesc.timeScale;
@@ -540,7 +540,7 @@
     pStreamHandler->m_maxAUSize = 0;
     pStreamHandler->m_streamType = M4DA_StreamTypeAudioMp3;
 
-    LOGV("VideoEditorMp3Reader_getNextStream end ");
+    ALOGV("VideoEditorMp3Reader_getNextStream end ");
     return err;
 }
 
@@ -569,12 +569,12 @@
     M4OSA_DEBUG_IF1((pAccessUnit == 0),    M4ERR_PARAMETER,
         "VideoEditorMp3Reader_fillAuStruct: invalid pointer to M4_AccessUnit");
 
-    LOGV("VideoEditorMp3Reader_fillAuStruct start ");
+    ALOGV("VideoEditorMp3Reader_fillAuStruct start ");
     if(pStreamHandler == (M4_StreamHandler*)pReaderContext->\
         mAudioStreamHandler){
         pAu = &pReaderContext->mAudioAu;
     } else {
-        LOGV("VideoEditorMp3Reader_fillAuStruct StreamHandler is not known");
+        ALOGV("VideoEditorMp3Reader_fillAuStruct StreamHandler is not known");
         return M4ERR_PARAMETER;
     }
 
@@ -596,7 +596,7 @@
     pAccessUnit->m_streamID     = pStreamHandler->m_streamId;
     pAccessUnit->m_structSize   = sizeof(M4_AccessUnit);
 
-    LOGV("VideoEditorMp3Reader_fillAuStruct end");
+    ALOGV("VideoEditorMp3Reader_fillAuStruct end");
     return M4NO_ERROR;
 }
 
@@ -620,7 +620,7 @@
     M4SYS_AccessUnit* pAu;
     M4OSA_Time time64 = 0;
 
-    LOGV("VideoEditorMp3Reader_reset start");
+    ALOGV("VideoEditorMp3Reader_reset start");
     M4OSA_DEBUG_IF1((pReaderContext == 0), M4ERR_PARAMETER,
         "VideoEditorMp3Reader_reset: invalid context");
     M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
@@ -630,7 +630,7 @@
         mAudioStreamHandler) {
         pAu = &pReaderContext->mAudioAu;
     } else {
-        LOGV("VideoEditorMp3Reader_reset StreamHandler is not known");
+        ALOGV("VideoEditorMp3Reader_reset StreamHandler is not known");
         return M4ERR_PARAMETER;
     }
     streamIdArray[0] = pStreamHandler->m_streamId;
@@ -641,7 +641,7 @@
     pReaderContext->mSeeking = M4OSA_TRUE;
     pReaderContext->mSeekTime = time64;
 
-    LOGV("VideoEditorMp3Reader_reset end");
+    ALOGV("VideoEditorMp3Reader_reset end");
     return err;
 }
 /**
@@ -667,7 +667,7 @@
     MediaBuffer *mAudioBuffer;
     MediaSource::ReadOptions options;
 
-    LOGV("VideoEditorMp3Reader_getNextAu start");
+    ALOGV("VideoEditorMp3Reader_getNextAu start");
     M4OSA_DEBUG_IF1((pReaderContext == 0), M4ERR_PARAMETER,
         "VideoEditorMp3Reader_getNextAu: invalid context");
     M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
@@ -679,7 +679,7 @@
         mAudioStreamHandler) {
         pAu = &pReaderContext->mAudioAu;
     } else {
-        LOGV("VideoEditorMp3Reader_getNextAu: StreamHandler is not known\n");
+        ALOGV("VideoEditorMp3Reader_getNextAu: StreamHandler is not known\n");
         return M4ERR_PARAMETER;
     }
 
@@ -701,7 +701,7 @@
                 M4READER_MP3, (M4OSA_Char*)"pAccessUnit->m_dataAddress" );
 
             if (pAu->dataAddress == NULL) {
-                LOGV("VideoEditorMp3Reader_getNextAu malloc failed");
+                ALOGV("VideoEditorMp3Reader_getNextAu malloc failed");
                 pReaderContext->mMediaSource->stop();
                 pReaderContext->mMediaSource.clear();
                 pReaderContext->mDataSource.clear();
@@ -722,7 +722,7 @@
         pAu->attribute = M4SYS_kFragAttrOk;
         mAudioBuffer->release();
 
-        LOGV("VideoEditorMp3Reader_getNextAu AU CTS = %ld",pAu->CTS);
+        ALOGV("VideoEditorMp3Reader_getNextAu AU CTS = %ld",pAu->CTS);
 
         pAccessUnit->m_dataAddress = (M4OSA_Int8*) pAu->dataAddress;
         pAccessUnit->m_size = pAu->size;
@@ -730,7 +730,7 @@
         pAccessUnit->m_DTS = pAu->DTS;
         pAccessUnit->m_attribute = pAu->attribute;
     } else {
-        LOGV("VideoEditorMp3Reader_getNextAu EOS reached.");
+        ALOGV("VideoEditorMp3Reader_getNextAu EOS reached.");
         pAccessUnit->m_size=0;
         err = M4WAR_NO_MORE_AU;
     }
@@ -739,7 +739,7 @@
     options.clearSeekTo();
     pReaderContext->mSeeking = M4OSA_FALSE;
     mAudioBuffer = NULL;
-    LOGV("VideoEditorMp3Reader_getNextAu end");
+    ALOGV("VideoEditorMp3Reader_getNextAu end");
 
     return err;
 }
@@ -752,7 +752,7 @@
         M4READER_DataInterface **pRdrDataInterface) {
     M4OSA_ERR err = M4NO_ERROR;
 
-    LOGV("VideoEditorMp3Reader_getInterface: begin");
+    ALOGV("VideoEditorMp3Reader_getInterface: begin");
     /* Input parameters check */
     VIDEOEDITOR_CHECK(M4OSA_NULL != pMediaType,      M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(M4OSA_NULL != pRdrGlobalInterface, M4ERR_PARAMETER);
@@ -787,16 +787,16 @@
 cleanUp:
     if( M4NO_ERROR == err )
     {
-        LOGV("VideoEditorMp3Reader_getInterface no error");
+        ALOGV("VideoEditorMp3Reader_getInterface no error");
     }
     else
     {
         SAFE_FREE(*pRdrGlobalInterface);
         SAFE_FREE(*pRdrDataInterface);
 
-        LOGV("VideoEditorMp3Reader_getInterface ERROR 0x%X", err);
+        ALOGV("VideoEditorMp3Reader_getInterface ERROR 0x%X", err);
     }
-    LOGV("VideoEditorMp3Reader_getInterface: end");
+    ALOGV("VideoEditorMp3Reader_getInterface: end");
     return err;
 }
 }  /* extern "C" */
diff --git a/libvideoeditor/vss/stagefrightshells/src/VideoEditorUtils.cpp b/libvideoeditor/vss/stagefrightshells/src/VideoEditorUtils.cpp
index 70d864b..4a67fe2 100755
--- a/libvideoeditor/vss/stagefrightshells/src/VideoEditorUtils.cpp
+++ b/libvideoeditor/vss/stagefrightshells/src/VideoEditorUtils.cpp
@@ -42,7 +42,7 @@
 /*---------------------*/
 #define LOG1 LOGE    /*ERRORS Logging*/
 #define LOG2 LOGI    /*WARNING Logging*/
-#define LOG3 //LOGV  /*COMMENTS Logging*/
+#define LOG3 //ALOGV  /*COMMENTS Logging*/
 
 namespace android {
 
@@ -250,7 +250,7 @@
             if (pC->mProfileIdc != data[1] ||
                 pC->mProfileCompatible != data[2] ||
                 pC->mLevelIdc != data[3]) {
-                LOGV("Inconsistent profile/level found in seq parameter sets");
+                ALOGV("Inconsistent profile/level found in seq parameter sets");
                 return NULL;
             }
         }
@@ -264,7 +264,7 @@
 status_t buildAVCCodecSpecificData(uint8_t **pOutputData, size_t *pOutputSize,
         const uint8_t *data, size_t size, MetaData *param)
 {
-    //LOGV("buildAVCCodecSpecificData");
+    //ALOGV("buildAVCCodecSpecificData");
 
     if ( (pOutputData == NULL) || (pOutputSize == NULL) ) {
         LOGE("output is invalid");
diff --git a/libvideoeditor/vss/stagefrightshells/src/VideoEditorVideoDecoder.cpp b/libvideoeditor/vss/stagefrightshells/src/VideoEditorVideoDecoder.cpp
index 0d5ea64..6a9c2da 100755
--- a/libvideoeditor/vss/stagefrightshells/src/VideoEditorVideoDecoder.cpp
+++ b/libvideoeditor/vss/stagefrightshells/src/VideoEditorVideoDecoder.cpp
@@ -124,7 +124,7 @@
             // FIXME:
             // Why do we need to check on the ref count?
             int ref_count = mBuffer->refcount();
-            LOGV("MediaBuffer refcount is %d",ref_count);
+            ALOGV("MediaBuffer refcount is %d",ref_count);
             for (int i = 0; i < ref_count; ++i) {
                 mBuffer->release();
             }
@@ -642,13 +642,13 @@
     VideoProfileLevel *pProfileLevel = NULL;
     pDecoder = decoders->decoder;
     for (size_t i = 0; i< decoders->decoderNumber; i++) {
-        LOGV("Supported Codec[%d] :%d", i, pDecoder->codec);
+        ALOGV("Supported Codec[%d] :%d", i, pDecoder->codec);
         pOmxComponents = pDecoder->component;
         for(size_t j = 0; j <  pDecoder->componentNumber; j++) {
            pProfileLevel = pOmxComponents->profileLevel;
-           LOGV("-->component %d", j);
+           ALOGV("-->component %d", j);
            for(size_t k = 0; k < pOmxComponents->profileNumber; k++) {
-               LOGV("-->profile:%ld maxLevel:%ld", pProfileLevel->mProfile,
+               ALOGV("-->profile:%ld maxLevel:%ld", pProfileLevel->mProfile,
                    pProfileLevel->mLevel);
                pProfileLevel++;
            }
@@ -691,17 +691,17 @@
             if (results.size()) {
                 SAFE_MALLOC(pOmxComponents, VideoComponentCapabilities,
                     results.size(), "VideoComponentCapabilities");
-                LOGV("K=%d",k);
+                ALOGV("K=%d",k);
                 pDecoder->component = pOmxComponents;
                 pDecoder->componentNumber = results.size();
             }
 
             for (size_t i = 0; i < results.size(); ++i) {
-                LOGV("  decoder '%s' supports ",
+                ALOGV("  decoder '%s' supports ",
                        results[i].mComponentName.string());
 
                 if (results[i].mProfileLevels.size() == 0) {
-                    LOGV("NOTHING.\n");
+                    ALOGV("NOTHING.\n");
                     continue;
                 }
 
@@ -710,7 +710,7 @@
                 // We should ignore the software codecs and make IsSoftwareCodec()
                 // part of pubic API from OMXCodec.cpp
                 if (IsSoftwareCodec(results[i].mComponentName.string())) {
-                    LOGV("Ignore software codec %s", results[i].mComponentName.string());
+                    ALOGV("Ignore software codec %s", results[i].mComponentName.string());
                     continue;
                 }
 #endif
@@ -744,7 +744,7 @@
                         maxLevel = profileLevel.mLevel;
                         pProfileLevel->mProfile = profile;
                         pProfileLevel->mLevel = maxLevel;
-                        LOGV("%d profile: %ld, max level: %ld",
+                        ALOGV("%d profile: %ld, max level: %ld",
                             __LINE__, pProfileLevel->mProfile, pProfileLevel->mLevel);
                     }
                     if (profileLevel.mProfile != profile) {
@@ -754,12 +754,12 @@
                         pProfileLevel++;
                         pProfileLevel->mProfile = profile;
                         pProfileLevel->mLevel = maxLevel;
-                        LOGV("%d profile: %ld, max level: %ld",
+                        ALOGV("%d profile: %ld, max level: %ld",
                             __LINE__, pProfileLevel->mProfile, pProfileLevel->mLevel);
                     } else if (profileLevel.mLevel > maxLevel) {
                         maxLevel = profileLevel.mLevel;
                         pProfileLevel->mLevel = maxLevel;
-                        LOGV("%d profile: %ld, max level: %ld",
+                        ALOGV("%d profile: %ld, max level: %ld",
                             __LINE__, pProfileLevel->mProfile, pProfileLevel->mLevel);
                     }
 
@@ -798,7 +798,7 @@
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(M4OSA_NULL != meta,     M4ERR_PARAMETER);
 
-    LOGV("VideoEditorVideoDecoder_configureFromMetadata begin");
+    ALOGV("VideoEditorVideoDecoder_configureFromMetadata begin");
 
     pDecShellContext = (VideoEditorVideoDecoder_Context*)pContext;
 
@@ -807,7 +807,7 @@
     success = meta->findInt32(kKeyHeight, &vHeight);
     VIDEOEDITOR_CHECK(TRUE == success, M4ERR_PARAMETER);
 
-    LOGV("vWidth = %d, vHeight = %d", vWidth, vHeight);
+    ALOGV("vWidth = %d, vHeight = %d", vWidth, vHeight);
 
     pDecShellContext->mGivenWidth = vWidth;
     pDecShellContext->mGivenHeight = vHeight;
@@ -819,9 +819,9 @@
         cropRight = vWidth - 1;
         cropBottom = vHeight - 1;
 
-        LOGV("got dimensions only %d x %d", width, height);
+        ALOGV("got dimensions only %d x %d", width, height);
     } else {
-        LOGV("got crop rect %d, %d, %d, %d",
+        ALOGV("got crop rect %d, %d, %d, %d",
              cropLeft, cropTop, cropRight, cropBottom);
     }
 
@@ -833,7 +833,7 @@
     width = cropRight - cropLeft + 1;
     height = cropBottom - cropTop + 1;
 
-    LOGV("VideoDecoder_configureFromMetadata : W=%d H=%d", width, height);
+    ALOGV("VideoDecoder_configureFromMetadata : W=%d H=%d", width, height);
     VIDEOEDITOR_CHECK((0 != width) && (0 != height), M4ERR_PARAMETER);
 
     if( (M4OSA_NULL != pDecShellContext->m_pDecBufferPool) &&
@@ -844,7 +844,7 @@
         // No need to reconfigure
         goto cleanUp;
     }
-    LOGV("VideoDecoder_configureFromMetadata  reset: W=%d H=%d", width, height);
+    ALOGV("VideoDecoder_configureFromMetadata  reset: W=%d H=%d", width, height);
     // Update the stream handler parameters
     pDecShellContext->m_pVideoStreamhandler->m_videoWidth  = width;
     pDecShellContext->m_pVideoStreamhandler->m_videoHeight = height;
@@ -852,7 +852,7 @@
 
     // Configure the buffer pool
     if( M4OSA_NULL != pDecShellContext->m_pDecBufferPool ) {
-        LOGV("VideoDecoder_configureFromMetadata : reset the buffer pool");
+        ALOGV("VideoDecoder_configureFromMetadata : reset the buffer pool");
         VIDEOEDITOR_BUFFER_freePool(pDecShellContext->m_pDecBufferPool);
         pDecShellContext->m_pDecBufferPool = M4OSA_NULL;
     }
@@ -866,15 +866,15 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorVideoDecoder_configureFromMetadata no error");
+        ALOGV("VideoEditorVideoDecoder_configureFromMetadata no error");
     } else {
         if( M4OSA_NULL != pDecShellContext->m_pDecBufferPool ) {
             VIDEOEDITOR_BUFFER_freePool(pDecShellContext->m_pDecBufferPool);
             pDecShellContext->m_pDecBufferPool = M4OSA_NULL;
         }
-        LOGV("VideoEditorVideoDecoder_configureFromMetadata ERROR 0x%X", err);
+        ALOGV("VideoEditorVideoDecoder_configureFromMetadata ERROR 0x%X", err);
     }
-    LOGV("VideoEditorVideoDecoder_configureFromMetadata end");
+    ALOGV("VideoEditorVideoDecoder_configureFromMetadata end");
     return err;
 }
 
@@ -884,7 +884,7 @@
         (VideoEditorVideoDecoder_Context*)pContext;
 
     // Input parameters check
-    LOGV("VideoEditorVideoDecoder_destroy begin");
+    ALOGV("VideoEditorVideoDecoder_destroy begin");
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
 
     // Release the color converter
@@ -892,7 +892,7 @@
 
     // Destroy the graph
     if( pDecShellContext->mVideoDecoder != NULL ) {
-        LOGV("### VideoEditorVideoDecoder_destroy : releasing decoder");
+        ALOGV("### VideoEditorVideoDecoder_destroy : releasing decoder");
         pDecShellContext->mVideoDecoder->stop();
         pDecShellContext->mVideoDecoder.clear();
     }
@@ -909,11 +909,11 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorVideoDecoder_destroy no error");
+        ALOGV("VideoEditorVideoDecoder_destroy no error");
     } else {
-        LOGV("VideoEditorVideoDecoder_destroy ERROR 0x%X", err);
+        ALOGV("VideoEditorVideoDecoder_destroy ERROR 0x%X", err);
     }
-    LOGV("VideoEditorVideoDecoder_destroy end");
+    ALOGV("VideoEditorVideoDecoder_destroy end");
     return err;
 }
 
@@ -931,7 +931,7 @@
     sp<MetaData> decoderMetadata = NULL;
     int decoderOutput = OMX_COLOR_FormatYUV420Planar;
 
-    LOGV("VideoEditorVideoDecoder_create begin");
+    ALOGV("VideoEditorVideoDecoder_create begin");
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext,             M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(M4OSA_NULL != pStreamHandler,       M4ERR_PARAMETER);
@@ -1070,13 +1070,13 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorVideoDecoder_create no error");
+        ALOGV("VideoEditorVideoDecoder_create no error");
     } else {
         VideoEditorVideoDecoder_destroy(pDecShellContext);
         *pContext = M4OSA_NULL;
-        LOGV("VideoEditorVideoDecoder_create ERROR 0x%X", err);
+        ALOGV("VideoEditorVideoDecoder_create ERROR 0x%X", err);
     }
-    LOGV("VideoEditorVideoDecoder_create : DONE");
+    ALOGV("VideoEditorVideoDecoder_create : DONE");
     return err;
 }
 
@@ -1093,7 +1093,7 @@
     M4OSA_UInt32 size = 0;
     sp<MetaData> decoderMetadata = NULL;
 
-    LOGV("VideoEditorVideoDecoder_create begin");
+    ALOGV("VideoEditorVideoDecoder_create begin");
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext,             M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(M4OSA_NULL != pStreamHandler,       M4ERR_PARAMETER);
@@ -1219,13 +1219,13 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorVideoDecoder_create no error");
+        ALOGV("VideoEditorVideoDecoder_create no error");
     } else {
         VideoEditorVideoDecoder_destroy(pDecShellContext);
         *pContext = M4OSA_NULL;
-        LOGV("VideoEditorVideoDecoder_create ERROR 0x%X", err);
+        ALOGV("VideoEditorVideoDecoder_create ERROR 0x%X", err);
     }
-    LOGV("VideoEditorVideoDecoder_create : DONE");
+    ALOGV("VideoEditorVideoDecoder_create : DONE");
     return err;
 }
 
@@ -1242,7 +1242,7 @@
     M4DECODER_AVCProfileLevel* profile;
     M4DECODER_MPEG4_DecoderConfigInfo* pDecConfInfo;
 
-    LOGV("VideoEditorVideoDecoder_getOption begin");
+    ALOGV("VideoEditorVideoDecoder_getOption begin");
 
     switch (optionId) {
         case M4DECODER_kOptionID_AVCLastDecodedFrameCTS:
@@ -1266,7 +1266,7 @@
                 (int32_t*)(&pVideoSize->m_uiWidth));
             pDecShellContext->mVideoDecoder->getFormat()->findInt32(kKeyHeight,
                 (int32_t*)(&pVideoSize->m_uiHeight));
-            LOGV("VideoEditorVideoDecoder_getOption : W=%d H=%d",
+            ALOGV("VideoEditorVideoDecoder_getOption : W=%d H=%d",
                 pVideoSize->m_uiWidth, pVideoSize->m_uiHeight);
             break;
 
@@ -1289,7 +1289,7 @@
 
     }
 
-    LOGV("VideoEditorVideoDecoder_getOption: end with err = 0x%x", lerr);
+    ALOGV("VideoEditorVideoDecoder_getOption: end with err = 0x%x", lerr);
     return lerr;
 }
 
@@ -1299,7 +1299,7 @@
     VideoEditorVideoDecoder_Context *pDecShellContext =
         (VideoEditorVideoDecoder_Context*) context;
 
-    LOGV("VideoEditorVideoDecoder_setOption begin");
+    ALOGV("VideoEditorVideoDecoder_setOption begin");
 
     switch (optionId) {
         case M4DECODER_kOptionID_OutputFilter: {
@@ -1319,7 +1319,7 @@
             break;
     }
 
-    LOGV("VideoEditorVideoDecoder_setOption: end with err = 0x%x", lerr);
+    ALOGV("VideoEditorVideoDecoder_setOption: end with err = 0x%x", lerr);
     return lerr;
 }
 
@@ -1334,21 +1334,21 @@
     status_t errStatus;
     bool needSeek = bJump;
 
-    LOGV("VideoEditorVideoDecoder_decode begin");
+    ALOGV("VideoEditorVideoDecoder_decode begin");
 
     if( M4OSA_TRUE == pDecShellContext->mReachedEOS ) {
         // Do not call read(), it could lead to a freeze
-        LOGV("VideoEditorVideoDecoder_decode : EOS already reached");
+        ALOGV("VideoEditorVideoDecoder_decode : EOS already reached");
         lerr = M4WAR_NO_MORE_AU;
         goto VIDEOEDITOR_VideoDecode_cleanUP;
     }
     if(pDecShellContext->m_lastDecodedCTS >= *pTime) {
-        LOGV("VideoDecoder_decode: Already decoded up to this time CTS = %lf.",
+        ALOGV("VideoDecoder_decode: Already decoded up to this time CTS = %lf.",
             pDecShellContext->m_lastDecodedCTS);
         goto VIDEOEDITOR_VideoDecode_cleanUP;
     }
     if(M4OSA_TRUE == bJump) {
-        LOGV("VideoEditorVideoDecoder_decode: Jump called");
+        ALOGV("VideoEditorVideoDecoder_decode: Jump called");
         pDecShellContext->m_lastDecodedCTS = -1;
         pDecShellContext->m_lastRenderCts = -1;
     }
@@ -1360,7 +1360,7 @@
     pDecShellContext->mLastInputCts = *pTime;
 
     while (pDecoderBuffer == NULL || pDecShellContext->m_lastDecodedCTS + tolerance < *pTime) {
-        LOGV("VideoEditorVideoDecoder_decode, frameCTS = %lf, DecodeUpTo = %lf",
+        ALOGV("VideoEditorVideoDecoder_decode, frameCTS = %lf, DecodeUpTo = %lf",
             pDecShellContext->m_lastDecodedCTS, *pTime);
 
         // Read the buffer from the stagefright decoder
@@ -1376,7 +1376,7 @@
 
         // Handle EOS and format change
         if (errStatus == ERROR_END_OF_STREAM) {
-            LOGV("End of stream reached, returning M4WAR_NO_MORE_AU ");
+            ALOGV("End of stream reached, returning M4WAR_NO_MORE_AU ");
             pDecShellContext->mReachedEOS = M4OSA_TRUE;
             lerr = M4WAR_NO_MORE_AU;
             // If we decoded a buffer before EOS, we still need to put it
@@ -1386,12 +1386,12 @@
             }
             goto VIDEOEDITOR_VideoDecode_cleanUP;
         } else if (INFO_FORMAT_CHANGED == errStatus) {
-            LOGV("VideoDecoder_decode : source returns INFO_FORMAT_CHANGED");
+            ALOGV("VideoDecoder_decode : source returns INFO_FORMAT_CHANGED");
             lerr = VideoEditorVideoDecoder_configureFromMetadata(
                 pDecShellContext,
                 pDecShellContext->mVideoDecoder->getFormat().get());
             if( M4NO_ERROR != lerr ) {
-                LOGV("!!! VideoEditorVideoDecoder_decode ERROR : "
+                ALOGV("!!! VideoEditorVideoDecoder_decode ERROR : "
                     "VideoDecoder_configureFromMetadata returns 0x%X", lerr);
                 break;
             }
@@ -1415,7 +1415,7 @@
         // Record the timestamp of last decoded buffer
         pDecoderBuffer->meta_data()->findInt64(kKeyTime, &lFrameTime);
         pDecShellContext->m_lastDecodedCTS = (M4_MediaTime)(lFrameTime/1000);
-        LOGV("VideoEditorVideoDecoder_decode,decoded frametime = %lf,size = %d",
+        ALOGV("VideoEditorVideoDecoder_decode,decoded frametime = %lf,size = %d",
             (M4_MediaTime)lFrameTime, pDecoderBuffer->size() );
 
         // If bJump is false, we need to save every decoded buffer
@@ -1448,7 +1448,7 @@
         pDecoderBuffer = NULL;
     }
 
-    LOGV("VideoEditorVideoDecoder_decode: end with 0x%x", lerr);
+    ALOGV("VideoEditorVideoDecoder_decode: end with 0x%x", lerr);
     return lerr;
 }
 
@@ -1561,7 +1561,7 @@
     M4_MediaTime candidateTimeStamp = -1;
     M4OSA_Bool bFound = M4OSA_FALSE;
 
-    LOGV("VideoEditorVideoDecoder_render begin");
+    ALOGV("VideoEditorVideoDecoder_render begin");
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != context, M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(M4OSA_NULL != pTime, M4ERR_PARAMETER);
@@ -1570,11 +1570,11 @@
     // The output buffer is already allocated, just copy the data
     if ( (*pTime <= pDecShellContext->m_lastRenderCts) &&
             (M4OSA_FALSE == bForceRender) ) {
-        LOGV("VIDEOEDITOR_VIDEO_render Frame in the past");
+        ALOGV("VIDEOEDITOR_VIDEO_render Frame in the past");
         err = M4WAR_VIDEORENDERER_NO_NEW_FRAME;
         goto cleanUp;
     }
-    LOGV("VideoDecoder_render: lastRendered time = %lf,requested render time = "
+    ALOGV("VideoDecoder_render: lastRendered time = %lf,requested render time = "
         "%lf", pDecShellContext->m_lastRenderCts, *pTime);
 
     /**
@@ -1597,7 +1597,7 @@
                 bFound = M4OSA_TRUE;
                 pRenderVIDEOEDITORBuffer = pTmpVIDEOEDITORBuffer;
                 candidateTimeStamp = pTmpVIDEOEDITORBuffer->buffCTS;
-                LOGV("VideoDecoder_render: found a buffer with timestamp = %lf",
+                ALOGV("VideoDecoder_render: found a buffer with timestamp = %lf",
                     candidateTimeStamp);
             }
         }
@@ -1607,7 +1607,7 @@
         goto cleanUp;
     }
 
-    LOGV("VideoEditorVideoDecoder_render 3 ouput %d %d %d %d",
+    ALOGV("VideoEditorVideoDecoder_render 3 ouput %d %d %d %d",
         pOutputPlane[0].u_width, pOutputPlane[0].u_height,
         pOutputPlane[0].u_topleft, pOutputPlane[0].u_stride);
 
@@ -1637,7 +1637,7 @@
         tmpPlane[2].pac_data  = tmpPlane[1].pac_data +
             (tmpPlane[1].u_stride * tmpPlane[1].u_height);
 
-        LOGV("VideoEditorVideoDecoder_render w = %d H = %d",
+        ALOGV("VideoEditorVideoDecoder_render w = %d H = %d",
             tmpPlane[0].u_width,tmpPlane[0].u_height);
         pDecShellContext->m_pFilter(M4OSA_NULL, &tmpPlane[0], pOutputPlane);
     } else {
@@ -1668,11 +1668,11 @@
 cleanUp:
     if( M4NO_ERROR == err ) {
         *pTime = pDecShellContext->m_lastRenderCts;
-        LOGV("VideoEditorVideoDecoder_render no error");
+        ALOGV("VideoEditorVideoDecoder_render no error");
     } else {
-        LOGV("VideoEditorVideoDecoder_render ERROR 0x%X", err);
+        ALOGV("VideoEditorVideoDecoder_render ERROR 0x%X", err);
     }
-    LOGV("VideoEditorVideoDecoder_render end");
+    ALOGV("VideoEditorVideoDecoder_render end");
     return err;
 }
 
diff --git a/libvideoeditor/vss/stagefrightshells/src/VideoEditorVideoEncoder.cpp b/libvideoeditor/vss/stagefrightshells/src/VideoEditorVideoEncoder.cpp
index b0a6fdb..7bd4b17 100755
--- a/libvideoeditor/vss/stagefrightshells/src/VideoEditorVideoEncoder.cpp
+++ b/libvideoeditor/vss/stagefrightshells/src/VideoEditorVideoEncoder.cpp
@@ -115,7 +115,7 @@
         mIsEOS(false),
         mState(CREATED),
         mEncFormat(format) {
-    LOGV("VideoEditorVideoEncoderSource::VideoEditorVideoEncoderSource");
+    ALOGV("VideoEditorVideoEncoderSource::VideoEditorVideoEncoderSource");
 }
 
 VideoEditorVideoEncoderSource::~VideoEditorVideoEncoderSource() {
@@ -129,25 +129,25 @@
 status_t VideoEditorVideoEncoderSource::start(MetaData *meta) {
     status_t err = OK;
 
-    LOGV("VideoEditorVideoEncoderSource::start() begin");
+    ALOGV("VideoEditorVideoEncoderSource::start() begin");
 
     if( CREATED != mState ) {
-        LOGV("VideoEditorVideoEncoderSource::start: invalid state %d", mState);
+        ALOGV("VideoEditorVideoEncoderSource::start: invalid state %d", mState);
         return UNKNOWN_ERROR;
     }
     mState = STARTED;
 
-    LOGV("VideoEditorVideoEncoderSource::start() END (0x%x)", err);
+    ALOGV("VideoEditorVideoEncoderSource::start() END (0x%x)", err);
     return err;
 }
 
 status_t VideoEditorVideoEncoderSource::stop() {
     status_t err = OK;
 
-    LOGV("VideoEditorVideoEncoderSource::stop() begin");
+    ALOGV("VideoEditorVideoEncoderSource::stop() begin");
 
     if( STARTED != mState ) {
-        LOGV("VideoEditorVideoEncoderSource::stop: invalid state %d", mState);
+        ALOGV("VideoEditorVideoEncoderSource::stop: invalid state %d", mState);
         return UNKNOWN_ERROR;
     }
 
@@ -160,19 +160,19 @@
         mFirstBufferLink = mFirstBufferLink->nextLink;
         delete tmpLink;
     }
-    LOGV("VideoEditorVideoEncoderSource::stop : %d buffer remained", i);
+    ALOGV("VideoEditorVideoEncoderSource::stop : %d buffer remained", i);
     mFirstBufferLink = NULL;
     mLastBufferLink = NULL;
 
     mState = CREATED;
 
-    LOGV("VideoEditorVideoEncoderSource::stop() END (0x%x)", err);
+    ALOGV("VideoEditorVideoEncoderSource::stop() END (0x%x)", err);
     return err;
 }
 
 sp<MetaData> VideoEditorVideoEncoderSource::getFormat() {
 
-    LOGV("VideoEditorVideoEncoderSource::getFormat");
+    ALOGV("VideoEditorVideoEncoderSource::getFormat");
     return mEncFormat;
 }
 
@@ -183,10 +183,10 @@
     status_t err = OK;
     MediaBufferChain* tmpLink = NULL;
 
-    LOGV("VideoEditorVideoEncoderSource::read() begin");
+    ALOGV("VideoEditorVideoEncoderSource::read() begin");
 
     if ( STARTED != mState ) {
-        LOGV("VideoEditorVideoEncoderSource::read: invalid state %d", mState);
+        ALOGV("VideoEditorVideoEncoderSource::read: invalid state %d", mState);
         return UNKNOWN_ERROR;
     }
 
@@ -197,7 +197,7 @@
     // End of stream?
     if (mFirstBufferLink == NULL) {
         *buffer = NULL;
-        LOGV("VideoEditorVideoEncoderSource::read : EOS");
+        ALOGV("VideoEditorVideoEncoderSource::read : EOS");
         return ERROR_END_OF_STREAM;
     }
 
@@ -212,7 +212,7 @@
     delete tmpLink;
     mNbBuffer--;
 
-    LOGV("VideoEditorVideoEncoderSource::read() END (0x%x)", err);
+    ALOGV("VideoEditorVideoEncoderSource::read() END (0x%x)", err);
     return err;
 }
 
@@ -220,10 +220,10 @@
     Mutex::Autolock autolock(mLock);
     status_t err = OK;
 
-    LOGV("VideoEditorVideoEncoderSource::storeBuffer() begin");
+    ALOGV("VideoEditorVideoEncoderSource::storeBuffer() begin");
 
     if( NULL == buffer ) {
-        LOGV("VideoEditorVideoEncoderSource::storeBuffer : reached EOS");
+        ALOGV("VideoEditorVideoEncoderSource::storeBuffer : reached EOS");
         mIsEOS = true;
     } else {
         MediaBufferChain* newLink = new MediaBufferChain;
@@ -238,7 +238,7 @@
         mNbBuffer++;
     }
     mBufferCond.signal();
-    LOGV("VideoEditorVideoEncoderSource::storeBuffer() end");
+    ALOGV("VideoEditorVideoEncoderSource::storeBuffer() end");
     return mNbBuffer;
 }
 
@@ -488,7 +488,7 @@
     sp<MediaSource> encoder = NULL;;
     OMXClient client;
 
-    LOGV("VideoEditorVideoEncoder_getDSI begin");
+    ALOGV("VideoEditorVideoEncoder_getDSI begin");
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext,       M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(M4OSA_NULL != metaData.get(), M4ERR_PARAMETER);
@@ -563,11 +563,11 @@
     client.disconnect();
     if ( encoderSource != NULL ) { encoderSource.clear(); }
     if ( M4NO_ERROR == err ) {
-        LOGV("VideoEditorVideoEncoder_getDSI no error");
+        ALOGV("VideoEditorVideoEncoder_getDSI no error");
     } else {
-        LOGV("VideoEditorVideoEncoder_getDSI ERROR 0x%X", err);
+        ALOGV("VideoEditorVideoEncoder_getDSI ERROR 0x%X", err);
     }
-    LOGV("VideoEditorVideoEncoder_getDSI end");
+    ALOGV("VideoEditorVideoEncoder_getDSI end");
     return err;
 }
 /********************
@@ -578,7 +578,7 @@
     M4OSA_ERR err = M4NO_ERROR;
     VideoEditorVideoEncoder_Context* pEncoderContext = M4OSA_NULL;
 
-    LOGV("VideoEditorVideoEncoder_cleanup begin");
+    ALOGV("VideoEditorVideoEncoder_cleanup begin");
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
 
@@ -592,11 +592,11 @@
 
 cleanUp:
     if ( M4NO_ERROR == err ) {
-        LOGV("VideoEditorVideoEncoder_cleanup no error");
+        ALOGV("VideoEditorVideoEncoder_cleanup no error");
     } else {
-        LOGV("VideoEditorVideoEncoder_cleanup ERROR 0x%X", err);
+        ALOGV("VideoEditorVideoEncoder_cleanup ERROR 0x%X", err);
     }
-    LOGV("VideoEditorVideoEncoder_cleanup end");
+    ALOGV("VideoEditorVideoEncoder_cleanup end");
     return err;
 }
 
@@ -610,7 +610,7 @@
     VideoEditorVideoEncoder_Context* pEncoderContext = M4OSA_NULL;
     int encoderInput = OMX_COLOR_FormatYUV420Planar;
 
-    LOGV("VideoEditorVideoEncoder_init begin: format  %d", format);
+    ALOGV("VideoEditorVideoEncoder_init begin: format  %d", format);
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(M4OSA_NULL != pWriterDataInterface, M4ERR_PARAMETER);
@@ -643,13 +643,13 @@
 
 cleanUp:
     if ( M4NO_ERROR == err ) {
-        LOGV("VideoEditorVideoEncoder_init no error");
+        ALOGV("VideoEditorVideoEncoder_init no error");
     } else {
         VideoEditorVideoEncoder_cleanup(pEncoderContext);
         *pContext = M4OSA_NULL;
-        LOGV("VideoEditorVideoEncoder_init ERROR 0x%X", err);
+        ALOGV("VideoEditorVideoEncoder_init ERROR 0x%X", err);
     }
-    LOGV("VideoEditorVideoEncoder_init end");
+    ALOGV("VideoEditorVideoEncoder_init end");
     return err;
 }
 
@@ -686,7 +686,7 @@
     M4OSA_ERR err = M4NO_ERROR;
     VideoEditorVideoEncoder_Context* pEncoderContext = M4OSA_NULL;
 
-    LOGV("VideoEditorVideoEncoder_close begin");
+    ALOGV("VideoEditorVideoEncoder_close begin");
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
 
@@ -712,11 +712,11 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorVideoEncoder_close no error");
+        ALOGV("VideoEditorVideoEncoder_close no error");
     } else {
-        LOGV("VideoEditorVideoEncoder_close ERROR 0x%X", err);
+        ALOGV("VideoEditorVideoEncoder_close ERROR 0x%X", err);
     }
-    LOGV("VideoEditorVideoEncoder_close end");
+    ALOGV("VideoEditorVideoEncoder_close end");
     return err;
 }
 
@@ -735,7 +735,7 @@
     int32_t iFrameRate = 0;
     uint32_t codecFlags = 0;
 
-    LOGV(">>> VideoEditorVideoEncoder_open begin");
+    ALOGV(">>> VideoEditorVideoEncoder_open begin");
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(M4OSA_NULL != pAU,      M4ERR_PARAMETER);
@@ -798,9 +798,9 @@
     }
     iProfile = pEncoderContext->mCodecParams->videoProfile;
     iLevel = pEncoderContext->mCodecParams->videoLevel;
-    LOGV("Encoder mime %s profile %d, level %d",
+    ALOGV("Encoder mime %s profile %d, level %d",
         mime,iProfile, iLevel);
-    LOGV("Encoder w %d, h %d, bitrate %d, fps %d",
+    ALOGV("Encoder w %d, h %d, bitrate %d, fps %d",
         pEncoderContext->mCodecParams->FrameWidth,
         pEncoderContext->mCodecParams->FrameHeight,
         pEncoderContext->mCodecParams->Bitrate,
@@ -881,7 +881,7 @@
         pEncoderContext->mClient.interface(), encoderMetadata, true,
         pEncoderContext->mEncoderSource, NULL, codecFlags);
     VIDEOEDITOR_CHECK(NULL != pEncoderContext->mEncoder.get(), M4ERR_STATE);
-    LOGV("VideoEditorVideoEncoder_open : DONE");
+    ALOGV("VideoEditorVideoEncoder_open : DONE");
     pEncoderContext->mPuller = new VideoEditorVideoEncoderPuller(
         pEncoderContext->mEncoder);
 
@@ -890,12 +890,12 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorVideoEncoder_open no error");
+        ALOGV("VideoEditorVideoEncoder_open no error");
     } else {
         VideoEditorVideoEncoder_close(pEncoderContext);
-        LOGV("VideoEditorVideoEncoder_open ERROR 0x%X", err);
+        ALOGV("VideoEditorVideoEncoder_open ERROR 0x%X", err);
     }
-    LOGV("VideoEditorVideoEncoder_open end");
+    ALOGV("VideoEditorVideoEncoder_open end");
     return err;
 }
 
@@ -908,7 +908,7 @@
     MediaBuffer* buffer = NULL;
     int32_t nbBuffer = 0;
 
-    LOGV("VideoEditorVideoEncoder_processInputBuffer begin: cts  %f", Cts);
+    ALOGV("VideoEditorVideoEncoder_processInputBuffer begin: cts  %f", Cts);
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
 
@@ -990,14 +990,14 @@
 
 cleanUp:
     if ( M4NO_ERROR == err ) {
-        LOGV("VideoEditorVideoEncoder_processInputBuffer error 0x%X", err);
+        ALOGV("VideoEditorVideoEncoder_processInputBuffer error 0x%X", err);
     } else {
         if( NULL != buffer ) {
             buffer->release();
         }
-        LOGV("VideoEditorVideoEncoder_processInputBuffer ERROR 0x%X", err);
+        ALOGV("VideoEditorVideoEncoder_processInputBuffer ERROR 0x%X", err);
     }
-    LOGV("VideoEditorVideoEncoder_processInputBuffer end");
+    ALOGV("VideoEditorVideoEncoder_processInputBuffer end");
     return err;
 }
 
@@ -1010,7 +1010,7 @@
     int64_t i64Tmp = 0;
     status_t result = OK;
 
-    LOGV("VideoEditorVideoEncoder_processOutputBuffer begin");
+    ALOGV("VideoEditorVideoEncoder_processOutputBuffer begin");
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(M4OSA_NULL != buffer,   M4ERR_PARAMETER);
@@ -1020,18 +1020,18 @@
     // Process the returned AU
     if ( 0 == buffer->range_length() ) {
         // Encoder has no data yet, nothing unusual
-        LOGV("VideoEditorVideoEncoder_processOutputBuffer : buffer is empty");
+        ALOGV("VideoEditorVideoEncoder_processOutputBuffer : buffer is empty");
         goto cleanUp;
     }
     VIDEOEDITOR_CHECK(0 == ((M4OSA_UInt32)buffer->data())%4, M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(buffer->meta_data().get(), M4ERR_PARAMETER);
     if ( buffer->meta_data()->findInt32(kKeyIsCodecConfig, &i32Tmp) && i32Tmp ){
         {   // Display the DSI
-            LOGV("VideoEditorVideoEncoder_processOutputBuffer DSI %d",
+            ALOGV("VideoEditorVideoEncoder_processOutputBuffer DSI %d",
                 buffer->range_length());
             uint8_t* tmp = (uint8_t*)(buffer->data());
             for( uint32_t i=0; i<buffer->range_length(); i++ ) {
-                LOGV("DSI [%d] %.2X", i, tmp[i]);
+                ALOGV("DSI [%d] %.2X", i, tmp[i]);
             }
         }
     } else {
@@ -1046,15 +1046,15 @@
         pEncoderContext->mLastOutputCts = i64Tmp;
 
         Cts = (M4OSA_Int32)(i64Tmp/1000);
-        LOGV("[TS_CHECK] VI/ENC WRITE frame %d @ %lld -> %d (last %d)",
+        ALOGV("[TS_CHECK] VI/ENC WRITE frame %d @ %lld -> %d (last %d)",
             pEncoderContext->mNbOutputFrames, i64Tmp, Cts,
             pEncoderContext->mLastCTS);
         if ( Cts < pEncoderContext->mLastCTS ) {
-            LOGV("VideoEncoder_processOutputBuffer WARNING : Cts is going "
+            ALOGV("VideoEncoder_processOutputBuffer WARNING : Cts is going "
             "backwards %d < %d", Cts, pEncoderContext->mLastCTS);
             goto cleanUp;
         }
-        LOGV("VideoEditorVideoEncoder_processOutputBuffer : %d %d",
+        ALOGV("VideoEditorVideoEncoder_processOutputBuffer : %d %d",
             Cts, pEncoderContext->mLastCTS);
 
         // Retrieve the AU container
@@ -1107,7 +1107,7 @@
         pEncoderContext->mAccessUnit->CTS = Cts;
         pEncoderContext->mAccessUnit->DTS = Cts;
 
-        LOGV("VideoEditorVideoEncoder_processOutputBuffer: AU @ 0x%X 0x%X %d %d",
+        ALOGV("VideoEditorVideoEncoder_processOutputBuffer: AU @ 0x%X 0x%X %d %d",
             pEncoderContext->mAccessUnit->dataAddress,
             *pEncoderContext->mAccessUnit->dataAddress,
             pEncoderContext->mAccessUnit->size,
@@ -1123,13 +1123,13 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorVideoEncoder_processOutputBuffer no error");
+        ALOGV("VideoEditorVideoEncoder_processOutputBuffer no error");
     } else {
         SAFE_FREE(pEncoderContext->mHeader.pBuf);
         pEncoderContext->mHeader.Size = 0;
-        LOGV("VideoEditorVideoEncoder_processOutputBuffer ERROR 0x%X", err);
+        ALOGV("VideoEditorVideoEncoder_processOutputBuffer ERROR 0x%X", err);
     }
-    LOGV("VideoEditorVideoEncoder_processOutputBuffer end");
+    ALOGV("VideoEditorVideoEncoder_processOutputBuffer end");
     return err;
 }
 
@@ -1141,7 +1141,7 @@
     status_t result = OK;
     MediaBuffer* outputBuffer = NULL;
 
-    LOGV("VideoEditorVideoEncoder_encode 0x%X %f %d", pInPlane, Cts, FrameMode);
+    ALOGV("VideoEditorVideoEncoder_encode 0x%X %f %d", pInPlane, Cts, FrameMode);
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
 
     pEncoderContext = (VideoEditorVideoEncoder_Context*)pContext;
@@ -1157,7 +1157,7 @@
     }
     pEncoderContext->mLastInputCts = Cts;
 
-    LOGV("VideoEditorVideoEncoder_encode 0x%X %d %f (%d)", pInPlane, FrameMode,
+    ALOGV("VideoEditorVideoEncoder_encode 0x%X %d %f (%d)", pInPlane, FrameMode,
         Cts, pEncoderContext->mLastCTS);
 
     // Push the input buffer to the encoder source
@@ -1193,11 +1193,11 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorVideoEncoder_encode no error");
+        ALOGV("VideoEditorVideoEncoder_encode no error");
     } else {
-        LOGV("VideoEditorVideoEncoder_encode ERROR 0x%X", err);
+        ALOGV("VideoEditorVideoEncoder_encode ERROR 0x%X", err);
     }
-    LOGV("VideoEditorVideoEncoder_encode end");
+    ALOGV("VideoEditorVideoEncoder_encode end");
     return err;
 }
 
@@ -1206,7 +1206,7 @@
     VideoEditorVideoEncoder_Context* pEncoderContext = M4OSA_NULL;
     status_t                   result          = OK;
 
-    LOGV("VideoEditorVideoEncoder_start begin");
+    ALOGV("VideoEditorVideoEncoder_start begin");
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
 
@@ -1230,11 +1230,11 @@
 
 cleanUp:
     if ( M4NO_ERROR == err ) {
-        LOGV("VideoEditorVideoEncoder_start no error");
+        ALOGV("VideoEditorVideoEncoder_start no error");
     } else {
-        LOGV("VideoEditorVideoEncoder_start ERROR 0x%X", err);
+        ALOGV("VideoEditorVideoEncoder_start ERROR 0x%X", err);
     }
-    LOGV("VideoEditorVideoEncoder_start end");
+    ALOGV("VideoEditorVideoEncoder_start end");
     return err;
 }
 
@@ -1244,7 +1244,7 @@
     MediaBuffer* outputBuffer = NULL;
     status_t result = OK;
 
-    LOGV("VideoEditorVideoEncoder_stop begin");
+    ALOGV("VideoEditorVideoEncoder_stop begin");
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
     pEncoderContext = (VideoEditorVideoEncoder_Context*)pContext;
@@ -1286,11 +1286,11 @@
 
 cleanUp:
     if ( M4NO_ERROR == err ) {
-        LOGV("VideoEditorVideoEncoder_stop no error");
+        ALOGV("VideoEditorVideoEncoder_stop no error");
     } else {
-        LOGV("VideoEditorVideoEncoder_stop ERROR 0x%X", err);
+        ALOGV("VideoEditorVideoEncoder_stop ERROR 0x%X", err);
     }
-    LOGV("VideoEditorVideoEncoder_stop end");
+    ALOGV("VideoEditorVideoEncoder_stop end");
     return err;
 }
 
@@ -1304,7 +1304,7 @@
     M4OSA_ERR err = M4NO_ERROR;
     VideoEditorVideoEncoder_Context* pEncoderContext = M4OSA_NULL;
 
-    LOGV("VideoEditorVideoEncoder_setOption start optionID 0x%X", optionID);
+    ALOGV("VideoEditorVideoEncoder_setOption start optionID 0x%X", optionID);
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
 
@@ -1320,7 +1320,7 @@
                 (M4OSA_Context)optionValue;
             break;
         default:
-            LOGV("VideoEditorVideoEncoder_setOption: unsupported optionId 0x%X",
+            ALOGV("VideoEditorVideoEncoder_setOption: unsupported optionId 0x%X",
                 optionID);
             VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_BAD_OPTION_ID);
             break;
@@ -1328,11 +1328,11 @@
 
 cleanUp:
     if ( M4NO_ERROR == err ) {
-        LOGV("VideoEditorVideoEncoder_setOption no error");
+        ALOGV("VideoEditorVideoEncoder_setOption no error");
     } else {
-        LOGV("VideoEditorVideoEncoder_setOption ERROR 0x%X", err);
+        ALOGV("VideoEditorVideoEncoder_setOption ERROR 0x%X", err);
     }
-    LOGV("VideoEditorVideoEncoder_setOption end");
+    ALOGV("VideoEditorVideoEncoder_setOption end");
     return err;
 }
 
@@ -1341,7 +1341,7 @@
     M4OSA_ERR err = M4NO_ERROR;
     VideoEditorVideoEncoder_Context* pEncoderContext = M4OSA_NULL;
 
-    LOGV("VideoEditorVideoEncoder_getOption begin optinId 0x%X", optionID);
+    ALOGV("VideoEditorVideoEncoder_getOption begin optinId 0x%X", optionID);
     // Input parameters check
     VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
     pEncoderContext = (VideoEditorVideoEncoder_Context*)pContext;
@@ -1353,7 +1353,7 @@
             *(M4ENCODER_Header**)optionValue = &(pEncoderContext->mHeader);
             break;
         default:
-            LOGV("VideoEditorVideoEncoder_getOption: unsupported optionId 0x%X",
+            ALOGV("VideoEditorVideoEncoder_getOption: unsupported optionId 0x%X",
                 optionID);
             VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_BAD_OPTION_ID);
             break;
@@ -1361,9 +1361,9 @@
 
 cleanUp:
     if ( M4NO_ERROR == err ) {
-        LOGV("VideoEditorVideoEncoder_getOption no error");
+        ALOGV("VideoEditorVideoEncoder_getOption no error");
     } else {
-        LOGV("VideoEditorVideoEncoder_getOption ERROR 0x%X", err);
+        ALOGV("VideoEditorVideoEncoder_getOption ERROR 0x%X", err);
     }
     return err;
 }
@@ -1377,7 +1377,7 @@
     VIDEOEDITOR_CHECK(M4OSA_NULL != pFormat,           M4ERR_PARAMETER);
     VIDEOEDITOR_CHECK(M4OSA_NULL != pEncoderInterface, M4ERR_PARAMETER);
 
-    LOGV("VideoEditorVideoEncoder_getInterface begin 0x%x 0x%x %d", pFormat,
+    ALOGV("VideoEditorVideoEncoder_getInterface begin 0x%x 0x%x %d", pFormat,
         pEncoderInterface, mode);
 
     SAFE_MALLOC(*pEncoderInterface, M4ENCODER_GlobalInterface, 1,
@@ -1405,7 +1405,7 @@
                 break;
             }
         default:
-            LOGV("VideoEditorVideoEncoder_getInterface : unsupported format %d",
+            ALOGV("VideoEditorVideoEncoder_getInterface : unsupported format %d",
                 format);
             VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_PARAMETER);
         break;
@@ -1425,10 +1425,10 @@
 
 cleanUp:
     if( M4NO_ERROR == err ) {
-        LOGV("VideoEditorVideoEncoder_getInterface no error");
+        ALOGV("VideoEditorVideoEncoder_getInterface no error");
     } else {
         *pEncoderInterface = M4OSA_NULL;
-        LOGV("VideoEditorVideoEncoder_getInterface ERROR 0x%X", err);
+        ALOGV("VideoEditorVideoEncoder_getInterface ERROR 0x%X", err);
     }
     return err;
 }
