[vlc-devel] [PATCH] stream: pass block flags if read size and block size match
Thomas Guillem
thomas at gllm.fr
Sat Jul 1 16:05:52 CEST 2017
On Sat, Jul 1, 2017, at 16:02, Rémi Denis-Courmont wrote:
> 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;
>>
>> }
>>
>
> This does not seem to make sense. The necessary assumptions can never
> be warranted.
This cannot be warranted, yes, but this case can happen, like for
rtp/ts.
> --
> Rémi Denis-Courmont
> Typed on an inconvenient virtual keyboard
> _________________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20170701/c766d7dc/attachment.html>
More information about the vlc-devel
mailing list