From dbaa384af07319b4f7bffe6909e3d470a0e0b672 Mon Sep 17 00:00:00 2001 From: Liong Sauw Ming Date: Thu, 30 Jul 2015 06:23:35 +0000 Subject: Fixed #1861: Add support for video capture orientation on Android git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5138 74dad513-b988-da41-8d7b-12977e46ad98 --- .../src/swig/java/android/AndroidManifest.xml | 1 + .../src/org/pjsip/pjsua2/app/CallActivity.java | 52 ++++++++++++++++++++++ pjsip-apps/src/swig/symbols.i | 2 + pjsip-apps/src/swig/symbols.lst | 2 +- 4 files changed, 56 insertions(+), 1 deletion(-) (limited to 'pjsip-apps') diff --git a/pjsip-apps/src/swig/java/android/AndroidManifest.xml b/pjsip-apps/src/swig/java/android/AndroidManifest.xml index bb2eb28a..9a7463a0 100644 --- a/pjsip-apps/src/swig/java/android/AndroidManifest.xml +++ b/pjsip-apps/src/swig/java/android/AndroidManifest.xml @@ -40,6 +40,7 @@ diff --git a/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/CallActivity.java b/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/CallActivity.java index 91123be7..6df2b7e7 100644 --- a/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/CallActivity.java +++ b/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/CallActivity.java @@ -21,12 +21,17 @@ package org.pjsip.pjsua2.app; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.view.Display; +import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; +import android.view.WindowManager; import android.widget.Button; import android.widget.TextView; import android.app.Activity; +import android.content.Context; +import android.content.res.Configuration; import org.pjsip.pjsua2.*; @@ -130,6 +135,49 @@ public class CallActivity extends Activity } } + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + + WindowManager wm; + Display display; + int rotation; + pjmedia_orient orient; + + wm = (WindowManager)this.getSystemService(Context.WINDOW_SERVICE); + display = wm.getDefaultDisplay(); + rotation = display.getRotation(); + System.out.println("Device orientation changed: " + rotation); + + switch (rotation) { + case Surface.ROTATION_0: // Portrait + orient = pjmedia_orient.PJMEDIA_ORIENT_ROTATE_270DEG; + break; + case Surface.ROTATION_90: // Landscape, home button on the right + orient = pjmedia_orient.PJMEDIA_ORIENT_NATURAL; + break; + case Surface.ROTATION_180: + orient = pjmedia_orient.PJMEDIA_ORIENT_ROTATE_90DEG; + break; + case Surface.ROTATION_270: // Landscape, home button on the left + orient = pjmedia_orient.PJMEDIA_ORIENT_ROTATE_180DEG; + break; + default: + orient = pjmedia_orient.PJMEDIA_ORIENT_UNKNOWN; + } + + if (MyApp.ep != null && MainActivity.account != null) { + try { + AccountConfig cfg = MainActivity.account.cfg; + int cap_dev = cfg.getVideoConfig().getDefaultCaptureDevice(); + MyApp.ep.vidDevManager().setCaptureOrient(cap_dev, orient, + true); + } catch (Exception e) { + System.out.println(e); + } + } + } + @Override protected void onDestroy() { @@ -255,6 +303,10 @@ public class CallActivity extends Activity } else if (m.what == MainActivity.MSG_TYPE.CALL_MEDIA_STATE) { if (MainActivity.currentCall.vidWin != null) { + /* Set capture orientation according to current + * device orientation. + */ + onConfigurationChanged(getResources().getConfiguration()); /* If there's incoming video, display it. */ setupVideoSurface(); } diff --git a/pjsip-apps/src/swig/symbols.i b/pjsip-apps/src/swig/symbols.i index 7f32ff7d..4a59a1a3 100644 --- a/pjsip-apps/src/swig/symbols.i +++ b/pjsip-apps/src/swig/symbols.i @@ -93,6 +93,8 @@ typedef enum pjmedia_dir {PJMEDIA_DIR_NONE = 0, PJMEDIA_DIR_ENCODING = 1, PJMEDI typedef enum pjmedia_tp_proto {PJMEDIA_TP_PROTO_NONE = 0, PJMEDIA_TP_PROTO_RTP_AVP, PJMEDIA_TP_PROTO_RTP_SAVP, PJMEDIA_TP_PROTO_UNKNOWN} pjmedia_tp_proto; +typedef enum pjmedia_orient {PJMEDIA_ORIENT_UNKNOWN, PJMEDIA_ORIENT_NATURAL, PJMEDIA_ORIENT_ROTATE_90DEG, PJMEDIA_ORIENT_ROTATE_180DEG, PJMEDIA_ORIENT_ROTATE_270DEG} pjmedia_orient; + typedef enum pjmedia_format_id {PJMEDIA_FORMAT_L16 = 0, PJMEDIA_FORMAT_PCM = PJMEDIA_FORMAT_L16, PJMEDIA_FORMAT_PCMA = ((('W' << 24) | ('A' << 16)) | ('L' << 8)) | 'A', PJMEDIA_FORMAT_ALAW = PJMEDIA_FORMAT_PCMA, PJMEDIA_FORMAT_PCMU = ((('W' << 24) | ('A' << 16)) | ('L' << 8)) | 'u', PJMEDIA_FORMAT_ULAW = PJMEDIA_FORMAT_PCMU, PJMEDIA_FORMAT_AMR = ((('R' << 24) | ('M' << 16)) | ('A' << 8)) | ' ', PJMEDIA_FORMAT_G729 = ((('9' << 24) | ('2' << 16)) | ('7' << 8)) | 'G', PJMEDIA_FORMAT_ILBC = ((('C' << 24) | ('B' << 16)) | ('L' << 8)) | 'I', PJMEDIA_FORMAT_RGB24 = ((('3' << 24) | ('B' << 16)) | ('G' << 8)) | 'R', PJMEDIA_FORMAT_RGBA = ((('A' << 24) | ('B' << 16)) | ('G' << 8)) | 'R', PJMEDIA_FORMAT_BGRA = ((('A' << 24) | ('R' << 16)) | ('G' << 8)) | 'B', PJMEDIA_FORMAT_RGB32 = PJMEDIA_FORMAT_RGBA, PJMEDIA_FORMAT_DIB = (((' ' << 24) | ('B' << 16)) | ('I' << 8)) | 'D', PJMEDIA_FORMAT_GBRP = ((('P' << 24) | ('R' << 16)) | ('B' << 8)) | 'G', PJMEDIA_FORMAT_AYUV = ((('V' << 24) | ('U' << 16)) | ('Y' << 8)) | 'A', PJMEDIA_FORMAT_YUY2 = ((('2' << 24) | ('Y' << 16)) | ('U' << 8)) | 'Y', PJMEDIA_FORMAT_UYVY = ((('Y' << 24) | ('V' << 16)) | ('Y' << 8)) | 'U', PJMEDIA_FORMAT_YVYU = ((('U' << 24) | ('Y' << 16)) | ('V' << 8)) | 'Y', PJMEDIA_FORMAT_I420 = ((('0' << 24) | ('2' << 16)) | ('4' << 8)) | 'I', PJMEDIA_FORMAT_IYUV = PJMEDIA_FORMAT_I420, PJMEDIA_FORMAT_YV12 = ((('2' << 24) | ('1' << 16)) | ('V' << 8)) | 'Y', PJMEDIA_FORMAT_NV21 = ((('1' << 24) | ('2' << 16)) | ('V' << 8)) | 'N', PJMEDIA_FORMAT_I422 = ((('2' << 24) | ('2' << 16)) | ('4' << 8)) | 'I', PJMEDIA_FORMAT_I420JPEG = ((('0' << 24) | ('2' << 16)) | ('4' << 8)) | 'J', PJMEDIA_FORMAT_I422JPEG = ((('2' << 24) | ('2' << 16)) | ('4' << 8)) | 'J', PJMEDIA_FORMAT_H261 = ((('1' << 24) | ('6' << 16)) | ('2' << 8)) | 'H', PJMEDIA_FORMAT_H263 = ((('3' << 24) | ('6' << 16)) | ('2' << 8)) | 'H', PJMEDIA_FORMAT_H263P = ((('3' << 24) | ('6' << 16)) | ('2' << 8)) | 'P', PJMEDIA_FORMAT_H264 = ((('4' << 24) | ('6' << 16)) | ('2' << 8)) | 'H', PJMEDIA_FORMAT_MJPEG = ((('G' << 24) | ('P' << 16)) | ('J' << 8)) | 'M', PJMEDIA_FORMAT_MPEG1VIDEO = ((('V' << 24) | ('1' << 16)) | ('P' << 8)) | 'M', PJMEDIA_FORMAT_MPEG2VIDEO = ((('V' << 24) | ('2' << 16)) | ('P' << 8)) | 'M', PJMEDIA_FORMAT_MPEG4 = ((('4' << 24) | ('G' << 16)) | ('P' << 8)) | 'M'} pjmedia_format_id; typedef enum pjsip_cred_data_type {PJSIP_CRED_DATA_PLAIN_PASSWD = 0, PJSIP_CRED_DATA_DIGEST = 1, PJSIP_CRED_DATA_EXT_AKA = 16} pjsip_cred_data_type; diff --git a/pjsip-apps/src/swig/symbols.lst b/pjsip-apps/src/swig/symbols.lst index a3e5eae6..ce9f0a36 100644 --- a/pjsip-apps/src/swig/symbols.lst +++ b/pjsip-apps/src/swig/symbols.lst @@ -14,7 +14,7 @@ pjmedia-videodev/videodev.h pjmedia_vid_dev_index pjmedia_vid_dev_std_index pjme pjmedia-audiodev/audiodev.h pjmedia_aud_dev_route pjmedia_aud_dev_cap pjmedia/wav_port.h pjmedia_file_writer_option pjmedia_file_player_option pjmedia/tonegen.h pjmedia_tone_digit pjmedia_tone_digit_map pjmedia_tone_desc -pjmedia/types.h pjmedia_type pjmedia_dir pjmedia_tp_proto +pjmedia/types.h pjmedia_type pjmedia_dir pjmedia_tp_proto pjmedia_orient pjmedia/format.h pjmedia_format_id pjsip/sip_auth.h pjsip_cred_data_type -- cgit v1.2.3