diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2011-09-27 05:24:06 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2011-09-27 05:24:06 +0000 |
commit | ba2dc4a7b2dc047fafca1f64c3503f0b1d40e473 (patch) | |
tree | 213670834574f38022cc009e6530d78d039238f8 | |
parent | 6fe9c8763fd075ddd2affec20e4a9d880dc0bdb7 (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.h | 19 | ||||
-rw-r--r-- | pjmedia/include/pjmedia/event.h | 7 | ||||
-rw-r--r-- | pjmedia/include/pjmedia/types.h | 37 | ||||
-rw-r--r-- | pjmedia/src/pjmedia-videodev/videodev.c | 4 | ||||
-rw-r--r-- | pjsip/include/pjsua-lib/pjsua.h | 15 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_vid.c | 60 |
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, |