use 720x576 subtitle pixmap, and scale to fullscreen
[enigma2.git] / lib / python / Plugins / Extensions / DVDPlayer / src / servicedvd.cpp
index 5d6a08709cbd6d5d1a0bae74e6262efbce3d08cb..ea1afec402ca933d58da7220d1485bce900fe5f1 100644 (file)
@@ -103,7 +103,10 @@ eServiceDVD::eServiceDVD(const char *filename):
        // create handle
        ddvd_set_dvd_path(m_ddvdconfig, filename);
        ddvd_set_ac3thru(m_ddvdconfig, 0);
-       ddvd_set_language(m_ddvdconfig, "de");
+
+       std::string ddvd_language;
+       if (!ePythonConfigQuery::getConfigValue("config.osd.language", ddvd_language))
+               ddvd_set_language(m_ddvdconfig, (ddvd_language.substr(0,2)).c_str());
 
        int fd = open("/proc/stb/video/aspect", O_RDONLY);
        if (fd > -1)
@@ -121,9 +124,9 @@ 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);
        }
 
@@ -176,8 +179,11 @@ void eServiceDVD::gotMessage(int /*what*/)
                }
                case DDVD_SCREEN_UPDATE:
                        eDebug("DVD_SCREEN_UPDATE!");
-                       if (m_subtitle_widget)
-                               m_subtitle_widget->setPixmap(m_pixmap, eRect(ePoint(0, 0), m_pixmap->size()));
+                       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)+1, (y2-y1)+1));
+                       }
                        break;
                case DDVD_SHOWOSD_STATE_PLAY:
                {
@@ -231,6 +237,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, &current, &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;
@@ -277,6 +291,7 @@ eServiceDVD::~eServiceDVD()
        kill();
        saveCuesheet();
        ddvd_close(m_ddvdconfig);
+       disableSubtitles(0);
 }
 
 RESULT eServiceDVD::connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)
@@ -287,7 +302,7 @@ RESULT eServiceDVD::connectEvent(const Slot2<void,iPlayableService*,int> &event,
 
 RESULT eServiceDVD::start()
 {
-       assert(m_state == stIdle);
+       ASSERT(m_state == stIdle);
        m_state = stRunning;
        eDebug("eServiceDVD starting");
 //     m_event(this, evStart);
@@ -296,7 +311,7 @@ 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());
@@ -454,6 +469,7 @@ int eServiceDVD::getInfo(int w)
                }
                case sUser+6:
                case sUser+7:
+               case sUser+8:
                        return resIsPyObject;
                default:
                        return resNA;
@@ -523,6 +539,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, &current, &num);
+                       PyTuple_SetItem(tuple, 0, PyInt_FromLong(current));
+                       PyTuple_SetItem(tuple, 1, PyInt_FromLong(num));
+
+                       return tuple;
+               }
                default:
                        eDebug("unhandled getInfoObject(%d)", w);
        }
@@ -531,17 +557,16 @@ PyObject *eServiceDVD::getInfoObject(int w)
 
 RESULT eServiceDVD::enableSubtitles(eWidget *parent, SWIG_PYOBJECT(ePyObject) /*entry*/)
 {
-       if (m_subtitle_widget)
-               delete m_subtitle_widget;
+       delete m_subtitle_widget;
 
        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) */
                ddvd_set_lfb(m_ddvdconfig, (unsigned char *)m_pixmap->surface->data, size.width(), size.height(), 4, size.width()*4);
                run(); // start the thread
        }
@@ -683,6 +708,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;
        }