Mercurial > mplayer.hg
annotate stream/cache2.c @ 29699:3819fcdeaaf8
lavf: if seeking in the desired direction failed, also try in the opposite one,
otherwise we might end up at some random position (where lavf last ended
up while trying to build the index).
author | reimar |
---|---|
date | Wed, 30 Sep 2009 08:19:49 +0000 |
parents | 0f1b5b68af32 |
children | 5c39c41f38e8 |
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 |
27723
fb67a8f56bfc
Unconditionally #include osdep/shem.h, fixes the warnings on Cygwin:
diego
parents:
27343
diff
changeset
|
19 #include "osdep/shmem.h" |
17012 | 20 #include "osdep/timer.h" |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
21 #if defined(__MINGW32__) |
26077 | 22 #include <windows.h> |
27770
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
23 static void ThreadProc( void *s ); |
26077 | 24 #elif defined(__OS2__) |
25 #define INCL_DOS | |
26 #include <os2.h> | |
27756
1266470a5651
Revert declaring ThreadProc as void, it breaks the WINAPI.
diego
parents:
27727
diff
changeset
|
27 static void ThreadProc( void *s ); |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
28 #elif defined(PTHREAD_CACHE) |
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
29 #include <pthread.h> |
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
30 static void *ThreadProc(void *s); |
26077 | 31 #else |
10242 | 32 #include <sys/wait.h> |
10197 | 33 #endif |
2322 | 34 |
2371 | 35 #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
|
36 #include "help_mp.h" |
2371 | 37 |
2322 | 38 #include "stream.h" |
27876
298a3cd86bbb
Include cache2.h in cache2.c, fixes an implicit declaration warning for cache_do_control
reimar
parents:
27770
diff
changeset
|
39 #include "cache2.h" |
24697
8f2154e066cf
Make sure forked code does not try to display a GTK message box (and thus crashes)
reimar
parents:
22142
diff
changeset
|
40 extern int use_gui; |
2322 | 41 |
42 int stream_fill_buffer(stream_t *s); | |
43 int stream_seek_long(stream_t *s,off_t pos); | |
44 | |
45 typedef struct { | |
46 // constats: | |
47 unsigned char *buffer; // base pointer of the alllocated buffer memory | |
2352 | 48 int buffer_size; // size of the alllocated buffer memory |
49 int sector_size; // size of a single sector (2048/2324) | |
50 int back_size; // we should keep back_size amount of old bytes for backward seek | |
51 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
|
52 int seek_limit; // keep filling cache if distanse is less that seek limit |
2374 | 53 // filler's pointers: |
54 int eof; | |
55 off_t min_filepos; // buffer contain only a part of the file, from min-max pos | |
56 off_t max_filepos; | |
57 off_t offset; // filepos <-> bufferpos offset value (filepos of the buffer's first byte) | |
2322 | 58 // reader's pointers: |
2374 | 59 off_t read_filepos; |
2322 | 60 // commands/locking: |
2352 | 61 // int seek_lock; // 1 if we will seek/reset buffer, 2 if we are ready for cmd |
62 // int fifo_flag; // 1 if we should use FIFO to notice cache about buffer reads. | |
2322 | 63 // callback |
64 stream_t* stream; | |
26833
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
65 volatile int control; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
66 volatile unsigned control_uint_arg; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
67 volatile double control_double_arg; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
68 volatile int control_res; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
69 volatile off_t control_new_pos; |
26847
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
70 volatile double stream_time_length; |
2322 | 71 } cache_vars_t; |
72 | |
2352 | 73 static int min_fill=0; |
74 | |
75 int cache_fill_status=0; | |
2322 | 76 |
77 void cache_stats(cache_vars_t* s){ | |
78 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
|
79 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
|
80 mp_msg(MSGT_CACHE,MSGL_INFO,"%3d %% (%3d%%)\n",100*newb/s->buffer_size,100*min_fill/s->buffer_size); |
2322 | 81 } |
82 | |
83 int cache_read(cache_vars_t* s,unsigned char* buf,int size){ | |
84 int total=0; | |
85 while(size>0){ | |
86 int pos,newb,len; | |
2352 | 87 |
88 //printf("CACHE2_READ: 0x%X <= 0x%X <= 0x%X \n",s->min_filepos,s->read_filepos,s->max_filepos); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
89 |
2374 | 90 if(s->read_filepos>=s->max_filepos || s->read_filepos<s->min_filepos){ |
2352 | 91 // eof? |
92 if(s->eof) break; | |
93 // waiting for buffer fill... | |
10197 | 94 usec_sleep(READ_USLEEP_TIME); // 10ms |
2352 | 95 continue; // try again... |
96 } | |
97 | |
2374 | 98 newb=s->max_filepos-s->read_filepos; // new bytes in the buffer |
2322 | 99 if(newb<min_fill) min_fill=newb; // statistics... |
100 | |
101 // printf("*** newb: %d bytes ***\n",newb); | |
2352 | 102 |
103 pos=s->read_filepos - s->offset; | |
104 if(pos<0) pos+=s->buffer_size; else | |
105 if(pos>=s->buffer_size) pos-=s->buffer_size; | |
106 | |
2322 | 107 if(newb>s->buffer_size-pos) newb=s->buffer_size-pos; // handle wrap... |
108 if(newb>size) newb=size; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
109 |
2352 | 110 // check: |
2371 | 111 if(s->read_filepos<s->min_filepos) mp_msg(MSGT_CACHE,MSGL_ERR,"Ehh. s->read_filepos<s->min_filepos !!! Report bug...\n"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
112 |
2322 | 113 // len=write(mem,newb) |
114 //printf("Buffer read: %d bytes\n",newb); | |
115 memcpy(buf,&s->buffer[pos],newb); | |
116 buf+=newb; | |
2352 | 117 len=newb; |
2322 | 118 // ... |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
119 |
2322 | 120 s->read_filepos+=len; |
121 size-=len; | |
122 total+=len; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
123 |
2322 | 124 } |
18067
ac7eaa0313c2
avoid cache fill status overflow with caches > ca. 20 MB
reimar
parents:
17384
diff
changeset
|
125 cache_fill_status=(s->max_filepos-s->read_filepos)/(s->buffer_size / 100); |
2322 | 126 return total; |
127 } | |
128 | |
129 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
|
130 int back,back2,newb,space,len,pos; |
2374 | 131 off_t read=s->read_filepos; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
132 |
2352 | 133 if(read<s->min_filepos || read>s->max_filepos){ |
134 // seek... | |
17366 | 135 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
|
136 // 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
|
137 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
|
138 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
|
139 { |
fc21a94f98c6
do not discard cache content at seeking type=STREAMTYPE_STREAM
arpi
parents:
7862
diff
changeset
|
140 s->offset= // FIXME!? |
fc21a94f98c6
do not discard cache content at seeking type=STREAMTYPE_STREAM
arpi
parents:
7862
diff
changeset
|
141 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
|
142 if(s->stream->eof) stream_reset(s->stream); |
fc21a94f98c6
do not discard cache content at seeking type=STREAMTYPE_STREAM
arpi
parents:
7862
diff
changeset
|
143 stream_seek(s->stream,read); |
17366 | 144 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
|
145 } |
2352 | 146 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
147 |
2322 | 148 // calc number of back-bytes: |
149 back=read - s->min_filepos; | |
150 if(back<0) back=0; // strange... | |
151 if(back>s->back_size) back=s->back_size; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
152 |
2322 | 153 // calc number of new bytes: |
154 newb=s->max_filepos - read; | |
155 if(newb<0) newb=0; // strange... | |
156 | |
157 // calc free buffer space: | |
158 space=s->buffer_size - (newb+back); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
159 |
2322 | 160 // calc bufferpos: |
161 pos=s->max_filepos - s->offset; | |
162 if(pos>=s->buffer_size) pos-=s->buffer_size; // wrap-around | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
163 |
2322 | 164 if(space<s->fill_limit){ |
165 // printf("Buffer is full (%d bytes free, limit: %d)\n",space,s->fill_limit); | |
166 return 0; // no fill... | |
167 } | |
168 | |
169 // printf("### read=0x%X back=%d newb=%d space=%d pos=%d\n",read,back,newb,space,pos); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
170 |
2322 | 171 // reduce space if needed: |
172 if(space>s->buffer_size-pos) space=s->buffer_size-pos; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
173 |
2322 | 174 // if(space>32768) space=32768; // limit one-time block size |
175 if(space>4*s->sector_size) space=4*s->sector_size; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
176 |
2352 | 177 // if(s->seek_lock) return 0; // FIXME |
178 | |
179 #if 1 | |
180 // back+newb+space <= buffer_size | |
181 back2=s->buffer_size-(space+newb); // max back size | |
182 if(s->min_filepos<(read-back2)) s->min_filepos=read-back2; | |
183 #else | |
2322 | 184 s->min_filepos=read-back; // avoid seeking-back to temp area... |
2352 | 185 #endif |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
186 |
2322 | 187 // .... |
188 //printf("Buffer fill: %d bytes of %d\n",space,s->buffer_size); | |
189 //len=stream_fill_buffer(s->stream); | |
190 //memcpy(&s->buffer[pos],s->stream->buffer,len); // avoid this extra copy! | |
191 // .... | |
2348 | 192 len=stream_read(s->stream,&s->buffer[pos],space); |
193 if(!len) s->eof=1; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
194 |
2322 | 195 s->max_filepos+=len; |
196 if(pos+len>=s->buffer_size){ | |
197 // wrap... | |
198 s->offset+=s->buffer_size; | |
199 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
200 |
2322 | 201 return len; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
202 |
2322 | 203 } |
204 | |
27770
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
205 static int cache_execute_control(cache_vars_t *s) { |
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
206 int res = 1; |
26847
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
207 static unsigned last; |
26897
23c3741dc490
Handle NULL control function in cache_execute_control, fixes crash with http urls.
reimar
parents:
26847
diff
changeset
|
208 if (!s->stream->control) { |
23c3741dc490
Handle NULL control function in cache_execute_control, fixes crash with http urls.
reimar
parents:
26847
diff
changeset
|
209 s->stream_time_length = 0; |
23c3741dc490
Handle NULL control function in cache_execute_control, fixes crash with http urls.
reimar
parents:
26847
diff
changeset
|
210 s->control_new_pos = 0; |
23c3741dc490
Handle NULL control function in cache_execute_control, fixes crash with http urls.
reimar
parents:
26847
diff
changeset
|
211 s->control_res = STREAM_UNSUPPORTED; |
23c3741dc490
Handle NULL control function in cache_execute_control, fixes crash with http urls.
reimar
parents:
26847
diff
changeset
|
212 s->control = -1; |
27770
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
213 return res; |
26897
23c3741dc490
Handle NULL control function in cache_execute_control, fixes crash with http urls.
reimar
parents:
26847
diff
changeset
|
214 } |
26847
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
215 if (GetTimerMS() - last > 99) { |
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
216 double len; |
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
217 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
|
218 s->stream_time_length = len; |
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
219 else |
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
220 s->stream_time_length = 0; |
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
221 last = GetTimerMS(); |
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
222 } |
27770
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
223 if (s->control == -1) return res; |
26833
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
224 switch (s->control) { |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
225 case STREAM_CTRL_GET_CURRENT_TIME: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
226 case STREAM_CTRL_SEEK_TO_TIME: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
227 case STREAM_CTRL_GET_ASPECT_RATIO: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
228 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
|
229 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
230 case STREAM_CTRL_SEEK_TO_CHAPTER: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
231 case STREAM_CTRL_GET_NUM_CHAPTERS: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
232 case STREAM_CTRL_GET_CURRENT_CHAPTER: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
233 case STREAM_CTRL_GET_NUM_ANGLES: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
234 case STREAM_CTRL_GET_ANGLE: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
235 case STREAM_CTRL_SET_ANGLE: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
236 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
|
237 break; |
27770
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
238 case -2: |
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
239 res = 0; |
26833
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
240 default: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
241 s->control_res = STREAM_UNSUPPORTED; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
242 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
243 } |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
244 s->control_new_pos = s->stream->pos; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
245 s->control = -1; |
27770
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
246 return res; |
26833
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
247 } |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
248 |
2322 | 249 cache_vars_t* cache_init(int size,int sector){ |
250 int num; | |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
251 #if !defined(__MINGW32__) && !defined(PTHREAD_CACHE) && !defined(__OS2__) |
2322 | 252 cache_vars_t* s=shmem_alloc(sizeof(cache_vars_t)); |
10197 | 253 #else |
254 cache_vars_t* s=malloc(sizeof(cache_vars_t)); | |
255 #endif | |
12899 | 256 if(s==NULL) return NULL; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
257 |
2322 | 258 memset(s,0,sizeof(cache_vars_t)); |
259 num=size/sector; | |
12835
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
260 if(num < 16){ |
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
261 num = 16; |
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
262 }//32kb min_size |
2322 | 263 s->buffer_size=num*sector; |
264 s->sector_size=sector; | |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
265 #if !defined(__MINGW32__) && !defined(PTHREAD_CACHE) && !defined(__OS2__) |
2322 | 266 s->buffer=shmem_alloc(s->buffer_size); |
10197 | 267 #else |
268 s->buffer=malloc(s->buffer_size); | |
269 #endif | |
12899 | 270 |
271 if(s->buffer == NULL){ | |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
272 #if !defined(__MINGW32__) && !defined(PTHREAD_CACHE) && !defined(__OS2__) |
12899 | 273 shmem_free(s,sizeof(cache_vars_t)); |
274 #else | |
275 free(s); | |
276 #endif | |
277 return NULL; | |
278 } | |
279 | |
2322 | 280 s->fill_limit=8*sector; |
12835
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
281 s->back_size=s->buffer_size/2; |
2322 | 282 return s; |
283 } | |
284 | |
9915 | 285 void cache_uninit(stream_t *s) { |
286 cache_vars_t* c = s->cache_data; | |
287 if(!s->cache_pid) return; | |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
288 #if defined(__MINGW32__) || defined(PTHREAD_CACHE) || defined(__OS2__) |
27770
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
289 cache_do_control(s, -2, NULL); |
26077 | 290 #else |
9915 | 291 kill(s->cache_pid,SIGKILL); |
292 waitpid(s->cache_pid,NULL,0); | |
10197 | 293 #endif |
9915 | 294 if(!c) return; |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
295 #if defined(__MINGW32__) || defined(PTHREAD_CACHE) || defined(__OS2__) |
26077 | 296 free(c->stream); |
297 free(c->buffer); | |
298 free(s->cache_data); | |
299 #else | |
9915 | 300 shmem_free(c->buffer,c->buffer_size); |
301 shmem_free(s->cache_data,sizeof(cache_vars_t)); | |
10197 | 302 #endif |
9915 | 303 } |
304 | |
2322 | 305 static void exit_sighandler(int x){ |
306 // close stream | |
307 exit(0); | |
308 } | |
309 | |
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
|
310 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
|
311 int ss = stream->sector_size ? stream->sector_size : STREAM_BUFFER_SIZE; |
5991 | 312 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
|
313 |
7204 | 314 if (stream->type==STREAMTYPE_STREAM && stream->fd < 0) { |
315 // The stream has no 'fd' behind it, so is non-cacheable | |
316 mp_msg(MSGT_CACHE,MSGL_STATUS,"\rThis stream is non-cacheable\n"); | |
317 return 1; | |
318 } | |
7006
c0b490505298
disable cache if stream->fd<0 (no regular file/pipe but some special thing)
arpi
parents:
5991
diff
changeset
|
319 |
5991 | 320 s=cache_init(size,ss); |
12899 | 321 if(s == NULL) return 0; |
3562 | 322 stream->cache_data=s; |
323 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
|
324 s->seek_limit=seek_limit; |
12835
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
325 |
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 //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
|
328 //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
|
329 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
|
330 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
|
331 } |
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
332 if (min > s->buffer_size - s->fill_limit) { |
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
333 min = s->buffer_size - s->fill_limit; |
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
334 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
335 |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
336 #if !defined(__MINGW32__) && !defined(PTHREAD_CACHE) && !defined(__OS2__) |
3562 | 337 if((stream->cache_pid=fork())){ |
10197 | 338 #else |
339 { | |
340 stream_t* stream2=malloc(sizeof(stream_t)); | |
341 memcpy(stream2,s->stream,sizeof(stream_t)); | |
342 s->stream=stream2; | |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
343 #if defined(__MINGW32__) |
27770
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
344 stream->cache_pid = _beginthread( ThreadProc, 0, s ); |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
345 #elif defined(__OS2__) |
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
346 stream->cache_pid = _beginthread( ThreadProc, NULL, 256 * 1024, s ); |
27770
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
347 #else |
27896
4c2232462353
100l, stream->cache_pid can not be used directly in pthread_create,
reimar
parents:
27894
diff
changeset
|
348 { |
4c2232462353
100l, stream->cache_pid can not be used directly in pthread_create,
reimar
parents:
27894
diff
changeset
|
349 pthread_t tid; |
4c2232462353
100l, stream->cache_pid can not be used directly in pthread_create,
reimar
parents:
27894
diff
changeset
|
350 pthread_create(&tid, NULL, ThreadProc, s); |
4c2232462353
100l, stream->cache_pid can not be used directly in pthread_create,
reimar
parents:
27894
diff
changeset
|
351 stream->cache_pid = 1; |
4c2232462353
100l, stream->cache_pid can not be used directly in pthread_create,
reimar
parents:
27894
diff
changeset
|
352 } |
26077 | 353 #endif |
10197 | 354 #endif |
3562 | 355 // wait until cache is filled at least prefill_init % |
17366 | 356 mp_msg(MSGT_CACHE,MSGL_V,"CACHE_PRE_INIT: %"PRId64" [%"PRId64"] %"PRId64" pre:%d eof:%d \n", |
17384 | 357 (int64_t)s->min_filepos,(int64_t)s->read_filepos,(int64_t)s->max_filepos,min,s->eof); |
3562 | 358 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
|
359 mp_msg(MSGT_CACHE,MSGL_STATUS,MSGTR_CacheFill, |
3600 | 360 100.0*(float)(s->max_filepos-s->read_filepos)/(float)(s->buffer_size), |
17366 | 361 (int64_t)s->max_filepos-s->read_filepos |
3562 | 362 ); |
363 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
|
364 if(stream_check_interrupt(PREFILL_SLEEP_TIME)) |
4825
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
3726
diff
changeset
|
365 return 0; |
3562 | 366 } |
16870 | 367 mp_msg(MSGT_CACHE,MSGL_STATUS,"\n"); |
4825
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
3726
diff
changeset
|
368 return 1; // parent exits |
3562 | 369 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
370 |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
371 #if defined(__MINGW32__) || defined(PTHREAD_CACHE) || defined(__OS2__) |
10197 | 372 } |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
373 #ifdef PTHREAD_CACHE |
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
374 static void *ThreadProc( void *s ){ |
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
375 #else |
26077 | 376 static void ThreadProc( void *s ){ |
377 #endif | |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
378 #endif |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
379 |
27343 | 380 #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
|
381 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
|
382 #endif |
2322 | 383 // cache thread mainloop: |
384 signal(SIGTERM,exit_sighandler); // kill | |
27770
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
385 do { |
27769 | 386 if(!cache_fill(s)){ |
10197 | 387 usec_sleep(FILL_USLEEP_TIME); // idle |
2322 | 388 } |
2327 | 389 // cache_stats(s->cache_data); |
27770
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
390 } while (cache_execute_control(s)); |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
391 #if defined(__MINGW32__) || defined(__OS2__) |
27770
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
392 _endthread(); |
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
393 #endif |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
394 #ifdef PTHREAD_CACHE |
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
395 return NULL; |
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
396 #endif |
2322 | 397 } |
398 | |
399 int cache_stream_fill_buffer(stream_t *s){ | |
400 int len; | |
401 if(s->eof){ s->buf_pos=s->buf_len=0; return 0; } | |
402 if(!s->cache_pid) return stream_fill_buffer(s); | |
403 | |
2352 | 404 // cache_stats(s->cache_data); |
405 | |
2371 | 406 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 | 407 |
2322 | 408 len=cache_read(s->cache_data,s->buffer, ((cache_vars_t*)s->cache_data)->sector_size); |
2352 | 409 //printf("cache_stream_fill_buffer->read -> %d\n",len); |
2327 | 410 |
2322 | 411 if(len<=0){ s->eof=1; s->buf_pos=s->buf_len=0; return 0; } |
412 s->buf_pos=0; | |
413 s->buf_len=len; | |
414 s->pos+=len; | |
415 // printf("[%d]",len);fflush(stdout); | |
416 return len; | |
417 | |
418 } | |
419 | |
2352 | 420 int cache_stream_seek_long(stream_t *stream,off_t pos){ |
421 cache_vars_t* s; | |
422 off_t newpos; | |
423 if(!stream->cache_pid) return stream_seek_long(stream,pos); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
424 |
2352 | 425 s=stream->cache_data; |
426 // s->seek_lock=1; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
427 |
17366 | 428 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 | 429 |
2352 | 430 newpos=pos/s->sector_size; newpos*=s->sector_size; // align |
431 stream->pos=s->read_filepos=newpos; | |
432 s->eof=0; // !!!!!!! | |
433 | |
434 cache_stream_fill_buffer(stream); | |
2322 | 435 |
2352 | 436 pos-=newpos; |
437 if(pos>=0 && pos<=stream->buf_len){ | |
438 stream->buf_pos=pos; // byte position in sector | |
439 return 1; | |
440 } | |
441 | |
442 // stream->buf_pos=stream->buf_len=0; | |
443 // return 1; | |
444 | |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16152
diff
changeset
|
445 mp_msg(MSGT_CACHE,MSGL_V,"cache_stream_seek: WARNING! Can't seek to 0x%"PRIX64" !\n",(int64_t)(pos+newpos)); |
2322 | 446 return 0; |
447 } | |
26833
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
448 |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
449 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
|
450 cache_vars_t* s = stream->cache_data; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
451 switch (cmd) { |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
452 case STREAM_CTRL_SEEK_TO_TIME: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
453 s->control_double_arg = *(double *)arg; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
454 s->control = cmd; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
455 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
456 case STREAM_CTRL_SEEK_TO_CHAPTER: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
457 case STREAM_CTRL_SET_ANGLE: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
458 s->control_uint_arg = *(unsigned *)arg; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
459 s->control = cmd; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
460 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
461 // 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
|
462 case STREAM_CTRL_GET_TIME_LENGTH: |
26924
ca50c4a72f68
100l, fix wrong order of cases in cache_do_control
reimar
parents:
26897
diff
changeset
|
463 // case STREAM_CTRL_GET_CURRENT_TIME: |
26847
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
464 *(double *)arg = s->stream_time_length; |
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
465 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
|
466 case STREAM_CTRL_GET_NUM_CHAPTERS: |
ca50c4a72f68
100l, fix wrong order of cases in cache_do_control
reimar
parents:
26897
diff
changeset
|
467 case STREAM_CTRL_GET_CURRENT_CHAPTER: |
26833
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 case STREAM_CTRL_GET_NUM_ANGLES: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
470 case STREAM_CTRL_GET_ANGLE: |
27770
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
471 case -2: |
26833
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
472 s->control = cmd; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
473 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
474 default: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
475 return STREAM_UNSUPPORTED; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
476 } |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
477 while (s->control != -1) |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
478 usec_sleep(CONTROL_SLEEP_TIME); |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
479 switch (cmd) { |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
480 case STREAM_CTRL_GET_TIME_LENGTH: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
481 case STREAM_CTRL_GET_CURRENT_TIME: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
482 case STREAM_CTRL_GET_ASPECT_RATIO: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
483 *(double *)arg = s->control_double_arg; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
484 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
485 case STREAM_CTRL_GET_NUM_CHAPTERS: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
486 case STREAM_CTRL_GET_CURRENT_CHAPTER: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
487 case STREAM_CTRL_GET_NUM_ANGLES: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
488 case STREAM_CTRL_GET_ANGLE: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
489 *(unsigned *)arg = s->control_uint_arg; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
490 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
491 case STREAM_CTRL_SEEK_TO_CHAPTER: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
492 case STREAM_CTRL_SEEK_TO_TIME: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
493 case STREAM_CTRL_SET_ANGLE: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
494 stream->pos = s->read_filepos = s->control_new_pos; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
495 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
496 } |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
497 return s->control_res; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
498 } |