[vlc-devel] [PATCH 4/6] dash: fixed buffer precision bug

Christopher Mueller "Christopher Mueller" at mailsrv.uni-klu.ac.at
Tue Apr 3 16:41:41 CEST 2012


From: Christopher Mueller <christopher.mueller at itec.aau.at>

Signed-off-by: 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 1db9168..ec20c2c 100644
--- a/modules/stream_filter/dash/buffer/BlockBuffer.cpp
+++ b/modules/stream_filter/dash/buffer/BlockBuffer.cpp
@@ -117,14 +117,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);
@@ -178,47 +178,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 92c8bd6..006fe31 100644
--- a/modules/stream_filter/dash/buffer/BlockBuffer.h
+++ b/modules/stream_filter/dash/buffer/BlockBuffer.h
@@ -70,7 +70,7 @@ namespace dash
 
                 std::vector<IBufferObserver *> bufferObservers;
 
-                void reduceBufferMilliSec(size_t bytes);
+                void updateBufferSize(size_t bytes);
         };
     }
 }
-- 
1.7.0.4




More information about the vlc-devel mailing list