diff options
author | Martin Herkt <lachs0r@srsfckn.biz> | 2017-02-12 01:01:56 +0100 |
---|---|---|
committer | Martin Herkt <lachs0r@srsfckn.biz> | 2017-02-12 01:01:56 +0100 |
commit | 35aa705c3ece8293652ffcf449c71fe80b96e722 (patch) | |
tree | 7c0fb34ec96204cbcd867a973b2476689919a5b4 /stream | |
parent | 10a005df0c981050afc35184a42173bea7ea2527 (diff) | |
parent | 3739d1318fdb658bb6037bfe06bb6cefb3b50a09 (diff) | |
download | mpv-35aa705c3ece8293652ffcf449c71fe80b96e722.tar.bz2 mpv-35aa705c3ece8293652ffcf449c71fe80b96e722.tar.xz |
Merge branch 'master' into release/current
Diffstat (limited to 'stream')
-rw-r--r-- | stream/cache.c | 4 | ||||
-rw-r--r-- | stream/stream.c | 67 | ||||
-rw-r--r-- | stream/stream.h | 26 | ||||
-rw-r--r-- | stream/stream_avdevice.c | 2 | ||||
-rw-r--r-- | stream/stream_bluray.c | 3 | ||||
-rw-r--r-- | stream/stream_cdda.c | 1 | ||||
-rw-r--r-- | stream/stream_dvb.c | 3 | ||||
-rw-r--r-- | stream/stream_dvd.c | 1 | ||||
-rw-r--r-- | stream/stream_dvdnav.c | 3 | ||||
-rw-r--r-- | stream/stream_edl.c | 2 | ||||
-rw-r--r-- | stream/stream_file.c | 4 | ||||
-rw-r--r-- | stream/stream_lavf.c | 1 | ||||
-rw-r--r-- | stream/stream_mf.c | 1 | ||||
-rw-r--r-- | stream/stream_tv.c | 1 | ||||
-rw-r--r-- | stream/tv.c | 5 | ||||
-rw-r--r-- | stream/tvi_dummy.c | 5 |
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) |