summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cfg-mplayer.h5
-rw-r--r--mplayer.c19
-rw-r--r--mplayer.h2
-rw-r--r--options.h1
-rw-r--r--stream/cache2.c8
-rw-r--r--stream/http.c1
-rw-r--r--stream/network.c12
-rw-r--r--stream/stream.h3
-rw-r--r--timeline/tl_matroska.c54
9 files changed, 77 insertions, 28 deletions
diff --git a/cfg-mplayer.h b/cfg-mplayer.h
index fa5f35af6c..529df35caf 100644
--- a/cfg-mplayer.h
+++ b/cfg-mplayer.h
@@ -336,8 +336,9 @@ const m_option_t common_opts[] = {
// ------------------------- stream options --------------------
#ifdef CONFIG_STREAM_CACHE
- {"cache", &stream_cache_size, CONF_TYPE_INT, CONF_RANGE, 32, 0x7fffffff, NULL},
- {"no-cache", &stream_cache_size, CONF_TYPE_FLAG, 0, 1, 0, NULL},
+ OPT_INTRANGE("cache", stream_cache_size, 0, 32, 0x7fffffff, OPTDEF_INT(-1)),
+ OPT_FLAG_CONSTANTS("nocache", stream_cache_size, 0, -1, 0),
+
OPT_FLOATRANGE("cache-min", stream_cache_min_percent, 0, 0, 99),
OPT_FLOATRANGE("cache-seek-min", stream_cache_seek_min_percent, 0, 0, 99),
#endif /* CONFIG_STREAM_CACHE */
diff --git a/mplayer.c b/mplayer.c
index 66b5a236a7..0d2d97e5f3 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -221,9 +221,6 @@ int vobsub_id = -1;
static char *spudec_ifo = NULL;
int forced_subs_only = 0;
-// cache2:
-int stream_cache_size = -1;
-
// A-V sync:
static float default_max_pts_correction = -1;
float audio_delay = 0;
@@ -1252,7 +1249,7 @@ static void print_status(struct MPContext *mpctx, double a_pos, bool at_frame)
#ifdef CONFIG_STREAM_CACHE
// cache stats
- if (stream_cache_size > 0)
+ if (opts->stream_cache_size > 0)
saddf(line, width, " C: %d%%", cache_fill_status(mpctx->stream));
#endif
@@ -3286,7 +3283,7 @@ static void run_playloop(struct MPContext *mpctx)
#ifdef CONFIG_STREAM_CACHE
// The cache status is part of the status line. Possibly update it.
- if (mpctx->paused && stream_cache_size > 0)
+ if (mpctx->paused && opts->stream_cache_size > 0)
print_status(mpctx, MP_NOPTS_VALUE, false);
#endif
@@ -3804,13 +3801,11 @@ static void play_current_file(struct MPContext *mpctx)
// CACHE2: initial prefill: 20% later: 5% (should be set by -cacheopts)
goto_enable_cache:
- if (stream_cache_size > 0) {
- int res;
- float stream_cache_min_percent = opts->stream_cache_min_percent;
- float stream_cache_seek_min_percent = opts->stream_cache_seek_min_percent;
- res = stream_enable_cache(mpctx->stream, stream_cache_size * 1024ull,
- stream_cache_size * 1024ull * (stream_cache_min_percent / 100.0),
- stream_cache_size * 1024ull * (stream_cache_seek_min_percent / 100.0));
+ if (opts->stream_cache_size > 0) {
+ int res = stream_enable_cache_percent(mpctx->stream,
+ opts->stream_cache_size,
+ opts->stream_cache_min_percent,
+ opts->stream_cache_seek_min_percent);
if (res == 0)
if (libmpdemux_was_interrupted(mpctx))
goto terminate_playback;
diff --git a/mplayer.h b/mplayer.h
index 2c46d9ac85..d1618bf929 100644
--- a/mplayer.h
+++ b/mplayer.h
@@ -31,8 +31,6 @@ extern float audio_delay;
extern double force_fps;
-extern int stream_cache_size;
-
extern int frame_dropping;
extern int auto_quality;
diff --git a/options.h b/options.h
index 2b06535afd..e704c87cd7 100644
--- a/options.h
+++ b/options.h
@@ -48,6 +48,7 @@ typedef struct MPOpts {
int chapter_merge_threshold;
int quiet;
int noconfig;
+ int stream_cache_size;
float stream_cache_min_percent;
float stream_cache_seek_min_percent;
int chapterrange[2];
diff --git a/stream/cache2.c b/stream/cache2.c
index 77c74d3b19..9161027ee3 100644
--- a/stream/cache2.c
+++ b/stream/cache2.c
@@ -434,6 +434,14 @@ static void cache_mainloop(cache_vars_t *s) {
} while (cache_execute_control(s));
}
+int stream_enable_cache_percent(stream_t *stream, int64_t stream_cache_size,
+ float stream_cache_min_percent, float stream_cache_seek_min_percent)
+{
+ return stream_enable_cache(stream, stream_cache_size * 1024,
+ stream_cache_size * 1024 * (stream_cache_min_percent / 100.0),
+ stream_cache_size * 1024 * (stream_cache_seek_min_percent / 100.0));
+}
+
/**
* \return 1 on success, 0 if the function was interrupted and -1 on error
*/
diff --git a/stream/http.c b/stream/http.c
index cd68029025..8d930c6460 100644
--- a/stream/http.c
+++ b/stream/http.c
@@ -45,7 +45,6 @@
#include <libavutil/avutil.h>
-extern int stream_cache_size;
extern int network_bandwidth;
typedef struct {
diff --git a/stream/network.c b/stream/network.c
index 87b295e7e6..7d45ca71d9 100644
--- a/stream/network.c
+++ b/stream/network.c
@@ -29,6 +29,7 @@
#include <ctype.h>
#include "config.h"
+#include "options.h"
#include "mp_msg.h"
@@ -47,8 +48,6 @@
#include "cookies.h"
#include "url.h"
-extern int stream_cache_size;
-
/* Variables for the command line option -user, -passwd, -bandwidth,
-user-agent and -nocookies */
@@ -461,13 +460,14 @@ nop_streaming_seek( int fd, off_t pos, streaming_ctrl_t *stream_ctrl ) {
void fixup_network_stream_cache(stream_t *stream) {
+ struct MPOpts *opts = stream->opts;
if(stream->streaming_ctrl->buffering) {
- if(stream_cache_size<0) {
+ if(opts->stream_cache_size<0) {
// cache option not set, will use our computed value.
// buffer in KBytes, *5 because the prefill is 20% of the buffer.
- stream_cache_size = (stream->streaming_ctrl->prebuffer_size/1024)*5;
- if( stream_cache_size<64 ) stream_cache_size = 64; // 16KBytes min buffer
+ opts->stream_cache_size = (stream->streaming_ctrl->prebuffer_size/1024)*5;
+ if( opts->stream_cache_size<64 ) opts->stream_cache_size = 64; // 16KBytes min buffer
}
- mp_tmsg(MSGT_NETWORK,MSGL_INFO,"Cache size set to %d KBytes\n", stream_cache_size);
+ mp_tmsg(MSGT_NETWORK,MSGL_INFO,"Cache size set to %d KBytes\n", opts->stream_cache_size);
}
}
diff --git a/stream/stream.h b/stream/stream.h
index eeb2f769bd..0cee8498eb 100644
--- a/stream/stream.h
+++ b/stream/stream.h
@@ -184,6 +184,8 @@ int stream_fill_buffer(stream_t *s);
int stream_seek_long(stream_t *s, off_t pos);
#ifdef CONFIG_STREAM_CACHE
+int stream_enable_cache_percent(stream_t *stream, int64_t stream_cache_size,
+ float stream_cache_min_percent, float stream_cache_seek_min_percent);
int stream_enable_cache(stream_t *stream,int64_t size,int64_t min,int64_t prefill);
int cache_stream_fill_buffer(stream_t *s);
int cache_stream_seek_long(stream_t *s,int64_t pos);
@@ -192,6 +194,7 @@ int cache_stream_seek_long(stream_t *s,int64_t pos);
#define cache_stream_fill_buffer(x) stream_fill_buffer(x)
#define cache_stream_seek_long(x,y) stream_seek_long(x,y)
#define stream_enable_cache(x,y,z,w) 1
+#define stream_enable_cache_percent(x,y,z,w) 1
#endif
int stream_write_buffer(stream_t *s, unsigned char *buf, int len);
diff --git a/timeline/tl_matroska.c b/timeline/tl_matroska.c
index 4edc8d494e..30694fff24 100644
--- a/timeline/tl_matroska.c
+++ b/timeline/tl_matroska.c
@@ -112,6 +112,50 @@ static char **find_files(const char *original_file, const char *suffix)
return results;
}
+static struct demuxer *open_demuxer(struct stream *stream,
+ struct MPContext *mpctx, char *filename, unsigned char uid_map[][16])
+{
+ return demux_open_withparams(&mpctx->opts, stream,
+ DEMUXER_TYPE_MATROSKA, NULL, mpctx->opts.audio_id,
+ mpctx->opts.video_id, mpctx->opts.sub_id, filename,
+ &(struct demuxer_params){.matroska_wanted_uids = uid_map});
+}
+
+static int enable_cache(struct MPContext *mpctx, struct stream **stream,
+ struct demuxer **demuxer, unsigned char uid_map[][16])
+{
+ struct MPOpts *opts = &mpctx->opts;
+
+ if (opts->stream_cache_size <= 0)
+ return 0;
+
+ char *filename = talloc_strdup(NULL, (*demuxer)->filename);
+ free_demuxer(*demuxer);
+ free_stream(*stream);
+
+ int format = 0;
+ *stream = open_stream(filename, &mpctx->opts, &format);
+ if (!*stream) {
+ talloc_free(filename);
+ return -1;
+ }
+
+ stream_enable_cache_percent(*stream,
+ opts->stream_cache_size,
+ opts->stream_cache_min_percent,
+ opts->stream_cache_seek_min_percent);
+
+ *demuxer = open_demuxer(*stream, mpctx, filename, uid_map);
+ if (!*demuxer) {
+ talloc_free(filename);
+ free_stream(*stream);
+ return -1;
+ }
+
+ talloc_free(filename);
+ return 1;
+}
+
static int find_ordered_chapter_sources(struct MPContext *mpctx,
struct demuxer **sources,
int num_sources,
@@ -140,11 +184,7 @@ static int find_ordered_chapter_sources(struct MPContext *mpctx,
struct stream *s = open_stream(filenames[i], &mpctx->opts, &format);
if (!s)
continue;
- struct demuxer *d = demux_open_withparams(&mpctx->opts, s,
- DEMUXER_TYPE_MATROSKA, NULL, mpctx->opts.audio_id,
- mpctx->opts.video_id, mpctx->opts.sub_id, filenames[i],
- &(struct demuxer_params){.matroska_wanted_uids = uid_map});
-
+ struct demuxer *d = open_demuxer(s, mpctx, filenames[i], uid_map);
if (!d) {
free_stream(s);
@@ -157,6 +197,10 @@ static int find_ordered_chapter_sources(struct MPContext *mpctx,
if (!memcmp(uid_map[i], d->matroska_data.segment_uid, 16)) {
mp_msg(MSGT_CPLAYER, MSGL_INFO,"Match for source %d: %s\n",
i, d->filename);
+
+ if (enable_cache(mpctx, &s, &d, uid_map) < 0)
+ continue;
+
sources[i] = d;
num_left--;
goto match;