summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2011-09-27 05:24:06 +0000
committerNanang Izzuddin <nanang@teluu.com>2011-09-27 05:24:06 +0000
commitba2dc4a7b2dc047fafca1f64c3503f0b1d40e473 (patch)
tree213670834574f38022cc009e6530d78d039238f8
parent6fe9c8763fd075ddd2affec20e4a9d880dc0bdb7 (diff)
Close #1360: implementated video orientation (currently only for video devices).
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3774 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjmedia/include/pjmedia-videodev/videodev.h19
-rw-r--r--pjmedia/include/pjmedia/event.h7
-rw-r--r--pjmedia/include/pjmedia/types.h37
-rw-r--r--pjmedia/src/pjmedia-videodev/videodev.c4
-rw-r--r--pjsip/include/pjsua-lib/pjsua.h15
-rw-r--r--pjsip/src/pjsua-lib/pjsua_vid.c60
6 files changed, 141 insertions, 1 deletions
diff --git a/pjmedia/include/pjmedia-videodev/videodev.h b/pjmedia/include/pjmedia-videodev/videodev.h
index 0c3d4c82..208b96c6 100644
--- a/pjmedia/include/pjmedia-videodev/videodev.h
+++ b/pjmedia/include/pjmedia-videodev/videodev.h
@@ -194,6 +194,18 @@ typedef enum pjmedia_vid_dev_cap
PJMEDIA_VID_DEV_CAP_INPUT_PREVIEW = 64,
/**
+ * Support for changing video orientation in renderer and querying
+ * video orientation info in capture. Changing video orientation in
+ * a renderer will potentially affect the size of render window,
+ * i.e: width and height swap. When a capture device supports this
+ * capability, it will generate event PJMEDIA_EVENT_ORIENT_CHANGED
+ * (see #pjmedia_event) everytime the capture orientation is changed.
+ *
+ * The value of this capability is pjmedia_orient.
+ */
+ PJMEDIA_VID_DEV_CAP_ORIENTATION = 128,
+
+ /**
* End of standard capability
*/
PJMEDIA_VID_DEV_CAP_MAX = 16384
@@ -369,6 +381,13 @@ typedef struct pjmedia_vid_dev_param
*/
pj_bool_t native_preview;
+ /**
+ * Video orientation. This setting is optional and is only used if
+ * PJMEDIA_VID_DEV_CAP_ORIENTATION capability is supported and is
+ * set in the flags.
+ */
+ pjmedia_orient orient;
+
} pjmedia_vid_dev_param;
diff --git a/pjmedia/include/pjmedia/event.h b/pjmedia/include/pjmedia/event.h
index ddcffc02..259f7264 100644
--- a/pjmedia/include/pjmedia/event.h
+++ b/pjmedia/include/pjmedia/event.h
@@ -78,7 +78,12 @@ typedef enum pjmedia_event_type
/**
* Video decoding error due to missing key frame event.
*/
- PJMEDIA_EVENT_KEY_FRAME_MISSING = PJMEDIA_FOURCC('I', 'F', 'R', 'M')
+ PJMEDIA_EVENT_KEY_FRAME_MISSING = PJMEDIA_FOURCC('I', 'F', 'R', 'M'),
+
+ /**
+ * Video orientation has been changed event.
+ */
+ PJMEDIA_EVENT_ORIENT_CHANGED = PJMEDIA_FOURCC('O', 'R', 'N', 'T')
} pjmedia_event_type;
diff --git a/pjmedia/include/pjmedia/types.h b/pjmedia/include/pjmedia/types.h
index 6a660f0c..20e93d69 100644
--- a/pjmedia/include/pjmedia/types.h
+++ b/pjmedia/include/pjmedia/types.h
@@ -192,6 +192,43 @@ typedef struct pjmedia_rect
} pjmedia_rect;
/**
+ * Enumeration for video/picture orientation.
+ */
+typedef enum pjmedia_orient
+{
+ /**
+ * Unknown orientation.
+ */
+ PJMEDIA_ORIENT_UNKNOWN,
+
+ /**
+ * Natural orientation, e.g: sky upside on landscape view, head upside
+ * on human portrait.
+ */
+ PJMEDIA_ORIENT_NATURAL,
+
+ /**
+ * Specifies that the video/picture needs to be rotated 90 degrees
+ * clockwise to be displayed in natural orientation.
+ */
+ PJMEDIA_ORIENT_ROTATE_90DEG,
+
+ /**
+ * Specifies that the video/picture needs to be rotated 180 degrees
+ * clockwise to be displayed in natural orientation.
+ */
+ PJMEDIA_ORIENT_ROTATE_180DEG,
+
+ /**
+ * Specifies that the video/picture needs to be rotated 270 degrees
+ * clockwise to be displayed in natural orientation.
+ */
+ PJMEDIA_ORIENT_ROTATE_270DEG
+
+} pjmedia_orient;
+
+
+/**
* Macro for packing format from a four character code, similar to FOURCC.
*/
#define PJMEDIA_FOURCC(C1, C2, C3, C4) ( C4<<24 | C3<<16 | C2<<8 | C1 )
diff --git a/pjmedia/src/pjmedia-videodev/videodev.c b/pjmedia/src/pjmedia-videodev/videodev.c
index f2523d79..6921f67b 100644
--- a/pjmedia/src/pjmedia-videodev/videodev.c
+++ b/pjmedia/src/pjmedia-videodev/videodev.c
@@ -45,6 +45,7 @@ static struct cap_info
DEFINE_CAP("position", "Renderer position"),
DEFINE_CAP("hide", "Renderer hide"),
DEFINE_CAP("preview", "Input preview"),
+ DEFINE_CAP("orientation", "Video orientation")
};
@@ -179,6 +180,9 @@ static pj_status_t get_cap_pointer(const pjmedia_vid_dev_param *param,
case PJMEDIA_VID_DEV_CAP_INPUT_PREVIEW:
FIELD_INFO(native_preview);
break;
+ case PJMEDIA_VID_DEV_CAP_ORIENTATION:
+ FIELD_INFO(orient);
+ break;
default:
return PJMEDIA_EVID_INVCAP;
}
diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h
index f768438d..e3ba048a 100644
--- a/pjsip/include/pjsua-lib/pjsua.h
+++ b/pjsip/include/pjsua-lib/pjsua.h
@@ -5718,6 +5718,21 @@ PJ_DECL(pj_status_t) pjsua_vid_win_set_pos(pjsua_vid_win_id wid,
PJ_DECL(pj_status_t) pjsua_vid_win_set_size(pjsua_vid_win_id wid,
const pjmedia_rect_size *size);
+/**
+ * Rotate the video window. This function will change the video orientation
+ * and also possibly the video window size (width and height get swapped).
+ * This operation is not valid for native windows (pjsua_vid_win_info.is_native
+ * =PJ_TRUE), on which native windowing API must be used instead.
+ *
+ * @param wid The video window ID.
+ * @param angle The rotation angle in degrees, must be multiple of 90.
+ * Specify positive value for clockwise rotation or
+ * negative value for counter-clockwise rotation.
+ *
+ * @return PJ_SUCCESS on success, or the appropriate error code.
+ */
+PJ_DECL(pj_status_t) pjsua_vid_win_rotate(pjsua_vid_win_id wid,
+ int angle);
/*
diff --git a/pjsip/src/pjsua-lib/pjsua_vid.c b/pjsip/src/pjsua-lib/pjsua_vid.c
index ddce5324..fe9c5925 100644
--- a/pjsip/src/pjsua-lib/pjsua_vid.c
+++ b/pjsip/src/pjsua-lib/pjsua_vid.c
@@ -1363,6 +1363,66 @@ PJ_DEF(pj_status_t) pjsua_vid_win_set_size( pjsua_vid_win_id wid,
return status;
}
+/*
+ * Set video orientation.
+ */
+PJ_DEF(pj_status_t) pjsua_vid_win_rotate( pjsua_vid_win_id wid,
+ int angle)
+{
+ pjsua_vid_win *w;
+ pjmedia_vid_dev_stream *s;
+ pjmedia_orient orient;
+ pj_status_t status;
+
+ PJ_ASSERT_RETURN(wid >= 0 && wid < PJSUA_MAX_VID_WINS, PJ_EINVAL);
+ PJ_ASSERT_RETURN((angle % 90) == 0, PJ_EINVAL);
+
+ /* Normalize angle, so it must be 0, 90, 180, or 270. */
+ angle %= 360;
+ if (angle < 0)
+ angle += 360;
+
+ /* Convert angle to pjmedia_orient */
+ switch(angle) {
+ case 0:
+ /* No rotation */
+ return PJ_SUCCESS;
+ case 90:
+ orient = PJMEDIA_ORIENT_ROTATE_90DEG;
+ break;
+ case 180:
+ orient = PJMEDIA_ORIENT_ROTATE_180DEG;
+ break;
+ case 270:
+ orient = PJMEDIA_ORIENT_ROTATE_270DEG;
+ break;
+ default:
+ pj_assert(!"Angle must have been validated");
+ return PJ_EBUG;
+ }
+
+ PJSUA_LOCK();
+ w = &pjsua_var.win[wid];
+ if (w->vp_rend == NULL) {
+ /* Native window */
+ PJSUA_UNLOCK();
+ return PJ_EINVAL;
+ }
+
+ s = pjmedia_vid_port_get_stream(w->vp_rend);
+ if (s == NULL) {
+ PJSUA_UNLOCK();
+ return PJ_EINVAL;
+ }
+
+ status = pjmedia_vid_dev_stream_set_cap(s,
+ PJMEDIA_VID_DEV_CAP_ORIENTATION, &orient);
+
+ PJSUA_UNLOCK();
+
+ return status;
+}
+
static void call_get_vid_strm_info(pjsua_call *call,
int *first_active,