Mercurial > mplayer.hg
annotate stream/cache2.c @ 29946:54bacf6a38ca
Update the SuperH VEU vidix driver with code that calls fsync() after each
frame to make sure the frame is flushed in case of deferred io.
Patch by Magnus Damm, damm opensource se
author | cehoyos |
---|---|
date | Thu, 10 Dec 2009 23:16:08 +0000 |
parents | 5c39c41f38e8 |
children | b985db55e78a |
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 |
29888
5c39c41f38e8
Deobfuscate the special hack to disable cache for live555.
reimar
parents:
29263
diff
changeset
|
314 if (stream->flags & STREAM_NON_CACHEABLE) { |
7204 | 315 mp_msg(MSGT_CACHE,MSGL_STATUS,"\rThis stream is non-cacheable\n"); |
316 return 1; | |
317 } | |
7006
c0b490505298
disable cache if stream->fd<0 (no regular file/pipe but some special thing)
arpi
parents:
5991
diff
changeset
|
318 |
5991 | 319 s=cache_init(size,ss); |
12899 | 320 if(s == NULL) return 0; |
3562 | 321 stream->cache_data=s; |
322 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
|
323 s->seek_limit=seek_limit; |
12835
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
324 |
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 //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
|
327 //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
|
328 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
|
329 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
|
330 } |
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
331 if (min > s->buffer_size - s->fill_limit) { |
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
332 min = s->buffer_size - s->fill_limit; |
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
10272
diff
changeset
|
333 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
334 |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
335 #if !defined(__MINGW32__) && !defined(PTHREAD_CACHE) && !defined(__OS2__) |
3562 | 336 if((stream->cache_pid=fork())){ |
10197 | 337 #else |
338 { | |
339 stream_t* stream2=malloc(sizeof(stream_t)); | |
340 memcpy(stream2,s->stream,sizeof(stream_t)); | |
341 s->stream=stream2; | |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
342 #if defined(__MINGW32__) |
27770
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
343 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
|
344 #elif defined(__OS2__) |
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
345 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
|
346 #else |
27896
4c2232462353
100l, stream->cache_pid can not be used directly in pthread_create,
reimar
parents:
27894
diff
changeset
|
347 { |
4c2232462353
100l, stream->cache_pid can not be used directly in pthread_create,
reimar
parents:
27894
diff
changeset
|
348 pthread_t tid; |
4c2232462353
100l, stream->cache_pid can not be used directly in pthread_create,
reimar
parents:
27894
diff
changeset
|
349 pthread_create(&tid, NULL, ThreadProc, s); |
4c2232462353
100l, stream->cache_pid can not be used directly in pthread_create,
reimar
parents:
27894
diff
changeset
|
350 stream->cache_pid = 1; |
4c2232462353
100l, stream->cache_pid can not be used directly in pthread_create,
reimar
parents:
27894
diff
changeset
|
351 } |
26077 | 352 #endif |
10197 | 353 #endif |
3562 | 354 // wait until cache is filled at least prefill_init % |
17366 | 355 mp_msg(MSGT_CACHE,MSGL_V,"CACHE_PRE_INIT: %"PRId64" [%"PRId64"] %"PRId64" pre:%d eof:%d \n", |
17384 | 356 (int64_t)s->min_filepos,(int64_t)s->read_filepos,(int64_t)s->max_filepos,min,s->eof); |
3562 | 357 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
|
358 mp_msg(MSGT_CACHE,MSGL_STATUS,MSGTR_CacheFill, |
3600 | 359 100.0*(float)(s->max_filepos-s->read_filepos)/(float)(s->buffer_size), |
17366 | 360 (int64_t)s->max_filepos-s->read_filepos |
3562 | 361 ); |
362 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
|
363 if(stream_check_interrupt(PREFILL_SLEEP_TIME)) |
4825
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
3726
diff
changeset
|
364 return 0; |
3562 | 365 } |
16870 | 366 mp_msg(MSGT_CACHE,MSGL_STATUS,"\n"); |
4825
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
3726
diff
changeset
|
367 return 1; // parent exits |
3562 | 368 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
369 |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
370 #if defined(__MINGW32__) || defined(PTHREAD_CACHE) || defined(__OS2__) |
10197 | 371 } |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
372 #ifdef PTHREAD_CACHE |
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
373 static void *ThreadProc( void *s ){ |
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
374 #else |
26077 | 375 static void ThreadProc( void *s ){ |
376 #endif | |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
377 #endif |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
378 |
27343 | 379 #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
|
380 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
|
381 #endif |
2322 | 382 // cache thread mainloop: |
383 signal(SIGTERM,exit_sighandler); // kill | |
27770
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
384 do { |
27769 | 385 if(!cache_fill(s)){ |
10197 | 386 usec_sleep(FILL_USLEEP_TIME); // idle |
2322 | 387 } |
2327 | 388 // cache_stats(s->cache_data); |
27770
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
389 } while (cache_execute_control(s)); |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
390 #if defined(__MINGW32__) || defined(__OS2__) |
27770
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
391 _endthread(); |
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
392 #endif |
27894
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
393 #ifdef PTHREAD_CACHE |
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
394 return NULL; |
d06d8e459ae1
Use pthreads for the cache on Cygwin, since _beginthread is not available
reimar
parents:
27876
diff
changeset
|
395 #endif |
2322 | 396 } |
397 | |
398 int cache_stream_fill_buffer(stream_t *s){ | |
399 int len; | |
400 if(s->eof){ s->buf_pos=s->buf_len=0; return 0; } | |
401 if(!s->cache_pid) return stream_fill_buffer(s); | |
402 | |
2352 | 403 // cache_stats(s->cache_data); |
404 | |
2371 | 405 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 | 406 |
2322 | 407 len=cache_read(s->cache_data,s->buffer, ((cache_vars_t*)s->cache_data)->sector_size); |
2352 | 408 //printf("cache_stream_fill_buffer->read -> %d\n",len); |
2327 | 409 |
2322 | 410 if(len<=0){ s->eof=1; s->buf_pos=s->buf_len=0; return 0; } |
411 s->buf_pos=0; | |
412 s->buf_len=len; | |
413 s->pos+=len; | |
414 // printf("[%d]",len);fflush(stdout); | |
415 return len; | |
416 | |
417 } | |
418 | |
2352 | 419 int cache_stream_seek_long(stream_t *stream,off_t pos){ |
420 cache_vars_t* s; | |
421 off_t newpos; | |
422 if(!stream->cache_pid) return stream_seek_long(stream,pos); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
423 |
2352 | 424 s=stream->cache_data; |
425 // s->seek_lock=1; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28014
diff
changeset
|
426 |
17366 | 427 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 | 428 |
2352 | 429 newpos=pos/s->sector_size; newpos*=s->sector_size; // align |
430 stream->pos=s->read_filepos=newpos; | |
431 s->eof=0; // !!!!!!! | |
432 | |
433 cache_stream_fill_buffer(stream); | |
2322 | 434 |
2352 | 435 pos-=newpos; |
436 if(pos>=0 && pos<=stream->buf_len){ | |
437 stream->buf_pos=pos; // byte position in sector | |
438 return 1; | |
439 } | |
440 | |
441 // stream->buf_pos=stream->buf_len=0; | |
442 // return 1; | |
443 | |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16152
diff
changeset
|
444 mp_msg(MSGT_CACHE,MSGL_V,"cache_stream_seek: WARNING! Can't seek to 0x%"PRIX64" !\n",(int64_t)(pos+newpos)); |
2322 | 445 return 0; |
446 } | |
26833
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
447 |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
448 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
|
449 cache_vars_t* s = stream->cache_data; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
450 switch (cmd) { |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
451 case STREAM_CTRL_SEEK_TO_TIME: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
452 s->control_double_arg = *(double *)arg; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
453 s->control = cmd; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
454 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
455 case STREAM_CTRL_SEEK_TO_CHAPTER: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
456 case STREAM_CTRL_SET_ANGLE: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
457 s->control_uint_arg = *(unsigned *)arg; |
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 // 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
|
461 case STREAM_CTRL_GET_TIME_LENGTH: |
26924
ca50c4a72f68
100l, fix wrong order of cases in cache_do_control
reimar
parents:
26897
diff
changeset
|
462 // case STREAM_CTRL_GET_CURRENT_TIME: |
26847
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
463 *(double *)arg = s->stream_time_length; |
4f875ae5d538
Emulate STREAM_CTRL_GET_TIME_LENGTH if cache is used.
reimar
parents:
26833
diff
changeset
|
464 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
|
465 case STREAM_CTRL_GET_NUM_CHAPTERS: |
ca50c4a72f68
100l, fix wrong order of cases in cache_do_control
reimar
parents:
26897
diff
changeset
|
466 case STREAM_CTRL_GET_CURRENT_CHAPTER: |
26833
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
467 case STREAM_CTRL_GET_ASPECT_RATIO: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
468 case STREAM_CTRL_GET_NUM_ANGLES: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
469 case STREAM_CTRL_GET_ANGLE: |
27770
c8d4cace053d
Avoid CreateThread and especially TerminateThread since they cause a memleak.
reimar
parents:
27769
diff
changeset
|
470 case -2: |
26833
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
471 s->control = cmd; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
472 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
473 default: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
474 return STREAM_UNSUPPORTED; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
475 } |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
476 while (s->control != -1) |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
477 usec_sleep(CONTROL_SLEEP_TIME); |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
478 switch (cmd) { |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
479 case STREAM_CTRL_GET_TIME_LENGTH: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
480 case STREAM_CTRL_GET_CURRENT_TIME: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
481 case STREAM_CTRL_GET_ASPECT_RATIO: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
482 *(double *)arg = s->control_double_arg; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
483 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
484 case STREAM_CTRL_GET_NUM_CHAPTERS: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
485 case STREAM_CTRL_GET_CURRENT_CHAPTER: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
486 case STREAM_CTRL_GET_NUM_ANGLES: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
487 case STREAM_CTRL_GET_ANGLE: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
488 *(unsigned *)arg = s->control_uint_arg; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
489 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
490 case STREAM_CTRL_SEEK_TO_CHAPTER: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
491 case STREAM_CTRL_SEEK_TO_TIME: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
492 case STREAM_CTRL_SET_ANGLE: |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
493 stream->pos = s->read_filepos = s->control_new_pos; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
494 break; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
495 } |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
496 return s->control_res; |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
497 } |