From 434f964e7a8a9ea6b4556707d53207d39361d00e Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Fri, 23 Sep 2011 04:00:27 +0000 Subject: Closes #1377: fixed video stream cleanup to reset back cap_win_id & rdr_win_id value to PJSUA_INVALID_ID after capture/render device released from the call stream. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3772 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip/src/pjsua-lib/pjsua_vid.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/pjsip/src/pjsua-lib/pjsua_vid.c b/pjsip/src/pjsua-lib/pjsua_vid.c index 1d0697ed..ddce5324 100644 --- a/pjsip/src/pjsua-lib/pjsua_vid.c +++ b/pjsip/src/pjsua-lib/pjsua_vid.c @@ -979,21 +979,26 @@ void stop_video_stream(pjsua_call_media *call_med) pjmedia_port *media_port; pjsua_vid_win *w = &pjsua_var.win[call_med->strm.v.cap_win_id]; + pj_status_t status; - pjmedia_vid_stream_get_port(call_med->strm.v.stream, - PJMEDIA_DIR_ENCODING, - &media_port); - pj_assert(media_port); - - pjmedia_vid_port_stop(w->vp_cap); - pjmedia_vid_tee_remove_dst_port(w->tee, media_port); - pjmedia_vid_port_start(w->vp_cap); + /* Disconnect video stream from capture device */ + status = pjmedia_vid_stream_get_port(call_med->strm.v.stream, + PJMEDIA_DIR_ENCODING, + &media_port); + if (status == PJ_SUCCESS) { + /* Video tee is not threadsafe, so stop the capture first */ + pjmedia_vid_port_stop(w->vp_cap); + pjmedia_vid_tee_remove_dst_port(w->tee, media_port); + pjmedia_vid_port_start(w->vp_cap); + } dec_vid_win(call_med->strm.v.cap_win_id); + call_med->strm.v.cap_win_id = PJSUA_INVALID_ID; } if (call_med->strm.v.rdr_win_id != PJSUA_INVALID_ID) { dec_vid_win(call_med->strm.v.rdr_win_id); + call_med->strm.v.rdr_win_id = PJSUA_INVALID_ID; } if ((call_med->dir & PJMEDIA_DIR_ENCODING) && -- cgit v1.2.3