[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:59:13 CEST 2017
Le 1 juillet 2017 16:05:52 GMT+02:00, Thomas Guillem <thomas at gllm.fr> a écrit :
>
>
>
>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
In other words, this is wrong.
--
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/a794616e/attachment.html>
More information about the vlc-devel
mailing list