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;
diff --git a/pjmedia/src/pjmedia/videoport.c b/pjmedia/src/pjmedia/videoport.c
index 873f0e2..02f5fa8 100644
--- a/pjmedia/src/pjmedia/videoport.c
+++ b/pjmedia/src/pjmedia/videoport.c
@@ -109,14 +109,27 @@
     prm->active = PJ_TRUE;
 }
 
+static const char *vid_dir_name(pjmedia_dir dir)
+{
+    switch (dir) {
+    case PJMEDIA_DIR_CAPTURE:
+	return "capture";
+    case PJMEDIA_DIR_RENDER:
+	return "render";
+    case PJMEDIA_DIR_CAPTURE_RENDER:
+	return "capture and render";
+    default:
+	return "??";
+    }
+}
+
 PJ_DEF(pj_status_t) pjmedia_vid_port_create( pj_pool_t *pool,
 					     const pjmedia_vid_port_param *prm,
 					     pjmedia_vid_port **p_vid_port)
 {
     pjmedia_vid_port *vp;
-    pjmedia_vid_dev_index dev_id = PJMEDIA_VID_INVALID_DEV;
-    pjmedia_vid_dev_info di;
     const pjmedia_video_format_detail *vfd;
+    char cap_dev_name[64], rend_dev_name[64];
     pjmedia_vid_cb vid_cb;
     pj_bool_t need_frame_buf = PJ_FALSE;
     pj_status_t status;
@@ -124,7 +137,8 @@
     pjmedia_vid_param vparam;
 
     PJ_ASSERT_RETURN(pool && prm && p_vid_port, PJ_EINVAL);
-    PJ_ASSERT_RETURN(prm->vidparam.fmt.type == PJMEDIA_TYPE_VIDEO,
+    PJ_ASSERT_RETURN(prm->vidparam.fmt.type == PJMEDIA_TYPE_VIDEO &&
+                     prm->vidparam.dir != PJMEDIA_DIR_NONE,
 		     PJ_EINVAL);
 
     /* Retrieve the video format detail */
@@ -134,82 +148,82 @@
 
     PJ_ASSERT_RETURN(vfd->fps.num, PJ_EINVAL);
 
-
     /* Allocate videoport */
     vp = PJ_POOL_ZALLOC_T(pool, pjmedia_vid_port);
     vp->role = prm->active ? ROLE_ACTIVE : ROLE_PASSIVE;
     vp->dir = prm->vidparam.dir;
     vp->cap_size = vfd->size;
 
-    /* Determine the device id to get the video device info */
-    if ((vp->dir & PJMEDIA_DIR_CAPTURE) &&
-        prm->vidparam.cap_id != PJMEDIA_VID_INVALID_DEV)
-    {
-	dev_id = prm->vidparam.cap_id;
-    } else if ((vp->dir & PJMEDIA_DIR_RENDER) &&
-               prm->vidparam.rend_id != PJMEDIA_VID_INVALID_DEV)
-    {
-	dev_id = prm->vidparam.rend_id;
-    } else
-	return PJ_EINVAL;
-
-    /* Get device info */
-    status = pjmedia_vid_dev_get_info(dev_id, &di);
-    if (status != PJ_SUCCESS)
-	return status;
-
     vparam = prm->vidparam;
+    cap_dev_name[0] = rend_dev_name[0] = '\0';
 
-    /* Check if we need converter */
     if (vp->dir & PJMEDIA_DIR_CAPTURE) {
+	pjmedia_vid_dev_info di;
 	unsigned i;
 
+	/* Get device info */
+	status = pjmedia_vid_dev_get_info(prm->vidparam.cap_id, &di);
+	if (status != PJ_SUCCESS)
+	    return status;
+
+	pj_ansi_snprintf(cap_dev_name, sizeof(cap_dev_name), "%s [%s]",
+	                 di.name, di.driver);
+
 	for (i = 0; i < di.fmt_cnt; ++i) {
 	    if (prm->vidparam.fmt.id == di.fmt[i].id)
 		break;
 	}
 
 	if (i == di.fmt_cnt) {
-	    /* Yes, we need converter */
-	    pjmedia_conversion_param conv_param;
-	    const pjmedia_video_format_info *vfi;
-	    pjmedia_video_apply_fmt_param vafp;
-
-	    pjmedia_format_copy(&conv_param.src, &prm->vidparam.fmt);
-	    pjmedia_format_copy(&conv_param.dst, &prm->vidparam.fmt);
-	    for (i = 0; i < di.fmt_cnt; ++i) {
-		conv_param.src.id = di.fmt[i].id;
-		status = pjmedia_converter_create(NULL, pool, &conv_param, 
-						  &vp->cap_conv);
-		if (status == PJ_SUCCESS)
-		    break;
-	    }
-	    if (status != PJ_SUCCESS)
-		return status;
-
-	    /* Update format ID for the capture device */
-	    vparam.fmt.id = conv_param.src.id;
-
-	    /* Allocate buffer for conversion */
-	    vfi = pjmedia_get_video_format_info(NULL, conv_param.dst.id);
-	    if (!vfi)
-		return PJMEDIA_EBADFMT;
-
-	    pj_bzero(&vafp, sizeof(vafp));
-	    vafp.size = vfd->size;
-	    status = vfi->apply_fmt(vfi, &vafp);
-	    if (status != PJ_SUCCESS)
-		return PJMEDIA_EBADFMT;
-
-	    vp->cap_conv_buf = pj_pool_alloc(pool, vafp.framebytes);
-	    vp->cap_conv_buf_size = vafp.framebytes;
+	    /* The device has no no matching format. Pick one from
+	     * the supported formats, and later use converter to
+	     * convert it to the required format.
+	     */
+	    pj_assert(di.fmt_cnt != 0);
+	    vparam.fmt.id = di.fmt[0].id;
 	}
+
+	pj_strdup2_with_null(pool, &vp->dev_name, di.name);
+	vp->stream_role = di.has_callback ? ROLE_ACTIVE : ROLE_PASSIVE;
     }
 
-    PJ_LOG(4,(THIS_FILE, "Opening %s..", di.name));
+    if (vp->dir & PJMEDIA_DIR_RENDER) {
+	pjmedia_vid_dev_info di;
+	unsigned i;
 
-    pj_strdup2_with_null(pool, &vp->dev_name, di.name);
-    vp->stream_role = di.has_callback ? ROLE_ACTIVE : ROLE_PASSIVE;
+	/* Get device info */
+	status = pjmedia_vid_dev_get_info(prm->vidparam.rend_id, &di);
+	if (status != PJ_SUCCESS)
+	    return status;
+
+	pj_ansi_snprintf(rend_dev_name, sizeof(rend_dev_name), "and %s [%s]",
+	                 di.name, di.driver);
+
+	for (i = 0; i < di.fmt_cnt; ++i) {
+	    if (prm->vidparam.fmt.id == di.fmt[i].id)
+		break;
+	}
+
+	if (i == di.fmt_cnt) {
+	    /* The device has no no matching format. Pick one from
+	     * the supported formats, and later use converter to
+	     * convert it to the required format.
+	     */
+	    pj_assert(di.fmt_cnt != 0);
+	    vparam.fmt.id = di.fmt[0].id;
+	}
+
+	pj_strdup2_with_null(pool, &vp->dev_name, di.name);
+	vp->stream_role = di.has_callback ? ROLE_ACTIVE : ROLE_PASSIVE;
+    }
+
+    PJ_LOG(4,(THIS_FILE,
+	      "Opening device %s%s for %s: format=%s, size=%dx%d @%d:%d fps",
+	      cap_dev_name, rend_dev_name,
+	      vid_dir_name(prm->vidparam.dir),
+	      pjmedia_get_video_format_info(NULL, vparam.fmt.id)->name,
+	      vfd->size.w, vfd->size.h,
+	      vfd->fps.num, vfd->fps.denum));
 
     ptime_usec = PJMEDIA_PTIME(&vfd->fps);
     pjmedia_clock_src_init(&vp->cap_clocksrc, PJMEDIA_TYPE_VIDEO,
@@ -234,6 +248,59 @@
     if (status != PJ_SUCCESS)
 	goto on_error;
 
+    PJ_LOG(4,(THIS_FILE,
+	      "Device %s%s opened: format=%s, size=%dx%d @%d:%d fps",
+	      cap_dev_name, rend_dev_name,
+	      pjmedia_get_video_format_info(NULL, vparam.fmt.id)->name,
+	      vparam.fmt.det.vid.size.w, vparam.fmt.det.vid.size.h,
+	      vparam.fmt.det.vid.fps.num, vparam.fmt.det.vid.fps.denum));
+
+    /* Instantiate converter if necessary */
+    if (vparam.fmt.id != prm->vidparam.fmt.id ||
+	vparam.fmt.det.vid.size.w != prm->vidparam.fmt.det.vid.size.w ||
+	vparam.fmt.det.vid.size.h != prm->vidparam.fmt.det.vid.size.h /*||
+	vparam.fmt.det.vid.fps.num != prm->vidparam.fmt.det.vid.fps.num ||
+	vparam.fmt.det.vid.fps.denum != prm->vidparam.fmt.det.vid.fps.denum*/)
+    {
+	/* Yes, we need converter */
+	pjmedia_conversion_param conv_param;
+	const pjmedia_video_format_info *vfi;
+	pjmedia_video_apply_fmt_param vafp;
+
+	if (vp->dir & PJMEDIA_DIR_CAPTURE) {
+	    pjmedia_format_copy(&conv_param.src, &vparam.fmt);
+	    pjmedia_format_copy(&conv_param.dst, &prm->vidparam.fmt);
+
+	    status = pjmedia_converter_create(NULL, pool, &conv_param,
+					      &vp->cap_conv);
+	} else {
+	    pjmedia_format_copy(&conv_param.src, &prm->vidparam.fmt);
+	    pjmedia_format_copy(&conv_param.dst, &vparam.fmt);
+
+	    status = pjmedia_converter_create(NULL, pool, &conv_param,
+					      &vp->cap_conv);
+	}
+
+	if (status != PJ_SUCCESS) {
+	    PJ_PERROR(4,(THIS_FILE, status, "Error creating converter"));
+	    goto on_error;
+	}
+
+	/* Allocate buffer for conversion */
+	vfi = pjmedia_get_video_format_info(NULL, prm->vidparam.fmt.id);
+	if (!vfi)
+	    return PJMEDIA_EBADFMT;
+
+	pj_bzero(&vafp, sizeof(vafp));
+	vafp.size = prm->vidparam.fmt.det.vid.size;
+	status = vfi->apply_fmt(vfi, &vafp);
+	if (status != PJ_SUCCESS)
+	    return PJMEDIA_EBADFMT;
+
+	vp->cap_conv_buf = pj_pool_alloc(pool, vafp.framebytes);
+	vp->cap_conv_buf_size = vafp.framebytes;
+    }
+
     if (vp->role==ROLE_ACTIVE && vp->stream_role==ROLE_PASSIVE) {
 	/* Active role is wanted, but our device is passive, so create
 	 * master clocks to run the media flow.
@@ -292,7 +359,7 @@
 	}
 
 	pj_bzero(&vafp, sizeof(vafp));
-	vafp.size = vfd->size;
+	vafp.size = vparam.fmt.det.vid.size;
 	status = vfi->apply_fmt(vfi, &vafp);
 	if (status != PJ_SUCCESS)
 	    goto on_error;