diff options
| author | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-12-13 13:26:48 +0000 |
|---|---|---|
| committer | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-12-13 13:26:48 +0000 |
| commit | b5b839edc91a6902966079ec0b0bb5026df9df57 (patch) | |
| tree | aa7ab629412e0c52041ba39425f299531274d386 /lib/dvb | |
| parent | 1394bbf36f7e0cc591f1a31b7d5db4e8f0f2c0c6 (diff) | |
| download | enigma2-b5b839edc91a6902966079ec0b0bb5026df9df57.tar.gz enigma2-b5b839edc91a6902966079ec0b0bb5026df9df57.zip | |
use aspect ratio information from mpeg sequence header instead of eit (needs
new drivers)
Diffstat (limited to 'lib/dvb')
| -rw-r--r-- | lib/dvb/decoder.cpp | 61 | ||||
| -rw-r--r-- | lib/dvb/decoder.h | 14 | ||||
| -rw-r--r-- | lib/dvb/idvb.h | 11 |
3 files changed, 82 insertions, 4 deletions
diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp index 50934c71..b9acabad 100644 --- a/lib/dvb/decoder.cpp +++ b/lib/dvb/decoder.cpp @@ -1,3 +1,4 @@ +#include <lib/base/ebase.h> #include <lib/base/eerror.h> #include <lib/dvb/decoder.h> #if HAVE_DVB_API_VERSION < 3 @@ -178,7 +179,11 @@ eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev): m_demux(demux), m_dev(dev) m_fd = ::open(filename, O_RDWR); if (m_fd < 0) eWarning("%s: %m", filename); - + else + { + m_sn = new eSocketNotifier(eApp, m_fd, eSocketNotifier::Priority); + CONNECT(m_sn->activated, eDVBVideo::video_event); + } eDebug("Video Device: %s", filename); #if HAVE_DVB_API_VERSION < 3 sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux); @@ -281,6 +286,8 @@ int eDVBVideo::getPTS(pts_t &now) eDVBVideo::~eDVBVideo() { + if (m_sn) + delete m_sn; if (m_is_slow_motion) setSlowMotion(0); if (m_is_fast_forward) @@ -291,6 +298,37 @@ eDVBVideo::~eDVBVideo() ::close(m_fd_demux); } +void eDVBVideo::video_event(int) +{ +#if HAVE_DVB_API_VERSION >= 3 + struct video_event evt; + if (::ioctl(m_fd, VIDEO_GET_EVENT, &evt) < 0) + eDebug("VIDEO_GET_EVENT failed(%m)"); + else + { + if (evt.type == VIDEO_EVENT_SIZE_CHANGED) + { + 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; + /* emit */ m_event(event); + } + else + eDebug("unhandled DVBAPI Video Event %d", evt.type); + } +#else +#warning "FIXMEE!! Video Events not implemented for old api" +#endif +} + +RESULT eDVBVideo::connectEvent(const Slot1<void, struct iTSMPEGDecoder::videoEvent> &event, ePtr<eConnection> &conn) +{ + conn = new eConnection(this, m_event.connect(event)); + return 0; +} + DEFINE_REF(eDVBPCR); eDVBPCR::eDVBPCR(eDVBDemux *demux): m_demux(demux) @@ -442,6 +480,7 @@ int eTSMPEGDecoder::setState() if (m_changed & changeVideo) { m_video = new eDVBVideo(m_demux, m_decoder); + m_video->connectEvent(slot(*this, &eTSMPEGDecoder::video_event), m_video_event_conn); if (m_video->startPid(m_vpid)) { eWarning("video: startpid failed!"); @@ -489,6 +528,7 @@ int eTSMPEGDecoder::setState() { eDebug("new video"); m_video = new eDVBVideo(m_demux, m_decoder); + m_video->connectEvent(slot(*this, &eTSMPEGDecoder::video_event), m_video_event_conn); if (m_video->startPid(m_vpid, m_vtype)) { eWarning("video: startpid failed!"); @@ -549,8 +589,10 @@ RESULT eTSMPEGDecoder::setPCMDelay(int delay) fprintf(fp, "%x", delay*90); fclose(fp); m_pcm_delay = delay; + return 0; } } + return -1; } RESULT eTSMPEGDecoder::setAC3Delay(int delay) @@ -563,13 +605,15 @@ RESULT eTSMPEGDecoder::setAC3Delay(int delay) fprintf(fp, "%x", delay*90); fclose(fp); m_ac3_delay = delay; + return 0; } } + return -1; } eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder): m_demux(demux), m_changed(0), m_decoder(decoder) { - demux->connectEvent(slot(*this, &eTSMPEGDecoder::demux_event), m_demux_event); + demux->connectEvent(slot(*this, &eTSMPEGDecoder::demux_event), m_demux_event_conn); m_is_ff = m_is_sm = m_is_trickmode = 0; } @@ -772,6 +816,7 @@ RESULT eTSMPEGDecoder::getPTS(int what, pts_t &pts) RESULT eTSMPEGDecoder::setRadioPic(const std::string &filename) { m_radio_pic = filename; + return 0; } RESULT eTSMPEGDecoder::showSinglePic(const char *filename) @@ -845,3 +890,15 @@ RESULT eTSMPEGDecoder::showSinglePic(const char *filename) } return 0; } + +RESULT eTSMPEGDecoder::connectVideoEvent(const Slot1<void, struct videoEvent> &event, ePtr<eConnection> &conn) +{ + conn = new eConnection(this, m_video_event.connect(event)); + return 0; +} + +void eTSMPEGDecoder::video_event(struct videoEvent event) +{ + /* emit */ m_video_event(event); +} + diff --git a/lib/dvb/decoder.h b/lib/dvb/decoder.h index 8e8f65ad..c864c095 100644 --- a/lib/dvb/decoder.h +++ b/lib/dvb/decoder.h @@ -4,6 +4,8 @@ #include <lib/base/object.h> #include <lib/dvb/demux.h> +class eSocketNotifier; + class eDVBAudio: public iObject { DECLARE_REF(eDVBAudio); @@ -28,7 +30,7 @@ public: virtual ~eDVBAudio(); }; -class eDVBVideo: public iObject +class eDVBVideo: public iObject, public Object { DECLARE_REF(eDVBVideo); private: @@ -36,6 +38,9 @@ private: int m_fd, m_fd_demux, m_dev; int m_is_slow_motion, m_is_fast_forward; + eSocketNotifier *m_sn; + void video_event(int what); + Signal1<void, struct iTSMPEGDecoder::videoEvent> m_event; public: enum { MPEG2, MPEG4_H264 }; eDVBVideo(eDVBDemux *demux, int dev); @@ -52,6 +57,7 @@ public: void unfreeze(); int getPTS(pts_t &now); virtual ~eDVBVideo(); + RESULT connectEvent(const Slot1<void, struct iTSMPEGDecoder::videoEvent> &event, ePtr<eConnection> &conn); }; class eDVBPCR: public iObject @@ -104,9 +110,12 @@ private: int m_changed, m_decoder; int m_is_ff, m_is_sm, m_is_trickmode; int setState(); - ePtr<eConnection> m_demux_event; + ePtr<eConnection> m_demux_event_conn; + ePtr<eConnection> m_video_event_conn; void demux_event(int event); + void video_event(struct videoEvent); + Signal1<void, struct videoEvent> m_video_event; public: enum { pidNone = -1 }; eTSMPEGDecoder(eDVBDemux *demux, int decoder); @@ -136,6 +145,7 @@ public: RESULT setRadioPic(const std::string &filename); /* what 0=auto, 1=video, 2=audio. */ RESULT getPTS(int what, pts_t &pts); + RESULT connectVideoEvent(const Slot1<void, struct videoEvent> &event, ePtr<eConnection> &connection); }; #endif diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index 997b2a88..7ee50e8d 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -8,6 +8,7 @@ #define FRONTENDPARAMETERS FrontendParameters #else #include <linux/dvb/frontend.h> +#include <linux/dvb/video.h> #define FRONTENDPARAMETERS struct dvb_frontend_parameters #endif #include <lib/dvb/frontendparms.h> @@ -646,6 +647,16 @@ public: virtual RESULT showSinglePic(const char *filename) = 0; virtual RESULT setRadioPic(const std::string &filename) = 0; + + struct videoEvent + { + enum { eventUnknown = 0, eventSizeChanged = VIDEO_EVENT_SIZE_CHANGED } type; + unsigned char aspect; + unsigned short height; + unsigned short width; + }; + + virtual RESULT connectVideoEvent(const Slot1<void, struct videoEvent> &event, ePtr<eConnection> &connection) = 0; }; #endif //SWIG |
