annotate libmpdemux/cache2.c @ 4559:5dc383bb1c82

added mga_top_reserved module parameter to skip a configurable amount of space at the top of video memory. this is needed to prevent corruption of the kernel's console font when using the "fastfont" option with matroxfb.
author rfelker
date Thu, 07 Feb 2002 02:07:29 +0000
parents 1acf2f1f9dc8
children 41d2da3bd082
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2324
0e4210657f0e ehh. include config.h... 10l
arpi
parents: 2322
diff changeset
1 #include "config.h"
0e4210657f0e ehh. include config.h... 10l
arpi
parents: 2322
diff changeset
2
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
3 #ifdef USE_STREAM_CACHE
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
4
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
5 // Initial draft of my new cache system...
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
6 // Note it runs in 2 processes (using fork()), but doesn't requires locking!!
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
7 // TODO: seeking, data consistency checking
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
8
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
9 #define READ_USLEEP_TIME 10000
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
10 #define FILL_USLEEP_TIME 50000
3562
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
11 #define PREFILL_USLEEP_TIME 200000
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
12
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
13 #include <stdio.h>
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
14 #include <stdlib.h>
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
15 #include <string.h>
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
16 #include <signal.h>
3726
1acf2f1f9dc8 missing #include's
pl
parents: 3600
diff changeset
17 #include <sys/types.h>
1acf2f1f9dc8 missing #include's
pl
parents: 3600
diff changeset
18 #include <unistd.h>
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
19
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
20 #include "../linux/shmem.h"
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
21
2371
0f2cad867121 printf->mp_msg
arpi
parents: 2352
diff changeset
22 #include "mp_msg.h"
0f2cad867121 printf->mp_msg
arpi
parents: 2352
diff changeset
23
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
24 #include "stream.h"
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
25
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
26 int stream_fill_buffer(stream_t *s);
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
27 int stream_seek_long(stream_t *s,off_t pos);
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
28
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
29
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
30 typedef struct {
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
31 // constats:
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
32 unsigned char *buffer; // base pointer of the alllocated buffer memory
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
33 int buffer_size; // size of the alllocated buffer memory
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
34 int sector_size; // size of a single sector (2048/2324)
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
35 int back_size; // we should keep back_size amount of old bytes for backward seek
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
36 int fill_limit; // we should fill buffer only if space>=fill_limit
3562
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
37 int prefill; // we should fill min prefill bytes if cache gets empty
2374
eb6f70125851 largefileization
arpi
parents: 2371
diff changeset
38 // filler's pointers:
eb6f70125851 largefileization
arpi
parents: 2371
diff changeset
39 int eof;
eb6f70125851 largefileization
arpi
parents: 2371
diff changeset
40 off_t min_filepos; // buffer contain only a part of the file, from min-max pos
eb6f70125851 largefileization
arpi
parents: 2371
diff changeset
41 off_t max_filepos;
eb6f70125851 largefileization
arpi
parents: 2371
diff changeset
42 off_t offset; // filepos <-> bufferpos offset value (filepos of the buffer's first byte)
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
43 // reader's pointers:
2374
eb6f70125851 largefileization
arpi
parents: 2371
diff changeset
44 off_t read_filepos;
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
45 // commands/locking:
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
46 // int seek_lock; // 1 if we will seek/reset buffer, 2 if we are ready for cmd
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
47 // int fifo_flag; // 1 if we should use FIFO to notice cache about buffer reads.
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
48 // callback
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
49 stream_t* stream;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
50 } cache_vars_t;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
51
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
52 static int min_fill=0;
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
53 static int sleep_flag=0;
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
54
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
55 int cache_fill_status=0;
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
56
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
57 void cache_stats(cache_vars_t* s){
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
58 int newb=s->max_filepos-s->read_filepos; // new bytes in the buffer
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
59 printf("0x%06X [0x%06X] 0x%06X ",s->min_filepos,s->read_filepos,s->max_filepos);
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
60 printf("%3d %% (%3d%%)\n",100*newb/s->buffer_size,100*min_fill/s->buffer_size);
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
61 }
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
62
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
63 int cache_read(cache_vars_t* s,unsigned char* buf,int size){
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
64 int total=0;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
65 while(size>0){
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
66 int pos,newb,len;
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
67
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
68 //printf("CACHE2_READ: 0x%X <= 0x%X <= 0x%X \n",s->min_filepos,s->read_filepos,s->max_filepos);
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
69
2374
eb6f70125851 largefileization
arpi
parents: 2371
diff changeset
70 if(s->read_filepos>=s->max_filepos || s->read_filepos<s->min_filepos){
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
71 // eof?
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
72 if(s->eof) break;
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
73 // waiting for buffer fill...
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
74 usleep(READ_USLEEP_TIME); // 10ms
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
75 continue; // try again...
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
76 }
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
77
2374
eb6f70125851 largefileization
arpi
parents: 2371
diff changeset
78 newb=s->max_filepos-s->read_filepos; // new bytes in the buffer
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
79 if(newb<min_fill) min_fill=newb; // statistics...
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
80
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
81 // printf("*** newb: %d bytes ***\n",newb);
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
82
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
83 pos=s->read_filepos - s->offset;
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
84 if(pos<0) pos+=s->buffer_size; else
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
85 if(pos>=s->buffer_size) pos-=s->buffer_size;
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
86
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
87 if(newb>s->buffer_size-pos) newb=s->buffer_size-pos; // handle wrap...
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
88 if(newb>size) newb=size;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
89
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
90 // check:
2371
0f2cad867121 printf->mp_msg
arpi
parents: 2352
diff changeset
91 if(s->read_filepos<s->min_filepos) mp_msg(MSGT_CACHE,MSGL_ERR,"Ehh. s->read_filepos<s->min_filepos !!! Report bug...\n");
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
92
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
93 // len=write(mem,newb)
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
94 //printf("Buffer read: %d bytes\n",newb);
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
95 memcpy(buf,&s->buffer[pos],newb);
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
96 buf+=newb;
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
97 len=newb;
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
98 // ...
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
99
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
100 s->read_filepos+=len;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
101 size-=len;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
102 total+=len;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
103
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
104 }
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
105 cache_fill_status=100*(s->max_filepos-s->read_filepos)/s->buffer_size;
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
106 return total;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
107 }
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
108
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
109 int cache_fill(cache_vars_t* s){
2374
eb6f70125851 largefileization
arpi
parents: 2371
diff changeset
110 int back,back2,newb,space,len,pos,endpos;
eb6f70125851 largefileization
arpi
parents: 2371
diff changeset
111 off_t read=s->read_filepos;
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
112
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
113 if(read<s->min_filepos || read>s->max_filepos){
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
114 // seek...
2371
0f2cad867121 printf->mp_msg
arpi
parents: 2352
diff changeset
115 mp_msg(MSGT_CACHE,MSGL_DBG2,"Out of boundaries... seeking to 0x%X \n",read);
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
116 s->offset= // FIXME!?
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
117 s->min_filepos=s->max_filepos=read; // drop cache content :(
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
118 if(s->stream->eof) stream_reset(s->stream);
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
119 stream_seek(s->stream,read);
2371
0f2cad867121 printf->mp_msg
arpi
parents: 2352
diff changeset
120 mp_msg(MSGT_CACHE,MSGL_DBG2,"Seek done. new pos: 0x%X \n",(int)stream_tell(s->stream));
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
121 }
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
122
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
123 // calc number of back-bytes:
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
124 back=read - s->min_filepos;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
125 if(back<0) back=0; // strange...
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
126 if(back>s->back_size) back=s->back_size;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
127
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
128 // calc number of new bytes:
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
129 newb=s->max_filepos - read;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
130 if(newb<0) newb=0; // strange...
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
131
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
132 // calc free buffer space:
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
133 space=s->buffer_size - (newb+back);
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
134
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
135 // calc bufferpos:
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
136 pos=s->max_filepos - s->offset;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
137 if(pos>=s->buffer_size) pos-=s->buffer_size; // wrap-around
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
138
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
139 if(space<s->fill_limit){
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
140 // printf("Buffer is full (%d bytes free, limit: %d)\n",space,s->fill_limit);
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
141 return 0; // no fill...
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
142 }
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
143
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
144 // printf("### read=0x%X back=%d newb=%d space=%d pos=%d\n",read,back,newb,space,pos);
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
145
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
146 // reduce space if needed:
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
147 if(space>s->buffer_size-pos) space=s->buffer_size-pos;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
148
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
149 // if(space>32768) space=32768; // limit one-time block size
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
150 if(space>4*s->sector_size) space=4*s->sector_size;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
151
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
152 // if(s->seek_lock) return 0; // FIXME
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
153
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
154 #if 1
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
155 // back+newb+space <= buffer_size
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
156 back2=s->buffer_size-(space+newb); // max back size
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
157 if(s->min_filepos<(read-back2)) s->min_filepos=read-back2;
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
158 #else
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
159 s->min_filepos=read-back; // avoid seeking-back to temp area...
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
160 #endif
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
161
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
162 // ....
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
163 //printf("Buffer fill: %d bytes of %d\n",space,s->buffer_size);
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
164 //len=stream_fill_buffer(s->stream);
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
165 //memcpy(&s->buffer[pos],s->stream->buffer,len); // avoid this extra copy!
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
166 // ....
2348
76778e307ddc EOF bug fixed
arpi
parents: 2327
diff changeset
167 len=stream_read(s->stream,&s->buffer[pos],space);
76778e307ddc EOF bug fixed
arpi
parents: 2327
diff changeset
168 if(!len) s->eof=1;
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
169
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
170 s->max_filepos+=len;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
171 if(pos+len>=s->buffer_size){
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
172 // wrap...
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
173 s->offset+=s->buffer_size;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
174 }
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
175
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
176 return len;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
177
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
178 }
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
179
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
180 cache_vars_t* cache_init(int size,int sector){
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
181 int num;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
182 cache_vars_t* s=shmem_alloc(sizeof(cache_vars_t));
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
183 memset(s,0,sizeof(cache_vars_t));
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
184 num=size/sector;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
185 s->buffer_size=num*sector;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
186 s->sector_size=sector;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
187 s->buffer=shmem_alloc(s->buffer_size);
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
188 s->fill_limit=8*sector;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
189 s->back_size=size/2;
3562
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
190 s->prefill=size/20; // default: 5%
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
191 return s;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
192 }
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
193
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
194 static void exit_sighandler(int x){
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
195 // close stream
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
196 exit(0);
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
197 }
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
198
3600
3094e7b6a15b pre-cache fixed
arpi
parents: 3562
diff changeset
199 void stream_enable_cache(stream_t *stream,int size,int min,int prefill){
3562
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
200 int ss=(stream->type==STREAMTYPE_VCD)?VCD_SECTOR_DATA:STREAM_BUFFER_SIZE;
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
201 cache_vars_t* s=cache_init(size,ss);
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
202 stream->cache_data=s;
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
203 s->stream=stream; // callback
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
204 s->prefill=size*prefill;
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
205
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
206 if((stream->cache_pid=fork())){
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
207 // wait until cache is filled at least prefill_init %
3600
3094e7b6a15b pre-cache fixed
arpi
parents: 3562
diff changeset
208 printf("CACHE_PRE_INIT: %d [%d] %d pre:%d eof:%d \n",
3094e7b6a15b pre-cache fixed
arpi
parents: 3562
diff changeset
209 s->min_filepos,s->read_filepos,s->max_filepos,min,s->eof);
3562
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
210 while(s->read_filepos<s->min_filepos || s->max_filepos-s->read_filepos<min){
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
211 mp_msg(MSGT_CACHE,MSGL_STATUS,"\rCache fill: %5.2f%% (%d bytes) ",
3600
3094e7b6a15b pre-cache fixed
arpi
parents: 3562
diff changeset
212 100.0*(float)(s->max_filepos-s->read_filepos)/(float)(s->buffer_size),
3562
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
213 s->max_filepos-s->read_filepos
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
214 );
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
215 if(s->eof) break; // file is smaller than prefill size
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
216 usleep(PREFILL_USLEEP_TIME);
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
217 }
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
218 return; // parent exits
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
219 }
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
220
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
221 // cache thread mainloop:
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
222 signal(SIGTERM,exit_sighandler); // kill
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
223 while(1){
3562
e84d6c8ff59b initial precaching
arpi
parents: 2374
diff changeset
224 if(!cache_fill(s)){
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
225 usleep(FILL_USLEEP_TIME); // idle
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
226 }
2327
2332ba356d03 print stats at read instead of fill
arpi
parents: 2324
diff changeset
227 // cache_stats(s->cache_data);
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
228 }
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
229 }
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
230
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
231 int cache_stream_fill_buffer(stream_t *s){
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
232 int len;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
233 if(s->eof){ s->buf_pos=s->buf_len=0; return 0; }
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
234 if(!s->cache_pid) return stream_fill_buffer(s);
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
235
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
236 // cache_stats(s->cache_data);
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
237
2371
0f2cad867121 printf->mp_msg
arpi
parents: 2352
diff changeset
238 if(s->pos!=((cache_vars_t*)s->cache_data)->read_filepos) mp_msg(MSGT_CACHE,MSGL_ERR,"!!! read_filepos differs!!! report this bug...\n");
2327
2332ba356d03 print stats at read instead of fill
arpi
parents: 2324
diff changeset
239
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
240 len=cache_read(s->cache_data,s->buffer, ((cache_vars_t*)s->cache_data)->sector_size);
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
241 //printf("cache_stream_fill_buffer->read -> %d\n",len);
2327
2332ba356d03 print stats at read instead of fill
arpi
parents: 2324
diff changeset
242
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
243 if(len<=0){ s->eof=1; s->buf_pos=s->buf_len=0; return 0; }
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
244 s->buf_pos=0;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
245 s->buf_len=len;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
246 s->pos+=len;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
247 // printf("[%d]",len);fflush(stdout);
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
248 return len;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
249
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
250 }
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
251
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
252 int cache_stream_seek_long(stream_t *stream,off_t pos){
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
253 cache_vars_t* s;
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
254 off_t newpos;
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
255 if(!stream->cache_pid) return stream_seek_long(stream,pos);
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
256
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
257 s=stream->cache_data;
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
258 // s->seek_lock=1;
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
259
2371
0f2cad867121 printf->mp_msg
arpi
parents: 2352
diff changeset
260 mp_msg(MSGT_CACHE,MSGL_DBG2,"CACHE2_SEEK: 0x%X <= 0x%X (0x%X) <= 0x%X \n",s->min_filepos,(int)pos,s->read_filepos,s->max_filepos);
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
261
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
262 newpos=pos/s->sector_size; newpos*=s->sector_size; // align
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
263 stream->pos=s->read_filepos=newpos;
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
264 s->eof=0; // !!!!!!!
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
265
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
266 cache_stream_fill_buffer(stream);
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
267
2352
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
268 pos-=newpos;
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
269 if(pos>=0 && pos<=stream->buf_len){
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
270 stream->buf_pos=pos; // byte position in sector
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
271 return 1;
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
272 }
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
273
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
274 // stream->buf_pos=stream->buf_len=0;
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
275 // return 1;
3b22db95aaf6 cache seeking fixed(?)
arpi
parents: 2348
diff changeset
276
2371
0f2cad867121 printf->mp_msg
arpi
parents: 2352
diff changeset
277 #ifdef _LARGEFILE_SOURCE
0f2cad867121 printf->mp_msg
arpi
parents: 2352
diff changeset
278 mp_msg(MSGT_CACHE,MSGL_V,"cache_stream_seek: WARNING! Can't seek to 0x%llX !\n",(long long)(pos+newpos));
0f2cad867121 printf->mp_msg
arpi
parents: 2352
diff changeset
279 #else
0f2cad867121 printf->mp_msg
arpi
parents: 2352
diff changeset
280 mp_msg(MSGT_CACHE,MSGL_V,"cache_stream_seek: WARNING! Can't seek to 0x%X !\n",(pos+newpos));
0f2cad867121 printf->mp_msg
arpi
parents: 2352
diff changeset
281 #endif
2322
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
282 return 0;
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
283 }
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
284
e22ec6fce385 cache2 support
arpi
parents:
diff changeset
285 #endif