From: ghost Date: Tue, 16 Dec 2008 14:02:48 +0000 (+0100) Subject: move some functions to better place (aspect / size / framerate / progressive handling) X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=commitdiff_plain;h=6e16107fdcc5f838f681d6f5d49e30124ebe5d74 move some functions to better place (aspect / size / framerate / progressive handling) --- diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp index 6ad3922..79c4bd1 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 05e07ef..5b9d352 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 9eaac59..ec016d6 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 7a779e0..44e1262 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 d19b92d..56ec89e 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