@@ -1905,7 +1905,6 @@ sdp_origin sdp_orig_dup(const sdp_origin *orig) {
19051905 sdp_origin copy = {};
19061906 copy .username = call_str_cpy (& orig -> username );
19071907 copy .session_id = call_str_cpy (& orig -> session_id );
1908- copy .version_str = call_str_cpy (& orig -> version_str );
19091908 copy .version_num = orig -> version_num ;
19101909 copy .version_output_pos = orig -> version_output_pos ;
19111910 copy .parsed = orig -> parsed ;
@@ -2706,70 +2705,48 @@ static void insert_rtcp_attr(GString *s, struct packet_stream *ps, const sdp_ng_
27062705/**
27072706 * Handle sdp version replacements.
27082707 */
2709- static void sdp_version_replace (GString * s , sdp_origin * src_orig , sdp_origin * other_orig )
2708+ static void sdp_version_increase (GString * s , sdp_origin * origin )
27102709{
27112710 char version_str [64 ];
2712- snprintf (version_str , sizeof (version_str ), "%llu" , src_orig -> version_num );
2713- size_t version_len = strlen (version_str );
2711+ snprintf (version_str , sizeof (version_str ), "%llu" , origin -> version_num );
2712+ size_t old_version_len = strlen (version_str );
27142713
2715- if (!other_orig )
2716- return ;
2714+ origin -> version_num ++ ;
2715+
2716+ snprintf (version_str , sizeof (version_str ), "%llu" , origin -> version_num );
2717+ size_t version_len = strlen (version_str );
27172718
2718- other_orig -> version_num = src_orig -> version_num ;
27192719 /* is our new value longer? */
2720- if (version_len > other_orig -> version_str . len ) {
2720+ if (version_len > old_version_len ) {
27212721 /* overwrite + insert */
2722- g_string_overwrite_len (s , other_orig -> version_output_pos , version_str , other_orig -> version_str .len );
2723- g_string_insert (s , other_orig -> version_output_pos + other_orig -> version_str .len , version_str + other_orig -> version_str .len );
2724- other_orig -> version_str .len = version_len ;
2722+ g_string_overwrite_len (s , origin -> version_output_pos , version_str , old_version_len );
2723+ g_string_insert (s , origin -> version_output_pos + old_version_len , version_str + old_version_len );
27252724 }
27262725 else {
27272726 /* overwrite + optional erase */
2728- g_string_overwrite (s , other_orig -> version_output_pos , version_str );
2729- if (version_len < other_orig -> version_str .len ) {
2730- g_string_erase (s , other_orig -> version_output_pos + version_len , other_orig -> version_str .len - version_len );
2731- other_orig -> version_str .len = version_len ;
2727+ g_string_overwrite (s , origin -> version_output_pos , version_str );
2728+ if (version_len < old_version_len ) {
2729+ g_string_erase (s , origin -> version_output_pos + version_len , old_version_len - version_len );
27322730 }
27332731 }
27342732}
27352733
27362734/**
27372735 * SDP session version manipulations.
27382736 */
2739- static void sdp_version_check (GString * s , struct call_monologue * monologue ,
2740- struct call_monologue * source_ml ,
2741- bool force_increase )
2742- {
2737+ static void sdp_version_check (GString * s , struct call_monologue * monologue ) {
27432738 if (!monologue -> sdp_orig_out .parsed )
27442739 return ;
27452740
27462741 sdp_origin * origin = & monologue -> sdp_orig_out ;
2747- sdp_origin * other_origin = NULL ;
2748-
2749- if (source_ml && source_ml -> sdp_orig_in .parsed )
2750- other_origin = & source_ml -> sdp_orig_in ;
2751-
2752- /* We really expect only a single session here, but we treat all the same regardless,
2753- * and use the same version number on all of them */
2754-
2755- /* First update all versions to match our single version */
2756- sdp_version_replace (s , origin , other_origin );
2757-
2758- /* Now check if we need to change the version actually.
2759- * The version change will be forced with the 'force_increase',
2760- * and it gets incremented, regardless whether:
2761- * - we have no previously stored SDP,
2762- * - we have previous SDP and it's equal to the current one */
2763- if (!force_increase ) {
2764- if (!monologue -> last_out_sdp )
2765- goto dup ;
2766- if (g_string_equal (monologue -> last_out_sdp , s ))
2767- return ;
2768- }
2742+
2743+ if (!monologue -> last_out_sdp )
2744+ goto dup ;
2745+ if (g_string_equal (monologue -> last_out_sdp , s ))
2746+ return ;
27692747
27702748 /* mismatch detected. increment version, update again, and store copy */
2771- origin -> version_num ++ ;
2772- sdp_version_replace (s , origin , other_origin );
2749+ sdp_version_increase (s , origin );
27732750 if (monologue -> last_out_sdp )
27742751 g_string_free (monologue -> last_out_sdp , TRUE);
27752752dup :
@@ -3006,56 +2983,81 @@ static void sdp_out_add_origin(GString *out, struct call_monologue *monologue,
30062983 struct call_monologue * source_ml ,
30072984 struct packet_stream * first_ps , sdp_ng_flags * flags )
30082985{
3009- __auto_type ml = source_ml ;
3010- if (!ml )
3011- ml = monologue ;
3012-
3013- /* orig username
3014- * session_last_sdp_orig is stored on the other media always,
3015- * so if origin is meant for the A media, then it is stored on the B one */
3016- str * orig_username = (monologue -> sdp_orig_out .parsed &&
3017- (flags -> replace_username || flags -> replace_origin_full )) ?
3018- & monologue -> sdp_orig_out .username : & ml -> sdp_orig_in .username ;
3019-
3020- /* orig session id */
3021- str * orig_session_id = (monologue -> sdp_orig_out .parsed && flags -> replace_origin_full ) ?
3022- & monologue -> sdp_orig_out .session_id : & ml -> sdp_orig_in .session_id ;
3023-
3024- /* orig session ver
3025- * replacement is handled later in sdp_create() based on SDP changes */
3026- unsigned long long orig_session_version = ml -> sdp_orig_in .version_num ;
2986+ /* origin username */
2987+ str username = STR_NULL ;
2988+ if (source_ml && !(flags -> replace_username || flags -> replace_origin_full ))
2989+ username = source_ml -> sdp_orig_in .username ;
2990+ if (!username .len && monologue -> sdp_orig_out .parsed )
2991+ username = monologue -> sdp_orig_out .username ;
2992+ if (!username .len && source_ml )
2993+ username = source_ml -> sdp_orig_in .username ;
2994+ if (!username .len )
2995+ username = STR ("-" );
2996+
2997+ /* origin session id */
2998+ str session_id = STR_NULL ;
2999+ char id_buf [64 ];
3000+ if (source_ml && !flags -> replace_origin_full )
3001+ session_id = source_ml -> sdp_orig_in .session_id ;
3002+ if (!session_id .len && monologue -> sdp_orig_out .parsed )
3003+ session_id = monologue -> sdp_orig_out .session_id ;
3004+ if (!session_id .len && source_ml )
3005+ session_id = source_ml -> sdp_orig_in .session_id ;
3006+ if (!session_id .len ) {
3007+ snprintf (id_buf , sizeof (id_buf ), "%" PRId64 , (rtpe_now & 0xfffffffL ) + 1 );
3008+ session_id = STR (id_buf );
3009+ }
3010+
3011+ /* origin session ver */
3012+ unsigned long long session_version ;
3013+ if (monologue -> sdp_orig_out .parsed && flags -> force_inc_sdp_ver )
3014+ session_version = monologue -> sdp_orig_out .version_num + 1 ;
3015+ else if (monologue -> sdp_orig_out .parsed
3016+ && (flags -> replace_sdp_version || flags -> replace_origin_full ))
3017+ session_version = monologue -> sdp_orig_out .version_num ;
3018+ else if (source_ml )
3019+ session_version = source_ml -> sdp_orig_in .version_num ;
3020+ else if (monologue -> sdp_orig_out .parsed )
3021+ session_version = monologue -> sdp_orig_out .version_num ;
3022+ else
3023+ session_version = (ssl_random () & 0xfffffffL ) + 1 ;
3024+
30273025 /* record origin version position for replacements
30283026 * + 4 - means: `o=` + 2 spaces between username and version / version and id */
3029- ml -> sdp_orig_in . version_output_pos = out -> len + orig_username -> len + orig_session_id -> len + 4 ;
3027+ size_t version_output_pos = out -> len + username . len + session_id . len + 4 ;
30303028
30313029 /* orig IP family and address */
30323030 str orig_address_type ;
30333031 str orig_address ;
3034- if (!source_ml || flags -> replace_origin || flags -> replace_origin_full ) {
3035- /* replacing flags or PUBLISH */
3032+ if (source_ml && !(flags -> replace_origin || flags -> replace_origin_full )) {
3033+ orig_address_type = source_ml -> sdp_orig_in .address .address_type ;
3034+ orig_address = source_ml -> sdp_orig_in .address .address ;
3035+ }
3036+ else if (monologue -> sdp_orig_out .parsed ) {
3037+ orig_address_type = monologue -> sdp_orig_out .address .address_type ;
3038+ orig_address = monologue -> sdp_orig_out .address .address ;
3039+ }
3040+ else {
30363041 orig_address_type = STR (first_ps -> selected_sfd -> local_intf -> advertised_address .addr .family -> rfc_name );
30373042 orig_address = STR (sockaddr_print_buf (& first_ps -> selected_sfd -> local_intf -> advertised_address .addr ));
3038- } else {
3039- orig_address_type = ml -> sdp_orig_in .address .address_type ;
3040- orig_address = ml -> sdp_orig_in .address .address ;
30413043 }
30423044
3043- if (! monologue -> sdp_orig_out . parsed )
3044- monologue -> sdp_orig_out = sdp_orig_dup ( & ( sdp_origin ) {
3045- . username = * orig_username ,
3046- . session_id = * orig_session_id ,
3047- . version_num = orig_session_version ,
3048- .address .address_type = orig_address_type ,
3049- . address . address = orig_address ,
3050- .parsed = 1 ,
3051- });
3045+ monologue -> sdp_orig_out = sdp_orig_dup ( & ( sdp_origin ) {
3046+ . username = username ,
3047+ . session_id = session_id ,
3048+ . version_num = session_version ,
3049+ . address . address_type = orig_address_type ,
3050+ .address .address = orig_address ,
3051+ . version_output_pos = version_output_pos ,
3052+ .parsed = 1 ,
3053+ });
30523054
30533055 /* print it to the output sdp */
30543056 g_string_append_printf (out ,
30553057 "o=" STR_FORMAT " " STR_FORMAT " %llu IN " STR_FORMAT " " STR_FORMAT "\r\n" ,
3056- STR_FMT (orig_username ),
3057- STR_FMT (orig_session_id ),
3058- orig_session_version ,
3058+ STR_FMT (& username ),
3059+ STR_FMT (& session_id ),
3060+ session_version ,
30593061 STR_FMT (& orig_address_type ),
30603062 STR_FMT (& orig_address ));
30613063}
@@ -3551,13 +3553,8 @@ bool sdp_create(str *out, struct call_monologue *monologue, sdp_ng_flags *flags)
35513553 sdp_manipulations_add (s , sdp_manipulations );
35523554 }
35533555
3554- /* The SDP version gets increased in case:
3555- * - if replace_sdp_version (sdp-version) or replace_origin_full flag is set and SDP information has been updated, or
3556- * - if the force_inc_sdp_ver (force-increment-sdp-ver) flag is set additionally to replace_sdp_version,
3557- * which forces version increase regardless changes in the SDP information.
3558- */
3559- if (flags -> force_inc_sdp_ver || flags -> replace_sdp_version || flags -> replace_origin_full )
3560- sdp_version_check (s , monologue , source_ml , !!flags -> force_inc_sdp_ver );
3556+ if (flags -> replace_sdp_version || flags -> replace_origin_full )
3557+ sdp_version_check (s , monologue );
35613558
35623559 out -> len = s -> len ;
35633560 out -> s = g_string_free (s , FALSE);
0 commit comments