From 08d4f4729ac8c417f767628ef521dc71f232cf98 Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 24 Nov 2008 22:04:28 +0100 Subject: add possibility to request tsid/onid for iDVBChannel --- lib/dvb/idvb.h | 1 + 1 file changed, 1 insertion(+) (limited to 'lib/dvb/idvb.h') diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index cda05894..5fc633aa 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -504,6 +504,7 @@ class iDVBChannel: public iObject public: /* direct frontend access for raw channels and/or status inquiries. */ virtual SWIG_VOID(RESULT) getFrontend(ePtr &SWIG_OUTPUT)=0; + virtual RESULT requestTsidOnid(SWIG_PYOBJECT(ePyObject) callback) { return -1; } #ifndef SWIG enum { -- cgit v1.2.3 From 2db9104f97679c2756816867dca581cd62a818c8 Mon Sep 17 00:00:00 2001 From: ghost Date: Fri, 12 Dec 2008 12:57:46 +0100 Subject: fix return values to python --- lib/dvb/frontend.h | 16 ++++++++-------- lib/dvb/idvb.h | 19 ++++++++++--------- 2 files changed, 18 insertions(+), 17 deletions(-) (limited to 'lib/dvb/idvb.h') diff --git a/lib/dvb/frontend.h b/lib/dvb/frontend.h index 06ed12cc..6e272aca 100644 --- a/lib/dvb/frontend.h +++ b/lib/dvb/frontend.h @@ -20,22 +20,22 @@ public: { } - RESULT getSystem(int &type) const; - RESULT getDVBS(eDVBFrontendParametersSatellite &) const; - RESULT getDVBC(eDVBFrontendParametersCable &) const; - RESULT getDVBT(eDVBFrontendParametersTerrestrial &) const; + SWIG_VOID(RESULT) getSystem(int &SWIG_OUTPUT) const; + SWIG_VOID(RESULT) getDVBS(eDVBFrontendParametersSatellite &SWIG_OUTPUT) const; + SWIG_VOID(RESULT) getDVBC(eDVBFrontendParametersCable &SWIG_OUTPUT) const; + SWIG_VOID(RESULT) getDVBT(eDVBFrontendParametersTerrestrial &SWIG_OUTPUT) const; RESULT setDVBS(const eDVBFrontendParametersSatellite &p, bool no_rotor_command_on_tune=false); RESULT setDVBC(const eDVBFrontendParametersCable &p); RESULT setDVBT(const eDVBFrontendParametersTerrestrial &p); - + SWIG_VOID(RESULT) getFlags(unsigned int &SWIG_NAMED_OUTPUT(flags)) const { flags = m_flags; return 0; } + RESULT setFlags(unsigned int flags) { m_flags = flags; return 0; } +#ifndef SWIG RESULT calculateDifference(const iDVBFrontendParameters *parm, int &, bool exact) const; RESULT getHash(unsigned long &) const; RESULT calcLockTimeout(unsigned int &) const; - - RESULT getFlags(unsigned int &flags) const { flags = m_flags; return 0; } - RESULT setFlags(unsigned int flags) { m_flags = flags; return 0; } +#endif }; #ifndef SWIG diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index 5fc633aa..9eaac596 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -404,15 +404,16 @@ class iDVBFrontendParameters: public iObject #endif public: enum { flagOnlyFree = 1 }; - virtual RESULT getSystem(int &SWIG_OUTPUT) const = 0; - virtual RESULT getDVBS(eDVBFrontendParametersSatellite &SWIG_OUTPUT) const = 0; - virtual RESULT getDVBC(eDVBFrontendParametersCable &SWIG_OUTPUT) const = 0; - virtual RESULT getDVBT(eDVBFrontendParametersTerrestrial &SWIG_OUTPUT) const = 0; - - virtual RESULT calculateDifference(const iDVBFrontendParameters *parm, int &SWIG_OUTPUT, bool exact) const = 0; - virtual RESULT getHash(unsigned long &SWIG_OUTPUT) const = 0; - virtual RESULT calcLockTimeout(unsigned int &) const = 0; - virtual RESULT getFlags(unsigned int &) const = 0; + virtual SWIG_VOID(RESULT) getSystem(int &SWIG_OUTPUT) const = 0; + virtual SWIG_VOID(RESULT) getDVBS(eDVBFrontendParametersSatellite &SWIG_OUTPUT) const = 0; + virtual SWIG_VOID(RESULT) getDVBC(eDVBFrontendParametersCable &SWIG_OUTPUT) const = 0; + virtual SWIG_VOID(RESULT) getDVBT(eDVBFrontendParametersTerrestrial &SWIG_OUTPUT) const = 0; + virtual SWIG_VOID(RESULT) getFlags(unsigned int &SWIG_OUTPUT) const = 0; +#ifndef SWIG + virtual SWIG_VOID(RESULT) calculateDifference(const iDVBFrontendParameters *parm, int &, bool exact) const = 0; + virtual SWIG_VOID(RESULT) getHash(unsigned long &) const = 0; + virtual SWIG_VOID(RESULT) calcLockTimeout(unsigned int &) const = 0; +#endif }; SWIG_TEMPLATE_TYPEDEF(ePtr, iDVBFrontendParametersPtr); -- cgit v1.2.3 From 6e16107fdcc5f838f681d6f5d49e30124ebe5d74 Mon Sep 17 00:00:00 2001 From: ghost Date: Tue, 16 Dec 2008 15:02:48 +0100 Subject: move some functions to better place (aspect / size / framerate / progressive handling) --- lib/dvb/decoder.cpp | 133 +++++++++++++++++++++++++++++++++++++++++++-- lib/dvb/decoder.h | 11 ++++ lib/dvb/idvb.h | 6 ++ lib/service/servicedvb.cpp | 69 +++++++---------------- lib/service/servicedvb.h | 1 - 5 files changed, 165 insertions(+), 55 deletions(-) (limited to 'lib/dvb/idvb.h') diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp index 6ad39225..79c4bd1e 100644 --- a/lib/dvb/decoder.cpp +++ b/lib/dvb/decoder.cpp @@ -300,6 +300,7 @@ DEFINE_REF(eDVBVideo); eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev) :m_demux(demux), m_dev(dev), m_is_slow_motion(0), m_is_fast_forward(0), m_is_freezed(0) + ,m_width(-1), m_height(-1), m_framerate(-1), m_aspect(-1), m_progressive(-1) { char filename[128]; #if HAVE_DVB_API_VERSION < 3 @@ -556,23 +557,23 @@ void eDVBVideo::video_event(int) { struct iTSMPEGDecoder::videoEvent event; event.type = iTSMPEGDecoder::videoEvent::eventSizeChanged; - event.aspect = evt.u.size.aspect_ratio; - event.height = evt.u.size.h; - event.width = evt.u.size.w; + m_aspect = event.aspect = evt.u.size.aspect_ratio; + m_height = event.height = evt.u.size.h; + m_width = event.width = evt.u.size.w; /* emit */ m_event(event); } else if (evt.type == VIDEO_EVENT_FRAME_RATE_CHANGED) { struct iTSMPEGDecoder::videoEvent event; event.type = iTSMPEGDecoder::videoEvent::eventFrameRateChanged; - event.framerate = evt.u.frame_rate; + m_framerate = event.framerate = evt.u.frame_rate; /* emit */ m_event(event); } else if (evt.type == 16 /*VIDEO_EVENT_PROGRESSIVE_CHANGED*/) { struct iTSMPEGDecoder::videoEvent event; event.type = iTSMPEGDecoder::videoEvent::eventProgressiveChanged; - event.progressive = evt.u.frame_rate; + m_progressive = event.progressive = evt.u.frame_rate; /* emit */ m_event(event); } else @@ -589,6 +590,93 @@ RESULT eDVBVideo::connectEvent(const Slot1= 3 + video_size_t size; + if (!::ioctl(fd, VIDEO_GET_SIZE, &size)) + { + xres = size.w; + yres = size.h; + aspect = size.aspect_ratio; + return 0; + } +// eDebug("VIDEO_GET_SIZE failed (%m)"); +#endif + return -1; +} + +static int readApiFrameRate(int fd, int &framerate) +{ +#if HAVE_DVB_API_VERSION >= 3 + unsigned int frate; + if (!::ioctl(fd, VIDEO_GET_FRAME_RATE, &frate)) + { + framerate = frate; + return 0; + } +// eDebug("VIDEO_GET_FRAME_RATE failed (%m)"); +#endif + return -1; +} + +int eDVBVideo::getWidth() +{ + if (m_width == -1) + readApiSize(m_fd, m_width, m_height, m_aspect); + if (m_width == -1) + m_width = readMpegProc("xres", m_dev); + return m_width; +} + +int eDVBVideo::getHeight() +{ + if (m_height == -1) + readApiSize(m_fd, m_width, m_height, m_aspect); + if (m_height == -1) + m_height = readMpegProc("yres", m_dev); + return m_height; +} + +int eDVBVideo::getAspect() +{ + if (m_aspect == -1) + readApiSize(m_fd, m_width, m_height, m_aspect); + if (m_aspect == -1) + m_aspect = readMpegProc("aspect", m_dev); + return m_aspect; +} + +int eDVBVideo::getProgressive() +{ + if (m_progressive == -1) + m_progressive = readMpegProc("progressive", m_dev); + return m_progressive; +} + +int eDVBVideo::getFrameRate() +{ + if (m_framerate == -1) + readApiFrameRate(m_fd, m_framerate); + if (m_framerate == -1) + m_framerate = readMpegProc("framerate", m_dev); + return m_framerate; +} + DEFINE_REF(eDVBPCR); eDVBPCR::eDVBPCR(eDVBDemux *demux): m_demux(demux) @@ -1245,3 +1333,38 @@ void eTSMPEGDecoder::video_event(struct videoEvent event) { /* emit */ m_video_event(event); } + +int eTSMPEGDecoder::getVideoWidth() +{ + if (m_video) + return m_video->getWidth(); + return -1; +} + +int eTSMPEGDecoder::getVideoHeight() +{ + if (m_video) + return m_video->getHeight(); + return -1; +} + +int eTSMPEGDecoder::getVideoProgressive() +{ + if (m_video) + return m_video->getProgressive(); + return -1; +} + +int eTSMPEGDecoder::getVideoFrameRate() +{ + if (m_video) + return m_video->getFrameRate(); + return -1; +} + +int eTSMPEGDecoder::getVideoAspect() +{ + if (m_video) + return m_video->getAspect(); + return -1; +} diff --git a/lib/dvb/decoder.h b/lib/dvb/decoder.h index 05e07ef9..5b9d352a 100644 --- a/lib/dvb/decoder.h +++ b/lib/dvb/decoder.h @@ -47,6 +47,7 @@ private: ePtr m_sn; void video_event(int what); Signal1 m_event; + int m_width, m_height, m_framerate, m_aspect, m_progressive; public: enum { MPEG2, MPEG4_H264 }; eDVBVideo(eDVBDemux *demux, int dev); @@ -67,6 +68,11 @@ public: int getPTS(pts_t &now); virtual ~eDVBVideo(); RESULT connectEvent(const Slot1 &event, ePtr &conn); + int getWidth(); + int getHeight(); + int getProgressive(); + int getFrameRate(); + int getAspect(); }; class eDVBPCR: public iObject @@ -164,6 +170,11 @@ public: /* what 0=auto, 1=video, 2=audio. */ RESULT getPTS(int what, pts_t &pts); RESULT connectVideoEvent(const Slot1 &event, ePtr &connection); + int getVideoWidth(); + int getVideoHeight(); + int getVideoProgressive(); + int getVideoFrameRate(); + int getVideoAspect(); }; #endif diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index 9eaac596..ec016d69 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -716,6 +716,12 @@ public: }; virtual RESULT connectVideoEvent(const Slot1 &event, ePtr &connection) = 0; + + virtual int getVideoWidth() = 0; + virtual int getVideoHeight() = 0; + virtual int getVideoProgressive() = 0; + virtual int getVideoFrameRate() = 0; + virtual int getVideoAspect() = 0; }; #endif //SWIG diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 7a779e0c..44e1262f 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -1044,7 +1044,6 @@ RESULT eServiceFactoryDVB::lookupService(ePtr &service, const eServ eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *service): m_reference(ref), m_dvb_service(service), m_have_video_pid(0), m_is_paused(0) { - memset(&m_videoEventData, 0, sizeof(struct iTSMPEGDecoder::videoEvent)); m_is_primary = 1; m_is_pvr = !m_reference.path.empty(); @@ -1575,20 +1574,6 @@ RESULT eDVBServicePlay::getEvent(ePtr &evt, int nownext) return m_event_handler.getEvent(evt, nownext); } -static int readMpegProc(char *str, int decoder) -{ - int val = -1; - char tmp[64]; - sprintf(tmp, "/proc/stb/vmpeg/%d/%s", decoder, str); - FILE *f = fopen(tmp, "r"); - if (f) - { - fscanf(f, "%x", &val); - fclose(f); - } - return val; -} - int eDVBServicePlay::getInfo(int w) { eDVBServicePMTHandler::program program; @@ -1605,44 +1590,30 @@ int eDVBServicePlay::getInfo(int w) switch (w) { -#if HAVE_DVB_API_VERSION >= 3 case sVideoHeight: - if (m_videoEventData.type == iTSMPEGDecoder::videoEvent::eventSizeChanged) - return m_videoEventData.height; - else - return readMpegProc("yres", !m_is_primary); + if (m_decoder) + return m_decoder->getVideoHeight(); + break; case sVideoWidth: - if (m_videoEventData.type == iTSMPEGDecoder::videoEvent::eventSizeChanged) - return m_videoEventData.width; - else - return readMpegProc("xres", !m_is_primary); + if (m_decoder) + return m_decoder->getVideoWidth(); + break; case sFrameRate: - if (m_videoEventData.type == iTSMPEGDecoder::videoEvent::eventFrameRateChanged) - return m_videoEventData.framerate; - else - return readMpegProc("framerate", !m_is_primary); + if (m_decoder) + return m_decoder->getVideoFrameRate(); + break; case sProgressive: - if (m_videoEventData.type == iTSMPEGDecoder::videoEvent::eventProgressiveChanged) - return m_videoEventData.progressive; - return readMpegProc("progressive", !m_is_primary); -#else -#warning "FIXMEE implement sFrameRate, sProgressive, sVideoHeight, sVideoWidth for old DVB API" -#endif + if (m_decoder) + return m_decoder->getVideoProgressive(); + break; case sAspect: { - int val; -#if HAVE_DVB_API_VERSION >= 3 - if (m_videoEventData.type == iTSMPEGDecoder::videoEvent::eventSizeChanged) - return m_videoEventData.aspect == VIDEO_FORMAT_4_3 ? 1 : 3; - else if ((val=readMpegProc("aspect", !m_is_primary)) != -1) - return val; - else -#else -#warning "FIXMEE implement sAspect for old DVB API" -#endif + int aspect = -1; + if (m_decoder) + aspect = m_decoder->getVideoAspect(); if (no_program_info) - return -1; - else if (!program.videoStreams.empty() && program.videoStreams[0].component_tag != -1) + break; + else if (aspect == -1 && !program.videoStreams.empty() && program.videoStreams[0].component_tag != -1) { ePtr evt; if (!m_event_handler.getEvent(evt, 0)) @@ -1679,7 +1650,7 @@ int eDVBServicePlay::getInfo(int w) } } } - return -1; + break; } case sIsCrypted: if (no_program_info) return -1; return program.isCrypted(); case sVideoPID: if (no_program_info) return -1; if (program.videoStreams.empty()) return -1; return program.videoStreams[0].pid; @@ -1696,8 +1667,9 @@ int eDVBServicePlay::getInfo(int w) case sServiceref: return resIsString; case sDVBState: return m_tune_state; default: - return -1; + break; } + return -1; } std::string eDVBServicePlay::getInfoString(int w) @@ -2998,7 +2970,6 @@ void eDVBServicePlay::setPCMDelay(int delay) void eDVBServicePlay::video_event(struct iTSMPEGDecoder::videoEvent event) { - memcpy(&m_videoEventData, &event, sizeof(event)); switch(event.type) { case iTSMPEGDecoder::videoEvent::eventSizeChanged: m_event((iPlayableService*)this, evVideoSizeChanged); diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h index d19b92d6..56ec89ea 100644 --- a/lib/service/servicedvb.h +++ b/lib/service/servicedvb.h @@ -282,7 +282,6 @@ private: ePtr m_video_event_connection; void video_event(struct iTSMPEGDecoder::videoEvent); - struct iTSMPEGDecoder::videoEvent m_videoEventData; }; class eStaticServiceDVBBouquetInformation: public iStaticServiceInformation -- cgit v1.2.3