source: titan/titan/stream.h @ 34375

Last change on this file since 34375 was 31855, checked in by gost, 9 years ago

[titan] mipsel.. transcode at transcode button

File size: 6.1 KB
Line 
1#ifndef STREAM_H
2#define STREAM_H
3
4void screenstreaming()
5{
6        int count = 0;
7        char* tmpstr = NULL;
8        struct service* servicenode = service;
9        struct menulist* mlist = NULL, *mbox = NULL;
10
11        while(servicenode != NULL)
12        {
13                if(servicenode->type == RECORDSTREAM && servicenode->recname != NULL)
14                {
15                        tmpstr = ostrcat(tmpstr, _("stop"), 1, 0);
16                        tmpstr = ostrcat(tmpstr, " ", 1, 0);
17                        tmpstr = ostrcat(tmpstr, servicenode->recname, 1, 0);
18                        tmpstr = ostrcat(tmpstr, " (", 1, 0);
19                        if(servicenode->channel != NULL && servicenode->channel->name != NULL)
20                                tmpstr = ostrcat(tmpstr, servicenode->channel->name, 1, 0);
21                        else
22                                tmpstr = ostrcat(tmpstr, _("unknown"), 1, 0);
23                        tmpstr = ostrcat(tmpstr, ")", 1, 0);
24
25                        count++;
26                        addmenulist(&mlist, tmpstr, NULL, NULL, 0, 0);
27                        free(tmpstr); tmpstr = NULL;
28                }
29                servicenode = servicenode->next;
30        }
31
32        if(count == 0)
33                textbox(_("Message"), _("No Live Stream running"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 0, 0);
34        else
35        {
36                mbox = menulistbox(mlist, "menulist", _("Streaming"), _("Choose your Streaming link from the following list"), NULL, NULL, 0, 0);
37                if(mbox != NULL && ostrstr(mbox->name, _("stop")) == mbox->name)
38                {
39                        servicenode = getrecordbyname(mbox->name, RECORDSTREAM);
40                        if(servicenode != NULL)
41                                servicenode->recendtime = 1;
42                }
43        }
44
45        freemenulist(mlist, 1); mlist = NULL;
46}
47
48void streamthreadfunc(struct stimerthread* timernode)
49{
50        struct timeval timeout;
51        fd_set rfds;
52        int ret = 0, streamfd = -1, connfd = -1, filefd = -1, serviceid = 0;
53        uint64_t transponderid = 0;
54        unsigned char* buf = NULL;
55        char* tmpstr = NULL, *filename = NULL;
56        struct channel* chnode = NULL;
57
58        debug(250, "Starting Stream thread");
59
60        while(timernode->aktion != STOP)
61        {
62                if(streamfd < 0)
63                {
64                        sockportcreate(&streamfd, getconfigint("streamport", NULL), 5);
65                        if(streamfd < 0) break;
66
67                        //set nonblocking
68                        fcntl(streamfd, F_SETFL, fcntl(streamfd, F_GETFL) | O_NONBLOCK);
69                }
70
71                timeout.tv_sec = 1;
72                timeout.tv_usec = 0;
73                FD_ZERO(&rfds);
74                FD_SET(streamfd, &rfds);
75
76                ret = TEMP_FAILURE_RETRY(select(streamfd + 1, &rfds , NULL, NULL, &timeout));
77
78                if(ret < 0)
79                {
80                        perr("stream listen socket fd=%d", streamfd);
81                        sleep(1);
82                        continue;
83                }
84                if(ret == 0) continue; //timeout
85
86                if(FD_ISSET(streamfd, &rfds))
87                {
88                        connfd = sockaccept(&streamfd, 1);
89                        if(connfd < 0) continue;
90                        debug(250, "accept stream connection connfd=%d", connfd);
91
92                        buf = calloc(1, MINMALLOC);
93                        if(buf == NULL)
94                        {
95                                err("no mem");
96                                sockclose(&connfd);
97                                continue;
98                        }
99
100                        debug(250, "get client data");
101
102                        //read one line
103                        unsigned char* pbuf = buf;
104                        while(pbuf - buf < MINMALLOC)
105                        {
106                                unsigned char c;
107
108                                ret = sockreceive(&connfd, &c, 1, 5000 * 1000);
109                                if(ret != 0)
110                                {
111                                        err("no client data in buffer");
112                                        break;
113                                }
114
115                                *pbuf = c;
116                                if(c == '\n') break;
117                                pbuf++;
118                        }
119
120                        if(buf != NULL)
121                                tmpstr = ostrstr((char*)buf, "GET /");
122
123                        if(tmpstr != NULL)
124                        {
125                                tmpstr += 5;
126
127                                filename = malloc(512);
128                                if(filename == NULL)
129                                {
130                                        err("no mem");
131                                        sockclose(&connfd);
132                                        free(buf); buf = NULL;
133                                        tmpstr = NULL;
134                                        continue;
135                                }
136                                memset(filename, 0, 512);
137
138                                ret = sscanf(tmpstr, "%d,%llu,%s", &serviceid, &transponderid, filename);
139                                if(ret < 2)
140                                        ret = sscanf(tmpstr, "%d%%2c%llu%%2c%s", &serviceid, &transponderid, filename);
141                                if(ret == 2 || ret == 3)
142                                {
143                                        if(ret == 2)
144                                        {
145                                                debug(250, "stream serviceid = %d, transponderid = %llu", serviceid, transponderid);
146                                                chnode = getchannel(serviceid, transponderid);
147
148                                                if(status.lastservice->channel != chnode && getconfigint("streamzapping", NULL) == 1)
149                                                        servicecheckret(servicestart(chnode, NULL, NULL, 5), 0);
150#ifndef MIPSEL
151                                                ret = recordstart(chnode, -1, connfd, RECSTREAM, 0, NULL);
152#else
153                                                if(status.webencode == 0)
154                                                        ret = recordstart(chnode, -1, connfd, RECSTREAM, 0, NULL);
155                                                else
156                                                {
157                                                                status.webencode = 0;
158                                                                ret = recordstartencode(chnode, -1, connfd, RECSTREAMENC, 0, NULL,      0, 0, 0, 0, 0, 0);
159                                                }
160#endif
161                                        }
162                                        if(ret == 3)
163                                        {
164                                                htmldecode(filename, filename);
165                                                debug(250, "stream filename=%s", filename);
166                                                if(filename != NULL && ostrstr(filename, getconfig("rec_streampath", NULL)) != filename)
167                                                {
168                                                        filename = ostrcat("/", filename, 0, 1);
169                                                        filename = ostrcat(getconfig("rec_streampath", NULL), filename, 0, 1);
170                                                }
171                                                filefd = open(filename, O_RDONLY | O_LARGEFILE);
172                                                if(filefd > -1)
173                                                        ret = recordstart(NULL, filefd, connfd, RECSTREAM, 0, NULL);
174                                                else
175                                                {
176                                                        perr("open stream filename=%s", filename);
177                                                        socksend(&connfd, (unsigned char*)"HTTP/1.1 500 \"open file\"\r\n\r\n", 28, 5000 * 1000);
178                                                        sockclose(&connfd);
179                                                        free(buf); buf = NULL;
180                                                        free(filename); filename = NULL;
181                                                        tmpstr = NULL;
182                                                        continue;
183                                                }
184                                        }
185                                        if(ret != 0)
186                                        {
187                                                char* retstr = recordcheckret(NULL, ret, 12);
188                                                retstr = ostrcat("-", retstr, 0, 1);
189                                                retstr = ostrcat(oitoa(ret), retstr, 1, 1);
190                                                retstr = ostrcat("HTTP/1.1 500 \"", retstr, 0, 1);
191                                                retstr = ostrcat(retstr, "\"\r\n\r\n", 1, 0);
192                                                socksend(&connfd, (unsigned char*)retstr, strlen(retstr), 5000 * 1000);
193                                                free(retstr); retstr = NULL;
194                                                sockclose(&connfd);
195                                                free(buf); buf = NULL;
196                                                free(filename); filename = NULL;
197                                                tmpstr = NULL;
198                                                continue;
199                                        }
200                                        debug(250, "sende OK response to client");
201                                        ret = socksend(&connfd, (unsigned char*)"HTTP/1.1 200 OK\r\nServer: stream (ts)\r\n\r\n", 40, 5000 * 1000);
202                                        if(ret != 0)
203                                        {
204                                                sockclose(&connfd);
205                                                free(buf); buf = NULL;
206                                                free(filename); filename = NULL;
207                                                tmpstr = NULL;
208                                                continue;
209                                        }
210                                }
211                                else
212                                {
213                                        err("bad response from client");
214                                        sockclose(&connfd);
215                                        free(buf); buf = NULL;
216                                        free(filename); filename = NULL;
217                                        tmpstr = NULL;
218                                        continue;
219                                }
220                        }
221                        else
222                        {
223                                err("bad response from client");
224                                sockclose(&connfd);
225                                free(buf); buf = NULL;
226                                tmpstr = NULL;
227                                continue;
228                        }
229
230                        free(buf); buf = NULL;
231                        free(filename); filename = NULL;
232                        tmpstr = NULL;
233                }
234        }
235        debug(250, "Stopping stream thread");
236        sockclose(&streamfd);
237        return;
238}
239
240#endif
Note: See TracBrowser for help on using the repository browser.