Re #1312: Support for refreshing video device list
Add pjmedia-videodev API: pjmedia_vid_dev_refresh() and its implementation for Windows and Linux.



git-svn-id: https://svn.pjsip.org/repos/pjproject/branches/projects/2.0-dev@3592 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjmedia/src/pjmedia-videodev/v4l2_dev.c b/pjmedia/src/pjmedia-videodev/v4l2_dev.c
index b5909c3..281560d 100644
--- a/pjmedia/src/pjmedia-videodev/v4l2_dev.c
+++ b/pjmedia/src/pjmedia-videodev/v4l2_dev.c
@@ -81,6 +81,7 @@
 {
     pjmedia_vid_dev_factory	 base;
     pj_pool_t			*pool;
+    pj_pool_t			*dev_pool;
     pj_pool_factory		*pf;
 
     unsigned			 dev_count;
@@ -119,6 +120,7 @@
 /* Prototypes */
 static pj_status_t vid4lin_factory_init(pjmedia_vid_dev_factory *f);
 static pj_status_t vid4lin_factory_destroy(pjmedia_vid_dev_factory *f);
+static pj_status_t vid4lin_factory_refresh(pjmedia_vid_dev_factory *f);
 static unsigned    vid4lin_factory_get_dev_count(pjmedia_vid_dev_factory *f);
 static pj_status_t vid4lin_factory_get_dev_info(pjmedia_vid_dev_factory *f,
 					        unsigned index,
@@ -155,7 +157,8 @@
     &vid4lin_factory_get_dev_count,
     &vid4lin_factory_get_dev_info,
     &vid4lin_factory_default_param,
-    &vid4lin_factory_create_stream
+    &vid4lin_factory_create_stream,
+    &vid4lin_factory_refresh
 };
 
 static pjmedia_vid_dev_stream_op stream_op =
@@ -212,14 +215,20 @@
     unsigned i, old_count;
     pj_status_t status;
 
+    if (f->dev_pool) {
+        pj_pool_release(f->dev_pool);
+        f->dev_pool = NULL;
+    }
+
     pj_bzero(vdi, sizeof(vdi));
     old_count = f->dev_count;
     f->dev_count = 0;
+    f->dev_pool = pj_pool_create(f->pf, DRIVER_NAME, 500, 500, NULL);
 
     for (i=0; i<V4L2_MAX_DEVS && f->dev_count < V4L2_MAX_DEVS; ++i) {
 	int fd;
 	vid4lin_dev_info *pdi;
-	pj_pool_t *pool = f->pool;
+	pj_pool_t *pool = f->dev_pool;
 	pj_uint32_t fmt_cap[8];
 	int j, fmt_cnt=0;
 
@@ -312,7 +321,7 @@
 
     if (f->dev_count > old_count || f->dev_info == NULL) {
 	f->dev_info = (vid4lin_dev_info*)
-		      pj_pool_calloc(f->pool,
+		      pj_pool_calloc(f->dev_pool,
 				     f->dev_count,
 				     sizeof(vid4lin_dev_info));
     }
@@ -325,17 +334,7 @@
 /* API: init factory */
 static pj_status_t vid4lin_factory_init(pjmedia_vid_dev_factory *f)
 {
-    vid4lin_factory *cf = (vid4lin_factory*)f;
-    pj_status_t status;
-
-    status = v4l2_scan_devs(cf);
-    if (status != PJ_SUCCESS)
-	return status;
-
-    PJ_LOG(4, (THIS_FILE, "Video4Linux2 initialized with %d devices",
-	       cf->dev_count));
-
-    return PJ_SUCCESS;
+    return vid4lin_factory_refresh(f);
 }
 
 /* API: destroy factory */
@@ -344,6 +343,8 @@
     vid4lin_factory *cf = (vid4lin_factory*)f;
     pj_pool_t *pool = cf->pool;
 
+    if (cf->dev_pool)
+        pj_pool_release(cf->dev_pool);
     if (cf->pool) {
 	cf->pool = NULL;
 	pj_pool_release(pool);
@@ -352,6 +353,22 @@
     return PJ_SUCCESS;
 }
 
+/* API: refresh the list of devices */
+static pj_status_t vid4lin_factory_refresh(pjmedia_vid_dev_factory *f)
+{
+    vid4lin_factory *cf = (vid4lin_factory*)f;
+    pj_status_t status;
+
+    status = v4l2_scan_devs(cf);
+    if (status != PJ_SUCCESS)
+	return status;
+
+    PJ_LOG(4, (THIS_FILE, "Video4Linux2 has %d devices",
+	       cf->dev_count));
+
+    return PJ_SUCCESS;
+}
+
 /* API: get number of devices */
 static unsigned vid4lin_factory_get_dev_count(pjmedia_vid_dev_factory *f)
 {