}
+static void check_jb(switch_core_session_t *session)
+{
+ const char *val;
+ switch_media_handle_t *smh;
+ switch_rtp_engine_t *a_engine;
+
+ switch_assert(session);
+
+ if (!(smh = session->media_handle)) {
+ return;
+ }
+
+ a_engine = &smh->engines[SWITCH_MEDIA_TYPE_AUDIO];
+
+ if (!a_engine->rtp_session) return;
+
+ if ((val = switch_channel_get_variable(session->channel, "jitterbuffer_msec")) || (val = smh->mparams->jb_msec)) {
+ int jb_msec = atoi(val);
+ int maxlen = 0, max_drift = 0;
+ char *p, *q;
+ const char *s;
+
+ if (!strcasecmp(val, "pause")) {
+ switch_rtp_pause_jitter_buffer(a_engine->rtp_session, SWITCH_TRUE);
+ return;
+ } else if (!strcasecmp(val, "resume")) {
+ switch_rtp_pause_jitter_buffer(a_engine->rtp_session, SWITCH_FALSE);
+ return;
+ } else if (!strncasecmp(val, "debug:", 6)) {
+ s = val + 6;
+ if (s && !strcmp(s, "off")) {
+ s = NULL;
+ }
+ switch_rtp_debug_jitter_buffer(a_engine->rtp_session, s);
+ return;
+ }
+
+ if ((p = strchr(val, ':'))) {
+ p++;
+ maxlen = atoi(p);
+ if ((q = strchr(p, ':'))) {
+ q++;
+ max_drift = abs(atoi(q));
+ }
+ }
+
+ if (jb_msec < 0 && jb_msec > -20) {
+ jb_msec = (a_engine->read_codec.implementation->microseconds_per_packet / 1000) * abs(jb_msec);
+ }
+
+ if (maxlen < 0 && maxlen > -20) {
+ maxlen = (a_engine->read_codec.implementation->microseconds_per_packet / 1000) * abs(maxlen);
+ }
+
+ if (jb_msec < 20 || jb_msec > 10000) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR,
+ "Invalid Jitterbuffer spec [%d] must be between 20 and 10000\n", jb_msec);
+ } else {
+ int qlen, maxqlen = 10;
+
+ qlen = jb_msec / (a_engine->read_impl.microseconds_per_packet / 1000);
+
+ if (maxlen) {
+ maxqlen = maxlen / (a_engine->read_impl.microseconds_per_packet / 1000);
+ }
+
+ if (maxqlen < qlen) {
+ maxqlen = qlen * 5;
+ }
+ if (switch_rtp_activate_jitter_buffer(a_engine->rtp_session, qlen, maxqlen,
+ a_engine->read_impl.samples_per_packet,
+ a_engine->read_impl.samples_per_second, max_drift) == SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session),
+ SWITCH_LOG_DEBUG, "Setting Jitterbuffer to %dms (%d frames) (%d max frames) (%d max drift)\n",
+ jb_msec, qlen, maxqlen, max_drift);
+ switch_channel_set_flag(session->channel, CF_JITTERBUFFER);
+ if (!switch_false(switch_channel_get_variable(session->channel, "rtp_jitter_buffer_plc"))) {
+ switch_channel_set_flag(session->channel, CF_JITTERBUFFER_PLC);
+ }
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session),
+ SWITCH_LOG_WARNING, "Error Setting Jitterbuffer to %dms (%d frames)\n", jb_msec, qlen);
+ }
+
+ }
+ }
+
+}
+
//?
SWITCH_DECLARE(switch_status_t) switch_core_media_read_frame(switch_core_session_t *session, switch_frame_t **frame,
switch_io_flag_t flags, int stream_id, switch_media_type_t type)
engine->read_impl.samples_per_packet;
}
}
-
+
+ check_jb(session);
+
engine->check_frames = 0;
engine->last_ts = 0;
engine->last_seq = 0;
}
-
-
- if ((val = switch_channel_get_variable(session->channel, "jitterbuffer_msec")) || (val = smh->mparams->jb_msec)) {
- int jb_msec = atoi(val);
- int maxlen = 0, max_drift = 0;
- char *p, *q;
-
- if ((p = strchr(val, ':'))) {
- p++;
- maxlen = atoi(p);
- if ((q = strchr(p, ':'))) {
- q++;
- max_drift = abs(atoi(q));
- }
- }
-
- if (jb_msec < 0 && jb_msec > -20) {
- jb_msec = (a_engine->read_codec.implementation->microseconds_per_packet / 1000) * abs(jb_msec);
- }
-
- if (maxlen < 0 && maxlen > -20) {
- maxlen = (a_engine->read_codec.implementation->microseconds_per_packet / 1000) * abs(maxlen);
- }
-
- if (jb_msec < 20 || jb_msec > 10000) {
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR,
- "Invalid Jitterbuffer spec [%d] must be between 20 and 10000\n", jb_msec);
- } else {
- int qlen, maxqlen = 10;
-
- qlen = jb_msec / (a_engine->read_impl.microseconds_per_packet / 1000);
-
- if (maxlen) {
- maxqlen = maxlen / (a_engine->read_impl.microseconds_per_packet / 1000);
- }
-
- if (maxqlen < qlen) {
- maxqlen = qlen * 5;
- }
- if (switch_rtp_activate_jitter_buffer(a_engine->rtp_session, qlen, maxqlen,
- a_engine->read_impl.samples_per_packet,
- a_engine->read_impl.samples_per_second, max_drift) == SWITCH_STATUS_SUCCESS) {
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session),
- SWITCH_LOG_DEBUG, "Setting Jitterbuffer to %dms (%d frames)\n", jb_msec, qlen);
- switch_channel_set_flag(session->channel, CF_JITTERBUFFER);
- if (!switch_false(switch_channel_get_variable(session->channel, "rtp_jitter_buffer_plc"))) {
- switch_channel_set_flag(session->channel, CF_JITTERBUFFER_PLC);
- }
- } else {
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session),
- SWITCH_LOG_WARNING, "Error Setting Jitterbuffer to %dms (%d frames)\n", jb_msec, qlen);
- }
-
- }
- }
+ check_jb(session);
if ((val = switch_channel_get_variable(session->channel, "rtp_timeout_sec"))) {
int v = atoi(val);
case SWITCH_MESSAGE_INDICATE_JITTER_BUFFER:
{
if (switch_rtp_ready(a_engine->rtp_session)) {
- int len = 0, maxlen = 0, qlen = 0, maxqlen = 10, max_drift = 0;
-
- if (msg->string_arg) {
- char *p, *q;
- const char *s;
-
- if (!strcasecmp(msg->string_arg, "pause")) {
- switch_rtp_pause_jitter_buffer(a_engine->rtp_session, SWITCH_TRUE);
- goto end;
- } else if (!strcasecmp(msg->string_arg, "resume")) {
- switch_rtp_pause_jitter_buffer(a_engine->rtp_session, SWITCH_FALSE);
- goto end;
- } else if (!strncasecmp(msg->string_arg, "debug:", 6)) {
- s = msg->string_arg + 6;
- if (s && !strcmp(s, "off")) {
- s = NULL;
- }
- status = switch_rtp_debug_jitter_buffer(a_engine->rtp_session, s);
- goto end;
- }
-
-
- if ((len = atoi(msg->string_arg))) {
- qlen = len / (a_engine->read_impl.microseconds_per_packet / 1000);
- if (qlen < 1) {
- qlen = 1;
- }
- }
-
- if (qlen) {
- if ((p = strchr(msg->string_arg, ':'))) {
- p++;
- maxlen = atol(p);
- if ((q = strchr(p, ':'))) {
- q++;
- max_drift = abs(atoi(q));
- }
- }
- }
-
-
- if (qlen < 0 && qlen > -20) {
- qlen = (a_engine->read_codec.implementation->microseconds_per_packet / 1000) * abs(qlen);
- }
-
- if (maxlen < 0 && maxlen > -20) {
- maxlen = (a_engine->read_codec.implementation->microseconds_per_packet / 1000) * abs(maxlen);
- }
-
- if (maxlen) {
- maxqlen = maxlen / (a_engine->read_impl.microseconds_per_packet / 1000);
- }
- }
-
- if (qlen) {
- if (maxqlen < qlen) {
- maxqlen = qlen * 5;
- }
- if (switch_rtp_activate_jitter_buffer(a_engine->rtp_session, qlen, maxqlen,
- a_engine->read_impl.samples_per_packet,
- a_engine->read_impl.samples_per_second, max_drift) == SWITCH_STATUS_SUCCESS) {
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session),
- SWITCH_LOG_DEBUG, "Setting Jitterbuffer to %dms (%d frames) (%d max frames) (%d max drift)\n",
- len, qlen, maxqlen, max_drift);
- switch_channel_set_flag(session->channel, CF_JITTERBUFFER);
- if (!switch_false(switch_channel_get_variable(session->channel, "rtp_jitter_buffer_plc"))) {
- switch_channel_set_flag(session->channel, CF_JITTERBUFFER_PLC);
- }
- } else {
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session),
- SWITCH_LOG_WARNING, "Error Setting Jitterbuffer to %dms (%d frames)\n", len, qlen);
- }
-
- } else {
- switch_rtp_deactivate_jitter_buffer(a_engine->rtp_session);
- }
+ switch_channel_set_variable(session->channel, "jitterbuffer_msec", msg->string_arg);
+ check_jb(session);
}
}
break;