summaryrefslogtreecommitdiffstats
path: root/stream
diff options
context:
space:
mode:
Diffstat (limited to 'stream')
-rw-r--r--stream/cache.c4
-rw-r--r--stream/stream.c67
-rw-r--r--stream/stream.h26
-rw-r--r--stream/stream_avdevice.c2
-rw-r--r--stream/stream_bluray.c3
-rw-r--r--stream/stream_cdda.c1
-rw-r--r--stream/stream_dvb.c3
-rw-r--r--stream/stream_dvd.c1
-rw-r--r--stream/stream_dvdnav.c3
-rw-r--r--stream/stream_edl.c2
-rw-r--r--stream/stream_file.c4
-rw-r--r--stream/stream_lavf.c1
-rw-r--r--stream/stream_mf.c1
-rw-r--r--stream/stream_tv.c1
-rw-r--r--stream/tv.c5
-rw-r--r--stream/tvi_dummy.c5
16 files changed, 33 insertions, 96 deletions
diff --git a/stream/cache.c b/stream/cache.c
index 85b78f9038..b2ff1a91c8 100644
--- a/stream/cache.c
+++ b/stream/cache.c
@@ -338,10 +338,8 @@ static int resize_cache(struct priv *s, int64_t size)
buffer_size += s->back_size;
unsigned char *buffer = malloc(buffer_size);
- if (!buffer) {
- free(buffer);
+ if (!buffer)
return STREAM_ERROR;
- }
if (s->buffer) {
// Copy & free the old ringbuffer data.
diff --git a/stream/stream.c b/stream/stream.c
index 4c7aa04844..94b9c44bc4 100644
--- a/stream/stream.c
+++ b/stream/stream.c
@@ -258,8 +258,6 @@ static int open_internal(const stream_info_t *sinfo, const char *url, int flags,
assert(s->seekable == !!s->seek);
- s->uncached_type = s->type;
-
if (s->mime_type)
MP_VERBOSE(s, "Mime-type: '%s'\n", s->mime_type);
@@ -328,7 +326,7 @@ stream_t *open_output_stream(const char *filename, struct mpv_global *global)
static bool stream_reconnect(stream_t *s)
{
- if (!s->streaming || s->uncached_stream || !s->seekable || !s->cancel)
+ if (!s->streaming || s->caching || !s->seekable || !s->cancel)
return false;
int64_t pos = s->pos;
@@ -353,57 +351,25 @@ static bool stream_reconnect(stream_t *s)
return false;
}
-static void stream_capture_write(stream_t *s, void *buf, size_t len)
-{
- if (s->capture_file && len > 0) {
- if (fwrite(buf, len, 1, s->capture_file) < 1) {
- MP_ERR(s, "Error writing capture file: %s\n", mp_strerror(errno));
- stream_set_capture_file(s, NULL);
- }
- }
-}
-
-void stream_set_capture_file(stream_t *s, const char *filename)
-{
- if (!bstr_equals(bstr0(s->capture_filename), bstr0(filename))) {
- if (s->capture_file)
- fclose(s->capture_file);
- talloc_free(s->capture_filename);
- s->capture_file = NULL;
- s->capture_filename = NULL;
- if (filename) {
- s->capture_file = fopen(filename, "ab");
- if (s->capture_file) {
- s->capture_filename = talloc_strdup(NULL, filename);
- if (s->buf_pos < s->buf_len)
- stream_capture_write(s, s->buffer, s->buf_len);
- } else {
- MP_ERR(s, "Error opening capture file: %s\n", mp_strerror(errno));
- }
- }
- }
-}
-
// Read function bypassing the local stream buffer. This will not write into
// s->buffer, but into buf[0..len] instead.
// Returns 0 on error or EOF, and length of bytes read on success.
// Partial reads are possible, even if EOF is not reached.
static int stream_read_unbuffered(stream_t *s, void *buf, int len)
{
- int orig_len = len;
+ int res = 0;
s->buf_pos = s->buf_len = 0;
// we will retry even if we already reached EOF previously.
- len = s->fill_buffer ? s->fill_buffer(s, buf, len) : -1;
- if (len < 0)
- len = 0;
- if (len == 0) {
+ if (s->fill_buffer && !mp_cancel_test(s->cancel))
+ res = s->fill_buffer(s, buf, len);
+ if (res <= 0) {
// just in case this is an error e.g. due to network
// timeout reset and retry
// do not retry if this looks like proper eof
int64_t size = stream_get_size(s);
if (!s->eof && s->pos != size && stream_reconnect(s)) {
s->eof = 1; // make sure EOF is set to ensure no endless recursion
- return stream_read_unbuffered(s, buf, orig_len);
+ return stream_read_unbuffered(s, buf, len);
}
s->eof = 1;
@@ -411,9 +377,8 @@ static int stream_read_unbuffered(stream_t *s, void *buf, int len)
}
// When reading succeeded we are obviously not at eof.
s->eof = 0;
- s->pos += len;
- stream_capture_write(s, buf, len);
- return len;
+ s->pos += res;
+ return res;
}
static int stream_fill_buffer_by(stream_t *s, int64_t len)
@@ -647,11 +612,9 @@ void free_stream(stream_t *s)
if (!s)
return;
- stream_set_capture_file(s, NULL);
-
if (s->close)
s->close(s);
- free_stream(s->uncached_stream);
+ free_stream(s->underlying);
talloc_free(s);
}
@@ -670,8 +633,8 @@ stream_t *open_memory_stream(void *data, int len)
static stream_t *open_cache(stream_t *orig, const char *name)
{
stream_t *cache = new_stream();
- cache->uncached_type = orig->uncached_type;
- cache->uncached_stream = orig;
+ cache->underlying = orig;
+ cache->caching = true;
cache->seekable = true;
cache->mode = STREAM_READ;
cache->read_chunk = 4 * STREAM_BUFFER_SIZE;
@@ -682,6 +645,8 @@ static stream_t *open_cache(stream_t *orig, const char *name)
cache->lavf_type = talloc_strdup(cache, orig->lavf_type);
cache->streaming = orig->streaming,
cache->is_network = orig->is_network;
+ cache->is_local_file = orig->is_local_file;
+ cache->is_directory = orig->is_directory;
cache->cancel = orig->cancel;
cache->global = orig->global;
@@ -722,7 +687,7 @@ static int stream_enable_cache(stream_t **stream, struct mp_cache_opts *opts)
stream_t *fcache = open_cache(orig, "file-cache");
if (stream_file_cache_init(fcache, orig, &use_opts) <= 0) {
- fcache->uncached_stream = NULL; // don't free original stream
+ fcache->underlying = NULL; // don't free original stream
free_stream(fcache);
fcache = orig;
}
@@ -731,10 +696,10 @@ static int stream_enable_cache(stream_t **stream, struct mp_cache_opts *opts)
int res = stream_cache_init(cache, fcache, &use_opts);
if (res <= 0) {
- cache->uncached_stream = NULL; // don't free original stream
+ cache->underlying = NULL; // don't free original stream
free_stream(cache);
if (fcache != orig) {
- fcache->uncached_stream = NULL;
+ fcache->underlying = NULL;
free_stream(fcache);
}
} else {
diff --git a/stream/stream.h b/stream/stream.h
index 7d44e30eae..cc47184ea6 100644
--- a/stream/stream.h
+++ b/stream/stream.h
@@ -28,20 +28,6 @@
#include "misc/bstr.h"
-enum streamtype {
- STREAMTYPE_GENERIC = 0,
- STREAMTYPE_FILE,
- STREAMTYPE_DIR,
- STREAMTYPE_DVB,
- STREAMTYPE_DVD,
- STREAMTYPE_BLURAY,
- STREAMTYPE_TV,
- STREAMTYPE_MF,
- STREAMTYPE_EDL,
- STREAMTYPE_AVDEVICE,
- STREAMTYPE_CDDA,
-};
-
#define STREAM_BUFFER_SIZE 2048
#define STREAM_MAX_SECTOR_SIZE (8 * 1024)
@@ -178,8 +164,6 @@ typedef struct stream {
// Close
void (*close)(struct stream *s);
- enum streamtype type; // see STREAMTYPE_*
- enum streamtype uncached_type; // if stream is cache, type of wrapped str.
int sector_size; // sector size (seek will be aligned on this size if non 0)
int read_chunk; // maximum amount of data to read at once to limit latency
unsigned int buf_pos, buf_len;
@@ -197,16 +181,16 @@ typedef struct stream {
bool fast_skip : 1; // consider stream fast enough to fw-seek by skipping
bool is_network : 1; // original stream_info_t.is_network flag
bool allow_caching : 1; // stream cache makes sense
+ bool caching : 1; // is a cache, or accesses a cache
+ bool is_local_file : 1; // from the filesystem
+ bool is_directory : 1; // directory on the filesystem
bool access_references : 1; // open other streams
struct mp_log *log;
struct mpv_global *global;
struct mp_cancel *cancel; // cancellation notification
- FILE *capture_file;
- char *capture_filename;
-
- struct stream *uncached_stream; // underlying stream for cache wrapper
+ struct stream *underlying; // e.g. cache wrapper
// Includes additional padding in case sizes get rounded up by sector size.
unsigned char buffer[];
@@ -214,8 +198,6 @@ typedef struct stream {
int stream_fill_buffer(stream_t *s);
-void stream_set_capture_file(stream_t *s, const char *filename);
-
struct mp_cache_opts;
bool stream_wants_cache(stream_t *stream, struct mp_cache_opts *opts);
int stream_enable_cache_defaults(stream_t **stream);
diff --git a/stream/stream_avdevice.c b/stream/stream_avdevice.c
index 9734b7b6f5..2b132cd1a9 100644
--- a/stream/stream_avdevice.c
+++ b/stream/stream_avdevice.c
@@ -21,8 +21,8 @@
static int open_f(stream_t *stream)
{
- stream->type = STREAMTYPE_AVDEVICE;
stream->demuxer = "lavf";
+ stream->allow_caching = false;
return STREAM_OK;
}
diff --git a/stream/stream_bluray.c b/stream/stream_bluray.c
index 5f083954c2..07dcc7f69e 100644
--- a/stream/stream_bluray.c
+++ b/stream/stream_bluray.c
@@ -425,7 +425,7 @@ static int bluray_stream_open_internal(stream_t *s)
char *time = mp_format_time(ti->duration / 90000, false);
MP_VERBOSE(s, "idx: %3d duration: %s (playlist: %05d.mpls)\n",
- i + 1, time, ti->playlist);
+ i, time, ti->playlist);
talloc_free(time);
/* try to guess which title may contain the main movie */
@@ -450,7 +450,6 @@ static int bluray_stream_open_internal(stream_t *s)
s->fill_buffer = bluray_stream_fill_buffer;
s->close = bluray_stream_close;
s->control = bluray_stream_control;
- s->type = STREAMTYPE_BLURAY;
s->sector_size = BLURAY_SECTOR_SIZE;
s->priv = b;
s->demuxer = "+disc";
diff --git a/stream/stream_cdda.c b/stream/stream_cdda.c
index df7862cd8f..2a8eb7553f 100644
--- a/stream/stream_cdda.c
+++ b/stream/stream_cdda.c
@@ -383,7 +383,6 @@ static int open_cdda(stream_t *st)
st->streaming = true;
- st->type = STREAMTYPE_CDDA;
st->demuxer = "+disc";
print_cdtext(st, 0);
diff --git a/stream/stream_dvb.c b/stream/stream_dvb.c
index 6e55d8c156..01ec6c2e77 100644
--- a/stream/stream_dvb.c
+++ b/stream/stream_dvb.c
@@ -931,6 +931,7 @@ static int dvb_open(stream_t *stream)
return STREAM_ERROR;
}
+ stream->priv = mp_get_config_group(stream, stream->global, &stream_dvb_conf);
dvb_state_t* state = dvb_get_state(stream);
dvb_priv_t *p = stream->priv;
@@ -990,7 +991,6 @@ static int dvb_open(stream_t *stream)
return STREAM_ERROR;
}
- stream->type = STREAMTYPE_DVB;
stream->fill_buffer = dvb_streaming_read;
stream->close = dvbin_close;
stream->control = dvbin_stream_control;
@@ -1010,7 +1010,6 @@ dvb_state_t *dvb_get_state(stream_t *stream)
}
struct mp_log *log = stream->log;
struct mpv_global *global = stream->global;
- stream->priv = mp_get_config_group(stream, stream->global, &stream_dvb_conf);
dvb_priv_t *priv = stream->priv;
int type, size;
char filename[30], *name;
diff --git a/stream/stream_dvd.c b/stream/stream_dvd.c
index 338c23633c..fe5796d30d 100644
--- a/stream/stream_dvd.c
+++ b/stream/stream_dvd.c
@@ -904,7 +904,6 @@ static int open_s_internal(stream_t *stream)
// ... (unimplemented)
// return NULL;
- stream->type = STREAMTYPE_DVD;
stream->demuxer = "+disc";
stream->lavf_type = "mpeg";
stream->sector_size = 2048;
diff --git a/stream/stream_dvdnav.c b/stream/stream_dvdnav.c
index 1178f50857..21827b6898 100644
--- a/stream/stream_dvdnav.c
+++ b/stream/stream_dvdnav.c
@@ -507,7 +507,6 @@ static int open_s_internal(stream_t *stream)
stream->fill_buffer = fill_buffer;
stream->control = control;
stream->close = stream_dvdnav_close;
- stream->type = STREAMTYPE_DVD;
stream->demuxer = "+disc";
stream->lavf_type = "mpeg";
stream->allow_caching = false;
@@ -596,7 +595,7 @@ unsupported:
}
const stream_info_t stream_info_ifo_dvdnav = {
- .name = "ifo/dvdnav",
+ .name = "ifo_dvdnav",
.open = ifo_dvdnav_stream_open,
.protocols = (const char*const[]){ "file", "", NULL },
};
diff --git a/stream/stream_edl.c b/stream/stream_edl.c
index 4873047cc2..11c149b3ab 100644
--- a/stream/stream_edl.c
+++ b/stream/stream_edl.c
@@ -5,8 +5,8 @@
static int s_open (struct stream *stream)
{
- stream->type = STREAMTYPE_EDL;
stream->demuxer = "edl";
+ stream->allow_caching = false;
return STREAM_OK;
}
diff --git a/stream/stream_file.c b/stream/stream_file.c
index 5d5925ac7c..bfe40429cb 100644
--- a/stream/stream_file.c
+++ b/stream/stream_file.c
@@ -234,7 +234,7 @@ static int open_f(stream_t *stream)
.fd = -1
};
stream->priv = p;
- stream->type = STREAMTYPE_FILE;
+ stream->is_local_file = true;
bool write = stream->mode == STREAM_WRITE;
int m = O_CLOEXEC | (write ? O_RDWR | O_CREAT | O_TRUNC : O_RDONLY);
@@ -281,7 +281,7 @@ static int open_f(stream_t *stream)
if (fstat(p->fd, &st) == 0) {
if (S_ISDIR(st.st_mode)) {
p->use_poll = false;
- stream->type = STREAMTYPE_DIR;
+ stream->is_directory = true;
stream->allow_caching = false;
MP_INFO(stream, "This is a directory - adding to playlist.\n");
}
diff --git a/stream/stream_lavf.c b/stream/stream_lavf.c
index 7594175bd3..873043b38c 100644
--- a/stream/stream_lavf.c
+++ b/stream/stream_lavf.c
@@ -416,6 +416,7 @@ const stream_info_t stream_info_ffmpeg = {
.protocols = (const char *const[]){
"rtmp", "rtsp", "http", "https", "mms", "mmst", "mmsh", "mmshttp", "rtp",
"httpproxy", "hls", "rtmpe", "rtmps", "rtmpt", "rtmpte", "rtmpts", "srtp",
+ "data",
NULL },
.can_write = true,
.is_safe = true,
diff --git a/stream/stream_mf.c b/stream/stream_mf.c
index a027e8b79c..ca6ab6ae88 100644
--- a/stream/stream_mf.c
+++ b/stream/stream_mf.c
@@ -30,7 +30,6 @@
static int
mf_stream_open (stream_t *stream)
{
- stream->type = STREAMTYPE_MF;
stream->demuxer = "mf";
stream->allow_caching = false;
diff --git a/stream/stream_tv.c b/stream/stream_tv.c
index 435e3e7b54..d9acbe4cf4 100644
--- a/stream/stream_tv.c
+++ b/stream/stream_tv.c
@@ -39,7 +39,6 @@ static int
tv_stream_open (stream_t *stream)
{
- stream->type = STREAMTYPE_TV;
stream->close=tv_stream_close;
stream->demuxer = "tv";
stream->allow_caching = false;
diff --git a/stream/tv.c b/stream/tv.c
index 0b34b566d8..89783374f9 100644
--- a/stream/tv.c
+++ b/stream/tv.c
@@ -145,7 +145,7 @@ const struct m_sub_options tv_params_conf = {
tvi_handle_t *tv_new_handle(int size, struct mp_log *log, const tvi_functions_t *functions)
{
- tvi_handle_t *h = malloc(sizeof(*h));
+ tvi_handle_t *h = calloc(1, sizeof(*h));
if (!h)
return NULL;
@@ -159,12 +159,9 @@ tvi_handle_t *tv_new_handle(int size, struct mp_log *log, const tvi_functions_t
h->log = log;
h->functions = functions;
- h->seq = 0;
h->chanlist = -1;
- h->chanlist_s = NULL;
h->norm = -1;
h->channel = -1;
- h->scan = NULL;
return h;
}
diff --git a/stream/tvi_dummy.c b/stream/tvi_dummy.c
index 571dace9ab..9eee9437f0 100644
--- a/stream/tvi_dummy.c
+++ b/stream/tvi_dummy.c
@@ -20,6 +20,7 @@
#include "config.h"
#include <stdio.h>
+#include "common/common.h"
#include "video/img_fourcc.h"
#include "tv.h"
@@ -105,7 +106,7 @@ static int do_control(priv_t *priv, int cmd, void *arg)
static double grab_video_frame(priv_t *priv, char *buffer, int len)
{
memset(buffer, 0x42, len);
- return 1;
+ return MP_NOPTS_VALUE;
}
static int get_video_framesize(priv_t *priv)
@@ -117,7 +118,7 @@ static int get_video_framesize(priv_t *priv)
static double grab_audio_frame(priv_t *priv, char *buffer, int len)
{
memset(buffer, 0x42, len);
- return 1;
+ return MP_NOPTS_VALUE;
}
static int get_audio_framesize(priv_t *priv)