X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/6e4252048719916fbe136dbe2a22eea0bbac9a7e..f24b1a713e78a462c279c8fcb10e0a1d1b9b9caa:/lib/dvb/decoder.cpp diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp index 6ad39225..8bc07e60 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 == 0 ? 2 : 3; // convert dvb api to etsi + 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 == 0 ? 2 : 3; // convert dvb api to etsi + 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; +}