David Feurle wrote:> Thanks for your reply Jean-Marc! > > this was what I had before. > But I decided to restructure it since the thread that plays the sound is > a callback from the sound hardware, more or less an interrupt handler. > For me it seems more reasonable to waste some memory for to save the > decompressed Packet. While I write this I begin to think that it is > possible I decompress Packets that are never used because they are too > late. What is the reason why one should put the compressed Packet in the > JitterBuffer?Because otherwise, you end up decoding the packets in random order -- not very useful with a stateful codec! Jean-Marc> David >> (Sorry about the delay -- currently attending ICASSP) >> Hi, >> >> Haven't looked at all the details, but what's clearly wrong is that you >> need to put the *compressed* packets in the jitter buffer and decode >> them only when you _get() them. >> >> Jean-Marc >> >> David Feurle wrote: >> >>> Hi, >>> >>> I am using the JitterBuffer. Since there is not so much documentation I >>> think I dont use it in a correct way. All the packets are recieved (I >>> control the sequence numbers) but the JitterBuffer often tells me he has >>> no packet. I am using it in the following way: >>> >>> I am not sure if I use the ticks correctly but I think it can be set to >>> 20(msec). >>> It is set as a Member in my class and i pointed out where i use it so it >>> is clear if i use it somewhere i better shouldnt. >>> >>> - I initialize the JitterBuffer with ticks = 20 (saved in the variable >>> m_Ticks) >>> - My network thread repeadedly (every 20msec) calls AddPacket() which >>> adds the packet to the buffer >>> 320 bytes of audio data are set as the data >>> the timestamp is set to the sequence number of the packet times >>> 20 (m_Ticks) >>> the span of the packet is set to 20 (the packet covers one tick >>> entirely) >>> - A thread which plays my Audio calls every 20msec the function >>> GetSound() >>> >>> As I said before the buffer just returns more or less the halve of the >>> packets. But all the packets are added to the JitterBuffer. >>> I posted some of the code i use in my email and i would be really >>> thankfull if anybody could tell me where i am using the JitterBuffer >>> wrong. >>> >>> Many thanks in advance >>> >>> David Feurle >>> >>> >>> >>> Init() >>> { >>> m_JitterBuffer = jitter_buffer_init(m_Ticks); >>> jitter_buffer_reset(m_JitterBuffer); >>> } >>> >>> Exit() >>> { >>> jitter_buffer_destroy(m_JitterBuffer); >>> } >>> >>> void BeatJitterBuffer::AddPacket(Packet* packet) >>> { >>> m_Mutex.Aquire(); >>> char buff[320]; >>> JitterBufferPacket p; >>> m_Decoder->DecompressPacket(packet, buff, 320); >>> p.data = buff; >>> p.len = 320; >>> p.timestamp = packet->SequenceNumber() * m_Ticks; >>> p.span = m_Ticks; >>> jitter_buffer_put(m_JitterBuffer, &p); >>> } >>> >>> m_Mutex.Release(); >>> delete packet; >>> } >>> >>> void BeatJitterBuffer::GetSound(char* buffer, size_t maxLength) >>> { >>> int ret; >>> >>> if (320 == maxLength) >>> { >>> JitterBufferPacket packet; >>> packet.data = buffer; >>> >>> m_Mutex.Aquire(); >>> >>> ret = jitter_buffer_get(m_JitterBuffer, &packet, 0); >>> >>> if(ret != JITTER_BUFFER_OK) >>> { >>> ZeroMemory(packet.data, maxLength); >>> } >>> >>> jitter_buffer_tick(m_JitterBuffer); >>> jitter_buffer_update_delay(m_JitterBuffer, &packet, NULL); >>> m_Mutex.Release(); >>> } >>> else >>> { >>> ZeroMemory(buffer, maxLength); >>> } >>> } >>> >>> _______________________________________________ >>> Speex-dev mailing list >>> Speex-dev@xiph.org >>> http://lists.xiph.org/mailman/listinfo/speex-dev >>> >>> > >
Uff ok - thanks for pointing that out! David> David Feurle wrote: > >> Thanks for your reply Jean-Marc! >> >> this was what I had before. >> But I decided to restructure it since the thread that plays the sound is >> a callback from the sound hardware, more or less an interrupt handler. >> For me it seems more reasonable to waste some memory for to save the >> decompressed Packet. While I write this I begin to think that it is >> possible I decompress Packets that are never used because they are too >> late. What is the reason why one should put the compressed Packet in the >> JitterBuffer? >> > > Because otherwise, you end up decoding the packets in random order -- > not very useful with a stateful codec! > > Jean-Marc > > >> David >> >>> (Sorry about the delay -- currently attending ICASSP) >>> Hi, >>> >>> Haven't looked at all the details, but what's clearly wrong is that you >>> need to put the *compressed* packets in the jitter buffer and decode >>> them only when you _get() them. >>> >>> Jean-Marc >>> >>> David Feurle wrote: >>> >>> >>>> Hi, >>>> >>>> I am using the JitterBuffer. Since there is not so much documentation I >>>> think I dont use it in a correct way. All the packets are recieved (I >>>> control the sequence numbers) but the JitterBuffer often tells me he has >>>> no packet. I am using it in the following way: >>>> >>>> I am not sure if I use the ticks correctly but I think it can be set to >>>> 20(msec). >>>> It is set as a Member in my class and i pointed out where i use it so it >>>> is clear if i use it somewhere i better shouldnt. >>>> >>>> - I initialize the JitterBuffer with ticks = 20 (saved in the variable >>>> m_Ticks) >>>> - My network thread repeadedly (every 20msec) calls AddPacket() which >>>> adds the packet to the buffer >>>> 320 bytes of audio data are set as the data >>>> the timestamp is set to the sequence number of the packet times >>>> 20 (m_Ticks) >>>> the span of the packet is set to 20 (the packet covers one tick >>>> entirely) >>>> - A thread which plays my Audio calls every 20msec the function >>>> GetSound() >>>> >>>> As I said before the buffer just returns more or less the halve of the >>>> packets. But all the packets are added to the JitterBuffer. >>>> I posted some of the code i use in my email and i would be really >>>> thankfull if anybody could tell me where i am using the JitterBuffer >>>> wrong. >>>> >>>> Many thanks in advance >>>> >>>> David Feurle >>>> >>>> >>>> >>>> Init() >>>> { >>>> m_JitterBuffer = jitter_buffer_init(m_Ticks); >>>> jitter_buffer_reset(m_JitterBuffer); >>>> } >>>> >>>> Exit() >>>> { >>>> jitter_buffer_destroy(m_JitterBuffer); >>>> } >>>> >>>> void BeatJitterBuffer::AddPacket(Packet* packet) >>>> { >>>> m_Mutex.Aquire(); >>>> char buff[320]; >>>> JitterBufferPacket p; >>>> m_Decoder->DecompressPacket(packet, buff, 320); >>>> p.data = buff; >>>> p.len = 320; >>>> p.timestamp = packet->SequenceNumber() * m_Ticks; >>>> p.span = m_Ticks; >>>> jitter_buffer_put(m_JitterBuffer, &p); >>>> } >>>> >>>> m_Mutex.Release(); >>>> delete packet; >>>> } >>>> >>>> void BeatJitterBuffer::GetSound(char* buffer, size_t maxLength) >>>> { >>>> int ret; >>>> >>>> if (320 == maxLength) >>>> { >>>> JitterBufferPacket packet; >>>> packet.data = buffer; >>>> >>>> m_Mutex.Aquire(); >>>> >>>> ret = jitter_buffer_get(m_JitterBuffer, &packet, 0); >>>> >>>> if(ret != JITTER_BUFFER_OK) >>>> { >>>> ZeroMemory(packet.data, maxLength); >>>> } >>>> >>>> jitter_buffer_tick(m_JitterBuffer); >>>> jitter_buffer_update_delay(m_JitterBuffer, &packet, NULL); >>>> m_Mutex.Release(); >>>> } >>>> else >>>> { >>>> ZeroMemory(buffer, maxLength); >>>> } >>>> } >>>> >>>> _______________________________________________ >>>> Speex-dev mailing list >>>> Speex-dev@xiph.org >>>> http://lists.xiph.org/mailman/listinfo/speex-dev >>>> >>>> >>>> >>
Thanks for your reply Jean-Marc!
this was what I had before.
But I decided to restructure it since the thread that plays the sound is
a callback from the sound hardware, more or less an interrupt handler.
For me it seems more reasonable to waste some memory for to save the
decompressed Packet. While I write this I begin to think that it is
possible I decompress Packets that are never used because they are too
late. What is the reason why one should put the compressed Packet in the
JitterBuffer?
David> (Sorry about the delay -- currently attending ICASSP)
> Hi,
>
> Haven't looked at all the details, but what's clearly wrong is that
you
> need to put the *compressed* packets in the jitter buffer and decode
> them only when you _get() them.
>
> Jean-Marc
>
> David Feurle wrote:
>
>> Hi,
>>
>> I am using the JitterBuffer. Since there is not so much documentation I
>> think I dont use it in a correct way. All the packets are recieved (I
>> control the sequence numbers) but the JitterBuffer often tells me he
has
>> no packet. I am using it in the following way:
>>
>> I am not sure if I use the ticks correctly but I think it can be set to
>> 20(msec).
>> It is set as a Member in my class and i pointed out where i use it so
it
>> is clear if i use it somewhere i better shouldnt.
>>
>> - I initialize the JitterBuffer with ticks = 20 (saved in the variable
>> m_Ticks)
>> - My network thread repeadedly (every 20msec) calls AddPacket() which
>> adds the packet to the buffer
>> 320 bytes of audio data are set as the data
>> the timestamp is set to the sequence number of the packet
times
>> 20 (m_Ticks)
>> the span of the packet is set to 20 (the packet covers one
tick
>> entirely)
>> - A thread which plays my Audio calls every 20msec the function
GetSound()
>>
>> As I said before the buffer just returns more or less the halve of the
>> packets. But all the packets are added to the JitterBuffer.
>> I posted some of the code i use in my email and i would be really
>> thankfull if anybody could tell me where i am using the JitterBuffer
wrong.
>>
>> Many thanks in advance
>>
>> David Feurle
>>
>>
>>
>> Init()
>> {
>> m_JitterBuffer = jitter_buffer_init(m_Ticks);
>> jitter_buffer_reset(m_JitterBuffer);
>> }
>>
>> Exit()
>> {
>> jitter_buffer_destroy(m_JitterBuffer);
>> }
>>
>> void BeatJitterBuffer::AddPacket(Packet* packet)
>> {
>> m_Mutex.Aquire();
>> char buff[320];
>> JitterBufferPacket p;
>> m_Decoder->DecompressPacket(packet, buff, 320);
>> p.data = buff;
>> p.len = 320;
>> p.timestamp = packet->SequenceNumber() * m_Ticks;
>> p.span = m_Ticks;
>> jitter_buffer_put(m_JitterBuffer, &p);
>> }
>>
>> m_Mutex.Release();
>> delete packet;
>> }
>>
>> void BeatJitterBuffer::GetSound(char* buffer, size_t maxLength)
>> {
>> int ret;
>>
>> if (320 == maxLength)
>> {
>> JitterBufferPacket packet;
>> packet.data = buffer;
>>
>> m_Mutex.Aquire();
>>
>> ret = jitter_buffer_get(m_JitterBuffer, &packet, 0);
>>
>> if(ret != JITTER_BUFFER_OK)
>> {
>> ZeroMemory(packet.data, maxLength);
>> }
>>
>> jitter_buffer_tick(m_JitterBuffer);
>> jitter_buffer_update_delay(m_JitterBuffer, &packet, NULL);
>> m_Mutex.Release();
>> }
>> else
>> {
>> ZeroMemory(buffer, maxLength);
>> }
>> }
>>
>> _______________________________________________
>> Speex-dev mailing list
>> Speex-dev@xiph.org
>> http://lists.xiph.org/mailman/listinfo/speex-dev
>>
>>