Re #1213 (Video devices):
 - Video device now opens in "best effort" mode, i.e. it may open with different size and fps than requested. The actual size and fps will be reflected in the "param" upon return. The vidport must check this against any differences, and create converter accordingly.
 - Removed const for param argument in vid_create_stream() API
 - Currently converter in vidport will not work if vidport is opened in bidir. Converter for renderer is untested



git-svn-id: https://svn.pjsip.org/repos/pjproject/branches/projects/2.0-dev@3489 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjmedia/src/pjmedia-videodev/colorbar_dev.c b/pjmedia/src/pjmedia-videodev/colorbar_dev.c
index 602a05d..51cc01a 100644
--- a/pjmedia/src/pjmedia-videodev/colorbar_dev.c
+++ b/pjmedia/src/pjmedia-videodev/colorbar_dev.c
@@ -109,7 +109,7 @@
 					      pjmedia_vid_param *param);
 static pj_status_t cbar_factory_create_stream(
 					pjmedia_vid_dev_factory *f,
-					const pjmedia_vid_param *param,
+					pjmedia_vid_param *param,
 					const pjmedia_vid_cb *cb,
 					void *user_data,
 					pjmedia_vid_dev_stream **p_vid_strm);
@@ -362,7 +362,7 @@
 /* API: create stream */
 static pj_status_t cbar_factory_create_stream(
 					pjmedia_vid_dev_factory *f,
-					const pjmedia_vid_param *param,
+					pjmedia_vid_param *param,
 					const pjmedia_vid_cb *cb,
 					void *user_data,
 					pjmedia_vid_dev_stream **p_vid_strm)
diff --git a/pjmedia/src/pjmedia-videodev/dshow_dev.c b/pjmedia/src/pjmedia-videodev/dshow_dev.c
index 7dd2b9d..600e419 100644
--- a/pjmedia/src/pjmedia-videodev/dshow_dev.c
+++ b/pjmedia/src/pjmedia-videodev/dshow_dev.c
@@ -132,7 +132,7 @@
 					       pjmedia_vid_param *param);
 static pj_status_t dshow_factory_create_stream(
 					pjmedia_vid_dev_factory *f,
-					const pjmedia_vid_param *param,
+					pjmedia_vid_param *param,
 					const pjmedia_vid_cb *cb,
 					void *user_data,
 					pjmedia_vid_dev_stream **p_vid_strm);
@@ -710,7 +710,7 @@
 /* API: create stream */
 static pj_status_t dshow_factory_create_stream(
 					pjmedia_vid_dev_factory *f,
-					const pjmedia_vid_param *param,
+					pjmedia_vid_param *param,
 					const pjmedia_vid_cb *cb,
 					void *user_data,
 					pjmedia_vid_dev_stream **p_vid_strm)
diff --git a/pjmedia/src/pjmedia-videodev/ffmpeg_dev.c b/pjmedia/src/pjmedia-videodev/ffmpeg_dev.c
index 6e6ff8e..a2017da 100644
--- a/pjmedia/src/pjmedia-videodev/ffmpeg_dev.c
+++ b/pjmedia/src/pjmedia-videodev/ffmpeg_dev.c
@@ -88,7 +88,7 @@
 					        pjmedia_vid_param *param);
 static pj_status_t ffmpeg_factory_create_stream(
 					pjmedia_vid_dev_factory *f,
-					const pjmedia_vid_param *param,
+					pjmedia_vid_param *param,
 					const pjmedia_vid_cb *cb,
 					void *user_data,
 					pjmedia_vid_dev_stream **p_vid_strm);
@@ -336,7 +336,7 @@
 /* API: create stream */
 static pj_status_t ffmpeg_factory_create_stream(
 					pjmedia_vid_dev_factory *f,
-					const pjmedia_vid_param *param,
+					pjmedia_vid_param *param,
 					const pjmedia_vid_cb *cb,
 					void *user_data,
 					pjmedia_vid_dev_stream **p_vid_strm)
diff --git a/pjmedia/src/pjmedia-videodev/ios_dev.m b/pjmedia/src/pjmedia-videodev/ios_dev.m
index 0d2c4b8..9a311c2 100644
--- a/pjmedia/src/pjmedia-videodev/ios_dev.m
+++ b/pjmedia/src/pjmedia-videodev/ios_dev.m
@@ -111,7 +111,7 @@
 					     pjmedia_vid_param *param);
 static pj_status_t ios_factory_create_stream(
 					pjmedia_vid_dev_factory *f,
-					const pjmedia_vid_param *param,
+					pjmedia_vid_param *param,
 					const pjmedia_vid_cb *cb,
 					void *user_data,
 					pjmedia_vid_dev_stream **p_vid_strm);
@@ -384,7 +384,7 @@
 /* API: create stream */
 static pj_status_t ios_factory_create_stream(
 					pjmedia_vid_dev_factory *f,
-					const pjmedia_vid_param *param,
+					pjmedia_vid_param *param,
 					const pjmedia_vid_cb *cb,
 					void *user_data,
 					pjmedia_vid_dev_stream **p_vid_strm)
diff --git a/pjmedia/src/pjmedia-videodev/qt_dev.m b/pjmedia/src/pjmedia-videodev/qt_dev.m
index aed74c3..d7431ea 100644
--- a/pjmedia/src/pjmedia-videodev/qt_dev.m
+++ b/pjmedia/src/pjmedia-videodev/qt_dev.m
@@ -102,7 +102,7 @@
 					    pjmedia_vid_param *param);
 static pj_status_t qt_factory_create_stream(
 					pjmedia_vid_dev_factory *f,
-					const pjmedia_vid_param *param,
+					pjmedia_vid_param *param,
 					const pjmedia_vid_cb *cb,
 					void *user_data,
 					pjmedia_vid_dev_stream **p_vid_strm);
@@ -348,7 +348,7 @@
 /* API: create stream */
 static pj_status_t qt_factory_create_stream(
 					pjmedia_vid_dev_factory *f,
-					const pjmedia_vid_param *param,
+					pjmedia_vid_param *param,
 					const pjmedia_vid_cb *cb,
 					void *user_data,
 					pjmedia_vid_dev_stream **p_vid_strm)
diff --git a/pjmedia/src/pjmedia-videodev/sdl_dev.c b/pjmedia/src/pjmedia-videodev/sdl_dev.c
index b40decc..815e5c5 100644
--- a/pjmedia/src/pjmedia-videodev/sdl_dev.c
+++ b/pjmedia/src/pjmedia-videodev/sdl_dev.c
@@ -130,7 +130,7 @@
 					     pjmedia_vid_param *param);
 static pj_status_t sdl_factory_create_stream(
 					pjmedia_vid_dev_factory *f,
-					const pjmedia_vid_param *param,
+					pjmedia_vid_param *param,
 					const pjmedia_vid_cb *cb,
 					void *user_data,
 					pjmedia_vid_dev_stream **p_vid_strm);
@@ -578,7 +578,7 @@
 /* API: create stream */
 static pj_status_t sdl_factory_create_stream(
 					pjmedia_vid_dev_factory *f,
-					const pjmedia_vid_param *param,
+					pjmedia_vid_param *param,
 					const pjmedia_vid_cb *cb,
 					void *user_data,
 					pjmedia_vid_dev_stream **p_vid_strm)
diff --git a/pjmedia/src/pjmedia-videodev/v4l2_dev.c b/pjmedia/src/pjmedia-videodev/v4l2_dev.c
index e126048..4ae7711 100644
--- a/pjmedia/src/pjmedia-videodev/v4l2_dev.c
+++ b/pjmedia/src/pjmedia-videodev/v4l2_dev.c
@@ -128,7 +128,7 @@
 					         unsigned index,
 					         pjmedia_vid_param *param);
 static pj_status_t vid4lin_factory_create_stream(pjmedia_vid_dev_factory *f,
-						 const pjmedia_vid_param *prm,
+						 pjmedia_vid_param *prm,
 					         const pjmedia_vid_cb *cb,
 					         void *user_data,
 					         pjmedia_vid_dev_stream **p);
@@ -411,7 +411,7 @@
 					const pjmedia_vid_param *param,
 					pj_uint32_t pix_fmt)
 {
-    const pjmedia_video_format_detail *vfd;
+    pjmedia_video_format_detail *vfd;
     struct v4l2_format v4l2_fmt;
     pj_status_t status;
 
@@ -437,8 +437,9 @@
     if ((v4l2_fmt.fmt.pix.width != vfd->size.w) ||
 	(v4l2_fmt.fmt.pix.height != vfd->size.h))
     {
-	status = PJMEDIA_EVID_BADSIZE;
-	return status;
+	/* Size has changed */
+	vfd->size.w = v4l2_fmt.fmt.pix.width;
+	vfd->size.h = v4l2_fmt.fmt.pix.height;
     }
 
     return PJ_SUCCESS;
@@ -513,7 +514,7 @@
 
 /* API: create stream */
 static pj_status_t vid4lin_factory_create_stream(pjmedia_vid_dev_factory *f,
-				      const pjmedia_vid_param *param,
+				      pjmedia_vid_param *param,
 				      const pjmedia_vid_cb *cb,
 				      void *user_data,
 				      pjmedia_vid_dev_stream **p_vid_strm)
@@ -524,8 +525,10 @@
     vid4lin_dev_info *vdi;
     const vid4lin_fmt_map *fmt_map;
     const pjmedia_video_format_info *fmt_info;
+    pjmedia_video_format_detail *vfd;
     pj_status_t status = PJ_SUCCESS;
 
+
     PJ_ASSERT_RETURN(f && param && p_vid_strm, PJ_EINVAL);
     PJ_ASSERT_RETURN(param->fmt.type == PJMEDIA_TYPE_VIDEO &&
 		     param->fmt.detail_type == PJMEDIA_FORMAT_DETAIL_VIDEO,
@@ -538,6 +541,7 @@
         return PJMEDIA_EVID_BADFORMAT;
 
     vdi = &cf->dev_info[param->cap_id];
+    vfd = pjmedia_format_get_video_format_detail(&param->fmt, PJ_TRUE);
 
     /* Create and Initialize stream descriptor */
     pool = pj_pool_create(cf->pf, vdi->info.name, 512, 512, NULL);
@@ -552,9 +556,6 @@
     stream->user_data = user_data;
     stream->fd = INVALID_FD;
 
-    PJ_LOG(4,(THIS_FILE, "Opening video4linux2 device %s: format=%s..",
-	      stream->name, fmt_info->name));
-
     stream->fd = v4l2_open(vdi->dev_name, O_RDWR | O_NONBLOCK, 0);
     if (stream->fd < 0)
 	goto on_error;
diff --git a/pjmedia/src/pjmedia-videodev/videodev.c b/pjmedia/src/pjmedia-videodev/videodev.c
index 522f415..af298ae 100644
--- a/pjmedia/src/pjmedia-videodev/videodev.c
+++ b/pjmedia/src/pjmedia-videodev/videodev.c
@@ -609,13 +609,12 @@
 
 /* API: Open video stream object using the specified parameters. */
 PJ_DEF(pj_status_t) pjmedia_vid_dev_stream_create(
-					const pjmedia_vid_param *prm,
+					pjmedia_vid_param *prm,
 					const pjmedia_vid_cb *cb,
 					void *user_data,
 					pjmedia_vid_dev_stream **p_vid_strm)
 {
     pjmedia_vid_dev_factory *cap_f=NULL, *rend_f=NULL, *f=NULL;
-    pjmedia_vid_param param;
     pj_status_t status;
 
     PJ_ASSERT_RETURN(prm && prm->dir && p_vid_strm, PJ_EINVAL);
@@ -625,48 +624,45 @@
 		     prm->dir==PJMEDIA_DIR_CAPTURE_RENDER,
 		     PJ_EINVAL);
 
-    /* Must make copy of param because we're changing device ID */
-    pj_memcpy(&param, prm, sizeof(param));
-
     /* Normalize cap_id */
-    if (param.dir & PJMEDIA_DIR_CAPTURE) {
+    if (prm->dir & PJMEDIA_DIR_CAPTURE) {
 	unsigned index;
 
-	if (param.cap_id < 0)
-	    param.cap_id = PJMEDIA_VID_DEFAULT_CAPTURE_DEV;
+	if (prm->cap_id < 0)
+	    prm->cap_id = PJMEDIA_VID_DEFAULT_CAPTURE_DEV;
 
-	status = lookup_dev(param.cap_id, &cap_f, &index);
+	status = lookup_dev(prm->cap_id, &cap_f, &index);
 	if (status != PJ_SUCCESS)
 	    return status;
 
-	param.cap_id = index;
+	prm->cap_id = index;
 	f = cap_f;
     }
 
     /* Normalize rend_id */
-    if (param.dir & PJMEDIA_DIR_RENDER) {
+    if (prm->dir & PJMEDIA_DIR_RENDER) {
 	unsigned index;
 
-	if (param.rend_id < 0)
-	    param.rend_id = PJMEDIA_VID_DEFAULT_RENDER_DEV;
+	if (prm->rend_id < 0)
+	    prm->rend_id = PJMEDIA_VID_DEFAULT_RENDER_DEV;
 
-	status = lookup_dev(param.rend_id, &rend_f, &index);
+	status = lookup_dev(prm->rend_id, &rend_f, &index);
 	if (status != PJ_SUCCESS)
 	    return status;
 
-	param.rend_id = index;
+	prm->rend_id = index;
 	f = rend_f;
     }
 
     PJ_ASSERT_RETURN(f != NULL, PJ_EBUG);
 
     /* For now, cap_id and rend_id must belong to the same factory */
-    PJ_ASSERT_RETURN((param.dir != PJMEDIA_DIR_CAPTURE_RENDER) || 
+    PJ_ASSERT_RETURN((prm->dir != PJMEDIA_DIR_CAPTURE_RENDER) ||
 		     (cap_f == rend_f),
 		     PJMEDIA_EVID_INVDEV);
 
     /* Create the stream */
-    status = f->op->create_stream(f, &param, cb,
+    status = f->op->create_stream(f, prm, cb,
 				  user_data, p_vid_strm);
     if (status != PJ_SUCCESS)
 	return status;