cache read_codec implementation to reduce risk of race conditions

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@11143 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2009-01-12 18:37:44 +00:00
parent bb35643915
commit 5edf696110
3 changed files with 32 additions and 26 deletions

View File

@ -709,14 +709,14 @@ static switch_status_t sofia_read_frame(switch_core_session_t *session, switch_f
} }
if (tech_pvt->check_frames++ < MAX_CODEC_CHECK_FRAMES) { if (tech_pvt->check_frames++ < MAX_CODEC_CHECK_FRAMES) {
if (!tech_pvt->read_codec.implementation->encoded_bytes_per_packet) { if (!tech_pvt->read_impl.encoded_bytes_per_packet) {
tech_pvt->check_frames = MAX_CODEC_CHECK_FRAMES; tech_pvt->check_frames = MAX_CODEC_CHECK_FRAMES;
goto skip; goto skip;
} }
if (tech_pvt->last_ts && tech_pvt->read_frame.datalen != tech_pvt->read_codec.implementation->encoded_bytes_per_packet) { if (tech_pvt->last_ts && tech_pvt->read_frame.datalen != tech_pvt->read_impl.encoded_bytes_per_packet) {
switch_size_t codec_ms = (int)(tech_pvt->read_frame.timestamp - switch_size_t codec_ms = (int)(tech_pvt->read_frame.timestamp -
tech_pvt->last_ts) / (tech_pvt->read_codec.implementation->samples_per_second / 1000); tech_pvt->last_ts) / (tech_pvt->read_impl.samples_per_second / 1000);
if ((codec_ms % 10) != 0) { if ((codec_ms % 10) != 0) {
tech_pvt->check_frames = MAX_CODEC_CHECK_FRAMES; tech_pvt->check_frames = MAX_CODEC_CHECK_FRAMES;
@ -768,8 +768,8 @@ static switch_status_t sofia_read_frame(switch_core_session_t *session, switch_f
} }
if (rtp_timeout_sec) { if (rtp_timeout_sec) {
tech_pvt->max_missed_packets = (tech_pvt->read_codec.implementation->samples_per_second * rtp_timeout_sec) / tech_pvt->max_missed_packets = (tech_pvt->read_impl.samples_per_second * rtp_timeout_sec) /
tech_pvt->read_codec.implementation->samples_per_packet; tech_pvt->read_impl.samples_per_packet;
switch_rtp_set_max_missed_packets(tech_pvt->rtp_session, tech_pvt->max_missed_packets); switch_rtp_set_max_missed_packets(tech_pvt->rtp_session, tech_pvt->max_missed_packets);
if (!rtp_hold_timeout_sec) { if (!rtp_hold_timeout_sec) {
@ -778,13 +778,13 @@ static switch_status_t sofia_read_frame(switch_core_session_t *session, switch_f
} }
if (rtp_hold_timeout_sec) { if (rtp_hold_timeout_sec) {
tech_pvt->max_missed_hold_packets = (tech_pvt->read_codec.implementation->samples_per_second * rtp_hold_timeout_sec) / tech_pvt->max_missed_hold_packets = (tech_pvt->read_impl.samples_per_second * rtp_hold_timeout_sec) /
tech_pvt->read_codec.implementation->samples_per_packet; tech_pvt->read_impl.samples_per_packet;
} }
if (switch_rtp_change_interval(tech_pvt->rtp_session, if (switch_rtp_change_interval(tech_pvt->rtp_session,
tech_pvt->codec_ms * 1000, tech_pvt->codec_ms * 1000,
tech_pvt->read_codec.implementation->samples_per_packet tech_pvt->read_impl.samples_per_packet
) != SWITCH_STATUS_SUCCESS) { ) != SWITCH_STATUS_SUCCESS) {
switch_channel_hangup(tech_pvt->channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); switch_channel_hangup(tech_pvt->channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
@ -806,10 +806,10 @@ static switch_status_t sofia_read_frame(switch_core_session_t *session, switch_f
} }
skip: skip:
if ((bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_packet)) { if ((bytes = tech_pvt->read_impl.encoded_bytes_per_packet)) {
frames = (tech_pvt->read_frame.datalen / bytes); frames = (tech_pvt->read_frame.datalen / bytes);
} }
tech_pvt->read_frame.samples = (int) (frames * tech_pvt->read_codec.implementation->samples_per_packet); tech_pvt->read_frame.samples = (int) (frames * tech_pvt->read_impl.samples_per_packet);
if (tech_pvt->read_frame.datalen == 0) { if (tech_pvt->read_frame.datalen == 0) {
continue; continue;
@ -872,13 +872,13 @@ static switch_status_t sofia_write_frame(switch_core_session_t *session, switch_
switch_set_flag_locked(tech_pvt, TFLAG_WRITING); switch_set_flag_locked(tech_pvt, TFLAG_WRITING);
if (!switch_test_flag(frame, SFF_CNG) && !switch_test_flag(frame, SFF_PROXY_PACKET)) { if (!switch_test_flag(frame, SFF_CNG) && !switch_test_flag(frame, SFF_PROXY_PACKET)) {
if (tech_pvt->read_codec.implementation->encoded_bytes_per_packet) { if (tech_pvt->read_impl.encoded_bytes_per_packet) {
bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_packet; bytes = tech_pvt->read_impl.encoded_bytes_per_packet;
frames = ((int) frame->datalen / bytes); frames = ((int) frame->datalen / bytes);
} else } else
frames = 1; frames = 1;
samples = frames * tech_pvt->read_codec.implementation->samples_per_packet; samples = frames * tech_pvt->read_impl.samples_per_packet;
} }
tech_pvt->timestamp_send += samples; tech_pvt->timestamp_send += samples;

View File

@ -553,6 +553,8 @@ struct private_object {
uint32_t last_codec_ms; uint32_t last_codec_ms;
nua_event_t want_event; nua_event_t want_event;
switch_rtp_bug_flag_t rtp_bugs; switch_rtp_bug_flag_t rtp_bugs;
switch_codec_implementation_t read_impl;
switch_codec_implementation_t write_impl;
}; };
struct callback_t { struct callback_t {

View File

@ -1654,9 +1654,13 @@ switch_status_t sofia_glue_tech_set_codec(private_object_t *tech_pvt, int force)
switch_goto_status(SWITCH_STATUS_FALSE, end); switch_goto_status(SWITCH_STATUS_FALSE, end);
} }
tech_pvt->read_impl = *tech_pvt->read_codec.implementation;
tech_pvt->write_impl = *tech_pvt->write_codec.implementation;
if (switch_rtp_ready(tech_pvt->rtp_session)) { if (switch_rtp_ready(tech_pvt->rtp_session)) {
switch_assert(tech_pvt->read_codec.implementation); switch_assert(tech_pvt->read_codec.implementation);
switch_rtp_set_default_samples_per_interval(tech_pvt->rtp_session, tech_pvt->read_codec.implementation->samples_per_packet); switch_rtp_set_default_samples_per_interval(tech_pvt->rtp_session, tech_pvt->read_impl.samples_per_packet);
} }
tech_pvt->read_frame.rate = tech_pvt->rm_rate; tech_pvt->read_frame.rate = tech_pvt->rm_rate;
@ -1669,7 +1673,7 @@ switch_status_t sofia_glue_tech_set_codec(private_object_t *tech_pvt, int force)
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Set Codec %s %s/%ld %d ms %d samples\n", switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Set Codec %s %s/%ld %d ms %d samples\n",
switch_channel_get_name(tech_pvt->channel), tech_pvt->iananame, tech_pvt->rm_rate, tech_pvt->codec_ms, switch_channel_get_name(tech_pvt->channel), tech_pvt->iananame, tech_pvt->rm_rate, tech_pvt->codec_ms,
tech_pvt->read_codec.implementation->samples_per_packet); tech_pvt->read_impl.samples_per_packet);
tech_pvt->read_frame.codec = &tech_pvt->read_codec; tech_pvt->read_frame.codec = &tech_pvt->read_codec;
tech_pvt->write_codec.agreed_pt = tech_pvt->agreed_pt; tech_pvt->write_codec.agreed_pt = tech_pvt->agreed_pt;
@ -1832,8 +1836,8 @@ switch_status_t sofia_glue_activate_rtp(private_object_t *tech_pvt, switch_rtp_f
goto end; goto end;
} }
bw = tech_pvt->read_codec.implementation->bits_per_second; bw = tech_pvt->read_impl.bits_per_second;
ms = tech_pvt->read_codec.implementation->microseconds_per_packet; ms = tech_pvt->read_impl.microseconds_per_packet;
if (myflags) { if (myflags) {
flags = myflags; flags = myflags;
@ -1892,7 +1896,7 @@ switch_status_t sofia_glue_activate_rtp(private_object_t *tech_pvt, switch_rtp_f
tech_pvt->local_sdp_audio_ip, tech_pvt->local_sdp_audio_ip,
tech_pvt->local_sdp_audio_port, tech_pvt->local_sdp_audio_port,
tech_pvt->remote_sdp_audio_ip, tech_pvt->remote_sdp_audio_ip,
tech_pvt->remote_sdp_audio_port, tech_pvt->agreed_pt, tech_pvt->read_codec.implementation->microseconds_per_packet / 1000); tech_pvt->remote_sdp_audio_port, tech_pvt->agreed_pt, tech_pvt->read_impl.microseconds_per_packet / 1000);
} }
switch_snprintf(tmp, sizeof(tmp), "%d", tech_pvt->local_sdp_audio_port); switch_snprintf(tmp, sizeof(tmp), "%d", tech_pvt->local_sdp_audio_port);
@ -1934,7 +1938,7 @@ switch_status_t sofia_glue_activate_rtp(private_object_t *tech_pvt, switch_rtp_f
tech_pvt->local_sdp_audio_ip, tech_pvt->local_sdp_audio_ip,
tech_pvt->local_sdp_audio_port, tech_pvt->local_sdp_audio_port,
tech_pvt->remote_sdp_audio_ip, tech_pvt->remote_sdp_audio_ip,
tech_pvt->remote_sdp_audio_port, tech_pvt->agreed_pt, tech_pvt->read_codec.implementation->microseconds_per_packet / 1000); tech_pvt->remote_sdp_audio_port, tech_pvt->agreed_pt, tech_pvt->read_impl.microseconds_per_packet / 1000);
} else { } else {
timer_name = tech_pvt->profile->timer_name; timer_name = tech_pvt->profile->timer_name;
@ -1949,7 +1953,7 @@ switch_status_t sofia_glue_activate_rtp(private_object_t *tech_pvt, switch_rtp_f
tech_pvt->remote_sdp_audio_ip, tech_pvt->remote_sdp_audio_ip,
tech_pvt->remote_sdp_audio_port, tech_pvt->remote_sdp_audio_port,
tech_pvt->agreed_pt, tech_pvt->agreed_pt,
tech_pvt->read_codec.implementation->samples_per_packet, tech_pvt->read_impl.samples_per_packet,
tech_pvt->codec_ms * 1000, tech_pvt->codec_ms * 1000,
(switch_rtp_flag_t) flags, timer_name, &err, switch_core_session_get_pool(tech_pvt->session)); (switch_rtp_flag_t) flags, timer_name, &err, switch_core_session_get_pool(tech_pvt->session));
@ -1982,7 +1986,7 @@ switch_status_t sofia_glue_activate_rtp(private_object_t *tech_pvt, switch_rtp_f
} }
} }
stun_ping = (ival * tech_pvt->read_codec.implementation->samples_per_second) / tech_pvt->read_codec.implementation->samples_per_packet; stun_ping = (ival * tech_pvt->read_impl.samples_per_second) / tech_pvt->read_impl.samples_per_packet;
} }
tech_pvt->ssrc = switch_rtp_get_ssrc(tech_pvt->rtp_session); tech_pvt->ssrc = switch_rtp_get_ssrc(tech_pvt->rtp_session);
@ -2012,7 +2016,7 @@ switch_status_t sofia_glue_activate_rtp(private_object_t *tech_pvt, switch_rtp_f
} else { } else {
int qlen; int qlen;
qlen = len / (tech_pvt->read_codec.implementation->microseconds_per_packet / 1000); qlen = len / (tech_pvt->read_impl.microseconds_per_packet / 1000);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Setting Jitterbuffer to %dms (%d frames)\n", len, qlen); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Setting Jitterbuffer to %dms (%d frames)\n", len, qlen);
switch_rtp_activate_jitter_buffer(tech_pvt->rtp_session, qlen); switch_rtp_activate_jitter_buffer(tech_pvt->rtp_session, qlen);
@ -2034,8 +2038,8 @@ switch_status_t sofia_glue_activate_rtp(private_object_t *tech_pvt, switch_rtp_f
} }
if (rtp_timeout_sec) { if (rtp_timeout_sec) {
tech_pvt->max_missed_packets = (tech_pvt->read_codec.implementation->samples_per_second * rtp_timeout_sec) / tech_pvt->max_missed_packets = (tech_pvt->read_impl.samples_per_second * rtp_timeout_sec) /
tech_pvt->read_codec.implementation->samples_per_packet; tech_pvt->read_impl.samples_per_packet;
switch_rtp_set_max_missed_packets(tech_pvt->rtp_session, tech_pvt->max_missed_packets); switch_rtp_set_max_missed_packets(tech_pvt->rtp_session, tech_pvt->max_missed_packets);
if (!rtp_hold_timeout_sec) { if (!rtp_hold_timeout_sec) {
@ -2044,8 +2048,8 @@ switch_status_t sofia_glue_activate_rtp(private_object_t *tech_pvt, switch_rtp_f
} }
if (rtp_hold_timeout_sec) { if (rtp_hold_timeout_sec) {
tech_pvt->max_missed_hold_packets = (tech_pvt->read_codec.implementation->samples_per_second * rtp_hold_timeout_sec) / tech_pvt->max_missed_hold_packets = (tech_pvt->read_impl.samples_per_second * rtp_hold_timeout_sec) /
tech_pvt->read_codec.implementation->samples_per_packet; tech_pvt->read_impl.samples_per_packet;
} }
if (tech_pvt->te) { if (tech_pvt->te) {