X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fpython%2FPlugins%2FExtensions%2FDVDPlayer%2Fsrc%2Fservicedvd.cpp;h=94f2ee38ad0ed7cff675b9f2b8d8f5631ba40f41;hp=02c0ca940057d6794597d23a04b6040064f99d5d;hb=a23ed7f5a165951c6042411b0d0cabaab010f561;hpb=9e9b0f5405807576512b9e9e5f6adeb87218822e diff --git a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp index 02c0ca9..94f2ee3 100644 --- a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp +++ b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp @@ -51,7 +51,7 @@ DEFINE_REF(eServiceFactoryDVD) RESULT eServiceFactoryDVD::play(const eServiceReference &ref, ePtr &ptr) { // check resources... - ptr = new eServiceDVD(ref.path.c_str()); + ptr = new eServiceDVD(ref); return 0; } @@ -84,16 +84,17 @@ RESULT eServiceFactoryDVD::offlineOperations(const eServiceReference &, ePtr -1) @@ -121,13 +125,28 @@ eServiceDVD::eServiceDVD(const char *filename): { rd = read(fd, tmp, 255); if (rd > 6 && !strncmp(tmp, "bestfit", 7)) - aspect = DDVD_JUSTSCALE; + policy = DDVD_JUSTSCALE; else if (rd > 8 && !strncmp(tmp, "letterbox", 9)) - aspect = DDVD_LETTERBOX; + policy = DDVD_LETTERBOX; close(fd); } +#ifdef DDVD_SUPPORTS_16_10_SCALING + fd = open("/proc/stb/video/policy2", O_RDONLY); + if (fd > -1) + { + rd = read(fd, tmp, 255); + if (rd > 6 && !strncmp(tmp, "bestfit", 7)) + policy2 = DDVD_JUSTSCALE; + else if (rd > 8 && !strncmp(tmp, "letterbox", 9)) + policy2 = DDVD_LETTERBOX; + close(fd); + } + ddvd_set_video_ex(m_ddvdconfig, aspect, policy, policy2, DDVD_PAL /*unused*/); +#else ddvd_set_video(m_ddvdconfig, aspect, policy, DDVD_PAL /*unused*/); +#warning please update libdreamdvd for 16:10 scaling support! +#endif CONNECT(m_sn->activated, eServiceDVD::gotMessage); CONNECT(m_pump.recv_msg, eServiceDVD::gotThreadMessage); @@ -179,7 +198,20 @@ void eServiceDVD::gotMessage(int /*what*/) if (m_subtitle_widget) { int x1,x2,y1,y2; ddvd_get_last_blit_area(m_ddvdconfig, &x1, &x2, &y1, &y2); - m_subtitle_widget->setPixmap(m_pixmap, eRect(x1, y1, x2-x1, y2-y1)); + + int x_offset = 0, y_offset = 0, width = 720, height = 576; + +#ifdef DDVD_SUPPORTS_GET_BLIT_DESTINATION + ddvd_get_blit_destination(m_ddvdconfig, &x_offset, &y_offset, &width, &height); + eDebug("values got from ddvd: %d %d %d %d", x_offset, y_offset, width, height); + y_offset = -y_offset; + width -= x_offset * 2; + height -= y_offset * 2; +#endif + eRect dest(x_offset, y_offset, width, height); + + if (dest.width() && dest.height()) + m_subtitle_widget->setPixmap(m_pixmap, eRect(x1, y1, (x2-x1)+1, (y2-y1)+1), dest); } break; case DDVD_SHOWOSD_STATE_PLAY: @@ -234,6 +266,14 @@ void eServiceDVD::gotMessage(int /*what*/) eDebug("DVD_SOF_REACHED!"); m_event(this, evSOF); break; + case DDVD_SHOWOSD_ANGLE: + { + int current, num; + ddvd_get_angle_info(m_ddvdconfig, ¤t, &num); + eDebug("DVD_ANGLE_INFO: %d / %d", current, num); + m_event(this, evUser+13); + break; + } case DDVD_SHOWOSD_TIME: { static struct ddvd_time last_info; @@ -291,7 +331,7 @@ RESULT eServiceDVD::connectEvent(const Slot2 &event, RESULT eServiceDVD::start() { - assert(m_state == stIdle); + ASSERT(m_state == stIdle); m_state = stRunning; eDebug("eServiceDVD starting"); // m_event(this, evStart); @@ -300,10 +340,10 @@ RESULT eServiceDVD::start() RESULT eServiceDVD::stop() { - assert(m_state != stIdle); + ASSERT(m_state != stIdle); if (m_state == stStopped) return -1; - eDebug("DVD: stop %s", m_filename.c_str()); + eDebug("DVD: stop %s", m_ref.path.c_str()); m_state = stStopped; ddvd_send_key(m_ddvdconfig, DDVD_KEY_EXIT); @@ -417,7 +457,7 @@ RESULT eServiceDVD::getName(std::string &name) if ( m_ddvd_titlestring[0] != '\0' ) name = m_ddvd_titlestring; else - name = m_filename; + name = m_ref.path; return 0; } @@ -458,6 +498,7 @@ int eServiceDVD::getInfo(int w) } case sUser+6: case sUser+7: + case sUser+8: return resIsPyObject; default: return resNA; @@ -469,7 +510,7 @@ std::string eServiceDVD::getInfoString(int w) switch(w) { case sServiceref: - break; + return m_ref.toString(); default: eDebug("unhandled getInfoString(%d)", w); } @@ -527,6 +568,16 @@ PyObject *eServiceDVD::getInfoObject(int w) } return tuple; } + case sUser+8: + { + ePyObject tuple = PyTuple_New(2); + int current, num; + ddvd_get_angle_info(m_ddvdconfig, ¤t, &num); + PyTuple_SetItem(tuple, 0, PyInt_FromLong(current)); + PyTuple_SetItem(tuple, 1, PyInt_FromLong(num)); + + return tuple; + } default: eDebug("unhandled getInfoObject(%d)", w); } @@ -540,12 +591,17 @@ RESULT eServiceDVD::enableSubtitles(eWidget *parent, SWIG_PYOBJECT(ePyObject) /* m_subtitle_widget = new eSubtitleWidget(parent); m_subtitle_widget->resize(parent->size()); - eSize size = parent->size(); + eSize size = eSize(720, 576); if (!m_pixmap) { - m_pixmap = new gPixmap(size, 32); + m_pixmap = new gPixmap(size, 32, 1); /* allocate accel surface (if possible) */ +#ifdef DDVD_SUPPORTS_GET_BLIT_DESTINATION + ddvd_set_lfb_ex(m_ddvdconfig, (unsigned char *)m_pixmap->surface->data, size.width(), size.height(), 4, size.width()*4, 1); +#else ddvd_set_lfb(m_ddvdconfig, (unsigned char *)m_pixmap->surface->data, size.width(), size.height(), 4, size.width()*4); +#warning please update libdreamdvd for fast scaling +#endif run(); // start the thread } @@ -686,6 +742,9 @@ RESULT eServiceDVD::keyPressed(int key) case iServiceKeys::keyUser+7: ddvd_send_key(m_ddvdconfig, DDVD_KEY_MENU); break; + case iServiceKeys::keyUser+8: + ddvd_send_key(m_ddvdconfig, DDVD_KEY_ANGLE); + break; default: return -1; } @@ -727,7 +786,7 @@ void eServiceDVD::loadCuesheet() if ( m_ddvd_titlestring[0] != '\0' ) snprintf(filename, 128, "/home/root/dvd-%s.cuts", m_ddvd_titlestring); else - snprintf(filename, 128, "%s/dvd.cuts", m_filename.c_str()); + snprintf(filename, 128, "%s/dvd.cuts", m_ref.path.c_str()); eDebug("eServiceDVD::loadCuesheet() filename=%s",filename); @@ -798,7 +857,7 @@ void eServiceDVD::saveCuesheet() if ( m_ddvd_titlestring[0] != '\0' ) snprintf(filename, 128, "/home/root/dvd-%s.cuts", m_ddvd_titlestring); else - snprintf(filename, 128, "%s/dvd.cuts", m_filename.c_str()); + snprintf(filename, 128, "%s/dvd.cuts", m_ref.path.c_str()); FILE *f = fopen(filename, "wb");