[vlc-commits] Fixed BDA support (close #5627).

Laurent Aimar git at videolan.org
Thu Jan 5 00:51:18 CET 2012


vlc/vlc-1.2 | branch: master | Laurent Aimar <fenrir at videolan.org> | Tue Jan  3 21:01:49 2012 +0100| [c58d6d69ecf918ddba22054a5bfa04d6ec33c1bc] | committer: Jean-Baptiste Kempf

Fixed BDA support (close #5627).
(cherry picked from commit 435f1d55e7745df14c4e3a725d18dc2f32b6c7f1)

Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>

> http://git.videolan.org/gitweb.cgi/vlc/vlc-1.2.git/?a=commit;h=c58d6d69ecf918ddba22054a5bfa04d6ec33c1bc
---

 modules/access/dtv/bdagraph.cpp |   46 ++++++++++++++++++++++++--------------
 1 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/modules/access/dtv/bdagraph.cpp b/modules/access/dtv/bdagraph.cpp
index 7303033..23f6818 100644
--- a/modules/access/dtv/bdagraph.cpp
+++ b/modules/access/dtv/bdagraph.cpp
@@ -305,28 +305,40 @@ void BDAOutput::Push( block_t *p_block )
 
 ssize_t BDAOutput::Pop(void *buf, size_t len)
 {
-    block_t *block;
+    vlc_mutex_locker l( &lock );
+
+    mtime_t i_deadline = mdate() + 250 * 1000;
+    while( !p_first )
     {
-        vlc_mutex_locker l( &lock );
+        if( vlc_cond_timedwait( &wait, &lock, i_deadline ) )
+            return -1;
+    }
 
-        if( !p_first )
-            vlc_cond_timedwait( &wait, &lock, mdate() + 250*1000 );
+    size_t i_index = 0;
+    while( i_index < len )
+    {
+        size_t i_copy = __MIN( len - i_index, p_first->i_buffer );
+        memcpy( (uint8_t *)buf + i_index, p_first->p_buffer, i_copy );
 
-        block = p_first;
-        p_first = NULL;
-        pp_next = &p_first;
-    }
+        i_index           += i_copy;
 
-    if(block == NULL)
-        return -1;
+        p_first->p_buffer += i_copy;
+        p_first->i_buffer -= i_copy;
 
-    if(len < block->i_buffer)
-        msg_Err(p_access, "buffer overflow!");
-    else
-        len = block->i_buffer;
-    vlc_memcpy(buf, block->p_buffer, len);
-    block_Release(block);
-    return len;
+        if( p_first->i_buffer <= 0 )
+        {
+            block_t *p_next = p_first->p_next;
+            block_Release( p_first );
+
+            p_first = p_next;
+            if( !p_first )
+            {
+                pp_next = &p_first;
+                break;
+            }
+        }
+    }
+    return i_index;
 }
 
 void BDAOutput::Empty()



More information about the vlc-commits mailing list