[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