diff --git a/libvideoeditor/lvpp/DummyAudioSource.cpp b/libvideoeditor/lvpp/DummyAudioSource.cpp
index d461873..bc38a20 100755
--- a/libvideoeditor/lvpp/DummyAudioSource.cpp
+++ b/libvideoeditor/lvpp/DummyAudioSource.cpp
@@ -38,7 +38,7 @@
 /*---------------------*/
 /*  DEBUG LEVEL SETUP  */
 /*---------------------*/
-#define LOG1 LOGE    /*ERRORS Logging*/
+#define LOG1 ALOGE    /*ERRORS Logging*/
 #define LOG2 ALOGV    /*WARNING Logging*/
 #define LOG3 //ALOGV    /*COMMENTS Logging*/
 
diff --git a/libvideoeditor/lvpp/DummyVideoSource.cpp b/libvideoeditor/lvpp/DummyVideoSource.cpp
index 89c2407..02ebcb8 100755
--- a/libvideoeditor/lvpp/DummyVideoSource.cpp
+++ b/libvideoeditor/lvpp/DummyVideoSource.cpp
@@ -32,7 +32,7 @@
 #include <memory.h>
 
 
-#define LOG1 LOGE    /*ERRORS Logging*/
+#define LOG1 ALOGE    /*ERRORS Logging*/
 #define LOG2 ALOGV    /*WARNING Logging*/
 #define LOG3 //ALOGV    /*COMMENTS Logging*/
 
diff --git a/libvideoeditor/lvpp/NativeWindowRenderer.cpp b/libvideoeditor/lvpp/NativeWindowRenderer.cpp
index ad028a6..312a404 100755
--- a/libvideoeditor/lvpp/NativeWindowRenderer.cpp
+++ b/libvideoeditor/lvpp/NativeWindowRenderer.cpp
@@ -270,7 +270,7 @@
             char* buf = (char*) malloc(infoLen);
             if (buf) {
                 glGetProgramInfoLog(program, infoLen, NULL, buf);
-                LOGE("Program link log:\n%s\n", buf);
+                ALOGE("Program link log:\n%s\n", buf);
                 free(buf);
             }
         }
@@ -300,7 +300,7 @@
         char* buf = (char*) malloc(infoLen);
         if (buf) {
             glGetShaderInfoLog(shader, infoLen, NULL, buf);
-            LOGE("Shader compile log:\n%s\n", buf);
+            ALOGE("Shader compile log:\n%s\n", buf);
             free(buf);
         }
         glDeleteShader(shader);
@@ -385,7 +385,7 @@
     native_window_set_buffers_timestamp(anw, timeUs * 1000);
     status_t err = anw->queueBuffer(anw, buffer->graphicBuffer().get());
     if (err != 0) {
-        LOGE("queueBuffer failed with error %s (%d)", strerror(-err), -err);
+        ALOGE("queueBuffer failed with error %s (%d)", strerror(-err), -err);
         return;
     }
 
diff --git a/libvideoeditor/lvpp/PreviewPlayer.cpp b/libvideoeditor/lvpp/PreviewPlayer.cpp
index bdb5ce4..9a640a4 100755
--- a/libvideoeditor/lvpp/PreviewPlayer.cpp
+++ b/libvideoeditor/lvpp/PreviewPlayer.cpp
@@ -743,7 +743,7 @@
     initRenderer_l();
 
     if (mVideoRenderer == NULL) {
-        LOGE("Cannot create renderer");
+        ALOGE("Cannot create renderer");
         return UNKNOWN_ERROR;
     }
 
@@ -925,7 +925,7 @@
     if (mAudioPlayer != NULL && !(mFlags & (AUDIO_RUNNING))) {
         status_t err = startAudioPlayer_l();
         if (err != OK) {
-            LOGE("Starting the audio player failed w/ err %d", err);
+            ALOGE("Starting the audio player failed w/ err %d", err);
             return;
         }
     }
diff --git a/libvideoeditor/lvpp/PreviewPlayerBase.cpp b/libvideoeditor/lvpp/PreviewPlayerBase.cpp
index a50a044..54f5b07 100644
--- a/libvideoeditor/lvpp/PreviewPlayerBase.cpp
+++ b/libvideoeditor/lvpp/PreviewPlayerBase.cpp
@@ -122,7 +122,7 @@
         status_t err = mNativeWindow->queueBuffer(
                 mNativeWindow.get(), buffer->graphicBuffer().get());
         if (err != 0) {
-            LOGE("queueBuffer failed with error %s (%d)", strerror(-err),
+            ALOGE("queueBuffer failed with error %s (%d)", strerror(-err),
                     -err);
             return;
         }
@@ -1437,7 +1437,7 @@
     if (mAudioPlayer != NULL && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) {
         status_t err = startAudioPlayer_l();
         if (err != OK) {
-            LOGE("Startung the audio player failed w/ err %d", err);
+            ALOGE("Startung the audio player failed w/ err %d", err);
             return;
         }
     }
diff --git a/libvideoeditor/lvpp/VideoEditorAudioPlayer.cpp b/libvideoeditor/lvpp/VideoEditorAudioPlayer.cpp
index 0812ec3..b3d63ed 100755
--- a/libvideoeditor/lvpp/VideoEditorAudioPlayer.cpp
+++ b/libvideoeditor/lvpp/VideoEditorAudioPlayer.cpp
@@ -531,7 +531,7 @@
                                 mBGAudioPCMFileSeekPoint = tmp32;
 
                                 if (err != M4NO_ERROR){
-                                    LOGE("M4OSA_fileReadSeek err %d",(int)err);
+                                    ALOGE("M4OSA_fileReadSeek err %d",(int)err);
                                 }
 
                                 err = M4OSA_fileReadData(mBGAudioPCMFileHandle,
diff --git a/libvideoeditor/lvpp/VideoEditorPlayer.cpp b/libvideoeditor/lvpp/VideoEditorPlayer.cpp
index bf39fbf..d2ec681 100755
--- a/libvideoeditor/lvpp/VideoEditorPlayer.cpp
+++ b/libvideoeditor/lvpp/VideoEditorPlayer.cpp
@@ -66,7 +66,7 @@
 //We donot use this in preview, dummy implimentation as this is pure virtual
 status_t VideoEditorPlayer::setDataSource(int fd, int64_t offset,
     int64_t length) {
-    LOGE("setDataSource(%d, %lld, %lld) Not supported", fd, offset, length);
+    ALOGE("setDataSource(%d, %lld, %lld) Not supported", fd, offset, length);
     return (!OK);
 }
 
@@ -432,7 +432,7 @@
     }
 
     if ((t == 0) || (t->initCheck() != NO_ERROR)) {
-        LOGE("Unable to create audio track");
+        ALOGE("Unable to create audio track");
         delete t;
         return NO_INIT;
     }
diff --git a/libvideoeditor/lvpp/VideoEditorPreviewController.cpp b/libvideoeditor/lvpp/VideoEditorPreviewController.cpp
index fdf5570..acb9904 100755
--- a/libvideoeditor/lvpp/VideoEditorPreviewController.cpp
+++ b/libvideoeditor/lvpp/VideoEditorPreviewController.cpp
@@ -77,7 +77,7 @@
 
         err = M4OSA_threadSyncClose(mThreadContext);
         if(err != M4NO_ERROR) {
-            LOGE("~VideoEditorPreviewController: error 0x%x \
+            ALOGE("~VideoEditorPreviewController: error 0x%x \
             in trying to close thread", (unsigned int) err);
             // Continue even if error
         }
@@ -209,7 +209,7 @@
          (M4OSA_Char*)"LvPP, copy of pClipList");
 
         if(NULL == mClipList) {
-            LOGE("loadEditSettings: Malloc error");
+            ALOGE("loadEditSettings: Malloc error");
             return M4ERR_ALLOC;
         }
         memset((void *)mClipList,0,
@@ -224,7 +224,7 @@
 
             if(mClipList[i] == NULL) {
 
-                LOGE("loadEditSettings: Allocation error for mClipList[%d]", (int)i);
+                ALOGE("loadEditSettings: Allocation error for mClipList[%d]", (int)i);
                 return M4ERR_ALLOC;
             }
             // Copy plain structure
@@ -239,7 +239,7 @@
 
                 if(NULL == mClipList[i]->pFile)
                 {
-                    LOGE("loadEditSettings : ERROR allocating filename");
+                    ALOGE("loadEditSettings : ERROR allocating filename");
                     return M4ERR_ALLOC;
                 }
 
@@ -248,7 +248,7 @@
                  pSettings->pClipList[i]->filePathSize);
             }
             else {
-                LOGE("NULL file path");
+                ALOGE("NULL file path");
                 return M4ERR_PARAMETER;
             }
 
@@ -270,7 +270,7 @@
              M4VS, (M4OSA_Char*)"effects settings");
 
             if(mEffectsSettings == NULL) {
-                LOGE("loadEffectsSettings: Allocation error");
+                ALOGE("loadEffectsSettings: Allocation error");
                 return M4ERR_ALLOC;
             }
 
@@ -295,7 +295,7 @@
                      M4VS, (M4OSA_Char*)"lvpp framing buffer");
 
                     if(mEffectsSettings[i].xVSS.pFramingBuffer == NULL) {
-                        LOGE("loadEffectsSettings:Alloc error for pFramingBuf");
+                        ALOGE("loadEffectsSettings:Alloc error for pFramingBuf");
                         free(mEffectsSettings);
                         mEffectsSettings = NULL;
                         return M4ERR_ALLOC;
@@ -314,7 +314,7 @@
                          pSettings->Effects[i].xVSS.pFramingBuffer->u_height*3;
                     }
                     else {
-                        LOGE("loadEffectsSettings: wrong RGB type");
+                        ALOGE("loadEffectsSettings: wrong RGB type");
                         free(mEffectsSettings);
                         mEffectsSettings = NULL;
                         return M4ERR_PARAMETER;
@@ -324,7 +324,7 @@
                      (M4OSA_Char*)"framing buffer pac_data");
 
                     if(tmp == NULL) {
-                        LOGE("loadEffectsSettings:Alloc error pFramingBuf pac");
+                        ALOGE("loadEffectsSettings:Alloc error pFramingBuf pac");
                         free(mEffectsSettings);
                         mEffectsSettings = NULL;
                         free(mEffectsSettings[i].xVSS.pFramingBuffer);
@@ -380,7 +380,7 @@
         (M4OSA_Char*)"LvPP, copy of bgmSettings");
 
         if(NULL == mBackgroundAudioSetting) {
-            LOGE("loadEditSettings: mBackgroundAudioSetting Malloc failed");
+            ALOGE("loadEditSettings: mBackgroundAudioSetting Malloc failed");
             return M4ERR_ALLOC;
         }
 
@@ -400,7 +400,7 @@
              mBackgroundAudioSetting->pFile, M4OSA_kFileRead);
 
             if (err != M4NO_ERROR) {
-                LOGE("loadEditSettings: mBackgroundAudio PCM File open failed");
+                ALOGE("loadEditSettings: mBackgroundAudio PCM File open failed");
                 return M4ERR_PARAMETER;
             }
         }
@@ -428,12 +428,12 @@
     ALOGV("startPreview");
 
     if(fromMS > (M4OSA_UInt32)toMs) {
-        LOGE("startPreview: fromMS > toMs");
+        ALOGE("startPreview: fromMS > toMs");
         return M4ERR_PARAMETER;
     }
 
     if(toMs == 0) {
-        LOGE("startPreview: toMs is 0");
+        ALOGE("startPreview: toMs is 0");
         return M4ERR_PARAMETER;
     }
 
@@ -474,7 +474,7 @@
     for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {
         mVePlayer[playerInst] = new VideoEditorPlayer(mNativeWindowRenderer);
         if(mVePlayer[playerInst] == NULL) {
-            LOGE("startPreview:Error creating VideoEditorPlayer %d",playerInst);
+            ALOGE("startPreview:Error creating VideoEditorPlayer %d",playerInst);
             return M4ERR_ALLOC;
         }
         ALOGV("startPreview: object created");
@@ -509,7 +509,7 @@
     else {
         ALOGV("startPreview: fromMS=%d", fromMS);
         if(fromMS >= mClipTotalDuration) {
-            LOGE("startPreview: fromMS >= mClipTotalDuration");
+            ALOGE("startPreview: fromMS >= mClipTotalDuration");
             return M4ERR_PARAMETER;
         }
         for(i=0;i<mNumberClipsInStoryBoard;i++) {
@@ -567,7 +567,7 @@
     else {
         ALOGV("startPreview: toMs=%d", toMs);
         if((M4OSA_UInt32)toMs > mClipTotalDuration) {
-            LOGE("startPreview: toMs > mClipTotalDuration");
+            ALOGE("startPreview: toMs > mClipTotalDuration");
             return M4ERR_PARAMETER;
         }
 
@@ -599,7 +599,7 @@
     // Open the preview process thread
     err = M4OSA_threadSyncOpen(&mThreadContext, (M4OSA_ThreadDoIt)threadProc);
     if (M4NO_ERROR != err) {
-        LOGE("VideoEditorPreviewController:M4OSA_threadSyncOpen error %d", (int) err);
+        ALOGE("VideoEditorPreviewController:M4OSA_threadSyncOpen error %d", (int) err);
         return err;
     }
 
@@ -608,7 +608,7 @@
      (M4OSA_DataOption)PREVIEW_THREAD_STACK_SIZE);
 
     if (M4NO_ERROR != err) {
-        LOGE("VideoEditorPreviewController: threadSyncSetOption error %d", (int) err);
+        ALOGE("VideoEditorPreviewController: threadSyncSetOption error %d", (int) err);
         M4OSA_threadSyncClose(mThreadContext);
         mThreadContext = NULL;
         return err;
@@ -617,7 +617,7 @@
      // Start the thread
      err = M4OSA_threadSyncStart(mThreadContext, (M4OSA_Void*)this);
      if (M4NO_ERROR != err) {
-        LOGE("VideoEditorPreviewController: threadSyncStart error %d", (int) err);
+        ALOGE("VideoEditorPreviewController: threadSyncStart error %d", (int) err);
         M4OSA_threadSyncClose(mThreadContext);
         mThreadContext = NULL;
         return err;
@@ -651,7 +651,7 @@
 
         err = M4OSA_threadSyncClose(mThreadContext);
         if(err != M4NO_ERROR) {
-            LOGE("stopPreview: error 0x%x in trying to close thread", (unsigned int)err);
+            ALOGE("stopPreview: error 0x%x in trying to close thread", (unsigned int)err);
             // Continue even if error
         }
 
@@ -751,7 +751,7 @@
             outputBufferWidth, outputBufferHeight);
 
         if(mTarget == NULL) {
-            LOGE("renderPreviewFrame: cannot create PreviewRenderer");
+            ALOGE("renderPreviewFrame: cannot create PreviewRenderer");
             return M4ERR_ALLOC;
         }
     }
@@ -818,7 +818,7 @@
             mOutputVideoWidth, mOutputVideoHeight);
 
         if(mTarget == NULL) {
-            LOGE("renderPreviewFrame: cannot create PreviewRenderer");
+            ALOGE("renderPreviewFrame: cannot create PreviewRenderer");
             return M4ERR_ALLOC;
         }
     }
@@ -831,7 +831,7 @@
                   pFrameStr->uiFrameWidth, pFrameStr->uiFrameHeight,
                   pFrameStr->videoRotationDegree);
         if (M4NO_ERROR != err) {
-            LOGE("renderPreviewFrame: cannot rotate video, err 0x%x", (unsigned int)err);
+            ALOGE("renderPreviewFrame: cannot rotate video, err 0x%x", (unsigned int)err);
             delete mTarget;
             mTarget = NULL;
             return err;
@@ -898,7 +898,7 @@
              (M4OSA_Void *)pixelArray);
 
             if(err != M4NO_ERROR) {
-                LOGE("renderPreviewFrame: applyVideoEffect error 0x%x", (unsigned int)err);
+                ALOGE("renderPreviewFrame: applyVideoEffect error 0x%x", (unsigned int)err);
                 delete mTarget;
                 mTarget = NULL;
                 free(pixelArray);
@@ -914,7 +914,7 @@
              pFrameStr->uiFrameHeight, (M4OSA_Void *)pixelArray);
 
             if(err != M4NO_ERROR) {
-                LOGE("renderPreviewFrame:doImageRenderingMode error 0x%x", (unsigned int)err);
+                ALOGE("renderPreviewFrame:doImageRenderingMode error 0x%x", (unsigned int)err);
                 delete mTarget;
                 mTarget = NULL;
                 free(pixelArray);
@@ -930,7 +930,7 @@
          pFrameStr->uiFrameHeight, (M4OSA_Void *)pixelArray);
 
         if(err != M4NO_ERROR) {
-            LOGE("renderPreviewFrame: doImageRenderingMode error 0x%x", (unsigned int)err);
+            ALOGE("renderPreviewFrame: doImageRenderingMode error 0x%x", (unsigned int)err);
             delete mTarget;
             mTarget = NULL;
             free(pixelArray);
@@ -1212,7 +1212,7 @@
           // Always log errors.
           // ext1: Media framework error code.
           // ext2: Implementation dependant error code.
-            LOGE("MEDIA_ERROR; error (%d, %d)", ext1, ext2);
+            ALOGE("MEDIA_ERROR; error (%d, %d)", ext1, ext2);
             if(pController->mJniCallback != NULL) {
                 pController->mJniCallback(pController->mJniCookie,
                  MSG_TYPE_PLAYER_ERROR, &err_val);
@@ -1451,7 +1451,7 @@
 
     err = applyRenderingMode(planeIn, planeOut, mRenderingMode);
     if(err != M4NO_ERROR) {
-        LOGE("doImageRenderingMode: applyRenderingMode returned err=0x%x", (unsigned int)err);
+        ALOGE("doImageRenderingMode: applyRenderingMode returned err=0x%x", (unsigned int)err);
     }
     return err;
 }
diff --git a/libvideoeditor/lvpp/VideoEditorTools.cpp b/libvideoeditor/lvpp/VideoEditorTools.cpp
index 94fc61f..a35fb46 100755
--- a/libvideoeditor/lvpp/VideoEditorTools.cpp
+++ b/libvideoeditor/lvpp/VideoEditorTools.cpp
@@ -2861,7 +2861,7 @@
 
     M4OSA_UInt8 *pTmpData = (M4OSA_UInt8*) M4OSA_32bitAlignedMalloc(frameSize_argb, M4VS, (M4OSA_Char*)"Image argb data");
     if(pTmpData == M4OSA_NULL) {
-        LOGE("Failed to allocate memory for Image clip");
+        ALOGE("Failed to allocate memory for Image clip");
         return M4ERR_ALLOC;
     }
 
@@ -2870,14 +2870,14 @@
 
     if((lerr != M4NO_ERROR) || (lImageFileFp == M4OSA_NULL))
     {
-        LOGE("LVPreviewController: Can not open the file ");
+        ALOGE("LVPreviewController: Can not open the file ");
         free(pTmpData);
         return M4ERR_FILE_NOT_FOUND;
     }
     lerr = M4OSA_fileReadData(lImageFileFp, (M4OSA_MemAddr8)pTmpData, &frameSize_argb);
     if(lerr != M4NO_ERROR)
     {
-        LOGE("LVPreviewController: can not read the data ");
+        ALOGE("LVPreviewController: can not read the data ");
         M4OSA_fileReadClose(lImageFileFp);
         free(pTmpData);
         return lerr;
@@ -2888,7 +2888,7 @@
     rgbPlane.pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(frameSize, M4VS, (M4OSA_Char*)"Image clip RGB888 data");
     if(rgbPlane.pac_data == M4OSA_NULL)
     {
-        LOGE("Failed to allocate memory for Image clip");
+        ALOGE("Failed to allocate memory for Image clip");
         free(pTmpData);
         return M4ERR_ALLOC;
     }
@@ -2904,7 +2904,7 @@
 #ifdef FILE_DUMP
     FILE *fp = fopen("/sdcard/Input/test_rgb.raw", "wb");
     if(fp == NULL)
-        LOGE("Errors file can not be created");
+        ALOGE("Errors file can not be created");
     else {
         fwrite(rgbPlane.pac_data, frameSize, 1, fp);
         fclose(fp);
@@ -2940,15 +2940,15 @@
         //err = M4VIFI_BGR888toYUV420(M4OSA_NULL, &rgbPlane, yuvPlane);
         if(err != M4NO_ERROR)
         {
-            LOGE("error when converting from RGB to YUV: 0x%x\n", (unsigned int)err);
+            ALOGE("error when converting from RGB to YUV: 0x%x\n", (unsigned int)err);
         }
         free(rgbPlane.pac_data);
 
-        //LOGE("RGB to YUV done");
+        //ALOGE("RGB to YUV done");
 #ifdef FILE_DUMP
         FILE *fp1 = fopen("/sdcard/Input/test_yuv.raw", "wb");
         if(fp1 == NULL)
-            LOGE("Errors file can not be created");
+            ALOGE("Errors file can not be created");
         else {
             fwrite(yuvPlane[0].pac_data, yuvPlane[0].u_height * yuvPlane[0].u_width * 1.5, 1, fp1);
             fclose(fp1);
@@ -3249,7 +3249,7 @@
          lum_factor, NULL);
 
     if(err != M4NO_ERROR) {
-        LOGE("M4VFL_modifyLumaWithScale(%d) error %d", videoEffect, (int)err);
+        ALOGE("M4VFL_modifyLumaWithScale(%d) error %d", videoEffect, (int)err);
 
         if(NULL != buffer1) {
             free(buffer1);
@@ -3287,7 +3287,7 @@
      (M4OSA_Char*)("lvpp finalOutputBuffer"));
 
     if(finalOutputBuffer == NULL) {
-        LOGE("applyEffectsAndRenderingMode: malloc error");
+        ALOGE("applyEffectsAndRenderingMode: malloc error");
         return M4ERR_ALLOC;
     }
 
@@ -3296,7 +3296,7 @@
      ((params->videoHeight*params->videoWidth*3)>>1), M4VS, (M4OSA_Char*)("lvpp colorBuffer"));
 
     if(tempOutputBuffer == NULL) {
-        LOGE("applyEffectsAndRenderingMode: malloc error tempOutputBuffer");
+        ALOGE("applyEffectsAndRenderingMode: malloc error tempOutputBuffer");
         if(NULL != finalOutputBuffer) {
             free(finalOutputBuffer);
             finalOutputBuffer = NULL;
@@ -3420,7 +3420,7 @@
              M4xVSS_kVideoEffectType_Fifties);
 
             if(err != M4NO_ERROR) {
-                LOGE("M4VSS3GPP_externalVideoEffectFifties error 0x%x", (unsigned int)err);
+                ALOGE("M4VSS3GPP_externalVideoEffectFifties error 0x%x", (unsigned int)err);
 
                 if(NULL != finalOutputBuffer) {
                     free(finalOutputBuffer);
@@ -3583,11 +3583,11 @@
     uint32_t frameWidth, frameHeight;
 
     if (pWidth == NULL) {
-        LOGE("getVideoFrameSizeByResolution invalid pointer for pWidth");
+        ALOGE("getVideoFrameSizeByResolution invalid pointer for pWidth");
         return android::BAD_VALUE;
     }
     if (pHeight == NULL) {
-        LOGE("getVideoFrameSizeByResolution invalid pointer for pHeight");
+        ALOGE("getVideoFrameSizeByResolution invalid pointer for pHeight");
         return android::BAD_VALUE;
     }
 
@@ -3663,7 +3663,7 @@
             break;
 
         default:
-            LOGE("Unsupported video resolution %d.", resolution);
+            ALOGE("Unsupported video resolution %d.", resolution);
             return android::BAD_VALUE;
     }
 
@@ -3835,7 +3835,7 @@
     M4VIFI_ImagePlane planeIn[3], planeOut[3];
 
     if (pBuffer == M4OSA_NULL) {
-        LOGE("applyVideoRotation: NULL input frame");
+        ALOGE("applyVideoRotation: NULL input frame");
         return M4ERR_PARAMETER;
     }
     M4OSA_UInt8* outPtr = (M4OSA_UInt8 *)M4OSA_32bitAlignedMalloc(
@@ -3873,7 +3873,7 @@
             break;
 
         default:
-            LOGE("invalid rotation param %d", (int)rotation);
+            ALOGE("invalid rotation param %d", (int)rotation);
             err = M4ERR_PARAMETER;
             break;
     }
diff --git a/libvideoeditor/vss/src/M4VD_EXTERNAL_BitstreamParser.c b/libvideoeditor/vss/src/M4VD_EXTERNAL_BitstreamParser.c
index 91952d0..cc67e72 100755
--- a/libvideoeditor/vss/src/M4VD_EXTERNAL_BitstreamParser.c
+++ b/libvideoeditor/vss/src/M4VD_EXTERNAL_BitstreamParser.c
@@ -498,7 +498,7 @@
     }
 
     if ((DSISize <= index) || (pDSI == M4OSA_NULL)) {
-        LOGE("getAVCProfileAndLevel: DSI is invalid");
+        ALOGE("getAVCProfileAndLevel: DSI is invalid");
         *pProfile = M4VIDEOEDITING_VIDEO_UNKNOWN_PROFILE;
         *pLevel = M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL;
         return M4ERR_PARAMETER;
@@ -596,12 +596,12 @@
     M4OSA_UInt16 index = 7; /* the 5th and 6th bytes contain the level and profile */
 
     if ((pProfile == M4OSA_NULL) || (pLevel == M4OSA_NULL)) {
-        LOGE("getH263ProfileAndLevel invalid pointer for pProfile");
+        ALOGE("getH263ProfileAndLevel invalid pointer for pProfile");
         return M4ERR_PARAMETER;
     }
 
     if ((DSISize < index) || (pDSI == M4OSA_NULL)) {
-        LOGE("getH263ProfileAndLevel: DSI is invalid");
+        ALOGE("getH263ProfileAndLevel: DSI is invalid");
         *pProfile = M4VIDEOEDITING_VIDEO_UNKNOWN_PROFILE;
         *pLevel = M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL;
         return M4ERR_PARAMETER;
diff --git a/libvideoeditor/vss/stagefrightshells/src/VideoEditorUtils.cpp b/libvideoeditor/vss/stagefrightshells/src/VideoEditorUtils.cpp
index 95591e9..80a7f0b 100755
--- a/libvideoeditor/vss/stagefrightshells/src/VideoEditorUtils.cpp
+++ b/libvideoeditor/vss/stagefrightshells/src/VideoEditorUtils.cpp
@@ -40,7 +40,7 @@
 /*---------------------*/
 /*  DEBUG LEVEL SETUP  */
 /*---------------------*/
-#define LOG1 LOGE    /*ERRORS Logging*/
+#define LOG1 ALOGE    /*ERRORS Logging*/
 #define LOG2 ALOGI    /*WARNING Logging*/
 #define LOG3 //ALOGV  /*COMMENTS Logging*/
 
@@ -232,14 +232,14 @@
     const uint8_t *nextStartCode = &data[length - bytesLeft];
     *paramSetLen = nextStartCode - data;
     if (*paramSetLen == 0) {
-        LOGE("Param set is malformed, since its length is 0");
+        ALOGE("Param set is malformed, since its length is 0");
         return NULL;
     }
 
     AVCParamSet paramSet(*paramSetLen, data);
     if (type == kNalUnitTypeSeqParamSet) {
         if (*paramSetLen < 4) {
-            LOGE("Seq parameter set malformed");
+            ALOGE("Seq parameter set malformed");
             return NULL;
         }
         if (pC->mSeqParamSets.empty()) {
@@ -267,17 +267,17 @@
     //ALOGV("buildAVCCodecSpecificData");
 
     if ( (pOutputData == NULL) || (pOutputSize == NULL) ) {
-        LOGE("output is invalid");
+        ALOGE("output is invalid");
         return ERROR_MALFORMED;
     }
 
     if (*pOutputData != NULL) {
-        LOGE("Already have codec specific data");
+        ALOGE("Already have codec specific data");
         return ERROR_MALFORMED;
     }
 
     if (size < 4) {
-        LOGE("Codec specific data length too short: %d", size);
+        ALOGE("Codec specific data length too short: %d", size);
         return ERROR_MALFORMED;
     }
 
@@ -286,7 +286,7 @@
         // 2 bytes for each of the parameter set length field
         // plus the 7 bytes for the header
         if (size < 4 + 7) {
-            LOGE("Codec specific data length too short: %d", size);
+            ALOGE("Codec specific data length too short: %d", size);
             return ERROR_MALFORMED;
         }
 
@@ -313,7 +313,7 @@
         type = (*(tmp + 4)) & 0x1F;
         if (type == kNalUnitTypeSeqParamSet) {
             if (gotPps) {
-                LOGE("SPS must come before PPS");
+                ALOGE("SPS must come before PPS");
                 return ERROR_MALFORMED;
             }
             if (!gotSps) {
@@ -323,7 +323,7 @@
                 &paramSetLen);
         } else if (type == kNalUnitTypePicParamSet) {
             if (!gotSps) {
-                LOGE("SPS must come before PPS");
+                ALOGE("SPS must come before PPS");
                 return ERROR_MALFORMED;
             }
             if (!gotPps) {
@@ -332,7 +332,7 @@
             nextStartCode = parseParamSet(&ctx, tmp + 4, bytesLeft - 4, type,
                 &paramSetLen);
         } else {
-            LOGE("Only SPS and PPS Nal units are expected");
+            ALOGE("Only SPS and PPS Nal units are expected");
             return ERROR_MALFORMED;
         }
 
@@ -350,12 +350,12 @@
         // Check on the number of seq parameter sets
         size_t nSeqParamSets = ctx.mSeqParamSets.size();
         if (nSeqParamSets == 0) {
-            LOGE("Cound not find sequence parameter set");
+            ALOGE("Cound not find sequence parameter set");
             return ERROR_MALFORMED;
         }
 
         if (nSeqParamSets > 0x1F) {
-            LOGE("Too many seq parameter sets (%d) found", nSeqParamSets);
+            ALOGE("Too many seq parameter sets (%d) found", nSeqParamSets);
             return ERROR_MALFORMED;
         }
     }
@@ -364,11 +364,11 @@
         // Check on the number of pic parameter sets
         size_t nPicParamSets = ctx.mPicParamSets.size();
         if (nPicParamSets == 0) {
-            LOGE("Cound not find picture parameter set");
+            ALOGE("Cound not find picture parameter set");
             return ERROR_MALFORMED;
         }
         if (nPicParamSets > 0xFF) {
-            LOGE("Too many pic parameter sets (%d) found", nPicParamSets);
+            ALOGE("Too many pic parameter sets (%d) found", nPicParamSets);
             return ERROR_MALFORMED;
         }
     }
@@ -402,7 +402,7 @@
         uint16_t seqParamSetLength = it->mLength;
         header[0] = seqParamSetLength >> 8;
         header[1] = seqParamSetLength & 0xff;
-        //LOGE("### SPS %d %d %d", seqParamSetLength, header[0], header[1]);
+        //ALOGE("### SPS %d %d %d", seqParamSetLength, header[0], header[1]);
 
         // SPS NAL unit (sequence parameter length bytes)
         memcpy(&header[2], it->mData, seqParamSetLength);
@@ -419,7 +419,7 @@
         uint16_t picParamSetLength = it->mLength;
         header[0] = picParamSetLength >> 8;
         header[1] = picParamSetLength & 0xff;
-//LOGE("### PPS %d %d %d", picParamSetLength, header[0], header[1]);
+//ALOGE("### PPS %d %d %d", picParamSetLength, header[0], header[1]);
 
         // PPS Nal unit (picture parameter set length bytes)
         memcpy(&header[2], it->mData, picParamSetLength);
diff --git a/libvideoeditor/vss/stagefrightshells/src/VideoEditorVideoDecoder.cpp b/libvideoeditor/vss/stagefrightshells/src/VideoEditorVideoDecoder.cpp
index 6e2a90f..5f856f9 100755
--- a/libvideoeditor/vss/stagefrightshells/src/VideoEditorVideoDecoder.cpp
+++ b/libvideoeditor/vss/stagefrightshells/src/VideoEditorVideoDecoder.cpp
@@ -100,13 +100,13 @@
 
     if (!mStarted) {
         if (mFormat->findInt32(kKeyMaxInputSize, &mMaxAUSize) == false) {
-            LOGE("Could not find kKeyMaxInputSize");
+            ALOGE("Could not find kKeyMaxInputSize");
             return ERROR_MALFORMED;
         }
 
         mGroup = new MediaBufferGroup;
         if (mGroup == NULL) {
-            LOGE("FATAL: memory limitation ! ");
+            ALOGE("FATAL: memory limitation ! ");
             return NO_MEMORY;
         }
 
@@ -153,7 +153,7 @@
         MediaSource::ReadOptions::SeekMode mode;
         options->getSeekTo(&time_us, &mode);
         if (mode != MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC) {
-            LOGE("Unexpected read options");
+            ALOGE("Unexpected read options");
             return BAD_VALUE;
         }
 
@@ -171,7 +171,7 @@
             rapTime -= 40000;
             if(rapTime < 0) rapTime = 0;
         } else if (err != OK) {
-            LOGE("get rap time error = 0x%x\n", (uint32_t)err);
+            ALOGE("get rap time error = 0x%x\n", (uint32_t)err);
             return UNKNOWN_ERROR;
         }
 
@@ -181,7 +181,7 @@
                    &rapTime);
 
         if (err != OK) {
-            LOGE("jump err = 0x%x\n", (uint32_t)err);
+            ALOGE("jump err = 0x%x\n", (uint32_t)err);
             return BAD_VALUE;
         }
     }
@@ -1397,7 +1397,7 @@
             }
             continue;
         } else if (errStatus != OK) {
-            LOGE("VideoEditorVideoDecoder_decode ERROR:0x%x(%d)",
+            ALOGE("VideoEditorVideoDecoder_decode ERROR:0x%x(%d)",
                 errStatus,errStatus);
             lerr = errStatus;
             goto VIDEOEDITOR_VideoDecode_cleanUP;
@@ -1485,7 +1485,7 @@
             pDecShellContext->mGivenHeight,  // decoderHeight
             pDecShellContext->mCropRect,  // decoderRect
             tmpDecBuffer->pData /* dstBits */) < 0) {
-            LOGE("convertDecoderOutputToI420 failed");
+            ALOGE("convertDecoderOutputToI420 failed");
             lerr = M4ERR_NOT_IMPLEMENTED;
         }
     } else if (pDecShellContext->decOuputColorFormat == OMX_COLOR_FormatYUV420Planar) {
@@ -1540,7 +1540,7 @@
             }
         }
     } else {
-        LOGE("VideoDecoder_decode: unexpected color format 0x%X",
+        ALOGE("VideoDecoder_decode: unexpected color format 0x%X",
             pDecShellContext->decOuputColorFormat);
         lerr = M4ERR_PARAMETER;
     }
diff --git a/libvideoeditor/vss/stagefrightshells/src/VideoEditorVideoEncoder.cpp b/libvideoeditor/vss/stagefrightshells/src/VideoEditorVideoEncoder.cpp
index 49ac2f1..3ec1a73 100755
--- a/libvideoeditor/vss/stagefrightshells/src/VideoEditorVideoEncoder.cpp
+++ b/libvideoeditor/vss/stagefrightshells/src/VideoEditorVideoEncoder.cpp
@@ -992,7 +992,7 @@
                     encoderWidth, encoderHeight,
                     encoderRect,
                     (uint8_t*)newBuffer->data() + newBuffer->range_offset()) < 0) {
-                    LOGE("convertI420ToEncoderInput failed");
+                    ALOGE("convertI420ToEncoderInput failed");
                 }
 
                 // switch to new buffer
