Index: media/base/android/java/src/org/chromium/media/VideoCaptureCamera.java |
diff --git a/media/base/android/java/src/org/chromium/media/VideoCapture.java b/media/base/android/java/src/org/chromium/media/VideoCaptureCamera.java |
similarity index 73% |
copy from media/base/android/java/src/org/chromium/media/VideoCapture.java |
copy to media/base/android/java/src/org/chromium/media/VideoCaptureCamera.java |
index 9d008652cc802c484d1f486153fb801c5ec041cd..dd1632b07fb6609667f000d444b7d7d15c24f760 100644 |
--- a/media/base/android/java/src/org/chromium/media/VideoCapture.java |
+++ b/media/base/android/java/src/org/chromium/media/VideoCaptureCamera.java |
@@ -5,14 +5,12 @@ |
package org.chromium.media; |
import android.content.Context; |
-import android.graphics.ImageFormat; |
import android.graphics.SurfaceTexture; |
import android.opengl.GLES20; |
import android.util.Log; |
import android.view.Surface; |
import android.view.WindowManager; |
-import org.chromium.base.CalledByNative; |
import org.chromium.base.JNINamespace; |
import java.io.IOException; |
@@ -20,54 +18,21 @@ import java.util.List; |
import java.util.concurrent.locks.ReentrantLock; |
/** |
- * Video Capture Device base class to interface to native Chromium. |
+ * Video Capture Device extension of VideoCapture to provide common functionality |
+ * for capture using android.hardware.Camera API (deprecated in API 21). Normal |
+ * Android and Tango devices are extensions of this class. |
**/ |
@JNINamespace("media") |
@SuppressWarnings("deprecation") |
-public abstract class VideoCapture implements android.hardware.Camera.PreviewCallback { |
- |
- protected static class CaptureFormat { |
- int mWidth; |
- int mHeight; |
- final int mFramerate; |
- final int mPixelFormat; |
- |
- public CaptureFormat( |
- int width, int height, int framerate, int pixelformat) { |
- mWidth = width; |
- mHeight = height; |
- mFramerate = framerate; |
- mPixelFormat = pixelformat; |
- } |
- |
- public int getWidth() { |
- return mWidth; |
- } |
- |
- public int getHeight() { |
- return mHeight; |
- } |
- |
- public int getFramerate() { |
- return mFramerate; |
- } |
- |
- public int getPixelFormat() { |
- return mPixelFormat; |
- } |
- } |
+public abstract class VideoCaptureCamera extends VideoCapture |
+ implements android.hardware.Camera.PreviewCallback { |
protected android.hardware.Camera mCamera; |
- protected CaptureFormat mCaptureFormat = null; |
- // Lock to mutually exclude execution of OnPreviewFrame {start/stop}Capture. |
+ // Lock to mutually exclude execution of OnPreviewFrame() and {start/stop}Capture(). |
protected ReentrantLock mPreviewBufferLock = new ReentrantLock(); |
- protected Context mContext = null; |
// True when native code has started capture. |
protected boolean mIsRunning = false; |
- protected int mId; |
- // Native callback context variable. |
- protected long mNativeVideoCaptureDeviceAndroid; |
protected int[] mGlTextures = null; |
protected SurfaceTexture mSurfaceTexture = null; |
protected static final int GL_TEXTURE_EXTERNAL_OES = 0x8D65; |
@@ -75,9 +40,9 @@ public abstract class VideoCapture implements android.hardware.Camera.PreviewCal |
protected int mCameraOrientation; |
protected int mCameraFacing; |
protected int mDeviceOrientation; |
- private static final String TAG = "VideoCapture"; |
+ private static final String TAG = "VideoCaptureCamera"; |
- static android.hardware.Camera.CameraInfo getCameraInfo(int id) { |
+ protected static android.hardware.Camera.CameraInfo getCameraInfo(int id) { |
android.hardware.Camera.CameraInfo cameraInfo = |
new android.hardware.Camera.CameraInfo(); |
try { |
@@ -89,18 +54,29 @@ public abstract class VideoCapture implements android.hardware.Camera.PreviewCal |
return cameraInfo; |
} |
- VideoCapture(Context context, |
- int id, |
- long nativeVideoCaptureDeviceAndroid) { |
- mContext = context; |
- mId = id; |
- mNativeVideoCaptureDeviceAndroid = nativeVideoCaptureDeviceAndroid; |
+ protected static android.hardware.Camera.Parameters getCameraParameters( |
+ android.hardware.Camera camera) { |
+ android.hardware.Camera.Parameters parameters; |
+ try { |
+ parameters = camera.getParameters(); |
+ } catch (RuntimeException ex) { |
+ Log.e(TAG, "getCameraParameters: android.hardware.Camera.getParameters: " + ex); |
+ camera.release(); |
+ return null; |
+ } |
+ return parameters; |
+ } |
+ |
+ VideoCaptureCamera(Context context, |
+ int id, |
+ long nativeVideoCaptureDeviceAndroid) { |
+ super(context, id, nativeVideoCaptureDeviceAndroid); |
} |
- @CalledByNative |
- boolean allocate(int width, int height, int frameRate) { |
- Log.d(TAG, "allocate: requested (" + width + "x" + height + ")@" + |
- frameRate + "fps"); |
+ @Override |
+ public boolean allocate(int width, int height, int frameRate) { |
+ Log.d(TAG, "allocate: requested (" + width + "x" + height + ")@" |
+ + frameRate + "fps"); |
try { |
mCamera = android.hardware.Camera.open(mId); |
} catch (RuntimeException ex) { |
@@ -108,7 +84,7 @@ public abstract class VideoCapture implements android.hardware.Camera.PreviewCal |
return false; |
} |
- android.hardware.Camera.CameraInfo cameraInfo = VideoCapture.getCameraInfo(mId); |
+ android.hardware.Camera.CameraInfo cameraInfo = VideoCaptureCamera.getCameraInfo(mId); |
if (cameraInfo == null) { |
mCamera.release(); |
mCamera = null; |
@@ -118,8 +94,8 @@ public abstract class VideoCapture implements android.hardware.Camera.PreviewCal |
mCameraOrientation = cameraInfo.orientation; |
mCameraFacing = cameraInfo.facing; |
mDeviceOrientation = getDeviceOrientation(); |
- Log.d(TAG, "allocate: orientation dev=" + mDeviceOrientation + |
- ", cam=" + mCameraOrientation + ", facing=" + mCameraFacing); |
+ Log.d(TAG, "allocate: orientation dev=" + mDeviceOrientation |
+ + ", cam=" + mCameraOrientation + ", facing=" + mCameraFacing); |
android.hardware.Camera.Parameters parameters = getCameraParameters(mCamera); |
if (parameters == null) { |
@@ -141,15 +117,15 @@ public abstract class VideoCapture implements android.hardware.Camera.PreviewCal |
// API fps ranges are scaled up x1000 to avoid floating point. |
int frameRateScaled = frameRate * 1000; |
for (int[] fpsRange : listFpsRange) { |
- if (fpsRange[0] <= frameRateScaled && frameRateScaled <= fpsRange[1] && |
- (fpsRange[1] - fpsRange[0]) <= fpsRangeSize) { |
+ if (fpsRange[0] <= frameRateScaled && frameRateScaled <= fpsRange[1] |
+ && (fpsRange[1] - fpsRange[0]) <= fpsRangeSize) { |
chosenFpsRange = fpsRange; |
chosenFrameRate = frameRate; |
fpsRangeSize = fpsRange[1] - fpsRange[0]; |
} |
} |
- Log.d(TAG, "allocate: fps set to " + chosenFrameRate + ", [" + |
- chosenFpsRange[0] + "-" + chosenFpsRange[1] + "]"); |
+ Log.d(TAG, "allocate: fps set to " + chosenFrameRate + ", [" |
+ + chosenFpsRange[0] + "-" + chosenFpsRange[1] + "]"); |
// Calculate size. |
List<android.hardware.Camera.Size> listCameraSize = |
@@ -158,10 +134,10 @@ public abstract class VideoCapture implements android.hardware.Camera.PreviewCal |
int matchedWidth = width; |
int matchedHeight = height; |
for (android.hardware.Camera.Size size : listCameraSize) { |
- int diff = Math.abs(size.width - width) + |
- Math.abs(size.height - height); |
- Log.d(TAG, "allocate: supported (" + |
- size.width + ", " + size.height + "), diff=" + diff); |
+ int diff = Math.abs(size.width - width) |
+ + Math.abs(size.height - height); |
+ Log.d(TAG, "allocate: supported (" |
+ + size.width + ", " + size.height + "), diff=" + diff); |
// TODO(wjia): Remove this hack (forcing width to be multiple |
// of 32) by supporting stride in video frame buffer. |
// Right now, VideoCaptureController requires compact YV12 |
@@ -179,8 +155,8 @@ public abstract class VideoCapture implements android.hardware.Camera.PreviewCal |
Log.d(TAG, "allocate: matched (" + matchedWidth + "x" + matchedHeight + ")"); |
if (parameters.isVideoStabilizationSupported()) { |
- Log.d(TAG, "Image stabilization supported, currently: " + |
- parameters.getVideoStabilization() + ", setting it."); |
+ Log.d(TAG, "Image stabilization supported, currently: " |
+ + parameters.getVideoStabilization() + ", setting it."); |
parameters.setVideoStabilization(true); |
} else { |
Log.d(TAG, "Image stabilization not supported."); |
@@ -228,7 +204,7 @@ public abstract class VideoCapture implements android.hardware.Camera.PreviewCal |
return true; |
} |
- @CalledByNative |
+ @Override |
public int startCapture() { |
if (mCamera == null) { |
Log.e(TAG, "startCapture: camera is null"); |
@@ -254,7 +230,7 @@ public abstract class VideoCapture implements android.hardware.Camera.PreviewCal |
return 0; |
} |
- @CalledByNative |
+ @Override |
public int stopCapture() { |
if (mCamera == null) { |
Log.e(TAG, "stopCapture: camera is null"); |
@@ -276,10 +252,9 @@ public abstract class VideoCapture implements android.hardware.Camera.PreviewCal |
return 0; |
} |
- @CalledByNative |
+ @Override |
public void deallocate() { |
- if (mCamera == null) |
- return; |
+ if (mCamera == null) return; |
stopCapture(); |
try { |
@@ -303,42 +278,10 @@ public abstract class VideoCapture implements android.hardware.Camera.PreviewCal |
int frameRate, |
android.hardware.Camera.Parameters cameraParameters); |
- // Local hook to allow derived classes to configure and plug capture |
- // buffers if needed. |
- abstract void allocateBuffers(); |
- |
// Local method to be overriden with the particular setPreviewCallback to be |
// used in the implementations. |
abstract void setPreviewCallback(android.hardware.Camera.PreviewCallback cb); |
- @CalledByNative |
- public int queryWidth() { |
- return mCaptureFormat.mWidth; |
- } |
- |
- @CalledByNative |
- public int queryHeight() { |
- return mCaptureFormat.mHeight; |
- } |
- |
- @CalledByNative |
- public int queryFrameRate() { |
- return mCaptureFormat.mFramerate; |
- } |
- |
- @CalledByNative |
- public int getColorspace() { |
- switch (mCaptureFormat.mPixelFormat) { |
- case ImageFormat.YV12: |
- return AndroidImageFormat.YV12; |
- case ImageFormat.NV21: |
- return AndroidImageFormat.NV21; |
- case ImageFormat.UNKNOWN: |
- default: |
- return AndroidImageFormat.UNKNOWN; |
- } |
- } |
- |
protected int getDeviceOrientation() { |
int orientation = 0; |
if (mContext != null) { |
@@ -362,25 +305,4 @@ public abstract class VideoCapture implements android.hardware.Camera.PreviewCal |
} |
return orientation; |
} |
- |
- // Method for VideoCapture implementations to call back native code. |
- public native void nativeOnFrameAvailable( |
- long nativeVideoCaptureDeviceAndroid, |
- byte[] data, |
- int length, |
- int rotation); |
- |
- protected static android.hardware.Camera.Parameters getCameraParameters( |
- android.hardware.Camera camera) { |
- android.hardware.Camera.Parameters parameters; |
- try { |
- parameters = camera.getParameters(); |
- } catch (RuntimeException ex) { |
- Log.e(TAG, "getCameraParameters: android.hardware.Camera.getParameters: " + ex); |
- camera.release(); |
- return null; |
- } |
- return parameters; |
- } |
- |
} |