source: titan/titan/marker.h @ 25677

Last change on this file since 25677 was 25677, checked in by gost, 10 years ago

fix

  • Property svn:executable set to *
File size: 10.7 KB
Line 
1#ifndef MARKER_H
2#define MARKER_H
3
4struct 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
78int 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
113int 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
126int 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
153int 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
179int 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
237int 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       
268void 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
336off64_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
363void 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 pos = 0, prosec = 0, diff = 0;
383       
384        struct service* snode = getservice(RECORDPLAY, 0);
385        if(snode == NULL) return;
386       
387        if(status.playmarker == NULL)
388                return;
389        struct marker *marker = status.playmarker;
390       
391        seeker = (struct seeker*)calloc(1, sizeof(struct seeker));
392        seeker->spos  = 0;
393        seeker->stime = 0;
394        seeker->epos  = marker->pos;
395        seeker->etime = marker->time;
396        seeker->next  = NULL;
397        seekerarb = seeker;
398       
399        prosec = seeker->epos / seeker->etime;
400
401        while(marker->next != NULL)
402        {
403                seekerarb->next = (struct seeker*)calloc(1, sizeof(struct seeker));
404                seekerarb = seekerarb->next;
405                marker = marker->next;
406                seekerarb->spos  = marker->pos;
407                seekerarb->stime = marker->time;
408                if(marker->next == NULL)
409                {
410                        seekerarb->epos  = 0;
411                        seekerarb->etime = 9999999;
412                        seekerarb->next  = NULL;
413                }
414                else {
415                        marker = marker->next;
416                        seekerarb->epos  = marker->pos;
417                        seekerarb->etime = marker->time;
418                        seekerarb->next  = NULL;
419                }
420        }
421       
422        ret = playergetinfots(&len, &startpos, NULL, &hpos, NULL, 0);
423       
424        while ((status.playspeed != 0 || status.play != 0 || status.pause != 0) && status.autoseek == 1)
425        {
426                ret = videogetpts(status.aktservice->videodev, &pts);
427                if(ret == 0) {
428                        time = (pts - startpos) / 90000;
429                        if(lasttime > time)
430                                dir = -1;
431                        else
432                                dir = 1;
433                        lasttime = time;
434                        seekerarb = seeker;
435                        while(1)
436                        {
437                                if(time >= seekerarb->stime && time < seekerarb->etime) {
438                                        m_lock(&status.tsseekmutex, 15);       
439                                        if(dir == 1) {
440                                                diff = (time - seekerarb->stime) * prosec;
441                                                if(seekerarb->epos == 0)
442                                                        lseek64(snode->recsrcfd, 188+1024 , SEEK_END);
443                                                else
444                                                        lseek64(snode->recsrcfd, seekerarb->epos+diff, SEEK_SET);
445                                        }
446                                        else if(dir == -1) {
447                                                diff = (seekerarb->etime - time) * prosec;
448                                                lseek64(snode->recsrcfd, seekerarb->spos-diff, SEEK_SET);
449                                        }
450                                        playerresetts();
451                                        m_unlock(&status.tsseekmutex, 15);
452                                        break;                                 
453                                }
454                                if(seekerarb->next != NULL)
455                                        seekerarb = seekerarb->next;
456                                else
457                                        break;
458                        }
459                }
460                sleep(1);
461        }
462       
463        while(1)
464        {
465                seekerarb = seeker->next;
466                free(seeker); seeker = NULL;
467                if(seekerarb == NULL)
468                        break;
469                seeker = seekerarb;
470        }
471        status.autoseek = 0;
472}
473
474       
475
476
477#endif
Note: See TracBrowser for help on using the repository browser.