1 | #ifndef MARKER_H |
---|
2 | #define MARKER_H |
---|
3 | |
---|
4 | struct marker* addmarkernode(off64_t pos) |
---|
5 | { |
---|
6 | |
---|
7 | struct marker *newnode = NULL; |
---|
8 | struct marker *oldnode = NULL; |
---|
9 | struct marker *prev = NULL; |
---|
10 | |
---|
11 | newnode = (struct marker*)calloc(1, sizeof(struct marker)); |
---|
12 | if(newnode == NULL) |
---|
13 | { |
---|
14 | err("no memory"); |
---|
15 | return NULL; |
---|
16 | } |
---|
17 | newnode->next = NULL; |
---|
18 | newnode->pos = pos; |
---|
19 | |
---|
20 | if(status.playmarker == NULL) |
---|
21 | { |
---|
22 | newnode->prev = NULL; |
---|
23 | status.playmarker = newnode; |
---|
24 | return newnode; |
---|
25 | } |
---|
26 | |
---|
27 | oldnode = status.playmarker; |
---|
28 | if(pos == -1) |
---|
29 | { |
---|
30 | while(oldnode->next != NULL) |
---|
31 | { |
---|
32 | oldnode = oldnode->next; |
---|
33 | } |
---|
34 | oldnode->next = newnode; |
---|
35 | newnode->prev = oldnode; |
---|
36 | } |
---|
37 | else |
---|
38 | { |
---|
39 | prev = oldnode; |
---|
40 | while(oldnode->next != NULL && oldnode->pos < pos) |
---|
41 | { |
---|
42 | prev = oldnode; |
---|
43 | oldnode = oldnode->next; |
---|
44 | } |
---|
45 | |
---|
46 | if(oldnode->prev == NULL) |
---|
47 | { |
---|
48 | if(oldnode->pos > pos) |
---|
49 | { |
---|
50 | newnode->next = oldnode; |
---|
51 | newnode->prev = NULL; |
---|
52 | oldnode->prev = newnode; |
---|
53 | status.playmarker = newnode; |
---|
54 | return newnode; |
---|
55 | } |
---|
56 | } |
---|
57 | if(oldnode->next == NULL) |
---|
58 | { |
---|
59 | if(oldnode->pos < pos) |
---|
60 | { |
---|
61 | newnode->next = NULL; |
---|
62 | newnode->prev = oldnode; |
---|
63 | oldnode->next = newnode; |
---|
64 | return newnode; |
---|
65 | } |
---|
66 | } |
---|
67 | newnode->next = prev->next; |
---|
68 | newnode->prev = prev; |
---|
69 | if(prev->next != NULL) |
---|
70 | prev->next->prev = newnode; |
---|
71 | prev->next = newnode; |
---|
72 | } |
---|
73 | |
---|
74 | return newnode; |
---|
75 | } |
---|
76 | |
---|
77 | |
---|
78 | int delmarkernode(off64_t pos) |
---|
79 | { |
---|
80 | if(status.playmarker == NULL) |
---|
81 | return -1; |
---|
82 | |
---|
83 | struct marker* delnode; |
---|
84 | struct marker* node = status.playmarker; |
---|
85 | |
---|
86 | delnode = node; |
---|
87 | while(delnode != NULL) |
---|
88 | { |
---|
89 | node = delnode->next; |
---|
90 | if(pos == -1) |
---|
91 | { |
---|
92 | free(delnode->timetext); |
---|
93 | free(delnode); |
---|
94 | status.playmarker = NULL; |
---|
95 | } |
---|
96 | else if(delnode->pos == pos) |
---|
97 | { |
---|
98 | if(delnode->next != NULL) |
---|
99 | delnode->next->prev = delnode->prev; |
---|
100 | if(delnode->prev == NULL) |
---|
101 | status.playmarker = delnode->next; |
---|
102 | else |
---|
103 | delnode->prev->next = delnode->next; |
---|
104 | free(delnode->timetext); |
---|
105 | free(delnode); |
---|
106 | break; |
---|
107 | } |
---|
108 | delnode = node; |
---|
109 | } |
---|
110 | return 0; |
---|
111 | } |
---|
112 | |
---|
113 | int delmarker(char* timetext) |
---|
114 | { |
---|
115 | struct marker* marker = status.playmarker; |
---|
116 | |
---|
117 | while(marker != NULL) |
---|
118 | { |
---|
119 | if(ostrcmp(marker->timetext, timetext) == 0) |
---|
120 | return delmarkernode(marker->pos); |
---|
121 | marker = marker->next; |
---|
122 | } |
---|
123 | return -1; |
---|
124 | } |
---|
125 | |
---|
126 | int getmarker(char* dateiname) |
---|
127 | { |
---|
128 | off64_t pos; |
---|
129 | off64_t time; |
---|
130 | struct marker *node = NULL; |
---|
131 | |
---|
132 | FILE* datei = fopen(dateiname, "r"); |
---|
133 | if(datei!= NULL) |
---|
134 | { |
---|
135 | while(!feof(datei)) |
---|
136 | { |
---|
137 | fscanf(datei, "%lld,%lld", &pos, &time); |
---|
138 | node = addmarkernode(pos); |
---|
139 | if(node == NULL) |
---|
140 | return -1; |
---|
141 | node->time = time; |
---|
142 | node->pos = pos; |
---|
143 | node->timetext = convert_timesec(time); |
---|
144 | } |
---|
145 | fclose(datei); |
---|
146 | } |
---|
147 | else |
---|
148 | return -1; |
---|
149 | |
---|
150 | return 0; |
---|
151 | } |
---|
152 | |
---|
153 | int putmarker(char* dateiname) |
---|
154 | { |
---|
155 | struct marker *node = NULL; |
---|
156 | |
---|
157 | if(status.playmarker == NULL) |
---|
158 | return -1; |
---|
159 | else |
---|
160 | node = status.playmarker; |
---|
161 | |
---|
162 | FILE* datei = fopen(dateiname, "w"); |
---|
163 | if(datei != NULL) |
---|
164 | { |
---|
165 | while(node->next != NULL) |
---|
166 | { |
---|
167 | fprintf(datei, "%lld,%lld\n", node->pos, node->time); |
---|
168 | node = node->next; |
---|
169 | } |
---|
170 | fprintf(datei, "%lld,%lld", node->pos, node->time); |
---|
171 | fclose(datei); |
---|
172 | } |
---|
173 | else |
---|
174 | return -1; |
---|
175 | |
---|
176 | return 0; |
---|
177 | } |
---|
178 | |
---|
179 | int setmarker() |
---|
180 | { |
---|
181 | unsigned long long atime = 0, len = 0, startpos = 0, ret = 0, aktpts = 0; |
---|
182 | struct marker *node = NULL; |
---|
183 | |
---|
184 | struct service* snode = getservice(RECORDPLAY, 0); |
---|
185 | if(snode == NULL) return -1; |
---|
186 | |
---|
187 | off64_t pos = lseek64(snode->recsrcfd, 0, SEEK_CUR); |
---|
188 | playergetinfots(&len, &startpos, NULL, &atime, NULL, 0); |
---|
189 | ret = videogetpts(status.aktservice->videodev, &aktpts); |
---|
190 | if(ret == 0) |
---|
191 | { |
---|
192 | atime = (aktpts - startpos) / 90000; |
---|
193 | printf("marker-> new position \n"); |
---|
194 | off64_t posn = playergetptspos(aktpts, pos, -1, 4, 0, 0, NULL); |
---|
195 | if(posn < -1) |
---|
196 | posn = playergetptspos(aktpts, pos - (posn *-1), -1, 4, 0, 0, NULL); |
---|
197 | if(posn < -1) |
---|
198 | posn = playergetptspos(aktpts, pos - (posn *-2), -1, 4, 0, 0, NULL); |
---|
199 | if(posn < -1) |
---|
200 | posn = playergetptspos(aktpts, pos - (posn *-3), -1, 4, 0, 0, NULL); |
---|
201 | if(posn < -1) |
---|
202 | posn = playergetptspos(aktpts, pos - (posn *-4), -1, 4, 0, 0, NULL); |
---|
203 | if(posn > 0) |
---|
204 | { |
---|
205 | printf("marker-> new position found. OLD: %lld NEW: %lld\n", pos, posn); |
---|
206 | pos = posn; |
---|
207 | } |
---|
208 | } |
---|
209 | else |
---|
210 | atime = (atime - startpos) / 90000; |
---|
211 | if(atime == 0) |
---|
212 | { |
---|
213 | // syntax ?? |
---|
214 | //int ret = textbox(_("Message"), _("ERROR... can't set marker in this file"), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, NULL, 0, 600, 200, 4, 0); |
---|
215 | textbox(_("Message"), _("ERROR... can't set marker in this file"), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, NULL, 0, 600, 200, 4, 0); |
---|
216 | return -1; |
---|
217 | } |
---|
218 | node = addmarkernode(pos); |
---|
219 | if(node != NULL) |
---|
220 | { |
---|
221 | node->pos = pos; |
---|
222 | node->time = atime; |
---|
223 | node->timetext = convert_timesec(atime); |
---|
224 | //char* filemarker = changefilenameext(snode->recname, ".ma"); |
---|
225 | //putmarker(filemarker); |
---|
226 | //free(filemarker); filemarker=NULL; |
---|
227 | // syntax ?? |
---|
228 | //int ret = textbox(_("Message"), _("Marker has been set."), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, NULL, 0, 600, 200, 2, 0); |
---|
229 | textbox(_("Message"), _("Marker has been set."), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, NULL, 0, 600, 200, 2, 0); |
---|
230 | } |
---|
231 | else |
---|
232 | return -1; |
---|
233 | |
---|
234 | return 0; |
---|
235 | } |
---|
236 | |
---|
237 | int jumpmarker(char* timetext) |
---|
238 | { |
---|
239 | struct marker* marker = status.playmarker; |
---|
240 | |
---|
241 | while(marker != NULL) |
---|
242 | { |
---|
243 | if(ostrcmp(marker->timetext, timetext) == 0) |
---|
244 | { |
---|
245 | |
---|
246 | struct service* snode = getservice(RECORDPLAY, 0); |
---|
247 | if(snode == NULL) return -1; |
---|
248 | |
---|
249 | m_lock(&status.tsseekmutex, 15); |
---|
250 | lseek64(snode->recsrcfd, marker->pos, SEEK_SET); |
---|
251 | playerresetts(); |
---|
252 | //videoclearbuffer(status.aktservice->videodev); |
---|
253 | //audioclearbuffer(status.aktservice->audiodev); |
---|
254 | ////videodiscontinuityskip(status.aktservice->videodev, 0); |
---|
255 | //audiostop(snode->audiodev); |
---|
256 | //videostop(snode->videodev, 0); |
---|
257 | //videoplay(snode->videodev); |
---|
258 | //audioplay(snode->audiodev); |
---|
259 | m_unlock(&status.tsseekmutex, 15); |
---|
260 | |
---|
261 | return 0; |
---|
262 | } |
---|
263 | marker = marker->next; |
---|
264 | } |
---|
265 | return -1; |
---|
266 | } |
---|
267 | |
---|
268 | void screenmarker(char* file, char* showname, int* playinfobarstatus, int* playinfobarcount, int playertype, int flag) |
---|
269 | { |
---|
270 | int rcret; |
---|
271 | //char* filemarker = NULL; |
---|
272 | //struct service* snode = getservice(RECORDPLAY, 0); |
---|
273 | |
---|
274 | struct skin* screen1 = getscreen("marker"); |
---|
275 | struct skin* listbox = getscreennode(screen1, "listbox"); |
---|
276 | struct skin* dummy = getscreennode(screen1, "dummy"); |
---|
277 | struct skin* tmp = NULL; |
---|
278 | |
---|
279 | struct marker *marker = NULL; |
---|
280 | |
---|
281 | marker = status.playmarker; |
---|
282 | while(marker != NULL) |
---|
283 | { |
---|
284 | tmp = addlistbox(screen1, listbox, tmp, 1); |
---|
285 | if(tmp != NULL) |
---|
286 | { |
---|
287 | tmp->textposx = dummy->textposx; |
---|
288 | tmp->prozposx = dummy->prozposx; |
---|
289 | tmp->prozposy = dummy->prozposy; |
---|
290 | tmp->height = dummy->height; |
---|
291 | tmp->valign = dummy->valign; |
---|
292 | tmp->hspace = dummy->hspace; |
---|
293 | |
---|
294 | changename(tmp, marker->timetext); |
---|
295 | changetext(tmp, marker->timetext); |
---|
296 | } |
---|
297 | marker = marker->next; |
---|
298 | } |
---|
299 | |
---|
300 | drawscreen(screen1, 0, 0); |
---|
301 | addscreenrc(screen1, listbox); |
---|
302 | while (1) |
---|
303 | { |
---|
304 | rcret = waitrc(screen1, 0, 0); |
---|
305 | if(rcret==getrcconfigint("rcexit",NULL)) break; |
---|
306 | if(listbox->select != NULL && rcret==getrcconfigint("rcok",NULL)) |
---|
307 | { |
---|
308 | if(jumpmarker(listbox->select->text) == 0) |
---|
309 | break; |
---|
310 | } |
---|
311 | if(listbox->select != NULL && rcret==getrcconfigint("rcred",NULL)) |
---|
312 | { |
---|
313 | if(delmarker(listbox->select->text) == 0) |
---|
314 | { |
---|
315 | //filemarker = changefilenameext(snode->recname, ".ma"); |
---|
316 | //putmarker(filemarker); |
---|
317 | //free(filemarker); filemarker=NULL; |
---|
318 | listbox->select->hidden = YES; |
---|
319 | clearscreen(screen1); |
---|
320 | drawscreen(screen1, 0, 0); |
---|
321 | } |
---|
322 | } |
---|
323 | } |
---|
324 | delownerrc(screen1); |
---|
325 | delmarkedscreennodes(screen1, 1); |
---|
326 | clearscreen(screen1); |
---|
327 | blitfb(0); |
---|
328 | if(rcret==getrcconfigint("rcok",NULL)) |
---|
329 | { |
---|
330 | *playinfobarstatus = 1; |
---|
331 | *playinfobarcount = 0; |
---|
332 | screenplayinfobar(file, showname, 0, playertype, flag); |
---|
333 | } |
---|
334 | } |
---|
335 | |
---|
336 | off64_t getcurrentpos(struct service* snode) |
---|
337 | { |
---|
338 | unsigned long long aktpts = 0; |
---|
339 | int ret = 0; |
---|
340 | off64_t posn = -1; |
---|
341 | |
---|
342 | off64_t pos = lseek64(snode->recsrcfd, 0, SEEK_CUR); |
---|
343 | |
---|
344 | ret = videogetpts(status.aktservice->videodev, &aktpts); |
---|
345 | if(ret == 0) |
---|
346 | { |
---|
347 | posn = playergetptspos(aktpts, pos, -1, 4, 0, 0, NULL); |
---|
348 | if(posn < -1) |
---|
349 | posn = playergetptspos(aktpts, pos - (posn *-1), -1, 4, 0, 0, NULL); |
---|
350 | if(posn < -1) |
---|
351 | posn = playergetptspos(aktpts, pos - (posn *-2), -1, 4, 0, 0, NULL); |
---|
352 | if(posn < -1) |
---|
353 | posn = playergetptspos(aktpts, pos - (posn *-3), -1, 4, 0, 0, NULL); |
---|
354 | if(posn < -1) |
---|
355 | posn = playergetptspos(aktpts, pos - (posn *-4), -1, 4, 0, 0, NULL); |
---|
356 | } |
---|
357 | printf("return current pos: %lld \n", posn); |
---|
358 | return posn; |
---|
359 | } |
---|
360 | |
---|
361 | |
---|
362 | |
---|
363 | void markerautoseek_thread() |
---|
364 | { |
---|
365 | struct seeker |
---|
366 | { |
---|
367 | off64_t spos; |
---|
368 | off64_t stime; |
---|
369 | off64_t epos; |
---|
370 | off64_t etime; |
---|
371 | struct seeker* prev; |
---|
372 | struct seeker* next; |
---|
373 | }; |
---|
374 | |
---|
375 | struct seeker *seeker = NULL; |
---|
376 | struct seeker *seekerarb = NULL; |
---|
377 | int ret = 0, time = 0, lasttime = 0; |
---|
378 | int dir = 0; |
---|
379 | unsigned long long pts = 0; |
---|
380 | unsigned long long hpos = 0, len = 0; |
---|
381 | unsigned long long startpos = 0; |
---|
382 | off64_t prosec = 0, diff = 0; |
---|
383 | |
---|
384 | if(status.autoseek == 2) |
---|
385 | { |
---|
386 | sleep(2); |
---|
387 | status.autoseek = 1; |
---|
388 | } |
---|
389 | |
---|
390 | struct service* snode = getservice(RECORDPLAY, 0); |
---|
391 | if(snode == NULL) return; |
---|
392 | |
---|
393 | if(status.playmarker == NULL) |
---|
394 | return; |
---|
395 | struct marker *marker = status.playmarker; |
---|
396 | |
---|
397 | seeker = (struct seeker*)calloc(1, sizeof(struct seeker)); |
---|
398 | seeker->spos = 0; |
---|
399 | seeker->stime = 0; |
---|
400 | seeker->epos = marker->pos; |
---|
401 | seeker->etime = marker->time; |
---|
402 | seeker->next = NULL; |
---|
403 | seekerarb = seeker; |
---|
404 | |
---|
405 | prosec = seeker->epos / seeker->etime; |
---|
406 | prosec = (prosec / 188) * 188; |
---|
407 | |
---|
408 | while(marker->next != NULL) |
---|
409 | { |
---|
410 | seekerarb->next = (struct seeker*)calloc(1, sizeof(struct seeker)); |
---|
411 | seekerarb = seekerarb->next; |
---|
412 | marker = marker->next; |
---|
413 | seekerarb->spos = marker->pos; |
---|
414 | seekerarb->stime = marker->time; |
---|
415 | if(marker->next == NULL) |
---|
416 | { |
---|
417 | seekerarb->epos = 0; |
---|
418 | seekerarb->etime = 9999999; |
---|
419 | seekerarb->next = NULL; |
---|
420 | } |
---|
421 | else { |
---|
422 | marker = marker->next; |
---|
423 | seekerarb->epos = marker->pos; |
---|
424 | seekerarb->etime = marker->time; |
---|
425 | seekerarb->next = NULL; |
---|
426 | } |
---|
427 | } |
---|
428 | |
---|
429 | ret = playergetinfots(&len, &startpos, NULL, &hpos, NULL, 0); |
---|
430 | |
---|
431 | while ((status.playspeed != 0 || status.play != 0 || status.pause != 0) && status.autoseek == 1) |
---|
432 | { |
---|
433 | ret = videogetpts(status.aktservice->videodev, &pts); |
---|
434 | if(ret == 0) { |
---|
435 | time = (pts - startpos) / 90000; |
---|
436 | if(lasttime > time || status.playspeed < 0) |
---|
437 | dir = -1; |
---|
438 | else |
---|
439 | dir = 1; |
---|
440 | lasttime = time; |
---|
441 | seekerarb = seeker; |
---|
442 | while(1) |
---|
443 | { |
---|
444 | if(time >= seekerarb->stime && time < seekerarb->etime) { |
---|
445 | m_lock(&status.tsseekmutex, 15); |
---|
446 | if(dir == 1) { |
---|
447 | diff = (time - seekerarb->stime) * prosec; |
---|
448 | if(seekerarb->epos == 0) |
---|
449 | lseek64(snode->recsrcfd, 188+1024 , SEEK_END); |
---|
450 | else |
---|
451 | lseek64(snode->recsrcfd, seekerarb->epos+diff, SEEK_SET); |
---|
452 | } |
---|
453 | else if(dir == -1) { |
---|
454 | diff = (seekerarb->etime - time) * prosec; |
---|
455 | lseek64(snode->recsrcfd, seekerarb->spos-diff, SEEK_SET); |
---|
456 | } |
---|
457 | playerresetts(); |
---|
458 | m_unlock(&status.tsseekmutex, 15); |
---|
459 | break; |
---|
460 | } |
---|
461 | if(seekerarb->next != NULL) |
---|
462 | seekerarb = seekerarb->next; |
---|
463 | else |
---|
464 | break; |
---|
465 | } |
---|
466 | } |
---|
467 | sleep(1); |
---|
468 | } |
---|
469 | |
---|
470 | while(1) |
---|
471 | { |
---|
472 | seekerarb = seeker->next; |
---|
473 | free(seeker); seeker = NULL; |
---|
474 | if(seekerarb == NULL) |
---|
475 | break; |
---|
476 | seeker = seekerarb; |
---|
477 | } |
---|
478 | status.autoseek = 0; |
---|
479 | } |
---|
480 | |
---|
481 | |
---|
482 | |
---|
483 | |
---|
484 | #endif |
---|