summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pjmedia/include/pjmedia/vid_stream.h11
-rw-r--r--pjmedia/src/pjmedia/vid_stream.c21
-rw-r--r--pjsip/include/pjsua-lib/pjsua.h17
-rw-r--r--pjsip/src/pjsua-lib/pjsua_vid.c34
4 files changed, 83 insertions, 0 deletions
diff --git a/pjmedia/include/pjmedia/vid_stream.h b/pjmedia/include/pjmedia/vid_stream.h
index 83df1167..bdd84079 100644
--- a/pjmedia/include/pjmedia/vid_stream.h
+++ b/pjmedia/include/pjmedia/vid_stream.h
@@ -287,6 +287,17 @@ PJ_DECL(pj_status_t) pjmedia_vid_stream_start(pjmedia_vid_stream *stream);
/**
+ * Query if the stream is started on the specified direction.
+ *
+ * @param stream The video stream.
+ * @param dir The direction to be checked.
+ *
+ * @return PJ_TRUE if stream is started.
+ */
+PJ_DECL(pj_bool_t) pjmedia_vid_stream_is_running(pjmedia_vid_stream *stream,
+ pjmedia_dir dir);
+
+/**
* Pause the individual channel in the stream.
*
* @param stream The video channel.
diff --git a/pjmedia/src/pjmedia/vid_stream.c b/pjmedia/src/pjmedia/vid_stream.c
index dc28fc9a..7e60ebcf 100644
--- a/pjmedia/src/pjmedia/vid_stream.c
+++ b/pjmedia/src/pjmedia/vid_stream.c
@@ -1598,6 +1598,27 @@ PJ_DEF(pj_status_t) pjmedia_vid_stream_start(pjmedia_vid_stream *stream)
/*
+ * Check status.
+ */
+PJ_DEF(pj_bool_t) pjmedia_vid_stream_is_running(pjmedia_vid_stream *stream,
+ pjmedia_dir dir)
+{
+ pj_bool_t is_running = PJ_TRUE;
+
+ PJ_ASSERT_RETURN(stream, PJ_FALSE);
+
+ if (dir & PJMEDIA_DIR_ENCODING) {
+ is_running &= (stream->enc && !stream->enc->paused);
+ }
+
+ if (dir & PJMEDIA_DIR_DECODING) {
+ is_running &= (stream->dec && !stream->dec->paused);
+ }
+
+ return is_running;
+}
+
+/*
* Pause stream.
*/
PJ_DEF(pj_status_t) pjmedia_vid_stream_pause(pjmedia_vid_stream *stream,
diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h
index 3bcf107e..2b5130c8 100644
--- a/pjsip/include/pjsua-lib/pjsua.h
+++ b/pjsip/include/pjsua-lib/pjsua.h
@@ -3940,6 +3940,23 @@ PJ_DECL(int) pjsua_call_get_vid_stream_idx(pjsua_call_id call_id);
/**
+ * Determine if video stream for the specified call is currently running
+ * (i.e. has been created, started, and not being paused) for the specified
+ * direction.
+ *
+ * @param call_id Call identification.
+ * @param med_idx Media stream index, or -1 to specify default video
+ * media.
+ * @param dir The direction to be checked.
+ *
+ * @return PJ_TRUE if stream is currently running for the
+ * specified direction.
+ */
+PJ_DECL(pj_bool_t) pjsua_call_vid_stream_is_running(pjsua_call_id call_id,
+ int med_idx,
+ pjmedia_dir dir);
+
+/**
* Add, remove, modify, and/or manipulate video media stream for the
* specified call. This may trigger a re-INVITE or UPDATE to be sent
* for the call.
diff --git a/pjsip/src/pjsua-lib/pjsua_vid.c b/pjsip/src/pjsua-lib/pjsua_vid.c
index 0410260c..7ad73bbb 100644
--- a/pjsip/src/pjsua-lib/pjsua_vid.c
+++ b/pjsip/src/pjsua-lib/pjsua_vid.c
@@ -2038,5 +2038,39 @@ PJ_DEF(int) pjsua_call_get_vid_stream_idx(pjsua_call_id call_id)
}
+/*
+ * Determine if video stream for the specified call is currently running
+ * for the specified direction.
+ */
+PJ_DEF(pj_bool_t) pjsua_call_vid_stream_is_running( pjsua_call_id call_id,
+ int med_idx,
+ pjmedia_dir dir)
+{
+ pjsua_call *call;
+ pjsua_call_media *call_med;
+
+ PJ_ASSERT_RETURN(call_id>=0 && call_id<(int)pjsua_var.ua_cfg.max_calls,
+ PJ_EINVAL);
+
+ /* Verify and normalize media index */
+ if (med_idx == -1) {
+ med_idx = pjsua_call_get_vid_stream_idx(call_id);
+ }
+
+ call = &pjsua_var.calls[call_id];
+ PJ_ASSERT_RETURN(med_idx >= 0 && med_idx < call->med_cnt, PJ_EINVAL);
+
+ call_med = &call->media[med_idx];
+
+ /* Verify if the stream is transmitting video */
+ if (call_med->type != PJMEDIA_TYPE_VIDEO || (call_med->dir & dir) == 0 ||
+ !call_med->strm.v.stream)
+ {
+ return PJ_FALSE;
+ }
+
+ return pjmedia_vid_stream_is_running(call_med->strm.v.stream, dir);
+}
+
#endif /* PJSUA_HAS_VIDEO */