[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