1 /*
2 mediastreamer2 library - modular sound and video processing and streaming
3 Copyright (C) 2006  Simon MORLAT (simon.morlat@linphone.org)
4 
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
18 */
19 
20 #ifdef HAVE_CONFIG_H
21 #include "mediastreamer-config.h"
22 #endif
23 
24 #include "mediastreamer2/mswebcam.h"
25 #include "mediastreamer2/msfilter.h"
26 
27 //static MSWebCamManager *scm=NULL;
28 
ms_web_cam_manager_new(void)29 MSWebCamManager * ms_web_cam_manager_new(void){
30 	MSWebCamManager *obj=(MSWebCamManager *)ms_new0(MSWebCamManager,1);
31 	obj->factory = NULL;
32 	return obj;
33 }
34 
ms_web_cam_manager_destroy(MSWebCamManager * scm)35 void ms_web_cam_manager_destroy(MSWebCamManager* scm){
36 	if (scm!=NULL){
37 		bctbx_list_for_each(scm->cams,(void (*)(void*))ms_web_cam_destroy);
38 		bctbx_list_free(scm->cams);
39 		bctbx_list_free(scm->descs);
40 		ms_free(scm);
41 	}
42 	scm=NULL;
43 }
44 
ms_web_cam_get_factory(MSWebCam * c)45 MSFactory * ms_web_cam_get_factory(MSWebCam *c){
46 	return c->wbcmanager->factory;
47 }
48 
ms_web_cam_manager_get_cam(MSWebCamManager * m,const char * id)49 MSWebCam * ms_web_cam_manager_get_cam(MSWebCamManager *m, const char *id){
50 	bctbx_list_t *elem;
51 	for (elem=m->cams;elem!=NULL;elem=elem->next){
52 		MSWebCam *cam=(MSWebCam*)elem->data;
53 		if (id==NULL) return cam;
54 		if (strcmp(ms_web_cam_get_string_id(cam),id)==0)	return cam;
55 	}
56 	if (id!=NULL) ms_message("no camera with id %s",id);
57 	return NULL;
58 }
59 
ms_web_cam_manager_get_default_cam(MSWebCamManager * m)60 MSWebCam * ms_web_cam_manager_get_default_cam(MSWebCamManager *m){
61 	if (!m) {
62 		return NULL;
63 	}
64 	if (m->cams!=NULL)
65   		return (MSWebCam*)m->cams->data;
66   	return NULL;
67 }
68 
ms_web_cam_manager_get_list(MSWebCamManager * m)69 const bctbx_list_t * ms_web_cam_manager_get_list(MSWebCamManager *m){
70 	if (!m) {
71 		return NULL;
72 	}
73 	return m->cams;
74 }
75 
ms_web_cam_set_manager(MSWebCamManager * m,MSWebCam * c)76 void ms_web_cam_set_manager(MSWebCamManager*m, MSWebCam *c){
77 	c->wbcmanager = m;
78 }
ms_web_cam_manager_add_cam(MSWebCamManager * m,MSWebCam * c)79 void ms_web_cam_manager_add_cam(MSWebCamManager *m, MSWebCam *c){
80 	ms_web_cam_set_manager(m,c);
81 	ms_message("Webcam %s added",ms_web_cam_get_string_id(c));
82 	m->cams=bctbx_list_append(m->cams,c);
83 }
84 
ms_web_cam_manager_create_cam(MSWebCamManager * m,MSWebCamDesc * desc)85 MSWebCam * ms_web_cam_manager_create_cam(MSWebCamManager *m, MSWebCamDesc *desc) {
86 	MSWebCam *obj = (MSWebCam *)ms_new0(MSWebCam, 1);
87 	obj->desc = desc;
88 	ms_web_cam_set_manager(m, obj);
89 	if (desc->init!=NULL)
90 		desc->init(obj);
91 	return obj;
92 }
93 
94 
ms_web_cam_manager_prepend_cam(MSWebCamManager * m,MSWebCam * c)95 void ms_web_cam_manager_prepend_cam(MSWebCamManager *m, MSWebCam *c){
96 	ms_web_cam_set_manager(m, c);
97 	ms_message("Webcam %s prepended",ms_web_cam_get_string_id(c));
98 	m->cams=bctbx_list_prepend(m->cams,c);
99 }
100 
cam_detect(MSWebCamManager * m,MSWebCamDesc * desc)101 static void cam_detect(MSWebCamManager *m, MSWebCamDesc *desc){
102 	if (desc->detect!=NULL)
103 		desc->detect(m);
104 }
105 
ms_web_cam_manager_register_desc(MSWebCamManager * m,MSWebCamDesc * desc)106 void ms_web_cam_manager_register_desc(MSWebCamManager *m, MSWebCamDesc *desc){
107 	if (bctbx_list_find(m->descs, desc) == NULL){
108 		m->descs=bctbx_list_append(m->descs,desc);
109 		cam_detect(m,desc);
110 	}
111 }
112 
ms_web_cam_manager_reload(MSWebCamManager * m)113 void ms_web_cam_manager_reload(MSWebCamManager *m){
114 	bctbx_list_t *elem;
115 	bctbx_list_for_each(m->cams,(void (*)(void*))ms_web_cam_destroy);
116 	bctbx_list_free(m->cams);
117 	m->cams=NULL;
118 	for(elem=m->descs;elem!=NULL;elem=elem->next)
119 		cam_detect(m,(MSWebCamDesc*)elem->data);
120 }
121 
ms_web_cam_new(MSWebCamDesc * desc)122 MSWebCam * ms_web_cam_new(MSWebCamDesc *desc){
123 	MSWebCam *obj=(MSWebCam *)ms_new0(MSWebCam,1);
124 	obj->desc=desc;
125 	if (desc->init!=NULL)
126 		desc->init(obj);
127 	return obj;
128 }
129 
ms_web_cam_get_driver_type(const MSWebCam * obj)130 const char *ms_web_cam_get_driver_type(const MSWebCam *obj){
131 	return obj->desc->driver_type;
132 }
133 
ms_web_cam_get_name(const MSWebCam * obj)134 const char *ms_web_cam_get_name(const MSWebCam *obj){
135 	return obj->name;
136 }
137 
ms_web_cam_get_string_id(MSWebCam * obj)138 const char *ms_web_cam_get_string_id(MSWebCam *obj){
139 	if (obj->id==NULL)	obj->id=ms_strdup_printf("%s: %s",obj->desc->driver_type,obj->name);
140 	return obj->id;
141 }
142 
ms_web_cam_create_reader(MSWebCam * obj)143 struct _MSFilter * ms_web_cam_create_reader(MSWebCam *obj){
144 	if (obj->desc->create_reader!=NULL)
145 		return obj->desc->create_reader(obj);
146 	else ms_warning("ms_web_cam_create_reader: unimplemented by %s wrapper",obj->desc->driver_type);
147 	return NULL;
148 }
149 
ms_web_cam_destroy(MSWebCam * obj)150 void ms_web_cam_destroy(MSWebCam *obj){
151 	if (obj->desc->uninit!=NULL) obj->desc->uninit(obj);
152 	if (obj->name!=NULL) ms_free(obj->name);
153 	if (obj->id!=NULL)	ms_free(obj->id);
154 	ms_free(obj);
155 }
156 
157 #ifdef _MSC_VER
158 #pragma warning(disable : 4996)
159 #else
160 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
161 #endif
162 
ms_web_cam_manager_get(void)163 MSWebCamManager * ms_web_cam_manager_get(void){
164 	return ms_factory_get_web_cam_manager(ms_factory_get_fallback());
165 }
166 
167