FS-8677 #resolve [Crash (possible memory corruption) after codec change]

This commit is contained in:
Anthony Minessale
2016-01-06 10:10:14 -06:00
parent 7aa17a9987
commit 56a68e3ad9
9 changed files with 116 additions and 46 deletions
@@ -746,15 +746,24 @@ void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, void *ob
}
if (switch_channel_test_flag(member->channel, CF_CONFERENCE_RESET_MEDIA)) {
member->reset_media = 10;
switch_channel_audio_sync(member->channel);
switch_channel_clear_flag(member->channel, CF_CONFERENCE_RESET_MEDIA);
member->loop_loop = 1;
}
if (member->reset_media) {
if (--member->reset_media > 0) {
goto do_continue;
}
if (conference_member_setup_media(member, member->conference)) {
switch_mutex_unlock(member->read_mutex);
break;
}
member->loop_loop = 1;
goto do_continue;
goto do_continue;
}
if (switch_test_flag(read_frame, SFF_CNG)) {
@@ -1199,10 +1208,10 @@ void conference_loop_output(conference_member_t *member)
uint32_t mux_used = 0;
if (switch_channel_test_flag(member->channel, CF_CONFERENCE_RESET_MEDIA)) {
switch_cond_next();
continue;
}
//if (member->reset_media || switch_channel_test_flag(member->channel, CF_CONFERENCE_RESET_MEDIA)) {
// switch_cond_next();
// continue;
//}
switch_mutex_lock(member->write_mutex);
@@ -1620,13 +1620,7 @@ int conference_member_setup_media(conference_member_t *member, conference_obj_t
switch_mutex_lock(member->audio_out_mutex);
if (!member->orig_read_impl.samples_per_second) {
switch_core_session_get_read_impl(member->session, &member->orig_read_impl);
member->native_rate = read_impl.samples_per_second;
}
read_impl = member->orig_read_impl;
switch_core_session_get_read_impl(member->session, &read_impl);
if (switch_core_codec_ready(&member->read_codec)) {
switch_core_codec_destroy(&member->read_codec);
@@ -1642,6 +1636,9 @@ int conference_member_setup_media(conference_member_t *member, conference_obj_t
switch_resample_destroy(&member->read_resampler);
}
switch_core_session_get_read_impl(member->session, &member->orig_read_impl);
member->native_rate = member->orig_read_impl.samples_per_second;
/* Setup a Signed Linear codec for reading audio. */
if (switch_core_codec_init(&member->read_codec,
"L16",
@@ -769,6 +769,7 @@ struct conference_member {
int max_bw_in;
int force_bw_in;
int max_bw_out;
int reset_media;
};
typedef enum {