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;
+ /* 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;
+ /* emit */ m_event(event);
+ }
else
eDebug("unhandled DVBAPI Video Event %d", evt.type);
}
struct videoEvent
{
- enum { eventUnknown = 0, eventSizeChanged = VIDEO_EVENT_SIZE_CHANGED } type;
+ enum { eventUnknown = 0,
+ eventSizeChanged = VIDEO_EVENT_SIZE_CHANGED,
+ eventFrameRateChanged = VIDEO_EVENT_FRAME_RATE_CHANGED,
+ eventProgressiveChanged = 16
+ } type;
unsigned char aspect;
unsigned short height;
unsigned short width;
+ bool progressive;
+ unsigned short framerate;
};
virtual RESULT connectVideoEvent(const Slot1<void, struct videoEvent> &event, ePtr<eConnection> &connection) = 0;
evUpdatedRassInteractivePicMask,
evVideoSizeChanged,
+ evVideoFramerateChanged,
+ evVideoProgressiveChanged,
evStopped,
void eDVBServicePlay::video_event(struct iTSMPEGDecoder::videoEvent event)
{
memcpy(&m_videoEventData, &event, sizeof(iTSMPEGDecoder::videoEvent));
- m_event((iPlayableService*)this, evVideoSizeChanged);
+ switch(event.type) {
+ case iTSMPEGDecoder::videoEvent::eventSizeChanged:
+ m_event((iPlayableService*)this, evVideoSizeChanged);
+ break;
+ case iTSMPEGDecoder::videoEvent::eventFrameRateChanged:
+ m_event((iPlayableService*)this, evVideoFramerateChanged);
+ break;
+ case iTSMPEGDecoder::videoEvent::eventProgressiveChanged:
+ m_event((iPlayableService*)this, evVideoProgressiveChanged);
+ break;
+ }
}
RESULT eDVBServicePlay::stream(ePtr<iStreamableService> &ptr)