mirror of
https://github.com/mpv-player/mpv
synced 2025-01-04 05:52:09 +00:00
6487abde79
It was set, but its value was never used. The stream cache used to use it, but it was removed. It controlled how much data it tried to read from the underlying stream at once. The user can now control the buffer size with --stream-buffer-size, which achieves a similar effect, because the stream will in the common case read half of the buffer size at once. In fact, the new default size is 128KB, i.e. 64KB read size, which is as much as stream_file and stream_cb requested by default. stream_memory requested more, but it doesn't matter anyway. Only stream_smb set a larger size with 128KB.
110 lines
2.5 KiB
C
110 lines
2.5 KiB
C
#include "config.h"
|
|
|
|
#include <stdio.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <errno.h>
|
|
|
|
#include "osdep/io.h"
|
|
|
|
#include "common/common.h"
|
|
#include "common/msg.h"
|
|
#include "common/global.h"
|
|
#include "stream.h"
|
|
#include "options/m_option.h"
|
|
#include "options/path.h"
|
|
#include "player/client.h"
|
|
#include "libmpv/stream_cb.h"
|
|
#include "misc/thread_tools.h"
|
|
|
|
struct priv {
|
|
mpv_stream_cb_info info;
|
|
struct mp_cancel *cancel;
|
|
};
|
|
|
|
static int fill_buffer(stream_t *s, void *buffer, int max_len)
|
|
{
|
|
struct priv *p = s->priv;
|
|
return (int)p->info.read_fn(p->info.cookie, buffer, (size_t)max_len);
|
|
}
|
|
|
|
static int seek(stream_t *s, int64_t newpos)
|
|
{
|
|
struct priv *p = s->priv;
|
|
return p->info.seek_fn(p->info.cookie, newpos) >= 0;
|
|
}
|
|
|
|
static int64_t get_size(stream_t *s)
|
|
{
|
|
struct priv *p = s->priv;
|
|
|
|
if (p->info.size_fn) {
|
|
int64_t size = p->info.size_fn(p->info.cookie);
|
|
if (size >= 0)
|
|
return size;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
static void s_close(stream_t *s)
|
|
{
|
|
struct priv *p = s->priv;
|
|
p->info.close_fn(p->info.cookie);
|
|
}
|
|
|
|
static int open_cb(stream_t *stream)
|
|
{
|
|
struct priv *p = talloc_ptrtype(stream, p);
|
|
stream->priv = p;
|
|
|
|
bstr bproto = mp_split_proto(bstr0(stream->url), NULL);
|
|
char *proto = bstrto0(stream, bproto);
|
|
|
|
void *user_data;
|
|
mpv_stream_cb_open_ro_fn open_fn;
|
|
|
|
if (!mp_streamcb_lookup(stream->global, proto, &user_data, &open_fn))
|
|
return STREAM_UNSUPPORTED;
|
|
|
|
mpv_stream_cb_info info = {0};
|
|
|
|
int r = open_fn(user_data, stream->url, &info);
|
|
if (r < 0) {
|
|
if (r != MPV_ERROR_LOADING_FAILED)
|
|
MP_WARN(stream, "unknown error from user callback\n");
|
|
return STREAM_ERROR;
|
|
}
|
|
|
|
if (!info.read_fn || !info.close_fn) {
|
|
MP_FATAL(stream, "required read_fn or close_fn callbacks not set.\n");
|
|
return STREAM_ERROR;
|
|
}
|
|
|
|
p->info = info;
|
|
|
|
if (p->info.seek_fn && p->info.seek_fn(p->info.cookie, 0) >= 0) {
|
|
stream->seek = seek;
|
|
stream->seekable = true;
|
|
}
|
|
stream->fast_skip = true;
|
|
stream->fill_buffer = fill_buffer;
|
|
stream->get_size = get_size;
|
|
stream->close = s_close;
|
|
|
|
if (p->info.cancel_fn && stream->cancel) {
|
|
p->cancel = mp_cancel_new(p);
|
|
mp_cancel_set_parent(p->cancel, stream->cancel);
|
|
mp_cancel_set_cb(p->cancel, p->info.cancel_fn, p->info.cookie);
|
|
}
|
|
|
|
return STREAM_OK;
|
|
}
|
|
|
|
const stream_info_t stream_info_cb = {
|
|
.name = "stream_callback",
|
|
.open = open_cb,
|
|
};
|