[vlc-devel] [PATCH] stream: pass block flags if read size and block size match

Rémi Denis-Courmont remi at remlab.net
Sat Jul 1 16:02:32 CEST 2017


Le 1 juillet 2017 15:24:45 GMT+02:00, Thomas Guillem <thomas at gllm.fr> a écrit :
>This allow to pass block flags to a demux inside a demux_chained. This
>works
>only if the block size and the read size match. This is the case for ts
>via rtp
>for example.
>---
> src/input/stream.c | 42 +++++++++++++++++++++++++++++++++++-------
> 1 file changed, 35 insertions(+), 7 deletions(-)
>
>diff --git a/src/input/stream.c b/src/input/stream.c
>index affc7b2c0d..5b3ddffc89 100644
>--- a/src/input/stream.c
>+++ b/src/input/stream.c
>@@ -387,7 +387,8 @@ static ssize_t vlc_stream_CopyBlock(block_t
>**restrict pp,
>     return likely(len > 0) ? (ssize_t)len : -1;
> }
> 
>-static ssize_t vlc_stream_ReadRaw(stream_t *s, void *buf, size_t len)
>+static ssize_t vlc_stream_ReadRaw(stream_t *s, void *buf, size_t len,
>+                                  uint32_t *block_flags)
> {
>     stream_priv_t *priv = (stream_priv_t *)s;
>     ssize_t ret;
>@@ -424,14 +425,19 @@ static ssize_t vlc_stream_ReadRaw(stream_t *s,
>void *buf, size_t len)
>         priv->block = s->pf_block(s, &eof);
>         ret = vlc_stream_CopyBlock(&priv->block, buf, len);
>         if (ret >= 0)
>+        {
>+            if (block_flags != NULL)
>+                *block_flags = priv->block->i_flags;
>             return ret;
>+        }
>         return eof ? 0 : -1;
>     }
> 
>     return 0;
> }
> 
>-ssize_t vlc_stream_ReadPartial(stream_t *s, void *buf, size_t len)
>+static ssize_t vlc_stream_ReadPartialInternal(stream_t *s, void *buf,
>size_t len,
>+                                              uint32_t *block_flags)
> {
>     stream_priv_t *priv = (stream_priv_t *)s;
>     ssize_t ret;
>@@ -444,7 +450,7 @@ ssize_t vlc_stream_ReadPartial(stream_t *s, void
>*buf, size_t len)
>         return ret;
>     }
> 
>-    ret = vlc_stream_ReadRaw(s, buf, len);
>+    ret = vlc_stream_ReadRaw(s, buf, len, block_flags);
>     if (ret > 0)
>         priv->offset += ret;
>     if (ret == 0)
>@@ -453,6 +459,11 @@ ssize_t vlc_stream_ReadPartial(stream_t *s, void
>*buf, size_t len)
>     return ret;
> }
> 
>+ssize_t vlc_stream_ReadPartial(stream_t *s, void *buf, size_t len)
>+{
>+    return vlc_stream_ReadPartialInternal(s, buf, len, NULL);
>+}
>+
> ssize_t vlc_stream_Read(stream_t *s, void *buf, size_t len)
> {
>     size_t copied = 0;
>@@ -516,7 +527,7 @@ ssize_t vlc_stream_Peek(stream_t *s, const uint8_t
>**restrict bufp, size_t len)
>         size_t avail = peek->i_buffer;
>         ssize_t ret;
> 
>-        ret = vlc_stream_ReadRaw(s, peek->p_buffer + avail, len -
>avail);
>+        ret = vlc_stream_ReadRaw(s, peek->p_buffer + avail, len -
>avail, NULL);
>         if (ret < 0)
>             continue;
> 
>@@ -706,14 +717,31 @@ block_t *vlc_stream_Block( stream_t *s, size_t
>size )
>     if( unlikely(block == NULL) )
>         return NULL;
> 
>-    ssize_t val = vlc_stream_Read( s, block->p_buffer, size );
>-    if( val <= 0 )
>+    block->i_buffer = 0;
>+    char *buf = (char *)block->p_buffer;
>+    while (size > 0)
>+    {
>+        uint32_t block_flags = 0;
>+        ssize_t ret = vlc_stream_ReadPartialInternal( s, buf, size,
>&block_flags );
>+        if (ret < 0)
>+            continue;
>+        if (ret == 0)
>+            break;
>+
>+        if( size == (size_t) ret && block->i_buffer == 0 )
>+            block->i_flags = block_flags;
>+
>+        buf += ret;
>+        size -= ret;
>+        block->i_buffer += ret;
>+    }
>+
>+    if( block->i_buffer == 0 )
>     {
>         block_Release( block );
>         return NULL;
>     }
> 
>-    block->i_buffer = val;
>     return block;
> }
> 
>-- 
>2.11.0
>
>_______________________________________________
>vlc-devel mailing list
>To unsubscribe or modify your subscription options:
>https://mailman.videolan.org/listinfo/vlc-devel

This does not seem to make sense. The necessary assumptions can never be warranted.
-- 
Rémi Denis-Courmont
Typed on an inconvenient virtual keyboard
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20170701/22bb6f40/attachment.html>


More information about the vlc-devel mailing list