Skip to content

Commit 24006a7

Browse files
nanangizzsauwming
authored andcommitted
Fix bug in video conference in disconnecting ports (pjsip#3325)
1 parent f1e6313 commit 24006a7

1 file changed

Lines changed: 51 additions & 22 deletions

File tree

pjmedia/src/pjmedia/vid_conf.c

Lines changed: 51 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_create(
255255
/* Create own pool */
256256
pool = pj_pool_create(parent_pool->factory, "vidconf", 500, 500, NULL);
257257
if (!pool) {
258+
PJ_PERROR(1, (THIS_FILE, PJ_ENOMEM, "Create failed in alloc"));
258259
return PJ_ENOMEM;
259260
}
260261

@@ -275,13 +276,15 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_create(
275276
pj_pool_zalloc(pool, vid_conf->opt.max_slot_cnt *
276277
sizeof(vconf_port*));
277278
if (!vid_conf->ports) {
279+
PJ_PERROR(1, (THIS_FILE, PJ_ENOMEM, "Create failed in alloc ports"));
278280
pjmedia_vid_conf_destroy(vid_conf);
279281
return PJ_ENOMEM;
280282
}
281283

282284
/* Create mutex */
283285
status = pj_mutex_create_recursive(pool, CONF_NAME, &vid_conf->mutex);
284286
if (status != PJ_SUCCESS) {
287+
PJ_PERROR(1, (THIS_FILE, status, "Create failed in create mutex"));
285288
pjmedia_vid_conf_destroy(vid_conf);
286289
return status;
287290
}
@@ -293,6 +296,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_create(
293296
status = pjmedia_clock_create2(pool, &clock_param, 0, &on_clock_tick,
294297
vid_conf, &vid_conf->clock);
295298
if (status != PJ_SUCCESS) {
299+
PJ_PERROR(1, (THIS_FILE, status, "Create failed in create clock"));
296300
pjmedia_vid_conf_destroy(vid_conf);
297301
return status;
298302
}
@@ -301,6 +305,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_create(
301305
vid_conf->op_queue = PJ_POOL_ZALLOC_T(pool, op_entry);
302306
vid_conf->op_queue_free = PJ_POOL_ZALLOC_T(pool, op_entry);
303307
if (!vid_conf->op_queue || !vid_conf->op_queue_free) {
308+
PJ_PERROR(1, (THIS_FILE, PJ_ENOMEM, "Create failed in create queues"));
304309
pjmedia_vid_conf_destroy(vid_conf);
305310
return PJ_ENOMEM;
306311
}
@@ -310,7 +315,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_create(
310315
/* Done */
311316
*p_vid_conf = vid_conf;
312317

313-
PJ_LOG(5,(THIS_FILE, "Created video conference bridge with %d ports",
318+
PJ_LOG(4,(THIS_FILE, "Created video conference bridge with %d ports",
314319
vid_conf->opt.max_slot_cnt));
315320

316321
return PJ_SUCCESS;
@@ -354,7 +359,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_destroy(pjmedia_vid_conf *vid_conf)
354359
pj_pool_safe_release(&vid_conf->pool);
355360
}
356361

357-
PJ_LOG(5,(THIS_FILE, "Video conference bridge destroyed"));
362+
PJ_LOG(4,(THIS_FILE, "Video conference bridge destroyed"));
358363

359364
return PJ_SUCCESS;
360365
}
@@ -375,6 +380,8 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_add_port( pjmedia_vid_conf *vid_conf,
375380
unsigned index;
376381
pj_status_t status = PJ_SUCCESS;
377382

383+
PJ_LOG(5,(THIS_FILE, "Add port %s requested", port->info.name.ptr));
384+
378385
PJ_ASSERT_RETURN(vid_conf && parent_pool && port, PJ_EINVAL);
379386
PJ_ASSERT_RETURN(port->info.fmt.type==PJMEDIA_TYPE_VIDEO &&
380387
port->info.fmt.detail_type==PJMEDIA_FORMAT_DETAIL_VIDEO,
@@ -388,6 +395,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_add_port( pjmedia_vid_conf *vid_conf,
388395
pj_mutex_lock(vid_conf->mutex);
389396

390397
if (vid_conf->port_cnt >= vid_conf->opt.max_slot_cnt) {
398+
PJ_PERROR(3,(THIS_FILE, PJ_ETOOMANY, "Add port %s failed", name->ptr));
391399
pj_assert(!"Too many ports");
392400
pj_mutex_unlock(vid_conf->mutex);
393401
return PJ_ETOOMANY;
@@ -457,7 +465,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_add_port( pjmedia_vid_conf *vid_conf,
457465

458466
vfi = pjmedia_get_video_format_info(NULL, port->info.fmt.id);
459467
if (!vfi) {
460-
PJ_LOG(4,(THIS_FILE, "pjmedia_vid_conf_add_port(): "
468+
PJ_LOG(3,(THIS_FILE, "pjmedia_vid_conf_add_port(): "
461469
"unrecognized format %04X",
462470
port->info.fmt.id));
463471
status = PJMEDIA_EBADFMT;
@@ -468,7 +476,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_add_port( pjmedia_vid_conf *vid_conf,
468476
vafp.size = port->info.fmt.det.vid.size;
469477
status = (*vfi->apply_fmt)(vfi, &vafp);
470478
if (status != PJ_SUCCESS) {
471-
PJ_LOG(4,(THIS_FILE, "pjmedia_vid_conf_add_port(): "
479+
PJ_LOG(3,(THIS_FILE, "pjmedia_vid_conf_add_port(): "
472480
"Failed to apply format %04X",
473481
port->info.fmt.id));
474482
goto on_error;
@@ -482,7 +490,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_add_port( pjmedia_vid_conf *vid_conf,
482490
cport->put_buf,
483491
cport->put_buf_size);
484492
if (status != PJ_SUCCESS) {
485-
PJ_PERROR(4,(THIS_FILE, status,
493+
PJ_PERROR(3,(THIS_FILE, status,
486494
"Warning: failed to init sink buffer "
487495
" with black"));
488496
}
@@ -496,7 +504,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_add_port( pjmedia_vid_conf *vid_conf,
496504
cport->get_buf,
497505
cport->get_buf_size);
498506
if (status != PJ_SUCCESS) {
499-
PJ_PERROR(4,(THIS_FILE, status,
507+
PJ_PERROR(3,(THIS_FILE, status,
500508
"Warning: failed to init source buffer "
501509
"with black"));
502510
}
@@ -564,6 +572,8 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_add_port( pjmedia_vid_conf *vid_conf,
564572
if (pool)
565573
pj_pool_release(pool);
566574

575+
PJ_PERROR(3, (THIS_FILE, status, "Add port %s failed", name->ptr));
576+
567577
pj_mutex_unlock(vid_conf->mutex);
568578
return status;
569579
}
@@ -578,18 +588,21 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_remove_port( pjmedia_vid_conf *vid_conf,
578588
vconf_port *cport;
579589
op_entry *ope;
580590

591+
PJ_LOG(5,(THIS_FILE, "Port %d remove requested", slot));
592+
581593
PJ_ASSERT_RETURN(vid_conf && slot<vid_conf->opt.max_slot_cnt, PJ_EINVAL);
582594

583595
pj_mutex_lock(vid_conf->mutex);
584596

585597
/* Port must be valid. */
586598
cport = vid_conf->ports[slot];
587599
if (cport == NULL) {
600+
PJ_PERROR(3, (THIS_FILE, PJ_EINVAL, "Remove port failed"));
588601
pj_mutex_unlock(vid_conf->mutex);
589602
return PJ_EINVAL;
590603
}
591604

592-
PJ_LOG(5,(THIS_FILE, "Video port %d remove requested", slot));
605+
PJ_LOG(4,(THIS_FILE, "Video port %d remove queued", slot));
593606

594607
/* Queue the operation */
595608
ope = get_free_op_entry(vid_conf);
@@ -646,7 +659,7 @@ static void op_remove_port(pjmedia_vid_conf *vid_conf,
646659
/* Warning: will stuck if this is called from the clock thread */
647660
status = pjmedia_clock_stop(vid_conf->clock);
648661
if (status != PJ_SUCCESS) {
649-
PJ_PERROR(4, (THIS_FILE, status, "Failed to stop clock"));
662+
PJ_PERROR(3, (THIS_FILE, status, "Failed to stop clock"));
650663
}
651664
}
652665
}
@@ -741,6 +754,9 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_connect_port(
741754
vconf_port *src_port, *dst_port;
742755
unsigned i;
743756

757+
PJ_LOG(5,(THIS_FILE, "Connect ports %d->%d requested",
758+
src_slot, sink_slot));
759+
744760
/* Check arguments */
745761
PJ_ASSERT_RETURN(vid_conf &&
746762
src_slot<vid_conf->opt.max_slot_cnt &&
@@ -755,7 +771,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_connect_port(
755771
if (!src_port || !src_port->port->get_frame ||
756772
!dst_port || !dst_port->port->put_frame)
757773
{
758-
PJ_LOG(4,(THIS_FILE,"Failed connecting video ports, make sure that "
774+
PJ_LOG(3,(THIS_FILE,"Failed connecting video ports, make sure that "
759775
"source has get_frame() & sink has put_frame()"));
760776
pj_mutex_unlock(vid_conf->mutex);
761777
return PJ_EINVAL;
@@ -771,7 +787,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_connect_port(
771787
if (i == src_port->listener_cnt) {
772788
op_entry *ope;
773789

774-
PJ_LOG(5,(THIS_FILE, "Video connect ports %d->%d requested",
790+
PJ_LOG(4,(THIS_FILE, "Video connect ports %d->%d queued",
775791
src_slot, sink_slot));
776792

777793
ope = get_free_op_entry(vid_conf);
@@ -786,7 +802,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_connect_port(
786802
pj_status_t status;
787803
status = pjmedia_clock_start(vid_conf->clock);
788804
if (status != PJ_SUCCESS) {
789-
PJ_PERROR(4, (THIS_FILE, status, "Failed to start clock"));
805+
PJ_PERROR(2, (THIS_FILE, status, "Failed to start clock"));
790806
pj_mutex_unlock(vid_conf->mutex);
791807
return status;
792808
}
@@ -848,6 +864,9 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_disconnect_port(
848864
vconf_port *src_port, *dst_port;
849865
unsigned i, j;
850866

867+
PJ_LOG(5,(THIS_FILE, "Disconnect ports %d->%d requested",
868+
src_slot, sink_slot));
869+
851870
/* Check arguments */
852871
PJ_ASSERT_RETURN(vid_conf &&
853872
src_slot<vid_conf->opt.max_slot_cnt &&
@@ -859,6 +878,9 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_disconnect_port(
859878
src_port = vid_conf->ports[src_slot];
860879
dst_port = vid_conf->ports[sink_slot];
861880
if (!src_port || !dst_port) {
881+
PJ_PERROR(3,(THIS_FILE, PJ_EINVAL,
882+
"Disconnect ports failed, src=0x%p dst=0x%p",
883+
src_port, dst_port));
862884
pj_mutex_unlock(vid_conf->mutex);
863885
return PJ_EINVAL;
864886
}
@@ -874,24 +896,26 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_disconnect_port(
874896
}
875897

876898
if (i != src_port->listener_cnt && j != dst_port->transmitter_cnt) {
899+
op_entry *ope;
900+
877901
pj_assert(src_port->listener_cnt > 0 &&
878902
src_port->listener_cnt < vid_conf->opt.max_slot_cnt);
879903
pj_assert(dst_port->transmitter_cnt > 0 &&
880904
dst_port->transmitter_cnt < vid_conf->opt.max_slot_cnt);
881905

882906
/* Queue the operation */
883-
if (i == src_port->listener_cnt) {
884-
op_entry *ope;
885-
886-
PJ_LOG(5,(THIS_FILE, "Video disconnect ports %d->%d requested",
887-
src_slot, sink_slot));
907+
PJ_LOG(4,(THIS_FILE, "Video disconnect ports %d->%d queued",
908+
src_slot, sink_slot));
888909

889-
ope = get_free_op_entry(vid_conf);
890-
ope->type = OP_DISCONNECT_PORTS;
891-
ope->param.disconnect_ports.src = src_slot;
892-
ope->param.disconnect_ports.sink = sink_slot;
893-
pj_list_push_back(vid_conf->op_queue, ope);
894-
}
910+
ope = get_free_op_entry(vid_conf);
911+
ope->type = OP_DISCONNECT_PORTS;
912+
ope->param.disconnect_ports.src = src_slot;
913+
ope->param.disconnect_ports.sink = sink_slot;
914+
pj_list_push_back(vid_conf->op_queue, ope);
915+
} else {
916+
PJ_PERROR(3,(THIS_FILE, PJ_EINVAL,
917+
"Disconnect ports failed, src=0x%p dst=0x%p",
918+
src_port, dst_port));
895919
}
896920

897921
pj_mutex_unlock(vid_conf->mutex);
@@ -1467,13 +1491,16 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_update_port( pjmedia_vid_conf *vid_conf,
14671491
vconf_port *cport;
14681492
op_entry *ope;
14691493

1494+
PJ_LOG(5,(THIS_FILE, "Update port %d requested", slot));
1495+
14701496
PJ_ASSERT_RETURN(vid_conf && slot<vid_conf->opt.max_slot_cnt, PJ_EINVAL);
14711497

14721498
pj_mutex_lock(vid_conf->mutex);
14731499

14741500
/* Port must be valid. */
14751501
cport = vid_conf->ports[slot];
14761502
if (cport == NULL) {
1503+
PJ_PERROR(3,(THIS_FILE, PJ_EINVAL, "Update port failed"));
14771504
pj_mutex_unlock(vid_conf->mutex);
14781505
return PJ_EINVAL;
14791506
}
@@ -1484,6 +1511,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_conf_update_port( pjmedia_vid_conf *vid_conf,
14841511
ope->param.update_port.port = slot;
14851512
pj_list_push_back(vid_conf->op_queue, ope);
14861513

1514+
PJ_LOG(4,(THIS_FILE, "Update port %d queued", slot));
14871515
pj_mutex_unlock(vid_conf->mutex);
14881516

14891517
return PJ_SUCCESS;
@@ -1602,6 +1630,7 @@ static void op_update_port(pjmedia_vid_conf *vid_conf,
16021630

16031631
/* Update cport format info */
16041632
cport->format = *new_fmt;
1633+
PJ_LOG(4,(THIS_FILE, "Port %d updated", slot));
16051634
}
16061635

16071636

0 commit comments

Comments
 (0)