diff --git a/azbox/audio.cpp b/azbox/audio.cpp index 6e33541..329b8f9 100644 --- a/azbox/audio.cpp +++ b/azbox/audio.cpp @@ -39,9 +39,8 @@ void cAudio::openDevice(void) lt_debug("%s\n", __func__); if (fd < 0) { - if ((fd = open(AUDIO_DEVICE, O_RDWR)) < 0) + if ((fd = open(AUDIO_DEVICE, O_RDONLY|O_CLOEXEC)) < 0) lt_info("openDevice: open failed (%m)\n"); - fcntl(fd, F_SETFD, FD_CLOEXEC); do_mute(true, false); } else @@ -51,6 +50,7 @@ void cAudio::openDevice(void) void cAudio::closeDevice(void) { lt_debug("%s\n", __func__); + ioctl(fd, AUDIO_CONTINUE); /* enigma2 also does CONTINUE before close... */ if (fd >= 0) close(fd); fd = -1; @@ -129,7 +129,9 @@ int cAudio::Start(void) int cAudio::Stop(void) { lt_debug("%s\n", __func__); - return ioctl(fd, AUDIO_STOP); + ioctl(fd, AUDIO_STOP); + ioctl(fd, AUDIO_CONTINUE); /* no idea why we have to stop and then continue => enigma2 does it, too */ + return 0; } bool cAudio::Pause(bool /*Pcm*/) @@ -211,12 +213,11 @@ int cAudio::PrepareClipPlay(int ch, int srate, int bits, int little_endian) } lt_info("%s: dsp_dev %s mix_dev %s\n", __func__, dsp_dev, mix_dev); /* NULL mix_dev is ok */ /* the tdoss dsp driver seems to work only on the second open(). really. */ - clipfd = open(dsp_dev, O_WRONLY); + clipfd = open(dsp_dev, O_WRONLY|O_CLOEXEC); if (clipfd < 0) { lt_info("%s open %s: %m\n", dsp_dev, __FUNCTION__); return -1; } - fcntl(clipfd, F_SETFD, FD_CLOEXEC); /* no idea if we ever get little_endian == 0 */ if (little_endian) fmt = AFMT_S16_BE; @@ -234,7 +235,7 @@ int cAudio::PrepareClipPlay(int ch, int srate, int bits, int little_endian) if (!mix_dev) return 0; - mixer_fd = open(mix_dev, O_RDWR); + mixer_fd = open(mix_dev, O_RDWR|O_CLOEXEC); if (mixer_fd < 0) { lt_info("%s: open mixer %s failed (%m)\n", __func__, mix_dev); /* not a real error */ diff --git a/azbox/dmx.cpp b/azbox/dmx.cpp index a68327c..cacd823 100644 --- a/azbox/dmx.cpp +++ b/azbox/dmx.cpp @@ -114,7 +114,7 @@ cDemux::~cDemux() bool cDemux::Open(DMX_CHANNEL_TYPE pes_type, void * /*hVideoBuffer*/, int uBufferSize) { int devnum = num; - int flags = O_RDWR; + int flags = O_RDWR|O_CLOEXEC; if (fd > -1) lt_info("%s FD ALREADY OPENED? fd = %d\n", __FUNCTION__, fd); @@ -127,7 +127,6 @@ bool cDemux::Open(DMX_CHANNEL_TYPE pes_type, void * /*hVideoBuffer*/, int uBuffe lt_info("%s %s: %m\n", __FUNCTION__, devname[devnum]); return false; } - fcntl(fd, F_SETFD, FD_CLOEXEC); lt_debug("%s #%d pes_type: %s(%d), uBufferSize: %d fd: %d\n", __func__, num, DMX_T[pes_type], pes_type, uBufferSize, fd); @@ -138,10 +137,10 @@ bool cDemux::Open(DMX_CHANNEL_TYPE pes_type, void * /*hVideoBuffer*/, int uBuffe lt_info("%s ERROR! pesfds not empty!\n", __FUNCTION__); /* TODO: error handling */ return false; } -#endif int n = DMX_SOURCE_FRONT0; if (ioctl(fd, DMX_SET_SOURCE, &n) < 0) lt_info("%s DMX_SET_SOURCE failed!\n", __func__); +#endif if (uBufferSize > 0) { /* probably uBufferSize == 0 means "use default size". TODO: find a reasonable default */ @@ -212,10 +211,11 @@ int cDemux::Read(unsigned char *buff, int len, int timeout) #endif int rc; int to = timeout; - struct pollfd ufds; - ufds.fd = fd; - ufds.events = POLLIN|POLLPRI|POLLERR; - ufds.revents = 0; + /* using a one-dimensional array seems to avoid strange segfaults / memory corruption?? */ + struct pollfd ufds[1]; + ufds[0].fd = fd; + ufds[0].events = POLLIN|POLLPRI|POLLERR; + ufds[0].revents = 0; /* hack: if the frontend loses and regains lock, the demuxer often will not * return from read(), so as a "emergency exit" for e.g. NIT scan, set a (long) @@ -226,7 +226,7 @@ int cDemux::Read(unsigned char *buff, int len, int timeout) if (to > 0) { retry: - rc = ::poll(&ufds, 1, to); + rc = ::poll(ufds, 1, to); if (!rc) { if (timeout == 0) /* we took the emergency exit */ @@ -253,14 +253,14 @@ int cDemux::Read(unsigned char *buff, int len, int timeout) return 0; } #endif - if (ufds.revents & POLLHUP) /* we get POLLHUP if e.g. a too big DMX_BUFFER_SIZE was set */ + if (ufds[0].revents & POLLHUP) /* we get POLLHUP if e.g. a too big DMX_BUFFER_SIZE was set */ { - dmx_err("received %s,", "POLLHUP", ufds.revents); + dmx_err("received %s,", "POLLHUP", ufds[0].revents); return -1; } - if (!(ufds.revents & POLLIN)) /* we requested POLLIN but did not get it? */ + if (!(ufds[0].revents & POLLIN)) /* we requested POLLIN but did not get it? */ { - dmx_err("received %s, please report!", "POLLIN", ufds.revents); + dmx_err("received %s, please report!", "POLLIN", ufds[0].revents); return 0; } } @@ -384,6 +384,7 @@ bool cDemux::sectionFilter(unsigned short pid, const unsigned char * const filte ioctl (fd, DMX_STOP); if (ioctl(fd, DMX_SET_FILTER, &s_flt) < 0) return false; + ioctl(fd, DMX_START); return true; } diff --git a/azbox/video.cpp b/azbox/video.cpp index 335c15e..bf08c65 100644 --- a/azbox/video.cpp +++ b/azbox/video.cpp @@ -74,7 +74,7 @@ static void show_iframe(int fd, unsigned char *iframe, size_t st_size); #define VIDEO_STREAMTYPE_VC1_SM 5 #define VIDEO_STREAMTYPE_MPEG1 6 -cVideo::cVideo(int, void *, void *) +cVideo::cVideo(int, void *, void *, unsigned int) { lt_debug("%s\n", __FUNCTION__); @@ -90,7 +90,7 @@ cVideo::cVideo(int, void *, void *) blank_data = NULL; /* initialize */ blank_size = 0; - blankfd = open(blankname, O_RDONLY); + blankfd = open(blankname, O_RDONLY|O_CLOEXEC); if (blankfd < 0) lt_info("%s cannot open %s: %m", __func__, blankname); else @@ -129,7 +129,7 @@ void cVideo::openDevice(void) if (fd != -1) /* already open */ return; retry: - if ((fd = open(VIDEO_DEVICE, O_RDWR)) < 0) + if ((fd = open(VIDEO_DEVICE, O_RDWR|O_CLOEXEC)) < 0) { if (errno == EBUSY) { @@ -140,16 +140,12 @@ retry: } lt_info("%s cannot open %s: %m, retries %d\n", __func__, VIDEO_DEVICE, n); } - else - fcntl(fd, F_SETFD, FD_CLOEXEC); playstate = VIDEO_STOPPED; } void cVideo::closeDevice(void) { lt_debug("%s\n", __func__); - /* looks like sometimes close is unhappy about non-empty buffers */ - Start(); if (fd >= 0) close(fd); fd = -1; @@ -288,16 +284,7 @@ int cVideo::SetVideoSystem(int video_system, bool remember) return 0; } lt_info("%s: old: '%s' new: '%s'\n", __func__, current, modes[video_system]); - bool stopped = false; - if (playstate == VIDEO_PLAYING) - { - lt_info("%s: playstate == VIDEO_PLAYING, stopping video\n", __func__); - Stop(); - stopped = true; - } ret = proc_put("/proc/stb/video/videomode", modes[video_system],strlen(modes[video_system])); - if (stopped) - Start(); return ret; } @@ -387,7 +374,7 @@ void cVideo::ShowPicture(const char * fname) what we want. the mutex ensures proper ordering. */ pthread_mutex_lock(&stillp_mutex); - mfd = open(destname, O_RDONLY); + mfd = open(destname, O_RDONLY|O_CLOEXEC); if (mfd < 0) { lt_info("%s cannot open %s: %m", __func__, destname); @@ -641,3 +628,8 @@ static void show_iframe(int fd, unsigned char *iframe, size_t st_size) ioctl(fd, VIDEO_STOP, 0); ioctl(fd, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_DEMUX); } + +void cVideo::SetDemux(cDemux *) +{ + lt_debug("%s: not implemented yet\n", __func__); +} diff --git a/azbox/video_lib.h b/azbox/video_lib.h index c26d2bd..c7286e9 100644 --- a/azbox/video_lib.h +++ b/azbox/video_lib.h @@ -3,6 +3,7 @@ #include #include "../common/cs_types.h" +#include "dmx_lib.h" typedef enum { ANALOG_SD_RGB_CINCH = 0x00, @@ -141,7 +142,7 @@ class cVideo void closeDevice(void); public: /* constructor & destructor */ - cVideo(int mode, void *, void *); + cVideo(int mode, void *, void *, unsigned int unit = 0); ~cVideo(void); void * GetTVEnc() { return NULL; }; @@ -189,6 +190,7 @@ class cVideo int CloseVBI(void) { return 0; }; int StartVBI(unsigned short) { return 0; }; int StopVBI(void) { return 0; }; + void SetDemux(cDemux *dmx); }; #endif diff --git a/generic-pc/video.cpp b/generic-pc/video.cpp index ceb8c6d..cf9e9cb 100644 --- a/generic-pc/video.cpp +++ b/generic-pc/video.cpp @@ -65,7 +65,7 @@ static const AVRational aspect_ratios[6] = { { -1,-1 } }; -cVideo::cVideo(int, void *, void *) +cVideo::cVideo(int, void *, void *, unsigned int) { lt_debug("%s\n", __func__); av_register_all(); @@ -660,3 +660,8 @@ int64_t cVideo::GetPTS(void) buf_m.unlock(); return pts; } + +void cVideo::SetDemux(cDemux *) +{ + lt_debug("%s: not implemented yet\n", __func__); +} diff --git a/generic-pc/video_lib.h b/generic-pc/video_lib.h index 7f93c7e..077154c 100644 --- a/generic-pc/video_lib.h +++ b/generic-pc/video_lib.h @@ -6,6 +6,7 @@ #include #include #include "../common/cs_types.h" +#include "dmx_lib.h" extern "C" { #include } @@ -147,7 +148,7 @@ class cVideo : public OpenThreads::Thread int64_t GetPTS(void); public: /* constructor & destructor */ - cVideo(int mode, void *, void *); + cVideo(int mode, void *, void *, unsigned int unit = 0); ~cVideo(void); void * GetTVEnc() { return NULL; }; @@ -194,6 +195,7 @@ class cVideo : public OpenThreads::Thread int CloseVBI(void) { return 0; }; int StartVBI(unsigned short) { return 0; }; int StopVBI(void) { return 0; }; + void SetDemux(cDemux *dmx); bool GetScreenImage(unsigned char * &data, int &xres, int &yres, bool get_video = true, bool get_osd = false, bool scale_to_video = false); SWFramebuffer *getDecBuf(void); private: diff --git a/libspark/dmx.cpp b/libspark/dmx.cpp index 50be72b..efeba62 100644 --- a/libspark/dmx.cpp +++ b/libspark/dmx.cpp @@ -71,7 +71,6 @@ /* Ugh... see comment in destructor for details... */ #include "video_lib.h" extern cVideo *videoDecoder; -extern cVideo *pipDecoder; #define lt_debug(args...) _lt_debug(TRIPLE_DEBUG_DEMUX, this, args) #define lt_info(args...) _lt_info(TRIPLE_DEBUG_DEMUX, this, args) @@ -91,7 +90,6 @@ extern cVideo *pipDecoder; cDemux *videoDemux = NULL; cDemux *audioDemux = NULL; //cDemux *pcrDemux = NULL; -cDemux *pipDemux = NULL; static const char *DMX_T[] = { "DMX_INVALID", @@ -156,8 +154,6 @@ cDemux::~cDemux() */ if (dmx_type == DMX_VIDEO_CHANNEL) videoDecoder = NULL; - if (dmx_type == DMX_PIP_CHANNEL) - pipDecoder = NULL; } bool cDemux::Open(DMX_CHANNEL_TYPE pes_type, void * /*hVideoBuffer*/, int uBufferSize) @@ -496,6 +492,9 @@ bool cDemux::pesFilter(const unsigned short pid) case DMX_VIDEO_CHANNEL: p_flt.pes_type = DMX_PES_VIDEO; break; + case DMX_PIP_CHANNEL: /* PIP is a special version of DMX_VIDEO_CHANNEL */ + p_flt.pes_type = DMX_PES_VIDEO1; + break; case DMX_PES_CHANNEL: p_flt.pes_type = DMX_PES_OTHER; p_flt.output = DMX_OUT_TAP; @@ -504,9 +503,6 @@ bool cDemux::pesFilter(const unsigned short pid) p_flt.pes_type = DMX_PES_OTHER; p_flt.output = DMX_OUT_TSDEMUX_TAP; break; - case DMX_PIP_CHANNEL: - p_flt.pes_type = DMX_PES_VIDEO1; - break; default: lt_info("%s #%d invalid dmx_type %d!\n", __func__, num, dmx_type); return false; diff --git a/libspark/video.cpp b/libspark/video.cpp index de8b8b6..b724a43 100644 --- a/libspark/video.cpp +++ b/libspark/video.cpp @@ -34,7 +34,6 @@ #include #include #include "video_lib.h" -#define VIDEO_DEVICE_FMT "/dev/dvb/adapter0/video%d" #include "lt_debug.h" #define lt_debug(args...) _lt_debug(TRIPLE_DEBUG_VIDEO, this, args) #define lt_info(args...) _lt_info(TRIPLE_DEBUG_VIDEO, this, args) @@ -53,13 +52,43 @@ _r; \ }) -cVideo * pipDecoder = NULL; cVideo * videoDecoder = NULL; +cVideo * pipDecoder = NULL; int system_rev = 0; static bool hdmi_enabled = true; static bool stillpicture = false; +static const char *VDEV[] = { + "/dev/dvb/adapter0/video0", + "/dev/dvb/adapter0/video1" +}; +static const char *VMPEG_aspect[] = { + "/proc/stb/vmpeg/0/aspect", + "/proc/stb/vmpeg/1/aspect" +}; + +static const char *VMPEG_xres[] = { + "/proc/stb/vmpeg/0/xres", + "/proc/stb/vmpeg/1/xres" +}; + +static const char *VMPEG_yres[] = { + "/proc/stb/vmpeg/0/yres", + "/proc/stb/vmpeg/1/yres" +}; + +static const char *VMPEG_dst_all[] = { + "/proc/stb/vmpeg/0/dst_all", + "/proc/stb/vmpeg/1/dst_all" +}; + +static const char *VMPEG_framerate[] = { + "/proc/stb/vmpeg/0/framerate", + "/proc/stb/vmpeg/1/framerate" +}; + + #define VIDEO_STREAMTYPE_MPEG2 0 #define VIDEO_STREAMTYPE_MPEG4_H264 1 #define VIDEO_STREAMTYPE_VC1 3 @@ -142,16 +171,20 @@ out: } -cVideo::cVideo(int, void *, void *, int _dev) +cVideo::cVideo(int, void *, void *, unsigned int unit) { - lt_debug("%s\n", __FUNCTION__); + lt_debug("%s unit %u\n", __func__, unit); //croppingMode = VID_DISPMODE_NORM; //outputformat = VID_OUTFMT_RGBC_SVIDEO; scartvoltage = -1; video_standby = 0; + if (unit > 1) { + lt_info("%s: unit %d out of range, setting to 0\n", __func__, unit); + devnum = 0; + } else + devnum = unit; fd = -1; - dev = _dev; openDevice(); } @@ -163,14 +196,12 @@ cVideo::~cVideo(void) void cVideo::openDevice(void) { int n = 0; - lt_debug("%s\n", __func__); + lt_debug("#%d: %s\n", devnum, __func__); /* todo: this fd checking is racy, should be protected by a lock */ if (fd != -1) /* already open */ return; - char vd[sizeof(VIDEO_DEVICE_FMT) + 10]; - snprintf(vd, sizeof(vd), VIDEO_DEVICE_FMT, dev); retry: - if ((fd = open(vd, O_RDWR)) < 0) + if ((fd = open(VDEV[devnum], O_RDWR|O_CLOEXEC)) < 0) { if (errno == EBUSY) { @@ -179,10 +210,8 @@ retry: if (++n < 10) goto retry; } - lt_info("%s cannot open %s: %m, retries %d\n", __func__, vd, n); + lt_info("#%d: %s cannot open %s: %m, retries %d\n", devnum, __func__, VDEV[devnum], n); } - else - fcntl(fd, F_SETFD, FD_CLOEXEC); playstate = VIDEO_STOPPED; } @@ -197,12 +226,6 @@ void cVideo::closeDevice(void) playstate = VIDEO_STOPPED; } -void cVideo::SetDemux(cDemux * /*dmx*/) -{ - lt_debug("%s\n", __func__); - // FIXME, stub only -} - int cVideo::setAspectRatio(int aspect, int mode) { static const char *a[] = { "n/a", "4:3", "14:9", "16:9" }; @@ -236,9 +259,7 @@ int cVideo::getAspectRatio(void) if (fd == -1) { /* in movieplayer mode, fd is not opened -> fall back to procfs */ - char tmp[100]; - snprintf(tmp, sizeof(tmp), "/proc/stb/vmpeg/%d/aspect", dev); - int n = proc_get_hex(tmp); + int n = proc_get_hex(VMPEG_aspect[devnum]); return n * 2 + 1; } if (fop(ioctl, VIDEO_GET_SIZE, &s) < 0) @@ -246,7 +267,7 @@ int cVideo::getAspectRatio(void) lt_info("%s: VIDEO_GET_SIZE %m\n", __func__); return -1; } - lt_debug("%s: %d\n", __func__, s.aspect_ratio); + lt_debug("#%d: %s: %d\n", devnum, __func__, s.aspect_ratio); return s.aspect_ratio * 2 + 1; } @@ -268,7 +289,7 @@ int cVideo::setCroppingMode(int /*vidDispMode_t format*/) int cVideo::Start(void * /*PcrChannel*/, unsigned short /*PcrPid*/, unsigned short /*VideoPid*/, void * /*hChannel*/) { - lt_debug("%s playstate=%d\n", __FUNCTION__, playstate); + lt_debug("#%d: %s playstate=%d\n", devnum, __func__, playstate); #if 0 if (playstate == VIDEO_PLAYING) return 0; @@ -282,7 +303,7 @@ int cVideo::Start(void * /*PcrChannel*/, unsigned short /*PcrPid*/, unsigned sho int cVideo::Stop(bool blank) { - lt_debug("%s(%d)\n", __FUNCTION__, blank); + lt_debug("#%d: %s(%d)\n", devnum, __func__, blank); if (stillpicture) { lt_debug("%s: stillpicture == true\n", __func__); @@ -357,7 +378,7 @@ int cVideo::getPlayState(void) void cVideo::SetVideoMode(analog_mode_t mode) { - lt_debug("%s(%d)\n", __func__, mode); + lt_debug("#%d: %s(%d)\n", devnum, __func__, mode); if (!(mode & ANALOG_SCART_MASK)) { lt_debug("%s: non-SCART mode ignored\n", __func__); @@ -523,7 +544,7 @@ int cVideo::getBlank(void) free(line); fclose(f); int ret = (count == lastcount); /* no new decode -> return 1 */ - lt_debug("%s: %d (irq++: %d)\n", __func__, ret, count - lastcount); + lt_debug("#%d: %s: %d (irq++: %d)\n", devnum, __func__, ret, count - lastcount); lastcount = count; return ret; } @@ -555,7 +576,7 @@ void cVideo::Pig(int x, int y, int w, int h, int osd_w, int osd_h, int startx, i * TODO: check this in the driver sources */ int xres = 720; /* proc_get_hex("/proc/stb/vmpeg/0/xres") */ int yres = 576; /* proc_get_hex("/proc/stb/vmpeg/0/yres") */ - lt_debug("%s: x:%d y:%d w:%d h:%d ow:%d oh:%d\n", __func__, x, y, w, h, osd_w, osd_h); + lt_debug("#%d %s: x:%d y:%d w:%d h:%d ow:%d oh:%d\n", devnum, __func__, x, y, w, h, osd_w, osd_h); if (x == -1 && y == -1 && w == -1 && h == -1) { _w = xres; @@ -581,11 +602,9 @@ void cVideo::Pig(int x, int y, int w, int h, int osd_w, int osd_h, int startx, i _w /= 1280; _h /= 720; } - lt_debug("%s: x:%d y:%d w:%d h:%d xr:%d yr:%d\n", __func__, _x, _y, _w, _h, xres, yres); + lt_debug("#%d %s: x:%d y:%d w:%d h:%d xr:%d yr:%d\n", devnum, __func__, _x, _y, _w, _h, xres, yres); sprintf(buffer, "%x %x %x %x", _x, _y, _w, _h); - char tmp[100]; - snprintf(tmp, sizeof(tmp), "/proc/stb/vmpeg/%d/dst_all", dev); - proc_put(tmp, buffer, strlen(buffer)); + proc_put(VMPEG_dst_all[devnum], buffer, strlen(buffer)); } static inline int rate2csapi(int rate) @@ -621,13 +640,9 @@ void cVideo::getPictureInfo(int &width, int &height, int &rate) if (fd == -1) { /* in movieplayer mode, fd is not opened -> fall back to procfs */ - char tmp[100]; - snprintf(tmp, sizeof(tmp), "/proc/stb/vmpeg/%d/framerate", dev); - r = proc_get_hex(tmp); - snprintf(tmp, sizeof(tmp), "/proc/stb/vmpeg/%d/xres", dev); - width = proc_get_hex(tmp); - snprintf(tmp, sizeof(tmp), "/proc/stb/vmpeg/%d/yres", dev); - height = proc_get_hex(tmp); + r = proc_get_hex(VMPEG_framerate[devnum]); + width = proc_get_hex(VMPEG_xres[devnum]); + height = proc_get_hex(VMPEG_yres[devnum]); rate = rate2csapi(r); return; } @@ -636,7 +651,7 @@ void cVideo::getPictureInfo(int &width, int &height, int &rate) rate = rate2csapi(r); height = s.h; width = s.w; - lt_debug("%s: rate: %d, width: %d height: %d\n", __func__, rate, width, height); + lt_debug("#%d: %s: rate: %d, width: %d height: %d\n", devnum, __func__, rate, width, height); } void cVideo::SetSyncMode(AVSYNC_TYPE mode) @@ -666,7 +681,7 @@ int cVideo::SetStreamType(VIDEO_FORMAT type) "VIDEO_FORMAT_PNG" }; int t; - lt_debug("%s type=%s\n", __FUNCTION__, VF[type]); + lt_debug("#%d: %s type=%s\n", devnum, __func__, VF[type]); switch (type) { @@ -695,6 +710,11 @@ int64_t cVideo::GetPTS(void) return pts; } +void cVideo::SetDemux(cDemux *) +{ + lt_debug("#%d %s not implemented yet\n", devnum, __func__); +} + void cVideo::SetControl(int control, int value) { const char *p = NULL; switch (control) { diff --git a/libspark/video_lib.h b/libspark/video_lib.h index 8bfe177..a371dc1 100644 --- a/libspark/video_lib.h +++ b/libspark/video_lib.h @@ -130,7 +130,7 @@ class cVideo private: /* video device */ int fd; - int dev; + unsigned int devnum; /* apparently we cannot query the driver's state => remember it */ video_play_state_t playstate; @@ -153,7 +153,7 @@ class cVideo void closeDevice(void); public: /* constructor & destructor */ - cVideo(int mode, void *, void *, int dev = 0); + cVideo(int mode, void *, void *, unsigned int unit = 0); ~cVideo(void); void * GetTVEnc() { return NULL; }; diff --git a/libtriple/video_td.cpp b/libtriple/video_td.cpp index f3dfaa7..f5c2fd6 100644 --- a/libtriple/video_td.cpp +++ b/libtriple/video_td.cpp @@ -70,7 +70,7 @@ static pthread_mutex_t stillp_mutex = PTHREAD_MUTEX_INITIALIZER; /* debugging hacks */ static bool noscart = false; -cVideo::cVideo(int, void *, void *) +cVideo::cVideo(int, void *, void *, unsigned int) { lt_debug("%s\n", __FUNCTION__); if ((fd = open(VIDEO_DEVICE, O_RDWR)) < 0) @@ -1098,3 +1098,8 @@ bool cVideo::GetScreenImage(unsigned char * &video, int &xres, int &yres, bool g close(mfd); return true; } + +void cVideo::SetDemux(cDemux *) +{ + lt_debug("%s: not implemented yet\n", __func__); +} diff --git a/libtriple/video_td.h b/libtriple/video_td.h index 58cdaa0..d689420 100644 --- a/libtriple/video_td.h +++ b/libtriple/video_td.h @@ -5,6 +5,7 @@ #define video_format_t vidDispSize_t //#define video_displayformat_t vidDispMode_t #include "../common/cs_types.h" +#include "dmx_td.h" #define STB_HAL_VIDEO_HAS_GETSCREENIMAGE 1 @@ -138,7 +139,7 @@ class cVideo int video_standby; public: /* constructor & destructor */ - cVideo(int mode, void *, void *); + cVideo(int mode, void *, void *, unsigned int unit = 0); ~cVideo(void); void * GetTVEnc() { return NULL; }; @@ -188,6 +189,7 @@ class cVideo int CloseVBI(void) { return 0; }; int StartVBI(unsigned short) { return 0; }; int StopVBI(void) { return 0; }; + void SetDemux(cDemux *dmx); bool GetScreenImage(unsigned char * &data, int &xres, int &yres, bool get_video = true, bool get_osd = false, bool scale_to_video = false); };