source: titan/titan/pip.h @ 25589

Last change on this file since 25589 was 23286, checked in by nit, 11 years ago

[titan] cleanup

File size: 7.6 KB
Line 
1#ifndef PIP_H
2#define PIP_H
3
4//flag 0: channel
5//flag 1: playback
6//flag 3: same as 0 but don't check chnode
7//flag 4: same as 0 but new tuning
8//flag 5: same as 3 but new tuning
9int pipstartreal(struct channel* chnode, char* pin, int flag)
10{
11        struct transponder* tpnode = NULL;
12        struct dvbdev *fenode = NULL;
13        struct dvbdev *dmxvideonode = NULL;
14        struct dvbdev *videonode = NULL;
15        int ret = 0, festatus = 1;
16        unsigned char *patbuf = NULL;
17        int checkpmt = 0, pincheck = 0, ageprotect = 0, tune = 0;
18        struct epg* epgnode = NULL;
19
20        m_lock(&status.servicemutex, 2);
21
22        status.secondzap = 0;
23
24        if(flag == 4 || flag == 5) tune = 1;
25        if(flag == 4) flag = 0;
26
27        if(flag == 0 && status.pipservice->type == CHANNEL && status.pipservice->channel != NULL && chnode == status.pipservice->channel)
28        {
29                m_unlock(&status.servicemutex, 2);
30                return 20;
31        }
32        if(flag == 3 || flag == 5) flag = 0;
33
34        if(chnode == NULL)
35        {
36                m_unlock(&status.servicemutex, 2);
37                return 21;
38        }
39       
40        ageprotect = getconfigint("ageprotect", NULL);
41        if(ageprotect > 0) epgnode = getepgakt(chnode);
42        if(chnode->protect > 0 || (epgnode != NULL && epgnode->parentalrating >= ageprotect))
43        {
44                pincheck = screenpincheck(1, pin);
45                if(pincheck == 1)
46                {
47                        m_unlock(&status.servicemutex, 2);
48                        return 22;
49                }
50        }
51
52        //got transponder
53        if(flag == 0)
54        {
55                if(chnode->transponder == NULL)
56                        tpnode = gettransponder(chnode->transponderid);
57                else
58                        tpnode = chnode->transponder;
59        }
60
61        ret = pipstop(status.pipservice, 0);
62
63        //can't stop service (timeshift ??)
64        if(ret == 1)
65        {
66                m_unlock(&status.servicemutex, 2);
67                return 22;
68        }
69       
70        status.pipservice->transponder = tpnode;
71        status.pipservice->channel = chnode;
72        status.pipservice->type = CHANNEL;
73
74        //got frontend dev
75        if(flag == 0)
76        {
77                fenode = fegetfree(tpnode, 0, NULL);
78                if(fenode == NULL)
79                {
80                        m_unlock(&status.servicemutex, 2);
81                        return 1;
82                }
83
84                status.pipservice->fedev = fenode;
85
86                //frontend tune
87                if(fenode->felasttransponder != tpnode || tune == 1)
88                {
89                        if(fenode->feinfo->type == FE_QPSK)
90                        {
91                                feset(fenode, tpnode);
92                                fetunedvbs(fenode, tpnode);
93                        }
94                        else if(fenode->feinfo->type == FE_QAM)
95                                fetunedvbc(fenode, tpnode);
96                        else if(fenode->feinfo->type == FE_OFDM)
97                                fetunedvbt(fenode, tpnode);
98                        else
99                        {
100                                m_unlock(&status.servicemutex, 2);
101                                return 3;
102                        }
103                }
104        }
105        else if(flag == 1)
106        {
107                fenode = fegetdummy();
108                status.pipservice->fedev = fenode;
109        }
110
111        if(fenode == NULL)
112        {
113                m_unlock(&status.servicemutex, 2);
114                return 1;
115        }
116
117        //check pmt if not all infos in channellist
118        if(chnode->videopid == -1 || chnode->videocodec == -1)
119        {
120                //wait for tuner lock
121                if(flag == 0)
122                {
123                        if(fenode->felasttransponder != tpnode)
124                                festatus = fewait(fenode);
125                        else
126                                festatus = fegetunlock(fenode);
127
128                        if(debug_level == 200) 
129                        {
130                                fereadstatus(fenode);
131                                fegetfrontend(fenode);
132                        }
133                        if(festatus != 0)
134                        {
135                                m_unlock(&status.servicemutex, 2);
136                                return 2;
137                        }
138                }
139
140                checkpmt = 1;
141                if(flag != 1 || (flag == 1 && chnode->pmtpid == 0))
142                {
143                        patbuf = dvbgetpat(fenode, -1);
144                        if(patbuf == NULL) status.secondzap = 1;
145                }
146                free(status.pipservice->pmtbuf);
147                status.pipservice->pmtbuf = NULL;
148                status.pipservice->pmtlen = 0;
149                if(patbuf != NULL)
150                        status.pipservice->pmtbuf = dvbgetpmt(fenode, patbuf, chnode->serviceid, &chnode->pmtpid, &status.pipservice->pmtlen, -1, 0);
151                else if(chnode->pmtpid > 0)
152                        status.pipservice->pmtbuf = dvbgetpmt(fenode, NULL, chnode->serviceid, &chnode->pmtpid, &status.pipservice->pmtlen, -1, 1);
153
154                if(status.pipservice->pmtbuf == NULL) status.secondzap = 2;
155                dvbgetinfo(status.pipservice->pmtbuf, chnode);
156
157                if(flag == 0) sendcapmt(status.pipservice, 0, 0);
158                free(patbuf);
159        }
160
161        if(flag != 0) checkpmt = 1;
162
163        //demux video start
164        if(chnode->videopid > 0)
165        {
166                if(status.pipservice->dmxvideodev != NULL && status.pipservice->dmxvideodev->fd >= 0 && status.pipservice->dmxvideodev->adapter == fenode->adapter && status.pipservice->dmxvideodev->devnr == fenode->devnr)
167                        dmxvideonode = status.pipservice->dmxvideodev;
168                else
169                {
170                        dmxclose(status.pipservice->dmxvideodev, -1);
171                        dmxvideonode = dmxopen(fenode);
172                        if(dmxsetbuffersize(dmxvideonode, getconfigint("dmxvideobuffersize", NULL)) != 0)
173                        {
174                                dmxclose(dmxvideonode, -1);
175                                dmxvideonode = NULL;
176                        }
177                        status.pipservice->dmxvideodev = dmxvideonode;
178                }
179                if(dmxvideonode != NULL)
180                {
181                        if(dmxsetsource(dmxvideonode, fenode->fedmxsource) != 0)
182                        {
183                                dmxclose(dmxvideonode, -1);
184                                dmxvideonode = NULL;
185                        }
186                        if(dmxsetpesfilter(dmxvideonode, chnode->videopid, -1, DMX_OUT_DECODER, DMX_PES_VIDEO1, 0) != 0)
187                        {
188                                dmxclose(dmxvideonode, -1);
189                                dmxvideonode = NULL;
190                        }
191                }
192                else
193                        err("demux video dev not ok");
194        }
195        else
196        {
197                err("dmx videopid not valid (%d)", chnode->videopid);
198                dmxclose(status.pipservice->dmxvideodev, -1);
199        }
200
201        status.pipservice->dmxvideodev = dmxvideonode;
202
203        //video start
204        if(dmxvideonode != NULL)
205        {
206                if(status.pipservice->videodev != NULL && status.pipservice->videodev->fd >= 0 && status.pipservice->videodev->adapter == fenode->adapter)
207                        videonode = status.pipservice->videodev;
208                else
209                {
210                        videoclose(status.pipservice->videodev, -1);
211                        videonode = videoopen(fenode->adapter, 1);
212                        status.pipservice->videodev = videonode;
213                }
214                if(videonode != NULL)
215                {
216                        videoselectsource(videonode, VIDEO_SOURCE_DEMUX);
217                        if(chnode->videocodec == VC1)
218                        {
219                                videosetstreamtype(videonode, 1); //transportstream
220                                videosetencoding(videonode, chnode->videocodec);
221                        }
222                        else
223                                videosetstreamtype(videonode, chnode->videocodec);
224                        videoplay(videonode);
225                }
226                else
227                        err("can't get free video dev");
228        }
229
230        //check pmt if not done
231        if(checkpmt == 0)
232        {
233                //wait for tuner lock
234                if(flag == 0)
235                {
236                        if(fenode->felasttransponder != tpnode)
237                                festatus = fewait(fenode);
238                        else
239                                festatus = fegetunlock(fenode);
240
241                        if(debug_level == 200)
242                        {
243                                fereadstatus(fenode);
244                                fegetfrontend(fenode);
245                        }
246                        if(festatus != 0)
247                        {
248                                m_unlock(&status.servicemutex, 2);
249                                return 2;
250                        }
251                }
252
253                checkpmt = 1;
254                patbuf = dvbgetpat(fenode, -1);
255                if(patbuf == NULL) status.secondzap = 3;
256                free(status.pipservice->pmtbuf);
257                status.pipservice->pmtbuf = NULL;
258                status.pipservice->pmtlen = 0;
259                if(patbuf != NULL)
260                        status.pipservice->pmtbuf = dvbgetpmt(fenode, patbuf, chnode->serviceid, &chnode->pmtpid, &status.pipservice->pmtlen, -1, 0);
261                else if(chnode->pmtpid > 0)
262                        status.pipservice->pmtbuf = dvbgetpmt(fenode, NULL, chnode->serviceid, &chnode->pmtpid, &status.pipservice->pmtlen, -1, 1);
263
264                if(status.pipservice->pmtbuf == NULL) status.secondzap = 4;
265                if(dvbgetinfo(status.pipservice->pmtbuf, chnode) == 1)
266                {
267                        //audio or video pid or codec changed
268                        free(status.pipservice->pmtbuf);
269                        status.pipservice->pmtbuf = NULL;
270                        status.pipservice->pmtlen = 0;
271                }
272
273                if(flag == 0) sendcapmt(status.pipservice, 0, 0);
274                free(patbuf);
275        }
276
277        if(flag == 0)
278        {
279                festatus = fewait(fenode);
280                if(festatus != 0)
281                {
282                        m_unlock(&status.servicemutex, 2);
283                        return 2;
284                }
285        }
286
287        m_unlock(&status.servicemutex, 2);
288       
289        return 0;
290}
291
292//second zap on failure
293//TODO: use flag 6 (same as 5 but no pin question on second tune)
294int pipstart(struct channel* chnode, char* pin, int flag)
295{
296        int ret = 0;
297
298        ret = pipstartreal(chnode, pin, flag);
299
300        if(status.secondzap != 0 && ret == 0 && (flag == 0 || flag > 2))
301        {
302                debug(200, "first zap not ok, make second zap (%d)", status.secondzap);
303                ret = pipstartreal(chnode, pin, 5);
304        }
305
306        return ret;
307}
308
309int pipstop(struct service *node, int flag)
310{
311        if(node != NULL)
312        {
313                if(node->type != NOTHING && node->type != STILLPIC) caservicedel(node, NULL);
314
315                node->type = NOTHING;
316
317                videostop(node->videodev, 1);
318                videoclose(node->videodev, -1);
319                node->videodev = NULL;
320                dmxstop(node->dmxvideodev);
321                dmxclose(node->dmxvideodev, -1);
322                node->dmxvideodev = NULL;
323                return 0;
324        }
325        return 1;
326}
327
328#endif
Note: See TracBrowser for help on using the repository browser.