diff --git a/src/mod/endpoints/mod_dingaling/mod_dingaling.c b/src/mod/endpoints/mod_dingaling/mod_dingaling.c index af67afcfc9..679a4d6588 100644 --- a/src/mod/endpoints/mod_dingaling/mod_dingaling.c +++ b/src/mod/endpoints/mod_dingaling/mod_dingaling.c @@ -1167,6 +1167,8 @@ static int activate_audio_rtp(struct private_object *tech_pvt) r = 0; goto end; } + tech_pvt->transports[LDL_TPORT_RTP].read_codec.session = tech_pvt->session; + tech_pvt->transports[LDL_TPORT_RTP].read_frame.rate = tech_pvt->transports[LDL_TPORT_RTP].read_codec.implementation->samples_per_second; tech_pvt->transports[LDL_TPORT_RTP].read_frame.codec = &tech_pvt->transports[LDL_TPORT_RTP].read_codec; @@ -1186,6 +1188,7 @@ static int activate_audio_rtp(struct private_object *tech_pvt) r = 0; goto end; } + tech_pvt->transports[LDL_TPORT_RTP].write_codec.session = tech_pvt->session; switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG, "Set Write Codec to %s@%d\n", tech_pvt->transports[LDL_TPORT_RTP].codec_name, (int) tech_pvt->transports[LDL_TPORT_RTP].write_codec.implementation->samples_per_second); diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 15b6eb0eeb..bbaa9ae347 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -3037,6 +3037,9 @@ switch_status_t sofia_glue_tech_set_codec(private_object_t *tech_pvt, int force) switch_channel_hangup(tech_pvt->channel, SWITCH_CAUSE_INCOMPATIBLE_DESTINATION); switch_goto_status(SWITCH_STATUS_FALSE, end); } + + tech_pvt->read_codec.session = tech_pvt->session; + if (switch_core_codec_init_with_bitrate(&tech_pvt->write_codec, tech_pvt->iananame, @@ -3052,6 +3055,8 @@ switch_status_t sofia_glue_tech_set_codec(private_object_t *tech_pvt, int force) switch_goto_status(SWITCH_STATUS_FALSE, end); } + tech_pvt->write_codec.session = tech_pvt->session; + switch_channel_set_variable(tech_pvt->channel, "sip_use_codec_name", tech_pvt->iananame); switch_channel_set_variable(tech_pvt->channel, "sip_use_codec_fmtp", tech_pvt->rm_fmtp); switch_channel_set_variable_printf(tech_pvt->channel, "sip_use_codec_rate", "%d", tech_pvt->rm_rate); diff --git a/src/switch_core_io.c b/src/switch_core_io.c index f175cf2e07..ba4874d81f 100644 --- a/src/switch_core_io.c +++ b/src/switch_core_io.c @@ -375,8 +375,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi } else { switch_codec_t *codec = use_codec->implementation?use_codec:read_frame->codec; switch_thread_rwlock_rdlock(session->bug_rwlock); - codec->session = session; codec->cur_frame = read_frame; + session->read_codec->cur_frame = read_frame; status = switch_core_codec_decode(codec, session->read_codec, read_frame->data, @@ -384,8 +384,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi session->read_impl.actual_samples_per_second, session->raw_read_frame.data, &session->raw_read_frame.datalen, &session->raw_read_frame.rate, &read_frame->flags); - codec->session = NULL; codec->cur_frame = NULL; + session->read_codec->cur_frame = NULL; switch_thread_rwlock_unlock(session->bug_rwlock); } @@ -628,8 +628,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi switch_assert(session->read_codec != NULL); switch_assert(enc_frame != NULL); switch_assert(enc_frame->data != NULL); - session->read_codec->session = session; session->read_codec->cur_frame = enc_frame; + enc_frame->codec->cur_frame = enc_frame; status = switch_core_codec_encode(session->read_codec, enc_frame->codec, enc_frame->data, @@ -637,7 +637,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi session->read_impl.actual_samples_per_second, session->enc_read_frame.data, &session->enc_read_frame.datalen, &session->enc_read_frame.rate, &flag); session->read_codec->cur_frame = NULL; - session->read_codec->session = NULL; + enc_frame->codec->cur_frame = NULL; switch (status) { case SWITCH_STATUS_RESAMPLE: switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Fixme 1\n"); @@ -911,17 +911,16 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_frame(switch_core_sess if (frame->codec) { session->raw_write_frame.datalen = session->raw_write_frame.buflen; - frame->codec->session = session; frame->codec->cur_frame = frame; + session->write_codec->cur_frame = frame; status = switch_core_codec_decode(frame->codec, session->write_codec, frame->data, frame->datalen, session->write_impl.actual_samples_per_second, session->raw_write_frame.data, &session->raw_write_frame.datalen, &session->raw_write_frame.rate, &frame->flags); - frame->codec->session = NULL; frame->codec->cur_frame = NULL; - + session->write_codec->cur_frame = NULL; if (do_resample && status == SWITCH_STATUS_SUCCESS) { status = SWITCH_STATUS_RESAMPLE; } @@ -1100,16 +1099,17 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_frame(switch_core_sess enc_frame = write_frame; session->enc_write_frame.datalen = session->enc_write_frame.buflen; - session->write_codec->session = session; session->write_codec->cur_frame = frame; + frame->codec->cur_frame = frame; status = switch_core_codec_encode(session->write_codec, frame->codec, enc_frame->data, enc_frame->datalen, session->write_impl.actual_samples_per_second, session->enc_write_frame.data, &session->enc_write_frame.datalen, &session->enc_write_frame.rate, &flag); - session->write_codec->session = NULL; + session->write_codec->cur_frame = NULL; + frame->codec->cur_frame = NULL; switch (status) { case SWITCH_STATUS_RESAMPLE: resample++; @@ -1203,17 +1203,18 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_frame(switch_core_sess } else { rate = session->write_impl.actual_samples_per_second; } - session->write_codec->session = session; + session->write_codec->cur_frame = frame; + frame->codec->cur_frame = frame; status = switch_core_codec_encode(session->write_codec, frame->codec, enc_frame->data, enc_frame->datalen, rate, session->enc_write_frame.data, &session->enc_write_frame.datalen, &session->enc_write_frame.rate, &flag); - session->write_codec->session = NULL; - session->write_codec->cur_frame = NULL; + session->write_codec->cur_frame = NULL; + frame->codec->cur_frame = NULL; switch (status) { case SWITCH_STATUS_RESAMPLE: resample++;