<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body><div><br></div>
<div><br></div>
<div><br></div>
<div>On Sat, Jul 1, 2017, at 16:02, Rémi Denis-Courmont wrote:<br></div>
<blockquote type="cite"><div defang_data-gmailquote="yes"><div>Le 1 juillet 2017 15:24:45 GMT+02:00, Thomas Guillem <thomas@gllm.fr> a écrit :<br></div>
<blockquote defang_data-gmailquote="yes" style="margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;"><pre><div>This allow to pass block flags to a demux inside a demux_chained. This works<br></div>
<div>only if the block size and the read size match. This is the case for ts via rtp<br></div>
<div>for example.<br></div>
<div>---<br></div>
<div> src/input/stream.c | 42 +++++++++++++++++++++++++++++++++++-------<br></div>
<div> 1 file changed, 35 insertions(+), 7 deletions(-)<br></div>
<div><br></div>
<div>diff --git a/src/input/stream.c b/src/input/stream.c<br></div>
<div>index affc7b2c0d..5b3ddffc89 100644<br></div>
<div>--- a/src/input/stream.c<br></div>
<div>+++ b/src/input/stream.c<br></div>
<div>@@ -387,7 +387,8 @@ static ssize_t vlc_stream_CopyBlock(block_t **restrict pp,<br></div>
<div>     return likely(len > 0) ? (ssize_t)len : -1;<br></div>
<div> }<br></div>
<div> <br></div>
<div>-static ssize_t vlc_stream_ReadRaw(stream_t *s, void *buf, size_t len)<br></div>
<div>+static ssize_t vlc_stream_ReadRaw(stream_t *s, void *buf, size_t len,<br></div>
<div>+                                  uint32_t *block_flags)<br></div>
<div> {<br></div>
<div>     stream_priv_t *priv = (stream_priv_t *)s;<br></div>
<div>     ssize_t ret;<br></div>
<div>@@ -424,14 +425,19 @@ static ssize_t vlc_stream_ReadRaw(stream_t *s, void *buf, size_t len)<br></div>
<div>         priv->block = s->pf_block(s, &eof);<br></div>
<div>         ret = vlc_stream_CopyBlock(&priv->block, buf, len);<br></div>
<div>         if (ret >= 0)<br></div>
<div>+        {<br></div>
<div>+            if (block_flags != NULL)<br></div>
<div>+                *block_flags = priv->block->i_flags;<br></div>
<div>             return ret;<br></div>
<div>+        }<br></div>
<div>         return eof ? 0 : -1;<br></div>
<div>     }<br></div>
<div> <br></div>
<div>     return 0;<br></div>
<div> }<br></div>
<div> <br></div>
<div>-ssize_t vlc_stream_ReadPartial(stream_t *s, void *buf, size_t len)<br></div>
<div>+static ssize_t vlc_stream_ReadPartialInternal(stream_t *s, void *buf, size_t len,<br></div>
<div>+                                              uint32_t *block_flags)<br></div>
<div> {<br></div>
<div>     stream_priv_t *priv = (stream_priv_t *)s;<br></div>
<div>     ssize_t ret;<br></div>
<div>@@ -444,7 +450,7 @@ ssize_t vlc_stream_ReadPartial(stream_t *s, void *buf, size_t len)<br></div>
<div>         return ret;<br></div>
<div>     }<br></div>
<div> <br></div>
<div>-    ret = vlc_stream_ReadRaw(s, buf, len);<br></div>
<div>+    ret = vlc_stream_ReadRaw(s, buf, len, block_flags);<br></div>
<div>     if (ret > 0)<br></div>
<div>         priv->offset += ret;<br></div>
<div>     if (ret == 0)<br></div>
<div>@@ -453,6 +459,11 @@ ssize_t vlc_stream_ReadPartial(stream_t *s, void *buf, size_t len)<br></div>
<div>     return ret;<br></div>
<div> }<br></div>
<div> <br></div>
<div>+ssize_t vlc_stream_ReadPartial(stream_t *s, void *buf, size_t len)<br></div>
<div>+{<br></div>
<div>+    return vlc_stream_ReadPartialInternal(s, buf, len, NULL);<br></div>
<div>+}<br></div>
<div>+<br></div>
<div> ssize_t vlc_stream_Read(stream_t *s, void *buf, size_t len)<br></div>
<div> {<br></div>
<div>     size_t copied = 0;<br></div>
<div>@@ -516,7 +527,7 @@ ssize_t vlc_stream_Peek(stream_t *s, const uint8_t **restrict bufp, size_t len)<br></div>
<div>         size_t avail = peek->i_buffer;<br></div>
<div>         ssize_t ret;<br></div>
<div> <br></div>
<div>-        ret = vlc_stream_ReadRaw(s, peek->p_buffer + avail, len - avail);<br></div>
<div>+        ret = vlc_stream_ReadRaw(s, peek->p_buffer + avail, len - avail, NULL);<br></div>
<div>         if (ret < 0)<br></div>
<div>             continue;<br></div>
<div> <br></div>
<div>@@ -706,14 +717,31 @@ block_t *vlc_stream_Block( stream_t *s, size_t size )<br></div>
<div>     if( unlikely(block == NULL) )<br></div>
<div>         return NULL;<br></div>
<div> <br></div>
<div>-    ssize_t val = vlc_stream_Read( s, block->p_buffer, size );<br></div>
<div>-    if( val <= 0 )<br></div>
<div>+    block->i_buffer = 0;<br></div>
<div>+    char *buf = (char *)block->p_buffer;<br></div>
<div>+    while (size > 0)<br></div>
<div>+    {<br></div>
<div>+        uint32_t block_flags = 0;<br></div>
<div>+        ssize_t ret = vlc_stream_ReadPartialInternal( s, buf, size, &block_flags );<br></div>
<div>+        if (ret < 0)<br></div>
<div>+            continue;<br></div>
<div>+        if (ret == 0)<br></div>
<div>+            break;<br></div>
<div>+<br></div>
<div>+        if( size == (size_t) ret && block->i_buffer == 0 )<br></div>
<div>+            block->i_flags = block_flags;<br></div>
<div>+<br></div>
<div>+        buf += ret;<br></div>
<div>+        size -= ret;<br></div>
<div>+        block->i_buffer += ret;<br></div>
<div>+    }<br></div>
<div>+<br></div>
<div>+    if( block->i_buffer == 0 )<br></div>
<div>     {<br></div>
<div>         block_Release( block );<br></div>
<div>         return NULL;<br></div>
<div>     }<br></div>
<div> <br></div>
<div>-    block->i_buffer = val;<br></div>
<div>     return block;<br></div>
<div> } <br></div>
</pre></blockquote></div>
<div><br></div>
<div>This does not seem to make sense. The necessary assumptions can never be warranted.<br></div>
</blockquote><div><br></div>
<div>This cannot be warranted, yes, but this case can happen, like for rtp/ts.<br></div>
<div><br></div>
<blockquote type="cite"><div> -- <br></div>
<div> Rémi Denis-Courmont<br></div>
<div> Typed on an inconvenient virtual keyboard <br></div>
<div><u>_______________________________________________</u><br></div>
<div>vlc-devel mailing list<br></div>
<div>To unsubscribe or modify your subscription options:<br></div>
<div><a href="https://mailman.videolan.org/listinfo/vlc-devel">https://mailman.videolan.org/listinfo/vlc-devel</a><br></div>
</blockquote><div><br></div>
</body>
</html>