diff options
author | Jonas Smedegaard <dr@jones.dk> | 2018-01-08 22:22:59 +0530 |
---|---|---|
committer | Jonas Smedegaard <dr@jones.dk> | 2018-01-08 22:22:59 +0530 |
commit | 766bb4acdda738e450630c92d9c37e6cb42d9423 (patch) | |
tree | 8277c899ed928c69dfd1251bf889af6c78400f84 /modules/vidbridge/disp.c |
Import baresip_0.5.7.orig.tar.gz
[dgit import orig baresip_0.5.7.orig.tar.gz]
Diffstat (limited to 'modules/vidbridge/disp.c')
-rw-r--r-- | modules/vidbridge/disp.c | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/modules/vidbridge/disp.c b/modules/vidbridge/disp.c new file mode 100644 index 0000000..be1e8e5 --- /dev/null +++ b/modules/vidbridge/disp.c @@ -0,0 +1,94 @@ +/** + * @file vidbridge/disp.c Video bridge -- display + * + * Copyright (C) 2010 Creytiv.com + */ +#include <re.h> +#include <rem.h> +#include <baresip.h> +#include "vidbridge.h" + + +static void destructor(void *arg) +{ + struct vidisp_st *st = arg; + + if (st->vidsrc) + st->vidsrc->vidisp = NULL; + + list_unlink(&st->le); + mem_deref(st->device); +} + + +int vidbridge_disp_alloc(struct vidisp_st **stp, const struct vidisp *vd, + struct vidisp_prm *prm, const char *dev, + vidisp_resize_h *resizeh, void *arg) +{ + struct vidisp_st *st; + int err = 0; + (void)prm; + (void)resizeh; + (void)arg; + + if (!stp || !vd || !dev) + return EINVAL; + + st = mem_zalloc(sizeof(*st), destructor); + if (!st) + return ENOMEM; + + st->vd = vd; + + err = str_dup(&st->device, dev); + if (err) + goto out; + + /* find the vidsrc with the same device-name */ + st->vidsrc = vidbridge_src_find(dev); + if (st->vidsrc) { + st->vidsrc->vidisp = st; + } + + hash_append(ht_disp, hash_joaat_str(dev), &st->le, st); + + out: + if (err) + mem_deref(st); + else + *stp = st; + + return err; +} + + +static bool list_apply_handler(struct le *le, void *arg) +{ + struct vidisp_st *st = le->data; + + return 0 == str_cmp(st->device, arg); +} + + +int vidbridge_disp_display(struct vidisp_st *st, const char *title, + const struct vidframe *frame) +{ + int err = 0; + (void)title; + + if (st->vidsrc) + vidbridge_src_input(st->vidsrc, frame); + else { + debug("vidbridge: display: dropping frame (%u x %u)\n", + frame->size.w, frame->size.h); + } + + return err; +} + + +struct vidisp_st *vidbridge_disp_find(const char *device) +{ + return list_ledata(hash_lookup(ht_disp, hash_joaat_str(device), + list_apply_handler, (void *)device)); +} |