summaryrefslogtreecommitdiff
path: root/pjmedia/src/pjmedia-videodev/videodev.c
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2012-04-04 05:05:50 +0000
committerBenny Prijono <bennylp@teluu.com>2012-04-04 05:05:50 +0000
commit3e8d57944439a50f12c3e3eef10a416ced22aa7f (patch)
tree9c4c632100e81d23b745e7c13f6608b931a9c641 /pjmedia/src/pjmedia-videodev/videodev.c
parentb3a8dbd102f7c33b5a3a9beb0d606e5a2676f334 (diff)
Fixed #1478: AVI player virtual device. Initial spec:
- Currently only Works with raw video and audio AVI files - Added --play-avi and --auto-play-avi options in pjsua - No A/V synchronization yet git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4016 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/src/pjmedia-videodev/videodev.c')
-rw-r--r--pjmedia/src/pjmedia-videodev/videodev.c44
1 files changed, 40 insertions, 4 deletions
diff --git a/pjmedia/src/pjmedia-videodev/videodev.c b/pjmedia/src/pjmedia-videodev/videodev.c
index 9b96520d..658d091a 100644
--- a/pjmedia/src/pjmedia-videodev/videodev.c
+++ b/pjmedia/src/pjmedia-videodev/videodev.c
@@ -407,15 +407,29 @@ PJ_DEF(pj_status_t) pjmedia_vid_dev_subsys_init(pj_pool_factory *pf)
/* API: register a video device factory to the video device subsystem. */
PJ_DEF(pj_status_t)
-pjmedia_vid_register_factory(pjmedia_vid_dev_factory_create_func_ptr adf)
+pjmedia_vid_register_factory(pjmedia_vid_dev_factory_create_func_ptr adf,
+ pjmedia_vid_dev_factory *factory)
{
+ pj_bool_t refresh = PJ_FALSE;
pj_status_t status;
if (vid_subsys.init_count == 0)
return PJMEDIA_EVID_INIT;
vid_subsys.drv[vid_subsys.drv_cnt].create = adf;
- status = init_driver(vid_subsys.drv_cnt, PJ_FALSE);
+ vid_subsys.drv[vid_subsys.drv_cnt].f = factory;
+
+ if (factory) {
+ /* Call factory->init() */
+ status = factory->op->init(factory);
+ if (status != PJ_SUCCESS) {
+ factory->op->destroy(factory);
+ return status;
+ }
+ refresh = PJ_TRUE;
+ }
+
+ status = init_driver(vid_subsys.drv_cnt, refresh);
if (status == PJ_SUCCESS) {
vid_subsys.drv_cnt++;
} else {
@@ -427,7 +441,8 @@ pjmedia_vid_register_factory(pjmedia_vid_dev_factory_create_func_ptr adf)
/* API: unregister a video device factory from the video device subsystem. */
PJ_DEF(pj_status_t)
-pjmedia_vid_unregister_factory(pjmedia_vid_dev_factory_create_func_ptr adf)
+pjmedia_vid_unregister_factory(pjmedia_vid_dev_factory_create_func_ptr adf,
+ pjmedia_vid_dev_factory *factory)
{
unsigned i, j;
@@ -437,7 +452,7 @@ pjmedia_vid_unregister_factory(pjmedia_vid_dev_factory_create_func_ptr adf)
for (i=0; i<vid_subsys.drv_cnt; ++i) {
struct driver *drv = &vid_subsys.drv[i];
- if (drv->create == adf) {
+ if ((factory && drv->f==factory) || (adf && drv->create == adf)) {
for (j = drv->start_idx; j < drv->start_idx + drv->dev_cnt; j++)
{
vid_subsys.dev_list[j] = (pj_uint32_t)PJMEDIA_VID_INVALID_DEV;
@@ -578,6 +593,27 @@ static pj_status_t lookup_dev(pjmedia_vid_dev_index id,
}
+/* API: lookup device id */
+PJ_DEF(pj_status_t)
+pjmedia_vid_dev_get_local_index(pjmedia_vid_dev_index id,
+ pjmedia_vid_dev_factory **p_f,
+ unsigned *p_local_index)
+{
+ return lookup_dev(id, p_f, p_local_index);
+}
+
+/* API: from factory and local index, get global index */
+PJ_DEF(pj_status_t)
+pjmedia_vid_dev_get_global_index(const pjmedia_vid_dev_factory *f,
+ unsigned local_idx,
+ pjmedia_vid_dev_index *pid)
+{
+ PJ_ASSERT_RETURN(f->sys.drv_idx >= 0 && f->sys.drv_idx < MAX_DRIVERS,
+ PJ_EINVALIDOP);
+ *pid = local_idx;
+ return make_global_index(f->sys.drv_idx, pid);
+}
+
/* API: Get device information. */
PJ_DEF(pj_status_t) pjmedia_vid_dev_get_info(pjmedia_vid_dev_index id,
pjmedia_vid_dev_info *info)