<p>N A has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/15953">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">translate.c: Fixed codec translator bug<br><br>If multiple codecs are available for the same<br>resource and the translation costs between<br>multiple codecs are the same, ties are<br>currently broken arbitrarily, which means a<br>lower quality codec would be used. This forces<br>Asterisk to explicitly use the higher quality<br>codec, ceteris paribus.<br><br>ASTERISK-29455<br><br>Change-Id: I4b7297e1baca7aac14fe4a3c7538e18e2dbe9fd6<br>---<br>M include/asterisk/translate.h<br>M main/translate.c<br>2 files changed, 41 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/53/15953/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/asterisk/translate.h b/include/asterisk/translate.h</span><br><span>index b2da453..03b1ea9 100644</span><br><span>--- a/include/asterisk/translate.h</span><br><span>+++ b/include/asterisk/translate.h</span><br><span>@@ -282,6 +282,16 @@</span><br><span>  */</span><br><span> void ast_translator_deactivate(struct ast_translator *t);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! \brief Determine which protocol is higher quality</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Given two codec identifiers, is the first codec strictly superior to the second?</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param codec identifier A</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param codec identifier B</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return Returns 1 if codec A is positively superior to B, 0 otherwise.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_translator_better_quality(int c1, int c2);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*!</span><br><span>  * \brief Chooses the best translation path</span><br><span>  *</span><br><span>diff --git a/main/translate.c b/main/translate.c</span><br><span>index 27e73f6..e11575f 100644</span><br><span>--- a/main/translate.c</span><br><span>+++ b/main/translate.c</span><br><span>@@ -1381,6 +1381,28 @@</span><br><span>         (rate1 > rate2 ? rate1 - rate2 : rate2 - rate1); \</span><br><span> })</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! \brief Determine which protocol is higher quality */</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_translator_better_quality(int c1, int c2) {</span><br><span style="color: hsl(120, 100%, 40%);">+        /* is c1 is strictly superior to c2? */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (c1 == ast_format_get_codec_id(ast_format_g722)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         return (</span><br><span style="color: hsl(120, 100%, 40%);">+                      (c2 == ast_format_get_codec_id(ast_format_gsm)) ||</span><br><span style="color: hsl(120, 100%, 40%);">+                    (c2 == ast_format_get_codec_id(ast_format_g729)) ||</span><br><span style="color: hsl(120, 100%, 40%);">+                   (c2 == ast_format_get_codec_id(ast_format_ulaw)) ||</span><br><span style="color: hsl(120, 100%, 40%);">+                   (c2 == ast_format_get_codec_id(ast_format_alaw)) ||</span><br><span style="color: hsl(120, 100%, 40%);">+                   (c2 == ast_format_get_codec_id(ast_format_g723))</span><br><span style="color: hsl(120, 100%, 40%);">+                      );</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (c1 == ast_format_get_codec_id(ast_format_ulaw)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         return (</span><br><span style="color: hsl(120, 100%, 40%);">+                      (c2 == ast_format_get_codec_id(ast_format_gsm)) ||</span><br><span style="color: hsl(120, 100%, 40%);">+                    (c2 == ast_format_get_codec_id(ast_format_g729)) ||</span><br><span style="color: hsl(120, 100%, 40%);">+                   (c2 == ast_format_get_codec_id(ast_format_g723))</span><br><span style="color: hsl(120, 100%, 40%);">+                      );</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! \brief Calculate our best translator source format, given costs, and a desired destination */</span><br><span> int ast_translator_best_choice(struct ast_format_cap *dst_cap,</span><br><span>        struct ast_format_cap *src_cap,</span><br><span>@@ -1474,6 +1496,15 @@</span><br><span>                                     ao2_replace(bestdst, dst);</span><br><span>                                   besttablecost = matrix_get(x, y)->table_cost;</span><br><span>                                     beststeps = matrix_get(x, y)->multistep;</span><br><span style="color: hsl(120, 100%, 40%);">+                           } else if (gap_current == gap_selected) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     if (ast_translator_better_quality(</span><br><span style="color: hsl(120, 100%, 40%);">+                                            ast_format_get_codec_id(src), ast_format_get_codec_id(best))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                               /* as good as what we had before and better */</span><br><span style="color: hsl(120, 100%, 40%);">+                                                ao2_replace(best, src);</span><br><span style="color: hsl(120, 100%, 40%);">+                                               ao2_replace(bestdst, dst);</span><br><span style="color: hsl(120, 100%, 40%);">+                                            besttablecost = matrix_get(x, y)->table_cost;</span><br><span style="color: hsl(120, 100%, 40%);">+                                              beststeps = matrix_get(x, y)->multistep;</span><br><span style="color: hsl(120, 100%, 40%);">+                                   }</span><br><span>                            }</span><br><span>                    }</span><br><span>            }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/15953">change 15953</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/15953"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I4b7297e1baca7aac14fe4a3c7538e18e2dbe9fd6 </div>
<div style="display:none"> Gerrit-Change-Number: 15953 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: N A <mail@interlinked.x10host.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>