[vlc-devel] [PATCH 10/12] dash: fixed buffer precision bug
Hugo Beauzée-Luyssen
beauze.h at gmail.com
Tue Mar 13 16:42:09 CET 2012
On Tue, Mar 13, 2012 at 3:18 PM, <Christopher at mailsrv.uni-klu.ac.at> wrote:
> From: Christopher Mueller <christopher.mueller at itec.aau.at>
>
> ---
> modules/stream_filter/dash/buffer/BlockBuffer.cpp | 42 +++-----------------
> modules/stream_filter/dash/buffer/BlockBuffer.h | 2 +-
> 2 files changed, 8 insertions(+), 36 deletions(-)
>
> diff --git a/modules/stream_filter/dash/buffer/BlockBuffer.cpp b/modules/stream_filter/dash/buffer/BlockBuffer.cpp
> index 056c481..c05056d 100644
> --- a/modules/stream_filter/dash/buffer/BlockBuffer.cpp
> +++ b/modules/stream_filter/dash/buffer/BlockBuffer.cpp
> @@ -101,14 +101,14 @@ int BlockBuffer::get (void *p_data, unsigned int len)
>
> int ret = len > this->sizeBytes ? this->sizeBytes : len;
>
> - this->reduceBufferMilliSec(ret);
> -
> if(p_data == NULL)
> block_SkipBytes(&this->buffer, ret);
> else
> block_GetBytes(&this->buffer, (uint8_t *)p_data, ret);
>
> block_BytestreamFlush(&this->buffer);
> + this->updateBufferSize(ret);
> +
> this->notify();
>
> vlc_cond_signal(&this->empty);
> @@ -162,47 +162,19 @@ void BlockBuffer::notify ()
> for(size_t i = 0; i < this->bufferObservers.size(); i++)
> this->bufferObservers.at(i)->bufferLevelChanged(this->sizeMicroSec, ((float)this->sizeMicroSec / this->capacityMicroSec) * 100);
> }
> -void BlockBuffer::reduceBufferMilliSec (size_t bytes)
> +void BlockBuffer::updateBufferSize (size_t bytes)
> {
> - size_t pos = 0;
> - float microsec = 0;
> -
> block_t *block = this->buffer.p_block;
>
> - if(bytes < (block->i_buffer - this->buffer.i_offset))
> - {
> - pos = bytes;
> - microsec = ((float)block->i_length / block->i_buffer) * bytes;
> - }
> - else
> - {
> - pos = block->i_buffer - this->buffer.i_offset;
> - microsec = ((float)block->i_length / block->i_buffer) * (block->i_buffer - this->buffer.i_offset);
> - }
> + this->sizeMicroSec = 0;
>
> - while(pos < bytes)
> + while(block)
> {
> + this->sizeMicroSec += block->i_length;
> block = block->p_next;
> - if((bytes - pos) < (block->i_buffer - this->buffer.i_offset))
> - {
> - pos = bytes;
> - microsec += ((float)block->i_length / block->i_buffer) * (bytes - pos);
> - }
> - else
> - {
> - pos += block->i_buffer;
> - microsec += block->i_length;
> - }
> }
>
> - this->sizeMicroSec -= microsec;
> - this->sizeBytes -= bytes;
> -
> - if(this->sizeMicroSec < 0)
> - this->sizeMicroSec = 0;
> -
> - if(this->sizeBytes == 0)
> - this->sizeMicroSec = 0;
> + this->sizeBytes -= bytes;
> }
> mtime_t BlockBuffer::size ()
> {
> diff --git a/modules/stream_filter/dash/buffer/BlockBuffer.h b/modules/stream_filter/dash/buffer/BlockBuffer.h
> index 570861f..06a35fc 100644
> --- a/modules/stream_filter/dash/buffer/BlockBuffer.h
> +++ b/modules/stream_filter/dash/buffer/BlockBuffer.h
> @@ -69,7 +69,7 @@ namespace dash
>
> std::vector<IBufferObserver *> bufferObservers;
>
> - void reduceBufferMilliSec(size_t bytes);
> + void updateBufferSize(size_t bytes);
> };
> }
> }
> --
> 1.7.0.4
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> http://mailman.videolan.org/listinfo/vlc-devel
Can't this be avoided by keeping the ammount of available bytes in a
BlockBuffer attribute?
--
Hugo Beauzée-Luyssen
More information about the vlc-devel
mailing list