[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