From 3c000dca8cd84a45a2ae8409700088d6271d6183 Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Wed, 1 Dec 2010 11:39:19 +0100 Subject: [PATCH] Portrait mode. --- res/values/strings.xml | 2 +- src/org/linphone/BandwidthManager.java | 6 ++++- src/org/linphone/DialerActivity.java | 8 +----- src/org/linphone/VideoCallActivity.java | 25 +++++++++++++++---- .../linphone/core/AndroidCameraRecord.java | 7 +++++- .../core/AndroidCameraRecordImpl.java | 8 +++--- .../core/AndroidCameraRecordManager.java | 13 +++++++--- src/org/linphone/core/LinphoneCallImpl.java | 5 ++++ 8 files changed, 53 insertions(+), 21 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 127e89c5c..8a8dc7299 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1,7 +1,7 @@ Display dialer - High resolution + Try High resolution Low resolution Change resolution Mute/Unmute camera diff --git a/src/org/linphone/BandwidthManager.java b/src/org/linphone/BandwidthManager.java index b627d6595..2b2038b3f 100644 --- a/src/org/linphone/BandwidthManager.java +++ b/src/org/linphone/BandwidthManager.java @@ -114,8 +114,12 @@ public class BandwidthManager { } private VideoSize closestVideoSize(VideoSize vSize) { + boolean invert = vSize.getHeight() > vSize.getWidth(); + int testHeight = invert?vSize.getWidth():vSize.getHeight(); + int testWidth = invert?vSize.getHeight():vSize.getWidth(); + for (Size s : AndroidCameraRecordManager.getInstance().supportedVideoSizes()) { - if (s.height == vSize.getHeight() && s.width == vSize.getWidth()) { + if (s.height == testHeight && s.width == testWidth) { return vSize; } } diff --git a/src/org/linphone/DialerActivity.java b/src/org/linphone/DialerActivity.java index 6e8641ac5..f6411951d 100644 --- a/src/org/linphone/DialerActivity.java +++ b/src/org/linphone/DialerActivity.java @@ -457,15 +457,9 @@ public class DialerActivity extends Activity implements LinphoneCoreListener { } else if (state == LinphoneCall.State.CallEnd) { exitCallMode(); } else if (state == LinphoneCall.State.StreamsRunning) { - if (LinphoneService.instance().getLinphoneCore().getCurrentCall().getCurrentParamsReadOnly().getVideoEnabled()) { + if (!VideoCallActivity.launched && LinphoneService.instance().getLinphoneCore().getCurrentCall().getCurrentParamsReadOnly().getVideoEnabled()) { startVideoView(VIDEO_VIEW_ACTIVITY); } - } else if (state == LinphoneCall.State.CallUpdated) { - if (LinphoneService.instance().getLinphoneCore().getCurrentCall().getCurrentParamsReadOnly().getVideoEnabled()) { -// getVideoManager().invalidateParameters(); // no, when addinv video to audio call the filters are created before callupdated event is received - // so the parameters are invalidated and the record is never launched - finishActivity(VIDEO_VIEW_ACTIVITY); - } } mCurrentCallState = state; } diff --git a/src/org/linphone/VideoCallActivity.java b/src/org/linphone/VideoCallActivity.java index 3292850b4..3c25333b5 100644 --- a/src/org/linphone/VideoCallActivity.java +++ b/src/org/linphone/VideoCallActivity.java @@ -36,8 +36,12 @@ public class VideoCallActivity extends Activity { SurfaceView mVideoView; SurfaceView mVideoCaptureView; AndroidCameraRecordManager recordManager; + private static final String tag = "Linphone"; + public static boolean launched = false; public void onCreate(Bundle savedInstanceState) { + Log.d(tag, "onCreate VideoCallActivity"); + launched = true; super.onCreate(savedInstanceState); setContentView(R.layout.videocall); @@ -51,7 +55,7 @@ public class VideoCallActivity extends Activity { recordManager.setSurfaceView(mVideoCaptureView, rotation); mVideoCaptureView.setZOrderOnTop(true); } - + private void rewriteToggleCameraItem(MenuItem item) { if (recordManager.isRecording()) { @@ -63,13 +67,13 @@ public class VideoCallActivity extends Activity { private void rewriteChangeResolutionItem(MenuItem item) { if (BandwidthManager.getInstance().isUserRestriction()) { - item.setTitle(getString(R.string.menu_videocall_change_resolution_when_high_resolution)); - } else { item.setTitle(getString(R.string.menu_videocall_change_resolution_when_low_resolution)); + } else { + item.setTitle(getString(R.string.menu_videocall_change_resolution_when_high_resolution)); } } - + @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the currently selected menu XML resource. @@ -103,6 +107,10 @@ public class VideoCallActivity extends Activity { break; case R.id.videocall_menu_toggle_camera: recordManager.toggleMute(); + LinphoneCore lc = LinphoneService.instance().getLinphoneCore(); + if (lc.isIncall()) { + lc.getCurrentCall().enableCamera(!recordManager.isMuted()); + } rewriteToggleCameraItem(item); break; default: @@ -121,9 +129,16 @@ public class VideoCallActivity extends Activity { @Override protected void onDestroy() { - // TODO Auto-generated method stub + Log.d(tag, "onDestroy VideoCallActivity"); + launched = false; super.onDestroy(); } + @Override + protected void onPause() { + Log.d(tag, "onPause VideoCallActivity"); + super.onPause(); + } + } diff --git a/src/org/linphone/core/AndroidCameraRecord.java b/src/org/linphone/core/AndroidCameraRecord.java index c691a3176..9d8b2f144 100644 --- a/src/org/linphone/core/AndroidCameraRecord.java +++ b/src/org/linphone/core/AndroidCameraRecord.java @@ -77,7 +77,11 @@ public abstract class AndroidCameraRecord { } parameters.set("camera-id", params.cameraId); - parameters.setPreviewSize(params.width, params.height); + if (!params.videoDimensionsInverted) { + parameters.setPreviewSize(params.width, params.height); + } else { + parameters.setPreviewSize(params.height, params.width); + } parameters.setPreviewFrameRate(Math.round(params.fps)); if (parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_AUTO)) { Log.w(tag, "Auto Focus supported by camera device"); @@ -182,6 +186,7 @@ public abstract class AndroidCameraRecord { int cameraId; int rotation; public SurfaceView surfaceView; + boolean videoDimensionsInverted; public RecorderParams(long ptr) { filterDataNativePtr = ptr; diff --git a/src/org/linphone/core/AndroidCameraRecordImpl.java b/src/org/linphone/core/AndroidCameraRecordImpl.java index 0409d5cb4..2d3087854 100644 --- a/src/org/linphone/core/AndroidCameraRecordImpl.java +++ b/src/org/linphone/core/AndroidCameraRecordImpl.java @@ -35,17 +35,19 @@ public class AndroidCameraRecordImpl extends AndroidCameraRecord implements Prev private double timeElapsedBetweenFrames = 0; private long lastFrameTime = 0; private final double expectedTimeBetweenFrames; + private boolean videoDimensionsInverted; public AndroidCameraRecordImpl(RecorderParams parameters) { super(parameters); expectedTimeBetweenFrames = 1d / Math.round(parameters.fps); filterCtxPtr = parameters.filterDataNativePtr; + videoDimensionsInverted = parameters.videoDimensionsInverted; storePreviewCallBack(this); } - private native void putImage(long filterCtxPtr, byte[] buffer, int orientation); + private native void putImage(long filterCtxPtr, byte[] buffer, int orientation, boolean videoDimensionsInverted); public void onPreviewFrame(byte[] data, Camera camera) { @@ -69,7 +71,7 @@ public class AndroidCameraRecordImpl extends AndroidCameraRecord implements Prev long curTime = System.currentTimeMillis(); if (lastFrameTime == 0) { lastFrameTime = curTime; - putImage(filterCtxPtr, data, getOrientationCode()); + putImage(filterCtxPtr, data, getOrientationCode(), videoDimensionsInverted); return; } @@ -82,7 +84,7 @@ public class AndroidCameraRecordImpl extends AndroidCameraRecord implements Prev timeElapsedBetweenFrames = currentTimeElapsed; // Log.d("onPreviewFrame: ", Integer.toString(data.length)); - putImage(filterCtxPtr, data, getOrientationCode()); + putImage(filterCtxPtr, data, getOrientationCode(), videoDimensionsInverted); } diff --git a/src/org/linphone/core/AndroidCameraRecordManager.java b/src/org/linphone/core/AndroidCameraRecordManager.java index 159cc4c5a..02e7eb497 100644 --- a/src/org/linphone/core/AndroidCameraRecordManager.java +++ b/src/org/linphone/core/AndroidCameraRecordManager.java @@ -44,7 +44,7 @@ public class AndroidCameraRecordManager { public static final int CAMERA_ID_FIXME_USE_PREFERENCE = 0; private static final int version = Integer.parseInt(Build.VERSION.SDK); private static Map instances = new HashMap(); - + // singleton private AndroidCameraRecordManager(int cameraId) { @@ -83,16 +83,19 @@ public class AndroidCameraRecordManager { private List supportedVideoSizes; private int rotation; + private static final String tag = "Linphone"; public void setParametersFromFilter(long filterDataPtr, int height, int width, float fps) { + stopVideoRecording(); RecorderParams p = new RecorderParams(filterDataPtr); p.fps = fps; p.width = width; p.height = height; p.cameraId = cameraId; + p.videoDimensionsInverted = width < height; parameters = p; - } + } public final void setSurfaceView(final SurfaceView sv, final int rotation) { @@ -103,16 +106,20 @@ public class AndroidCameraRecordManager { holder.addCallback(new Callback() { public void surfaceDestroyed(SurfaceHolder holder) { surfaceView = null; + Log.d(tag , "Video capture surface destroyed"); stopVideoRecording(); } public void surfaceCreated(SurfaceHolder holder) { surfaceView = sv; + Log.d(tag , "Video capture surface created"); tryToStartVideoRecording(); } public void surfaceChanged(SurfaceHolder holder, int format, int width, - int height) {} + int height) { + Log.d(tag , "Video capture surface changed"); + } }); } diff --git a/src/org/linphone/core/LinphoneCallImpl.java b/src/org/linphone/core/LinphoneCallImpl.java index b6194c26f..a73492274 100644 --- a/src/org/linphone/core/LinphoneCallImpl.java +++ b/src/org/linphone/core/LinphoneCallImpl.java @@ -30,6 +30,7 @@ class LinphoneCallImpl implements LinphoneCall { native private long getRemoteAddress(long nativePtr); native private int getState(long nativePtr); private native long getCurrentParams(long nativePtr); + private native void enableCamera(long nativePtr, boolean enabled); protected LinphoneCallImpl(long aNativePtr) { nativePtr = aNativePtr; @@ -66,4 +67,8 @@ class LinphoneCallImpl implements LinphoneCall { public LinphoneCallParams getCurrentParamsReadWrite() { return getCurrentParamsReadOnly().copy(); } + + public void enableCamera(boolean enabled) { + enableCamera(nativePtr, enabled); + } }