Commit b75462c3 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

stream: add vlc_stream_ReadPartial()

This is a variant of vlc_stream_Read(), such that it only waits for
some bytes (i.e. more than zero) rather than the full requested bytes
count.
parent e77eb3bd
......@@ -177,6 +177,23 @@ enum stream_query_e
*/
VLC_API ssize_t vlc_stream_Read(stream_t *, void *buf, size_t len) VLC_USED;
/**
* Reads partial data from a byte stream.
*
* This function waits until some data is available for reading from the
* stream, a fatal error is encountered or the end-of-stream is reached.
*
* Unlike vlc_stream_Read(), this function does not wait for the full requested
* bytes count. It can return a short count even before the end of the stream
* and in the absence of any error.
*
* \param buf start of buffer to read data into [OUT]
* \param len buffer size (maximum number of bytes to read)
* \return the number of bytes read or a negative value on error.
*/
VLC_API ssize_t vlc_stream_ReadPartial(stream_t *, void *buf, size_t len)
VLC_USED;
/**
* Peeks at data from a byte stream.
*
......
......@@ -430,6 +430,47 @@ ssize_t vlc_stream_Read(stream_t *s, void *buf, size_t len)
return copy;
}
ssize_t vlc_stream_ReadPartial(stream_t *s, void *buf, size_t len)
{
stream_priv_t *priv = (stream_priv_t *)s;
for (;;)
{
size_t avail = 0;
if (priv->peek != NULL)
avail += priv->peek->i_buffer;
if (priv->block != NULL)
avail += priv->block->i_buffer;
if (avail > 0)
return vlc_stream_Read(s, buf, (avail < len) ? avail : len);
if (s->pf_read != NULL)
{
ssize_t ret = s->pf_read(s, buf, len);
if (ret < 0)
return ret;
priv->offset += ret;
if (likely(len > 0))
priv->eof = !ret;
return ret;
}
if (s->pf_block != NULL)
{
bool eof;
priv->block = s->pf_block(s, &eof);
if (priv->block == NULL && eof)
return 0;
}
else
return 0;
}
}
ssize_t vlc_stream_Peek(stream_t *s, const uint8_t **restrict bufp, size_t len)
{
stream_priv_t *priv = (stream_priv_t *)s;
......
......@@ -411,6 +411,7 @@ vlc_stream_Peek
vlc_stream_Read
vlc_stream_ReadBlock
vlc_stream_ReadLine
vlc_stream_ReadPartial
vlc_stream_Seek
vlc_stream_Tell
vlc_stream_NewMRL
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment