]> sjero.net Git - linphone/blobdiff - coreapi/sal.c
Do not restart the media streams if only network addresses have been changed in re...
[linphone] / coreapi / sal.c
index b349ad0a4e4efd002dbd701d607415a88c843fff..229ee577f3a531e3b8c9d3bf85c1312c6d5e03aa 100644 (file)
@@ -177,32 +177,40 @@ static bool_t payload_list_equals(const MSList *l1, const MSList *l2){
        return TRUE;
 }
 
-bool_t sal_stream_description_equals(const SalStreamDescription *sd1, const SalStreamDescription *sd2){
-       if (sd1->proto!=sd2->proto) return FALSE;
-       if (sd1->type!=sd2->type) return FALSE;
-       if (strcmp(sd1->rtp_addr,sd2->rtp_addr)!=0) return FALSE;
-       if (sd1->rtp_port!=sd2->rtp_port) return FALSE;
-       if (strcmp(sd1->rtcp_addr,sd2->rtcp_addr)!=0) return FALSE;
-       if (sd1->rtcp_port!=sd2->rtcp_port) return FALSE;
-       if (!payload_list_equals(sd1->payloads,sd2->payloads)) return FALSE;
-       if (sd1->bandwidth!=sd2->bandwidth) return FALSE;
-       if (sd1->ptime!=sd2->ptime) return FALSE;
-       /* compare candidates: TODO */
-       if (sd1->dir!=sd2->dir) return FALSE;
-       return TRUE;
+int sal_stream_description_equals(const SalStreamDescription *sd1, const SalStreamDescription *sd2) {
+       int result = SAL_MEDIA_DESCRIPTION_UNCHANGED;
+
+       /* A different proto should result in SAL_MEDIA_DESCRIPTION_NETWORK_CHANGED but the encryption change
+          needs a stream restart for now, so use SAL_MEDIA_DESCRIPTION_CODEC_CHANGED */
+       if (sd1->proto != sd2->proto) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED;
+
+       if (sd1->type != sd2->type) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED;
+       if (strcmp(sd1->rtp_addr, sd2->rtp_addr) != 0) result |= SAL_MEDIA_DESCRIPTION_NETWORK_CHANGED;
+       if (sd1->rtp_port != sd2->rtp_port) {
+               if ((sd1->rtp_port == 0) || (sd2->rtp_port == 0)) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED;
+               else result |= SAL_MEDIA_DESCRIPTION_NETWORK_CHANGED;
+       }
+       if (strcmp(sd1->rtcp_addr, sd2->rtcp_addr) != 0) result |= SAL_MEDIA_DESCRIPTION_NETWORK_CHANGED;
+       if (sd1->rtcp_port != sd2->rtcp_port) result |= SAL_MEDIA_DESCRIPTION_NETWORK_CHANGED;
+       if (!payload_list_equals(sd1->payloads, sd2->payloads)) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED;
+       if (sd1->bandwidth != sd2->bandwidth) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED;
+       if (sd1->ptime != sd2->ptime) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED;
+       if (sd1->dir != sd2->dir) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED;
+
+       return result;
 }
 
-bool_t sal_media_description_equals(const SalMediaDescription *md1, const SalMediaDescription *md2){
+int sal_media_description_equals(const SalMediaDescription *md1, const SalMediaDescription *md2) {
+       int result = SAL_MEDIA_DESCRIPTION_UNCHANGED;
        int i;
-       
-       if (strcmp(md1->addr,md2->addr)!=0) return FALSE;
-       if (md1->nstreams!=md2->nstreams) return FALSE;
-       if (md1->bandwidth!=md2->bandwidth) return FALSE;
-       for(i=0;i<md1->nstreams;++i){
-               if (!sal_stream_description_equals(&md1->streams[i],&md2->streams[i]))
-                       return FALSE;
+
+       if (strcmp(md1->addr, md2->addr) != 0) result |= SAL_MEDIA_DESCRIPTION_NETWORK_CHANGED;
+       if (md1->nstreams != md2->nstreams) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED;
+       if (md1->bandwidth != md2->bandwidth) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED;
+       for(i = 0; i < md1->nstreams; ++i){
+               result |= sal_stream_description_equals(&md1->streams[i], &md2->streams[i]);
        }
-       return TRUE;
+       return result;
 }
 
 static void assign_string(char **str, const char *arg){