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'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't have yet the full en= vironment (with the devices etc..),</div><div>- I'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'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'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..)</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'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</div><div>- = I don't know too well what the timestamp parameter is : is it a timesta= mp in ms ? I use now, after searching on the net, "pcm units" (32= 0 =3D 20 ms/ 640 =3D 40ms)=C2=A0</div><div>- in thread 2, I can't pcm_w= rite 320 only else I see many "underrun" 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 <<a href=3D"mailto:[email protected]= om">[email protected]</a>> 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 <<a href=3D"mailto:tmatth= @videolan.org" target=3D"_blank">[email protected]</a>> 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 <<a href=3D"mailto:nomprenom@= gmail.com" target=3D"_blank">[email protected]</a>> wrote:<br> ><br> > Hi,<br> > I'd like to use the speex encode/decoder library with the speex ji= tter buffer.<br> > I took, first, the project "speex" 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> > There is a nice sample in the directory speex_client/ which is using s= peex_jitter_buffer.h which itself is using <speex/speex_jitter.h><br> > I couldn't find this include file in the project.<br> ><br> > I checked in the project speexDSP and found it.<br> > I thought, maybe, speexDsp is the new "speex" because it'= ;s deprecated.<br> ><br> > The problem is, now, with speexDsp I can't find the "speex.h&= quot; header and can't find either the speex_decode_init(), speex_decod= er_ctl() APIs.<br> > It's only in the sampledec.c in the doc/ directory of speexdsp<br> ><br> > 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 "the codec" (where y= ou'll<br> find the decode_init and decoder_ctl API) and speexdsp "the DSP<br> library" where you'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==--