X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/be40133df4db68185931042f43995cf27da480be..f769a73f621f88d4b4e64be8fae3f79ca3ef6c1b:/lib/service/servicedvb.cpp diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 17f841b5..c259a811 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -1569,46 +1569,67 @@ 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; - + if (w == sCAIDs) return resIsPyObject; eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler; - + int no_program_info = 0; - + if (h.getProgramInfo(program)) no_program_info = 1; - + switch (w) { #if HAVE_DVB_API_VERSION >= 3 case sVideoHeight: if (m_videoEventData.type != iTSMPEGDecoder::videoEvent::eventUnknown) return m_videoEventData.height; - return -1; + else + return readMpegProc("yres", !m_is_primary); case sVideoWidth: if (m_videoEventData.type != iTSMPEGDecoder::videoEvent::eventUnknown) return m_videoEventData.width; - return -1; + else + return readMpegProc("xres", !m_is_primary); case sFrameRate: if (m_videoEventData.type != iTSMPEGDecoder::videoEvent::eventUnknown) return m_videoEventData.framerate; - return -1; + else + return readMpegProc("framerate", !m_is_primary); case sProgressive: if (m_videoEventData.type != iTSMPEGDecoder::videoEvent::eventUnknown) return m_videoEventData.progressive; - return -1; + return readMpegProc("progressive", !m_is_primary); #else #warning "FIXMEE implement sFrameRate, sProgressive, sVideoHeight, sVideoWidth for old DVB API" #endif case sAspect: + { + int val; #if HAVE_DVB_API_VERSION >= 3 if (m_videoEventData.type != iTSMPEGDecoder::videoEvent::eventUnknown) 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" @@ -1653,6 +1674,7 @@ int eDVBServicePlay::getInfo(int w) } } return -1; + } 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; case sVideoType: if (no_program_info) return -1; if (program.videoStreams.empty()) return -1; return program.videoStreams[0].type; @@ -2961,21 +2983,19 @@ 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_videoEventData.aspect = event.aspect; - m_videoEventData.height = event.height; - m_videoEventData.width = event.width; m_event((iPlayableService*)this, evVideoSizeChanged); break; case iTSMPEGDecoder::videoEvent::eventFrameRateChanged: - m_videoEventData.framerate = event.framerate; m_event((iPlayableService*)this, evVideoFramerateChanged); break; case iTSMPEGDecoder::videoEvent::eventProgressiveChanged: - m_videoEventData.progressive = event.progressive; m_event((iPlayableService*)this, evVideoProgressiveChanged); break; + default: + break; } }