| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2016 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 package org.webrtc; | 11 package org.webrtc; |
| 12 | 12 |
| 13 import android.annotation.TargetApi; | 13 import android.annotation.TargetApi; |
| 14 import android.content.Context; | 14 import android.content.Context; |
| 15 import android.graphics.Matrix; |
| 15 import android.graphics.SurfaceTexture; | 16 import android.graphics.SurfaceTexture; |
| 16 import android.hardware.camera2.CameraAccessException; | 17 import android.hardware.camera2.CameraAccessException; |
| 17 import android.hardware.camera2.CameraCaptureSession; | 18 import android.hardware.camera2.CameraCaptureSession; |
| 18 import android.hardware.camera2.CameraCharacteristics; | 19 import android.hardware.camera2.CameraCharacteristics; |
| 19 import android.hardware.camera2.CameraDevice; | 20 import android.hardware.camera2.CameraDevice; |
| 20 import android.hardware.camera2.CameraManager; | 21 import android.hardware.camera2.CameraManager; |
| 21 import android.hardware.camera2.CameraMetadata; | 22 import android.hardware.camera2.CameraMetadata; |
| 22 import android.hardware.camera2.CaptureFailure; | 23 import android.hardware.camera2.CaptureFailure; |
| 23 import android.hardware.camera2.CaptureRequest; | 24 import android.hardware.camera2.CaptureRequest; |
| 24 import android.media.MediaRecorder; | 25 import android.media.MediaRecorder; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 37 | 38 |
| 38 private static final Histogram camera2StartTimeMsHistogram = | 39 private static final Histogram camera2StartTimeMsHistogram = |
| 39 Histogram.createCounts("WebRTC.Android.Camera2.StartTimeMs", 1, 10000, 50)
; | 40 Histogram.createCounts("WebRTC.Android.Camera2.StartTimeMs", 1, 10000, 50)
; |
| 40 private static final Histogram camera2StopTimeMsHistogram = | 41 private static final Histogram camera2StopTimeMsHistogram = |
| 41 Histogram.createCounts("WebRTC.Android.Camera2.StopTimeMs", 1, 10000, 50); | 42 Histogram.createCounts("WebRTC.Android.Camera2.StopTimeMs", 1, 10000, 50); |
| 42 private static final Histogram camera2ResolutionHistogram = Histogram.createEn
umeration( | 43 private static final Histogram camera2ResolutionHistogram = Histogram.createEn
umeration( |
| 43 "WebRTC.Android.Camera2.Resolution", CameraEnumerationAndroid.COMMON_RESOL
UTIONS.size()); | 44 "WebRTC.Android.Camera2.Resolution", CameraEnumerationAndroid.COMMON_RESOL
UTIONS.size()); |
| 44 | 45 |
| 45 private static enum SessionState { RUNNING, STOPPED } | 46 private static enum SessionState { RUNNING, STOPPED } |
| 46 | 47 |
| 48 private final boolean videoFrameEmitTrialEnabled; |
| 49 |
| 47 private final Handler cameraThreadHandler; | 50 private final Handler cameraThreadHandler; |
| 48 private final CreateSessionCallback callback; | 51 private final CreateSessionCallback callback; |
| 49 private final Events events; | 52 private final Events events; |
| 50 private final Context applicationContext; | 53 private final Context applicationContext; |
| 51 private final CameraManager cameraManager; | 54 private final CameraManager cameraManager; |
| 52 private final SurfaceTextureHelper surfaceTextureHelper; | 55 private final SurfaceTextureHelper surfaceTextureHelper; |
| 53 private final Surface mediaRecorderSurface; | 56 private final Surface mediaRecorderSurface; |
| 54 private final String cameraId; | 57 private final String cameraId; |
| 55 private final int width; | 58 private final int width; |
| 56 private final int height; | 59 private final int height; |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 // Undo the mirror that the OS "helps" us with. | 221 // Undo the mirror that the OS "helps" us with. |
| 219 // http://developer.android.com/reference/android/hardware/Camer
a.html#setDisplayOrientation(int) | 222 // http://developer.android.com/reference/android/hardware/Camer
a.html#setDisplayOrientation(int) |
| 220 transformMatrix = RendererCommon.multiplyMatrices( | 223 transformMatrix = RendererCommon.multiplyMatrices( |
| 221 transformMatrix, RendererCommon.horizontalFlipMatrix()); | 224 transformMatrix, RendererCommon.horizontalFlipMatrix()); |
| 222 } | 225 } |
| 223 | 226 |
| 224 // Undo camera orientation - we report it as rotation instead. | 227 // Undo camera orientation - we report it as rotation instead. |
| 225 transformMatrix = | 228 transformMatrix = |
| 226 RendererCommon.rotateTextureMatrix(transformMatrix, -cameraOri
entation); | 229 RendererCommon.rotateTextureMatrix(transformMatrix, -cameraOri
entation); |
| 227 | 230 |
| 228 events.onTextureFrameCaptured(Camera2Session.this, captureFormat.w
idth, | 231 if (videoFrameEmitTrialEnabled) { |
| 229 captureFormat.height, oesTextureId, transformMatrix, rotation,
timestampNs); | 232 VideoFrame.Buffer buffer = surfaceTextureHelper.createTextureBuf
fer( |
| 233 captureFormat.width, captureFormat.height, |
| 234 RendererCommon.convertMatrixToAndroidGraphicsMatrix(transfor
mMatrix)); |
| 235 final VideoFrame frame = new VideoFrame(buffer, rotation, timest
ampNs); |
| 236 events.onFrameCaptured(Camera2Session.this, frame); |
| 237 frame.release(); |
| 238 } else { |
| 239 events.onTextureFrameCaptured(Camera2Session.this, captureFormat
.width, |
| 240 captureFormat.height, oesTextureId, transformMatrix, rotatio
n, timestampNs); |
| 241 } |
| 230 } | 242 } |
| 231 }); | 243 }); |
| 232 Logging.d(TAG, "Camera device successfully started."); | 244 Logging.d(TAG, "Camera device successfully started."); |
| 233 callback.onDone(Camera2Session.this); | 245 callback.onDone(Camera2Session.this); |
| 234 } | 246 } |
| 235 | 247 |
| 236 // Prefers optical stabilization over software stabilization if available. O
nly enables one of | 248 // Prefers optical stabilization over software stabilization if available. O
nly enables one of |
| 237 // the stabilization modes at a time because having both enabled can cause s
trange results. | 249 // the stabilization modes at a time because having both enabled can cause s
trange results. |
| 238 private void chooseStabilizationMode(CaptureRequest.Builder captureRequestBu
ilder) { | 250 private void chooseStabilizationMode(CaptureRequest.Builder captureRequestBu
ilder) { |
| 239 final int[] availableOpticalStabilization = cameraCharacteristics.get( | 251 final int[] availableOpticalStabilization = cameraCharacteristics.get( |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 SurfaceTextureHelper surfaceTextureHelper, MediaRecorder mediaRecorder, St
ring cameraId, | 306 SurfaceTextureHelper surfaceTextureHelper, MediaRecorder mediaRecorder, St
ring cameraId, |
| 295 int width, int height, int framerate) { | 307 int width, int height, int framerate) { |
| 296 new Camera2Session(callback, events, applicationContext, cameraManager, surf
aceTextureHelper, | 308 new Camera2Session(callback, events, applicationContext, cameraManager, surf
aceTextureHelper, |
| 297 mediaRecorder, cameraId, width, height, framerate); | 309 mediaRecorder, cameraId, width, height, framerate); |
| 298 } | 310 } |
| 299 | 311 |
| 300 private Camera2Session(CreateSessionCallback callback, Events events, Context
applicationContext, | 312 private Camera2Session(CreateSessionCallback callback, Events events, Context
applicationContext, |
| 301 CameraManager cameraManager, SurfaceTextureHelper surfaceTextureHelper, | 313 CameraManager cameraManager, SurfaceTextureHelper surfaceTextureHelper, |
| 302 MediaRecorder mediaRecorder, String cameraId, int width, int height, int f
ramerate) { | 314 MediaRecorder mediaRecorder, String cameraId, int width, int height, int f
ramerate) { |
| 303 Logging.d(TAG, "Create new camera2 session on camera " + cameraId); | 315 Logging.d(TAG, "Create new camera2 session on camera " + cameraId); |
| 316 videoFrameEmitTrialEnabled = |
| 317 PeerConnectionFactory.fieldTrialsFindFullName(PeerConnectionFactory.VIDE
O_FRAME_EMIT_TRIAL) |
| 318 .equals(PeerConnectionFactory.TRIAL_ENABLED); |
| 304 | 319 |
| 305 constructionTimeNs = System.nanoTime(); | 320 constructionTimeNs = System.nanoTime(); |
| 306 | 321 |
| 307 this.cameraThreadHandler = new Handler(); | 322 this.cameraThreadHandler = new Handler(); |
| 308 this.callback = callback; | 323 this.callback = callback; |
| 309 this.events = events; | 324 this.events = events; |
| 310 this.applicationContext = applicationContext; | 325 this.applicationContext = applicationContext; |
| 311 this.cameraManager = cameraManager; | 326 this.cameraManager = cameraManager; |
| 312 this.surfaceTextureHelper = surfaceTextureHelper; | 327 this.surfaceTextureHelper = surfaceTextureHelper; |
| 313 this.mediaRecorderSurface = (mediaRecorder != null) ? mediaRecorder.getSurfa
ce() : null; | 328 this.mediaRecorderSurface = (mediaRecorder != null) ? mediaRecorder.getSurfa
ce() : null; |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 456 } | 471 } |
| 457 return (cameraOrientation + rotation) % 360; | 472 return (cameraOrientation + rotation) % 360; |
| 458 } | 473 } |
| 459 | 474 |
| 460 private void checkIsOnCameraThread() { | 475 private void checkIsOnCameraThread() { |
| 461 if (Thread.currentThread() != cameraThreadHandler.getLooper().getThread()) { | 476 if (Thread.currentThread() != cameraThreadHandler.getLooper().getThread()) { |
| 462 throw new IllegalStateException("Wrong thread"); | 477 throw new IllegalStateException("Wrong thread"); |
| 463 } | 478 } |
| 464 } | 479 } |
| 465 } | 480 } |
| OLD | NEW |