Re: speex with jitter buffer

nomprenom <[email protected]> Sun, 24 Jan 2021 16:59:43 +0200
Newsgroups gmane.comp.audio.compression.speex.devel
Message-ID <CABb1zCM3rqA9uP5rT+tEy1tk4LaNfSTMxgY36-pqEfY26af2=A@mail.gmail.com>
--===============3299623008564895626==
Content-Type: multipart/alternative; boundary="0000000000009b131405b9a6ac70"

--0000000000009b131405b9a6ac70
Content-Type: text/plain; charset="UTF-8"

Hi,
I can't understand how to implement my encoder/decoder with the jitter
buffer. I hope someone can help me:
I have 2 threads.
Because I don't have yet the full environment (with the devices etc..),
- I'm reading from thread1,
- sending to the main thread,
- write to a jitter buff,
- from th2 : read from the jitter and play the data.
(Tomorrow, this is a device which will send the main thread the speex data
via RF - that's why I need to handle a jitter).

thread 1:
1) read 640 bytes from pcm (=40ms) (my settings are 8khz/16bits le)
2) encode to 40 bytes of speex
3) send to main thread 40 bytes of speex

main thread:
1) speex_jitter_put(20 first bytes of speex, counter * 640) // timestamp =
0, 640, 1280, etc..
2) speex_jitter_put(20 last bytes of speex, 320 + counter * 640) //
timestamp = 320, 960, 1600, etc..

thread 2:
1) speex_jitter_get(buffer, NULL)
2)  speex_jitter_get(buffer + 320, timestamp=320)
3) pcm_write(buffer, 640)

Actually I can't hear anything. I tried many things without success. It's
the most "stable" flow I found without seeing many warnings from the api
(underrun, negative buffer, etc..)
- in the main thread, I think speex_jitter_put always puts 20 ms, right ?
(I initialized the buffer with an audio sampling rate of 8khz)
- in the main thread, I don't know if it's ok to put directly 40ms of speex
or if I need to put 2 * 20ms with a different timestamp for the 2nd
- I don't know too well what the timestamp parameter is : is it a timestamp
in ms ? I use now, after searching on the net, "pcm units" (320 = 20 ms/
640 = 40ms)
- in thread 2, I can't pcm_write 320 only else I see many "underrun"
errors. I thought, at the beginning, to simply read from the jitter and
play (320) and to do this 2 times.

Any help will be appreciated.

Thanks.




On Mon, 18 Jan 2021 at 21:30, nomprenom <[email protected]> wrote:

> Thank you Tristan for your answer.
>
> For now I took jitter.c and .h from dsp and added them to the makefile of
> speex.
> I also added speex_jitter_buffer.c and h from the sample into the lib.
>
>
>
> On Mon, 18 Jan 2021 at 20:30, Tristan Matthews <[email protected]>
> wrote:
>
>> Hi,
>>
>> On Mon, Jan 18, 2021 at 12:29 PM nomprenom <[email protected]> wrote:
>> >
>> > Hi,
>> > I'd like to use the speex encode/decoder library with the speex jitter
>> buffer.
>> > I took, first, the project "speex" from
>> https://gitlab.xiph.org/xiph/speex
>> > There is a nice sample in the directory speex_client/ which is using
>> speex_jitter_buffer.h which itself is using <speex/speex_jitter.h>
>> > I couldn't find this include file in the project.
>> >
>> > I checked in the project speexDSP and found it.
>> > I thought, maybe, speexDsp is the new "speex" because it's deprecated.
>> >
>> > The problem is, now, with speexDsp I can't find the "speex.h" header
>> and can't find either the speex_decode_init(), speex_decoder_ctl() APIs.
>> > It's only in the sampledec.c in the doc/ directory of speexdsp
>> >
>> > How can I use the speex decoder/encoder with the speex_jitter api
>> together ?
>>
>> The Speex project has been split in 2, speex "the codec" (where you'll
>> find the decode_init and decoder_ctl API) and speexdsp "the DSP
>> library" where you'll find the jitter buffer API. The motivation was
>> that users want to be able to use purely the codec without the DSP
>> stuff and vice-versa.
>>
>> N.B. The most active/used project in speexdsp is the resampler, you
>> may find jitterbuffer implementations elsewhere that are a better fit
>> for your project.
>>
>> See:
>> https://gitlab.xiph.org/xiph/speex
>> https://gitlab.xiph.org/xiph/speexdsp
>>
>> Best,
>> Tristan
>>
>

--0000000000009b131405b9a6ac70
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">Hi,<div>I can&#39;t understand how to implement my encoder=
/decoder with the jitter buffer. I hope someone can help me:</div><div>I ha=
ve 2 threads.=C2=A0</div><div>Because I=C2=A0don&#39;t have yet the full en=
vironment (with the devices etc..),</div><div>- I&#39;m reading from thread=
1,=C2=A0</div><div>- sending to the main thread,=C2=A0</div><div>- write to=
 a jitter buff,=C2=A0</div><div>- from th2 : read from the jitter and play =
the data.</div><div>(Tomorrow, this is a device which will send the main th=
read the speex data via RF - that&#39;s why I need to handle a jitter).</di=
v><div><br></div><div>thread 1:</div><div>1) read 640 bytes from pcm (=3D40=
ms) (my settings are 8khz/16bits le)</div><div>2) encode to 40 bytes of spe=
ex</div><div>3) send to main thread 40 bytes of speex</div><div><br></div><=
div>main thread:</div><div>1) speex_jitter_put(20 first bytes of speex, cou=
nter * 640) // timestamp =3D 0, 640, 1280, etc..</div><div>2) speex_jitter_=
put(20 last bytes of speex, 320 + counter * 640) // timestamp =3D 320, 960,=
 1600, etc..</div><div><br></div><div>thread 2:</div><div>1)=C2=A0speex_jit=
ter_get(buffer, NULL)</div><div>2)=C2=A0

speex_jitter_get(buffer + 320, timestamp=3D320)

</div><div>3) pcm_write(buffer, 640)</div><div><br></div><div>Actually=C2=
=A0I can&#39;t hear anything. I tried many things without success. It&#39;s=
 the most &quot;stable&quot; flow I found without seeing many warnings from=
 the api (underrun, negative buffer, etc..)</div><div>- in the main thread,=
 I think speex_jitter_put always=C2=A0puts 20 ms, right ? (I initialized th=
e buffer=C2=A0with an audio sampling rate of 8khz)</div><div>- in the main =
thread, I don&#39;t know if it&#39;s ok to put directly 40ms of speex or if=
 I need to put 2 * 20ms with a different timestamp for the 2nd</div><div>- =
I don&#39;t know too well what the timestamp parameter is : is it a timesta=
mp in ms ? I use now, after searching on the net, &quot;pcm units&quot; (32=
0 =3D 20 ms/ 640 =3D 40ms)=C2=A0</div><div>- in thread 2, I can&#39;t pcm_w=
rite 320 only else I see many &quot;underrun&quot; errors. I thought, at th=
e beginning, to simply read from the jitter and play (320) and to do this 2=
 times.</div><div><br></div><div>Any help will be appreciated.</div><div><b=
r></div><div>Thanks.</div><div><br></div><div><br></div><div><br></div></di=
v><br><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">On M=
on, 18 Jan 2021 at 21:30, nomprenom &lt;<a href=3D"mailto:[email protected]=
om">[email protected]</a>&gt; wrote:<br></div><blockquote class=3D"gmail_=
quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,=
204);padding-left:1ex"><div dir=3D"ltr">Thank you=C2=A0Tristan for your ans=
wer.<div><br><div>For now I took jitter.c and .h from dsp and added them to=
 the makefile of speex.</div><div>I also added speex_jitter_buffer.c and h =
from the sample into the lib.<br></div><div><br></div><div><br></div></div>=
</div><br><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">=
On Mon, 18 Jan 2021 at 20:30, Tristan Matthews &lt;<a href=3D"mailto:tmatth=
@videolan.org" target=3D"_blank">[email protected]</a>&gt; wrote:<br></di=
v><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;borde=
r-left:1px solid rgb(204,204,204);padding-left:1ex">Hi,<br>
<br>
On Mon, Jan 18, 2021 at 12:29 PM nomprenom &lt;<a href=3D"mailto:nomprenom@=
gmail.com" target=3D"_blank">[email protected]</a>&gt; wrote:<br>
&gt;<br>
&gt; Hi,<br>
&gt; I&#39;d like to use the speex encode/decoder library with the speex ji=
tter buffer.<br>
&gt; I took, first, the project &quot;speex&quot; from <a href=3D"https://g=
itlab.xiph.org/xiph/speex" rel=3D"noreferrer" target=3D"_blank">https://git=
lab.xiph.org/xiph/speex</a><br>
&gt; There is a nice sample in the directory speex_client/ which is using s=
peex_jitter_buffer.h which itself is using &lt;speex/speex_jitter.h&gt;<br>
&gt; I couldn&#39;t find this include file in the project.<br>
&gt;<br>
&gt; I checked in the project speexDSP and found it.<br>
&gt; I thought, maybe, speexDsp is the new &quot;speex&quot; because it&#39=
;s deprecated.<br>
&gt;<br>
&gt; The problem is, now, with speexDsp I can&#39;t find the &quot;speex.h&=
quot; header and can&#39;t find either the speex_decode_init(), speex_decod=
er_ctl() APIs.<br>
&gt; It&#39;s only in the sampledec.c in the doc/ directory of speexdsp<br>
&gt;<br>
&gt; How can I use the speex decoder/encoder with the speex_jitter api toge=
ther ?<br>
<br>
The Speex project has been split in 2, speex &quot;the codec&quot; (where y=
ou&#39;ll<br>
find the decode_init and decoder_ctl API) and speexdsp &quot;the DSP<br>
library&quot; where you&#39;ll find the jitter buffer API. The motivation w=
as<br>
that users want to be able to use purely the codec without the DSP<br>
stuff and vice-versa.<br>
<br>
N.B. The most active/used project in speexdsp is the resampler, you<br>
may find jitterbuffer implementations elsewhere that are a better fit<br>
for your project.<br>
<br>
See:<br>
<a href=3D"https://gitlab.xiph.org/xiph/speex" rel=3D"noreferrer" target=3D=
"_blank">https://gitlab.xiph.org/xiph/speex</a><br>
<a href=3D"https://gitlab.xiph.org/xiph/speexdsp" rel=3D"noreferrer" target=
=3D"_blank">https://gitlab.xiph.org/xiph/speexdsp</a><br>
<br>
Best,<br>
Tristan<br>
</blockquote></div>
</blockquote></div>

--0000000000009b131405b9a6ac70--

--===============3299623008564895626==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: inline

X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KU3BlZXgtZGV2
IG1haWxpbmcgbGlzdApTcGVleC1kZXZAeGlwaC5vcmcKaHR0cDovL2xpc3RzLnhpcGgub3JnL21h
aWxtYW4vbGlzdGluZm8vc3BlZXgtZGV2Cg==

--===============3299623008564895626==--