decoder.cpp: stop all pids first, and the restart pids... this hopefully fixes proble...
[enigma2.git] / lib / dvb / decoder.cpp
1 #include <lib/base/ebase.h>
2 #include <lib/base/eerror.h>
3 #include <lib/dvb/decoder.h>
4 #if HAVE_DVB_API_VERSION < 3 
5 #define audioStatus audio_status
6 #define videoStatus video_status
7 #define pesType pes_type
8 #define playState play_state
9 #define audioStreamSource_t audio_stream_source_t
10 #define videoStreamSource_t video_stream_source_t
11 #define streamSource stream_source
12 #define dmxPesFilterParams dmx_pes_filter_params
13 #define DMX_PES_VIDEO0 DMX_PES_VIDEO
14 #define DMX_PES_AUDIO0 DMX_PES_AUDIO
15 #define DMX_PES_VIDEO1 DMX_PES_VIDEO
16 #define DMX_PES_AUDIO1 DMX_PES_AUDIO
17 #include <ost/dmx.h>
18 #include <ost/video.h>
19 #include <ost/audio.h>
20 #else
21 #include <linux/dvb/audio.h>
22 #include <linux/dvb/video.h>
23 #include <linux/dvb/dmx.h>
24 #endif
25
26 #include <unistd.h>
27 #include <fcntl.h>
28 #include <sys/ioctl.h>
29 #include <sys/types.h>
30 #include <sys/stat.h>
31 #include <errno.h>
32
33         /* these are quite new... */
34 #ifndef AUDIO_GET_PTS
35 #define AUDIO_GET_PTS              _IOR('o', 19, __u64)
36 #define VIDEO_GET_PTS              _IOR('o', 57, __u64)
37 #endif
38
39 DEFINE_REF(eDVBAudio);
40
41 eDVBAudio::eDVBAudio(eDVBDemux *demux, int dev)
42         :m_demux(demux), m_dev(dev), m_is_freezed(0)
43 {
44         char filename[128];
45 #if HAVE_DVB_API_VERSION < 3
46         sprintf(filename, "/dev/dvb/card%d/audio%d", demux->adapter, dev);
47 #else
48         sprintf(filename, "/dev/dvb/adapter%d/audio%d", demux->adapter, dev);
49 #endif
50         m_fd = ::open(filename, O_RDWR);
51         if (m_fd < 0)
52                 eWarning("%s: %m", filename);
53 #if HAVE_DVB_API_VERSION < 3
54         sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux);
55 #else
56         sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
57 #endif
58         m_fd_demux = ::open(filename, O_RDWR);
59         if (m_fd_demux < 0)
60                 eWarning("%s: %m", filename);
61 }
62
63 #if HAVE_DVB_API_VERSION < 3
64 int eDVBAudio::setPid(int pid, int type)
65 {
66         if ((m_fd < 0) || (m_fd_demux < 0))
67                 return -1;
68
69         int bypass = 0;
70
71         switch (type)
72         {
73         case aMPEG:
74                 bypass = 1;
75                 break;
76         case aAC3:
77                 bypass = 0;
78                 break;
79                 /*
80         case aDTS:
81                 bypass = 2;
82                 break;
83                 */
84         }
85
86         if (::ioctl(m_fd, AUDIO_SET_BYPASS_MODE, bypass) < 0)
87                 eDebug("failed (%m)");
88
89         dmx_pes_filter_params pes;
90
91         pes.pid      = pid;
92         pes.input    = DMX_IN_FRONTEND;
93         pes.output   = DMX_OUT_DECODER;
94         pes.pes_type = m_dev ? DMX_PES_AUDIO1 : DMX_PES_AUDIO0; /* FIXME */
95         pes.flags    = 0;
96         eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - audio - ", pid);
97         if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
98         {
99                 eDebug("failed (%m)");
100                 return -errno;
101         }
102         eDebug("ok");
103
104         return 0;
105 }
106
107 int eDVBAudio::startPid()
108 {
109         eDebugNoNewLine("DEMUX_START - audio - ");
110         if (::ioctl(m_fd_demux, DMX_START) < 0)
111         {
112                 eDebug("failed (%m)");
113                 return -errno;
114         }
115         eDebug("ok");
116         return 0;
117 }
118
119 int eDVBAudio::start()
120 {
121         eDebugNoNewLine("AUDIO_PLAY - ");
122         if (::ioctl(m_fd, AUDIO_PLAY) < 0)
123         {
124                 eDebug("failed (%m)");
125                 return -errno;
126         }
127         eDebug("ok");
128         return 0;
129 }
130
131 int eDVBAudio::stopPid()
132 {
133         eDebugNoNewLine("DEMUX_STOP - audio - ");
134         if (::ioctl(m_fd_demux, DMX_STOP) < 0)
135         {
136                 eDebug("failed (%m)");
137                 return -errno;
138         }
139         eDebug("ok");
140         return 0;
141 }
142
143 int eDVBAudio::setAVSync(int val)
144 {
145         eDebugNoNewLine("AUDIO_SET_AV_SYNC - ");
146         if (::ioctl(m_fd, AUDIO_SET_AV_SYNC, val) < 0)
147         {
148                 eDebug("failed (%m)");
149                 return -errno;
150         }
151         eDebug("ok");
152         return 0;
153 }
154 #else
155 int eDVBAudio::startPid(int pid, int type)
156 {
157         if ((m_fd < 0) || (m_fd_demux < 0))
158                 return -1;
159         dmx_pes_filter_params pes;
160
161         pes.pid      = pid;
162         pes.input    = DMX_IN_FRONTEND;
163         pes.output   = DMX_OUT_DECODER;
164         pes.pes_type = m_dev ? DMX_PES_AUDIO1 : DMX_PES_AUDIO0; /* FIXME */
165         pes.flags    = 0;
166         eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - audio - ", pid);
167         if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
168         {
169                 eDebug("failed (%m)");
170                 return -errno;
171         }
172         eDebug("ok");
173         eDebugNoNewLine("DEMUX_START - audio - ");
174         if (::ioctl(m_fd_demux, DMX_START) < 0)
175         {
176                 eDebug("failed (%m)");
177                 return -errno;
178         }
179         eDebug("ok");
180         int bypass = 0;
181
182         switch (type)
183         {
184         case aMPEG:
185                 bypass = 1;
186                 break;
187         case aAC3:
188                 bypass = 0;
189                 break;
190                 /*
191         case aDTS:
192                 bypass = 2;
193                 break;
194                 */
195         }
196
197         eDebugNoNewLine("AUDIO_SET_BYPASS - ");
198         if (::ioctl(m_fd, AUDIO_SET_BYPASS_MODE, bypass) < 0)
199                 eDebug("failed (%m)");
200         else
201                 eDebug("ok");
202         freeze();
203
204         eDebugNoNewLine("AUDIO_PLAY - ");
205         if (::ioctl(m_fd, AUDIO_PLAY) < 0)
206                 eDebug("failed (%m)");
207         else
208                 eDebug("ok");
209         return 0;
210 }
211 #endif
212
213 void eDVBAudio::stop()
214 {
215 #if HAVE_DVB_API_VERSION > 2
216         flush();
217 #endif
218         eDebugNoNewLine("AUDIO_STOP - ");
219         if (::ioctl(m_fd, AUDIO_STOP) < 0)
220                 eDebug("failed (%m)");
221         else
222                 eDebug("ok");
223 #if HAVE_DVB_API_VERSION > 2
224         eDebugNoNewLine("DEMUX_STOP - audio - ");
225         if (::ioctl(m_fd_demux, DMX_STOP) < 0)
226                 eDebug("failed (%m)");
227         else
228                 eDebug("ok");
229 #endif
230 }
231
232 void eDVBAudio::flush()
233 {
234         eDebugNoNewLine("AUDIO_CLEAR_BUFFER - ");
235         if (::ioctl(m_fd, AUDIO_CLEAR_BUFFER) < 0)
236                 eDebug("failed (%m)");
237         else
238                 eDebug("ok");
239 }
240
241 void eDVBAudio::freeze()
242 {
243         if (!m_is_freezed)
244         {
245                 eDebugNoNewLine("AUDIO_PAUSE - ");
246                 if (::ioctl(m_fd, AUDIO_PAUSE) < 0)
247                         eDebug("failed (%m)");
248                 else
249                         eDebug("ok");
250                 m_is_freezed=1;
251         }
252 }
253
254 void eDVBAudio::unfreeze()
255 {
256         if (m_is_freezed)
257         {
258                 eDebugNoNewLine("AUDIO_CONTINUE - ");
259                 if (::ioctl(m_fd, AUDIO_CONTINUE) < 0)
260                         eDebug("failed (%m)");
261                 else
262                         eDebug("ok");
263                 m_is_freezed=0;
264         }
265 }
266
267 void eDVBAudio::setChannel(int channel)
268 {
269         int val = AUDIO_STEREO;
270         switch (channel)
271         {
272         case aMonoLeft: val = AUDIO_MONO_LEFT; break;
273         case aMonoRight: val = AUDIO_MONO_RIGHT; break;
274         default: break;
275         }
276         eDebugNoNewLine("AUDIO_CHANNEL_SELECT(%d) - ", val);
277         if (::ioctl(m_fd, AUDIO_CHANNEL_SELECT, val) < 0)
278                 eDebug("failed (%m)");
279         else
280                 eDebug("ok");
281 }
282
283 int eDVBAudio::getPTS(pts_t &now)
284 {
285         if (::ioctl(m_fd, AUDIO_GET_PTS, &now) < 0)
286                 eDebug("AUDIO_GET_PTS failed (%m)");
287         return 0;
288 }
289
290 eDVBAudio::~eDVBAudio()
291 {
292         unfreeze();
293         if (m_fd >= 0)
294                 ::close(m_fd);
295         if (m_fd_demux >= 0)
296                 ::close(m_fd_demux);
297 }
298
299 DEFINE_REF(eDVBVideo);
300
301 eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev)
302         :m_demux(demux), m_dev(dev), m_is_slow_motion(0), m_is_fast_forward(0), m_is_freezed(0)
303 {
304         char filename[128];
305 #if HAVE_DVB_API_VERSION < 3
306         sprintf(filename, "/dev/dvb/card%d/video%d", demux->adapter, dev);
307         m_fd_video = ::open("/dev/video", O_RDWR);
308         if (m_fd_video < 0)
309                 eWarning("/dev/video: %m");
310 #else
311         sprintf(filename, "/dev/dvb/adapter%d/video%d", demux->adapter, dev);
312 #endif
313         m_fd = ::open(filename, O_RDWR);
314         if (m_fd < 0)
315                 eWarning("%s: %m", filename);
316         else
317         {
318                 m_sn = eSocketNotifier::create(eApp, m_fd, eSocketNotifier::Priority);
319                 CONNECT(m_sn->activated, eDVBVideo::video_event);
320         }
321         eDebug("Video Device: %s", filename);
322 #if HAVE_DVB_API_VERSION < 3
323         sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux);
324 #else
325         sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
326 #endif
327         m_fd_demux = ::open(filename, O_RDWR);
328         if (m_fd_demux < 0)
329                 eWarning("%s: %m", filename);
330         eDebug("demux device: %s", filename);
331 }
332
333 // not finally values i think.. !!
334 #define VIDEO_STREAMTYPE_MPEG2 0
335 #define VIDEO_STREAMTYPE_MPEG4_H264 1
336
337 #if HAVE_DVB_API_VERSION < 3
338 int eDVBVideo::setPid(int pid)
339 {
340         if ((m_fd < 0) || (m_fd_demux < 0))
341                 return -1;
342         dmx_pes_filter_params pes;
343
344         pes.pid      = pid;
345         pes.input    = DMX_IN_FRONTEND;
346         pes.output   = DMX_OUT_DECODER;
347         pes.pes_type = m_dev ? DMX_PES_VIDEO1 : DMX_PES_VIDEO0; /* FIXME */
348         pes.flags    = 0;
349         eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - video - ", pid);
350         if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
351         {
352                 eDebug("failed (%m)");
353                 return -errno;
354         }
355         eDebug("ok");
356         return 0;
357 }
358
359 int eDVBVideo::startPid()
360 {
361         eDebugNoNewLine("DEMUX_START - video - ");
362         if (::ioctl(m_fd_demux, DMX_START) < 0)
363         {
364                 eDebug("failed (%m)");
365                 return -errno;
366         }
367         eDebug("ok");
368         return 0;
369 }
370
371 int eDVBVideo::start()
372 {
373         eDebugNoNewLine("VIDEO_PLAY - ");
374         if (::ioctl(m_fd, VIDEO_PLAY) < 0)
375         {
376                 eDebug("failed (%m)");
377                 return -errno;
378         }
379         eDebug("ok");
380         return 0;
381 }
382
383 int eDVBVideo::stopPid()
384 {
385         eDebugNoNewLine("DEMUX_STOP - video - ");
386         if (::ioctl(m_fd_demux, DMX_STOP) < 0)
387         {
388                 eDebug("failed (%m)");
389                 return -errno;
390         }
391         eDebug("ok");
392         return 0;
393 }
394 #else
395 int eDVBVideo::startPid(int pid, int type)
396 {
397         if ((m_fd < 0) || (m_fd_demux < 0))
398                 return -1;
399         dmx_pes_filter_params pes;
400
401         eDebugNoNewLine("VIDEO_SET_STREAMTYPE %d - ",type == MPEG4_H264 ? VIDEO_STREAMTYPE_MPEG4_H264 : VIDEO_STREAMTYPE_MPEG2);
402         if (::ioctl(m_fd, VIDEO_SET_STREAMTYPE,
403                 type == MPEG4_H264 ? VIDEO_STREAMTYPE_MPEG4_H264 : VIDEO_STREAMTYPE_MPEG2) < 0)
404                 eDebug("failed (%m)");
405         else
406                 eDebug("ok");
407
408         pes.pid      = pid;
409         pes.input    = DMX_IN_FRONTEND;
410         pes.output   = DMX_OUT_DECODER;
411         pes.pes_type = m_dev ? DMX_PES_VIDEO1 : DMX_PES_VIDEO0; /* FIXME */
412         pes.flags    = 0;
413         eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - video - ", pid);
414         if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
415         {
416                 eDebug("failed (%m)");
417                 return -errno;
418         }
419         eDebug("ok");
420         eDebugNoNewLine("DEMUX_START - video - ");
421         if (::ioctl(m_fd_demux, DMX_START) < 0)
422         {
423                 eDebug("failed (%m)");
424                 return -errno;
425         }
426         eDebug("ok");
427         freeze();
428         eDebugNoNewLine("VIDEO_PLAY - ");
429         if (::ioctl(m_fd, VIDEO_PLAY) < 0)
430                 eDebug("failed (%m)");
431         else
432                 eDebug("ok");
433         return 0;
434 }
435 #endif
436
437 void eDVBVideo::stop()
438 {
439 #if HAVE_DVB_API_VERSION > 2
440         eDebugNoNewLine("DEMUX_STOP - video - ");
441         if (::ioctl(m_fd_demux, DMX_STOP) < 0)
442                 eDebug("failed (%m)");
443         else
444                 eDebug("ok");
445 #endif
446         eDebugNoNewLine("VIDEO_STOP - ");
447         if (::ioctl(m_fd, VIDEO_STOP, 1) < 0)
448                 eDebug("failed (%m)");
449         else
450                 eDebug("ok");
451 }
452
453 void eDVBVideo::flush()
454 {
455         eDebugNoNewLine("VIDEO_CLEAR_BUFFER - ");
456         if (::ioctl(m_fd, VIDEO_CLEAR_BUFFER) < 0)
457                 eDebug("failed (%m)");
458         else
459                 eDebug("ok");
460 }
461
462 void eDVBVideo::freeze()
463 {
464         if (!m_is_freezed)
465         {
466                 eDebugNoNewLine("VIDEO_FREEZE - ");
467                 if (::ioctl(m_fd, VIDEO_FREEZE) < 0)
468                         eDebug("failed (%m)");
469                 else
470                         eDebug("ok");
471                 m_is_freezed=1;
472         }
473 }
474
475 void eDVBVideo::unfreeze()
476 {
477         if (m_is_freezed)
478         {
479                 eDebugNoNewLine("VIDEO_CONTINUE - ");
480                 if (::ioctl(m_fd, VIDEO_CONTINUE) < 0)
481                         eDebug("failed (%m)");
482                 else
483                         eDebug("ok");
484                 m_is_freezed=0;
485         }
486 }
487
488 int eDVBVideo::setSlowMotion(int repeat)
489 {
490         eDebugNoNewLine("VIDEO_SLOWMOTION - ");
491         m_is_slow_motion = repeat;
492         int ret = ::ioctl(m_fd, VIDEO_SLOWMOTION, repeat);
493         if (ret < 0)
494                 eDebug("failed(%m)");
495         else
496                 eDebug("ok");
497         return ret;
498 }
499
500 int eDVBVideo::setFastForward(int skip)
501 {
502         eDebugNoNewLine("VIDEO_FAST_FORWARD - ");
503         m_is_fast_forward = skip;
504         int ret = ::ioctl(m_fd, VIDEO_FAST_FORWARD, skip);
505         if (ret < 0)
506                 eDebug("failed(%m)");
507         else
508                 eDebug("ok");
509         return ret;
510 }
511
512 int eDVBVideo::getPTS(pts_t &now)
513 {
514 #if HAVE_DVB_API_VERSION < 3
515         #define VIDEO_GET_PTS_OLD           _IOR('o', 1, unsigned int*)
516         unsigned int pts;
517         int ret = ::ioctl(m_fd_video, VIDEO_GET_PTS_OLD, &pts);
518         now = pts;
519         now *= 2;
520 #else
521         int ret = ::ioctl(m_fd, VIDEO_GET_PTS, &now);
522 #endif
523         if (ret < 0)
524                 eDebug("VIDEO_GET_PTS failed(%m)");
525         return ret;
526 }
527
528 eDVBVideo::~eDVBVideo()
529 {
530         if (m_is_slow_motion)
531                 setSlowMotion(0);
532         if (m_is_fast_forward)
533                 setFastForward(0);
534         unfreeze();
535         if (m_fd >= 0)
536                 ::close(m_fd);
537         if (m_fd_demux >= 0)
538                 ::close(m_fd_demux);
539 #if HAVE_DVB_API_VERSION < 3
540         if (m_fd_video >= 0)
541                 ::close(m_fd_video);
542 #endif
543 }
544
545 void eDVBVideo::video_event(int)
546 {
547 #if HAVE_DVB_API_VERSION >= 3
548         struct video_event evt;
549         eDebugNoNewLine("VIDEO_GET_EVENT - ");
550         if (::ioctl(m_fd, VIDEO_GET_EVENT, &evt) < 0)
551                 eDebug("failed (%m)");
552         else
553         {
554                 eDebug("ok");
555                 if (evt.type == VIDEO_EVENT_SIZE_CHANGED)
556                 {
557                         struct iTSMPEGDecoder::videoEvent event;
558                         event.type = iTSMPEGDecoder::videoEvent::eventSizeChanged;
559                         event.aspect = evt.u.size.aspect_ratio;
560                         event.height = evt.u.size.h;
561                         event.width = evt.u.size.w;
562                         /* emit */ m_event(event);
563                 }
564                 else if (evt.type == VIDEO_EVENT_FRAME_RATE_CHANGED)
565                 {
566                         struct iTSMPEGDecoder::videoEvent event;
567                         event.type = iTSMPEGDecoder::videoEvent::eventFrameRateChanged;
568                         event.framerate = evt.u.frame_rate;
569                         /* emit */ m_event(event);
570                 }
571                 else if (evt.type == 16 /*VIDEO_EVENT_PROGRESSIVE_CHANGED*/)
572                 {
573                         struct iTSMPEGDecoder::videoEvent event;
574                         event.type = iTSMPEGDecoder::videoEvent::eventProgressiveChanged;
575                         event.progressive = evt.u.frame_rate;
576                         /* emit */ m_event(event);
577                 }
578                 else
579                         eDebug("unhandled DVBAPI Video Event %d", evt.type);
580         }
581 #else
582 #warning "FIXMEE!! Video Events not implemented for old api"
583 #endif
584 }
585
586 RESULT eDVBVideo::connectEvent(const Slot1<void, struct iTSMPEGDecoder::videoEvent> &event, ePtr<eConnection> &conn)
587 {
588         conn = new eConnection(this, m_event.connect(event));
589         return 0;
590 }
591
592 DEFINE_REF(eDVBPCR);
593
594 eDVBPCR::eDVBPCR(eDVBDemux *demux): m_demux(demux)
595 {
596         char filename[128];
597 #if HAVE_DVB_API_VERSION < 3
598         sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux);
599 #else
600         sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
601 #endif
602         m_fd_demux = ::open(filename, O_RDWR);
603         if (m_fd_demux < 0)
604                 eWarning("%s: %m", filename);
605 }
606
607 #if HAVE_DVB_API_VERSION < 3
608 int eDVBPCR::setPid(int pid)
609 {
610         if (m_fd_demux < 0)
611                 return -1;
612         dmx_pes_filter_params pes;
613
614         pes.pid      = pid;
615         pes.input    = DMX_IN_FRONTEND;
616         pes.output   = DMX_OUT_DECODER;
617         pes.pes_type = DMX_PES_PCR;
618         pes.flags    = 0;
619
620         eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - pcr - ", pid);
621         if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
622         {
623                 eDebug("failed (%m)");
624                 return -errno;
625         }
626         eDebug("ok");
627         return 0;
628 }
629
630 int eDVBPCR::startPid()
631 {
632         if (m_fd_demux < 0)
633                 return -1;
634         eDebugNoNewLine("DEMUX_START - pcr - ");
635         if (::ioctl(m_fd_demux, DMX_START) < 0)
636         {
637                 eDebug("failed (%m)");
638                 return -errno;
639         }
640         eDebug("ok");
641         return 0;
642 }
643 #else
644 int eDVBPCR::startPid(int pid)
645 {
646         if (m_fd_demux < 0)
647                 return -1;
648         dmx_pes_filter_params pes;
649
650         pes.pid      = pid;
651         pes.input    = DMX_IN_FRONTEND;
652         pes.output   = DMX_OUT_DECODER;
653         pes.pes_type = DMX_PES_PCR;
654         pes.flags    = 0;
655         eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - pcr - ", pid);
656         if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
657         {
658                 eDebug("failed (%m)");
659                 return -errno;
660         }
661         eDebug("ok");
662         eDebugNoNewLine("DEMUX_START - pcr - ");
663         if (::ioctl(m_fd_demux, DMX_START) < 0)
664         {
665                 eDebug("failed (%m)");
666                 return -errno;
667         }
668         eDebug("ok");
669         return 0;
670 }
671 #endif
672
673 void eDVBPCR::stop()
674 {
675         eDebugNoNewLine("DEMUX_STOP - pcr - ");
676         if (::ioctl(m_fd_demux, DMX_STOP) < 0)
677                 eDebug("failed(%m)");
678         else
679                 eDebug("ok");
680 }
681
682 eDVBPCR::~eDVBPCR()
683 {
684         if (m_fd_demux >= 0)
685                 ::close(m_fd_demux);
686 }
687
688 DEFINE_REF(eDVBTText);
689
690 eDVBTText::eDVBTText(eDVBDemux *demux): m_demux(demux)
691 {
692         char filename[128];
693 #if HAVE_DVB_API_VERSION < 3
694         sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux);
695 #else
696         sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
697 #endif
698         m_fd_demux = ::open(filename, O_RDWR);
699         if (m_fd_demux < 0)
700                 eWarning("%s: %m", filename);
701 }
702
703 int eDVBTText::startPid(int pid)
704 {
705         if (m_fd_demux < 0)
706                 return -1;
707         dmx_pes_filter_params pes;
708
709         pes.pid      = pid;
710         pes.input    = DMX_IN_FRONTEND;
711         pes.output   = DMX_OUT_DECODER;
712         pes.pes_type = DMX_PES_TELETEXT;
713         pes.flags    = 0;
714
715         eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - ttx - ", pid);
716         if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
717         {
718                 eDebug("failed(%m)");
719                 return -errno;
720         }
721         eDebug("ok");
722         eDebugNoNewLine("DEMUX_START - pcr - ");
723         if (::ioctl(m_fd_demux, DMX_START) < 0)
724         {
725                 eDebug("failed(%m)");
726                 return -errno;
727         }
728         eDebug("ok");
729         return 0;
730 }
731
732 void eDVBTText::stop()
733 {
734         eDebugNoNewLine("DEMUX_STOP - ttx - ");
735         if (::ioctl(m_fd_demux, DMX_STOP) < 0)
736                 eDebug("failed(%m)");
737         else
738                 eDebug("ok");
739 }
740
741 eDVBTText::~eDVBTText()
742 {
743         if (m_fd_demux >= 0)
744                 ::close(m_fd_demux);
745 }
746
747 DEFINE_REF(eTSMPEGDecoder);
748
749 int eTSMPEGDecoder::setState()
750 {
751         int res = 0;
752
753         int noaudio = m_is_sm || m_is_ff || m_is_trickmode;
754         int nott = noaudio; /* actually same conditions */
755
756         if ((noaudio && m_audio) || (!m_audio && !noaudio))
757                 m_changed |= changeAudio;
758
759         if ((nott && m_text) || (!m_text && !nott))
760                 m_changed |= changeText;
761
762         bool changed = !!m_changed;
763 #if HAVE_DVB_API_VERSION < 3
764         bool checkAVSync = m_changed & (changeAudio|changeVideo|changePCR);
765         if (m_changed & changeAudio && m_audio)
766                 m_audio->stopPid();
767         if (m_changed & changeVideo && m_video)
768                 m_video->stopPid();
769         if (m_changed & changePCR && m_pcr)
770         {
771                 m_pcr->stop();
772                 m_pcr=0;
773                 if (!(m_pcrpid >= 0 && m_pcrpid < 0x1ff))
774                         m_changed &= ~changePCR;
775         }
776         if (m_changed & changeAudio && m_audio)
777         {
778                 m_audio->stop();
779                 m_audio=0;
780                 if (!(m_apid >= 0 && m_apid < 0x1ff))
781                         m_changed &= ~changeAudio;
782         }
783         if (m_changed & changeVideo && m_video)
784         {
785                 m_video->stop();
786                 m_video=0;
787                 m_video_event_conn=0;
788                 if (!(m_vpid >= 0 && m_vpid < 0x1ff))
789                         m_changed &= ~changeVideo;
790         }
791         if (m_changed & changeVideo)
792         {
793                 m_video = new eDVBVideo(m_demux, m_decoder);
794                 m_video->connectEvent(slot(*this, &eTSMPEGDecoder::video_event), m_video_event_conn);
795                 if (m_video->setPid(m_vpid))
796                         res -1;
797         }
798         if (m_changed & changePCR)
799         {
800                 m_pcr = new eDVBPCR(m_demux);
801                 if (m_pcr->setPid(m_pcrpid))
802                         res = -1;
803         }
804         if (m_changed & changeAudio)
805         {
806                 m_audio = new eDVBAudio(m_demux, m_decoder);
807                 if (m_audio->setPid(m_apid, m_atype))
808                         res = -1;
809         }
810         if (m_changed & changePCR)
811         {
812                 if (m_pcr->startPid())
813                         res = -1;
814                 m_changed &= ~changePCR;
815         }
816         else if (checkAVSync && m_audio && m_video)
817         {
818                 if (m_audio->setAVSync(1))
819                         res = -1;
820         }
821         if (m_changed & changeVideo)
822         {
823                 if (m_video->startPid() || m_video->start())
824                         res = -1;
825                 m_changed &= ~changeVideo;
826         }
827         if (m_changed & changeAudio)
828         {
829                 if (m_audio->start() || m_audio->startPid())
830                         res = -1;
831                 m_changed &= ~changeAudio;
832         }
833 #else
834         if (m_changed & changePCR)
835         {
836                 if (m_pcr)
837                         m_pcr->stop();
838                 m_pcr = 0;
839         }
840         if (m_changed & changeVideo)
841         {
842                 if (m_video)
843                 {
844                         m_video->stop();
845                         m_video = 0;
846                         m_video_event_conn = 0;
847                 }
848         }
849         if (m_changed & changeAudio)
850         {
851                 if (m_audio)
852                         m_audio->stop();
853                 m_audio = 0;
854         }
855         if (m_changed & changeText)
856         {
857                 if (m_text)
858                         m_text->stop();
859                 m_text = 0;
860         }
861         if (m_changed & changePCR)
862         {
863                 if ((m_pcrpid >= 0) && (m_pcrpid < 0x1FFF))
864                 {
865                         m_pcr = new eDVBPCR(m_demux);
866                         if (m_pcr->startPid(m_pcrpid))
867                                 res = -1;
868                 }
869                 m_changed &= ~changePCR;
870         }
871         if (m_changed & changeAudio)
872         {
873                 if ((m_apid >= 0) && (m_apid < 0x1FFF) && !noaudio)
874                 {
875                         m_audio = new eDVBAudio(m_demux, m_decoder);
876                         if (m_audio->startPid(m_apid, m_atype))
877                                 res = -1;
878                 }
879                 m_changed &= ~changeAudio;
880         }
881         if (m_changed & changeVideo)
882         {
883                 if ((m_vpid >= 0) && (m_vpid < 0x1FFF))
884                 {
885                         m_video = new eDVBVideo(m_demux, m_decoder);
886                         m_video->connectEvent(slot(*this, &eTSMPEGDecoder::video_event), m_video_event_conn);
887                         if (m_video->startPid(m_vpid, m_vtype))
888                                 res = -1;
889                 }
890                 m_changed &= ~changeVideo;
891         }
892         if (m_changed & changeText)
893         {
894                 if ((m_textpid >= 0) && (m_textpid < 0x1FFF) && !nott)
895                 {
896                         m_text = new eDVBTText(m_demux);
897                         if (m_text->startPid(m_textpid))
898                                 res = -1;
899                 }
900                 m_changed &= ~changeText;
901         }
902 #endif
903         if (changed && !m_video && m_audio && m_radio_pic.length())
904                 showSinglePic(m_radio_pic.c_str());
905
906         return res;
907 }
908
909 int eTSMPEGDecoder::m_pcm_delay=-1,
910         eTSMPEGDecoder::m_ac3_delay=-1;
911
912 RESULT eTSMPEGDecoder::setPCMDelay(int delay)
913 {
914         if (m_decoder == 0 && delay != m_pcm_delay )
915         {
916                 FILE *fp = fopen("/proc/stb/audio/audio_delay_pcm", "w");
917                 if (fp)
918                 {
919                         fprintf(fp, "%x", delay*90);
920                         fclose(fp);
921                         m_pcm_delay = delay;
922                         return 0;
923                 }
924         }
925         return -1;
926 }
927
928 RESULT eTSMPEGDecoder::setAC3Delay(int delay)
929 {
930         if ( m_decoder == 0 && delay != m_ac3_delay )
931         {
932                 FILE *fp = fopen("/proc/stb/audio/audio_delay_bitstream", "w");
933                 if (fp)
934                 {
935                         fprintf(fp, "%x", delay*90);
936                         fclose(fp);
937                         m_ac3_delay = delay;
938                         return 0;
939                 }
940         }
941         return -1;
942 }
943
944 eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder)
945         :m_demux(demux), m_changed(0), m_decoder(decoder), m_video_clip_fd(-1), m_showSinglePicTimer(eTimer::create(eApp))
946 {
947         demux->connectEvent(slot(*this, &eTSMPEGDecoder::demux_event), m_demux_event_conn);
948         CONNECT(m_showSinglePicTimer->timeout, eTSMPEGDecoder::finishShowSinglePic);
949         m_is_ff = m_is_sm = m_is_trickmode = 0;
950 }
951
952 eTSMPEGDecoder::~eTSMPEGDecoder()
953 {
954         finishShowSinglePic();
955         m_vpid = m_apid = m_pcrpid = m_textpid = pidNone;
956         m_changed = -1;
957         setState();
958 }
959
960 RESULT eTSMPEGDecoder::setVideoPID(int vpid, int type)
961 {
962         if (m_vpid != vpid)
963         {
964                 m_changed |= changeVideo;
965                 m_vpid = vpid;
966                 m_vtype = type;
967         }
968         return 0;
969 }
970
971 RESULT eTSMPEGDecoder::setAudioPID(int apid, int type)
972 {
973         if ((m_apid != apid) || (m_atype != type))
974         {
975                 m_changed |= changeAudio;
976                 m_atype = type;
977                 m_apid = apid;
978         }
979         return 0;
980 }
981
982 int eTSMPEGDecoder::m_audio_channel = -1;
983
984 RESULT eTSMPEGDecoder::setAudioChannel(int channel)
985 {
986         if (channel == -1)
987                 channel = ac_stereo;
988         if (m_decoder == 0 && m_audio_channel != channel)
989         {
990                 if (m_audio)
991                 {
992                         m_audio->setChannel(channel);
993                         m_audio_channel=channel;
994                 }
995                 else
996                         eDebug("eTSMPEGDecoder::setAudioChannel but no audio decoder exist");
997         }
998         return 0;
999 }
1000
1001 int eTSMPEGDecoder::getAudioChannel()
1002 {
1003         return m_audio_channel == -1 ? ac_stereo : m_audio_channel;
1004 }
1005
1006 RESULT eTSMPEGDecoder::setSyncPCR(int pcrpid)
1007 {
1008         if (m_pcrpid != pcrpid)
1009         {
1010                 m_changed |= changePCR;
1011                 m_pcrpid = pcrpid;
1012         }
1013         return 0;
1014 }
1015
1016 RESULT eTSMPEGDecoder::setTextPID(int textpid)
1017 {
1018         if (m_textpid != textpid)
1019         {
1020                 m_changed |= changeText;
1021                 m_textpid = textpid;
1022         }
1023         return 0;
1024 }
1025
1026 RESULT eTSMPEGDecoder::setSyncMaster(int who)
1027 {
1028         return -1;
1029 }
1030
1031 RESULT eTSMPEGDecoder::start()
1032 {
1033         RESULT r;
1034         r = setState();
1035         if (r)
1036                 return r;
1037         return unfreeze();
1038 }
1039
1040         /* preroll is start in freezed mode. */
1041 RESULT eTSMPEGDecoder::preroll()
1042 {
1043         return setState();
1044 }
1045
1046 RESULT eTSMPEGDecoder::freeze(int cont)
1047 {
1048         if (m_video)
1049                 m_video->freeze();
1050
1051         if (m_audio)
1052                 m_audio->freeze();
1053
1054         return 0;
1055 }
1056
1057 RESULT eTSMPEGDecoder::unfreeze()
1058 {
1059         if (m_video)
1060                 m_video->unfreeze();
1061
1062         if (m_audio)
1063                 m_audio->unfreeze();
1064
1065         return 0;
1066 }
1067
1068 RESULT eTSMPEGDecoder::setSinglePictureMode(int when)
1069 {
1070         return -1;
1071 }
1072
1073 RESULT eTSMPEGDecoder::setPictureSkipMode(int what)
1074 {
1075         return -1;
1076 }
1077
1078 RESULT eTSMPEGDecoder::setFastForward(int frames_to_skip)
1079 {
1080         m_is_ff = frames_to_skip != 0;
1081
1082         setState();
1083         unfreeze(); // audio might be restarted and still in preroll (freezed) state.
1084
1085         if (m_video)
1086                 return m_video->setFastForward(frames_to_skip);
1087         else
1088                 return -1;
1089 }
1090
1091 RESULT eTSMPEGDecoder::setSlowMotion(int repeat)
1092 {
1093         m_is_sm = repeat != 0;
1094
1095         setState();
1096         unfreeze(); // audio might be restarted and still in preroll (freezed) state.
1097
1098         if (m_video)
1099                 return m_video->setSlowMotion(repeat);
1100         else
1101                 return -1;
1102 }
1103
1104 RESULT eTSMPEGDecoder::setZoom(int what)
1105 {
1106         return -1;
1107 }
1108
1109 RESULT eTSMPEGDecoder::flush()
1110 {
1111         if (m_audio)
1112                 m_audio->flush();
1113         if (m_video)
1114                 m_video->flush();
1115         return 0;
1116 }
1117
1118 void eTSMPEGDecoder::demux_event(int event)
1119 {
1120         switch (event)
1121         {
1122         case eDVBDemux::evtFlush:
1123                 flush();
1124                 break;
1125         default:
1126                 break;
1127         }
1128 }
1129
1130 RESULT eTSMPEGDecoder::setTrickmode(int what)
1131 {
1132         m_is_trickmode = what;
1133         setState();
1134         return 0;
1135 }
1136
1137 RESULT eTSMPEGDecoder::getPTS(int what, pts_t &pts)
1138 {
1139         if (what == 0) /* auto */
1140                 what = m_video ? 1 : 2;
1141
1142         if (what == 1) /* video */
1143         {
1144                 if (m_video)
1145                         return m_video->getPTS(pts);
1146                 else
1147                         return -1;
1148         }
1149
1150         if (what == 2) /* audio */
1151         {
1152                 if (m_audio)
1153                         return m_audio->getPTS(pts);
1154                 else
1155                         return -1;
1156         }
1157
1158         return -1;
1159 }
1160
1161 RESULT eTSMPEGDecoder::setRadioPic(const std::string &filename)
1162 {
1163         m_radio_pic = filename;
1164         return 0;
1165 }
1166
1167 RESULT eTSMPEGDecoder::showSinglePic(const char *filename)
1168 {
1169         if (m_decoder == 0)
1170         {
1171                 eDebug("showSinglePic %s", filename);
1172                 int f = open(filename, O_RDONLY);
1173                 if (f >= 0)
1174                 {
1175                         struct stat s;
1176                         fstat(f, &s);
1177                         if (m_video_clip_fd == -1)
1178                                 m_video_clip_fd = open("/dev/dvb/adapter0/video0", O_WRONLY|O_NONBLOCK);
1179                         if (m_video_clip_fd >= 0)
1180                         {
1181                                 bool seq_end_avail = false;
1182                                 size_t pos=0;
1183                                 unsigned char pes_header[] = { 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00 };
1184                                 unsigned char seq_end[] = { 0x00, 0x00, 0x01, 0xB7 };
1185                                 unsigned char iframe[s.st_size];
1186                                 unsigned char stuffing[8192];
1187                                 memset(stuffing, 0, 8192);
1188                                 read(f, iframe, s.st_size);
1189                                 if (ioctl(m_video_clip_fd, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY) < 0)
1190                                         eDebug("VIDEO_SELECT_SOURCE MEMORY failed (%m)");
1191                                 if (ioctl(m_video_clip_fd, VIDEO_PLAY) < 0)
1192                                         eDebug("VIDEO_PLAY failed (%m)");
1193                                 if (::ioctl(m_video_clip_fd, VIDEO_CONTINUE) < 0)
1194                                         eDebug("video: VIDEO_CONTINUE: %m");
1195                                 if (::ioctl(m_video_clip_fd, VIDEO_CLEAR_BUFFER) < 0)
1196                                         eDebug("video: VIDEO_CLEAR_BUFFER: %m");
1197                                 while(pos <= (s.st_size-4) && !(seq_end_avail = (!iframe[pos] && !iframe[pos+1] && iframe[pos+2] == 1 && iframe[pos+3] == 0xB7)))
1198                                         ++pos;
1199                                 if ((iframe[3] >> 4) != 0xE) // no pes header
1200                                         write(m_video_clip_fd, pes_header, sizeof(pes_header));
1201                                 else
1202                                         iframe[4] = iframe[5] = 0x00;
1203                                 write(m_video_clip_fd, iframe, s.st_size);
1204                                 if (!seq_end_avail)
1205                                         write(m_video_clip_fd, seq_end, sizeof(seq_end));
1206                                 write(m_video_clip_fd, stuffing, 8192);
1207                                 m_showSinglePicTimer->start(150, true);
1208                         }
1209                         close(f);
1210                 }
1211                 else
1212                 {
1213                         eDebug("couldnt open %s", filename);
1214                         return -1;
1215                 }
1216         }
1217         else
1218         {
1219                 eDebug("only show single pics on first decoder");
1220                 return -1;
1221         }
1222         return 0;
1223 }
1224
1225 void eTSMPEGDecoder::finishShowSinglePic()
1226 {
1227         if (m_video_clip_fd >= 0)
1228         {
1229                 if (ioctl(m_video_clip_fd, VIDEO_STOP, 0) < 0)
1230                         eDebug("VIDEO_STOP failed (%m)");
1231                 if (ioctl(m_video_clip_fd, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_DEMUX) < 0)
1232                                 eDebug("VIDEO_SELECT_SOURCE DEMUX failed (%m)");
1233                 close(m_video_clip_fd);
1234                 m_video_clip_fd = -1;
1235         }
1236 }
1237
1238 RESULT eTSMPEGDecoder::connectVideoEvent(const Slot1<void, struct videoEvent> &event, ePtr<eConnection> &conn)
1239 {
1240         conn = new eConnection(this, m_video_event.connect(event));
1241         return 0;
1242 }
1243
1244 void eTSMPEGDecoder::video_event(struct videoEvent event)
1245 {
1246         /* emit */ m_video_event(event);
1247 }