summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pjmedia/src/pjmedia/vid_tee.c19
-rw-r--r--pjsip/src/pjsua-lib/pjsua_vid.c5
2 files changed, 15 insertions, 9 deletions
diff --git a/pjmedia/src/pjmedia/vid_tee.c b/pjmedia/src/pjmedia/vid_tee.c
index 4ba737a9..21d0cec5 100644
--- a/pjmedia/src/pjmedia/vid_tee.c
+++ b/pjmedia/src/pjmedia/vid_tee.c
@@ -29,7 +29,6 @@
#define TEE_PORT_NAME "vid_tee"
#define TEE_PORT_SIGN PJMEDIA_SIG_PORT_VID_TEE
-#define MAX_DST_PORT_COUNT 20
typedef struct vid_tee_dst_port
@@ -51,6 +50,7 @@ typedef struct vid_tee_port
unsigned dst_port_maxcnt;
unsigned dst_port_cnt;
vid_tee_dst_port *dst_ports;
+ pj_uint8_t *put_frm_flag;
struct vid_tee_conv_t {
pjmedia_converter *conv;
@@ -79,7 +79,6 @@ PJ_DEF(pj_status_t) pjmedia_vid_tee_create( pj_pool_t *pool,
PJ_ASSERT_RETURN(pool && fmt && p_vid_tee, PJ_EINVAL);
PJ_ASSERT_RETURN(fmt->type == PJMEDIA_TYPE_VIDEO, PJ_EINVAL);
- PJ_ASSERT_RETURN(max_dst_cnt <= MAX_DST_PORT_COUNT, PJ_ETOOMANY);
/* Allocate video tee structure */
tee = PJ_POOL_ZALLOC_T(pool, vid_tee_port);
@@ -94,6 +93,9 @@ PJ_DEF(pj_status_t) pjmedia_vid_tee_create( pj_pool_t *pool,
tee->tee_conv = (struct vid_tee_conv_t *)
pj_pool_calloc(pool, max_dst_cnt,
sizeof(struct vid_tee_conv_t));
+ tee->put_frm_flag = (pj_uint8_t*)
+ pj_pool_calloc(pool, max_dst_cnt,
+ sizeof(tee->put_frm_flag[0]));
/* Initialize video tee buffer, its size is one frame */
vfi = pjmedia_get_video_format_info(NULL, fmt->id);
@@ -295,14 +297,15 @@ static pj_status_t tee_put_frame(pjmedia_port *port, pjmedia_frame *frame)
{
vid_tee_port *tee = (vid_tee_port*)port;
unsigned i, j;
- pj_bool_t done[MAX_DST_PORT_COUNT];
-
- pj_bzero(done, sizeof(done));
+ const pj_uint8_t PUT_FRM_DONE = 1;
+
+ pj_bzero(tee->put_frm_flag, tee->dst_port_cnt *
+ sizeof(tee->put_frm_flag[0]));
for (i = 0; i < tee->dst_port_cnt; ++i) {
pjmedia_frame frame_ = *frame;
- if (done[i])
+ if (tee->put_frm_flag[i])
continue;
if (tee->tee_conv[i].conv) {
@@ -327,7 +330,7 @@ static pj_status_t tee_put_frame(pjmedia_port *port, pjmedia_frame *frame)
for (j = i; j < tee->dst_port_cnt; ++j) {
pjmedia_frame framep;
- if (done[j] ||
+ if (tee->put_frm_flag[j] ||
(tee->dst_ports[j].dst->info.fmt.id !=
tee->dst_ports[i].dst->info.fmt.id) ||
(tee->dst_ports[j].dst->info.fmt.det.vid.size.w !=
@@ -352,7 +355,7 @@ static pj_status_t tee_put_frame(pjmedia_port *port, pjmedia_frame *frame)
/* Deliver the data */
pjmedia_port_put_frame(tee->dst_ports[j].dst, &framep);
- done[j] = PJ_TRUE;
+ tee->put_frm_flag[j] = PUT_FRM_DONE;
if (!tee->tee_conv[i].conv)
break;
diff --git a/pjsip/src/pjsua-lib/pjsua_vid.c b/pjsip/src/pjsua-lib/pjsua_vid.c
index 8083445a..36a8aae8 100644
--- a/pjsip/src/pjsua-lib/pjsua_vid.c
+++ b/pjsip/src/pjsua-lib/pjsua_vid.c
@@ -23,6 +23,8 @@
#if PJSUA_HAS_VIDEO
+#define VID_TEE_MAX_PORT (PJSUA_MAX_CALLS + 1)
+
static void free_vid_win(pjsua_vid_win_id wid);
/*****************************************************************************
@@ -405,7 +407,8 @@ static pj_status_t create_vid_win(pjsua_vid_win_type type,
fmt = &fmt_;
/* Create video tee */
- status = pjmedia_vid_tee_create(w->pool, fmt, 2, &w->tee);
+ status = pjmedia_vid_tee_create(w->pool, fmt, VID_TEE_MAX_PORT,
+ &w->tee);
if (status != PJ_SUCCESS)
goto on_error;
}