diff -Naru asterisk_orig/channels/chan_sip.c asterisk/channels/chan_sip.c --- asterisk_orig/channels/chan_sip.c 2011-07-28 12:56:15.000000000 +0200 +++ asterisk/channels/chan_sip.c 2011-07-28 13:05:37.000000000 +0200 @@ -8701,6 +8701,8 @@ /* SRTP */ int secure_audio = FALSE; int secure_video = FALSE; + int clear_audio_offered = FALSE; + int clear_video_offered = FALSE; /* Others */ int sendonly = -1; @@ -8824,6 +8826,9 @@ } else if (strcmp(protocol, "AVP")) { ast_log(LOG_WARNING, "unknown SDP media protocol in offer: %s\n", protocol); continue; + } else { + /* We have been offered plain audio */ + clear_audio_offered = TRUE; } audio = TRUE; p->offered_media[SDP_AUDIO].offered = TRUE; @@ -8852,6 +8857,9 @@ } else if (strcmp(protocol, "AVP")) { ast_log(LOG_WARNING, "unknown SDP media protocol in offer: %s\n", protocol); continue; + } else { + /* We have been offered plain video */ + clear_video_offered = TRUE; } video = TRUE; p->novideo = FALSE; @@ -9014,8 +9022,12 @@ if (secure_audio && !(p->srtp && (ast_test_flag(p->srtp, SRTP_CRYPTO_OFFER_OK)))) { ast_log(LOG_WARNING, "Can't provide secure audio requested in SDP offer\n"); - res = -4; - goto process_sdp_cleanup; + if ( clear_video_offered ) { + ast_log(LOG_WARNING, "Falling back to offered unsecure audio\n"); + } else { + res = -4; + goto process_sdp_cleanup; + } } if (!secure_audio && p->srtp) { @@ -9026,8 +9038,12 @@ if (secure_video && !(p->vsrtp && (ast_test_flag(p->vsrtp, SRTP_CRYPTO_OFFER_OK)))) { ast_log(LOG_WARNING, "Can't provide secure video requested in SDP offer\n"); - res = -4; - goto process_sdp_cleanup; + if ( clear_video_offered ) { + ast_log(LOG_WARNING, "Falling back to offered unsecure video\n"); + } else { + res = -4; + goto process_sdp_cleanup; + } } if (!p->novideo && !secure_video && p->vsrtp) {