Mercurial > mplayer.hg
annotate stream/cache2.c @ 27409:e2de11109139
If (has outline) blur(outline) else blur(glyph).
If there is an outline, the glyph itself should not be blurred. Keeps
the border between glyph and outline clear (unblurred), which is
probably how it should be.
Patch by Diogo Franco (diogomfranco gmail com).
author | eugeni |
---|---|
date | Thu, 07 Aug 2008 22:20:58 +0000 |
parents | 5fe6a8adf569 |
children | fb67a8f56bfc |
rev | line source |
---|---|
2324 | 1 #include "config.h" |
2 | |
2322 | 3 // Initial draft of my new cache system... |
2352 | 4 // Note it runs in 2 processes (using fork()), but doesn't requires locking!! |
2322 | 5 // TODO: seeking, data consistency checking |
6 | |
2352 | 7 #define READ_USLEEP_TIME 10000 |
8 #define FILL_USLEEP_TIME 50000 | |
4825
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
3726
diff
changeset
|
9 #define PREFILL_SLEEP_TIME 200 |
26833
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
10 #define CONTROL_SLEEP_TIME 0 |
2322 | 11 |
12 #include <stdio.h> | |
13 #include <stdlib.h> | |
14 #include <string.h> | |
15 #include <signal.h> | |
3726 | 16 #include <sys/types.h> |
17 #include <unistd.h> | |
2322 | 18 |
17012 | 19 #include "osdep/timer.h" |
26077 | 20 #ifdef WIN32 |
21 #include <windows.h> | |
22 static DWORD WINAPI ThreadProc(void* s); | |
23 #elif defined(__OS2__) | |
24 #define INCL_DOS | |
25 #include <os2.h> | |
26 static void ThreadProc( void *s ); | |
27 #else | |
10242 | 28 #include <sys/wait.h> |
17012 | 29 #include "osdep/shmem.h" |
10197 | 30 #endif |
2322 | 31 |
2371 | 32 #include "mp_msg.h" |
16793
8d4fb5469efb
Make a few more messages translatable by moving them into help_mp-en.h.
diego
parents:
16750
diff
changeset
|
33 #include "help_mp.h" |
2371 | 34 |
2322 | 35 #include "stream.h" |
24697
8f2154e066cf
Make sure forked code does not try to display a GTK message box (and thus crashes)
reimar
parents:
22142
diff
changeset
|
36 extern int use_gui; |
2322 | 37 |
38 int stream_fill_buffer(stream_t *s); | |
39 int stream_seek_long(stream_t *s,off_t pos); | |
40 | |
41 typedef struct { | |
42 // constats: | |
43 unsigned char *buffer; // base pointer of the alllocated buffer memory | |
2352 | 44 int buffer_size; // size of the alllocated buffer memory |
45 int sector_size; // size of a single sector (2048/2324) | |
46 int back_size; // we should keep back_size amount of old bytes for backward seek | |
47 int fill_limit; // we should fill buffer only if space>=fill_limit | |
16152
10a69a812eff
remove unused cache-prefill and create cache-seek-min that controls when seek_long is prefered over waiting for cache to fill
iive
parents:
12899
diff
changeset
|
48 int seek_limit; // keep filling cache if distanse is less that seek limit |
2374 | 49 // filler's pointers: |
50 int eof; | |
51 off_t min_filepos; // buffer contain only a part of the file, from min-max pos | |
52 off_t max_filepos; | |
53 off_t offset; // filepos <-> bufferpos offset value (filepos of the buffer's first byte) | |
2322 | 54 // reader's pointers: |
2374 | 55 off_t read_filepos; |
2322 | 56 // commands/locking: |
2352 | 57 // int seek_lock; // 1 if we will seek/reset buffer, 2 if we are ready for cmd |
58 // int fifo_flag; // 1 if we should use FIFO to notice cache about buffer reads. | |
2322 | 59 // callback |
60 stream_t* stream; | |
26833
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
61 volatile int control; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
62 volatile unsigned control_uint_arg; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
63 volatile double control_double_arg; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
64 volatile int control_res; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
65 volatile off_t control_new_pos; |
26847
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
66 volatile double stream_time_length; |
2322 | 67 } cache_vars_t; |
68 | |
2352 | 69 static int min_fill=0; |
70 | |
71 int cache_fill_status=0; | |
2322 | 72 |
73 void cache_stats(cache_vars_t* s){ | |
74 int newb=s->max_filepos-s->read_filepos; // new bytes in the buffer | |
18176
f72bc5754209
Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents:
18067
diff
changeset
|
75 mp_msg(MSGT_CACHE,MSGL_INFO,"0x%06X [0x%06X] 0x%06X ",(int)s->min_filepos,(int)s->read_filepos,(int)s->max_filepos); |
f72bc5754209
Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents:
18067
diff
changeset
|
76 mp_msg(MSGT_CACHE,MSGL_INFO,"%3d %% (%3d%%)\n",100*newb/s->buffer_size,100*min_fill/s->buffer_size); |
2322 | 77 } |
78 | |
79 int cache_read(cache_vars_t* s,unsigned char* buf,int size){ | |
80 int total=0; | |
81 while(size>0){ | |
82 int pos,newb,len; | |
2352 | 83 |
84 //printf("CACHE2_READ: 0x%X <= 0x%X <= 0x%X \n",s->min_filepos,s->read_filepos,s->max_filepos); | |
2322 | 85 |
2374 | 86 if(s->read_filepos>=s->max_filepos || s->read_filepos<s->min_filepos){ |
2352 | 87 // eof? |
88 if(s->eof) break; | |
89 // waiting for buffer fill... | |
10197 | 90 usec_sleep(READ_USLEEP_TIME); // 10ms |
2352 | 91 continue; // try again... |
92 } | |
93 | |
2374 | 94 newb=s->max_filepos-s->read_filepos; // new bytes in the buffer |
2322 | 95 if(newb<min_fill) min_fill=newb; // statistics... |
96 | |
97 // printf("*** newb: %d bytes ***\n",newb); | |
2352 | 98 |
99 pos=s->read_filepos - s->offset; | |
100 if(pos<0) pos+=s->buffer_size; else | |
101 if(pos>=s->buffer_size) pos-=s->buffer_size; | |
102 | |
2322 | 103 if(newb>s->buffer_size-pos) newb=s->buffer_size-pos; // handle wrap... |
104 if(newb>size) newb=size; | |
105 | |
2352 | 106 // check: |
2371 | 107 if(s->read_filepos<s->min_filepos) mp_msg(MSGT_CACHE,MSGL_ERR,"Ehh. s->read_filepos<s->min_filepos !!! Report bug...\n"); |
2352 | 108 |
2322 | 109 // len=write(mem,newb) |
110 //printf("Buffer read: %d bytes\n",newb); | |
111 memcpy(buf,&s->buffer[pos],newb); | |
112 buf+=newb; | |
2352 | 113 len=newb; |
2322 | 114 // ... |
115 | |
116 s->read_filepos+=len; | |
117 size-=len; | |
118 total+=len; | |
119 | |
120 } | |
18067
ac7eaa0313c2
avoid cache fill status overflow with caches > ca. 20 MB
reimar
parents:
17384
diff
changeset
|
121 cache_fill_status=(s->max_filepos-s->read_filepos)/(s->buffer_size / 100); |
2322 | 122 return total; |
123 } | |
124 | |
125 int cache_fill(cache_vars_t* s){ | |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7204
diff
changeset
|
126 int back,back2,newb,space,len,pos; |
2374 | 127 off_t read=s->read_filepos; |
2322 | 128 |
2352 | 129 if(read<s->min_filepos || read>s->max_filepos){ |
130 // seek... | |
17366 | 131 mp_msg(MSGT_CACHE,MSGL_DBG2,"Out of boundaries... seeking to 0x%"PRIX64" \n",(int64_t)read); |
8938
fc21a94f98c6
do not discard cache content at seeking type=STREAMTYPE_STREAM
arpi
parents:
7862
diff
changeset
|
132 // streaming: drop cache contents only if seeking backward or too much fwd: |
fc21a94f98c6
do not discard cache content at seeking type=STREAMTYPE_STREAM
arpi
parents:
7862
diff
changeset
|
133 if(s->stream->type!=STREAMTYPE_STREAM || |
16152
10a69a812eff
remove unused cache-prefill and create cache-seek-min that controls when seek_long is prefered over waiting for cache to fill
iive
parents:
12899
diff
changeset
|
134 read<s->min_filepos || read>=s->max_filepos+s->seek_limit) |
8938
fc21a94f98c6
do not discard cache content at seeking type=STREAMTYPE_STREAM
arpi
parents:
7862
diff
changeset
|
135 { |
fc21a94f98c6
do not discard cache content at seeking type=STREAMTYPE_STREAM
arpi
parents:
7862
diff
changeset
|
136 s->offset= // FIXME!? |
fc21a94f98c6
do not discard cache content at seeking type=STREAMTYPE_STREAM
arpi
parents:
7862
diff
changeset
|
137 s->min_filepos=s->max_filepos=read; // drop cache content :( |
fc21a94f98c6
do not discard cache content at seeking type=STREAMTYPE_STREAM
arpi
parents:
7862
diff
changeset
|
138 if(s->stream->eof) stream_reset(s->stream); |
fc21a94f98c6
do not discard cache content at seeking type=STREAMTYPE_STREAM
arpi
parents:
7862
diff
changeset
|
139 stream_seek(s->stream,read); |
17366 | 140 mp_msg(MSGT_CACHE,MSGL_DBG2,"Seek done. new pos: 0x%"PRIX64" \n",(int64_t)stream_tell(s->stream)); |
8938
fc21a94f98c6
do not discard cache content at seeking type=STREAMTYPE_STREAM
arpi
parents:
7862
diff
changeset
|
141 } |
2352 | 142 } |
143 | |
2322 | 144 // calc number of back-bytes: |
145 back=read - s->min_filepos; | |
146 if(back<0) back=0; // strange... | |
147 if(back>s->back_size) back=s->back_size; | |
148 | |
149 // calc number of new bytes: | |
150 newb=s->max_filepos - read; | |
151 if(newb<0) newb=0; // strange... | |
152 | |
153 // calc free buffer space: | |
154 space=s->buffer_size - (newb+back); | |
155 | |
156 // calc bufferpos: | |
157 pos=s->max_filepos - s->offset; | |
158 if(pos>=s->buffer_size) pos-=s->buffer_size; // wrap-around | |
159 | |
160 if(space<s->fill_limit){ | |
161 // printf("Buffer is full (%d bytes free, limit: %d)\n",space,s->fill_limit); | |
162 return 0; // no fill... | |
163 } | |
164 | |
165 // printf("### read=0x%X back=%d newb=%d space=%d pos=%d\n",read,back,newb,space,pos); | |
166 | |
167 // reduce space if needed: | |
168 if(space>s->buffer_size-pos) space=s->buffer_size-pos; | |
169 | |
170 // if(space>32768) space=32768; // limit one-time block size | |
171 if(space>4*s->sector_size) space=4*s->sector_size; | |
172 | |
2352 | 173 // if(s->seek_lock) return 0; // FIXME |
174 | |
175 #if 1 | |
176 // back+newb+space <= buffer_size | |
177 back2=s->buffer_size-(space+newb); // max back size | |
178 if(s->min_filepos<(read-back2)) s->min_filepos=read-back2; | |
179 #else | |
2322 | 180 s->min_filepos=read-back; // avoid seeking-back to temp area... |
2352 | 181 #endif |
2322 | 182 |
183 // .... | |
184 //printf("Buffer fill: %d bytes of %d\n",space,s->buffer_size); | |
185 //len=stream_fill_buffer(s->stream); | |
186 //memcpy(&s->buffer[pos],s->stream->buffer,len); // avoid this extra copy! | |
187 // .... | |
2348 | 188 len=stream_read(s->stream,&s->buffer[pos],space); |
189 if(!len) s->eof=1; | |
2322 | 190 |
191 s->max_filepos+=len; | |
192 if(pos+len>=s->buffer_size){ | |
193 // wrap... | |
194 s->offset+=s->buffer_size; | |
195 } | |
196 | |
197 return len; | |
198 | |
199 } | |
200 | |
26833
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
201 static void cache_execute_control(cache_vars_t *s) { |
26847
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
202 static unsigned last; |
26897
23c3741dc490
Handle NULL control function in cache_execute_control, fixes crash with http urls.
reimar
parents:
26847
diff
changeset
|
203 if (!s->stream->control) { |
23c3741dc490
Handle NULL control function in cache_execute_control, fixes crash with http urls.
reimar
parents:
26847
diff
changeset
|
204 s->stream_time_length = 0; |
23c3741dc490
Handle NULL control function in cache_execute_control, fixes crash with http urls.
reimar
parents:
26847
diff
changeset
|
205 s->control_new_pos = 0; |
23c3741dc490
Handle NULL control function in cache_execute_control, fixes crash with http urls.
reimar
parents:
26847
diff
changeset
|
206 s->control_res = STREAM_UNSUPPORTED; |
23c3741dc490
Handle NULL control function in cache_execute_control, fixes crash with http urls.
reimar
parents:
26847
diff
changeset
|
207 s->control = -1; |
23c3741dc490
Handle NULL control function in cache_execute_control, fixes crash with http urls.
reimar
parents:
26847
diff
changeset
|
208 return; |
23c3741dc490
Handle NULL control function in cache_execute_control, fixes crash with http urls.
reimar
parents:
26847
diff
changeset
|
209 } |
26847
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
210 if (GetTimerMS() - last > 99) { |
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
211 double len; |
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
212 if (s->stream->control(s->stream, STREAM_CTRL_GET_TIME_LENGTH, &len) == STREAM_OK) |
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
213 s->stream_time_length = len; |
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
214 else |
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
215 s->stream_time_length = 0; |
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
216 last = GetTimerMS(); |
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
217 } |
26833
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
218 if (s->control == -1) return; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
219 switch (s->control) { |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
220 case STREAM_CTRL_GET_CURRENT_TIME: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
221 case STREAM_CTRL_SEEK_TO_TIME: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
222 case STREAM_CTRL_GET_ASPECT_RATIO: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
223 s->control_res = s->stream->control(s->stream, s->control, &s->control_double_arg); |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
224 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
225 case STREAM_CTRL_SEEK_TO_CHAPTER: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
226 case STREAM_CTRL_GET_NUM_CHAPTERS: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
227 case STREAM_CTRL_GET_CURRENT_CHAPTER: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
228 case STREAM_CTRL_GET_NUM_ANGLES: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
229 case STREAM_CTRL_GET_ANGLE: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
230 case STREAM_CTRL_SET_ANGLE: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
231 s->control_res = s->stream->control(s->stream, s->control, &s->control_uint_arg); |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
232 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
233 default: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
234 s->control_res = STREAM_UNSUPPORTED; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
235 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
236 } |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
237 s->control_new_pos = s->stream->pos; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
238 s->control = -1; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
239 } |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
240 |
2322 | 241 cache_vars_t* cache_init(int size,int sector){ |
242 int num; | |
26077 | 243 #if !defined(WIN32) && !defined(__OS2__) |
2322 | 244 cache_vars_t* s=shmem_alloc(sizeof(cache_vars_t)); |
10197 | 245 #else |
246 cache_vars_t* s=malloc(sizeof(cache_vars_t)); | |
247 #endif | |
12899 | 248 if(s==NULL) return NULL; |
249 | |
2322 | 250 memset(s,0,sizeof(cache_vars_t)); |
251 num=size/sector; | |
12835
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
252 if(num < 16){ |
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
253 num = 16; |
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
254 }//32kb min_size |
2322 | 255 s->buffer_size=num*sector; |
256 s->sector_size=sector; | |
26077 | 257 #if !defined(WIN32) && !defined(__OS2__) |
2322 | 258 s->buffer=shmem_alloc(s->buffer_size); |
10197 | 259 #else |
260 s->buffer=malloc(s->buffer_size); | |
261 #endif | |
12899 | 262 |
263 if(s->buffer == NULL){ | |
26077 | 264 #if !defined(WIN32) && !defined(__OS2__) |
12899 | 265 shmem_free(s,sizeof(cache_vars_t)); |
266 #else | |
267 free(s); | |
268 #endif | |
269 return NULL; | |
270 } | |
271 | |
2322 | 272 s->fill_limit=8*sector; |
12835
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
273 s->back_size=s->buffer_size/2; |
2322 | 274 return s; |
275 } | |
276 | |
9915 | 277 void cache_uninit(stream_t *s) { |
278 cache_vars_t* c = s->cache_data; | |
279 if(!s->cache_pid) return; | |
26077 | 280 #ifdef WIN32 |
281 TerminateThread((HANDLE)s->cache_pid,0); | |
282 #elif defined(__OS2__) | |
283 DosKillThread( s->cache_pid ); | |
284 DosWaitThread( &s->cache_pid, DCWW_WAIT ); | |
285 #else | |
9915 | 286 kill(s->cache_pid,SIGKILL); |
287 waitpid(s->cache_pid,NULL,0); | |
10197 | 288 #endif |
9915 | 289 if(!c) return; |
26077 | 290 #if defined(WIN32) || defined(__OS2__) |
291 free(c->stream); | |
292 free(c->buffer); | |
293 free(s->cache_data); | |
294 #else | |
9915 | 295 shmem_free(c->buffer,c->buffer_size); |
296 shmem_free(s->cache_data,sizeof(cache_vars_t)); | |
10197 | 297 #endif |
9915 | 298 } |
299 | |
2322 | 300 static void exit_sighandler(int x){ |
301 // close stream | |
302 exit(0); | |
303 } | |
304 | |
16152
10a69a812eff
remove unused cache-prefill and create cache-seek-min that controls when seek_long is prefered over waiting for cache to fill
iive
parents:
12899
diff
changeset
|
305 int stream_enable_cache(stream_t *stream,int size,int min,int seek_limit){ |
25445
959fca775f43
Fix stream_cache to use sector_size set in stream_t.
ulion
parents:
24697
diff
changeset
|
306 int ss = stream->sector_size ? stream->sector_size : STREAM_BUFFER_SIZE; |
5991 | 307 cache_vars_t* s; |
7006
c0b490505298
disable cache if stream->fd<0 (no regular file/pipe but some special thing)
arpi
parents:
5991
diff
changeset
|
308 |
7204 | 309 if (stream->type==STREAMTYPE_STREAM && stream->fd < 0) { |
310 // The stream has no 'fd' behind it, so is non-cacheable | |
311 mp_msg(MSGT_CACHE,MSGL_STATUS,"\rThis stream is non-cacheable\n"); | |
312 return 1; | |
313 } | |
7006
c0b490505298
disable cache if stream->fd<0 (no regular file/pipe but some special thing)
arpi
parents:
5991
diff
changeset
|
314 |
5991 | 315 s=cache_init(size,ss); |
12899 | 316 if(s == NULL) return 0; |
3562 | 317 stream->cache_data=s; |
318 s->stream=stream; // callback | |
16152
10a69a812eff
remove unused cache-prefill and create cache-seek-min that controls when seek_long is prefered over waiting for cache to fill
iive
parents:
12899
diff
changeset
|
319 s->seek_limit=seek_limit; |
12835
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
320 |
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
321 |
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
322 //make sure that we won't wait from cache_fill |
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
323 //more data than it is alowed to fill |
16152
10a69a812eff
remove unused cache-prefill and create cache-seek-min that controls when seek_long is prefered over waiting for cache to fill
iive
parents:
12899
diff
changeset
|
324 if (s->seek_limit > s->buffer_size - s->fill_limit ){ |
10a69a812eff
remove unused cache-prefill and create cache-seek-min that controls when seek_long is prefered over waiting for cache to fill
iive
parents:
12899
diff
changeset
|
325 s->seek_limit = s->buffer_size - s->fill_limit; |
12835
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
326 } |
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
327 if (min > s->buffer_size - s->fill_limit) { |
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
328 min = s->buffer_size - s->fill_limit; |
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
329 } |
3562 | 330 |
26077 | 331 #if !defined(WIN32) && !defined(__OS2__) |
3562 | 332 if((stream->cache_pid=fork())){ |
10197 | 333 #else |
334 { | |
26077 | 335 #ifdef WIN32 |
10197 | 336 DWORD threadId; |
26077 | 337 #endif |
10197 | 338 stream_t* stream2=malloc(sizeof(stream_t)); |
339 memcpy(stream2,s->stream,sizeof(stream_t)); | |
340 s->stream=stream2; | |
26077 | 341 #ifdef WIN32 |
10197 | 342 stream->cache_pid = CreateThread(NULL,0,ThreadProc,s,0,&threadId); |
26077 | 343 #else // OS2 |
344 stream->cache_pid = _beginthread( ThreadProc, NULL, 256 * 1024, s ); | |
345 #endif | |
10197 | 346 #endif |
3562 | 347 // wait until cache is filled at least prefill_init % |
17366 | 348 mp_msg(MSGT_CACHE,MSGL_V,"CACHE_PRE_INIT: %"PRId64" [%"PRId64"] %"PRId64" pre:%d eof:%d \n", |
17384 | 349 (int64_t)s->min_filepos,(int64_t)s->read_filepos,(int64_t)s->max_filepos,min,s->eof); |
3562 | 350 while(s->read_filepos<s->min_filepos || s->max_filepos-s->read_filepos<min){ |
16793
8d4fb5469efb
Make a few more messages translatable by moving them into help_mp-en.h.
diego
parents:
16750
diff
changeset
|
351 mp_msg(MSGT_CACHE,MSGL_STATUS,MSGTR_CacheFill, |
3600 | 352 100.0*(float)(s->max_filepos-s->read_filepos)/(float)(s->buffer_size), |
17366 | 353 (int64_t)s->max_filepos-s->read_filepos |
3562 | 354 ); |
355 if(s->eof) break; // file is smaller than prefill size | |
26326
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26077
diff
changeset
|
356 if(stream_check_interrupt(PREFILL_SLEEP_TIME)) |
4825
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
3726
diff
changeset
|
357 return 0; |
3562 | 358 } |
16870 | 359 mp_msg(MSGT_CACHE,MSGL_STATUS,"\n"); |
4825
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
3726
diff
changeset
|
360 return 1; // parent exits |
3562 | 361 } |
362 | |
26077 | 363 #if defined(WIN32) || defined(__OS2__) |
10197 | 364 } |
26077 | 365 #ifdef WIN32 |
10197 | 366 static DWORD WINAPI ThreadProc(void*s){ |
26077 | 367 #else // OS2 |
368 static void ThreadProc( void *s ){ | |
369 #endif | |
10197 | 370 #endif |
371 | |
27343 | 372 #ifdef CONFIG_GUI |
24697
8f2154e066cf
Make sure forked code does not try to display a GTK message box (and thus crashes)
reimar
parents:
22142
diff
changeset
|
373 use_gui = 0; // mp_msg may not use gui stuff in forked code |
8f2154e066cf
Make sure forked code does not try to display a GTK message box (and thus crashes)
reimar
parents:
22142
diff
changeset
|
374 #endif |
2322 | 375 // cache thread mainloop: |
376 signal(SIGTERM,exit_sighandler); // kill | |
377 while(1){ | |
10197 | 378 if(!cache_fill((cache_vars_t*)s)){ |
379 usec_sleep(FILL_USLEEP_TIME); // idle | |
2322 | 380 } |
26833
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
381 cache_execute_control((cache_vars_t*)s); |
2327 | 382 // cache_stats(s->cache_data); |
2322 | 383 } |
384 } | |
385 | |
386 int cache_stream_fill_buffer(stream_t *s){ | |
387 int len; | |
388 if(s->eof){ s->buf_pos=s->buf_len=0; return 0; } | |
389 if(!s->cache_pid) return stream_fill_buffer(s); | |
390 | |
2352 | 391 // cache_stats(s->cache_data); |
392 | |
2371 | 393 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 | 394 |
2322 | 395 len=cache_read(s->cache_data,s->buffer, ((cache_vars_t*)s->cache_data)->sector_size); |
2352 | 396 //printf("cache_stream_fill_buffer->read -> %d\n",len); |
2327 | 397 |
2322 | 398 if(len<=0){ s->eof=1; s->buf_pos=s->buf_len=0; return 0; } |
399 s->buf_pos=0; | |
400 s->buf_len=len; | |
401 s->pos+=len; | |
402 // printf("[%d]",len);fflush(stdout); | |
403 return len; | |
404 | |
405 } | |
406 | |
2352 | 407 int cache_stream_seek_long(stream_t *stream,off_t pos){ |
408 cache_vars_t* s; | |
409 off_t newpos; | |
410 if(!stream->cache_pid) return stream_seek_long(stream,pos); | |
411 | |
412 s=stream->cache_data; | |
413 // s->seek_lock=1; | |
414 | |
17366 | 415 mp_msg(MSGT_CACHE,MSGL_DBG2,"CACHE2_SEEK: 0x%"PRIX64" <= 0x%"PRIX64" (0x%"PRIX64") <= 0x%"PRIX64" \n",s->min_filepos,pos,s->read_filepos,s->max_filepos); |
2322 | 416 |
2352 | 417 newpos=pos/s->sector_size; newpos*=s->sector_size; // align |
418 stream->pos=s->read_filepos=newpos; | |
419 s->eof=0; // !!!!!!! | |
420 | |
421 cache_stream_fill_buffer(stream); | |
2322 | 422 |
2352 | 423 pos-=newpos; |
424 if(pos>=0 && pos<=stream->buf_len){ | |
425 stream->buf_pos=pos; // byte position in sector | |
426 return 1; | |
427 } | |
428 | |
429 // stream->buf_pos=stream->buf_len=0; | |
430 // return 1; | |
431 | |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16152
diff
changeset
|
432 mp_msg(MSGT_CACHE,MSGL_V,"cache_stream_seek: WARNING! Can't seek to 0x%"PRIX64" !\n",(int64_t)(pos+newpos)); |
2322 | 433 return 0; |
434 } | |
26833
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
435 |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
436 int cache_do_control(stream_t *stream, int cmd, void *arg) { |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
437 cache_vars_t* s = stream->cache_data; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
438 switch (cmd) { |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
439 case STREAM_CTRL_SEEK_TO_TIME: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
440 s->control_double_arg = *(double *)arg; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
441 s->control = cmd; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
442 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
443 case STREAM_CTRL_SEEK_TO_CHAPTER: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
444 case STREAM_CTRL_SET_ANGLE: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
445 s->control_uint_arg = *(unsigned *)arg; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
446 s->control = cmd; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
447 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
448 // the core might call these every frame, they are too slow for this... |
26847
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
449 case STREAM_CTRL_GET_TIME_LENGTH: |
26924
ca50c4a72f68
100l, fix wrong order of cases in cache_do_control
reimar
parents:
26897
diff
changeset
|
450 // case STREAM_CTRL_GET_CURRENT_TIME: |
26847
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
451 *(double *)arg = s->stream_time_length; |
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
452 return s->stream_time_length ? STREAM_OK : STREAM_UNSUPPORTED; |
26924
ca50c4a72f68
100l, fix wrong order of cases in cache_do_control
reimar
parents:
26897
diff
changeset
|
453 case STREAM_CTRL_GET_NUM_CHAPTERS: |
ca50c4a72f68
100l, fix wrong order of cases in cache_do_control
reimar
parents:
26897
diff
changeset
|
454 case STREAM_CTRL_GET_CURRENT_CHAPTER: |
26833
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
455 case STREAM_CTRL_GET_ASPECT_RATIO: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
456 case STREAM_CTRL_GET_NUM_ANGLES: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
457 case STREAM_CTRL_GET_ANGLE: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
458 s->control = cmd; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
459 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
460 default: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
461 return STREAM_UNSUPPORTED; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
462 } |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
463 while (s->control != -1) |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
464 usec_sleep(CONTROL_SLEEP_TIME); |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
465 switch (cmd) { |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
466 case STREAM_CTRL_GET_TIME_LENGTH: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
467 case STREAM_CTRL_GET_CURRENT_TIME: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
468 case STREAM_CTRL_GET_ASPECT_RATIO: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
469 *(double *)arg = s->control_double_arg; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
470 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
471 case STREAM_CTRL_GET_NUM_CHAPTERS: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
472 case STREAM_CTRL_GET_CURRENT_CHAPTER: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
473 case STREAM_CTRL_GET_NUM_ANGLES: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
474 case STREAM_CTRL_GET_ANGLE: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
475 *(unsigned *)arg = s->control_uint_arg; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
476 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
477 case STREAM_CTRL_SEEK_TO_CHAPTER: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
478 case STREAM_CTRL_SEEK_TO_TIME: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
479 case STREAM_CTRL_SET_ANGLE: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
480 stream->pos = s->read_filepos = s->control_new_pos; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
481 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
482 } |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
483 return s->control_res; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
484 } |