1
mirror of https://github.com/mpv-player/mpv synced 2024-10-26 07:22:17 +02:00

stream: add partial read function

This is a nice way to avoid an additional copy of the data when reading
with stream_read().
This commit is contained in:
wm4 2013-05-27 21:53:40 +02:00
parent 34a383664a
commit 4abec2f7b2
2 changed files with 28 additions and 17 deletions

View File

@ -432,28 +432,38 @@ int stream_fill_buffer(stream_t *s)
return len; return len;
} }
// Read between 1..buf_size bytes of data, return how much data has been read.
// Return <= 0 on EOF, error, of if buf_size was 0.
int stream_read_partial(stream_t *s, char *buf, int buf_size)
{
assert(s->buf_pos <= s->buf_len);
assert(buf_size >= 0);
if (s->buf_pos == s->buf_len && buf_size > 0) {
s->buf_pos = s->buf_len = 0;
// Do a direct read, but only if there's no sector alignment requirement
// Also, small reads will be more efficient with buffering & copying
if (!s->sector_size && buf_size >= STREAM_BUFFER_SIZE)
return stream_read_unbuffered(s, buf, buf_size);
if (!stream_fill_buffer(s))
return 0;
}
int len = FFMIN(buf_size, s->buf_len - s->buf_pos);
memcpy(buf, &s->buffer[s->buf_pos], len);
s->buf_pos += len;
return len;
}
int stream_read(stream_t *s, char *mem, int total) int stream_read(stream_t *s, char *mem, int total)
{ {
int len = total; int len = total;
while (len > 0) { while (len > 0) {
int x; int read = stream_read_partial(s, mem, len);
x = s->buf_len - s->buf_pos; if (read <= 0)
if (x == 0) { break; // EOF
if (!stream_fill_buffer(s)) mem += read;
return total - len; // EOF len -= read;
x = s->buf_len - s->buf_pos;
}
if (s->buf_pos > s->buf_len)
mp_msg(MSGT_DEMUX, MSGL_WARN,
"stream_read: WARNING! s->buf_pos>s->buf_len\n");
if (x > len)
x = len;
memcpy(mem, &s->buffer[s->buf_pos], x);
s->buf_pos += x;
mem += x;
len -= x;
} }
return total; return total - len;
} }
int stream_write_buffer(stream_t *s, unsigned char *buf, int len) int stream_write_buffer(stream_t *s, unsigned char *buf, int len)

View File

@ -301,6 +301,7 @@ inline static int64_t stream_tell(stream_t *s)
int stream_skip(stream_t *s, int64_t len); int stream_skip(stream_t *s, int64_t len);
int stream_seek(stream_t *s, int64_t pos); int stream_seek(stream_t *s, int64_t pos);
int stream_read(stream_t *s, char *mem, int total); int stream_read(stream_t *s, char *mem, int total);
int stream_read_partial(stream_t *s, char *buf, int buf_size);
struct MPOpts; struct MPOpts;
/* /*