FS-8673 #resolve [core dump on playback after "Decode Codec is not initialized!" log message]

This commit is contained in:
Anthony Minessale 2015-12-17 15:50:59 -06:00
parent ee12caebd2
commit 1015c3c7a2
1 changed files with 25 additions and 34 deletions

View File

@ -69,7 +69,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
{ {
switch_io_event_hook_read_frame_t *ptr; switch_io_event_hook_read_frame_t *ptr;
switch_status_t status = SWITCH_STATUS_FALSE; switch_status_t status = SWITCH_STATUS_FALSE;
int need_codec, perfect, do_bugs = 0, do_resample = 0, is_cng = 0, tap_only = 0; int need_codec, perfect, bug_locked = 0, global_prune = 0, do_bugs = 0, do_resample = 0, is_cng = 0, tap_only = 0;
switch_codec_implementation_t codec_impl; switch_codec_implementation_t codec_impl;
unsigned int flag = 0; unsigned int flag = 0;
int i; int i;
@ -121,6 +121,13 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
switch_mutex_lock(session->read_codec->mutex); switch_mutex_lock(session->read_codec->mutex);
switch_thread_rwlock_rdlock(session->bug_rwlock);
if (session->bugs) {
bug_locked = 1;
} else {
switch_thread_rwlock_unlock(session->bug_rwlock);
}
top: top:
for(i = 0; i < 2; i++) { for(i = 0; i < 2; i++) {
@ -237,8 +244,6 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
switch_bool_t ok = SWITCH_TRUE; switch_bool_t ok = SWITCH_TRUE;
int prune = 0; int prune = 0;
switch_thread_rwlock_rdlock(session->bug_rwlock);
for (bp = session->bugs; bp; bp = bp->next) { for (bp = session->bugs; bp; bp = bp->next) {
ok = SWITCH_TRUE; ok = SWITCH_TRUE;
@ -275,10 +280,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
prune++; prune++;
} }
} }
switch_thread_rwlock_unlock(session->bug_rwlock);
if (prune) { if (prune) {
switch_core_media_bug_prune(session); global_prune++;
} }
} }
@ -299,7 +303,6 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
int prune = 0; int prune = 0;
if (session->bugs && switch_test_flag((*frame), SFF_CNG)) { if (session->bugs && switch_test_flag((*frame), SFF_CNG)) {
switch_thread_rwlock_rdlock(session->bug_rwlock);
for (bp = session->bugs; bp; bp = bp->next) { for (bp = session->bugs; bp; bp = bp->next) {
ok = SWITCH_TRUE; ok = SWITCH_TRUE;
@ -342,10 +345,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
prune++; prune++;
} }
} }
switch_thread_rwlock_unlock(session->bug_rwlock);
if (prune) { if (prune) {
switch_core_media_bug_prune(session); global_prune++;
} }
@ -438,12 +440,6 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
} else { } else {
switch_codec_t *use_codec = read_frame->codec; switch_codec_t *use_codec = read_frame->codec;
if (do_bugs) { if (do_bugs) {
switch_thread_rwlock_wrlock(session->bug_rwlock);
if (!session->bugs) {
switch_thread_rwlock_unlock(session->bug_rwlock);
goto done;
}
if (!switch_core_codec_ready(&session->bug_codec) && switch_core_codec_ready(read_frame->codec)) { if (!switch_core_codec_ready(&session->bug_codec) && switch_core_codec_ready(read_frame->codec)) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Setting BUG Codec %s:%d\n", switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Setting BUG Codec %s:%d\n",
read_frame->codec->implementation->iananame, read_frame->codec->implementation->ianacode); read_frame->codec->implementation->iananame, read_frame->codec->implementation->ianacode);
@ -457,14 +453,6 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
if (switch_core_codec_ready(&session->bug_codec)) { if (switch_core_codec_ready(&session->bug_codec)) {
use_codec = &session->bug_codec; use_codec = &session->bug_codec;
} }
switch_thread_rwlock_unlock(session->bug_rwlock);
switch_thread_rwlock_wrlock(session->bug_rwlock);
if (!session->bugs) {
do_bugs = 0;
}
switch_thread_rwlock_unlock(session->bug_rwlock);
if (!do_bugs) goto done;
} }
if (!switch_test_flag(read_frame->codec, SWITCH_CODEC_FLAG_HAS_PLC) && if (!switch_test_flag(read_frame->codec, SWITCH_CODEC_FLAG_HAS_PLC) &&
@ -486,7 +474,6 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
codec = read_frame->codec; codec = read_frame->codec;
} }
switch_thread_rwlock_rdlock(session->bug_rwlock);
codec->cur_frame = read_frame; codec->cur_frame = read_frame;
session->read_codec->cur_frame = read_frame; session->read_codec->cur_frame = read_frame;
status = switch_core_codec_decode(codec, status = switch_core_codec_decode(codec,
@ -501,8 +488,6 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
session->raw_read_frame.channels = codec->implementation->number_of_channels; session->raw_read_frame.channels = codec->implementation->number_of_channels;
codec->cur_frame = NULL; codec->cur_frame = NULL;
session->read_codec->cur_frame = NULL; session->read_codec->cur_frame = NULL;
switch_thread_rwlock_unlock(session->bug_rwlock);
} }
if (status == SWITCH_STATUS_SUCCESS && session->read_impl.number_of_channels == 1) { if (status == SWITCH_STATUS_SUCCESS && session->read_impl.number_of_channels == 1) {
@ -636,7 +621,6 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
switch_media_bug_t *bp; switch_media_bug_t *bp;
switch_bool_t ok = SWITCH_TRUE; switch_bool_t ok = SWITCH_TRUE;
int prune = 0; int prune = 0;
switch_thread_rwlock_rdlock(session->bug_rwlock);
for (bp = session->bugs; bp; bp = bp->next) { for (bp = session->bugs; bp; bp = bp->next) {
ok = SWITCH_TRUE; ok = SWITCH_TRUE;
@ -677,9 +661,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
} }
switch_thread_rwlock_unlock(session->bug_rwlock);
if (prune) { if (prune) {
switch_core_media_bug_prune(session); global_prune++;
} }
} }
@ -687,7 +671,6 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
switch_media_bug_t *bp; switch_media_bug_t *bp;
switch_bool_t ok = SWITCH_TRUE; switch_bool_t ok = SWITCH_TRUE;
int prune = 0; int prune = 0;
switch_thread_rwlock_rdlock(session->bug_rwlock);
for (bp = session->bugs; bp; bp = bp->next) { for (bp = session->bugs; bp; bp = bp->next) {
ok = SWITCH_TRUE; ok = SWITCH_TRUE;
@ -738,9 +721,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
prune++; prune++;
} }
} }
switch_thread_rwlock_unlock(session->bug_rwlock);
if (prune) { if (prune) {
switch_core_media_bug_prune(session); global_prune++;
} }
} }
@ -868,7 +851,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
switch_media_bug_t *bp; switch_media_bug_t *bp;
switch_bool_t ok = SWITCH_TRUE; switch_bool_t ok = SWITCH_TRUE;
int prune = 0; int prune = 0;
switch_thread_rwlock_rdlock(session->bug_rwlock);
for (bp = session->bugs; bp; bp = bp->next) { for (bp = session->bugs; bp; bp = bp->next) {
ok = SWITCH_TRUE; ok = SWITCH_TRUE;
@ -907,9 +890,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
prune++; prune++;
} }
} }
switch_thread_rwlock_unlock(session->bug_rwlock);
if (prune) { if (prune) {
switch_core_media_bug_prune(session); global_prune++;
} }
} }
} }
@ -922,6 +905,14 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
*frame = &runtime.dummy_cng_frame; *frame = &runtime.dummy_cng_frame;
} }
if (global_prune) {
switch_core_media_bug_prune(session);
}
if (bug_locked) {
switch_thread_rwlock_unlock(session->bug_rwlock);
}
switch_mutex_unlock(session->read_codec->mutex); switch_mutex_unlock(session->read_codec->mutex);
switch_mutex_unlock(session->codec_read_mutex); switch_mutex_unlock(session->codec_read_mutex);