mirror of
https://github.com/mpv-player/mpv
synced 2024-12-28 06:03:45 +01:00
initial precaching
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@3563 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
8b2f0c064d
commit
3db7b73bd9
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#define READ_USLEEP_TIME 10000
|
#define READ_USLEEP_TIME 10000
|
||||||
#define FILL_USLEEP_TIME 50000
|
#define FILL_USLEEP_TIME 50000
|
||||||
|
#define PREFILL_USLEEP_TIME 200000
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -31,6 +32,7 @@ typedef struct {
|
|||||||
int sector_size; // size of a single sector (2048/2324)
|
int sector_size; // size of a single sector (2048/2324)
|
||||||
int back_size; // we should keep back_size amount of old bytes for backward seek
|
int back_size; // we should keep back_size amount of old bytes for backward seek
|
||||||
int fill_limit; // we should fill buffer only if space>=fill_limit
|
int fill_limit; // we should fill buffer only if space>=fill_limit
|
||||||
|
int prefill; // we should fill min prefill bytes if cache gets empty
|
||||||
// filler's pointers:
|
// filler's pointers:
|
||||||
int eof;
|
int eof;
|
||||||
off_t min_filepos; // buffer contain only a part of the file, from min-max pos
|
off_t min_filepos; // buffer contain only a part of the file, from min-max pos
|
||||||
@ -183,6 +185,7 @@ cache_vars_t* cache_init(int size,int sector){
|
|||||||
s->buffer=shmem_alloc(s->buffer_size);
|
s->buffer=shmem_alloc(s->buffer_size);
|
||||||
s->fill_limit=8*sector;
|
s->fill_limit=8*sector;
|
||||||
s->back_size=size/2;
|
s->back_size=size/2;
|
||||||
|
s->prefill=size/20; // default: 5%
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,15 +194,31 @@ static void exit_sighandler(int x){
|
|||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void stream_enable_cache(stream_t *s,int size){
|
void stream_enable_cache(stream_t *stream,int size,float prefill_init,float prefill){
|
||||||
int ss=(s->type==STREAMTYPE_VCD)?VCD_SECTOR_DATA:STREAM_BUFFER_SIZE;
|
int ss=(stream->type==STREAMTYPE_VCD)?VCD_SECTOR_DATA:STREAM_BUFFER_SIZE;
|
||||||
s->cache_data=cache_init(size,ss);
|
int min=prefill_init*size;
|
||||||
((cache_vars_t*)s->cache_data)->stream=s; // callback
|
cache_vars_t* s=cache_init(size,ss);
|
||||||
if((s->cache_pid=fork())) return; // parent exits
|
stream->cache_data=s;
|
||||||
|
s->stream=stream; // callback
|
||||||
|
s->prefill=size*prefill;
|
||||||
|
|
||||||
|
if((stream->cache_pid=fork())){
|
||||||
|
// wait until cache is filled at least prefill_init %
|
||||||
|
while(s->read_filepos<s->min_filepos || s->max_filepos-s->read_filepos<min){
|
||||||
|
mp_msg(MSGT_CACHE,MSGL_STATUS,"\rCache fill: %5.2f%% (%d bytes) ",
|
||||||
|
(float)(s->max_filepos-s->read_filepos)/(float)(s->buffer_size),
|
||||||
|
s->max_filepos-s->read_filepos
|
||||||
|
);
|
||||||
|
if(s->eof) break; // file is smaller than prefill size
|
||||||
|
usleep(PREFILL_USLEEP_TIME);
|
||||||
|
}
|
||||||
|
return; // parent exits
|
||||||
|
}
|
||||||
|
|
||||||
// cache thread mainloop:
|
// cache thread mainloop:
|
||||||
signal(SIGTERM,exit_sighandler); // kill
|
signal(SIGTERM,exit_sighandler); // kill
|
||||||
while(1){
|
while(1){
|
||||||
if(!cache_fill(s->cache_data)){
|
if(!cache_fill(s)){
|
||||||
usleep(FILL_USLEEP_TIME); // idle
|
usleep(FILL_USLEEP_TIME); // idle
|
||||||
}
|
}
|
||||||
// cache_stats(s->cache_data);
|
// cache_stats(s->cache_data);
|
||||||
|
@ -42,7 +42,7 @@ typedef struct {
|
|||||||
} stream_t;
|
} stream_t;
|
||||||
|
|
||||||
#ifdef USE_STREAM_CACHE
|
#ifdef USE_STREAM_CACHE
|
||||||
void stream_enable_cache(stream_t *s,int size);
|
void stream_enable_cache(stream_t *stream,int size,float prefill_init,float prefill);
|
||||||
#else
|
#else
|
||||||
// no cache
|
// no cache
|
||||||
#define cache_stream_fill_buffer(x) stream_fill_buffer(x)
|
#define cache_stream_fill_buffer(x) stream_fill_buffer(x)
|
||||||
|
@ -46,7 +46,7 @@ int file_format=DEMUXER_TYPE_UNKNOWN;
|
|||||||
|
|
||||||
printf("success: format: %d data: 0x%X - 0x%X\n",file_format, (int)(stream->start_pos),(int)(stream->end_pos));
|
printf("success: format: %d data: 0x%X - 0x%X\n",file_format, (int)(stream->start_pos),(int)(stream->end_pos));
|
||||||
|
|
||||||
stream_enable_cache(stream,2048*1024);
|
stream_enable_cache(stream,2048*1024,0,0);
|
||||||
|
|
||||||
demuxer=demux_open(stream,file_format,-1,-1,-1);
|
demuxer=demux_open(stream,file_format,-1,-1,-1);
|
||||||
if(!demuxer){
|
if(!demuxer){
|
||||||
|
Loading…
Reference in New Issue
Block a user