diff --git a/talk/app/webrtc/java/android/org/webrtc/Camera2Enumerator.java b/talk/app/webrtc/java/android/org/webrtc/Camera2Enumerator.java
index 097d1cd..ae164cb 100644
--- a/talk/app/webrtc/java/android/org/webrtc/Camera2Enumerator.java
+++ b/talk/app/webrtc/java/android/org/webrtc/Camera2Enumerator.java
@@ -34,11 +34,11 @@
 import android.hardware.camera2.params.StreamConfigurationMap;
 import android.os.Build;
 import android.os.SystemClock;
+import android.util.Log;
 import android.util.Range;
 import android.util.Size;
 
 import org.webrtc.CameraEnumerationAndroid.CaptureFormat;
-import org.webrtc.Logging;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -69,14 +69,14 @@
       if (cachedSupportedFormats.containsKey(cameraId)) {
         return cachedSupportedFormats.get(cameraId);
       }
-      Logging.d(TAG, "Get supported formats for camera index " + cameraId + ".");
+      Log.d(TAG, "Get supported formats for camera index " + cameraId + ".");
       final long startTimeMs = SystemClock.elapsedRealtime();
 
       final CameraCharacteristics cameraCharacteristics;
       try {
         cameraCharacteristics = cameraManager.getCameraCharacteristics(Integer.toString(cameraId));
       } catch (Exception ex) {
-        Logging.e(TAG, "getCameraCharacteristics(): " + ex);
+        Log.e(TAG, "getCameraCharacteristics(): " + ex);
         return new ArrayList<CaptureFormat>();
       }
 
@@ -111,7 +111,7 @@
       }
       cachedSupportedFormats.put(cameraId, formatList);
       final long endTimeMs = SystemClock.elapsedRealtime();
-      Logging.d(TAG, "Get supported formats for camera index " + cameraId + " done."
+      Log.d(TAG, "Get supported formats for camera index " + cameraId + " done."
           + " Time spent: " + (endTimeMs - startTimeMs) + " ms.");
       return formatList;
     }
diff --git a/talk/app/webrtc/java/android/org/webrtc/CameraEnumerationAndroid.java b/talk/app/webrtc/java/android/org/webrtc/CameraEnumerationAndroid.java
index 5b623ce..c8f9a30 100644
--- a/talk/app/webrtc/java/android/org/webrtc/CameraEnumerationAndroid.java
+++ b/talk/app/webrtc/java/android/org/webrtc/CameraEnumerationAndroid.java
@@ -29,17 +29,14 @@
 
 import static java.lang.Math.abs;
 import static java.lang.Math.ceil;
-
 import android.hardware.Camera;
+import android.util.Log;
 import android.graphics.ImageFormat;
 
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
 
-import org.webrtc.Logging;
-
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
@@ -148,7 +145,7 @@
     try {
       Camera.getCameraInfo(index, info);
     } catch (Exception e) {
-      Logging.e(TAG, "getCameraInfo failed on index " + index,e);
+      Log.e(TAG, "getCameraInfo failed on index " + index,e);
       return null;
     }
 
@@ -180,7 +177,7 @@
       json_format.put("framerate", (format.maxFramerate + 999) / 1000);
       json_formats.put(json_format);
     }
-    Logging.d(TAG, "Supported formats for camera " + id + ": "
+    Log.d(TAG, "Supported formats for camera " + id + ": "
         +  json_formats.toString(2));
     return json_formats.toString();
   }
@@ -199,7 +196,7 @@
   public static int[] getFramerateRange(Camera.Parameters parameters, final int framerate) {
     List<int[]> listFpsRange = parameters.getSupportedPreviewFpsRange();
     if (listFpsRange.isEmpty()) {
-      Logging.w(TAG, "No supported preview fps range");
+      Log.w(TAG, "No supported preview fps range");
       return new int[]{0, 0};
     }
     return Collections.min(listFpsRange,
@@ -230,7 +227,7 @@
           return getDeviceName(i);
         }
       } catch (Exception e) {
-        Logging.e(TAG, "getCameraInfo() failed on index " + i, e);
+        Log.e(TAG, "getCameraInfo() failed on index " + i, e);
       }
     }
     return null;
diff --git a/talk/app/webrtc/java/android/org/webrtc/CameraEnumerator.java b/talk/app/webrtc/java/android/org/webrtc/CameraEnumerator.java
index 2f35dc3..0e6b978 100644
--- a/talk/app/webrtc/java/android/org/webrtc/CameraEnumerator.java
+++ b/talk/app/webrtc/java/android/org/webrtc/CameraEnumerator.java
@@ -29,9 +29,9 @@
 
 import android.hardware.Camera;
 import android.os.SystemClock;
+import android.util.Log;
 
 import org.webrtc.CameraEnumerationAndroid.CaptureFormat;
-import org.webrtc.Logging;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -58,16 +58,16 @@
   }
 
   private List<CaptureFormat> enumerateFormats(int cameraId) {
-    Logging.d(TAG, "Get supported formats for camera index " + cameraId + ".");
+    Log.d(TAG, "Get supported formats for camera index " + cameraId + ".");
     final long startTimeMs = SystemClock.elapsedRealtime();
     final Camera.Parameters parameters;
     Camera camera = null;
     try {
-      Logging.d(TAG, "Opening camera with index " + cameraId);
+      Log.d(TAG, "Opening camera with index " + cameraId);
       camera = Camera.open(cameraId);
       parameters = camera.getParameters();
     } catch (RuntimeException e) {
-      Logging.e(TAG, "Open camera failed on camera index " + cameraId, e);
+      Log.e(TAG, "Open camera failed on camera index " + cameraId, e);
       return new ArrayList<CaptureFormat>();
     } finally {
       if (camera != null) {
@@ -91,11 +91,11 @@
         formatList.add(new CaptureFormat(size.width, size.height, minFps, maxFps));
       }
     } catch (Exception e) {
-      Logging.e(TAG, "getSupportedFormats() failed on camera index " + cameraId, e);
+      Log.e(TAG, "getSupportedFormats() failed on camera index " + cameraId, e);
     }
 
     final long endTimeMs = SystemClock.elapsedRealtime();
-    Logging.d(TAG, "Get supported formats for camera index " + cameraId + " done."
+    Log.d(TAG, "Get supported formats for camera index " + cameraId + " done."
         + " Time spent: " + (endTimeMs - startTimeMs) + " ms.");
     return formatList;
   }
diff --git a/talk/app/webrtc/java/android/org/webrtc/EglBase.java b/talk/app/webrtc/java/android/org/webrtc/EglBase.java
index 2aa2807..20af8ec 100644
--- a/talk/app/webrtc/java/android/org/webrtc/EglBase.java
+++ b/talk/app/webrtc/java/android/org/webrtc/EglBase.java
@@ -32,10 +32,9 @@
 import android.opengl.EGLContext;
 import android.opengl.EGLDisplay;
 import android.opengl.EGLSurface;
+import android.util.Log;
 import android.view.Surface;
 
-import org.webrtc.Logging;
-
 /**
  * Holds EGL state and utility methods for handling an EGLContext, an EGLDisplay, and an EGLSurface.
  */
@@ -53,7 +52,7 @@
   private EGLSurface eglSurface = EGL14.EGL_NO_SURFACE;
 
   public static boolean isEGL14Supported() {
-    Logging.d(TAG, "SDK version: " + CURRENT_SDK_VERSION);
+    Log.d(TAG, "SDK version: " + CURRENT_SDK_VERSION);
     return (CURRENT_SDK_VERSION >= EGL14_SDK_VERSION);
   }
 
@@ -87,7 +86,7 @@
   public void createSurface(Surface surface) {
     checkIsNotReleased();
     if (configType == ConfigType.PIXEL_BUFFER) {
-      Logging.w(TAG, "This EGL context is configured for PIXEL_BUFFER, but uses regular Surface");
+      Log.w(TAG, "This EGL context is configured for PIXEL_BUFFER, but uses regular Surface");
     }
     if (eglSurface != EGL14.EGL_NO_SURFACE) {
       throw new RuntimeException("Already has an EGLSurface");
diff --git a/talk/app/webrtc/java/android/org/webrtc/GlShader.java b/talk/app/webrtc/java/android/org/webrtc/GlShader.java
index 966f0f5..3014aab 100644
--- a/talk/app/webrtc/java/android/org/webrtc/GlShader.java
+++ b/talk/app/webrtc/java/android/org/webrtc/GlShader.java
@@ -28,8 +28,7 @@
 package org.webrtc;
 
 import android.opengl.GLES20;
-
-import org.webrtc.Logging;
+import android.util.Log;
 
 import java.nio.FloatBuffer;
 
@@ -46,7 +45,7 @@
     GLES20.glCompileShader(shader);
     GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, result, 0);
     if (result[0] != GLES20.GL_TRUE) {
-      Logging.e(TAG, "Could not compile shader " + shaderType + ":" +
+      Log.e(TAG, "Could not compile shader " + shaderType + ":" +
           GLES20.glGetShaderInfoLog(shader));
       throw new RuntimeException(GLES20.glGetShaderInfoLog(shader));
     }
@@ -73,7 +72,7 @@
     };
     GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
     if (linkStatus[0] != GLES20.GL_TRUE) {
-      Logging.e(TAG, "Could not link program: " +
+      Log.e(TAG, "Could not link program: " +
           GLES20.glGetProgramInfoLog(program));
       throw new RuntimeException(GLES20.glGetProgramInfoLog(program));
     }
@@ -125,7 +124,7 @@
   }
 
   public void release() {
-    Logging.d(TAG, "Deleting shader.");
+    Log.d(TAG, "Deleting shader.");
     // Flag shaders for deletion (does not delete until no longer attached to a program).
     if (vertexShader != -1) {
       GLES20.glDeleteShader(vertexShader);
diff --git a/talk/app/webrtc/java/android/org/webrtc/GlUtil.java b/talk/app/webrtc/java/android/org/webrtc/GlUtil.java
index 7a2f1bc..8b43579 100644
--- a/talk/app/webrtc/java/android/org/webrtc/GlUtil.java
+++ b/talk/app/webrtc/java/android/org/webrtc/GlUtil.java
@@ -37,7 +37,6 @@
  * Some OpenGL static utility functions.
  */
 public class GlUtil {
-  private static final String TAG = "GlUtil";
   private GlUtil() {}
 
   // Assert that no OpenGL ES 2.0 error has been raised.
diff --git a/talk/app/webrtc/java/android/org/webrtc/SurfaceViewRenderer.java b/talk/app/webrtc/java/android/org/webrtc/SurfaceViewRenderer.java
index c319a06..95cceff 100644
--- a/talk/app/webrtc/java/android/org/webrtc/SurfaceViewRenderer.java
+++ b/talk/app/webrtc/java/android/org/webrtc/SurfaceViewRenderer.java
@@ -27,8 +27,6 @@
 
 package org.webrtc;
 
-import java.nio.ByteBuffer;
-
 import android.content.Context;
 import android.graphics.Point;
 import android.graphics.SurfaceTexture;
@@ -38,11 +36,10 @@
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
 
-import org.webrtc.Logging;
-
 /**
  * Implements org.webrtc.VideoRenderer.Callbacks by displaying the video stream on a SurfaceView.
  * renderFrame() is asynchronous to avoid blocking the calling thread.
@@ -147,7 +144,7 @@
     if (renderThreadHandler != null) {
       throw new IllegalStateException("Already initialized");
     }
-    Logging.d(TAG, "Initializing");
+    Log.d(TAG, "Initializing");
     this.rendererEvents = rendererEvents;
     renderThread = new HandlerThread(TAG);
     renderThread.start();
@@ -164,7 +161,7 @@
   public void release() {
     synchronized (threadLock) {
       if (renderThreadHandler == null) {
-        Logging.d(TAG, "Already released");
+        Log.d(TAG, "Already released");
         return;
       }
       // Release EGL and GL resources on render thread.
@@ -224,7 +221,7 @@
     }
     synchronized (threadLock) {
       if (renderThreadHandler == null) {
-        Logging.d(TAG, "Dropping frame - SurfaceViewRenderer not initialized or already released.");
+        Log.d(TAG, "Dropping frame - SurfaceViewRenderer not initialized or already released.");
       } else {
         synchronized (frameLock) {
           if (pendingFrame == null) {
@@ -284,7 +281,7 @@
   // SurfaceHolder.Callback interface.
   @Override
   public void surfaceCreated(final SurfaceHolder holder) {
-    Logging.d(TAG, "Surface created");
+    Log.d(TAG, "Surface created");
     runOnRenderThread(new Runnable() {
       @Override public void run() {
         eglBase.createSurface(holder.getSurface());
@@ -297,7 +294,7 @@
 
   @Override
   public void surfaceDestroyed(SurfaceHolder holder) {
-    Logging.d(TAG, "Surface destroyed");
+    Log.d(TAG, "Surface destroyed");
     synchronized (layoutLock) {
       surfaceWidth = 0;
       surfaceHeight = 0;
@@ -311,7 +308,7 @@
 
   @Override
   public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
-    Logging.d(TAG, "Surface changed: " + width + "x" + height);
+    Log.d(TAG, "Surface changed: " + width + "x" + height);
     synchronized (layoutLock) {
       surfaceWidth = width;
       surfaceHeight = height;
@@ -338,7 +335,7 @@
     synchronized (layoutLock) {
       final Point desiredLayoutSize = getDesiredLayoutSize();
       if (desiredLayoutSize.x != layoutWidth || desiredLayoutSize.y != layoutHeight) {
-        Logging.d(TAG, "Requesting new layout with size: "
+        Log.d(TAG, "Requesting new layout with size: "
             + desiredLayoutSize.x + "x" + desiredLayoutSize.y);
         // Request layout update on UI thread.
         post(new Runnable() {
@@ -359,7 +356,7 @@
    */
   private void renderFrameOnRenderThread() {
     if (eglBase == null || !eglBase.hasSurface()) {
-      Logging.d(TAG, "No surface to draw on");
+      Log.d(TAG, "No surface to draw on");
       return;
     }
     if (!checkConsistentLayout()) {
@@ -452,10 +449,10 @@
         if (rendererEvents != null) {
           final String id = getResources().getResourceEntryName(getId());
           if (frameWidth == 0 || frameHeight == 0) {
-            Logging.d(TAG, "ID: " + id + ". Reporting first rendered frame.");
+            Log.d(TAG, "ID: " + id + ". Reporting first rendered frame.");
             rendererEvents.onFirstFrameRendered();
           }
-          Logging.d(TAG, "ID: " + id + ". Reporting frame resolution changed to "
+          Log.d(TAG, "ID: " + id + ". Reporting frame resolution changed to "
               + frame.width + "x" + frame.height + " with rotation " + frame.rotationDegree);
           rendererEvents.onFrameResolutionChanged(frame.width, frame.height, frame.rotationDegree);
         }
@@ -468,13 +465,13 @@
 
   private void logStatistics() {
     synchronized (statisticsLock) {
-      Logging.d(TAG, "ID: " + getResources().getResourceEntryName(getId()) + ". Frames received: "
+      Log.d(TAG, "ID: " + getResources().getResourceEntryName(getId()) + ". Frames received: "
           + framesReceived + ". Dropped: " + framesDropped + ". Rendered: " + framesRendered);
       if (framesReceived > 0 && framesRendered > 0) {
         final long timeSinceFirstFrameNs = System.nanoTime() - firstFrameTimeNs;
-        Logging.d(TAG, "Duration: " + (int) (timeSinceFirstFrameNs / 1e6) +
+        Log.d(TAG, "Duration: " + (int) (timeSinceFirstFrameNs / 1e6) +
             " ms. FPS: " + (float) framesRendered * 1e9 / timeSinceFirstFrameNs);
-        Logging.d(TAG, "Average render time: "
+        Log.d(TAG, "Average render time: "
             + (int) (renderTimeNs / (1000 * framesRendered)) + " us.");
       }
     }
diff --git a/talk/app/webrtc/java/android/org/webrtc/VideoCapturerAndroid.java b/talk/app/webrtc/java/android/org/webrtc/VideoCapturerAndroid.java
index ebd858a..dc3f8e8 100644
--- a/talk/app/webrtc/java/android/org/webrtc/VideoCapturerAndroid.java
+++ b/talk/app/webrtc/java/android/org/webrtc/VideoCapturerAndroid.java
@@ -36,13 +36,12 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.SystemClock;
+import android.util.Log;
 import android.view.Surface;
 import android.view.WindowManager;
 
 import org.json.JSONException;
-
 import org.webrtc.CameraEnumerationAndroid.CaptureFormat;
-import org.webrtc.Logging;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
@@ -106,7 +105,7 @@
       } else {
         errorMessage = "Camera error: " + error;
       }
-      Logging.e(TAG, errorMessage);
+      Log.e(TAG, errorMessage);
       if (errorHandler != null) {
         errorHandler.onCameraError(errorMessage);
       }
@@ -125,11 +124,11 @@
         averageCaptureBuffersCount =
             (double)captureBuffersCount / cameraFramesCount;
       }
-      Logging.d(TAG, "Camera fps: " + cameraFps + ". CaptureBuffers: " +
+      Log.d(TAG, "Camera fps: " + cameraFps + ". CaptureBuffers: " +
           String.format("%.1f", averageCaptureBuffersCount) +
           ". Pending buffers: " + videoBuffers.pendingFramesTimeStamps());
       if (cameraFramesCount == 0) {
-        Logging.e(TAG, "Camera freezed.");
+        Log.e(TAG, "Camera freezed.");
         if (errorHandler != null) {
           errorHandler.onCameraError("Camera failure.");
         }
@@ -169,13 +168,13 @@
       return false;
 
     if (cameraThreadHandler == null) {
-        Logging.e(TAG, "Calling switchCamera() for stopped camera.");
+        Log.e(TAG, "Calling switchCamera() for stopped camera.");
         return false;
     }
     if (pendingCameraSwitch) {
       // Do not handle multiple camera switch request to avoid blocking
       // camera thread by handling too many switch request from a queue.
-      Logging.w(TAG, "Ignoring camera switch request.");
+      Log.w(TAG, "Ignoring camera switch request.");
       return false;
     }
 
@@ -194,7 +193,7 @@
   public synchronized void onOutputFormatRequest(
       final int width, final int height, final int fps) {
     if (cameraThreadHandler == null) {
-      Logging.e(TAG, "Calling onOutputFormatRequest() for already stopped camera.");
+      Log.e(TAG, "Calling onOutputFormatRequest() for already stopped camera.");
       return;
     }
     cameraThreadHandler.post(new Runnable() {
@@ -209,7 +208,7 @@
   public synchronized void changeCaptureFormat(
       final int width, final int height, final int framerate) {
     if (cameraThreadHandler == null) {
-      Logging.e(TAG, "Calling changeCaptureFormat() for already stopped camera.");
+      Log.e(TAG, "Calling changeCaptureFormat() for already stopped camera.");
       return;
     }
     cameraThreadHandler.post(new Runnable() {
@@ -230,14 +229,14 @@
   }
 
   private VideoCapturerAndroid() {
-    Logging.d(TAG, "VideoCapturerAndroid");
+    Log.d(TAG, "VideoCapturerAndroid");
   }
 
   // Called by native code.
   // Initializes local variables for the camera named |deviceName|. If |deviceName| is empty, the
   // first available device is used in order to be compatible with the generic VideoCapturer class.
   synchronized boolean init(String deviceName) {
-    Logging.d(TAG, "init: " + deviceName);
+    Log.d(TAG, "init: " + deviceName);
     if (deviceName == null)
       return false;
 
@@ -282,7 +281,7 @@
   synchronized void startCapture(
       final int width, final int height, final int framerate,
       final Context applicationContext, final CapturerObserver frameObserver) {
-    Logging.d(TAG, "startCapture requested: " + width + "x" + height
+    Log.d(TAG, "startCapture requested: " + width + "x" + height
         + "@" + framerate);
     if (applicationContext == null) {
       throw new RuntimeException("applicationContext not set.");
@@ -313,7 +312,7 @@
     this.applicationContext = applicationContext;
     this.frameObserver = frameObserver;
     try {
-      Logging.d(TAG, "Opening camera " + id);
+      Log.d(TAG, "Opening camera " + id);
       camera = Camera.open(id);
       info = new Camera.CameraInfo();
       Camera.getCameraInfo(id, info);
@@ -329,11 +328,11 @@
 
         camera.setPreviewTexture(cameraSurfaceTexture);
       } catch (IOException e) {
-        Logging.e(TAG, "setPreviewTexture failed", error);
+        Log.e(TAG, "setPreviewTexture failed", error);
         throw new RuntimeException(e);
       }
 
-      Logging.d(TAG, "Camera orientation: " + info.orientation +
+      Log.d(TAG, "Camera orientation: " + info.orientation +
           " .Device orientation: " + getDeviceOrientation());
       camera.setErrorCallback(cameraErrorCallback);
       startPreviewOnCameraThread(width, height, framerate);
@@ -347,7 +346,7 @@
     } catch (RuntimeException e) {
       error = e;
     }
-    Logging.e(TAG, "startCapture failed", error);
+    Log.e(TAG, "startCapture failed", error);
     stopCaptureOnCameraThread();
     cameraThreadHandler = null;
     frameObserver.OnCapturerStarted(false);
@@ -359,10 +358,10 @@
 
   // (Re)start preview with the closest supported format to |width| x |height| @ |framerate|.
   private void startPreviewOnCameraThread(int width, int height, int framerate) {
-    Logging.d(
+    Log.d(
         TAG, "startPreviewOnCameraThread requested: " + width + "x" + height + "@" + framerate);
     if (camera == null) {
-      Logging.e(TAG, "Calling startPreviewOnCameraThread on stopped camera.");
+      Log.e(TAG, "Calling startPreviewOnCameraThread on stopped camera.");
       return;
     }
 
@@ -386,7 +385,7 @@
     }
 
     // Update camera parameters.
-    Logging.d(TAG, "isVideoStabilizationSupported: " +
+    Log.d(TAG, "isVideoStabilizationSupported: " +
         parameters.isVideoStabilizationSupported());
     if (parameters.isVideoStabilizationSupported()) {
       parameters.setVideoStabilization(true);
@@ -413,7 +412,7 @@
     }
 
     // (Re)start preview.
-    Logging.d(TAG, "Start capturing: " + captureFormat);
+    Log.d(TAG, "Start capturing: " + captureFormat);
     this.captureFormat = captureFormat;
     camera.setParameters(parameters);
     videoBuffers.queueCameraBuffers(captureFormat.frameSize(), camera);
@@ -424,10 +423,10 @@
   // Called by native code.  Returns true when camera is known to be stopped.
   synchronized void stopCapture() throws InterruptedException {
     if (cameraThreadHandler == null) {
-      Logging.e(TAG, "Calling stopCapture() for already stopped camera.");
+      Log.e(TAG, "Calling stopCapture() for already stopped camera.");
       return;
     }
-    Logging.d(TAG, "stopCapture");
+    Log.d(TAG, "stopCapture");
     cameraThreadHandler.post(new Runnable() {
         @Override public void run() {
           stopCaptureOnCameraThread();
@@ -435,7 +434,7 @@
     });
     cameraThread.join();
     cameraThreadHandler = null;
-    Logging.d(TAG, "stopCapture done");
+    Log.d(TAG, "stopCapture done");
   }
 
   private void stopCaptureOnCameraThread() {
@@ -445,13 +444,13 @@
   }
 
   private void doStopCaptureOnCameraThread() {
-    Logging.d(TAG, "stopCaptureOnCameraThread");
+    Log.d(TAG, "stopCaptureOnCameraThread");
     if (camera == null) {
       return;
     }
     try {
       cameraThreadHandler.removeCallbacks(cameraObserver);
-      Logging.d(TAG, "Stop preview.");
+      Log.d(TAG, "Stop preview.");
       camera.stopPreview();
       camera.setPreviewCallbackWithBuffer(null);
       videoBuffers.stopReturnBuffersToCamera();
@@ -463,22 +462,22 @@
         GLES20.glDeleteTextures(1, new int[] {cameraGlTexture}, 0);
         cameraGlTexture = 0;
       }
-      Logging.d(TAG, "Release camera.");
+      Log.d(TAG, "Release camera.");
       camera.release();
       camera = null;
     } catch (IOException e) {
-      Logging.e(TAG, "Failed to stop camera", e);
+      Log.e(TAG, "Failed to stop camera", e);
     }
   }
 
   private void switchCameraOnCameraThread(Runnable switchDoneEvent) {
-    Logging.d(TAG, "switchCameraOnCameraThread");
+    Log.d(TAG, "switchCameraOnCameraThread");
 
     doStopCaptureOnCameraThread();
     startCaptureOnCameraThread(requestedWidth, requestedHeight, requestedFramerate, frameObserver,
         applicationContext);
     pendingCameraSwitch = false;
-    Logging.d(TAG, "switchCameraOnCameraThread done");
+    Log.d(TAG, "switchCameraOnCameraThread done");
     if (switchDoneEvent != null) {
       switchDoneEvent.run();
     }
@@ -489,7 +488,7 @@
     if (camera == null) {
       return;
     }
-    Logging.d(TAG, "onOutputFormatRequestOnCameraThread: " + width + "x" + height +
+    Log.d(TAG, "onOutputFormatRequestOnCameraThread: " + width + "x" + height +
         "@" + fps);
     frameObserver.OnOutputFormatRequest(width, height, fps);
   }
@@ -551,7 +550,7 @@
       frameObserver.OnFrameCaptured(data, videoBuffers.frameSize, captureFormat.width,
           captureFormat.height, rotation, captureTimeNs);
     } else {
-      Logging.w(TAG, "reserveByteBuffer failed - dropping frame.");
+      Log.w(TAG, "reserveByteBuffer failed - dropping frame.");
     }
   }
 
@@ -614,7 +613,7 @@
         camera.addCallbackBuffer(buffer.array());
         queuedBuffers.put(buffer.array(), buffer);
       }
-      Logging.d(TAG, "queueCameraBuffers enqueued " + numCaptureBuffers
+      Log.d(TAG, "queueCameraBuffers enqueued " + numCaptureBuffers
           + " buffers of size " + frameSize + ".");
     }
 
@@ -630,7 +629,7 @@
       this.camera = null;
       queuedBuffers.clear();
       // Frames in |pendingBuffers| need to be kept alive until they are returned.
-      Logging.d(TAG, "stopReturnBuffersToCamera called."
+      Log.d(TAG, "stopReturnBuffersToCamera called."
             + (pendingBuffers.isEmpty() ?
                    " All buffers have been returned."
                    : " Pending buffers: " + pendingFramesTimeStamps() + "."));
@@ -641,7 +640,7 @@
       if (buffer == null) {
         // Frames might be posted to |onPreviewFrame| with the previous format while changing
         // capture format in |startPreviewOnCameraThread|. Drop these old frames.
-        Logging.w(TAG, "Received callback buffer from previous configuration with length: "
+        Log.w(TAG, "Received callback buffer from previous configuration with length: "
             + (data == null ? "null" : data.length));
         return false;
       }
@@ -649,12 +648,12 @@
         throw new IllegalStateException("Callback buffer has unexpected frame size");
       }
       if (pendingBuffers.containsKey(timeStamp)) {
-        Logging.e(TAG, "Timestamp already present in pending buffers - they need to be unique");
+        Log.e(TAG, "Timestamp already present in pending buffers - they need to be unique");
         return false;
       }
       pendingBuffers.put(timeStamp, buffer);
       if (queuedBuffers.isEmpty()) {
-        Logging.v(TAG, "Camera is running out of capture buffers."
+        Log.v(TAG, "Camera is running out of capture buffers."
             + " Pending buffers: " + pendingFramesTimeStamps());
       }
       return true;
@@ -670,7 +669,7 @@
       if (camera != null && returnedFrame.capacity() == frameSize) {
         camera.addCallbackBuffer(returnedFrame.array());
         if (queuedBuffers.isEmpty()) {
-          Logging.v(TAG, "Frame returned when camera is running out of capture"
+          Log.v(TAG, "Frame returned when camera is running out of capture"
               + " buffers for TS " + TimeUnit.NANOSECONDS.toMillis(timeStamp));
         }
         queuedBuffers.put(returnedFrame.array(), returnedFrame);
@@ -678,7 +677,7 @@
       }
 
       if (returnedFrame.capacity() != frameSize) {
-        Logging.d(TAG, "returnBuffer with time stamp "
+        Log.d(TAG, "returnBuffer with time stamp "
             + TimeUnit.NANOSECONDS.toMillis(timeStamp)
             + " called with old frame size, " + returnedFrame.capacity() + ".");
         // Since this frame has the wrong size, don't requeue it. Frames with the correct size are
@@ -686,7 +685,7 @@
         return;
       }
 
-      Logging.d(TAG, "returnBuffer with time stamp "
+      Log.d(TAG, "returnBuffer with time stamp "
           + TimeUnit.NANOSECONDS.toMillis(timeStamp)
           + " called after camera has been stopped.");
     }
diff --git a/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java b/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java
index 9909bff..3072613 100644
--- a/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java
+++ b/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java
@@ -44,7 +44,6 @@
 import android.opengl.Matrix;
 import android.util.Log;
 
-import org.webrtc.Logging;
 import org.webrtc.VideoRenderer.I420Frame;
 
 /**
@@ -159,7 +158,7 @@
         GLSurfaceView surface, int id,
         int x, int y, int width, int height,
         RendererCommon.ScalingType scalingType, boolean mirror) {
-      Logging.d(TAG, "YuvImageRenderer.Create id: " + id);
+      Log.d(TAG, "YuvImageRenderer.Create id: " + id);
       this.surface = surface;
       this.id = id;
       this.scalingType = scalingType;
@@ -180,7 +179,7 @@
     }
 
     private void createTextures() {
-      Logging.d(TAG, "  YuvImageRenderer.createTextures " + id + " on GL thread:" +
+      Log.d(TAG, "  YuvImageRenderer.createTextures " + id + " on GL thread:" +
           Thread.currentThread().getId());
 
       // Generate 3 texture ids for Y/U/V and place them into |yuvTextures|.
@@ -201,7 +200,7 @@
             (screenHeight * layoutInPercentage.top + 99) / 100,
             (screenWidth * layoutInPercentage.right) / 100,
             (screenHeight * layoutInPercentage.bottom) / 100);
-        Logging.d(TAG, "ID: "  + id + ". AdjustTextureCoords. Allowed display size: "
+        Log.d(TAG, "ID: "  + id + ". AdjustTextureCoords. Allowed display size: "
             + displayLayout.width() + " x " + displayLayout.height() + ". Video: " + videoWidth
             + " x " + videoHeight + ". Rotation: " + rotationDegree + ". Mirror: " + mirror);
         final float videoAspectRatio = (rotationDegree % 180 == 0)
@@ -212,12 +211,12 @@
             videoAspectRatio, displayLayout.width(), displayLayout.height());
         displayLayout.inset((displayLayout.width() - displaySize.x) / 2,
                             (displayLayout.height() - displaySize.y) / 2);
-        Logging.d(TAG, "  Adjusted display size: " + displayLayout.width() + " x "
+        Log.d(TAG, "  Adjusted display size: " + displayLayout.width() + " x "
             + displayLayout.height());
         layoutMatrix = RendererCommon.getLayoutMatrix(
             mirror, videoAspectRatio, (float) displayLayout.width() / displayLayout.height());
         updateLayoutProperties = false;
-        Logging.d(TAG, "  AdjustTextureCoords done");
+        Log.d(TAG, "  AdjustTextureCoords done");
       }
     }
 
@@ -284,13 +283,13 @@
 
     private void logStatistics() {
       long timeSinceFirstFrameNs = System.nanoTime() - startTimeNs;
-      Logging.d(TAG, "ID: " + id + ". Type: " + rendererType +
+      Log.d(TAG, "ID: " + id + ". Type: " + rendererType +
           ". Frames received: " + framesReceived +
           ". Dropped: " + framesDropped + ". Rendered: " + framesRendered);
       if (framesReceived > 0 && framesRendered > 0) {
-        Logging.d(TAG, "Duration: " + (int)(timeSinceFirstFrameNs / 1e6) +
+        Log.d(TAG, "Duration: " + (int)(timeSinceFirstFrameNs / 1e6) +
             " ms. FPS: " + (float)framesRendered * 1e9 / timeSinceFirstFrameNs);
-        Logging.d(TAG, "Draw time: " +
+        Log.d(TAG, "Draw time: " +
             (int) (drawTimeNs / (1000 * framesRendered)) + " us. Copy time: " +
             (int) (copyTimeNs / (1000 * framesReceived)) + " us");
       }
@@ -301,7 +300,7 @@
         if (screenWidth == this.screenWidth && screenHeight == this.screenHeight) {
           return;
         }
-        Logging.d(TAG, "ID: " + id + ". YuvImageRenderer.setScreenSize: " +
+        Log.d(TAG, "ID: " + id + ". YuvImageRenderer.setScreenSize: " +
             screenWidth + " x " + screenHeight);
         this.screenWidth = screenWidth;
         this.screenHeight = screenHeight;
@@ -318,7 +317,7 @@
             && mirror == this.mirror) {
           return;
         }
-        Logging.d(TAG, "ID: " + id + ". YuvImageRenderer.setPosition: (" + x + ", " + y +
+        Log.d(TAG, "ID: " + id + ". YuvImageRenderer.setPosition: (" + x + ", " + y +
             ") " +  width + " x " + height + ". Scaling: " + scalingType +
             ". Mirror: " + mirror);
         this.layoutInPercentage.set(layoutInPercentage);
@@ -334,20 +333,20 @@
         return;
       }
       if (rendererEvents != null) {
-        Logging.d(TAG, "ID: " + id +
+        Log.d(TAG, "ID: " + id +
             ". Reporting frame resolution changed to " + videoWidth + " x " + videoHeight);
         rendererEvents.onFrameResolutionChanged(videoWidth, videoHeight, rotation);
       }
 
       synchronized (updateLayoutLock) {
-        Logging.d(TAG, "ID: " + id + ". YuvImageRenderer.setSize: " +
+        Log.d(TAG, "ID: " + id + ". YuvImageRenderer.setSize: " +
             videoWidth + " x " + videoHeight + " rotation " + rotation);
 
         this.videoWidth = videoWidth;
         this.videoHeight = videoHeight;
         rotationDegree = rotation;
         updateLayoutProperties = true;
-        Logging.d(TAG, "  YuvImageRenderer.setSize done.");
+        Log.d(TAG, "  YuvImageRenderer.setSize done.");
       }
     }
 
@@ -359,7 +358,7 @@
         return;
       }
       if (!seenFrame && rendererEvents != null) {
-        Logging.d(TAG, "ID: " + id + ". Reporting first rendered frame.");
+        Log.d(TAG, "ID: " + id + ". Reporting first rendered frame.");
         rendererEvents.onFirstFrameRendered();
       }
       framesReceived++;
@@ -369,7 +368,7 @@
           if (frame.yuvStrides[0] < frame.width ||
               frame.yuvStrides[1] < frame.width / 2 ||
               frame.yuvStrides[2] < frame.width / 2) {
-            Logging.e(TAG, "Incorrect strides " + frame.yuvStrides[0] + ", " +
+            Log.e(TAG, "Incorrect strides " + frame.yuvStrides[0] + ", " +
                 frame.yuvStrides[1] + ", " + frame.yuvStrides[2]);
             VideoRenderer.renderFrameDone(frame);
             return;
@@ -395,7 +394,7 @@
   /** Passes GLSurfaceView to video renderer. */
   public static synchronized void setView(GLSurfaceView surface,
       Runnable eglContextReadyCallback) {
-    Logging.d(TAG, "VideoRendererGui.setView");
+    Log.d(TAG, "VideoRendererGui.setView");
     instance = new VideoRendererGui(surface);
     eglContextReady = eglContextReadyCallback;
   }
@@ -409,7 +408,7 @@
     if (instance == null){
       return;
     }
-    Logging.d(TAG, "VideoRendererGui.dispose");
+    Log.d(TAG, "VideoRendererGui.dispose");
     synchronized (instance.yuvImageRenderers) {
       for (YuvImageRenderer yuvImageRenderer : instance.yuvImageRenderers) {
         yuvImageRenderer.release();
@@ -490,7 +489,7 @@
   public static synchronized void update(
       VideoRenderer.Callbacks renderer, int x, int y, int width, int height,
       RendererCommon.ScalingType scalingType, boolean mirror) {
-    Logging.d(TAG, "VideoRendererGui.update");
+    Log.d(TAG, "VideoRendererGui.update");
     if (instance == null) {
       throw new RuntimeException(
           "Attempt to update yuv renderer before setting GLSurfaceView");
@@ -506,7 +505,7 @@
 
   public static synchronized void setRendererEvents(
       VideoRenderer.Callbacks renderer, RendererCommon.RendererEvents rendererEvents) {
-    Logging.d(TAG, "VideoRendererGui.setRendererEvents");
+    Log.d(TAG, "VideoRendererGui.setRendererEvents");
     if (instance == null) {
       throw new RuntimeException(
           "Attempt to set renderer events before setting GLSurfaceView");
@@ -521,7 +520,7 @@
   }
 
   public static synchronized void remove(VideoRenderer.Callbacks renderer) {
-    Logging.d(TAG, "VideoRendererGui.remove");
+    Log.d(TAG, "VideoRendererGui.remove");
     if (instance == null) {
       throw new RuntimeException(
           "Attempt to remove yuv renderer before setting GLSurfaceView");
@@ -529,7 +528,7 @@
     synchronized (instance.yuvImageRenderers) {
       final int index = instance.yuvImageRenderers.indexOf(renderer);
       if (index == -1) {
-        Logging.w(TAG, "Couldn't remove renderer (not present in current list)");
+        Log.w(TAG, "Couldn't remove renderer (not present in current list)");
       } else {
         instance.yuvImageRenderers.remove(index).release();
       }
@@ -539,12 +538,12 @@
   @SuppressLint("NewApi")
   @Override
   public void onSurfaceCreated(GL10 unused, EGLConfig config) {
-    Logging.d(TAG, "VideoRendererGui.onSurfaceCreated");
+    Log.d(TAG, "VideoRendererGui.onSurfaceCreated");
     // Store render EGL context.
     if (CURRENT_SDK_VERSION >= EGL14_SDK_VERSION) {
       synchronized (VideoRendererGui.class) {
         eglContext = EGL14.eglGetCurrentContext();
-        Logging.d(TAG, "VideoRendererGui EGL Context: " + eglContext);
+        Log.d(TAG, "VideoRendererGui EGL Context: " + eglContext);
       }
     }
 
@@ -571,7 +570,7 @@
 
   @Override
   public void onSurfaceChanged(GL10 unused, int width, int height) {
-    Logging.d(TAG, "VideoRendererGui.onSurfaceChanged: " +
+    Log.d(TAG, "VideoRendererGui.onSurfaceChanged: " +
         width + " x " + height + "  ");
     screenWidth = width;
     screenHeight = height;
diff --git a/talk/app/webrtc/java/src/org/webrtc/MediaCodecVideoDecoder.java b/talk/app/webrtc/java/src/org/webrtc/MediaCodecVideoDecoder.java
index 6518dc6..777f6f9 100644
--- a/talk/app/webrtc/java/src/org/webrtc/MediaCodecVideoDecoder.java
+++ b/talk/app/webrtc/java/src/org/webrtc/MediaCodecVideoDecoder.java
@@ -33,15 +33,13 @@
 import android.media.MediaCodecInfo.CodecCapabilities;
 import android.media.MediaCodecList;
 import android.media.MediaFormat;
-import android.opengl.EGL14;
 import android.opengl.EGLContext;
 import android.opengl.GLES11Ext;
 import android.opengl.GLES20;
 import android.os.Build;
+import android.util.Log;
 import android.view.Surface;
 
-import org.webrtc.Logging;
-
 import java.nio.ByteBuffer;
 
 // Java-side of peerconnection_jni.cc:MediaCodecVideoDecoder.
@@ -130,7 +128,7 @@
       if (name == null) {
         continue;  // No HW support in this codec; try the next one.
       }
-      Logging.v(TAG, "Found candidate decoder " + name);
+      Log.v(TAG, "Found candidate decoder " + name);
 
       // Check if this is supported decoder.
       boolean supportedCodec = false;
@@ -148,13 +146,13 @@
       CodecCapabilities capabilities =
           info.getCapabilitiesForType(mime);
       for (int colorFormat : capabilities.colorFormats) {
-        Logging.v(TAG, "   Color: 0x" + Integer.toHexString(colorFormat));
+        Log.v(TAG, "   Color: 0x" + Integer.toHexString(colorFormat));
       }
       for (int supportedColorFormat : supportedColorList) {
         for (int codecColorFormat : capabilities.colorFormats) {
           if (codecColorFormat == supportedColorFormat) {
             // Found supported HW decoder.
-            Logging.d(TAG, "Found target decoder " + name +
+            Log.d(TAG, "Found target decoder " + name +
                 ". Color: 0x" + Integer.toHexString(codecColorFormat));
             return new DecoderProperties(name, codecColorFormat);
           }
@@ -204,11 +202,11 @@
     if (properties == null) {
       throw new RuntimeException("Cannot find HW decoder for " + type);
     }
-    Logging.d(TAG, "Java initDecode: " + type + " : "+ width + " x " + height +
+    Log.d(TAG, "Java initDecode: " + type + " : "+ width + " x " + height +
         ". Color: 0x" + Integer.toHexString(properties.colorFormat) +
         ". Use Surface: " + useSurface);
     if (sharedContext != null) {
-      Logging.d(TAG, "Decoder shared EGL Context: " + sharedContext);
+      Log.d(TAG, "Decoder shared EGL Context: " + sharedContext);
     }
     mediaCodecThread = Thread.currentThread();
     try {
@@ -227,7 +225,7 @@
 
         // Create output surface
         textureID = GlUtil.generateTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES);
-        Logging.d(TAG, "Video decoder TextureID = " + textureID);
+        Log.d(TAG, "Video decoder TextureID = " + textureID);
         surfaceTexture = new SurfaceTexture(textureID);
         surface = new Surface(surfaceTexture);
         decodeSurface = surface;
@@ -237,7 +235,7 @@
       if (!useSurface) {
         format.setInteger(MediaFormat.KEY_COLOR_FORMAT, properties.colorFormat);
       }
-      Logging.d(TAG, "  Format: " + format);
+      Log.d(TAG, "  Format: " + format);
       mediaCodec =
           MediaCodecVideoEncoder.createByCodecName(properties.codecName);
       if (mediaCodec == null) {
@@ -248,30 +246,30 @@
       colorFormat = properties.colorFormat;
       outputBuffers = mediaCodec.getOutputBuffers();
       inputBuffers = mediaCodec.getInputBuffers();
-      Logging.d(TAG, "Input buffers: " + inputBuffers.length +
+      Log.d(TAG, "Input buffers: " + inputBuffers.length +
           ". Output buffers: " + outputBuffers.length);
       return true;
     } catch (IllegalStateException e) {
-      Logging.e(TAG, "initDecode failed", e);
+      Log.e(TAG, "initDecode failed", e);
       return false;
     }
   }
 
   private void release() {
-    Logging.d(TAG, "Java releaseDecoder");
+    Log.d(TAG, "Java releaseDecoder");
     checkOnMediaCodecThread();
     try {
       mediaCodec.stop();
       mediaCodec.release();
     } catch (IllegalStateException e) {
-      Logging.e(TAG, "release failed", e);
+      Log.e(TAG, "release failed", e);
     }
     mediaCodec = null;
     mediaCodecThread = null;
     if (useSurface) {
       surface.release();
       if (textureID != 0) {
-        Logging.d(TAG, "Delete video decoder TextureID " + textureID);
+        Log.d(TAG, "Delete video decoder TextureID " + textureID);
         GLES20.glDeleteTextures(1, new int[] {textureID}, 0);
         textureID = 0;
       }
@@ -287,7 +285,7 @@
     try {
       return mediaCodec.dequeueInputBuffer(DEQUEUE_INPUT_TIMEOUT);
     } catch (IllegalStateException e) {
-      Logging.e(TAG, "dequeueIntputBuffer failed", e);
+      Log.e(TAG, "dequeueIntputBuffer failed", e);
       return -2;
     }
   }
@@ -302,7 +300,7 @@
       return true;
     }
     catch (IllegalStateException e) {
-      Logging.e(TAG, "decode failed", e);
+      Log.e(TAG, "decode failed", e);
       return false;
     }
   }
@@ -334,15 +332,15 @@
           result == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
         if (result == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
           outputBuffers = mediaCodec.getOutputBuffers();
-          Logging.d(TAG, "Decoder output buffers changed: " + outputBuffers.length);
+          Log.d(TAG, "Decoder output buffers changed: " + outputBuffers.length);
         } else if (result == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
           MediaFormat format = mediaCodec.getOutputFormat();
-          Logging.d(TAG, "Decoder format changed: " + format.toString());
+          Log.d(TAG, "Decoder format changed: " + format.toString());
           width = format.getInteger(MediaFormat.KEY_WIDTH);
           height = format.getInteger(MediaFormat.KEY_HEIGHT);
           if (!useSurface && format.containsKey(MediaFormat.KEY_COLOR_FORMAT)) {
             colorFormat = format.getInteger(MediaFormat.KEY_COLOR_FORMAT);
-            Logging.d(TAG, "Color: 0x" + Integer.toHexString(colorFormat));
+            Log.d(TAG, "Color: 0x" + Integer.toHexString(colorFormat));
             // Check if new color space is supported.
             boolean validColorFormat = false;
             for (int supportedColorFormat : supportedColorList) {
@@ -352,7 +350,7 @@
               }
             }
             if (!validColorFormat) {
-              Logging.e(TAG, "Non supported color format");
+              Log.e(TAG, "Non supported color format");
               return new DecoderOutputBufferInfo(-1, 0, 0, -1);
             }
           }
@@ -362,7 +360,7 @@
           if (format.containsKey("slice-height")) {
             sliceHeight = format.getInteger("slice-height");
           }
-          Logging.d(TAG, "Frame stride and slice height: "
+          Log.d(TAG, "Frame stride and slice height: "
               + stride + " x " + sliceHeight);
           stride = Math.max(width, stride);
           sliceHeight = Math.max(height, sliceHeight);
@@ -375,7 +373,7 @@
       }
       return null;
     } catch (IllegalStateException e) {
-      Logging.e(TAG, "dequeueOutputBuffer failed", e);
+      Log.e(TAG, "dequeueOutputBuffer failed", e);
       return new DecoderOutputBufferInfo(-1, 0, 0, -1);
     }
   }
@@ -391,7 +389,7 @@
       mediaCodec.releaseOutputBuffer(index, render);
       return true;
     } catch (IllegalStateException e) {
-      Logging.e(TAG, "releaseOutputBuffer failed", e);
+      Log.e(TAG, "releaseOutputBuffer failed", e);
       return false;
     }
   }
diff --git a/talk/app/webrtc/java/src/org/webrtc/MediaCodecVideoEncoder.java b/talk/app/webrtc/java/src/org/webrtc/MediaCodecVideoEncoder.java
index dfff8f2..d85dd3a 100644
--- a/talk/app/webrtc/java/src/org/webrtc/MediaCodecVideoEncoder.java
+++ b/talk/app/webrtc/java/src/org/webrtc/MediaCodecVideoEncoder.java
@@ -35,8 +35,7 @@
 import android.media.MediaFormat;
 import android.os.Build;
 import android.os.Bundle;
-
-import org.webrtc.Logging;
+import android.util.Log;
 
 import java.nio.ByteBuffer;
 import java.util.Arrays;
@@ -126,7 +125,7 @@
     if (mime.equals(H264_MIME_TYPE)) {
       List<String> exceptionModels = Arrays.asList(H264_HW_EXCEPTION_MODELS);
       if (exceptionModels.contains(Build.MODEL)) {
-        Logging.w(TAG, "Model: " + Build.MODEL +
+        Log.w(TAG, "Model: " + Build.MODEL +
             " has black listed H.264 encoder.");
         return null;
       }
@@ -147,7 +146,7 @@
       if (name == null) {
         continue;  // No HW support in this codec; try the next one.
       }
-      Logging.v(TAG, "Found candidate encoder " + name);
+      Log.v(TAG, "Found candidate encoder " + name);
 
       // Check if this is supported HW encoder.
       boolean supportedCodec = false;
@@ -163,7 +162,7 @@
 
       CodecCapabilities capabilities = info.getCapabilitiesForType(mime);
       for (int colorFormat : capabilities.colorFormats) {
-        Logging.v(TAG, "   Color: 0x" + Integer.toHexString(colorFormat));
+        Log.v(TAG, "   Color: 0x" + Integer.toHexString(colorFormat));
       }
 
       // Check if codec supports either yuv420 or nv12.
@@ -171,7 +170,7 @@
         for (int codecColorFormat : capabilities.colorFormats) {
           if (codecColorFormat == supportedColorFormat) {
             // Found supported HW encoder.
-            Logging.d(TAG, "Found target encoder for mime " + mime + " : " + name +
+            Log.d(TAG, "Found target encoder for mime " + mime + " : " + name +
                 ". Color: 0x" + Integer.toHexString(codecColorFormat));
             return new EncoderProperties(name, codecColorFormat);
           }
@@ -210,7 +209,7 @@
   // Return the array of input buffers, or null on failure.
   private ByteBuffer[] initEncode(
       VideoCodecType type, int width, int height, int kbps, int fps) {
-    Logging.d(TAG, "Java initEncode: " + type + " : " + width + " x " + height +
+    Log.d(TAG, "Java initEncode: " + type + " : " + width + " x " + height +
         ". @ " + kbps + " kbps. Fps: " + fps +
         ". Color: 0x" + Integer.toHexString(colorFormat));
     if (mediaCodecThread != null) {
@@ -240,7 +239,7 @@
       format.setInteger(MediaFormat.KEY_COLOR_FORMAT, properties.colorFormat);
       format.setInteger(MediaFormat.KEY_FRAME_RATE, fps);
       format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, keyFrameIntervalSec);
-      Logging.d(TAG, "  Format: " + format);
+      Log.d(TAG, "  Format: " + format);
       mediaCodec = createByCodecName(properties.codecName);
       if (mediaCodec == null) {
         return null;
@@ -251,11 +250,11 @@
       colorFormat = properties.colorFormat;
       outputBuffers = mediaCodec.getOutputBuffers();
       ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers();
-      Logging.d(TAG, "Input buffers: " + inputBuffers.length +
+      Log.d(TAG, "Input buffers: " + inputBuffers.length +
           ". Output buffers: " + outputBuffers.length);
       return inputBuffers;
     } catch (IllegalStateException e) {
-      Logging.e(TAG, "initEncode failed", e);
+      Log.e(TAG, "initEncode failed", e);
       return null;
     }
   }
@@ -270,7 +269,7 @@
         // indicate this in queueInputBuffer() below and guarantee _this_ frame
         // be encoded as a key frame, but sadly that flag is ignored.  Instead,
         // we request a key frame "soon".
-        Logging.d(TAG, "Sync frame request");
+        Log.d(TAG, "Sync frame request");
         Bundle b = new Bundle();
         b.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 0);
         mediaCodec.setParameters(b);
@@ -280,19 +279,19 @@
       return true;
     }
     catch (IllegalStateException e) {
-      Logging.e(TAG, "encode failed", e);
+      Log.e(TAG, "encode failed", e);
       return false;
     }
   }
 
   private void release() {
-    Logging.d(TAG, "Java releaseEncoder");
+    Log.d(TAG, "Java releaseEncoder");
     checkOnMediaCodecThread();
     try {
       mediaCodec.stop();
       mediaCodec.release();
     } catch (IllegalStateException e) {
-      Logging.e(TAG, "release failed", e);
+      Log.e(TAG, "release failed", e);
     }
     mediaCodec = null;
     mediaCodecThread = null;
@@ -302,14 +301,14 @@
     // frameRate argument is ignored - HW encoder is supposed to use
     // video frame timestamps for bit allocation.
     checkOnMediaCodecThread();
-    Logging.v(TAG, "setRates: " + kbps + " kbps. Fps: " + frameRateIgnored);
+    Log.v(TAG, "setRates: " + kbps + " kbps. Fps: " + frameRateIgnored);
     try {
       Bundle params = new Bundle();
       params.putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE, 1000 * kbps);
       mediaCodec.setParameters(params);
       return true;
     } catch (IllegalStateException e) {
-      Logging.e(TAG, "setRates failed", e);
+      Log.e(TAG, "setRates failed", e);
       return false;
     }
   }
@@ -321,7 +320,7 @@
     try {
       return mediaCodec.dequeueInputBuffer(DEQUEUE_TIMEOUT);
     } catch (IllegalStateException e) {
-      Logging.e(TAG, "dequeueIntputBuffer failed", e);
+      Log.e(TAG, "dequeueIntputBuffer failed", e);
       return -2;
     }
   }
@@ -355,7 +354,7 @@
         boolean isConfigFrame =
             (info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0;
         if (isConfigFrame) {
-          Logging.d(TAG, "Config frame generated. Offset: " + info.offset +
+          Log.d(TAG, "Config frame generated. Offset: " + info.offset +
               ". Size: " + info.size);
           configData = ByteBuffer.allocateDirect(info.size);
           outputBuffers[result].position(info.offset);
@@ -378,10 +377,10 @@
         boolean isKeyFrame =
             (info.flags & MediaCodec.BUFFER_FLAG_SYNC_FRAME) != 0;
         if (isKeyFrame) {
-          Logging.d(TAG, "Sync frame generated");
+          Log.d(TAG, "Sync frame generated");
         }
         if (isKeyFrame && type == VideoCodecType.VIDEO_CODEC_H264) {
-          Logging.d(TAG, "Appending config frame of size " + configData.capacity() +
+          Log.d(TAG, "Appending config frame of size " + configData.capacity() +
               " to output buffer with offset " + info.offset + ", size " +
               info.size);
           // For H.264 key frame append SPS and PPS NALs at the start
@@ -407,7 +406,7 @@
       }
       throw new RuntimeException("dequeueOutputBuffer: " + result);
     } catch (IllegalStateException e) {
-      Logging.e(TAG, "dequeueOutputBuffer failed", e);
+      Log.e(TAG, "dequeueOutputBuffer failed", e);
       return new OutputBufferInfo(-1, null, false, -1);
     }
   }
@@ -420,7 +419,7 @@
       mediaCodec.releaseOutputBuffer(index, false);
       return true;
     } catch (IllegalStateException e) {
-      Logging.e(TAG, "releaseOutputBuffer failed", e);
+      Log.e(TAG, "releaseOutputBuffer failed", e);
       return false;
     }
   }
