summaryrefslogtreecommitdiffstats
path: root/stream
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2012-12-01 23:28:58 +0100
committerwm4 <wm4@nowhere>2012-12-03 21:08:51 +0100
commit6294c785490be5fc31d29758ca592510fd161371 (patch)
treea03c9135534f28cf7e9a62abcde87c65eb54eeaa /stream
parent2d58234c86e59298de52fec12d1eb59086d68763 (diff)
downloadmpv-6294c785490be5fc31d29758ca592510fd161371.tar.bz2
mpv-6294c785490be5fc31d29758ca592510fd161371.tar.xz
cache: simplify further
This commit is separate from the previous one to separate our own changes from changes merged from mplayer2 (as far as that was possible). Make it easier for stream implementations to request being cached. Set a default cache size in stream.c, and remove them from various stream implementations. Only MS streaming support sets a meaningful cache size. Make querying cache size saner. This reduces the amount of #ifdefs needed.
Diffstat (limited to 'stream')
-rw-r--r--stream/asf_mmst_streaming.c2
-rw-r--r--stream/asf_streaming.c11
-rw-r--r--stream/cache2.c20
-rw-r--r--stream/cache2.h1
-rw-r--r--stream/http.c6
-rw-r--r--stream/stream.c10
-rw-r--r--stream/stream.h9
-rw-r--r--stream/stream_udp.c3
8 files changed, 28 insertions, 34 deletions
diff --git a/stream/asf_mmst_streaming.c b/stream/asf_mmst_streaming.c
index 371e256da5..98c386d11d 100644
--- a/stream/asf_mmst_streaming.c
+++ b/stream/asf_mmst_streaming.c
@@ -671,8 +671,8 @@ int asf_mmst_streaming_start(stream_t *stream)
stream->fd = s;
stream->streaming_ctrl->streaming_read = asf_mmst_streaming_read;
stream->streaming_ctrl->streaming_seek = asf_mmst_streaming_seek;
- stream->streaming_ctrl->buffering = 1;
stream->streaming_ctrl->status = streaming_playing_e;
+ stream->streaming = true;
packet_length1 = packet_length;
mp_msg(MSGT_NETWORK,MSGL_INFO,"mmst packet_length = %d\n", packet_length);
diff --git a/stream/asf_streaming.c b/stream/asf_streaming.c
index 31e0d71b89..9b6e2e3a64 100644
--- a/stream/asf_streaming.c
+++ b/stream/asf_streaming.c
@@ -166,7 +166,8 @@ static int max_idx(int s_count, int *s_rates, int bound) {
return best;
}
-static int asf_streaming_parse_header(int fd, streaming_ctrl_t* streaming_ctrl) {
+static int asf_streaming_parse_header(stream_t *s, int fd) {
+ streaming_ctrl_t* streaming_ctrl = s->streaming_ctrl;
ASF_stream_chunck_t chunk;
asf_http_streaming_ctrl_t* asf_ctrl = streaming_ctrl->data;
char* buffer=NULL, *chunk_buffer=NULL;
@@ -246,7 +247,9 @@ static int asf_streaming_parse_header(int fd, streaming_ctrl_t* streaming_ctrl)
asf_ctrl->packet_size = AV_RL32(&fileh->max_packet_size);
// before playing.
// preroll: time in ms to bufferize before playing
- streaming_ctrl->prebuffer_size = (unsigned int)(((double)fileh->preroll/1000.0)*((double)fileh->max_bitrate/8.0));
+ unsigned int preroll = (unsigned int)(((double)fileh->preroll/1000.0)*((double)fileh->max_bitrate/8.0));
+ // buffer in KBytes, *5 assuming the prefill is 20% of the buffer.
+ s->cache_size = preroll / 1024 * 5;
}
pos = start;
@@ -754,7 +757,7 @@ static int asf_http_streaming_start( stream_t *stream, int *demuxer_type ) {
if( asf_http_ctrl->request==1 ) {
if( asf_http_ctrl->streaming_type!=ASF_PlainText_e ) {
// First request, we only got the ASF header.
- ret = asf_streaming_parse_header(fd,stream->streaming_ctrl);
+ ret = asf_streaming_parse_header(stream,fd);
if(ret < 0) goto err_out;
if(asf_http_ctrl->n_audio == 0 && asf_http_ctrl->n_video == 0) {
mp_tmsg(MSGT_NETWORK,MSGL_ERR,"No stream found.\n");
@@ -796,7 +799,7 @@ static int asf_http_streaming_start( stream_t *stream, int *demuxer_type ) {
} else {
stream->streaming_ctrl->streaming_read = asf_http_streaming_read;
stream->streaming_ctrl->streaming_seek = asf_http_streaming_seek;
- stream->streaming_ctrl->buffering = 1;
+ stream->streaming = true;
}
stream->streaming_ctrl->status = streaming_playing_e;
stream->close = close_s;
diff --git a/stream/cache2.c b/stream/cache2.c
index 27147d00fb..8b35150321 100644
--- a/stream/cache2.c
+++ b/stream/cache2.c
@@ -360,9 +360,9 @@ static cache_vars_t* cache_init(int64_t size,int sector){
memset(s,0,sizeof(cache_vars_t));
num=size/sector;
- if(num < 16){
- num = 16;
- }//32kb min_size
+ if(num < 32){
+ num = 32;
+ }//64kb min_size
s->buffer_size=num*sector;
s->sector_size=sector;
s->buffer=shared_alloc(s->buffer_size);
@@ -583,14 +583,6 @@ int cache_stream_fill_buffer(stream_t *s){
}
-int cache_fill_status(stream_t *s) {
- cache_vars_t *cv;
- if (!s || !s->cache_data)
- return -1;
- cv = s->cache_data;
- return (cv->max_filepos-cv->read_filepos)/(cv->buffer_size / 100);
-}
-
int cache_stream_seek_long(stream_t *stream,int64_t pos){
cache_vars_t* s;
int64_t newpos;
@@ -626,6 +618,12 @@ int cache_do_control(stream_t *stream, int cmd, void *arg) {
int pos_change = 0;
cache_vars_t* s = stream->cache_data;
switch (cmd) {
+ case STREAM_CTRL_GET_CACHE_SIZE:
+ *(int64_t *)arg = s->buffer_size;
+ return STREAM_OK;
+ case STREAM_CTRL_GET_CACHE_FILL:
+ *(int64_t *)arg = s->max_filepos - s->read_filepos;
+ return STREAM_OK;
case STREAM_CTRL_SEEK_TO_TIME:
s->control_double_arg = *(double *)arg;
s->control = cmd;
diff --git a/stream/cache2.h b/stream/cache2.h
index 9c98193f0c..330558333e 100644
--- a/stream/cache2.h
+++ b/stream/cache2.h
@@ -23,6 +23,5 @@
void cache_uninit(stream_t *s);
int cache_do_control(stream_t *stream, int cmd, void *arg);
-int cache_fill_status(stream_t *s);
#endif /* MPLAYER_CACHE2_H */
diff --git a/stream/http.c b/stream/http.c
index c77e7e05c5..8b71435d2f 100644
--- a/stream/http.c
+++ b/stream/http.c
@@ -214,9 +214,8 @@ static int scast_streaming_start(stream_t *stream) {
stream->streaming_ctrl->data = scast_data;
stream->streaming_ctrl->streaming_read = scast_streaming_read;
stream->streaming_ctrl->streaming_seek = NULL;
- stream->streaming_ctrl->prebuffer_size = 64 * 1024; // 64 KBytes
- stream->streaming_ctrl->buffering = 1;
stream->streaming_ctrl->status = streaming_playing_e;
+ stream->streaming = true;
return 0;
}
@@ -293,9 +292,8 @@ static int nop_streaming_start( stream_t *stream ) {
stream->streaming_ctrl->streaming_read = nop_streaming_read;
stream->streaming_ctrl->streaming_seek = nop_streaming_seek;
- stream->streaming_ctrl->prebuffer_size = 64*1024; // 64 KBytes
- stream->streaming_ctrl->buffering = 1;
stream->streaming_ctrl->status = streaming_playing_e;
+ stream->streaming = true;
return 0;
}
diff --git a/stream/stream.c b/stream/stream.c
index bd87448fac..6e0644e59c 100644
--- a/stream/stream.c
+++ b/stream/stream.c
@@ -183,13 +183,9 @@ static stream_t *open_stream_plugin(const stream_info_t *sinfo,
return NULL;
}
- s->cache_size = 0;
- if (s->streaming_ctrl && s->streaming_ctrl->buffering) {
+ if (s->streaming && !s->cache_size) {
// Set default cache size to use if user does not specify it.
- // buffer in KBytes, *5 assuming the prefill is 20% of the buffer.
- s->cache_size = s->streaming_ctrl->prebuffer_size / 1024 * 5;
- if (s->cache_size < 64)
- s->cache_size = 64;
+ s->cache_size = 320;
}
if(s->type <= -2)
@@ -480,11 +476,11 @@ void stream_reset(stream_t *s){
}
int stream_control(stream_t *s, int cmd, void *arg){
- if(!s->control) return STREAM_UNSUPPORTED;
#ifdef CONFIG_STREAM_CACHE
if (s->cache_pid)
return cache_do_control(s, cmd, arg);
#endif
+ if(!s->control) return STREAM_UNSUPPORTED;
return s->control(s, cmd, arg);
}
diff --git a/stream/stream.h b/stream/stream.h
index dd092ddaec..a112b0f3f6 100644
--- a/stream/stream.h
+++ b/stream/stream.h
@@ -98,6 +98,8 @@
#define STREAM_CTRL_GET_NUM_TITLES 12
#define STREAM_CTRL_GET_LANG 13
#define STREAM_CTRL_GET_CURRENT_TITLE 14
+#define STREAM_CTRL_GET_CACHE_SIZE 15
+#define STREAM_CTRL_GET_CACHE_FILL 16
struct stream_lang_req {
int type; // STREAM_AUDIO, STREAM_SUB
@@ -113,8 +115,6 @@ typedef enum {
typedef struct streaming_control {
URL_t *url;
streaming_status status;
- int buffering; // boolean
- unsigned int prebuffer_size;
char *buffer;
unsigned int buffer_size;
unsigned int buffer_pos;
@@ -167,8 +167,9 @@ typedef struct stream {
int64_t pos,start_pos,end_pos;
int eof;
int mode; //STREAM_READ or STREAM_WRITE
- int cache_size; // cache size to use if enabled
- bool cached;
+ bool streaming; // known to be a network stream if true
+ int cache_size; // cache size in KB to use if enabled
+ bool cached; // cache active
unsigned int cache_pid;
void* cache_data;
void* priv; // used for DVD, TV, RTSP etc
diff --git a/stream/stream_udp.c b/stream/stream_udp.c
index 22b9cefc57..fc7da19aa0 100644
--- a/stream/stream_udp.c
+++ b/stream/stream_udp.c
@@ -51,9 +51,8 @@ udp_streaming_start (stream_t *stream)
streaming_ctrl->streaming_read = nop_streaming_read;
streaming_ctrl->streaming_seek = nop_streaming_seek;
- streaming_ctrl->prebuffer_size = 64 * 1024; /* 64 KBytes */
- streaming_ctrl->buffering = 0;
streaming_ctrl->status = streaming_playing_e;
+ stream->streaming = false;
return 0;
}