[pjsip] Android camera rotation

Сергей Митрофанов goretz.m at gmail.com
Mon Apr 4 07:42:36 EDT 2016


Yesterday I have published a patch, but today rechecked and it produces
incorrect rotations for back camera.
Here is the correct one patch.
It works without any additional rotation offset calculations in app and
with it pjsip rotations are mapped to android screen orientations directly.

Was in test app:

wm = (WindowManager)this.getSystemService(Context.WINDOW_SERVICE);
display = wm.getDefaultDisplay();
rotation = display.getRotation();
Log.d("CallActivity", "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;
}

With this patch:

wm = (WindowManager)this.getSystemService(Context.WINDOW_SERVICE);
display = wm.getDefaultDisplay();
rotation = display.getRotation();
Log.d("CallActivity", "Device orientation changed: " + rotation);
switch (rotation) {
    case Surface.ROTATION_0:   // Portrait
        orient = pjmedia_orient.PJMEDIA_ORIENT_NATURAL;
        break;
    case Surface.ROTATION_90:  // Landscape, home button on the right
        orient = pjmedia_orient.PJMEDIA_ORIENT_ROTATE_90DEG;
        break;
    case Surface.ROTATION_180:
        orient = pjmedia_orient.PJMEDIA_ORIENT_ROTATE_180DEG;
        break;
    case Surface.ROTATION_270: // Landscape, home button on the left
        orient = pjmedia_orient.PJMEDIA_ORIENT_ROTATE_270DEG;
        break;
    default:
        orient = pjmedia_orient.PJMEDIA_ORIENT_UNKNOWN;
}

And this works correct for both facing and back cameras without any
additional work in application.


вс, 3 апр. 2016 г. в 17:25, Сергей Митрофанов <goretz.m at gmail.com>:

> Hi!
>
> I have found that pjsip does not respect initial camera rotation in
> android devices.
> Sure the android_dev.c itself extracts the rotation value from android
> camera devices,
> but for now this value is actually not used, resulting wrong capture video
> orientation.
> I made a simple patch (a little bit raw code style) that resolves this bug.
> It takes the camera rotation value in the game and make PJSUA2 easier to
> use - developer need no more think about camera initial rotation and tweak
> the rotation value before giving it to PJSUA2 itself.
>
> Here is the diff patch for the changes:
>
> From 1ea38ce9103f6fadd9812f635c83442994fd37ea Mon Sep 17 00:00:00 2001
>
> From: Sergey Mitrofanov <GOretZ.M at gmail.com>
>
> Date: Sun, 3 Apr 2016 17:21:48 +0300
>
> Subject: [PATCH] Fixing to respect initial camera rotation in android
> devices.
>
>
> ---
>
>  pjmedia/src/pjmedia-videodev/android_dev.c | 36
> ++++++++++++++++++++++++++++++
>
>  1 file changed, 36 insertions(+)
>
>
> diff --git a/pjmedia/src/pjmedia-videodev/android_dev.c
> b/pjmedia/src/pjmedia-videodev/android_dev.c
>
> index 1da7261..fd6e61d 100644
>
> --- a/pjmedia/src/pjmedia-videodev/android_dev.c
>
> +++ b/pjmedia/src/pjmedia-videodev/android_dev.c
>
> @@ -72,6 +72,7 @@ typedef struct and_dev_info
>
>      pjmedia_vid_dev_info info; /**< Base info         */
>
>      unsigned dev_idx; /**< Original dev ID   */
>
>      pj_bool_t facing; /**< Front/back camera?*/
>
> +    unsigned rotation; /**< initial camera rotation*/
>
>      unsigned sup_size_cnt; /**< # of supp'd size  */
>
>      pjmedia_rect_size *sup_size; /**< Supported size    */
>
>      unsigned sup_fps_cnt; /**< # of supp'd FPS   */
>
> @@ -532,6 +533,8 @@ static pj_status_t
> and_factory_refresh(pjmedia_vid_dev_factory *ff)
>
>   } else {
>
>       pj_ansi_strncpy(vdi->name, "Front camera", sizeof(vdi->name));
>
>   }
>
> + adi->rotation = (*jni_env)->GetIntField(jni_env, jdev_info,
>
> + jobjs.cam_info.f_orient);
>
>
>
>   /* Get supported sizes */
>
>   jtmp = (*jni_env)->GetObjectField(jni_env, jdev_info,
>
> @@ -1001,6 +1004,39 @@ static pj_status_t
> and_stream_set_cap(pjmedia_vid_dev_stream *s,
>
>   else if (eff_ori == PJMEDIA_ORIENT_ROTATE_270DEG)
>
>       eff_ori = PJMEDIA_ORIENT_ROTATE_90DEG;
>
>       }
>
> +     /* Normalize the orientation for rotated camera */
>
> +     switch(adi->rotation){
>
> + case 90:
>
> + if (eff_ori == PJMEDIA_ORIENT_ROTATE_90DEG)
>
> +     eff_ori = PJMEDIA_ORIENT_ROTATE_180DEG;
>
> + else if (eff_ori == PJMEDIA_ORIENT_ROTATE_180DEG)
>
> +     eff_ori = PJMEDIA_ORIENT_ROTATE_270DEG;
>
> + else if (eff_ori == PJMEDIA_ORIENT_ROTATE_270DEG)
>
> +     eff_ori = PJMEDIA_ORIENT_NATURAL;
>
> + else if (eff_ori == PJMEDIA_ORIENT_NATURAL)
>
> +     eff_ori = PJMEDIA_ORIENT_ROTATE_90DEG;
>
> + break;
>
> + case 180:
>
> + if (eff_ori == PJMEDIA_ORIENT_ROTATE_90DEG)
>
> +     eff_ori = PJMEDIA_ORIENT_ROTATE_270DEG;
>
> + else if (eff_ori == PJMEDIA_ORIENT_ROTATE_180DEG)
>
> +     eff_ori = PJMEDIA_ORIENT_NATURAL;
>
> + else if (eff_ori == PJMEDIA_ORIENT_ROTATE_270DEG)
>
> +     eff_ori = PJMEDIA_ORIENT_ROTATE_90DEG;
>
> + else if (eff_ori == PJMEDIA_ORIENT_NATURAL)
>
> +     eff_ori = PJMEDIA_ORIENT_ROTATE_180DEG;
>
> + break;
>
> + case 270:
>
> + if (eff_ori == PJMEDIA_ORIENT_ROTATE_90DEG)
>
> +     eff_ori = PJMEDIA_ORIENT_NATURAL;
>
> + else if (eff_ori == PJMEDIA_ORIENT_ROTATE_180DEG)
>
> +     eff_ori = PJMEDIA_ORIENT_ROTATE_90DEG;
>
> + else if (eff_ori == PJMEDIA_ORIENT_ROTATE_270DEG)
>
> +     eff_ori = PJMEDIA_ORIENT_ROTATE_180DEG;
>
> + else if (eff_ori == PJMEDIA_ORIENT_NATURAL)
>
> +     eff_ori = PJMEDIA_ORIENT_ROTATE_270DEG;
>
> + break;
>
> +     }
>
>       pjmedia_vid_dev_conv_set_rotation(&strm->conv, eff_ori);
>
>
>
>       PJ_LOG(4, (THIS_FILE, "Video capture orientation set to %d",
>
> --
>
> 2.6.4 (Apple Git-63)
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.pjsip.org/pipermail/pjsip_lists.pjsip.org/attachments/20160404/e45bc7c2/attachment-0002.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: android_camera_rotation.patch
Type: application/octet-stream
Size: 3085 bytes
Desc: not available
URL: <http://lists.pjsip.org/pipermail/pjsip_lists.pjsip.org/attachments/20160404/e45bc7c2/attachment.patch>


More information about the pjsip mailing list