<div>----draft text:</div>
<div><br>&quot; The encoding and decoding algorithm can change the bit rate at any 20<br>&nbsp; msec frame boundary, with the bit rate change notification provided<br>&nbsp; in-band with the bit stream. &nbsp;Each frame contains both &quot;mode&quot;
<br>&nbsp; (narrowband, wideband or ultra-wideband) and &quot;sub-mode&quot; (bit-rate)<br>&nbsp; information in the bit stream. &nbsp;No out-of-band notification is<br>&nbsp; required for the decoder to process changes in the bit rate sent by
<br>&nbsp; the encoder.&quot;</div>
<div>&nbsp;</div>
<div>-----Comment:</div>
<div>&nbsp;</div>
<div>Why not set fields in the payload to indicating mode/sub-mode?</div>
<div>&nbsp;</div>
<div>In the current design, the decoder need to decode the frame to know its mode/sub-mode. </div>
<div>That need time and not acceptable for real time system. Thus, it&#39;s not&nbsp;impossible for the decoder to know the mode/sub-mode which can change at any frame boundary.</div>
<div><br>&nbsp;</div>
<div><span class="gmail_quote">On 5/17/07, <b class="gmail_sendername">Aymeric Moizard</b> &lt;<a href="mailto:jack@atosc.org">jack@atosc.org</a>&gt; wrote:</span>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"><br><br>On Thu, 17 May 2007, Jean-Marc Valin wrote:<br><br>&gt;&gt;&gt; Consider a device that only has enough ROM to store one set of
<br>&gt;&gt;&gt; quantization tables (the limitation could also be about speed, network,<br>&gt;&gt;&gt; ...). If you specify MUST be able to decode, then it means that this<br>&gt;&gt;&gt; device simply *cannot* implement the spec *at all*. This is bad for
<br>&gt;&gt;&gt; interoperability.<br>&gt;&gt;<br>&gt;&gt; For me: device which don&#39;t have all mode implemented are already banned:<br>&gt;&gt; the SDP offer/answer model is based on codec and parameter *proposal*:<br>
&gt;&gt; still the sender is *allowed* to not send the given mode. That said, UA<br>&gt;&gt; that don&#39;t support all modes are already not capable of<br>&gt;&gt; interoperability: they will receive sometimes modes that they do not
<br>&gt;&gt; proposed and do not support.<br>&gt;</blockquote>
<div>&nbsp;</div>
<div>&nbsp;</div><br>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">&gt; The same reasoning could apply to other codecs as well: if a client<br>&gt; doesn&#39;t support G.729
, you can&#39;t say it&#39;s broken if someone unexpectedly<br>&gt; start sending that. Of course, in the case of Speex, we try and do our<br>&gt; best...<br><br>I&#39;m not talking about codec proposal: you cannot send G729 to a UA that
<br>didn&#39;t offered it. While you can send packetisation interval of 30ms even<br>if the UA offered that he wish to receive 20ms.<br><br>I think anyway, that adding &quot;mode=any&quot; is fixing the mode issue, so it&#39;s
<br>now possible to specify that you don&#39;t support some of the modes.<br><br>&gt;&gt; One possible way would be to use &quot;mode=any&quot; to clearly indicate that the<br>&gt;&gt; UA support any modes. The prefered mode could be specified by order of
<br>&gt;&gt; preference: &quot;mode=5;mode=any&quot;. Other &quot;limited device&quot; would announce all<br>&gt;&gt; modes supported: &quot;mode=5;mode=3;mode=1&quot;<br>&gt;<br>&gt; Yes, I agree with that.<br>&gt;<br>&gt;&gt; Samples for SDP negotiation must clearly indicates this behaviour:
<br>&gt;&gt;<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;m=audio 8088 RTP/AVP 97<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;a=rtpmap:97 speex/8000<br>&gt;&gt;<br>&gt;&gt;&nbsp;&nbsp; -&gt; equivalent to &quot;mode=any&quot;&nbsp;&nbsp; (for smooth evolution of current<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;implementations)
<br>&gt;<br>&gt; Shouldn&#39;t clients have at least a preferred mode? Otherwise, if everyone<br>&gt; says &quot;any&quot;, which bit-rate do you choose?<br><br>But I gave you example in previous mail! Clients that support any mode and
<br>prefer &quot;mode=4&quot; would say:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mode=4:mode=any<br><br>&gt; &lt;ship&gt;<br>&gt;<br>&gt;&gt; The above would make sense and compliant application would<br>&gt;&gt; be interoperable? right?<br>&gt;<br>
&gt; I think so.<br>&gt;<br>&gt;&gt; That would be perfect for me, and I guess would be fine for you?<br>&gt;<br>&gt; Yes, I think it&#39;s the best compromise -- and actually not very far from<br>&gt; what we have now. I would still keep the thing that says 8 kbps SHOULD
<br>&gt; be supported. Or maybe we can say &quot;all modes SHOULD be supported and if<br>&gt; it&#39;s not possible, then at least 8 kbps (mode 3) SHOULD be supported&quot;.<br><br>I think this is close to be equivalent anyway.
<br><br>&gt;&gt;&gt;&gt; The other way would be to make it transparent like g279.<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; Not sure what kind of transparence you mean? The Speex decoder (unless<br>&gt;&gt;&gt; you remove some tables) is able to decode anything without even knowing
<br>&gt;&gt;&gt; how it was encoded.<br>&gt;&gt;<br>&gt;&gt; Except for limited device which are not capable of decoding the &quot;mode&quot;<br>&gt;&gt; that were removed from code ;)<br>&gt;&gt;<br>&gt;&gt; If I understood well the speex stuff: a decoder without wideband
<br>&gt;&gt; implementation would be capable of locating the narrowband part<br>&gt;&gt; of the speex bitstream and return at least narrowband in audio? right?<br>&gt;<br>&gt; Actually, if you give wideband data to a narrowband decoder, it will
<br>&gt; decode it as narrowband without even *realising* it&#39;s wideband (the<br>&gt; wideband bits are transparently ignored).<br>&gt;<br>&gt;&gt; Is this possible? (I guess it&#39;s not that complex):<br>&gt;&gt; ---&gt;wideband data --&gt; NARROW BAND DECODER --&gt; narrow band decoded audio!
<br>&gt;<br>&gt; yes, that&#39;s possible.<br>&gt;<br>&gt;&gt; This does not seems possible:<br>&gt;&gt; ---&gt;mode=4 nband data --&gt; LIMITED DEVICE&nbsp;&nbsp;&nbsp;&nbsp;---&gt; correct nband data<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WITH MODE=3 ONLY
<br>&gt;<br>&gt; That&#39;s not possible.<br>&gt;<br>&gt;&gt;&gt; If all you mean is &quot;do your best to decode anything you get no matter<br>&gt;&gt;&gt; how different it is from what you asked for&quot;, then I agree.
<br>&gt;&gt;<br>&gt;&gt; This has to be at least of recommendation so people are aware that speex<br>&gt;&gt; implementation allow this behavior: it was unclear to people that they<br>&gt;&gt; don&#39;t need to set option before starting decode process. Because they
<br>&gt;&gt; get a lot of decode failure before, I think speex users are more prepared<br>&gt;&gt; now. Anyway, it&#39;s good to inform people.<br>&gt;<br>&gt; What do you mean by &quot;they get a lot of decode failure&quot;?
<br><br>Just that implementation was full of bugs.<br><br>&gt;&gt; Sometimes, draft are providing some C code: I would love to see some kind<br>&gt;&gt; of annex with a sample routine to decode speex data.<br>&gt;&gt;<br>
&gt;&gt; Something like: static void dec_process(MSFilter *f)<br>&gt;&gt; <a href="http://cvs.savannah.nongnu.org/viewvc/linphone/mediastreamer2/src/msspeex.c?root=linphone&amp;view=markup">http://cvs.savannah.nongnu.org/viewvc/linphone/mediastreamer2/src/msspeex.c?root=linphone&amp;view=markup
</a><br>&gt;&gt;<br>&gt;&gt; I&#39;m not sure of my implementation (mainly I have a strange behavior of<br>&gt;&gt; &quot;speex_bits_remaining&quot;...)<br>&gt;<br>&gt; I&#39;m not really sure I understand your code, but it looks much more
<br>&gt; complicated than it should be. Normally, the decode code should look like:<br>&gt;<br>&gt; speex_bits_init(&amp;bits);<br>&gt; speex_bits_read_from(&amp;bits, packet, length);<br>&gt; while (1)<br>&gt; {<br>&gt;&nbsp;&nbsp; err = speex_decode_int(state, bits, out_buffer);
<br>&gt;&nbsp;&nbsp; if (err != 0)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&gt;&nbsp;&nbsp; play_audio(out_buffer);<br>&gt; }<br>&gt; if (err == -2)<br>&gt;&nbsp;&nbsp; ms_warning(&quot;there was an error decoding&quot;);<br>&gt;<br>&gt;<br>&gt; I see from your code that you use speex_bits_remaining(&amp;bits) but I
<br>&gt; can&#39;t really understand why. Could you explain?<br><br>I don&#39;t know......<br><br>I think that when I implemented this, that helped me to get out the loop.<br>It seems that in your code you call &quot;speex_decode_int&quot; one more time
<br>than me: I tried to call it only when &quot;speex_decode_int&quot; will succeed<br>because I though it was bad to call it when there was no data any more.<br>It seems I was wrong... Anyway: it&#39;s working fine...<br>
<br>Would you mind if I rewrite the draft myself with the idea we discussed?<br>Do you have the xml version?<br><br>tks<br>Aymeric<br><br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Jean-Marc<br>&gt;<br>&gt;<br><br>_______________________________________________
<br>Speex-dev mailing list<br><a href="mailto:Speex-dev@xiph.org">Speex-dev@xiph.org</a><br><a href="http://lists.xiph.org/mailman/listinfo/speex-dev">http://lists.xiph.org/mailman/listinfo/speex-dev</a><br></blockquote></div>
<br>