Merge remote branch 'origin/acid-burn/bug_629_show_autofs_volumes_as_backuplocation...
authoracid-burn <acid-burn@opendreambox.org>
Mon, 13 Dec 2010 11:41:13 +0000 (12:41 +0100)
committeracid-burn <acid-burn@opendreambox.org>
Mon, 13 Dec 2010 11:41:13 +0000 (12:41 +0100)
45 files changed:
Makefile.am
configure.ac
data/setup.xml
enigma2.pc.in
lib/dvb/decoder.cpp
lib/dvb/decoder.h
lib/dvb/esection.h
lib/dvb/idvb.h
lib/dvb/pmt.cpp
lib/dvb/pmt.h
lib/dvb/pvrparse.cpp
lib/dvb/tstools.cpp
lib/dvb_ci/dvbci.cpp
lib/gui/elistboxcontent.cpp
lib/gui/epositiongauge.cpp
lib/gui/esubtitle.h
lib/python/Components/FileList.py
lib/python/Components/UsageConfig.py
lib/python/Plugins/Extensions/DVDBurn/DVDProject.py
lib/python/Plugins/Extensions/DVDBurn/DreamboxDVD.ddvdp.xml
lib/python/Plugins/Extensions/DVDBurn/Text_menu_boat.ddvdm.xml
lib/python/Plugins/Extensions/DVDBurn/Thumbs_menu_clouds.ddvdm.xml
lib/python/Plugins/Extensions/DVDPlayer/plugin.py
lib/python/Plugins/Extensions/DVDPlayer/src/Makefile.am
lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp
lib/python/Plugins/Extensions/MediaPlayer/plugin.py
lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py
lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py
lib/python/Screens/AudioSelection.py
lib/python/Screens/InfoBarGenerics.py
lib/python/Tools/NumericalTextInput.py
lib/service/Makefile.am
lib/service/iservice.h
lib/service/servicedvb.cpp
lib/service/servicem2ts.cpp [new file with mode: 0644]
lib/service/servicem2ts.h [new file with mode: 0644]
lib/service/servicemp3.cpp
lib/service/servicemp3.h
main/Makefile.am
main/bsod.cpp
po/et.po
po/fi.po
po/is.po
po/pl.po
po/sv.po

index ab2d163..ff252e6 100755 (executable)
@@ -8,6 +8,9 @@ install_PYTHON = \
        keyids.py keymapparser.py mytest.py skin.py timer.py tools.py GlobalActions.py \
        e2reactor.py
 
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = enigma2.pc
+
 metadir = $(datadir)/meta
 meta_DATA = index-enigma2.xml
 CLEANFILES = index-enigma2.xml
index 48fea64..0c54f5b 100644 (file)
@@ -1,4 +1,4 @@
-AC_INIT([enigma2],[2.8.0],[enigma2-devel@lists.elitedvb.net])
+AC_INIT([enigma2],[3.0.0],[enigma2-devel@lists.elitedvb.net])
 AM_INIT_AUTOMAKE([dist-bzip2 no-define tar-pax -Wno-portability])
 AC_CONFIG_HEADERS([enigma2_config.h])
 
@@ -16,14 +16,7 @@ AC_CONFIG_MACRO_DIR([m4])
 
 AC_CHECK_HEADERS([dbox/fp.h dbox/lcd-ks0713.h])
 
-AC_PATH_PROG(MSGFMT,[msgfmt])
-AC_PATH_PROG(MSGINIT,[msginit])
-AC_PATH_PROG(MSGMERGE,[msgmerge])
-AC_PATH_PROG(MSGUNIQ,[msguniq])
-AC_PATH_PROG(XGETTEXT,[xgettext])
-if test -z "$MSGFMT" -o -z "$MSGINIT" -o -z "$MSGMERGE" -o -z "$MSGUNIQ" -o -z "$XGETTEXT"; then
-       AC_MSG_ERROR([Could not find required gettext tools])
-fi
+AC_PATH_PROG(MSGFMT, msgfmt, AC_MSG_ERROR(Could not find msgfmt))
 
 AM_PATH_PYTHON
 AX_PYTHON_DEVEL
@@ -86,12 +79,25 @@ if test "$with_memcheck" = "yes"; then
 fi
 
 AC_ARG_WITH(po,
-       AS_HELP_STRING([--without-po],[disable updating of po files]),
-       [with_po="$withval"],[with_po="yes"])
+       AS_HELP_STRING([--with-po],[enable updating of po files]),
+       [with_po="$withval"],[with_po="no"])
+if test "$with_po" = "yes"; then
+       AC_PATH_PROG(MSGINIT, msginit)
+       AC_PATH_PROG(MSGMERGE, msgmerge)
+       AC_PATH_PROG(MSGUNIQ, msguniq)
+       AC_PATH_PROG(XGETTEXT, xgettext)
+       if test -z "$MSGINIT" -o -z "$MSGMERGE" -o -z "$MSGUNIQ" -o -z "$XGETTEXT"; then
+               AC_MSG_ERROR([Could not find required gettext tools])
+       fi
+fi
 AM_CONDITIONAL(UPDATE_PO, test "$with_po" = "yes")
 
+ENIGMA2_CFLAGS="-fno-rtti -fno-exceptions"
+AC_SUBST(ENIGMA2_CFLAGS)
+
 CPPFLAGS="$CPPFLAGS $PYTHON_CPPFLAGS"
-CXXFLAGS="$CXXFLAGS $BASE_CFLAGS $PTHREAD_CFLAGS $DEBUG_CFLAGS -fno-rtti -fno-exceptions -Wall"
+CFLAGS="$CFLAGS $DEBUG_CFLAGS -Wall"
+CXXFLAGS="$CXXFLAGS $DEBUG_CFLAGS -Wall $BASE_CFLAGS $ENIGMA2_CFLAGS $PTHREAD_CFLAGS"
 
 AC_CONFIG_FILES([
 Makefile
index f5dea73..c5eb07f 100755 (executable)
                        <item level="2" text="Fast Forward speeds">config.seek.speeds_forward</item>
                        <item level="2" text="Rewind speeds">config.seek.speeds_backward</item>
                        <item level="2" text="Slow Motion speeds">config.seek.speeds_slowmotion</item>
-<!-- TRANSLATORS: Note that "Enter" in the two strings below should *not*
-     be interpreted as "Give speed as input". The intended meaning is
-     instead "Initial speed when starting winding", i.e. the speed at
-     which "winding mode" is entered when first pressing "rewind" or
-     "fast forward". -->  
-                       <item level="2" text="Enter Fast Forward at speed">config.seek.enter_forward</item>
-                       <item level="2" text="Enter Rewind at speed">config.seek.enter_backward</item>
-<!-- TRANSLATORS: The effect of "Non-smooth winding" is that rather
-     than using ordinary "continuous" or "smooth" winding, a fast
-     sequence of stills is shown when winding at high speeds. This
-     makes it much easier too follow when almost each frame comes from
-     a new scene. The effect is achieved by repeating each shown frame
-     a couple of times. The settings control both at which speed this
-     winding mode sets in, and how many times each frame should be
-     repeated. This was previously called "Discontinuous playback"
-     which was incomprehensible. "Non-smooth winding" may be a better
-     term, but note that there is nothing irregular about it. Synonyms
-     better suited for translation to other languages may be "stepwise
-     winding/playback", or "winding/playback using stills". -->
-                       <item level="2" text="Use non-smooth winding at speeds above">config.seek.stepwise_minspeed</item>
-                       <item level="2" text="Frame repeat count during non-smooth winding">config.seek.stepwise_repeat</item>
+<!-- TRANSLATORS: The following is the speed you get on the first press on fast-forward.
+     It was previously called "enter fast forward at speed" which was easily misunderstood. -->  
+                       <item level="2" text="Initial Fast Forward speed">config.seek.enter_forward</item>
+                       <item level="2" text="Initial Rewind speed">config.seek.enter_backward</item>
                        <item level="2" text="Behavior of 'pause' when paused">config.seek.on_pause</item>
                        <item level="2" text="Behavior of 0 key in PiP-mode">config.usage.pip_zero_button</item>
                        <item level="2" text="Alternative services tuner priority">config.usage.alternatives_priority</item>
index 01ba434..f34d904 100644 (file)
@@ -6,5 +6,5 @@ includedir=@includedir@
 Name: enigma2
 Description: Enigma2
 Version: @VERSION@
-Libs: 
-Cflags: -I${includedir}/enigma2
+Cflags: -I${includedir}/enigma2 @ENIGMA2_CFLAGS@
+Requires.private: sigc++-1.2
index 88cd3ee..8ed9f43 100644 (file)
@@ -203,6 +203,9 @@ int eDVBAudio::startPid(int pid, int type)
        case aLPCM:
                bypass = 6;
                break;
+       case aDTSHD:
+               bypass = 0x10;
+               break;
        }
 
        eDebugNoNewLine("AUDIO_SET_BYPASS(%d) - ", bypass);
index 3a0fbac..7610b65 100644 (file)
@@ -13,7 +13,7 @@ private:
        ePtr<eDVBDemux> m_demux;
        int m_fd, m_fd_demux, m_dev, m_is_freezed;
 public:
-       enum { aMPEG, aAC3, aDTS, aAAC, aAACHE, aLPCM };
+       enum { aMPEG, aAC3, aDTS, aAAC, aAACHE, aLPCM, aDTSHD };
        eDVBAudio(eDVBDemux *demux, int dev);
        enum { aMonoLeft, aStereo, aMonoRight };
        void setChannel(int channel);
index 2bb17a9..b4782f8 100644 (file)
@@ -100,6 +100,10 @@ class eAUTable: public eAUGTable
        int first;
        ePtr<iDVBDemux> m_demux;
        eMainloop *ml;
+
+       /* needed to detect broken table version handling (seen on some m2ts files) */
+       struct timespec m_prev_table_update;
+       int m_table_cnt;
 public:
 
        eAUTable()
@@ -119,6 +123,7 @@ public:
        
        int begin(eMainloop *m, const eDVBTableSpec &spec, ePtr<iDVBDemux> demux)
        {
+               m_table_cnt = 0;
                ml = m;
                m_demux = demux;
                first= 1;
@@ -197,6 +202,24 @@ public:
 
                if (current && (!current->getSpec(spec)))
                {
+                       /* detect broken table version handling (seen on some m2ts files) */
+                       if (m_table_cnt)
+                       {
+                               if (abs(timeout_usec(m_prev_table_update)) > 500000)
+                                       m_table_cnt = -1;
+                               else if (m_table_cnt > 1) // two pmt update within one second
+                               {
+                                       eDebug("Seen two consecutive table version changes within 500ms. "
+                                           "This seems broken, so auto update for pid %04x, table %02x is now disabled!!",
+                                           spec.pid, spec.tid);
+                                       m_table_cnt = 0;
+                                       return;
+                               }
+                       }
+
+                       ++m_table_cnt;
+                       clock_gettime(CLOCK_MONOTONIC, &m_prev_table_update);
+
                        next = new Table();
                        CONNECT(next->tableReady, eAUTable::slotTableReady);
                        spec.flags &= ~(eDVBTableSpec::tfAnyVersion|eDVBTableSpec::tfThisVersion|eDVBTableSpec::tfHaveTimeout);
index f15cd04..e56a2c7 100644 (file)
@@ -650,7 +650,7 @@ public:
                /** Set Displayed Video PID and type */
        virtual RESULT setVideoPID(int vpid, int type)=0;
 
-       enum { af_MPEG, af_AC3, af_DTS, af_AAC };
+       enum { af_MPEG, af_AC3, af_DTS, af_AAC, af_DTSHD };
                /** Set Displayed Audio PID and type */
        virtual RESULT setAudioPID(int apid, int type)=0;
 
index 46fa12e..d673384 100644 (file)
@@ -131,6 +131,8 @@ void eDVBServicePMTHandler::PATready(int)
        ePtr<eTable<ProgramAssociationSection> > ptr;
        if (!m_PAT.getCurrent(ptr))
        {
+               int service_id_single = -1;
+               int pmtpid_single = -1;
                int pmtpid = -1;
                std::vector<ProgramAssociationSection*>::const_iterator i;
                for (i = ptr->getSections().begin(); pmtpid == -1 && i != ptr->getSections().end(); ++i)
@@ -138,8 +140,22 @@ void eDVBServicePMTHandler::PATready(int)
                        const ProgramAssociationSection &pat = **i;
                        ProgramAssociationConstIterator program;
                        for (program = pat.getPrograms()->begin(); pmtpid == -1 && program != pat.getPrograms()->end(); ++program)
+                       {
                                if (eServiceID((*program)->getProgramNumber()) == m_reference.getServiceID())
                                        pmtpid = (*program)->getProgramMapPid();
+                               if (pmtpid_single == -1 && pmtpid == -1)
+                               {
+                                       pmtpid_single = (*program)->getProgramMapPid();
+                                       service_id_single = (*program)->getProgramNumber();
+                               }
+                               else
+                                       pmtpid_single = service_id_single = -1;
+                       }
+               }
+               if (pmtpid_single != -1) // only one PAT entry .. so we use this one
+               {
+                       m_reference.setServiceID(eServiceID(service_id_single));
+                       pmtpid = pmtpid_single;
                }
                if (pmtpid == -1)
                        serviceEvent(eventNoPATEntry);
@@ -149,7 +165,7 @@ void eDVBServicePMTHandler::PATready(int)
                serviceEvent(eventNoPAT);
 }
 
-PyObject *eDVBServicePMTHandler::getCaIds()
+PyObject *eDVBServicePMTHandler::getCaIds(bool pair)
 {
        ePyObject ret;
 
@@ -157,20 +173,37 @@ PyObject *eDVBServicePMTHandler::getCaIds()
 
        if ( !getProgramInfo(prog) )
        {
-               int cnt=prog.caids.size();
-               if (cnt)
+               if (pair)
                {
+                       int cnt=prog.caids.size();
+                       if (cnt)
+                       {
+                               ret=PyList_New(cnt);
+                               std::list<program::capid_pair>::iterator it(prog.caids.begin());
+                               while(cnt--)
+                               {
+                                       ePyObject tuple = PyTuple_New(2);
+                                       PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(it->caid));
+                                       PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong((it++)->capid));
+                                       PyList_SET_ITEM(ret, cnt, tuple);
+                               }
+                       }
+               }
+               else
+               {
+                       std::set<program::capid_pair> set(prog.caids.begin(), prog.caids.end());
+                       std::set<program::capid_pair>::iterator it(set.begin());
+                       int cnt=set.size();
                        ret=PyList_New(cnt);
-                       std::set<uint16_t>::iterator it(prog.caids.begin());
                        while(cnt--)
-                               PyList_SET_ITEM(ret, cnt, PyInt_FromLong(*it++));
+                               PyList_SET_ITEM(ret, cnt, PyInt_FromLong((it++)->caid));
                }
        }
 
        return ret ? (PyObject*)ret : (PyObject*)PyList_New(0);
 }
 
-int eDVBServicePMTHandler::getProgramInfo(struct program &program)
+int eDVBServicePMTHandler::getProgramInfo(program &program)
 {
        ePtr<eTable<ProgramMapSection> > ptr;
        int cached_apid_ac3 = -1;
@@ -213,8 +246,29 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
                        for (i = ptr->getSections().begin(); i != ptr->getSections().end(); ++i)
                        {
                                const ProgramMapSection &pmt = **i;
+                               int is_hdmv = 0;
+
                                program.pcrPid = pmt.getPcrPid();
 
+                               for (DescriptorConstIterator desc = pmt.getDescriptors()->begin();
+                                       desc != pmt.getDescriptors()->end(); ++desc)
+                               {
+                                       if ((*desc)->getTag() == CA_DESCRIPTOR)
+                                       {
+                                               CaDescriptor *descr = (CaDescriptor*)(*desc);
+                                               program::capid_pair pair;
+                                               pair.caid = descr->getCaSystemId();
+                                               pair.capid = descr->getCaPid();
+                                               program.caids.push_back(pair);
+                                       }
+                                       else if ((*desc)->getTag() == REGISTRATION_DESCRIPTOR)
+                                       {
+                                               RegistrationDescriptor *d = (RegistrationDescriptor*)(*desc);
+                                               if (d->getFormatIdentifier() == 0x48444d56) // HDMV
+                                                       is_hdmv = 1;
+                                       }
+                               }
+
                                ElementaryStreamInfoConstIterator es;
                                for (es = pmt.getEsInfo()->begin(); es != pmt.getEsInfo()->end(); ++es)
                                {
@@ -270,25 +324,34 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
                                                        audio.type = audioStream::atAACHE;
                                                        forced_audio = 1;
                                                }
-                                       case 0x80: // user private ... but blueray LPCM
-                                               if (!isvideo && !isaudio)
+                                       case 0x80: // user private ... but bluray LPCM
+                                       case 0xA0: // bluray secondary LPCM
+                                               if (!isvideo && !isaudio && is_hdmv)
                                                {
                                                        isaudio = 1;
                                                        audio.type = audioStream::atLPCM;
                                                }
-                                       case 0x81: // user private ... but blueray AC3
-                                               if (!isvideo && !isaudio)
+                                       case 0x81: // user private ... but bluray AC3
+                                       case 0xA1: // bluray secondary AC3
+                                               if (!isvideo && !isaudio && is_hdmv)
                                                {
                                                        isaudio = 1;
                                                        audio.type = audioStream::atAC3;
                                                }
-                                       case 0x82: // Blueray DTS (dvb user private...)
-                                       case 0xA2: // Blueray secondary DTS
-                                               if (!isvideo && !isaudio)
+                                       case 0x82: // bluray DTS (dvb user private...)
+                                       case 0xA2: // bluray secondary DTS
+                                               if (!isvideo && !isaudio && is_hdmv)
                                                {
                                                        isaudio = 1;
                                                        audio.type = audioStream::atDTS;
                                                }
+                                       case 0x86: // bluray DTS-HD (dvb user private...)
+                                       case 0xA6: // bluray secondary DTS-HD
+                                               if (!isvideo && !isaudio && is_hdmv)
+                                               {
+                                                       isaudio = 1;
+                                                       audio.type = audioStream::atDTSHD;
+                                               }
                                        case 0x06: // PES Private
                                        case 0xEA: // TS_PSI_ST_SMPTE_VC1
                                        {
@@ -460,7 +523,10 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
                                                        case CA_DESCRIPTOR:
                                                        {
                                                                CaDescriptor *descr = (CaDescriptor*)(*desc);
-                                                               program.caids.insert(descr->getCaSystemId());
+                                                               program::capid_pair pair;
+                                                               pair.caid = descr->getCaSystemId();
+                                                               pair.capid = descr->getCaPid();
+                                                               program.caids.push_back(pair);
                                                                break;
                                                        }
                                                        default:
@@ -477,9 +543,9 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
                                        default:
                                                break;
                                        }
-                                       if (isteletext && (isaudio || isvideo)) 
+                                       if (isteletext && (isaudio || isvideo))
                                        {
-                                               eDebug("ambiguous streamtype for PID %04x detected.. forced as teletext!", (*es)->getPid());                                    
+                                               eDebug("ambiguous streamtype for PID %04x detected.. forced as teletext!", (*es)->getPid());
                                                continue; // continue with next PID
                                        }
                                        else if (issubtitle && (isaudio || isvideo))
@@ -517,15 +583,6 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
                                        else
                                                continue;
                                }
-                               for (DescriptorConstIterator desc = pmt.getDescriptors()->begin();
-                                       desc != pmt.getDescriptors()->end(); ++desc)
-                               {
-                                       if ((*desc)->getTag() == CA_DESCRIPTOR)
-                                       {
-                                               CaDescriptor *descr = (CaDescriptor*)(*desc);
-                                               program.caids.insert(descr->getCaSystemId());
-                                       }
-                               }
                        }
                        ret = 0;
 
@@ -589,8 +646,12 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
                        program.textPid = cached_tpid;
                }
                CAID_LIST &caids = m_service->m_ca;
-               for (CAID_LIST::iterator it(caids.begin()); it != caids.end(); ++it)
-                       program.caids.insert(*it);
+               for (CAID_LIST::iterator it(caids.begin()); it != caids.end(); ++it) {
+                       program::capid_pair pair;
+                       pair.caid = *it;
+                       pair.capid = -1; // not known yet
+                       program.caids.push_back(pair);
+               }
                if ( cnt )
                        ret = 0;
        }
@@ -708,13 +769,12 @@ int eDVBServicePMTHandler::tuneExt(eServiceReferenceDVB &ref, int use_decode_dem
        {
                if (!ref.getServiceID().get() /* incorrect sid in meta file or recordings.epl*/ )
                {
-                       eWarning("no .meta file found, trying to find PMT pid");
                        eDVBTSTools tstools;
+                       bool b = source || !tstools.openFile(ref.path.c_str(), 1);
+                       eWarning("no .meta file found, trying to find PMT pid");
                        if (source)
-                               tstools.setSource(source, streaminfo_file ? streaminfo_file : ref.path.c_str());
-                       else if (tstools.openFile(ref.path.c_str()))
-                               eWarning("failed to open file");
-                       else
+                               tstools.setSource(source, NULL);
+                       if (b)
                        {
                                int service_id, pmt_pid;
                                if (!tstools.findPMT(pmt_pid, service_id))
@@ -724,6 +784,8 @@ int eDVBServicePMTHandler::tuneExt(eServiceReferenceDVB &ref, int use_decode_dem
                                        m_pmt_pid = pmt_pid;
                                }
                        }
+                       else
+                               eWarning("no valid source to find PMT pid!");
                }
                eDebug("alloc PVR");
                        /* allocate PVR */
index de0de05..aa5d34d 100644 (file)
@@ -144,7 +144,7 @@ public:
        {
                int pid,
                    rdsPid; // hack for some radio services which transmit radiotext on different pid (i.e. harmony fm, HIT RADIO FFH, ...)
-               enum { atMPEG, atAC3, atDTS, atAAC, atAACHE, atLPCM };
+               enum { atMPEG, atAC3, atDTS, atAAC, atAACHE, atLPCM, atDTSHD };
                int type; // mpeg2, ac3, dts, ...
                
                int component_tag;
@@ -181,11 +181,17 @@ public:
 
        struct program
        {
+               struct capid_pair
+               {
+                       uint16_t caid;
+                       int capid;
+                       bool operator< (const struct capid_pair &t) { return t.caid < caid; }
+               };
                std::vector<videoStream> videoStreams;
                std::vector<audioStream> audioStreams;
                int defaultAudioStream;
                std::vector<subtitleStream> subtitleStreams;
-               std::set<uint16_t> caids;
+               std::list<capid_pair> caids;
                int pcrPid;
                int pmtPid;
                int textPid;
@@ -193,10 +199,10 @@ public:
                PyObject *createPythonObject();
        };
 
-       int getProgramInfo(struct program &program);
+       int getProgramInfo(program &program);
        int getDataDemux(ePtr<iDVBDemux> &demux);
        int getDecodeDemux(ePtr<iDVBDemux> &demux);
-       PyObject *getCaIds();
+       PyObject *getCaIds(bool pair=false); // caid / ecmpid pair
        
        int getPVRChannel(ePtr<iDVBPVRChannel> &pvr_channel);
        int getServiceReference(eServiceReferenceDVB &service) { service = m_reference; return 0; }
index 5cdecbd..e19dd1e 100644 (file)
@@ -123,7 +123,7 @@ void eMPEGStreamInformation::fixupDiscontinuties()
                pts_t current = i->second - currentDelta;
                pts_t diff = current - lastpts_t;
                
-               if (llabs(diff) > (90000*5)) // 5sec diff
+               if (llabs(diff) > (90000*10)) // 10sec diff
                {
 //                     eDebug("%llx < %llx, have discont. new timestamp is %llx (diff is %llx)!", current, lastpts_t, i->second, diff);
                        currentDelta = i->second - lastpts_t; /* FIXME: should be the extrapolated new timestamp, based on the current rate */
index 1403059..6cd855c 100644 (file)
@@ -212,6 +212,8 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed)
                                                        break;
                                                case 0x71: // AC3 / DTS
                                                        break;
+                                               case 0x72: // DTS - HD
+                                                       break;
                                                default:
                                                        eDebug("skip unknwn stream_id_extension %02x\n", payload[9+offs]);
                                                        continue;
@@ -700,9 +702,26 @@ int eDVBTSTools::findFrame(off_t &_offset, size_t &len, int &direction, int fram
                else if (direction == +1)
                        direction = 0;
        }
-                       /* let's find the next frame after the given offset */
        off_t start = offset;
 
+#if 0
+                       /* backtrack to find the previous sequence start, in case of MPEG2 */
+       if ((data & 0xFF) == 0x00) {
+               do {
+                       --start;
+                       if (m_streaminfo.getStructureEntry(start, data, 0))
+                       {
+                               eDebug("get previous failed");
+                               return -1;
+                       }
+               } while (((data & 0xFF) != 9) && ((data & 0xFF) != 0x00) && ((data & 0xFF) != 0xB3)); /* sequence start or previous frame */
+               if ((data & 0xFF) != 0xB3)
+                       start = offset;  /* Failed to find corresponding sequence start, so never mind */
+       }
+
+#endif
+
+                       /* let's find the next frame after the given offset */
        do {
                if (m_streaminfo.getStructureEntry(offset, data, 1))
                {
@@ -717,9 +736,11 @@ int eDVBTSTools::findFrame(off_t &_offset, size_t &len, int &direction, int fram
 //             eDebug("%08llx@%llx (next)", data, offset);
        } while (((data & 0xFF) != 9) && ((data & 0xFF) != 0x00)); /* next frame */
 
+#if 0
                        /* align to TS pkt start */
-//     start = start - (start % 188);
-//     offset = offset - (offset % 188);
+       start = start - (start % 188);
+       offset = offset - (offset % 188);
+#endif
 
        len = offset - start;
        _offset = start;
index 883fb5a..8a43e5b 100644 (file)
@@ -297,8 +297,9 @@ void eDVBCIInterfaces::recheckPMTHandlers()
                if (!pmthandler->getProgramInfo(p))
                {
                        int cnt=0;
-                       for (caidSet::reverse_iterator x(p.caids.rbegin()); x != p.caids.rend(); ++x, ++cnt)
-                               caids.push_front(*x);
+                       std::set<eDVBServicePMTHandler::program::capid_pair> set(p.caids.begin(), p.caids.end());
+                       for (std::set<eDVBServicePMTHandler::program::capid_pair>::reverse_iterator x(set.rbegin()); x != set.rend(); ++x, ++cnt)
+                               caids.push_front(x->caid);
                        if (service && cnt)
                                service->m_ca = caids;
                }
index a19e11a..ba0794e 100644 (file)
@@ -641,7 +641,8 @@ static ePyObject lookupColor(ePyObject color, ePyObject data)
        if ((icolor & 0xFF000000) == 0xFF000000)
        {
                int index = icolor & 0xFFFFFF;
-               eDebug("[eListboxPythonMultiContent] template color index: %d", index);
+               if (PyTuple_GetItem(data, index) == Py_None)
+                       return ePyObject();
                return PyTuple_GetItem(data, index);
        }
 
index ff98c08..e45d4a6 100644 (file)
@@ -112,6 +112,7 @@ int ePositionGauge::event(int event, void *data, void *data2)
 //             painter.fill(eRect(0, 10, s.width(), s.height()-20));
                
                pts_t in = 0, out = 0;
+               int xm, xm_last = -1;
                
                std::multiset<cueEntry>::iterator i(m_cue_entries.begin());
                
@@ -126,17 +127,22 @@ int ePositionGauge::event(int event, void *data, void *data2)
                                        continue;
                                } else if (i->what == 1) /* out */
                                        out = i++->where;
-                               else if (i->what == 2) /* mark */
+                               else /* mark or last */
                                {
-                                       int xm = scale(i->where);
-                                       painter.setForegroundColor(gRGB(0xFF8080));
-                                       painter.fill(eRect(xm - 2, 0, 4, s.height()));
+                                       xm = scale(i->where);
+                                       if (i->what == 2) {
+                                               painter.setForegroundColor(gRGB(0xFF8080));
+                                               if (xm - 2 < xm_last) /* Make sure last is not overdrawn */
+                                                       painter.fill(eRect(xm_last, 0, 2 + xm - xm_last, s.height()));
+                                               else
+                                                       painter.fill(eRect(xm - 2, 0, 4, s.height()));
+                                       } else if (i->what == 3) {
+                                               painter.setForegroundColor(gRGB(0x80FF80));
+                                               painter.fill(eRect(xm - 1, 0, 3, s.height()));
+                                               xm_last = xm + 2;
+                                       }
                                        i++;
                                        continue;
-                               } else /* other marker, like last position */
-                               {
-                                       ++i;
-                                       continue;
                                }
                        }
                        
index 45345db..cdad728 100644 (file)
@@ -23,15 +23,21 @@ struct ePangoSubtitlePageElement
 
 struct ePangoSubtitlePage
 {
-       pts_t show_pts;
+       pts_t m_show_pts;
        int m_timeout; /* in milliseconds */
        std::vector<ePangoSubtitlePageElement> m_elements;
        void clear() { m_elements.clear(); }
 };
 
+struct eVobSubtitlePage
+{
+       pts_t m_show_pts;
+       int m_timeout; /* in milliseconds */
+       ePtr<gPixmap> m_pixmap;
+};
+
 class eDVBTeletextSubtitlePage;
-class eDVBPangoSubtitlePage;
-class ePangoSubtitlePage;
+class eDVBSubtitlePage;
 
 class eSubtitleWidget: public eWidget, public Object
 {
index 1d71514..1b7e81f 100755 (executable)
@@ -28,7 +28,8 @@ EXTENSIONS = {
                "mpeg": "movie",
                "mkv": "movie",
                "mp4": "movie",
-               "mov": "movie"
+               "mov": "movie",
+               "m2ts": "movie",
        }
 
 def FileEntryComponent(name, absolute = None, isDir = False):
index 8ea9aa6..a265a16 100644 (file)
@@ -102,13 +102,11 @@ def InitUsageConfig():
        config.seek.selfdefined_79 = ConfigNumber(default=300)
 
        config.seek.speeds_forward = ConfigSet(default=[2, 4, 8, 16, 32, 64, 128], choices=[2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128])
-       config.seek.speeds_backward = ConfigSet(default=[8, 16, 32, 64, 128], choices=[1, 2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128])
+       config.seek.speeds_backward = ConfigSet(default=[2, 4, 8, 16, 32, 64, 128], choices=[1, 2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128])
        config.seek.speeds_slowmotion = ConfigSet(default=[2, 4, 8], choices=[2, 4, 6, 8, 12, 16, 25])
 
        config.seek.enter_forward = ConfigSelection(default = "2", choices = ["2", "4", "6", "8", "12", "16", "24", "32", "48", "64", "96", "128"])
        config.seek.enter_backward = ConfigSelection(default = "1", choices = ["1", "2", "4", "6", "8", "12", "16", "24", "32", "48", "64", "96", "128"])
-       config.seek.stepwise_minspeed = ConfigSelection(default = "16", choices = ["Never", "2", "4", "6", "8", "12", "16", "24", "32", "48", "64", "96", "128"])
-       config.seek.stepwise_repeat = ConfigSelection(default = "3", choices = ["2", "3", "4", "5", "6"])
 
        config.seek.on_pause = ConfigSelection(default = "play", choices = [
                ("play", _("Play")),
index 7f755db..6dbcd49 100644 (file)
@@ -2,6 +2,7 @@ from Tools.Directories import fileExists
 from Components.config import config, ConfigSubsection, ConfigInteger, ConfigText, ConfigSelection, getConfigListEntry, ConfigSequence, ConfigSubList
 import DVDTitle
 import xml.dom.minidom
+from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_FONTS
 
 class ConfigColor(ConfigSequence):
        def __init__(self, default = [128,128,128]):
@@ -125,6 +126,14 @@ class DVDProject:
                        for key in self.filekeys:
                                val = self.settings.dict()[key].getValue()
                                if not fileExists(val):
+                                       if val[0] != "/":
+                                               if key.find("font") == 0:
+                                                       val = resolveFilename(SCOPE_FONTS)+val
+                                               else:
+                                                       val = resolveFilename(SCOPE_PLUGINS)+"Extensions/DVDBurn/"+val
+                                               if fileExists(val):
+                                                       self.settings.dict()[key].setValue(val)
+                                                       continue
                                        self.error += "\n%s '%s' not found" % (key, val)
                #except AttributeError:
                        #print "loadProject AttributeError", self.error
index 451e8a8..4645260 100644 (file)
@@ -3,11 +3,11 @@
        <settings
                name="Dreambox DVD record"
                authormode="menu_linked"
-               menutemplate="/usr/lib/enigma2/python/Plugins/Extensions/DVDBurn/Thumbs_menu_clouds.ddvdm.xml"
+               menutemplate="Thumbs_menu_clouds.ddvdm.xml"
                titlesetmode="multi"
-               vmgm="/usr/lib/enigma2/python/Plugins/Extensions/DVDBurn/vmgmdream.mpg"
+               vmgm="vmgmdream.mpg"
                output="dvd"
-               isopath="/media/hdd/movie/"
+               isopath="/hdd/movie/"
                dataformat="iso9660_4"
        />
        <titles> </titles>
index 0de7f4b..bf6356a 100644 (file)
@@ -3,17 +3,17 @@
        <settings
                titleformat="$i. $t"
                subtitleformat="$D.$M.$Y, $T $C, $d"
-               menubg="/usr/lib/enigma2/python/Plugins/Extensions/DVDBurn/dreamdvd_boat.jpg"
-               menuaudio="/usr/lib/enigma2/python/Plugins/Extensions/DVDBurn/silence.mp2"
+               menubg="dreamdvd_boat.jpg"
+               menuaudio="silence.mp2"
                dimensions="(720, 576)"
                rows="5"
                cols="1"
                color_button="[8, 0, 0]"
                color_highlight="[0, 192, 192]"
                color_headline="[0, 0, 128]"
-               fontface_headline="/usr/share/fonts/nmsbd.ttf"
-               fontface_title="/usr/share/fonts/nmsbd.ttf"
-               fontface_subtitle="/usr/share/fonts/nmsbd.ttf"
+               fontface_headline="nmsbd.ttf"
+               fontface_title="nmsbd.ttf"
+               fontface_subtitle="nmsbd.ttf"
                fontsize_headline="46"
                fontsize_title="24"
                fontsize_subtitle="14"
index c00c3fe..074f203 100644 (file)
@@ -3,17 +3,17 @@
        <settings
                titleformat="$t"
                subtitleformat="$d"
-               menubg="/usr/lib/enigma2/python/Plugins/Extensions/DVDBurn/dreamdvd_clouds.jpg"
-               menuaudio="/usr/lib/enigma2/python/Plugins/Extensions/DVDBurn/silence.mp2"
+               menubg="dreamdvd_clouds.jpg"
+               menuaudio="silence.mp2"
                dimensions="(720, 576)"
                rows="2"
                cols="2"
                color_button="[8, 0, 0]"
                color_highlight="[128, 0, 0]"
                color_headline="[128, 0, 0]"
-               fontface_headline="/usr/share/fonts/nmsbd.ttf"
-               fontface_title="/usr/share/fonts/nmsbd.ttf"
-               fontface_subtitle="/usr/share/fonts/nmsbd.ttf"
+               fontface_headline="nmsbd.ttf"
+               fontface_title="nmsbd.ttf"
+               fontface_subtitle="nmsbd.ttf"
                fontsize_headline="46"
                fontsize_title="18"
                fontsize_subtitle="12"
index 64b4ae5..7f330eb 100755 (executable)
@@ -39,8 +39,11 @@ class FileBrowser(Screen):
                                currDir = "/media/dvd/"
                        if not pathExists(currDir):
                                currDir = "/"
+                       if lastpath == "":  # 'None' is magic to start at the list of mountpoints
+                               currDir = None
 
-                       self.filelist = FileList(currDir, matchingPattern = "(?i)^.*\.(iso)", useServiceRef = True)
+                       inhibitDirs = ["/bin", "/boot", "/dev", "/etc", "/home", "/lib", "/proc", "/sbin", "/share", "/sys", "/tmp", "/usr", "/var"]
+                       self.filelist = FileList(currDir, matchingPattern = "(?i)^.*\.(iso|img)", useServiceRef = True)
                        self["filelist"] = self.filelist
 
                self["FilelistActions"] = ActionMap(["SetupActions"],
@@ -79,6 +82,12 @@ class FileBrowser(Screen):
                                        lastpath = (pathname.rstrip("/").rsplit("/",1))[0]
                                        print "lastpath video_ts.ifo=", lastpath
                                        self.close(pathname)
+                               if fileExists(pathname+"VIDEO_TS/VIDEO_TS.IFO"):
+                                       print "dvd structure found, trying to open..."
+                                       lastpath = (pathname.rstrip("/").rsplit("/",1))[0]
+                                       print "lastpath video_ts.ifo=", lastpath
+                                       pathname += "VIDEO_TS"
+                                       self.close(pathname)
                        else:
                                lastpath = filename[0:filename.rfind("/")]
                                print "lastpath directory=", lastpath
@@ -235,8 +244,6 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP
                self.saved_config_speeds_backward = config.seek.speeds_backward.value
                self.saved_config_enter_forward = config.seek.enter_forward.value
                self.saved_config_enter_backward = config.seek.enter_backward.value
-               self.saved_config_seek_stepwise_minspeed = config.seek.stepwise_minspeed.value
-               self.saved_config_seek_stepwise_repeat = config.seek.stepwise_repeat.value
                self.saved_config_seek_on_pause = config.seek.on_pause.value
                self.saved_config_seek_speeds_slowmotion = config.seek.speeds_slowmotion.value
 
@@ -246,8 +253,6 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP
                config.seek.speeds_slowmotion.value = [ ]
                config.seek.enter_forward.value = "2"
                config.seek.enter_backward.value = "2"
-               config.seek.stepwise_minspeed.value = "Never"
-               config.seek.stepwise_repeat.value = "3"
                config.seek.on_pause.value = "play"
 
        def restore_infobar_seek_config(self):
@@ -256,8 +261,6 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP
                config.seek.speeds_slowmotion.value = self.saved_config_seek_speeds_slowmotion
                config.seek.enter_forward.value = self.saved_config_enter_forward
                config.seek.enter_backward.value = self.saved_config_enter_backward
-               config.seek.stepwise_minspeed.value = self.saved_config_seek_stepwise_minspeed
-               config.seek.stepwise_repeat.value = self.saved_config_seek_stepwise_repeat
                config.seek.on_pause.value = self.saved_config_seek_on_pause
 
        def __init__(self, session, dvd_device = None, dvd_filelist = [ ], args = None):
@@ -269,7 +272,7 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP
                HelpableScreen.__init__(self)
                self.save_infobar_seek_config()
                self.change_infobar_seek_config()
-               InfoBarSeek.__init__(self, useSeekBackHack=False)
+               InfoBarSeek.__init__(self)
                InfoBarPVRState.__init__(self)
                self.dvdScreen = self.session.instantiateDialog(DVDOverlay)
 
@@ -625,6 +628,14 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP
                        newref = eServiceReference(4369, 0, val)
                        print "play", newref.toString()
                        if curref is None or curref != newref:
+                               if newref.toString().endswith("/VIDEO_TS") or newref.toString().endswith("/"):
+                                       names = newref.toString().rsplit("/",3)
+                                       if names[2].startswith("Disk ") or names[2].startswith("DVD "):
+                                               name = str(names[1]) + " - " + str(names[2])
+                                       else:
+                                               name = names[2]
+                                       print "setting name to: ", self.service
+                                       newref.setName(str(name))
                                self.session.nav.playService(newref)
                                self.service = self.session.nav.getCurrentService()
                                print "self.service", self.service
index 7aaec9b..3e2ee67 100644 (file)
@@ -4,6 +4,8 @@ AM_CPPFLAGS = \
        -include Python.h \
        -include $(top_builddir)/enigma2_config.h
 
+AM_CXXFLAGS = @LIBDDVD_CFLAGS@
+
 plugindir = $(pkglibdir)/python/Plugins/Extensions/DVDPlayer
 
 plugin_LTLIBRARIES = servicedvd.la
@@ -13,3 +15,4 @@ servicedvd_la_SOURCES = \
        servicedvd.h
 
 servicedvd_la_LDFLAGS = -avoid-version -module
+servicedvd_la_LIBADD = @LIBDDVD_LIBS@
index 2ba5392..5fbfb0a 100644 (file)
@@ -32,6 +32,7 @@ eServiceFactoryDVD::eServiceFactoryDVD()
        {
                std::list<std::string> extensions;
                extensions.push_back("iso");
+               extensions.push_back("img");
                sc->addServiceFactory(eServiceFactoryDVD::id, this, extensions);
        }
 }
@@ -480,7 +481,10 @@ RESULT eServiceDVD::getName(std::string &name)
        if ( m_ddvd_titlestring[0] != '\0' )
                name = m_ddvd_titlestring;
        else
-               name = m_ref.path;
+               if ( !m_ref.name.empty() )
+                       name = m_ref.name;
+               else
+                       name = m_ref.path;
        return 0;
 }
 
index 9ae886f..d61dbc7 100755 (executable)
@@ -110,7 +110,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB
 
                # 'None' is magic to start at the list of mountpoints
                defaultDir = config.mediaplayer.defaultDir.getValue()
-               self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|m4v|mkv|mp4|m4a|dat|flac|mov)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls")
+               self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|m4v|mkv|mp4|m4a|dat|flac|mov|m2ts)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls")
                self["filelist"] = self.filelist
 
                self.playlist = MyPlayList()
index 296d3bc..85ecc92 100644 (file)
@@ -16,7 +16,7 @@ from Components.MultiContent import MultiContentEntryText
 from Components.ScrollLabel import ScrollLabel
 from Components.Harddisk import harddiskmanager
 from Components.Task import Task, Job, job_manager, Condition
-from Tools.Directories import fileExists, isMount
+from Tools.Directories import fileExists, isMount, resolveFilename, SCOPE_HDD, SCOPE_MEDIA
 from Tools.HardwareInfo import HardwareInfo
 from Tools.Downloader import downloadWithProgress
 from enigma import eConsoleAppContainer, gFont, RT_HALIGN_LEFT, RT_HALIGN_CENTER, RT_VALIGN_CENTER, RT_WRAP, eTimer
@@ -391,7 +391,7 @@ class NFIDownload(Screen):
                
                self.box = HardwareInfo().get_device_name()
                self.feed_base = "http://www.dreamboxupdate.com/opendreambox" #/1.5/%s/images/" % self.box      
-               self.usbmountpoint = "/mnt/usb/"
+               self.usbmountpoint = resolveFilename(SCOPE_MEDIA)+"usb/"
 
                self.menulist = []
 
@@ -570,7 +570,7 @@ class NFIDownload(Screen):
 
        def ackedDestination(self):
                print "[ackedDestination]", self.branch, self.target_dir
-               self.container.setCWD("/mnt")
+               self.container.setCWD(resolveFilename(SCOPE_MEDIA)+"usb/")
                if self.target_dir[:8] == "/autofs/":
                        self.target_dir = "/dev/" + self.target_dir[8:-1]
 
@@ -792,13 +792,14 @@ If you already have a prepared bootable USB stick, please insert it now. Otherwi
                self.umountCallback()
 
 def main(session, **kwargs):
-       session.open(NFIDownload,"/home/root")
+       session.open(NFIDownload,resolveFilename(SCOPE_HDD))
 
 def filescan_open(list, session, **kwargs):
        dev = "/dev/" + (list[0].path).rsplit('/',1)[0][7:]
-       print "mounting device " + dev + " to /mnt/usb..."
-       system("mount "+dev+" /mnt/usb/ -o rw,sync")
-       session.open(NFIDownload,"/mnt/usb/")
+       print "mounting device " + dev + " to /media/usb..."
+       usbmountpoint = resolveFilename(SCOPE_MEDIA)+"usb/"
+       system("mount %s %s -o rw,sync" % (dev, usbmountpoint))
+       session.open(NFIDownload,usbmountpoint)
 
 def filescan(**kwargs):
        from Components.Scanner import Scanner, ScanPath
index 904fbb3..896d9f2 100755 (executable)
@@ -1338,9 +1338,9 @@ class UpdatePlugin(Screen):
                self["slider"] = self.slider
                self.activityslider = Slider(0, 100)
                self["activityslider"] = self.activityslider
-               self.status = StaticText(_("Upgrading Dreambox... Please wait"))
+               self.status = StaticText(_("Please wait..."))
                self["status"] = self.status
-               self.package = StaticText()
+               self.package = StaticText(_("Verifying your internet connection..."))
                self["package"] = self.package
                self.oktext = _("Press OK on your remote control to continue.")
 
@@ -1351,20 +1351,35 @@ class UpdatePlugin(Screen):
                self.activity = 0
                self.activityTimer = eTimer()
                self.activityTimer.callback.append(self.doActivityTimer)
-               self.activityTimer.start(100, False)
 
                self.ipkg = IpkgComponent()
                self.ipkg.addCallback(self.ipkgCallback)
 
-               self.updating = True
-               self.package.setText(_("Package list update"))
-               self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
+               self.updating = False
 
                self["actions"] = ActionMap(["WizardActions"], 
                {
                        "ok": self.exit,
                        "back": self.exit
                }, -1)
+               
+               iNetwork.checkNetworkState(self.checkNetworkCB)
+               self.onClose.append(self.cleanup)
+               
+       def cleanup(self):
+               iNetwork.stopPingConsole()
+
+       def checkNetworkCB(self,data):
+               if data is not None:
+                       if data <= 2:
+                               self.updating = True
+                               self.activityTimer.start(100, False)
+                               self.package.setText(_("Package list update"))
+                               self.status.setText(_("Upgrading Dreambox... Please wait"))
+                               self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
+                       else:
+                               self.package.setText(_("Your network is not working. Please try again."))
+                               self.status.setText(self.oktext)
 
        def doActivityTimer(self):
                self.activity += 1
@@ -1443,6 +1458,9 @@ class UpdatePlugin(Screen):
                                self.session.openWithCallback(self.exitAnswer, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your Dreambox?"))
                        else:
                                self.close()
+               else:
+                       if not self.updating:
+                               self.close()
 
        def exitAnswer(self, result):
                if result is not None and result:
index a0bfcab..068da87 100644 (file)
@@ -46,7 +46,7 @@ class AudioSelection(Screen, ConfigListScreen):
                        "cancel": self.cancel,
                        "up": self.keyUp,
                        "down": self.keyDown,
-               }, -3)
+               }, -2)
 
                self.settings = ConfigSubsection()
                choicelist = [(PAGE_AUDIO,_("audio tracks")), (PAGE_SUBTITLES,_("Subtitles"))]
@@ -62,13 +62,12 @@ class AudioSelection(Screen, ConfigListScreen):
                streams = []
                conflist = []
                selectedidx = 0
-               
-               service = self.session.nav.getCurrentService()
-               self.audioTracks = audio = service and service.audioTracks()
-               n = audio and audio.getNumberOfTracks() or 0
-               
+
                if self.settings.menupage.getValue() == PAGE_AUDIO:
                        self.setTitle(_("Select audio track"))
+                       service = self.session.nav.getCurrentService()
+                       self.audioTracks = audio = service and service.audioTracks()
+                       n = audio and audio.getNumberOfTracks() or 0
                        if SystemInfo["CanDownmixAC3"]:
                                self.settings.downmix = ConfigOnOff(default=config.av.downmix_ac3.value)
                                self.settings.downmix.addNotifier(self.changeAC3Downmix, initial_call = False)
@@ -156,7 +155,7 @@ class AudioSelection(Screen, ConfigListScreen):
                                                number = "%x%02x" % (x[3],x[2])
 
                                        elif x[0] == 2:
-                                               types = ("UTF-8 text","SSA / AAS",".SRT file")
+                                               types = (_("<unknown>"), "UTF-8 text", "SSA", "AAS", ".SRT file", "VOB", "PGS (unsupported)")
                                                description = types[x[2]]
 
                                        streams.append((x, "", number, description, language, selected))
@@ -185,7 +184,7 @@ class AudioSelection(Screen, ConfigListScreen):
                                conflist.append(getConfigListEntry(Plugins[0][0], ConfigNothing()))
                                self.plugincallfunc = Plugins[0][1]
                        if len(Plugins) > 1:
-                               print "these plugins are installed but not displayed in the dialog box:", Plugins[1:]
+                               print "plugin(s) installed but not displayed in the dialog box:", Plugins[1:]
 
                self["config"].list = conflist
                self["config"].l.setList(conflist)
index 6fa8911..4f6eafc 100644 (file)
@@ -717,7 +717,7 @@ class InfoBarSeek:
        SEEK_STATE_PAUSE = (1, 0, 0, "||")
        SEEK_STATE_EOF = (1, 0, 0, "END")
 
-       def __init__(self, actionmap = "InfobarSeekActions", useSeekBackHack=True):
+       def __init__(self, actionmap = "InfobarSeekActions"):
                self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
                        {
                                iPlayableService.evSeekableStatusChanged: self.__seekableStatusChanged,
@@ -774,20 +774,10 @@ class InfoBarSeek:
                self.__seekableStatusChanged()
 
        def makeStateForward(self, n):
-#              minspeed = config.seek.stepwise_minspeed.value
-#              repeat = int(config.seek.stepwise_repeat.value)
-#              if minspeed != "Never" and n >= int(minspeed) and repeat > 1:
-#                      return (0, n * repeat, repeat, ">> %dx" % n)
-#              else:
-                       return (0, n, 0, ">> %dx" % n)
+               return (0, n, 0, ">> %dx" % n)
 
        def makeStateBackward(self, n):
-#              minspeed = config.seek.stepwise_minspeed.value
-#              repeat = int(config.seek.stepwise_repeat.value)
-#              if minspeed != "Never" and n >= int(minspeed) and repeat > 1:
-#                      return (0, -n * repeat, repeat, "<< %dx" % n)
-#              else:
-                       return (0, -n, 0, "<< %dx" % n)
+               return (0, -n, 0, "<< %dx" % n)
 
        def makeStateSlowMotion(self, n):
                return (0, 0, n, "/%d" % n)
@@ -1970,20 +1960,21 @@ class InfoBarCueSheetSupport:
                return True
 
        def jumpPreviousMark(self):
-               # we add 2 seconds, so if the play position is <2s after
+               # we add 5 seconds, so if the play position is <5s after
                # the mark, the mark before will be used
                self.jumpPreviousNextMark(lambda x: -x-5*90000, start=True)
 
        def jumpNextMark(self):
-               if not self.jumpPreviousNextMark(lambda x: x):
+               if not self.jumpPreviousNextMark(lambda x: x-90000):
                        self.doSeek(-1)
 
        def getNearestCutPoint(self, pts, cmp=abs, start=False):
                # can be optimized
-               beforecut = False
+               beforecut = True
                nearest = None
+               bestdiff = -1
+               instate = True
                if start:
-                       beforecut = True
                        bestdiff = cmp(0 - pts)
                        if bestdiff >= 0:
                                nearest = [0, False]
@@ -1992,14 +1983,19 @@ class InfoBarCueSheetSupport:
                                beforecut = False
                                if cp[1] == self.CUT_TYPE_IN:  # Start is here, disregard previous marks
                                        diff = cmp(cp[0] - pts)
-                                       if diff >= 0:
+                                       if start and diff >= 0:
                                                nearest = cp
                                                bestdiff = diff
                                        else:
                                                nearest = None
-                       if cp[1] in (self.CUT_TYPE_MARK, self.CUT_TYPE_LAST):
+                                               bestdiff = -1
+                       if cp[1] == self.CUT_TYPE_IN:
+                               instate = True
+                       elif cp[1] == self.CUT_TYPE_OUT:
+                               instate = False
+                       elif cp[1] in (self.CUT_TYPE_MARK, self.CUT_TYPE_LAST):
                                diff = cmp(cp[0] - pts)
-                               if diff >= 0 and (nearest is None or bestdiff > diff):
+                               if instate and diff >= 0 and (nearest is None or bestdiff > diff):
                                        nearest = cp
                                        bestdiff = diff
                return nearest
index da090b1..63a58ea 100644 (file)
@@ -31,19 +31,19 @@ class NumericalTextInput:
                        return
 
                if self.lang == 'de_DE':
-                       self.mapping.append (u".,?'+\"0-()@/:_$!=") # 0
-                       self.mapping.append (u" 1") # 1
-                       self.mapping.append (u"aäbc2AÄBC") # 2
+                       self.mapping.append (u"0,?!&@=*'+\"()$~") # 0
+                       self.mapping.append (u" 1.:/-_") # 1
+                       self.mapping.append (u"abcä2ABCÄ") # 2
                        self.mapping.append (u"def3DEF") # 3
                        self.mapping.append (u"ghi4GHI") # 4
                        self.mapping.append (u"jkl5JKL") # 5
                        self.mapping.append (u"mnoö6MNOÖ") # 6
                        self.mapping.append (u"pqrsß7PQRSß") # 7
-                       self.mapping.append (u"tuüv8TUÜV") # 8
+                       self.mapping.append (u"tuvü8TUVÜ") # 8
                        self.mapping.append (u"wxyz9WXYZ") # 9
                elif self.lang == 'es_ES':
-                       self.mapping.append (u".,?'+\"0-()@/:_$!=") # 0
-                       self.mapping.append (u" 1") # 1
+                       self.mapping.append (u"0,?!&@=*'+\"()$~") # 0
+                       self.mapping.append (u" 1.:/-_") # 1
                        self.mapping.append (u"abcáà2ABCÁÀ") # 2
                        self.mapping.append (u"deéèf3DEFÉÈ") # 3
                        self.mapping.append (u"ghiíì4GHIÍÌ") # 4
@@ -53,8 +53,8 @@ class NumericalTextInput:
                        self.mapping.append (u"tuvúù8TUVÚÙ") # 8
                        self.mapping.append (u"wxyz9WXYZ") # 9
                if self.lang in ('sv_SE', 'fi_FI'):
-                       self.mapping.append (u".,?'+\"0-()@/:_$!=") # 0
-                       self.mapping.append (u" 1") # 1
+                       self.mapping.append (u"0,?!&@=*'+\"()$~") # 0
+                       self.mapping.append (u" 1.:/-_") # 1
                        self.mapping.append (u"abcåä2ABCÅÄ") # 2
                        self.mapping.append (u"defé3DEFÉ") # 3
                        self.mapping.append (u"ghi4GHI") # 4
@@ -64,8 +64,8 @@ class NumericalTextInput:
                        self.mapping.append (u"tuv8TUV") # 8
                        self.mapping.append (u"wxyz9WXYZ") # 9
                else:
-                       self.mapping.append (u".,?'+\"0-()@/:_$!=") # 0
-                       self.mapping.append (u" 1") # 1
+                       self.mapping.append (u"0,?!&@=*'+\"()$~") # 0
+                       self.mapping.append (u" 1.:/-_") # 1
                        self.mapping.append (u"abc2ABC") # 2
                        self.mapping.append (u"def3DEF") # 3
                        self.mapping.append (u"ghi4GHI") # 4
index edafd1a..9f956b6 100644 (file)
@@ -16,7 +16,8 @@ libenigma_service_a_SOURCES = \
        servicedvb.cpp \
        servicedvbrecord.cpp \
        servicefs.cpp \
-       servicemp3.cpp
+       servicemp3.cpp \
+       servicem2ts.cpp
 
 serviceincludedir = $(pkgincludedir)/lib/service
 serviceinclude_HEADERS = \
@@ -27,7 +28,8 @@ serviceinclude_HEADERS = \
        servicedvb.h \
        servicedvbrecord.h \
        servicefs.h \
-       servicemp3.h
+       servicemp3.h \
+       servicem2ts.h
 
 if HAVE_LIBXINE
 libenigma_service_a_SOURCES += \
index 2ba7cb4..7f58249 100644 (file)
@@ -289,6 +289,7 @@ public:
                sFileSize,
 
                sCAIDs,
+               sCAIDPIDs,
                sVideoType,             /* MPEG2 MPEG4 */
 
                sTags,                          /* space seperated list of tags */
index f1858c9..2889ad3 100644 (file)
@@ -1591,7 +1591,7 @@ int eDVBServicePlay::getInfo(int w)
 {
        eDVBServicePMTHandler::program program;
 
-       if (w == sCAIDs)
+       if (w == sCAIDs || w == sCAIDPIDs)
                return resIsPyObject;
 
        eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
@@ -1732,6 +1732,8 @@ PyObject *eDVBServicePlay::getInfoObject(int w)
        {
        case sCAIDs:
                return m_service_handler.getCaIds();
+       case sCAIDPIDs:
+               return m_service_handler.getCaIds(true);
        case sTransponderData:
                return eStaticServiceDVBInformation().getInfoObject(m_reference, w);
        default:
@@ -1799,6 +1801,8 @@ RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int
                info.m_description = "AAC-HE";
        else  if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atDTS)
                info.m_description = "DTS";
+       else  if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atDTSHD)
+               info.m_description = "DTS-HD";
        else
                info.m_description = "???";
 
diff --git a/lib/service/servicem2ts.cpp b/lib/service/servicem2ts.cpp
new file mode 100644 (file)
index 0000000..e79907d
--- /dev/null
@@ -0,0 +1,380 @@
+#include <lib/base/init_num.h>
+#include <lib/base/init.h>
+#include <lib/dvb/metaparser.h>
+#include <lib/service/servicem2ts.h>
+
+DEFINE_REF(eServiceFactoryM2TS)
+
+class eM2TSFile: public iTsSource
+{
+       DECLARE_REF(eM2TSFile);
+       eSingleLock m_lock;
+public:
+       eM2TSFile(const char *filename, bool cached=false);
+       ~eM2TSFile();
+
+       // iTsSource
+       off_t lseek(off_t offset, int whence);
+       ssize_t read(off_t offset, void *buf, size_t count);
+       off_t length();
+       int valid();
+private:
+       int m_sync_offset;
+       int m_fd;     /* for uncached */
+       FILE *m_file; /* for cached */
+       off_t m_current_offset, m_length;
+       bool m_cached;
+       off_t lseek_internal(off_t offset, int whence);
+};
+
+class eStaticServiceM2TSInformation: public iStaticServiceInformation
+{
+       DECLARE_REF(eStaticServiceM2TSInformation);
+       eServiceReference m_ref;
+       eDVBMetaParser m_parser;
+public:
+       eStaticServiceM2TSInformation(const eServiceReference &ref);
+       RESULT getName(const eServiceReference &ref, std::string &name);
+       int getLength(const eServiceReference &ref);
+       RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &SWIG_OUTPUT, time_t start_time);
+       int isPlayable(const eServiceReference &ref, const eServiceReference &ignore) { return 1; }
+       int getInfo(const eServiceReference &ref, int w);
+       std::string getInfoString(const eServiceReference &ref,int w);
+       PyObject *getInfoObject(const eServiceReference &r, int what);
+};
+
+DEFINE_REF(eStaticServiceM2TSInformation);
+
+eStaticServiceM2TSInformation::eStaticServiceM2TSInformation(const eServiceReference &ref)
+{
+       m_ref = ref;
+       m_parser.parseFile(ref.path);
+}
+
+RESULT eStaticServiceM2TSInformation::getName(const eServiceReference &ref, std::string &name)
+{
+       ASSERT(ref == m_ref);
+       if (m_parser.m_name.size())
+               name = m_parser.m_name;
+       else
+       {
+               name = ref.path;
+               size_t n = name.rfind('/');
+               if (n != std::string::npos)
+                       name = name.substr(n + 1);
+       }
+       return 0;
+}
+
+int eStaticServiceM2TSInformation::getLength(const eServiceReference &ref)
+{
+       ASSERT(ref == m_ref);
+       
+       eDVBTSTools tstools;
+       
+       struct stat s;
+       stat(ref.path.c_str(), &s);
+
+       eM2TSFile *file = new eM2TSFile(ref.path.c_str());
+       ePtr<iTsSource> source = file;
+
+       if (!source->valid())
+               return 0;
+
+       tstools.setSource(source);
+
+                       /* check if cached data is still valid */
+       if (m_parser.m_data_ok && (s.st_size == m_parser.m_filesize) && (m_parser.m_length))
+               return m_parser.m_length / 90000;
+
+       /* open again, this time with stream info */
+       tstools.setSource(source, ref.path.c_str());
+
+                       /* otherwise, re-calc length and update meta file */
+       pts_t len;
+       if (tstools.calcLen(len))
+               return 0;
+
+       m_parser.m_length = len;
+       m_parser.m_filesize = s.st_size;
+       m_parser.updateMeta(ref.path);
+       return m_parser.m_length / 90000;
+}
+
+int eStaticServiceM2TSInformation::getInfo(const eServiceReference &ref, int w)
+{
+       switch (w)
+       {
+       case iServiceInformation::sDescription:
+               return iServiceInformation::resIsString;
+       case iServiceInformation::sServiceref:
+               return iServiceInformation::resIsString;
+       case iServiceInformation::sFileSize:
+               return m_parser.m_filesize;
+       case iServiceInformation::sTimeCreate:
+               if (m_parser.m_time_create)
+                       return m_parser.m_time_create;
+               else
+                       return iServiceInformation::resNA;
+       default:
+               return iServiceInformation::resNA;
+       }
+}
+
+std::string eStaticServiceM2TSInformation::getInfoString(const eServiceReference &ref,int w)
+{
+       switch (w)
+       {
+       case iServiceInformation::sDescription:
+               return m_parser.m_description;
+       case iServiceInformation::sServiceref:
+               return m_parser.m_ref.toString();
+       case iServiceInformation::sTags:
+               return m_parser.m_tags;
+       default:
+               return "";
+       }
+}
+
+PyObject *eStaticServiceM2TSInformation::getInfoObject(const eServiceReference &r, int what)
+{
+       switch (what)
+       {
+       case iServiceInformation::sFileSize:
+               return PyLong_FromLongLong(m_parser.m_filesize);
+       default:
+               Py_RETURN_NONE;
+       }
+}
+
+RESULT eStaticServiceM2TSInformation::getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &evt, time_t start_time)
+{
+       if (!ref.path.empty())
+       {
+               ePtr<eServiceEvent> event = new eServiceEvent;
+               std::string filename = ref.path;
+               filename.erase(filename.length()-4, 2);
+               filename+="eit";
+               if (!event->parseFrom(filename, (m_parser.m_ref.getTransportStreamID().get()<<16)|m_parser.m_ref.getOriginalNetworkID().get()))
+               {
+                       evt = event;
+                       return 0;
+               }
+       }
+       evt = 0;
+       return -1;
+}
+
+DEFINE_REF(eM2TSFile);
+
+eM2TSFile::eM2TSFile(const char *filename, bool cached)
+       :m_lock(false), m_sync_offset(0), m_fd(-1), m_file(NULL), m_current_offset(0), m_length(0), m_cached(cached)
+{
+       if (!m_cached)
+               m_fd = ::open(filename, O_RDONLY | O_LARGEFILE);
+       else
+               m_file = ::fopen64(filename, "rb");
+       if (valid())
+               m_current_offset = m_length = lseek_internal(0, SEEK_END);
+}
+
+eM2TSFile::~eM2TSFile()
+{
+       if (m_cached)
+       {
+               if (m_file)
+               {
+                       ::fclose(m_file);
+                       m_file = 0;
+               }
+       }
+       else
+       {
+               if (m_fd >= 0)
+                       ::close(m_fd);
+               m_fd = -1;
+       }
+}
+
+off_t eM2TSFile::lseek(off_t offset, int whence)
+{
+       eSingleLocker l(m_lock);
+
+       offset = (offset % 188) + (offset * 192) / 188;
+
+       if (offset != m_current_offset)
+               m_current_offset = lseek_internal(offset, whence);
+
+       return m_current_offset;
+}
+
+off_t eM2TSFile::lseek_internal(off_t offset, int whence)
+{
+       off_t ret;
+
+       if (!m_cached)
+               ret = ::lseek(m_fd, offset, whence);
+       else
+       {
+               if (::fseeko(m_file, offset, whence) < 0)
+                       perror("fseeko");
+               ret = ::ftello(m_file);
+       }
+       return ret <= 0 ? ret : (ret % 192) + (ret*188) / 192;
+}
+
+ssize_t eM2TSFile::read(off_t offset, void *b, size_t count)
+{
+       eSingleLocker l(m_lock);
+       unsigned char tmp[192*3];
+       unsigned char *buf = (unsigned char*)b;
+
+       size_t rd=0;
+       offset = (offset % 188) + (offset * 192) / 188;
+
+sync:
+       if ((offset+m_sync_offset) != m_current_offset)
+       {
+//             eDebug("seekTo %lld", offset+m_sync_offset);
+               m_current_offset = lseek_internal(offset+m_sync_offset, SEEK_SET);
+               if (m_current_offset < 0)
+                       return m_current_offset;
+       }
+
+       while (rd < count) {
+               size_t ret;
+               if (!m_cached)
+                       ret = ::read(m_fd, tmp, 192);
+               else
+                       ret = ::fread(tmp, 1, 192, m_file);
+               if (ret < 0 || ret < 192)
+                       return rd ? rd : ret;
+
+               if (tmp[4] != 0x47)
+               {
+                       if (rd > 0) {
+                               eDebug("short read at pos %lld async!!", m_current_offset);
+                               return rd;
+                       }
+                       else {
+                               int x=0;
+                               if (!m_cached)
+                                       ret = ::read(m_fd, tmp+192, 384);
+                               else
+                                       ret = ::fread(tmp+192, 1, 384, m_file);
+
+#if 0
+                               eDebugNoNewLine("m2ts out of sync at pos %lld, real %lld:", offset + m_sync_offset, m_current_offset);
+                               for (; x < 192; ++x)
+                                       eDebugNoNewLine(" %02x", tmp[x]);
+                               eDebug("");
+                               x=0;
+#else
+                               eDebug("m2ts out of sync at pos %lld, real %lld", offset + m_sync_offset, m_current_offset);
+#endif
+                               for (; x < 192; ++x)
+                               {
+                                       if (tmp[x] == 0x47 && tmp[x+192] == 0x47)
+                                       {
+                                               int add_offs = (x - 4);
+                                               eDebug("sync found at pos %d, sync_offset is now %d, old was %d", x, add_offs + m_sync_offset, m_sync_offset);
+                                               m_sync_offset += add_offs;
+                                               goto sync;
+                                       }
+                               }
+                       }
+               }
+
+               memcpy(buf+rd, tmp+4, 188);
+
+               rd += 188;
+               m_current_offset += 188;
+       }
+
+       m_sync_offset %= 188;
+
+       return rd;
+}
+
+int eM2TSFile::valid()
+{
+       if (!m_cached)
+               return m_fd != -1;
+       else
+               return !!m_file;
+}
+
+off_t eM2TSFile::length()
+{
+       return m_length;
+}
+
+eServiceFactoryM2TS::eServiceFactoryM2TS()
+{
+       ePtr<eServiceCenter> sc;
+       eServiceCenter::getPrivInstance(sc);
+       if (sc)
+       {
+               std::list<std::string> extensions;
+               extensions.push_back("m2ts");
+               extensions.push_back("mts");
+               sc->addServiceFactory(eServiceFactoryM2TS::id, this, extensions);
+       }
+}
+
+eServiceFactoryM2TS::~eServiceFactoryM2TS()
+{
+       ePtr<eServiceCenter> sc;
+       
+       eServiceCenter::getPrivInstance(sc);
+       if (sc)
+               sc->removeServiceFactory(eServiceFactoryM2TS::id);
+}
+
+RESULT eServiceFactoryM2TS::play(const eServiceReference &ref, ePtr<iPlayableService> &ptr)
+{
+       ptr = new eServiceM2TS(ref);
+       return 0;
+}
+
+RESULT eServiceFactoryM2TS::record(const eServiceReference &ref, ePtr<iRecordableService> &ptr)
+{
+       ptr=0;
+       return -1;
+}
+
+RESULT eServiceFactoryM2TS::list(const eServiceReference &ref, ePtr<iListableService> &ptr)
+{
+       ptr=0;
+       return -1;
+}
+
+RESULT eServiceFactoryM2TS::info(const eServiceReference &ref, ePtr<iStaticServiceInformation> &ptr)
+{
+       ptr=new eStaticServiceM2TSInformation(ref);
+       return 0;
+}
+
+RESULT eServiceFactoryM2TS::offlineOperations(const eServiceReference &ref, ePtr<iServiceOfflineOperations> &ptr)
+{
+       ptr = 0;
+       return -1;
+}
+
+eServiceM2TS::eServiceM2TS(const eServiceReference &ref)
+       :eDVBServicePlay(ref, NULL)
+{
+}
+
+ePtr<iTsSource> eServiceM2TS::createTsSource(eServiceReferenceDVB &ref)
+{
+       ePtr<iTsSource> source = new eM2TSFile(ref.path.c_str());
+       return source;
+}
+
+RESULT eServiceM2TS::isCurrentlySeekable()
+{
+       return 1; // for fast winding we need index files... so only skip forward/backward yet
+}
+
+eAutoInitPtr<eServiceFactoryM2TS> init_eServiceFactoryM2TS(eAutoInitNumbers::service+1, "eServiceFactoryM2TS");
diff --git a/lib/service/servicem2ts.h b/lib/service/servicem2ts.h
new file mode 100644 (file)
index 0000000..bfa4f7d
--- /dev/null
@@ -0,0 +1,33 @@
+#ifndef __servicem2ts_h
+#define __servicem2ts_h
+
+#include <lib/service/servicedvb.h>
+
+class eServiceFactoryM2TS: public iServiceHandler
+{
+       DECLARE_REF(eServiceFactoryM2TS);
+public:
+       eServiceFactoryM2TS();
+       virtual ~eServiceFactoryM2TS();
+       enum { id = 0x3 };
+
+               // iServiceHandler
+       RESULT play(const eServiceReference &, ePtr<iPlayableService> &ptr);
+       RESULT record(const eServiceReference &, ePtr<iRecordableService> &ptr);
+       RESULT list(const eServiceReference &, ePtr<iListableService> &ptr);
+       RESULT info(const eServiceReference &, ePtr<iStaticServiceInformation> &ptr);
+       RESULT offlineOperations(const eServiceReference &, ePtr<iServiceOfflineOperations> &ptr);
+};
+
+class eServiceM2TS: public eDVBServicePlay
+{
+       friend class eServiceFactoryM2TS;
+protected:
+       eServiceM2TS(const eServiceReference &ref);
+       ePtr<iTsSource> createTsSource(eServiceReferenceDVB &ref);
+
+       // iSeekableService
+       RESULT isCurrentlySeekable();
+};
+
+#endif
index e453a2b..f96b8c4 100644 (file)
@@ -11,6 +11,7 @@
 #include <lib/gui/esubtitle.h>
 #include <lib/service/servicemp3.h>
 #include <lib/service/service.h>
+#include <lib/gdi/gpixmap.h>
 
 #include <string>
 
@@ -19,6 +20,9 @@
 #include <sys/stat.h>
 
 #define HTTP_TIMEOUT 10
+static GstStaticPadTemplate subsinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS("text/plain; text/x-pango-markup; video/x-dvd-subpicture; subpicture/x-pgs"));
+//             int ret = gst_pad_set_caps (ghostpad, caps2);
+//             gst_caps_unref(caps2);));
 
 // eServiceFactoryMP3
 
@@ -218,6 +222,7 @@ eServiceMP3::eServiceMP3(eServiceReference ref)
        m_seekTimeout = eTimer::create(eApp);
        m_subtitle_sync_timer = eTimer::create(eApp);
        m_streamingsrc_timeout = 0;
+       m_subtitle_hide_timer = eTimer::create(eApp);
        m_stream_tags = 0;
        m_currentAudioStream = -1;
        m_currentSubtitleStream = 0;
@@ -225,8 +230,12 @@ eServiceMP3::eServiceMP3(eServiceReference ref)
        m_currentTrickRatio = 0;
        m_subs_to_pull = 0;
        m_buffer_size = 1*1024*1024;
+       m_prev_decoder_time = -1;
+       m_decoder_time_valid_state = 0;
+
        CONNECT(m_seekTimeout->timeout, eServiceMP3::seekTimeoutCB);
        CONNECT(m_subtitle_sync_timer->timeout, eServiceMP3::pushSubtitles);
+       CONNECT(m_subtitle_hide_timer->timeout, eServiceMP3::hideSubtitles);
        CONNECT(m_pump.recv_msg, eServiceMP3::gstPoll);
        m_aspect = m_width = m_height = m_framerate = m_progressive = -1;
 
@@ -327,23 +336,62 @@ eServiceMP3::eServiceMP3(eServiceReference ref)
 
        g_object_set (G_OBJECT (m_gst_playbin), "uri", uri, NULL);
 
-       int flags = 0x47; // ( == GST_PLAY_FLAG_VIDEO | GST_PLAY_FLAG_AUDIO | GST_PLAY_FLAG_NATIVE_VIDEO | GST_PLAY_FLAG_TEXT )
+       int flags = 0x47; // ( GST_PLAY_FLAG_VIDEO | GST_PLAY_FLAG_AUDIO | GST_PLAY_FLAG_NATIVE_VIDEO | GST_PLAY_FLAG_TEXT );
        g_object_set (G_OBJECT (m_gst_playbin), "flags", flags, NULL);
 
        g_free(uri);
 
-       GstElement *subsink = gst_element_factory_make("appsink", "subtitle_sink");
-       if (!subsink)
-               eDebug("eServiceMP3::sorry, can't play: missing gst-plugin-appsink");
-       else
-       {
-               m_subs_to_pull_handler_id = g_signal_connect (subsink, "new-buffer", G_CALLBACK (gstCBsubtitleAvail), this);
-               g_object_set (G_OBJECT (subsink), "caps", gst_caps_from_string("text/plain; text/x-plain; text/x-pango-markup"), NULL);
-               g_object_set (G_OBJECT (m_gst_playbin), "text-sink", subsink, NULL);
-       }
-
+       m_gst_subtitlebin = gst_bin_new("subtitle_bin");
+       
        if ( m_gst_playbin )
        {
+               GstElement *appsink = gst_element_factory_make("appsink", "subtitle_sink");
+
+               if (!appsink)
+                       eDebug("eServiceMP3::sorry, can't play: missing gst-plugin-appsink");
+
+               GstElement *dvdsubdec = gst_element_factory_make("dvdsubdec", "vobsubtitle_decoder");
+               if ( dvdsubdec )
+               {
+                       gst_bin_add_many(GST_BIN(m_gst_subtitlebin), dvdsubdec, appsink, NULL);
+                       g_object_set (G_OBJECT (dvdsubdec), "singlebuffer", TRUE, NULL);
+               }
+               else
+               {
+                       eDebug("eServiceMP3::missing gst-plugin-dvdsub, no vob subtitle support!");
+                       gst_bin_add(GST_BIN(m_gst_subtitlebin), appsink);
+               }
+
+               GstPadTemplate *templ;
+               templ = gst_static_pad_template_get (&subsinktemplate);
+  
+               GstPad *ghostpad = gst_ghost_pad_new_no_target_from_template("sink", templ);
+               gst_element_add_pad (m_gst_subtitlebin, ghostpad);
+
+               GstCaps* caps = gst_caps_from_string("text/plain; text/x-pango-markup; video/x-raw-rgb; subpicture/x-pgs");
+               g_object_set (G_OBJECT (appsink), "caps", caps, NULL);
+               gst_caps_unref(caps);
+               
+               g_object_set (G_OBJECT (appsink), "async", FALSE, NULL);
+               g_object_set (G_OBJECT (appsink), "sync", TRUE, NULL);
+               g_object_set (G_OBJECT (appsink), "emit-signals", TRUE, NULL);
+               g_object_set (G_OBJECT (appsink), "ts-offset", 0 * GST_SECOND, NULL);
+
+               g_object_set_data (G_OBJECT (ghostpad), "application-instance", this);
+               g_signal_connect (G_OBJECT (ghostpad), "notify::caps", G_CALLBACK (gstGhostpadHasCAPS), this);
+               gst_pad_set_getcaps_function (ghostpad, gstGhostpadGetCAPS);
+               gst_pad_set_acceptcaps_function (ghostpad, gstGhostpadAcceptCAPS);
+               m_ghost_pad_buffer_alloc = GST_PAD_BUFFERALLOCFUNC(ghostpad);
+               m_ghost_pad_chain_function = GST_PAD_CHAINFUNC(ghostpad);
+               m_ghost_pad_subtitle_sink_event = GST_PAD_EVENTFUNC(ghostpad);
+               gst_pad_set_bufferalloc_function (ghostpad, GST_DEBUG_FUNCPTR(gstGhostpadBufferAlloc));
+               gst_pad_set_event_function (ghostpad, GST_DEBUG_FUNCPTR(gstGhostpadSinkEvent));
+               gst_pad_set_chain_function (ghostpad, GST_DEBUG_FUNCPTR(gstGhostpadChainFunction));
+               m_gst_prev_subtitle_caps = gst_caps_new_empty();
+               
+               g_object_set (G_OBJECT (m_gst_playbin), "text-sink", m_gst_subtitlebin, NULL);
+               m_subs_to_pull_handler_id = g_signal_connect (appsink, "new-buffer", G_CALLBACK (gstCBsubtitleAvail), this);
+               
                gst_bus_set_sync_handler(gst_pipeline_get_bus (GST_PIPELINE (m_gst_playbin)), gstBusSyncHandler, this);
                char srt_filename[strlen(filename)+1];
                strncpy(srt_filename,filename,strlen(filename)-3);
@@ -380,15 +428,17 @@ eServiceMP3::eServiceMP3(eServiceReference ref)
 eServiceMP3::~eServiceMP3()
 {
        // disconnect subtitle callback
-       GstElement *sink;
-       g_object_get (G_OBJECT (m_gst_playbin), "text-sink", &sink, NULL);
-       if (sink)
+       GstElement *appsink = gst_bin_get_by_name(GST_BIN(m_gst_subtitlebin), "subtitle_sink");
+//     GstElement *appsink = gst_bin_get_by_name(GST_BIN(m_gst_playbin), "subtitle_sink");
+
+       if (appsink)
        {
-               g_signal_handler_disconnect (sink, m_subs_to_pull_handler_id);
-               gst_object_unref(sink);
+               g_signal_handler_disconnect (appsink, m_subs_to_pull_handler_id);
+               gst_object_unref(appsink);
        }
 
        delete m_subtitle_widget;
+       gst_caps_unref(this->m_gst_prev_subtitle_caps);
 
        // disconnect sync handler callback
        gst_bus_set_sync_handler(gst_pipeline_get_bus (GST_PIPELINE (m_gst_playbin)), NULL, NULL);
@@ -442,6 +492,8 @@ RESULT eServiceMP3::stop()
 
        if (m_state == stStopped)
                return -1;
+       
+       //GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(m_gst_playbin),GST_DEBUG_GRAPH_SHOW_ALL,"e2-playbin");
 
        eDebug("eServiceMP3::stop %s", m_ref.path.c_str());
        gst_element_set_state(m_gst_playbin, GST_STATE_NULL);
@@ -568,6 +620,8 @@ RESULT eServiceMP3::seekTo(pts_t to)
                if (!(ret = seekToImpl(to)))
                {
                        m_subtitle_pages.clear();
+                       m_prev_decoder_time = -1;
+                       m_decoder_time_valid_state = 0;
                        m_subs_to_pull = 0;
                }
        }
@@ -669,6 +723,7 @@ RESULT eServiceMP3::getPlayPosition(pts_t &pts)
 
        /* pos is in nanoseconds. we have 90 000 pts per second. */
        pts = pos / 11111;
+//     eDebug("gst_element_query_position %lld pts (%lld ms)", pts, pos/1000000);
        return 0;
 }
 
@@ -1111,6 +1166,48 @@ RESULT eServiceMP3::getTrackInfo(struct iAudioTrackInfo &info, unsigned int i)
        return 0;
 }
 
+subtype_t getSubtitleType(GstPad* pad, gchar *g_codec=NULL)
+{
+       subtype_t type = stUnknown;
+       GstCaps* caps = gst_pad_get_negotiated_caps(pad);
+
+       if ( caps )
+       {
+               GstStructure* str = gst_caps_get_structure(caps, 0);
+               const gchar *g_type = gst_structure_get_name(str);
+               eDebug("getSubtitleType::subtitle probe caps type=%s", g_type);
+
+               if ( !strcmp(g_type, "video/x-dvd-subpicture") )
+                       type = stVOB;
+               else if ( !strcmp(g_type, "text/x-pango-markup") )
+                       type = stSSA;
+               else if ( !strcmp(g_type, "text/plain") )
+                       type = stPlainText;
+               else if ( !strcmp(g_type, "subpicture/x-pgs") )
+                       type = stPGS;
+               else
+                       eDebug("getSubtitleType::unsupported subtitle caps %s (%s)", g_type, g_codec);
+       }
+       else if ( g_codec )
+       {
+               eDebug("getSubtitleType::subtitle probe codec tag=%s", g_codec);
+               if ( !strcmp(g_codec, "VOB") )
+                       type = stVOB;
+               else if ( !strcmp(g_codec, "SubStation Alpha") || !strcmp(g_codec, "SSA") )
+                       type = stSSA;
+               else if ( !strcmp(g_codec, "ASS") )
+                       type = stASS;
+               else if ( !strcmp(g_codec, "UTF-8 plain text") )
+                       type = stPlainText;
+               else
+                       eDebug("getSubtitleType::unsupported subtitle codec %s", g_codec);
+       }
+       else
+               eDebug("getSubtitleType::unidentifiable subtitle stream!");
+
+       return type;
+}
+
 void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg)
 {
        if (!msg)
@@ -1157,16 +1254,16 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg)
                                }       break;
                                case GST_STATE_CHANGE_READY_TO_PAUSED:
                                {
-                                       GstElement *sink;
-                                       g_object_get (G_OBJECT (m_gst_playbin), "text-sink", &sink, NULL);
-                                       if (sink)
-                                       {
-                                               g_object_set (G_OBJECT (sink), "max-buffers", 2, NULL);
-                                               g_object_set (G_OBJECT (sink), "sync", FALSE, NULL);
-                                               g_object_set (G_OBJECT (sink), "async", FALSE, NULL);
-                                               g_object_set (G_OBJECT (sink), "emit-signals", TRUE, NULL);
-                                               gst_object_unref(sink);
-                                       }
+                                       GstElement *appsink = gst_bin_get_by_name(GST_BIN(m_gst_subtitlebin), "subtitle_sink");
+//                                     GstElement *appsink = gst_bin_get_by_name(GST_BIN(m_gst_playbin), "subtitle_sink");
+                                       if (appsink)
+                                       {
+                                               g_object_set (G_OBJECT (appsink), "max-buffers", 2, NULL);
+                                               g_object_set (G_OBJECT (appsink), "sync", FALSE, NULL);
+                                               g_object_set (G_OBJECT (appsink), "emit-signals", TRUE, NULL);
+                                               eDebug("eServiceMP3::appsink properties set!");
+                                               gst_object_unref(appsink);
+                                       }
                                        setAC3Delay(ac3_delay);
                                        setPCMDelay(pcm_delay);
                                }       break;
@@ -1283,7 +1380,6 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg)
                                        continue;
                                GstStructure* str = gst_caps_get_structure(caps, 0);
                                const gchar *g_type = gst_structure_get_name(str);
-                               eDebug("AUDIO STRUCT=%s", g_type);
                                audio.type = gstCheckAudioPad(str);
                                g_codec = g_strdup(g_type);
                                g_lang = g_strdup_printf ("und");
@@ -1304,25 +1400,30 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg)
                        }
 
                        for (i = 0; i < n_text; i++)
-                       {       
-                               gchar *g_lang;
-//                             gchar *g_type;
-//                             GstPad* pad = 0;
-//                             g_signal_emit_by_name (m_gst_playbin, "get-text-pad", i, &pad);
-//                             GstCaps* caps = gst_pad_get_negotiated_caps(pad);
-//                             GstStructure* str = gst_caps_get_structure(caps, 0);
-//                             g_type = gst_structure_get_name(str);
-//                             g_signal_emit_by_name (m_gst_playbin, "get-text-tags", i, &tags);
+                       {
+                               gchar *g_codec = NULL, *g_lang = NULL;
+                               g_signal_emit_by_name (m_gst_playbin, "get-text-tags", i, &tags);
                                subtitleStream subs;
-                               subs.type = stPlainText;
+//                             int ret;
+
                                g_lang = g_strdup_printf ("und");
                                if ( tags && gst_is_tag_list(tags) )
+                               {
                                        gst_tag_list_get_string(tags, GST_TAG_LANGUAGE_CODE, &g_lang);
+                                       gst_tag_list_get_string(tags, GST_TAG_SUBTITLE_CODEC, &g_codec);
+                                       gst_tag_list_free(tags);
+                               }
+
                                subs.language_code = std::string(g_lang);
-                               eDebug("eServiceMP3::subtitle stream=%i language=%s"/* type=%s*/, i, g_lang/*, g_type*/);
+                               eDebug("eServiceMP3::subtitle stream=%i language=%s codec=%s", i, g_lang, g_codec);
+                               
+                               GstPad* pad = 0;
+                               g_signal_emit_by_name (m_gst_playbin, "get-text-pad", i, &pad);
+                               if ( subs.type != stSRT )
+                                       subs.type = getSubtitleType(pad, g_codec);
+
                                m_subtitleStreams.push_back(subs);
                                g_free (g_lang);
-//                             g_free (g_type);
                        }
                        m_event((iPlayableService*)this, evUpdatedEventInfo);
                        break;
@@ -1415,7 +1516,7 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg)
 GstBusSyncReply eServiceMP3::gstBusSyncHandler(GstBus *bus, GstMessage *message, gpointer user_data)
 {
        eServiceMP3 *_this = (eServiceMP3*)user_data;
-       _this->m_pump.send(1);
+       _this->m_pump.send(Message(1));
                /* wake */
        return GST_BUS_PASS;
 }
@@ -1469,44 +1570,377 @@ audiotype_t eServiceMP3::gstCheckAudioPad(GstStructure* structure)
        return atUnknown;
 }
 
-void eServiceMP3::gstPoll(const int &msg)
+void eServiceMP3::gstPoll(const Message &msg)
 {
-               /* ok, we have a serious problem here. gstBusSyncHandler sends 
-                  us the wakup signal, but likely before it was posted.
-                  the usleep, an EVIL HACK (DON'T DO THAT!!!) works around this.
-                  
-                  I need to understand the API a bit more to make this work 
-                  proplerly. */
-       if (msg == 1)
+       if (msg.type == 1)
        {
                GstBus *bus = gst_pipeline_get_bus (GST_PIPELINE (m_gst_playbin));
                GstMessage *message;
-               usleep(1);
-               while ((message = gst_bus_pop (bus)))
+               while (message = gst_bus_pop(bus))
                {
                        gstBusCall(bus, message);
                        gst_message_unref (message);
                }
        }
-       else
+       else if (msg.type == 2)
                pullSubtitle();
+       else if (msg.type == 3)
+               gstGhostpadHasCAPS_synced(msg.d.pad);
+       else
+               eDebug("gstPoll unhandled Message %d\n", msg.type);
 }
 
 eAutoInitPtr<eServiceFactoryMP3> init_eServiceFactoryMP3(eAutoInitNumbers::service+1, "eServiceFactoryMP3");
 
 void eServiceMP3::gstCBsubtitleAvail(GstElement *appsink, gpointer user_data)
 {
-       eServiceMP3 *_this = (eServiceMP3*)user_data;
+       eServiceMP3 *_this = (eServiceMP3*)user_data;   
        eSingleLocker l(_this->m_subs_to_pull_lock);
        ++_this->m_subs_to_pull;
-       _this->m_pump.send(2);
+       _this->m_pump.send(Message(2));
+}
+
+gboolean eServiceMP3::gstGhostpadSinkEvent(GstPad * pad, GstEvent * event)
+{
+//     eDebug("eServiceMP3::gstGhostpadSinkEvent %s", gst_structure_get_name (event->structure));
+
+//     eServiceMP3 *_this = (eServiceMP3*) (gst_pad_get_parent (pad));
+       eServiceMP3 *_this = (eServiceMP3*) g_object_get_data (G_OBJECT (pad), "application-instance");
+       gboolean ret;
+       GstFormat format;
+
+       if (GST_EVENT_TYPE (event) == GST_EVENT_CUSTOM_DOWNSTREAM_OOB && event->structure && strcmp (gst_structure_get_name (event->structure), "subtitleoverlay-flush-subtitle") == 0)
+       {
+               eDebug ("Custom subtitle flush event");
+//             GST_SUBTITLE_OVERLAY_LOCK (self);
+//             self->subtitle_flush = TRUE;
+//             self->subtitle_error = FALSE;
+//             if (self->subtitle_block_pad)
+//             gst_pad_set_blocked_async_full (self->subtitle_block_pad, TRUE,
+//                     _pad_blocked_cb, gst_object_ref (self),
+//                     (GDestroyNotify) gst_object_unref);
+//             if (self->video_block_pad)
+//             gst_pad_set_blocked_async_full (self->video_block_pad, TRUE,
+//                     _pad_blocked_cb, gst_object_ref (self),
+//                     (GDestroyNotify) gst_object_unref);
+//             GST_SUBTITLE_OVERLAY_UNLOCK (self);
+// 
+               gst_event_unref (event);
+               event = NULL;
+               ret = TRUE;
+               goto out;
+       } else if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT)
+       {
+               gst_event_parse_new_segment_full (event, NULL, NULL, NULL, &format, NULL, NULL, NULL);
+               if (_this->m_gst_subtitle_segment.format != GST_FORMAT_UNDEFINED && _this->m_gst_subtitle_segment.format != format)
+               {
+                       eDebug("Subtitle segment format changed: %s -> %s", gst_format_get_name(_this->m_gst_subtitle_segment.format), gst_format_get_name(format));
+                       gst_segment_init (&_this->m_gst_subtitle_segment, GST_FORMAT_UNDEFINED);
+               }
+       }
+
+  switch (GST_EVENT_TYPE (event)) {
+    case GST_EVENT_FLUSH_STOP:
+      eDebug("Resetting subtitle segment because of flush-stop");
+      gst_segment_init (&_this->m_gst_subtitle_segment, GST_FORMAT_UNDEFINED);
+      /* fall through */
+    case GST_EVENT_FLUSH_START:    
+    case GST_EVENT_NEWSEGMENT:
+    case GST_EVENT_EOS:
+//     eDebug("GST_EVENT_FLUSH_START GST_EVENT_NEWSEGMENT GST_EVENT_EOS");
+      /* Add our event marker to make sure no events from here go ever outside
+       * the element, they're only interesting for our internal elements */
+//       event =
+//           GST_EVENT_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST
+//               (event)));
+//       if (!event->structure) {
+//         event->structure =
+//             gst_structure_id_empty_new (_subtitle_overlay_event_marker_id);
+//         gst_structure_set_parent_refcount (event->structure,
+//             &event->mini_object.refcount);
+//       }
+//       gst_structure_id_set (event->structure, _subtitle_overlay_event_marker_id,
+//           G_TYPE_BOOLEAN, TRUE, NULL);
+      break;
+    default:
+           eDebug("GST_EVENT_TYPE other: %i", GST_EVENT_TYPE (event));
+      break;
+  }
+
+  ret = _this->m_ghost_pad_subtitle_sink_event (pad, gst_event_ref (event));
+// eDebug("original EVENTFUNC returned %i", ret);
+
+  if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) {
+    gboolean update;
+    gdouble rate, applied_rate;
+    gint64 start, stop, position;
+    
+    GST_DEBUG_OBJECT (pad, "Newsegment event: %" GST_PTR_FORMAT,
+        event->structure);
+    gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate,
+        &format, &start, &stop, &position);
+
+    GST_DEBUG_OBJECT (pad, "Old subtitle segment: %" GST_SEGMENT_FORMAT,
+        &_this->m_gst_subtitle_segment);
+    if (_this->m_gst_subtitle_segment.format != format) {
+      GST_DEBUG_OBJECT (pad, "Subtitle segment format changed: %s -> %s",
+          gst_format_get_name (_this->m_gst_subtitle_segment.format),
+          gst_format_get_name (format));
+      gst_segment_init (&_this->m_gst_subtitle_segment, format);
+    }
+
+    gst_segment_set_newsegment_full (&_this->m_gst_subtitle_segment, update, rate,
+        applied_rate, format, start, stop, position);
+    GST_DEBUG_OBJECT (pad, "New subtitle segment: %" GST_SEGMENT_FORMAT,
+        &_this->m_gst_subtitle_segment);
+  }
+  gst_event_unref (event);
+// 
+out:
+//   gst_object_unref (_this);
+  return ret;
+}
+
+GstCaps* eServiceMP3::gstGhostpadGetCAPS(GstPad * pad)
+{
+//     eDebug("eServiceMP3::gstGhostpadGetCAPS");
+       return gst_static_pad_template_get_caps(&subsinktemplate);
+}
+
+gboolean eServiceMP3::gstGhostpadAcceptCAPS(GstPad * pad, GstCaps * caps)
+{
+       GstCaps *templ_caps = gst_static_pad_template_get_caps (&subsinktemplate);
+       gboolean ret = gst_caps_can_intersect (templ_caps, caps);
+
+//     eDebug("gstGhostpadAcceptCAPS templ=%s, given=%s ret=%i", gst_caps_to_string(templ_caps), gst_caps_to_string(caps), ret);
+       gst_caps_unref (templ_caps);
+
+       return ret;
+}
+
+void eServiceMP3::gstGhostpadLink(gpointer user_data, GstCaps * caps)
+{
+       GstStructure *s;
+       GstPad *sinkpad;
+       eServiceMP3 *_this = (eServiceMP3*)user_data;
+
+       // FIXME: Need to cache events from the ghostpad and pass them forward
+       // now... and keep track of the segment and pass newsegment events
+       // downstream.
+       s = gst_caps_get_structure (caps, 0);
+
+       GstPad *ghostpad = gst_element_get_static_pad(_this->m_gst_subtitlebin, "sink");
+       GstElement *appsink = gst_bin_get_by_name(GST_BIN(_this->m_gst_subtitlebin), "subtitle_sink");
+       GstElement *dvdsubdec = gst_bin_get_by_name(GST_BIN(_this->m_gst_subtitlebin), "vobsubtitle_decoder");
+       
+       gst_ghost_pad_set_target(GST_GHOST_PAD(ghostpad), NULL);
+       gst_element_unlink(dvdsubdec, appsink);
+       int ret = -1;
+  
+       if ( gst_structure_has_name (s, "video/x-dvd-subpicture") && dvdsubdec )
+       {
+               sinkpad = gst_element_get_static_pad (dvdsubdec, "sink");
+               ret = gst_element_link_pads (dvdsubdec, "src", appsink, "sink");
+//             eDebug("gstGhostpadLink:: dvdsubdec+appsink = %i", ret);
+       }
+       else
+       {
+               sinkpad = gst_element_get_static_pad (appsink, "sink");
+//             eDebug("gstGhostpadLink:: appsink");
+       }
+
+       gst_ghost_pad_set_target (GST_GHOST_PAD(ghostpad), sinkpad);
+}
+
+GstFlowReturn eServiceMP3::gstGhostpadBufferAlloc(GstPad *pad, guint64 offset, guint size, GstCaps *caps, GstBuffer **buf)
+{
+       eServiceMP3 *_this = (eServiceMP3*) g_object_get_data (G_OBJECT (pad), "application-instance");
+
+//     eDebug("eServiceMP3::gstGhostpadBufferAlloc prevcaps=%s newcaps=%s", gst_caps_to_string(_this->m_gst_prev_subtitle_caps), gst_caps_to_string(caps));
+       if (!GST_PAD_CAPS (pad) || !gst_caps_is_equal (_this->m_gst_prev_subtitle_caps, caps))
+               gstGhostpadLink (_this, caps);
+
+       return _this->m_ghost_pad_buffer_alloc (pad, offset, size, caps, buf);
+}
+
+void eServiceMP3::gstGhostpadHasCAPS(GstPad *pad, GParamSpec * unused, gpointer user_data)
+{
+       eServiceMP3 *_this = (eServiceMP3*)user_data;
+
+       gst_object_ref (pad);
+
+       _this->m_pump.send(Message(3, pad));
 }
 
+// after messagepump
+void eServiceMP3::gstGhostpadHasCAPS_synced(GstPad *pad)
+{
+       GstCaps *caps;
+
+       g_object_get (G_OBJECT (pad), "caps", &caps, NULL);
+
+//     eDebug("gstGhostpadHasCAPS:: signal::caps = %s", gst_caps_to_string(caps));
+
+       if (caps)
+       {
+               subtitleStream subs;
+
+//             eDebug("gstGhostpadHasCAPS_synced %p %d", pad, m_subtitleStreams.size());
+
+               if (!m_subtitleStreams.empty())
+                       subs = m_subtitleStreams[m_currentSubtitleStream];
+               else {
+                       subs.type = stUnknown;
+                       subs.pad = pad;
+               }
+
+               if ( subs.type == stUnknown )
+               {
+                       GstTagList *tags;
+//                     eDebug("gstGhostpadHasCAPS::m_subtitleStreams[%i].type == stUnknown...", m_currentSubtitleStream);
+
+                       gchar *g_lang;
+                       g_signal_emit_by_name (m_gst_playbin, "get-text-tags", m_currentSubtitleStream, &tags);
+
+                       g_lang = g_strdup_printf ("und");
+                       if ( tags && gst_is_tag_list(tags) )
+                               gst_tag_list_get_string(tags, GST_TAG_LANGUAGE_CODE, &g_lang);
+
+                       subs.language_code = std::string(g_lang);
+                       GstPad *ghostpad = gst_element_get_static_pad(m_gst_subtitlebin, "sink");
+                       subs.type = getSubtitleType(ghostpad);
+
+                       if (!m_subtitleStreams.empty())
+                               m_subtitleStreams[m_currentSubtitleStream] = subs;
+                       else
+                               m_subtitleStreams.push_back(subs);
+
+                       g_free (g_lang);
+               }
+
+//             eDebug("gstGhostpadHasCAPS:: m_gst_prev_subtitle_caps=%s equal=%i",gst_caps_to_string(m_gst_prev_subtitle_caps),gst_caps_is_equal(m_gst_prev_subtitle_caps, caps));
+
+               if (!GST_PAD_CAPS (pad) || !gst_caps_is_equal (m_gst_prev_subtitle_caps, caps))
+                       gstGhostpadLink(this, caps);
+
+               m_gst_prev_subtitle_caps = gst_caps_copy(caps);
+
+               gst_caps_unref (caps);
+       }
+
+       gst_object_unref (pad);
+}
+
+GstFlowReturn eServiceMP3::gstGhostpadChainFunction(GstPad * pad, GstBuffer * buffer)
+{
+       GstFlowReturn ret = GST_FLOW_OK;
+       
+       eServiceMP3 *_this = (eServiceMP3*)g_object_get_data (G_OBJECT (pad), "application-instance");
+
+//     gint64 buf_pos = GST_BUFFER_TIMESTAMP(buffer);
+//     gint64 duration_ns = GST_BUFFER_DURATION(buffer);
+       size_t len = GST_BUFFER_SIZE(buffer);
+
+       unsigned char line[len+1];
+       memcpy(line, GST_BUFFER_DATA(buffer), len);
+       line[len] = 0;
+//     eDebug("gstGhostpadChainFunction buffer: '%s' caps: %s ", line, gst_caps_to_string(GST_BUFFER_CAPS(buffer)));
+
+       ret = _this->m_ghost_pad_chain_function(pad, buffer);
+//     eDebug("original chain func returns %i", ret);
+       return ret;
+}
+
+
+// void eServiceMP3::gstCBsubtitleLink(GObject *obj, GParamSpec *pspec, gpointer user_data)
+// {
+// 
+//     eServiceMP3 *_this = (eServiceMP3*)user_data;
+//     eDebug("gstCBsubtitleCAPS:: m_currentSubtitleStream=%i, m_subtitleStreams.size()=%i", _this->m_currentSubtitleStream, _this->m_subtitleStreams.size());
+// 
+//     if ( _this->m_currentSubtitleStream >= (int)_this->m_subtitleStreams.size() )
+//     {
+//             eDebug("return invalid stream count");
+//             return;
+//     }
+// 
+//     subtitleStream subs = _this->m_subtitleStreams[_this->m_currentSubtitleStream];
+//     
+//     if ( subs.type == stUnknown )
+//     {
+//             GstTagList *tags;
+//             eDebug("gstCBsubtitleCAPS::m_subtitleStreams[%i].type == stUnknown...", _this->m_currentSubtitleStream);
+//             
+//             gchar *g_lang;
+//             g_signal_emit_by_name (_this->m_gst_playbin, "get-text-tags", _this->m_currentSubtitleStream, &tags);
+// 
+//             g_lang = g_strdup_printf ("und");
+//             if ( tags && gst_is_tag_list(tags) )
+//                     gst_tag_list_get_string(tags, GST_TAG_LANGUAGE_CODE, &g_lang);
+//             subs.language_code = std::string(g_lang);
+// 
+//             subs.type = getSubtitleType(GST_PAD(obj));
+//             
+//             _this->m_subtitleStreams[_this->m_currentSubtitleStream] = subs;
+// 
+//             g_free (g_lang);
+//     }
+// 
+//     gstCBsubtitleLink(subs.type, _this);
+// }
+
+// void eServiceMP3::gstCBsubtitleLink(subtype_t type, gpointer user_data)
+// {
+//     eServiceMP3 *_this = (eServiceMP3*)user_data;
+//     
+//     if ( type == stVOB )
+//     {
+//             GstPad *ghostpad = gst_element_get_static_pad(_this->m_gst_subtitlebin, "sink");
+//             GstElement *dvdsubdec = gst_bin_get_by_name(GST_BIN(_this->m_gst_subtitlebin), "vobsubtitle_decoder");
+//             GstPad *subdecsinkpad = gst_element_get_static_pad (dvdsubdec, "sink");
+//             int ret = gst_ghost_pad_set_target((GstGhostPad*)ghostpad, subdecsinkpad);
+//             GstElement *appsink = gst_bin_get_by_name(GST_BIN(_this->m_gst_subtitlebin), "subtitle_sink");
+//             ret += gst_element_link(dvdsubdec, appsink);
+//             eDebug("gstCBsubtitleLink:: dvdsubdec=%p, subdecsinkpad=%p, ghostpad=%p, set target & link=%i", dvdsubdec, subdecsinkpad, ghostpad, ret);
+//     }
+//     else if ( type < stVOB && type > stUnknown )
+//     {
+//             GstPad *ghostpad = gst_element_get_static_pad(_this->m_gst_subtitlebin, "sink");
+//             GstElement *appsink = gst_bin_get_by_name(GST_BIN(_this->m_gst_subtitlebin), "subtitle_sink");
+//             GstPad *appsinkpad = gst_element_get_static_pad (appsink, "sink");
+//             GstElement *dvdsubdec = gst_bin_get_by_name(GST_BIN(_this->m_gst_subtitlebin), "vobsubtitle_decoder");
+//             gst_element_unlink(dvdsubdec, appsink);
+//             int ret = gst_ghost_pad_set_target((GstGhostPad*)ghostpad, appsinkpad);
+//             eDebug("gstCBsubtitleLink:: appsink=%p, appsinkpad=%p, ghostpad=%p, set target=%i", appsink, appsinkpad, ghostpad, ret);
+//     }
+//     else
+//     {
+//             eDebug("gstCBsubtitleLink:: unsupported subtitles");
+//     }
+// }
+/*
+gboolean eServiceMP3::gstCBsubtitleDrop(GstPad *pad, GstBuffer *buffer, gpointer user_data)
+{
+       eDebug("gstCBsubtitleDrop");
+       
+       gint64 buf_pos = GST_BUFFER_TIMESTAMP(buffer);
+       gint64 duration_ns = GST_BUFFER_DURATION(buffer);
+       size_t len = GST_BUFFER_SIZE(buffer);
+
+       unsigned char line[len+1];
+       memcpy(line, GST_BUFFER_DATA(buffer), len);
+       line[len] = 0;
+       eDebug("dropping buffer '%s' ", line);
+       return false;
+}*/
+
+
 void eServiceMP3::pullSubtitle()
 {
-       GstElement *sink;
-       g_object_get (G_OBJECT (m_gst_playbin), "text-sink", &sink, NULL);
-       if (sink)
+       GstElement *appsink = gst_bin_get_by_name(GST_BIN(m_gst_subtitlebin), "subtitle_sink");
+//     GstElement *appsink = gst_bin_get_by_name(GST_BIN(m_gst_playbin), "subtitle_sink");
+
+       if (appsink)
        {
                while (m_subs_to_pull && m_subtitle_pages.size() < 2)
                {
@@ -1514,28 +1948,55 @@ void eServiceMP3::pullSubtitle()
                        {
                                eSingleLocker l(m_subs_to_pull_lock);
                                --m_subs_to_pull;
-                               g_signal_emit_by_name (sink, "pull-buffer", &buffer);
+                               g_signal_emit_by_name (appsink, "pull-buffer", &buffer);
                        }
                        if (buffer)
                        {
                                gint64 buf_pos = GST_BUFFER_TIMESTAMP(buffer);
                                gint64 duration_ns = GST_BUFFER_DURATION(buffer);
                                size_t len = GST_BUFFER_SIZE(buffer);
-                               unsigned char line[len+1];
-                               memcpy(line, GST_BUFFER_DATA(buffer), len);
-                               line[len] = 0;
-                               eDebug("got new subtitle @ buf_pos = %lld ns (in pts=%lld): '%s' ", buf_pos, buf_pos/11111, line);
-                               ePangoSubtitlePage page;
-                               gRGB rgbcol(0xD0,0xD0,0xD0);
-                               page.m_elements.push_back(ePangoSubtitlePageElement(rgbcol, (const char*)line));
-                               page.show_pts = buf_pos / 11111L;
-                               page.m_timeout = duration_ns / 1000000;
-                               m_subtitle_pages.push_back(page);
-                               pushSubtitles();
+                               eDebug("pullSubtitle m_subtitleStreams[m_currentSubtitleStream].type=%i",m_subtitleStreams[m_currentSubtitleStream].type);
+                               
+                               if ( m_subtitleStreams[m_currentSubtitleStream].type )
+                               {
+                                       if ( m_subtitleStreams[m_currentSubtitleStream].type < stVOB )
+                                       {
+                                               unsigned char line[len+1];
+                                               SubtitlePage page;
+                                               memcpy(line, GST_BUFFER_DATA(buffer), len);
+                                               line[len] = 0;
+                                               eDebug("got new text subtitle @ buf_pos = %lld ns (in pts=%lld): '%s' ", buf_pos, buf_pos/11111, line);
+                                               gRGB rgbcol(0xD0,0xD0,0xD0);
+                                               page.type = SubtitlePage::Pango;
+                                               page.pango_page.m_elements.push_back(ePangoSubtitlePageElement(rgbcol, (const char*)line));
+                                               page.pango_page.m_show_pts = buf_pos / 11111L;
+                                               page.pango_page.m_timeout = duration_ns / 1000000;
+                                               m_subtitle_pages.push_back(page);
+                                               if (m_subtitle_pages.size()==1)
+                                                       pushSubtitles();
+                                       }
+                                       else if ( m_subtitleStreams[m_currentSubtitleStream].type == stVOB )
+                                       {
+                                               SubtitlePage page;
+                                               eDebug("got new subpicture @ buf_pos = %lld ns (in pts=%lld), duration=%lld ns, len=%i bytes. ", buf_pos, buf_pos/11111, duration_ns, len);
+                                               page.type = SubtitlePage::Vob;
+                                               page.vob_page.m_pixmap = new gPixmap(eSize(720, 576), 32, 1);
+                                               memcpy(page.vob_page.m_pixmap->surface->data, GST_BUFFER_DATA(buffer), len);
+                                               page.vob_page.m_show_pts = buf_pos / 11111L;
+                                               page.vob_page.m_timeout = duration_ns / 1000;
+                                               m_subtitle_pages.push_back(page);
+                                               if (m_subtitle_pages.size()==1)
+                                                       pushSubtitles();
+                                       }
+                                       else
+                                       {
+                                               eDebug("unsupported subpicture... ignoring");
+                                       }
+                               }
                                gst_buffer_unref(buffer);
                        }
                }
-               gst_object_unref(sink);
+               gst_object_unref(appsink);
        }
        else
                eDebug("no subtitle sink!");
@@ -1543,45 +2004,64 @@ void eServiceMP3::pullSubtitle()
 
 void eServiceMP3::pushSubtitles()
 {
-       ePangoSubtitlePage page;
-       pts_t running_pts;
        while ( !m_subtitle_pages.empty() )
        {
+               SubtitlePage &frontpage = m_subtitle_pages.front();
+               pts_t running_pts;
+               gint64 diff_ms = 0;
+               gint64 show_pts;
+
                getPlayPosition(running_pts);
-               page = m_subtitle_pages.front();
-               gint64 diff_ms = ( page.show_pts - running_pts ) / 90;
-               eDebug("eServiceMP3::pushSubtitles show_pts = %lld  running_pts = %lld  diff = %lld", page.show_pts, running_pts, diff_ms);
-               if (diff_ms < -100)
-               {
-                       GstFormat fmt = GST_FORMAT_TIME;
-                       gint64 now;
-                       if (gst_element_query_position(m_gst_playbin, &fmt, &now) != -1)
-                       {
-                               now /= 11111;
-                               diff_ms = abs((now - running_pts) / 90);
-                               eDebug("diff < -100ms check decoder/pipeline diff: decoder: %lld, pipeline: %lld, diff: %lld", running_pts, now, diff_ms);
-                               if (diff_ms > 100000)
-                               {
-                                       eDebug("high decoder/pipeline difference.. assume decoder has now started yet.. check again in 1sec");
-                                       m_subtitle_sync_timer->start(1000, true);
-                                       break;
-                               }
+
+               if (m_decoder_time_valid_state < 4) {
+                       ++m_decoder_time_valid_state;
+                       if (m_prev_decoder_time == running_pts)
+                               m_decoder_time_valid_state = 0;
+                       if (m_decoder_time_valid_state < 4) {
+//                             if (m_decoder_time_valid_state)
+//                                     eDebug("%d: decoder time not valid! prev %lld, now %lld\n", m_decoder_time_valid_state, m_prev_decoder_time/90, running_pts/90);
+//                             else
+//                                     eDebug("%d: decoder time not valid! now %lld\n", m_decoder_time_valid_state, running_pts/90);
+                               m_subtitle_sync_timer->start(25, true);
+                               m_prev_decoder_time = running_pts;
+                               break;
                        }
-                       else
-                               eDebug("query position for decoder/pipeline check failed!");
-                       eDebug("subtitle to late... drop");
+               }
+
+               if (frontpage.type == SubtitlePage::Pango)
+                       show_pts = frontpage.pango_page.m_show_pts;
+               else
+                       show_pts = frontpage.vob_page.m_show_pts;
+
+               diff_ms = ( show_pts - running_pts ) / 90;
+               eDebug("check subtitle: decoder: %lld, show_pts: %lld, diff: %lld ms", running_pts/90, show_pts/90, diff_ms);
+
+               if ( diff_ms < -100 )
+               {
+                       eDebug("subtitle too late... drop");
                        m_subtitle_pages.pop_front();
                }
                else if ( diff_ms > 20 )
                {
-//                     eDebug("start recheck timer");
-                       m_subtitle_sync_timer->start(diff_ms > 1000 ? 1000 : diff_ms, true);
+                       eDebug("start timer");
+                       m_subtitle_sync_timer->start(diff_ms, true);
                        break;
                }
                else // immediate show
                {
-                       if (m_subtitle_widget)
-                               m_subtitle_widget->setPage(page);
+                       if ( m_subtitle_widget )
+                       {
+                               eDebug("show!\n");
+                               if ( frontpage.type == SubtitlePage::Pango)
+                                       m_subtitle_widget->setPage(frontpage.pango_page);
+                               else
+                               {
+                                       m_subtitle_widget->setPixmap(frontpage.vob_page.m_pixmap, eRect(0, 0, 720, 576));
+                                       eDebug("blit vobsub pixmap... hide in %i ms", frontpage.vob_page.m_timeout);
+                                       m_subtitle_hide_timer->start(frontpage.vob_page.m_timeout, true);
+                               }
+                               m_subtitle_widget->show();
+                       }
                        m_subtitle_pages.pop_front();
                }
        }
@@ -1589,12 +2069,26 @@ void eServiceMP3::pushSubtitles()
                pullSubtitle();
 }
 
+void eServiceMP3::hideSubtitles()
+{
+//     eDebug("eServiceMP3::hideSubtitles()");
+       if ( m_subtitle_widget )
+               m_subtitle_widget->hide();
+}
+
 RESULT eServiceMP3::enableSubtitles(eWidget *parent, ePyObject tuple)
 {
+//     eDebug ("eServiceMP3::enableSubtitles m_currentSubtitleStream=%i this=%p",m_currentSubtitleStream, this);
        ePyObject entry;
        int tuplesize = PyTuple_Size(tuple);
        int pid, type;
        gint text_pid = 0;
+       eSingleLocker l(m_subs_to_pull_lock);
+
+//     GstPad *pad = 0;
+//     g_signal_emit_by_name (m_gst_playbin, "get-text-pad", m_currentSubtitleStream, &pad);
+//     gst_element_get_static_pad(m_gst_subtitlebin, "sink");
+//     gulong subprobe_handler_id = gst_pad_add_buffer_probe (pad, G_CALLBACK (gstCBsubtitleDrop), NULL);
 
        if (!PyTuple_Check(tuple))
                goto error_out;
@@ -1609,12 +2103,14 @@ RESULT eServiceMP3::enableSubtitles(eWidget *parent, ePyObject tuple)
                goto error_out;
        type = PyInt_AsLong(entry);
 
+//     eDebug ("eServiceMP3::enableSubtitles new pid=%i",pid);
        if (m_currentSubtitleStream != pid)
        {
-               eSingleLocker l(m_subs_to_pull_lock);
                g_object_set (G_OBJECT (m_gst_playbin), "current-text", pid, NULL);
+//             eDebug ("eServiceMP3::enableSubtitles g_object_set current-text = %i", pid);
                m_currentSubtitleStream = pid;
                m_subs_to_pull = 0;
+               m_prev_decoder_time = -1;
                m_subtitle_pages.clear();
        }
 
@@ -1625,6 +2121,9 @@ RESULT eServiceMP3::enableSubtitles(eWidget *parent, ePyObject tuple)
        g_object_get (G_OBJECT (m_gst_playbin), "current-text", &text_pid, NULL);
 
        eDebug ("eServiceMP3::switched to subtitle stream %i", text_pid);
+//     gst_pad_remove_buffer_probe (pad, subprobe_handler_id);
+
+       m_event((iPlayableService*)this, evUpdatedInfo);
 
        return 0;
 
@@ -1651,26 +2150,25 @@ PyObject *eServiceMP3::getCachedSubtitle()
 
 PyObject *eServiceMP3::getSubtitleList()
 {
-       eDebug("eServiceMP3::getSubtitleList");
-
+//     eDebug("eServiceMP3::getSubtitleList");
        ePyObject l = PyList_New(0);
-       int stream_count[sizeof(subtype_t)];
-       for ( unsigned int i = 0; i < sizeof(subtype_t); i++ )
-               stream_count[i] = 0;
-
+       int stream_idx = 0;
+       
        for (std::vector<subtitleStream>::iterator IterSubtitleStream(m_subtitleStreams.begin()); IterSubtitleStream != m_subtitleStreams.end(); ++IterSubtitleStream)
        {
                subtype_t type = IterSubtitleStream->type;
                ePyObject tuple = PyTuple_New(5);
+//             eDebug("eServiceMP3::getSubtitleList idx=%i type=%i, code=%s", stream_idx, int(type), (IterSubtitleStream->language_code).c_str());
                PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(2));
-               PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(stream_count[type]));
+               PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(stream_idx));
                PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong(int(type)));
                PyTuple_SET_ITEM(tuple, 3, PyInt_FromLong(0));
                PyTuple_SET_ITEM(tuple, 4, PyString_FromString((IterSubtitleStream->language_code).c_str()));
                PyList_Append(l, tuple);
                Py_DECREF(tuple);
-               stream_count[type]++;
+               stream_idx++;
        }
+       eDebug("eServiceMP3::getSubtitleList finished");
        return l;
 }
 
index b864a10..173084d 100644 (file)
@@ -46,7 +46,7 @@ public:
 typedef struct _GstElement GstElement;
 
 typedef enum { atUnknown, atMPEG, atMP3, atAC3, atDTS, atAAC, atPCM, atOGG, atFLAC } audiotype_t;
-typedef enum { stPlainText, stSSA, stSRT } subtype_t;
+typedef enum { stUnknown, stPlainText, stSSA, stASS, stSRT, stVOB, stPGS } subtype_t;
 typedef enum { ctNone, ctMPEGTS, ctMPEGPS, ctMKV, ctAVI, ctMP4, ctVCD, ctCDA } containertype_t;
 
 class eServiceMP3: public iPlayableService, public iPauseableService,
@@ -197,24 +197,74 @@ private:
        };
        int m_state;
        GstElement *m_gst_playbin;
+       GstElement *m_gst_subtitlebin;
        GstTagList *m_stream_tags;
-       eFixedMessagePump<int> m_pump;
+
+       struct Message
+       {
+               Message()
+                       :type(-1)
+               {}
+               Message(int type)
+                       :type(type)
+               {}
+               Message(int type, GstPad *pad)
+                       :type(type)
+               {
+                       d.pad=pad;
+               }
+
+               int type;
+               union {
+                       GstPad *pad; // for msg type 3
+               } d;
+       };
+
+       eFixedMessagePump<Message> m_pump;
        std::string m_error_message;
 
        audiotype_t gstCheckAudioPad(GstStructure* structure);
        void gstBusCall(GstBus *bus, GstMessage *msg);
        static GstBusSyncReply gstBusSyncHandler(GstBus *bus, GstMessage *message, gpointer user_data);
-       static void gstCBsubtitleAvail(GstElement *element, gpointer user_data);
-       GstPad* gstCreateSubtitleSink(eServiceMP3* _this, subtype_t type);
-       void gstPoll(const int&);
        static void gstHTTPSourceSetAgent(GObject *source, GParamSpec *unused, gpointer user_data);
+       static void gstCBsubtitleAvail(GstElement *element, gpointer user_data);
+       static GstCaps* gstGhostpadGetCAPS (GstPad * pad);
+       static gboolean gstGhostpadAcceptCAPS(GstPad * pad, GstCaps * caps);
+       static void gstGhostpadLink(gpointer user_data, GstCaps * caps);
+       static GstFlowReturn gstGhostpadBufferAlloc(GstPad *pad, guint64 offset, guint size, GstCaps *caps, GstBuffer **buf);
+       static void gstGhostpadHasCAPS(GstPad *pad, GParamSpec * unused, gpointer user_data);
+       static gboolean gstGhostpadSinkEvent(GstPad * pad, GstEvent * event);
+       static GstFlowReturn gstGhostpadChainFunction(GstPad * pad, GstBuffer * buffer);
+/*     static void gstCBsubtitleCAPS(GObject *obj, GParamSpec *pspec, gpointer user_data);
+       static void gstCBsubtitleLink(subtype_t type, gpointer user_data);
+       static gboolean gstCBsubtitleDrop(GstPad *pad, GstBuffer *buffer, gpointer user_data);*/
+       void gstPoll(const Message&);
+       void gstGhostpadHasCAPS_synced(GstPad *pad);
+
+       GstPadBufferAllocFunction m_ghost_pad_buffer_alloc;
+       GstPadChainFunction m_ghost_pad_chain_function;
+       GstPadEventFunction m_ghost_pad_subtitle_sink_event;
+       GstCaps *m_gst_prev_subtitle_caps;
+       GstSegment m_gst_subtitle_segment;
+       GstPadEventFunction m_gst_sink_event;
 
-       std::list<ePangoSubtitlePage> m_subtitle_pages;
+       struct SubtitlePage
+       {
+               enum { Unknown, Pango, Vob } type;
+               ePangoSubtitlePage pango_page;
+               eVobSubtitlePage vob_page;
+       };
+
+       std::list<SubtitlePage> m_subtitle_pages;
        ePtr<eTimer> m_subtitle_sync_timer;
-       
+       ePtr<eTimer> m_subtitle_hide_timer;
        ePtr<eTimer> m_streamingsrc_timeout;
+       pts_t m_prev_decoder_time;
+       int m_decoder_time_valid_state;
+
        void pushSubtitles();
        void pullSubtitle();
+       void hideSubtitles();
        void sourceTimeout();
        int m_subs_to_pull;
        sourceStream m_sourceinfo;
index 0ed4d71..c4513e9 100644 (file)
@@ -64,17 +64,17 @@ ENIGMA2_DATE = `$(GIT) log --no-color -n 1 --pretty=format:%cd --date=short`
 ENIGMA2_BRANCH = `$(GIT) branch --no-color 2>/dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
 ENIGMA2_REV = `$(GIT) describe --abbrev=7 --always --long --tags`
 endif
+endif
 
 BUILT_SOURCES = version-intermediate.h
 .INTERMEDIATE: version-intermediate.h
 .PHONY: version-intermediate.h
 version-intermediate.h:
        $(AM_V_GEN)touch $@
-       $(AM_V_at)[ -n "$(ENIGMA2_DATE)" ] && echo "#define ENIGMA2_LAST_CHANGE_DATE \"$(ENIGMA2_DATE)\"" >> $@
-       $(AM_V_at)[ -n "$(ENIGMA2_BRANCH)" ] && echo "#define ENIGMA2_BRANCH \"$(ENIGMA2_BRANCH)\"" >> $@
+       -$(AM_V_at)[ -n "$(ENIGMA2_DATE)" ] && echo "#define ENIGMA2_LAST_CHANGE_DATE \"$(ENIGMA2_DATE)\"" >> $@
+       -$(AM_V_at)[ -n "$(ENIGMA2_BRANCH)" ] && echo "#define ENIGMA2_BRANCH \"$(ENIGMA2_BRANCH)\"" >> $@
        -$(AM_V_at)[ -n "$(ENIGMA2_REV)" ] && echo "#define ENIGMA2_REV \"$(ENIGMA2_REV)\"" >> $@
        $(AM_V_at)([ -f version.h ] && diff -q version.h $@ >/dev/null) || $(INSTALL_HEADER) $@ version.h
-endif
 
 enigma2$(EXEEXT): $(enigma2_OBJECTS) $(enigma2_DEPENDENCIES) $(enigma2_LDADD_WHOLE)
        $(AM_V_CXXLD)$(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ $(enigma2_LDFLAGS) $(enigma2_OBJECTS) \
index f76283e..5b01c7c 100644 (file)
@@ -183,6 +183,7 @@ void bsodFatal(const char *component)
                xml.open("image");
                xml.stringFromFile("dreamboxmodel", "/proc/stb/info/model");
                xml.stringFromFile("kernelcmdline", "/proc/cmdline");
+               xml.stringFromFile("nimsockets", "/proc/bus/nim_sockets");
                if (!getConfigBool("config.plugins.crashlogautosubmit.sendAnonCrashlog", true)) {
                        xml.cDataFromFile("dreamboxca", "/proc/stb/info/ca");
                        xml.cDataFromFile("enigma2settings", eEnv::resolve("${sysconfdir}/enigma2/settings"), ".password=");
index caa73de..a4d855f 100755 (executable)
--- a/po/et.po
+++ b/po/et.po
@@ -7,8 +7,8 @@ msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2010-11-01 13:01+0000\n"
-"PO-Revision-Date: 2010-11-15 11:49+0200\n"
-"Last-Translator: Mladen <acid-burn@opendreambox.org>\n"
+"PO-Revision-Date: 2010-12-02 19:12+0200\n"
+"Last-Translator: Arvo <arvo@softshark.ee>\n"
 "Language-Team: none\n"
 "Language: et\n"
 "MIME-Version: 1.0\n"
@@ -57,15 +57,14 @@ msgid ""
 "Online update of your Dreambox software."
 msgstr ""
 "\n"
-"Uuendab vastuvõtja tarkvara"
+"Uuendab vastuvõtja tarkvara."
 
-#
 msgid ""
 "\n"
 "Press OK on your remote control to continue."
 msgstr ""
 "\n"
-"Jätkamiseks vajuta OK"
+"Jätkamiseks vajuta OK."
 
 #
 msgid ""
@@ -99,7 +98,6 @@ msgstr ""
 "\n"
 "Otsi kohalike laiendusi ja installi need."
 
-#
 msgid ""
 "\n"
 "Select your backup device.\n"
@@ -132,16 +130,14 @@ msgid " Results"
 msgstr " Tulemused"
 
 msgid " extensions."
-msgstr " Laiendused"
+msgstr " laiendused."
 
 msgid " ms"
-msgstr ""
+msgstr " ms"
 
-#
 msgid " packages selected."
-msgstr " paketti valitud"
+msgstr " paketti valitud."
 
-#
 msgid " updates available."
 msgstr " uuendust saadaval."
 
@@ -149,45 +145,43 @@ msgid " wireless networks found!"
 msgstr " WiFi võrku leitud!"
 
 msgid "#000000"
-msgstr ""
+msgstr "#000000"
 
 msgid "#0064c7"
-msgstr ""
+msgstr "#0064c7"
 
 msgid "#25062748"
-msgstr ""
+msgstr "#25062748"
 
 msgid "#389416"
-msgstr ""
+msgstr "#389416"
 
 msgid "#80000000"
-msgstr ""
+msgstr "#80000000"
 
 msgid "#80ffffff"
-msgstr ""
+msgstr "#80ffffff"
 
 msgid "#bab329"
-msgstr ""
+msgstr "#bab329"
 
 msgid "#f23d21"
-msgstr ""
+msgstr "#f23d21"
 
 msgid "#ffffff"
-msgstr ""
+msgstr "#ffffff"
 
 msgid "#ffffffff"
-msgstr ""
+msgstr "#ffffffff"
 
 #
 msgid "%H:%M"
 msgstr "%H:%M"
 
-#
 #, python-format
 msgid "%d jobs are running in the background!"
-msgstr "%d protsessi käib taustal"
+msgstr "%d protsessi käib tausta!"
 
-#
 #, python-format
 msgid "%d min"
 msgstr "%d min"
@@ -197,11 +191,9 @@ msgstr "%d min"
 msgid "%d services found!"
 msgstr "%d kanalit leitud!"
 
-#
 msgid "%d.%B %Y"
 msgstr "%d.%B %Y"
 
-#
 #, python-format
 msgid "%i ms"
 msgstr "%i ms"
@@ -215,7 +207,6 @@ msgstr ""
 "%s\n"
 "(%s, %d MB vaba)"
 
-#
 #, python-format
 msgid "%s (%s)\n"
 msgstr "%s (%s)\n"
@@ -227,13 +218,11 @@ msgstr "(Ainult kanalivahetus)"
 msgid "(empty)"
 msgstr "(tühi)"
 
-#
 msgid "(show optional DVD audio menu)"
-msgstr "Näita DVD valikulist audio-menüüd"
+msgstr "(näita DVD valikulist audio-menüüd)"
 
-#
 msgid "* Only available if more than one interface is active."
-msgstr "* Enam kui ühe aktiivse liidese puhul"
+msgstr "* Enam kui ühe aktiivse liidese puhul."
 
 #
 msgid "0"
@@ -270,11 +259,9 @@ msgstr "13 V"
 msgid "16:10"
 msgstr "16:10"
 
-#
 msgid "16:10 Letterbox"
 msgstr "16:10 Letterbox"
 
-#
 msgid "16:10 PanScan"
 msgstr "16:10 PanScan"
 
@@ -282,7 +269,6 @@ msgstr "16:10 PanScan"
 msgid "16:9"
 msgstr "16:9"
 
-#
 msgid "16:9 Letterbox"
 msgstr "16:9 Letterbox"
 
@@ -314,11 +300,9 @@ msgstr "4"
 msgid "4:3"
 msgstr "4:3"
 
-#
 msgid "4:3 Letterbox"
 msgstr "4:3 Letterbox"
 
-#
 msgid "4:3 PanScan"
 msgstr "4:3 PanScan"
 
@@ -375,16 +359,16 @@ msgid "A"
 msgstr "A"
 
 msgid "A BackToTheRoots-Skin .. or good old times."
-msgstr "BackToTheRoots välimus.. või vanad head ajad"
+msgstr "BackToTheRoots välimus.. või vanad head ajad."
 
 msgid "A BackToTheRoots-Skin ... or good old times."
-msgstr "BackToTheRoots välimus... või vanad head ajad"
+msgstr "BackToTheRoots välimus... või vanad head ajad."
 
 msgid "A basic ftp client"
 msgstr "Põhi-ftp klient"
 
 msgid "A client for www.dyndns.org"
-msgstr "Dyndns.org klient"
+msgstr "www.dyndns.org klient"
 
 #, python-format
 msgid ""
@@ -395,9 +379,8 @@ msgstr ""
 "Kas tahad säilitada oma versiooni?"
 
 msgid "A demo plugin for TPM usage."
-msgstr "Demo laiendus TPM kasutamiseks"
+msgstr "Demo laiendus TPM kasutamiseks."
 
-#
 msgid ""
 "A finished record timer wants to set your\n"
 "Dreambox to standby. Do that now?"
@@ -435,7 +418,7 @@ msgid "A nice looking HD skin from Kerni"
 msgstr "Ilus Kerni HD välimus"
 
 msgid "A nice looking HD skin in Brushed Alu Design from Kerni."
-msgstr "Ilus HD välimus \"Brushed Alu\" tehtud Kerni poolt."
+msgstr "Ilus HD välimus Brushed Alu tehtud Kerni poolt."
 
 msgid "A nice looking skin from Kerni"
 msgstr "Kena välimus Kernilt"
@@ -457,30 +440,25 @@ msgstr ""
 "Hetkel salvestatakse.\n"
 "Mida soovid teha?"
 
-#
 msgid ""
 "A recording is currently running. Please stop the recording before trying to "
 "configure the positioner."
 msgstr ""
-"Hetkel salvestatakse. Peata salvestus\n"
-"enne kui üritad muuta positsioneeri sätteid."
+"Hetkel salvestatakse. Peata salvestus enne kui üritad muuta positsioneeri "
+"sätteid."
 
-#
 msgid ""
 "A recording is currently running. Please stop the recording before trying to "
 "start the satfinder."
 msgstr ""
-"Hetkel salvestatakse. Peata salvestus\n"
-"enne kui käivitad satelliidi otsimise."
+"Hetkel salvestatakse. Peata salvestus enne kui käivitad satelliidi otsimise."
 
-#
 #, python-format
 msgid "A required tool (%s) was not found."
-msgstr "Ei leidnud (%s) vajaliku tööriista"
+msgstr "Ei leidnud (%s) vajaliku tööriista."
 
-#
 msgid "A search for available updates is currently in progress."
-msgstr "Otsime uuendusi..."
+msgstr "Otsime uuendusi."
 
 #
 msgid ""
@@ -495,7 +473,6 @@ msgstr ""
 msgid "A simple downloading application for other plugins"
 msgstr "Lihtne programm ülejäänud laienduste allalaadimiseks"
 
-#
 msgid ""
 "A sleep timer wants to set your\n"
 "Dreambox to standby. Do that now?"
@@ -511,9 +488,8 @@ msgstr ""
 "Unetimer soovib vastuvõtja välja\n"
 "lülitada. Kas lülitab?"
 
-#
 msgid "A small overview of the available icon states and actions."
-msgstr "Kasutatavate ikoonide seisundite ja tegevuste lühiülevaade "
+msgstr "Kasutatavate ikoonide seisundite ja tegevuste lühiülevaade."
 
 #
 msgid ""
@@ -553,9 +529,8 @@ msgstr "Katkesta seadistusabi."
 msgid "About"
 msgstr "Süstemiinfo"
 
-#
 msgid "About..."
-msgstr "Süsteemiinfo"
+msgstr "Süsteemiinfo..."
 
 msgid "Access to the ARD-Mediathek"
 msgstr "Juurdepääs ARD-Mediathek-le"
@@ -658,19 +633,17 @@ msgid "Add zap timer instead of record timer?"
 msgstr "Lisan zap taimer savestustimeri asemel?"
 
 msgid "Added: "
-msgstr "Lisatud:"
+msgstr "Lisatud: "
 
-#
 msgid ""
 "Adds enigma2 settings and dreambox model informations like SN, rev... if "
 "enabled."
 msgstr ""
 "Lisab enigma2 seaded ja vastuvõtja mudeli info, nagu SN ... jne. kui on "
-"lubatud"
+"lubatud."
 
-#
 msgid "Adds network configuration if enabled."
-msgstr "Lisab võrgu seadistuse, kui on lubatud"
+msgstr "Lisab võrgu seadistuse, kui on lubatud."
 
 #
 msgid "Adds wlan configuration if enabled."
@@ -692,7 +665,7 @@ msgid "Adult streaming plugin"
 msgstr "Täiskasvanute voogesitus laiendus"
 
 msgid "Adult streaming plugin."
-msgstr "Täiskasvanute voogesitus laiendus"
+msgstr "Täiskasvanute voogesitus laiendus."
 
 #
 msgid "Advanced Options"
@@ -740,7 +713,6 @@ msgstr ""
 msgid "Ai.HD skin-style control plugin"
 msgstr "Ai.HD välimuse-stiili muutmise laiendus"
 
-#
 msgid "Album"
 msgstr "Album"
 
@@ -762,7 +734,7 @@ msgid "Allow zapping via Webinterface"
 msgstr "Luba zap veebiliidesest"
 
 msgid "Allows the execution of TuxboxPlugins."
-msgstr "lubab  \"TuxboxPlugins\" käivituse."
+msgstr "Lubab TuxboxPluginate käivituse."
 
 msgid "Allows user to download files from rapidshare in the background."
 msgstr "Lubab laadida rapidshare faile alla taustal."
@@ -775,7 +747,6 @@ msgstr "Alfa"
 msgid "Alternative radio mode"
 msgstr "Alternatiivne raadiorežiim"
 
-#
 msgid "Alternative services tuner priority"
 msgstr "Tüüneri prioriteet"
 
@@ -789,20 +760,17 @@ msgstr "Küsi alati enne saatmist"
 msgid "Ammount of recordings left"
 msgstr "Järelejäänud salvestuste arv"
 
-#
 msgid "An empty filename is illegal."
-msgstr "Tühi failinimi ei ole lubatud"
+msgstr "Tühi failinimi ei ole lubatud."
 
 msgid "An error occured."
-msgstr "Leidis aset viga"
+msgstr "Leidis aset viga."
 
-#
 msgid "An unknown error occured!"
-msgstr "Tundmatu viga"
+msgstr "Tundmatu viga!"
 
-#
 msgid "Anonymize crashlog?"
-msgstr "Muuda vealogi nimetuks"
+msgstr "Muuda vealogi nimetuks?"
 
 #
 msgid "Arabic"
@@ -816,12 +784,11 @@ msgstr ""
 "Kas tahad kindlasti uuesti käivitada võrguadapterit?\n"
 "\n"
 
-#
 msgid ""
 "Are you sure you want to delete\n"
 "following backup:\n"
 msgstr ""
-"kas soovid taastada\n"
+"Kas soovid taastada\n"
 "seda varukoopiat:\n"
 
 #
@@ -836,12 +803,11 @@ msgstr ""
 "Kas tahad kindlasti uuesti käivitada võrguadapterit?\n"
 "\n"
 
-#
 msgid ""
 "Are you sure you want to restore\n"
 "following backup:\n"
 msgstr ""
-"kas soovid taastada\n"
+"Kas soovid taastada\n"
 "seda varukoopiat:\n"
 
 #
@@ -889,9 +855,8 @@ msgstr "Atheros"
 msgid "Audio"
 msgstr "Heli"
 
-#
 msgid "Audio Options..."
-msgstr "Helisätted"
+msgstr "Helisätted..."
 
 msgid "Audio Sync"
 msgstr "Heli sünkroniseerimine"
@@ -910,11 +875,9 @@ msgstr ""
 msgid "Australia"
 msgstr "Austraalia"
 
-#
 msgid "Author: "
-msgstr "Automaatne"
+msgstr "Autor: "
 
-#
 msgid "Authoring mode"
 msgstr "Autoriseerimismoodus"
 
@@ -926,9 +889,8 @@ msgstr "Automaatne"
 msgid "Auto chapter split every ? minutes (0=never)"
 msgstr "Automaatne kaadri lõikamine iga ? minuti (0=mitte kunagi)"
 
-#
 msgid "Auto flesh"
-msgstr "OMA LIHA :)"
+msgstr ""
 
 #
 msgid "Auto scart switching"
@@ -976,13 +938,14 @@ msgstr "Automaatselt muuda video resolutsiooni"
 msgid ""
 "Automatically changes the output resolution depending on the video "
 "resolution you are watching."
-msgstr "Muudab väljundi eraldust vastavalt selle video eraldusele, mida vaatad"
+msgstr ""
+"Muudab väljundi eraldust vastavalt selle video eraldusele, mida vaatad."
 
 msgid "Automatically create timer events based on keywords"
 msgstr "Tekitab salvestuse ajad võtmesõnadele tuginedes"
 
 msgid "Automatically informs you on low internal memory"
-msgstr "Teavitab Sind vähese sisemälu  korral"
+msgstr "Teavitab Sind vähese sisemälu korral"
 
 msgid "Automatically refresh EPG"
 msgstr "Värskenda automaatselt EPG-d"
@@ -1058,9 +1021,8 @@ msgstr "Sagedusala"
 msgid "Bandwidth"
 msgstr "Ribalaius"
 
-#
 msgid "Begin of \"after event\" timespan"
-msgstr "Begin of \"after event\" timespan"
+msgstr ""
 
 #
 msgid "Begin of timespan"
@@ -1090,7 +1052,6 @@ msgstr "Tegevus kui taasesitus on peatatud"
 msgid "Behavior when a movie reaches the end"
 msgstr "Tegevus kui salvestus jõuab lõpule"
 
-#
 msgid "Bitrate:"
 msgstr "Bitrate:"
 
@@ -1105,15 +1066,14 @@ msgid "Bonjour/Avahi control plugin"
 msgstr "Bonjour/Avahi seadelisandus"
 
 msgid "Bonjour/Avahi control plugin."
-msgstr "Bonjour/Avahi seadelisandus"
+msgstr "Bonjour/Avahi seadelisandus."
 
 #
 msgid "Bookmarks"
 msgstr "Lemmikud"
 
-#
 msgid "Bouquets"
-msgstr "favoriit kaustad"
+msgstr "Favoriit kaustad"
 
 #
 msgid "Brazil"
@@ -1127,7 +1087,7 @@ msgid "Browse for and connect to network shares"
 msgstr "Otsi ja ühenda võrguosalustega"
 
 msgid "Browse for nfs/cifs shares and connect to them."
-msgstr "Otsi NFS/CIFS osalusi ja ja ühenda nendega"
+msgstr "Otsi NFS/CIFS osalusi ja ühenda nendega."
 
 #
 msgid "Browse network neighbourhood"
@@ -1147,9 +1107,8 @@ msgstr "Kirjuta DVD-le"
 msgid "Burn your recordings to DVD"
 msgstr "Kirjuta salvestused DVD-le"
 
-#
 msgid "Bus: "
-msgstr "Siin:"
+msgstr "Siin: "
 
 #
 msgid ""
@@ -1173,7 +1132,7 @@ msgid ""
 "playing Audio CDs in Mediaplayer."
 msgstr ""
 "CDInfo võimaldab albumi ja loo andmete kogumist CDDB ja CD-Text põhjal, kui "
-"AudioCD-d mängivad Mediaplayeris"
+"AudioCD-d mängivad Mediaplayeris."
 
 #
 msgid "CI assignment"
@@ -1183,11 +1142,9 @@ msgstr "CI määrangud"
 msgid "CIFS share"
 msgstr "CIFS võrgukoht"
 
-#
 msgid "CVBS"
 msgstr "Komposiit (CVBS)"
 
-#
 msgid "Cable"
 msgstr "Kaabel (DVB-C)"
 
@@ -1212,9 +1169,8 @@ msgstr "Kanada"
 msgid "Cancel"
 msgstr "Tühista"
 
-#
 msgid "Capacity: "
-msgstr "Maht:"
+msgstr "Maht: "
 
 #
 msgid "Card"
@@ -1264,7 +1220,7 @@ msgid "Change the hostname of your Dreambox."
 msgstr "Muuda oma tuuneri nime"
 
 msgid "Changelog"
-msgstr " Muudatuste logi"
+msgstr "Muudatuste logi"
 
 #
 msgid "Channel"
@@ -1277,9 +1233,8 @@ msgstr "Kanalite valik"
 msgid "Channel audio:"
 msgstr "Helikanal:"
 
-#
 msgid "Channel not in services list"
-msgstr "Vaheta kanali koodid"
+msgstr "Kanal pole teenuste nimekirjas"
 
 #
 msgid "Channel:"
@@ -1312,15 +1267,12 @@ msgstr "Kontrolli"
 msgid "Checking Filesystem..."
 msgstr "Kontrollin failisüsteemi"
 
-#
 msgid "Choose Tuner"
 msgstr "Vali tüüner"
 
-#
 msgid "Choose a wireless network"
-msgstr "Vali WiFi võrk "
+msgstr "Vali WiFi võrk"
 
-#
 msgid "Choose backup files"
 msgstr "Vali failid"
 
@@ -1335,11 +1287,9 @@ msgstr "Vali nimekiri"
 msgid "Choose image to download"
 msgstr "Vali tarkvara allalaadimiseks"
 
-#
 msgid "Choose target folder"
 msgstr "Vali kataloog"
 
-#
 msgid "Choose upgrade source"
 msgstr "Vali allikas"
 
@@ -1347,17 +1297,14 @@ msgstr "Vali allikas"
 msgid "Choose your Skin"
 msgstr "Vali uus Välimus"
 
-#
 msgid "Circular left"
-msgstr "ringpolarisatsioon vasak"
+msgstr "Ringpolarisatsioon vasak"
 
-#
 msgid "Circular right"
-msgstr "ringpolarisatsioon parem"
+msgstr "Ringpolarisatsioon parem"
 
-#
 msgid "Classic"
-msgstr "klassikaline"
+msgstr "Classikaline"
 
 #
 msgid "Cleanup"
@@ -1406,21 +1353,17 @@ msgstr "Sulge ja salvesta muudatused"
 msgid "Close title selection"
 msgstr "Sulge pealkirja valik"
 
-#
 msgid "Code rate high"
-msgstr "Code rate (kõrge)"
+msgstr "Code rate ülemine"
 
-#
 msgid "Code rate low"
-msgstr "Code rate (madal)"
+msgstr "Code rate alumine"
 
-#
 msgid "Coderate HP"
-msgstr "Code rate (HP)"
+msgstr "Coderate HP"
 
-#
 msgid "Coderate LP"
-msgstr "Code rate (LP)"
+msgstr "Coderate LP"
 
 #
 msgid "Collection name"
@@ -1462,15 +1405,13 @@ msgstr "CI määrangud"
 msgid "CommonInterface"
 msgstr "CI liides"
 
-#
 msgid "Communication"
-msgstr "Salvestuskoht"
+msgstr "Suhtlus"
 
 #
 msgid "Compact Flash"
 msgstr "CompactFlash"
 
-#
 msgid "Complete"
 msgstr "Valmis"
 
@@ -1538,9 +1479,8 @@ msgstr "Ühendatud"
 msgid "Connected!"
 msgstr "Ühendatud"
 
-#
 msgid "Constellation"
-msgstr "konstellatsioon"
+msgstr "Konstellatsioon"
 
 #
 msgid "Content does not fit on DVD!"
@@ -1677,15 +1617,14 @@ msgid "Current Transponder"
 msgstr "Hetke transponder"
 
 msgid "Current device: "
-msgstr "Praegune seade:"
+msgstr "Praegune seade: "
 
 #
 msgid "Current settings:"
 msgstr "Hetke sätted"
 
-#
 msgid "Current value: "
-msgstr "Praegune väärtus:"
+msgstr "Praegune väärtus: "
 
 #
 msgid "Current version:"
@@ -1753,9 +1692,8 @@ msgstr ""
 "lõiget'.\n"
 "Siis leia lõpp, vajuta OK, vali 'lõpeta lõige'. TEHTUD!"
 
-#
 msgid "Cutlist editor..."
-msgstr "Määra lõikekohad"
+msgstr "Määra lõikekohad..."
 
 #
 msgid "Czech"
@@ -1792,16 +1730,15 @@ msgstr "DVD failibrauser"
 msgid "DVD Player"
 msgstr "DVD-mängija"
 
-#
 msgid "DVD Titlelist"
-msgstr "DVD nimekiri "
+msgstr "DVD nimekiri"
 
 #
 msgid "DVD media toolbox"
 msgstr "DVD Tööriistad"
 
 msgid "DVDPlayer plays your DVDs on your Dreambox"
-msgstr "DVDPlayer näitab su DVDsid  su tuuneris"
+msgstr "DVDPlayer näitab su DVDsid su tuuneris"
 
 msgid ""
 "DVDPlayer plays your DVDs on your Dreambox.\n"
@@ -1851,11 +1788,9 @@ msgstr "Vaikimisi"
 msgid "Default Settings"
 msgstr "Vaikimisi sätted"
 
-#
 msgid "Default movie location"
 msgstr "Vaikimisi filmi asukoht"
 
-#
 msgid "Default services lists"
 msgstr "Vaikimisi teenuste nimekiri"
 
@@ -1863,7 +1798,7 @@ msgid "Defaults"
 msgstr "Vaikimisi"
 
 msgid "Define a startup service"
-msgstr "Määra  alguskanal"
+msgstr "Määra alguskanal"
 
 msgid "Define a startup service for your Dreambox."
 msgstr "Määra alguskanal oma tuuneri jaoks."
@@ -1913,24 +1848,20 @@ msgid "Deselect"
 msgstr "Tühista valik"
 
 msgid "Details for plugin: "
-msgstr "Laienduse detailid:"
+msgstr "Laienduse detailid: "
 
 msgid "Detected HDD:"
 msgstr "Leitud kõvaketas:"
 
-#
 msgid "Detected NIMs:"
 msgstr "Leitud tüünerid:"
 
-#
 msgid "DiSEqC"
 msgstr "DiSEqC"
 
-#
 msgid "DiSEqC A/B"
 msgstr "DiSEqC A/B"
 
-#
 msgid "DiSEqC A/B/C/D"
 msgstr "DiSEqC A/B/C/D"
 
@@ -1950,9 +1881,8 @@ msgstr "DiSEqC-Tester seaded"
 msgid "Dialing:"
 msgstr "Valin numbrit:"
 
-#
 msgid "Digital contour removal"
-msgstr "Digitaalne korduse kõrvaldamine "
+msgstr "Digitaalne korduse kõrvaldamine"
 
 msgid "Dir:"
 msgstr "Kaust:"
@@ -1960,9 +1890,8 @@ msgstr "Kaust:"
 msgid "Direct playback of Youtube videos"
 msgstr "Youtube videote kohene taasesitus"
 
-#
 msgid "Direct playback of linked titles without menu"
-msgstr "Lingitud salvestuste kohene esitus ilma menüüta "
+msgstr "Lingitud salvestuste kohene esitus ilma menüüta"
 
 #
 #, python-format
@@ -1981,9 +1910,8 @@ msgstr "Keela"
 msgid "Disable Picture in Picture"
 msgstr "Sulge pilt-pildis"
 
-#
 msgid "Disable crashlog reporting"
-msgstr "Keela vealogie saatmine"
+msgstr "Keela vealogide saatmine"
 
 #
 msgid "Disable timer"
@@ -2042,7 +1970,7 @@ msgid ""
 "the plugin \"%s\"?"
 msgstr ""
 "Kas soovid kindlasti eemaldada\n"
-"laiendust \"%s\"? "
+"laiendust \"%s\"?"
 
 #
 msgid ""
@@ -2057,14 +1985,13 @@ msgstr ""
 msgid "Do you really want to delete %s?"
 msgstr "Kas soovid kindlasti kustutada %s?"
 
-#
 #, python-format
 msgid ""
 "Do you really want to download\n"
 "the plugin \"%s\"?"
 msgstr ""
 "Kas soovid kindlasti laadida\n"
-"seda laiendust \"%s\"? "
+"seda laiendust \"%s\"?"
 
 msgid "Do you really want to exit?"
 msgstr "Kas tõesti soovid väljuda?"
@@ -2101,7 +2028,7 @@ msgstr "Kas soovid uut käsiotsingut teha?"
 
 #, python-format
 msgid "Do you want to download the image to %s ?"
-msgstr "Kas soovid image alla laadida %s? "
+msgstr "Kas soovid image alla laadida %s?"
 
 #
 msgid "Do you want to enable the parental control feature on your dreambox?"
@@ -2123,7 +2050,7 @@ msgid "Do you want to play DVD in drive?"
 msgstr "Soovid panna DVD mängima?"
 
 msgid "Do you want to preview this DVD before burning?"
-msgstr "Soovid plaadi eelvaadet ka, enne kirjutamise alustamist? "
+msgstr "Soovid plaadi eelvaadet ka, enne kirjutamise alustamist?"
 
 #
 msgid "Do you want to reboot your Dreambox?"
@@ -2137,11 +2064,8 @@ msgstr "Kas tahad kustutada paketti:\n"
 msgid "Do you want to restore your settings?"
 msgstr "Kas soovid taastada oma sätted?"
 
-#
 msgid "Do you want to resume this playback?"
-msgstr ""
-"Kas soovid jätkata\n"
-"vaatamist katkestatud kohalt?"
+msgstr "Kas soovid jätkata vaatamist katkestatud kohalt?"
 
 msgid "Do you want to see more entries?"
 msgstr "Kas soovid näha veel ridu?"
@@ -2182,10 +2106,9 @@ msgstr "Ära küsi, saada ära"
 msgid "Don't stop current event but disable coming events"
 msgstr "Ära peata toimuvat salvestust, aga keela tulevad"
 
-#
 #, python-format
 msgid "Done - Installed or upgraded %d packages"
-msgstr "Valmis - installitud või uuendatud %d "
+msgstr "Valmis - installitud või uuendatud %d"
 
 #
 #, python-format
@@ -2217,9 +2140,8 @@ msgstr "Lae faile Rapidsharest"
 msgid "Download location"
 msgstr "Allalaadimise koht"
 
-#
 msgid "Downloadable new plugins"
-msgstr "Allalaetavad uued laiendused "
+msgstr "Allalaetavad uued laiendused"
 
 #
 msgid "Downloadable plugins"
@@ -2240,12 +2162,11 @@ msgstr "Laadin eelvaadet. Palun oodake ..."
 msgid "Dreambox format data DVD (HDTV compatible)"
 msgstr "Vastuvõtja formaadib data DVD-d"
 
-#
 msgid "Dreambox software because updates are available."
-msgstr "vastuvõtja tarkvara, sest uuendused on saadaval"
+msgstr "Vastuvõtja tarkvara, sest uuendused on saadaval"
 
 msgid "Duration: "
-msgstr "Kestus:"
+msgstr "Kestus: "
 
 #
 msgid "Dutch"
@@ -2432,9 +2353,8 @@ msgstr ""
 "Kodeeringut kasutatakse EPG andmetes. Seda vaja muuta ainult kui soovite "
 "täpitähti õieti näha."
 
-#
 msgid "Encrypted: "
-msgstr "Kodeeritud:"
+msgstr "Kodeeritud: "
 
 #
 msgid "Encryption"
@@ -2464,11 +2384,9 @@ msgstr "\"pärast sündmust\" ajavahemiku lõpp"
 msgid "End of timespan"
 msgstr "Ajavahemiku lõpp"
 
-#
 msgid "End time"
 msgstr "Lõpetamise aeg"
 
-#
 msgid "EndTime"
 msgstr "Lõpetamise aeg"
 
@@ -2481,7 +2399,7 @@ msgid ""
 "Needs a running VLC from www.videolan.org on your pc."
 msgstr ""
 "Enigma2 lisa AVI/DIVX/WMV/jne. PC-st tulevate videote mängimiseks "
-"vastuvõtjas. Vajab arvutis töötavat VLC programmi (www.videolan.org)"
+"vastuvõtjas. Vajab arvutis töötavat VLC programmi www.videolan.org -st"
 
 msgid ""
 "Enigma2 Skinselector\n"
@@ -2521,7 +2439,7 @@ msgid "Enter options:"
 msgstr "Sisesta valikud:"
 
 msgid "Enter password:"
-msgstr "Sisesta parool"
+msgstr "Sisesta parool:"
 
 msgid "Enter pin code"
 msgstr "Sisesta pin kood"
@@ -2539,17 +2457,16 @@ msgid "Enter the service pin"
 msgstr "Sisesta kood"
 
 msgid "Enter user and password for host: "
-msgstr "Sisesta kasutajanimi ja parool seadmele:"
+msgstr "Sisesta kasutajanimi ja parool seadmele: "
 
 msgid "Enter username:"
 msgstr "Sisesta kasutajanimi:"
 
-#
 msgid "Enter your email address so that we can contact you if needed."
-msgstr "Sisesta oma emaili aadress, et saaksime vajadusel ühendust võtta"
+msgstr "Sisesta oma emaili aadress, et saaksime vajadusel ühendust võtta."
 
 msgid "Enter your search term(s)"
-msgstr "Sisesta otsingu tingimused:"
+msgstr "Sisesta otsingu tingimus(ed)"
 
 #
 msgid "Entertainment"
@@ -2588,7 +2505,7 @@ msgid "Exact match"
 msgstr "Täpne vaste"
 
 msgid "Exceeds dual layer medium!"
-msgstr "liiga suur kahekihilise ketta jaoks!"
+msgstr "Liiga suur kahekihilise ketta jaoks!"
 
 #
 msgid "Exclude"
@@ -2636,7 +2553,6 @@ msgstr "Välju puhastusabilisest"
 msgid "Exit the wizard"
 msgstr "Välju juhendatud seadistusabist"
 
-#
 msgid "Exit wizard"
 msgstr "Välju (määra kõik seaded käsitsi)"
 
@@ -2676,9 +2592,8 @@ msgid ""
 "a server using the file transfer protocol."
 msgstr ""
 "FTPBrowser võimaldab failide vahendust vastuvõtja ja serveri vahel, "
-"kasutades failivahenduse  protokolli (FTP)"
+"kasutades failivahenduse protokolli FTP"
 
-#
 msgid "Factory reset"
 msgstr "Algseadistuse taaste"
 
@@ -2696,7 +2611,6 @@ msgstr "Ventilaator %d"
 msgid "Fan %d PWM"
 msgstr "Ventilaatori %d PWM"
 
-#
 #, python-format
 msgid "Fan %d Voltage"
 msgstr "Ventilaatori %d Voltage"
@@ -2713,9 +2627,8 @@ msgstr "Kiire DiSEqC"
 msgid "Fast Forward speeds"
 msgstr "Edasikerimise kiirused"
 
-#
 msgid "Fast epoch"
-msgstr "kiire kerimine"
+msgstr "Kiire kerimine"
 
 #
 msgid "Favourites"
@@ -2740,7 +2653,6 @@ msgstr "Failisüsteemis on mitteparandatavaid vigu"
 msgid "Film & Animation"
 msgstr "Film & Animatsioon"
 
-#
 msgid "Filter"
 msgstr "Filter"
 
@@ -2764,11 +2676,9 @@ msgstr "Peenhäälestus"
 msgid "Finished"
 msgstr "Lõppenud"
 
-#
 msgid "Finished configuring your network"
 msgstr "Lõpetasin võrgu seadistamise"
 
-#
 msgid "Finished restarting your network"
 msgstr "Võrgu restart on tehtud"
 
@@ -2779,7 +2689,6 @@ msgstr "Soome"
 msgid "First generate your skin-style with the Ai.HD-Control plugin."
 msgstr "Alguseks anna oma skini stiil kasutades Ai.HD lisandit."
 
-#
 msgid "Flash"
 msgstr "Flash"
 
@@ -2791,7 +2700,6 @@ msgstr "Flashimine nurjus"
 msgid "Following tasks will be done after you press OK!"
 msgstr "Järgmised toimingud tehakse pärast OK vajutamist!"
 
-#
 msgid "Format"
 msgstr "Formaadi"
 
@@ -2843,15 +2751,14 @@ msgstr "R"
 msgid "Friday"
 msgstr "Reede"
 
-#
 msgid "Frisian"
-msgstr "Reede"
+msgstr "Friisi"
 
 msgid "FritzCall shows incoming calls to your Fritz!Box on your Dreambox."
 msgstr "FritzCall näitab sinu FritzBoxi sisenevaid kõnesid tuuneri kaudu."
 
 msgid "Frontend for /tmp/mmi.socket"
-msgstr "/tmp/mmi. pesa sisend"
+msgstr "Liides /tmp/mmi.socket-le"
 
 #
 #, python-format
@@ -2884,7 +2791,6 @@ msgstr "GUI ftp ja telneti salasõna muutmiseks"
 msgid "Gaming"
 msgstr "Mängud"
 
-#
 msgid "Gateway"
 msgstr "Gateway"
 
@@ -2947,7 +2853,6 @@ msgstr "Saadakse laienduse infot. Oota..."
 msgid "Global delay"
 msgstr "Globaalne viide"
 
-#
 msgid "Goto 0"
 msgstr "Goto 0"
 
@@ -3046,17 +2951,14 @@ msgstr "Kõrge bitrate tugi"
 msgid "History"
 msgstr "Ajalugu"
 
-#
 msgid "Holland"
 msgstr "Holland"
 
-#
 msgid "Hong Kong"
 msgstr "Hong Kong"
 
-#
 msgid "Horizontal"
-msgstr "horisontaal"
+msgstr "Horisontaal"
 
 msgid "Hotplugging for removeable devices"
 msgstr "Eemaldatavate seadmete ühendamine"
@@ -3069,9 +2971,8 @@ msgstr "Mitu minutit soovid salvestada?"
 msgid "How to handle found crashlogs?"
 msgstr "Mida teha leitud vealogidega?"
 
-#
 msgid "Howto & Style"
-msgstr "KuidasMis & Stiil :)"
+msgstr "Howto & Stiil"
 
 #
 msgid "Hue"
@@ -3082,18 +2983,17 @@ msgid "Hungarian"
 msgstr "Ungari"
 
 msgid "IMAP4 e-mail viewer for the Dreambox"
-msgstr "IMAP4  e-maili jälgija vastuvõtja jaoks"
+msgstr "IMAP4 e-maili jälgija vastuvõtja jaoks"
 
-#
 msgid "IP Address"
-msgstr "IP Address"
+msgstr "IP Aadress"
 
 #
 msgid "IP:"
 msgstr "IP:"
 
 msgid "IRC Client for Enigma2"
-msgstr " IRC klient Enigma2-le"
+msgstr "IRC klient Enigma2-le"
 
 #
 msgid "ISO file is too large for this filesystem!"
@@ -3190,11 +3090,9 @@ msgstr "Suurendatud pinge"
 msgid "Index"
 msgstr "Indeks"
 
-#
 msgid "India"
 msgstr "India"
 
-#
 msgid "Info"
 msgstr "Info"
 
@@ -3206,33 +3104,27 @@ msgstr "Inforiba"
 msgid "Infobar timeout"
 msgstr "Inforiba kuvamise aeg"
 
-#
 msgid "Information"
 msgstr "Info"
 
-#
 msgid "Init"
 msgstr "Algseaded"
 
-#
 msgid "Initial location in new timers"
-msgstr "Esialgne asukoht uutes taimerites "
+msgstr "Esialgne asukoht uutes taimerites"
 
 #
 msgid "Initialization"
 msgstr "Vorminda"
 
-#
 msgid "Initialize"
 msgstr "Formaadi"
 
-#
 msgid "Initializing Harddisk..."
 msgstr "Formaadin kõvaketast..."
 
-#
 msgid "Input"
-msgstr "Tee valik"
+msgstr "Sisend"
 
 msgid "Input device setup"
 msgstr "Sisendseadmete seadistamine"
@@ -3240,23 +3132,18 @@ msgstr "Sisendseadmete seadistamine"
 msgid "Input devices"
 msgstr "Sisendseadmed"
 
-#
 msgid "Install"
 msgstr "Installin"
 
-#
 msgid "Install a new image with a USB stick"
 msgstr "Seadista uus image USB pulgalt"
 
-#
 msgid "Install a new image with your web browser"
 msgstr "Seadista uus image oma veebisirvijaga"
 
-#
 msgid "Install extensions."
 msgstr "Installi laiendused."
 
-#
 msgid "Install local extension"
 msgstr "Installi kohalik laiendus"
 
@@ -3264,31 +3151,24 @@ msgstr "Installi kohalik laiendus"
 msgid "Install or remove finished."
 msgstr "Häälestamine või kustutamine on valmis."
 
-#
 msgid "Install settings, skins, software..."
 msgstr "Installin tarkvara..."
 
-#
 msgid "Installation finished."
 msgstr "Käivitus lõppenud!"
 
-#
 msgid "Installing"
 msgstr "Installin"
 
-#
 msgid "Installing Software..."
 msgstr "Installin tarkvara..."
 
-#
 msgid "Installing default sat lists... Please wait..."
 msgstr "Installin vaikimisi satelliitide nimekirja.Palun oota..."
 
-#
 msgid "Installing defaults... Please wait..."
 msgstr "Installin algseaded.Palun oota..."
 
-#
 msgid "Installing package content... Please wait..."
 msgstr "Installin pakendi sisu.Palun oodake ..."
 
@@ -3300,9 +3180,8 @@ msgstr "Kohene salvestus"
 msgid "Instant record location"
 msgstr "Kohese salvestuse asukoht"
 
-#
 msgid "Interface: "
-msgstr "Liides:"
+msgstr "Liides: "
 
 #
 msgid "Intermediate"
@@ -3351,7 +3230,6 @@ msgstr "Vale valik"
 msgid "Inversion"
 msgstr "Inversioon"
 
-#
 msgid "Ipkg"
 msgstr "Ipkg"
 
@@ -3453,15 +3331,13 @@ msgstr "Kerni-HD1R2 välimus"
 msgid "Kernis HD1 skin"
 msgstr "Kernis HD1 välimus"
 
-#
 #, python-format
 msgid "Key %(Key)s successfully set to %(delay)i ms"
-msgstr "Nupp %(Nupud) edukalt seatud %(viivitus) ms"
+msgstr "Nupp %(Key)s edukalt seatud %(delay)i ms"
 
-#
 #, python-format
 msgid "Key %(key)s (current value: %(value)i ms)"
-msgstr "Nupp %(nupud) (hetkesuurus: %(suurus) ms)"
+msgstr "Nupp %(key)s (hetke väärtus: %(value)i ms)"
 
 #
 msgid "Keyboard"
@@ -3471,7 +3347,6 @@ msgstr "Klaviatuur"
 msgid "Keyboard Map"
 msgstr "Klaviatuur"
 
-#
 msgid "Keyboard Setup"
 msgstr "Klaviatuuri valimine"
 
@@ -3536,7 +3411,6 @@ msgstr "Väljun DVD-mängijast?"
 msgid "Left"
 msgstr "Vasak"
 
-#
 #. TRANSLATORS: (aspect ratio policy: black bars on top/bottom) in doubt, keep english term.
 msgid "Letterbox"
 msgstr "Letterbox"
@@ -3565,7 +3439,6 @@ msgstr "Piirid kasutusel"
 msgid "Link Quality:"
 msgstr "Lingi kvaliteet:"
 
-#
 msgid "Link:"
 msgstr "Link:"
 
@@ -3611,7 +3484,6 @@ msgstr "Kohalik võrk"
 msgid "Local share name"
 msgstr "Kohaliku võrgukoha nimi"
 
-#
 msgid "Location"
 msgstr "Salvestuskoht"
 
@@ -3718,18 +3590,16 @@ msgstr "Käsitsi sisestatud transponder"
 msgid "Manufacturer"
 msgstr "Käsitsi sisestatud transponder"
 
-#
 msgid "Margin after record"
-msgstr "Salvestise lõppu lisatakse (minutit)"
+msgstr "Salvestise lõppu lisatakse"
 
 #
 msgid "Margin before record (minutes)"
 msgstr "Salvestise algusesse lisatakse (minutit)"
 
-#
 #, python-format
 msgid "Match Timespan: %02d:%02d - %02d:%02d"
-msgstr "Vastab ajavahemikuga:  %02d:%02d - %02d:%02d"
+msgstr "Vastab ajavahemikuga: %02d:%02d - %02d:%02d"
 
 #
 msgid "Match title"
@@ -3740,9 +3610,8 @@ msgstr "Vastab pealkirjaga"
 msgid "Match title: %s"
 msgstr "Vastab pealkirjaga: %s"
 
-#
 msgid "Max. Bitrate: "
-msgstr "Max.Bitikiirus:"
+msgstr "Max.Bitikiirus: "
 
 #
 msgid "Maximum duration (in m)"
@@ -3815,9 +3684,8 @@ msgstr "Formaatimine nurjus"
 msgid "Mode"
 msgstr "Režiim"
 
-#
 msgid "Model: "
-msgstr "Tüüp:"
+msgstr "Tüüp: "
 
 #
 msgid "Modify existing timers"
@@ -4000,7 +3868,7 @@ msgid ""
 "the movielist."
 msgstr ""
 "Movielist Preview loob salvestiste ekraanitõmmised ja näitab neid filmide "
-"nimekirjas. "
+"nimekirjas."
 
 #
 msgid "Movielist menu"
@@ -4009,9 +3877,8 @@ msgstr "Salvestiste menüü"
 msgid "Multi EPG"
 msgstr "Kanalite saatekava"
 
-#
 msgid "Multimedia"
-msgstr "Mitu satelliiti"
+msgstr "Multimeedia"
 
 #
 msgid "Multiple service support"
@@ -4104,7 +3971,6 @@ msgstr "Nimeserver"
 msgid "Nameserver %d"
 msgstr "Nimeserver %d"
 
-#
 msgid "Nameserver Setup"
 msgstr "Nimeserveri seaded"
 
@@ -4208,17 +4074,14 @@ msgstr "Nemesis ShadowLine välimus"
 msgid "Nemesis ShadowLine Skin for the Dreambox"
 msgstr "Nemesis ShadowLine välimus Dreamboxile"
 
-#
 msgid "Netmask"
 msgstr "Netmask"
 
-#
 msgid "Network"
-msgstr "Võrk:"
+msgstr "Võrk"
 
-#
 msgid "Network Configuration..."
-msgstr "Võrgu häälestamine"
+msgstr "Võrgu häälestamine..."
 
 #
 msgid "Network Mount"
@@ -4228,11 +4091,9 @@ msgstr "Võrgu külgehaakimine"
 msgid "Network SSID"
 msgstr "Võrgu SSID"
 
-#
 msgid "Network Setup"
 msgstr "Võrgu häälestamine"
 
-#
 msgid "Network Wizard"
 msgstr "Võrgu häälestus"
 
@@ -4253,19 +4114,17 @@ msgid "Network test..."
 msgstr "Võrgu ühenduse test"
 
 msgid "Network test: "
-msgstr "Võrgu test:"
+msgstr "Võrgu test: "
 
 #
 msgid "Network:"
 msgstr "Võrk:"
 
-#
 msgid "NetworkBrowser"
-msgstr "Võrgubrauser  "
+msgstr "Võrgubrauser"
 
-#
 msgid "NetworkWizard"
-msgstr "Võrguhäälestus "
+msgstr "Võrguhäälestus"
 
 #
 msgid "Never"
@@ -4298,22 +4157,18 @@ msgstr "Järgmine"
 msgid "No"
 msgstr "Ei"
 
-#
 msgid "No (supported) DVDROM found!"
-msgstr "Leitud mitte toetatud DVDROM!"
+msgstr "Ei leitud (toetatud) DVDROM-i!"
 
 #
 msgid "No Connection"
 msgstr "Pole ühendust"
 
 msgid "No HDD found or HDD not initialized!"
-msgstr ""
-"Kõvaketast ei leitud või seda pole\n"
-"formaaditud."
+msgstr "Kõvaketast ei leitud või seda pole formaaditud!"
 
-#
 msgid "No Networks found"
-msgstr "Võrgu külgehaakimine"
+msgstr "Võrke ei leitud"
 
 #
 msgid "No backup needed"
@@ -4343,19 +4198,16 @@ msgstr "Sellel meedial pole kuvatavaid faile!"
 msgid "No event info found, recording indefinitely."
 msgstr "Saatel pole teada lõppaeg. Salvestatakse pidevalt."
 
-#
 msgid ""
 "No fast winding possible yet.. but you can use the number buttons to skip "
 "forward/backward!"
 msgstr ""
 "Kiire kerimine pole veel võimalik, aga saad kasutad numbrinuppe edasi/tagasi "
-"hüppamiseks "
+"hüppamiseks!"
 
-#
 msgid "No free tuner!"
 msgstr "Pole vaba tüünerit!"
 
-#
 msgid "No network connection available."
 msgstr "Võrgu ühendust pole saadaval."
 
@@ -4380,27 +4232,22 @@ msgstr "TV ei näita pilti? Vajuta EXIT ja proovi uuesti."
 msgid "No playable video found! Stop playing this movie?"
 msgstr "Ei leia mängitavat videot! Kas peatada selle filmi näitamine?"
 
-#
 msgid "No positioner capable frontend found."
 msgstr "Ei leitud positsioneeri toetavat tüünerit"
 
-#
 msgid "No satellite frontend found!!"
-msgstr "Ei leitud satelliidi tüünerit!!!"
+msgstr "Ei leitud satelliidi tüünerit!!"
 
 #
 msgid "No tags are set on these movies."
 msgstr "Salvestisele pole märksõnu määratud"
 
-#
 msgid "No to all"
 msgstr "EI kõigile"
 
-#
 msgid "No tuner is configured for use with a diseqc positioner!"
-msgstr "Ükski tüüner pole seadistatud DISEqC-positsioneeri kasutama"
+msgstr "Ükski tüüner pole seadistatud DISEqC-positsioneeri kasutama!"
 
-#
 msgid ""
 "No tuner is enabled!\n"
 "Please setup your tuner settings before you start a service scan."
@@ -4434,7 +4281,6 @@ msgstr "Videod puuduvad"
 msgid "No wireless networks found! Please refresh."
 msgstr "Ei leidnud WiFi võrke! Palun värskenda."
 
-#
 msgid ""
 "No working local network adapter found.\n"
 "Please verify that you have attached a network cable and your network is "
@@ -4442,7 +4288,7 @@ msgid ""
 msgstr ""
 "Ei leidnud töötavat kohaliku võrguadapterit.\n"
 "Palun kontrolli kas võrgukaabel on ühendatud ja kas võrk on seadistatud "
-"õigesti."
+"õieti."
 
 #
 msgid ""
@@ -4467,7 +4313,6 @@ msgstr ""
 msgid "No, but play video again"
 msgstr "Ei, kuid mängi video uuesti"
 
-#
 msgid "No, but restart from begin"
 msgstr "Ei, alusta uuesti algusest"
 
@@ -4483,7 +4328,6 @@ msgstr "Ei, kuid vaheta videootsingule."
 msgid "No, do nothing."
 msgstr "Ei, ära tee midagi."
 
-#
 msgid "No, just start my dreambox"
 msgstr "Ei, käivita minu vastuvõtja"
 
@@ -4675,23 +4519,19 @@ msgstr "Kas tarkvara uuendamisel kirjutada üle konfiguratsioonifailid?"
 msgid "PAL"
 msgstr "PAL"
 
-#
 msgid "PIDs"
-msgstr "PIDs"
+msgstr "PIDd"
 
 #
 msgid "Package list update"
 msgstr "Pakettide nimekirja uuendus"
 
-#
 msgid "Package removal failed.\n"
 msgstr "Laienduse eemaldamine nurjus.\n"
 
-#
 msgid "Package removed successfully.\n"
 msgstr "Laiendus eemaldatud.\n"
 
-#
 msgid "Packet management"
 msgstr "Pakkide haldamine"
 
@@ -4699,7 +4539,6 @@ msgstr "Pakkide haldamine"
 msgid "Packet manager"
 msgstr "Paketi haldur"
 
-#
 #. TRANSLATORS: (aspect ratio policy: cropped content on left/right) in doubt, keep english term
 msgid "Pan&Scan"
 msgstr "Pan&Scan"
@@ -4728,7 +4567,7 @@ msgid ""
 "Partnerbox allows editing a remote Dreambox's record timers and stream its "
 "TV  program."
 msgstr ""
-"Partnerbox lubab muuta server tuuneri salvestustaimereid ja voogesitada TV "
+"Partnerbox lubab muuta server tuuneri salvestustaimereid ja voogesitada TV   "
 "programme."
 
 #
@@ -4744,7 +4583,7 @@ msgid "People & Blogs"
 msgstr "Inimesed & blogid"
 
 msgid "PermanentClock shows the clock permanently on the screen."
-msgstr "PermanentClock näitab ekraanil pidevalt kellaaega. "
+msgstr "PermanentClock näitab ekraanil pidevalt kellaaega."
 
 #
 msgid "Pets & Animals"
@@ -4762,16 +4601,13 @@ msgstr "PiP-pildi seaded"
 msgid "PicturePlayer"
 msgstr "PildiMängija"
 
-#
 #. TRANSLATORS: (aspect ratio policy: black bars on left/right) in doubt, keep english term.
 msgid "Pillarbox"
 msgstr "Pillarbox"
 
-#
 msgid "Pilot"
 msgstr "Pilot"
 
-#
 msgid "Pin code needed"
 msgstr "Kood on vajalik"
 
@@ -4831,7 +4667,6 @@ msgstr "Mängib Su lemmikmuusikat ja videosid"
 msgid "Please Reboot"
 msgstr "Palun tee algkäivitus"
 
-#
 msgid "Please Select Medium to be Scanned"
 msgstr "Vali seade mida otsitakse"
 
@@ -4852,35 +4687,30 @@ msgstr "Muuda salvestamise lõpuaega"
 msgid "Please check your network settings!"
 msgstr "Palun kontrolli oma võrguseadeid!"
 
-#
 msgid "Please choose an extension..."
-msgstr "Vali laiendus"
+msgstr "Vali laiendus..."
 
-#
 msgid "Please choose he package..."
-msgstr "Palun vali ta paketi"
+msgstr "Palun vali pakett..."
 
-#
 msgid "Please choose the default services lists you want to install."
-msgstr "Palun vali installimiseks vaikimisi kanalite nimekiri"
+msgstr "Palun vali installimiseks vaikimisi kanalite nimekiri."
 
-#
 msgid ""
 "Please configure or verify your Nameservers by filling out the required "
 "values.\n"
 "When you are ready press OK to continue."
 msgstr ""
 "Palun kontrolli ja täida nimeserveri nõutavad väljad.\n"
-"Kui olete valmis, vajutage OK jätkamiseks"
+"Kui olete valmis, vajutage OK jätkamiseks."
 
-#
 msgid ""
 "Please configure your internet connection by filling out the required "
 "values.\n"
 "When you are ready press OK to continue."
 msgstr ""
 "Palun täitke interneti ühenduse seadistamiseks nõutavad väljad.\n"
-"Kui olete valmis, vajutage jätkamiseks OK"
+"Kui olete valmis, vajutage jätkamiseks OK."
 
 #
 msgid "Please do not change any values unless you know what you are doing!"
@@ -4906,7 +4736,6 @@ msgstr "Sisesta faili nimi (tühi = tänane kuupäev)"
 msgid "Please enter name of the new directory"
 msgstr "Palun sisesta uue kausta nimi"
 
-#
 msgid "Please enter the correct pin code"
 msgstr "Sisesta õige kood"
 
@@ -4928,13 +4757,12 @@ msgstr "Palun sisesta otsingusõna."
 msgid "Please follow the instructions on the TV"
 msgstr "Jälgi ekraanil olevaid juhiseid"
 
-#
 msgid ""
 "Please note that the previously selected media could not be accessed and "
 "therefore the default directory is being used instead."
 msgstr ""
 "Eelnevalt valitud meedia ei ole kättesaadav ja selle asemel kasutatakse "
-"vaikimisi määratud kataloogi"
+"vaikimisi määratud kataloogi."
 
 #
 msgid "Please press OK to continue."
@@ -4960,13 +4788,11 @@ msgstr "Vali esitusloend"
 msgid "Please select a standard feed or try searching for videos."
 msgstr "Palun vali standardfeed või proovi videote otsingut."
 
-#
 msgid "Please select a subservice to record..."
-msgstr "Palun vali alamteenus salvestamiseks"
+msgstr "Palun vali alamteenus salvestamiseks..."
 
-#
 msgid "Please select a subservice..."
-msgstr "Vali alamteenus"
+msgstr "Vali alamteenus..."
 
 msgid "Please select an NFI file and press green key to flash!"
 msgstr "Palun vali NFI fail ja vajuta flashimiseks rohelist nuppu!"
@@ -4991,7 +4817,6 @@ msgstr "Vali otsingusõna"
 msgid "Please select the movie path..."
 msgstr "Vali salvestise kataloog"
 
-#
 msgid ""
 "Please select the network interface that you want to use for your internet "
 "connection.\n"
@@ -5002,7 +4827,6 @@ msgstr ""
 "\n"
 "Vajutage OK jätkamiseks."
 
-#
 msgid ""
 "Please select the wireless network that you want to connect to.\n"
 "\n"
@@ -5062,9 +4886,8 @@ msgstr "Palun oota, kuni eemaldan valitud laiendust"
 msgid "Please wait while removing your network mount..."
 msgstr "Palun oota oma võrguühenduse kõrvaldamist..."
 
-#
 msgid "Please wait while scanning is in progress..."
-msgstr "pilti laetakse. Oota..."
+msgstr "Pilti laetakse. Oota..."
 
 #
 msgid "Please wait while searching for removable packages..."
@@ -5110,10 +4933,9 @@ msgstr "Laienduste halduri tegevuse teave"
 msgid "Plugin manager help"
 msgstr "Laienduste halduri abi"
 
-#
 #, python-format
 msgid "Plugin: %(plugin)s , Version: %(version)s"
-msgstr "Lisa: %(lisa)sid , Versioon: %(versioon)e"
+msgstr "Lisa: %(plugin)s , Versioon: %(version)s"
 
 #
 msgid "Plugins"
@@ -5146,19 +4968,15 @@ msgstr "Hääletuse intervall ( h)"
 msgid "Poll automatically"
 msgstr "Hääleta automaatselt"
 
-#
 msgid "Port A"
 msgstr "Port A"
 
-#
 msgid "Port B"
 msgstr "Port B"
 
-#
 msgid "Port C"
 msgstr "Port C"
 
-#
 msgid "Port D"
 msgstr "Port D"
 
@@ -5273,7 +5091,6 @@ msgstr "Levitaja valimiseks vajuta OK."
 msgid "Press OK to select."
 msgstr "Vajuta OK valikuks."
 
-#
 msgid "Press OK to select/deselect a CAId."
 msgstr "Vajuta OK valik/valik maha CAId."
 
@@ -5281,11 +5098,9 @@ msgstr "Vajuta OK valik/valik maha CAId."
 msgid "Press OK to start the scan"
 msgstr "Otsingu alustamiseks vajuta OK"
 
-#
 msgid "Press OK to toggle the selection."
-msgstr "Valiku valimiseks vajutage OK"
+msgstr "Valiku valimiseks vajutage OK."
 
-#
 msgid "Press yellow to set this interface as default interface."
 msgstr "Vajutage kollast nuppu, valimaks see liides vaikimisi liideseks."
 
@@ -5315,15 +5130,13 @@ msgstr "Käivate TV saadete ekraanitõmmiste eelvaade."
 msgid "Primary DNS"
 msgstr "Primaarne DNS"
 
-#
 msgid "Priority"
-msgstr "Polaarsus"
+msgstr "Prioriteet"
 
 #
 msgid "Process"
 msgstr "Toiming"
 
-#
 msgid "Properties of current title"
 msgstr "Muuda seda pealkirja"
 
@@ -5358,7 +5171,6 @@ msgstr "Pythoni programm /tmp/mmi.socket jaoks"
 msgid "Python frontend for /tmp/mmi.socket."
 msgstr "Pythoni programm /tmp/mmi.socket jaoks"
 
-#
 msgid "Quick"
 msgstr "Kiire kanalivalik"
 
@@ -5391,17 +5203,15 @@ msgstr "Ralink"
 msgid "Ram Disk"
 msgstr "RAM-ketas"
 
-#
 msgid "Random"
-msgstr "Raadio"
+msgstr "Juhuslik"
 
 #
 msgid "Rating"
 msgstr "Hinnang"
 
-#
 msgid "Ratings: "
-msgstr "Hinnangud:"
+msgstr "Hinnangud: "
 
 #
 msgid "Really close without saving settings?"
@@ -5411,7 +5221,6 @@ msgstr "Kas soovid seadeid salvestamata väljuda?"
 msgid "Really delete done timers?"
 msgstr "Kustutame möödunud taimerid?"
 
-#
 msgid "Really exit the subservices quickzap?"
 msgstr "Väljuda alamteenuste valikust?"
 
@@ -5482,9 +5291,8 @@ msgstr "Salvestuskaustad"
 msgid "Recording(s) are in progress or coming up in few seconds!"
 msgstr "Salvestus(ed) on käimas või käivituvad peatselt!"
 
-#
 msgid "Recordings"
-msgstr "Salvestab"
+msgstr "Salvestised"
 
 #
 msgid "Recordings always have priority"
@@ -5509,9 +5317,8 @@ msgstr "Seotud videod."
 msgid "Relevance"
 msgstr "Asjakohasus"
 
-#
 msgid "Reload"
-msgstr "Salvesta"
+msgstr "Lae uuesti"
 
 #
 msgid "Reload Black-/Whitelists"
@@ -5526,7 +5333,6 @@ msgstr "Ära mäleta kanali PIN-i"
 msgid "Remote timer and remote TV player"
 msgstr ""
 
-#
 msgid "Remove"
 msgstr "Eemalda pealkiri"
 
@@ -5550,9 +5356,8 @@ msgstr "Eemalda valitud pealkiri"
 msgid "Remove failed."
 msgstr "Eemaldamine nurjus."
 
-#
 msgid "Remove finished."
-msgstr "Kustuta laiendus."
+msgstr "Eemaldatud.."
 
 #
 msgid "Remove plugins"
@@ -5562,9 +5367,8 @@ msgstr "Kustuta laiendus"
 msgid "Remove selected AutoTimer"
 msgstr "Kustuta valitud autotaimer"
 
-#
 msgid "Remove timer"
-msgstr "Eemalda pealkiri"
+msgstr "Eemalda taimer"
 
 #
 msgid "Remove title"
@@ -5574,9 +5378,8 @@ msgstr "Eemalda pealkiri"
 msgid "Removed successfully."
 msgstr "Eemaldatud"
 
-#
 msgid "Removing"
-msgstr "Salvestab"
+msgstr "Eemaldab"
 
 #
 #, python-format
@@ -5587,12 +5390,11 @@ msgstr "Kataloogi eemaldamine %s nurjus. (Ei ole tühi?)"
 msgid "Rename"
 msgstr "Muuda nimi"
 
-#
 msgid "Rename crashlogs"
 msgstr "Vealogi ümbernimetamine"
 
 msgid "Rename your movies"
-msgstr "Muuda filmi nimed "
+msgstr "Muuda filmi nimed"
 
 #
 msgid "Repeat"
@@ -5614,7 +5416,7 @@ msgid "Replace the minute input for the seek functions with a seekbar."
 msgstr "Asenda otsiriba minutite sisestus otsingufunktsioonide jaoks."
 
 msgid "Replace the rewind  input with a seekbar"
-msgstr "Asenda otsiriba tagasikerimise sisestus"
+msgstr "Asenda tagasikerimine  sisestus otsiribaga"
 
 #
 msgid "Require description to be unique"
@@ -5628,11 +5430,9 @@ msgstr "Nõutav meedia tüüp:"
 msgid "Rescan"
 msgstr "Otsi uuesti"
 
-#
 msgid "Reset"
 msgstr "Reset"
 
-#
 msgid "Reset and renumerate title names"
 msgstr "Sisesta uus faili nimi"
 
@@ -5652,7 +5452,6 @@ msgstr "Sea pildiparandused süsteemi algseadesse."
 msgid "Reset video enhancement settings to your last configuration?"
 msgstr "Taasta oma viimase seade pildiparandused?"
 
-#
 msgid "Resolution"
 msgstr "Resolutsioon"
 
@@ -5665,7 +5464,7 @@ msgid "Restart"
 msgstr "Taaskäivita"
 
 msgid "Restart GUI"
-msgstr "Taaskäivita Enigma2 "
+msgstr "Taaskäivita Enigma2"
 
 msgid "Restart GUI now?"
 msgstr "Käivitame Enigma2 kohe uuesti?"
@@ -5678,7 +5477,6 @@ msgstr "Taaskäivitame võrgu"
 msgid "Restart test"
 msgstr "Taaskäivituse test"
 
-#
 msgid "Restart your network connection and interfaces.\n"
 msgstr "Taaskäivita võrgu ühendus ja adapter.\n"
 
@@ -5686,19 +5484,15 @@ msgstr "Taaskäivita võrgu ühendus ja adapter.\n"
 msgid "Restore"
 msgstr "Taasta"
 
-#
 msgid "Restore backups"
 msgstr "Taasta varukoopia"
 
-#
 msgid "Restore is running..."
 msgstr "Taastamine..."
 
-#
 msgid "Restore running"
 msgstr "Taasta"
 
-#
 msgid "Restore system settings"
 msgstr "Taasta seaded"
 
@@ -5713,10 +5507,9 @@ msgstr "Kas keelata \"pärast sündmust\" teatud ajavahemikuks?"
 msgid "Resume from last position"
 msgstr "Jätka viimaselt positsioonilt"
 
-#
 #, python-format
 msgid "Resume position at %s"
-msgstr "Jätka alates  %s"
+msgstr "Jätka alates %s"
 
 #
 #. TRANSLATORS: The string "Resuming playback" flashes for a moment
@@ -5749,7 +5542,6 @@ msgstr "Tagasikerimise kiirused"
 msgid "Right"
 msgstr "Parem"
 
-#
 msgid "Rolloff"
 msgstr "Rolloff"
 
@@ -5769,7 +5561,6 @@ msgstr "Venemaa"
 msgid "Russian"
 msgstr "Vene"
 
-#
 msgid "S-Video"
 msgstr "S-video (Y/C)"
 
@@ -5793,7 +5584,6 @@ msgstr "SSID:"
 msgid "Sat"
 msgstr "L"
 
-#
 msgid "Sat / Dish Setup"
 msgstr "Antenni seaded"
 
@@ -5822,9 +5612,8 @@ msgstr "Satelliidiotsija"
 msgid "Satfinder helps you to align your dish"
 msgstr "Satfinder abistab antenni häälestamisel"
 
-#
 msgid "Sats"
-msgstr "satelliidid"
+msgstr "Satelliidid"
 
 #
 msgid "Saturation"
@@ -5858,17 +5647,15 @@ msgstr "Salvesta väärtused ja sulge laiendus"
 msgid "Save values and close screen"
 msgstr "Salvesta väärtused ja sulge aken"
 
-#
 msgid "Scaler sharpness"
-msgstr "Skaleerija teravus "
+msgstr "Skaleerija teravus"
 
 #
 msgid "Scaling Mode"
 msgstr "Skaleerimise valikud"
 
-#
 msgid "Scan "
-msgstr "Otsi"
+msgstr "Otsi "
 
 #
 msgid "Scan Files..."
@@ -5974,7 +5761,7 @@ msgid ""
 "selected wireless device.\n"
 msgstr ""
 "Otsi oma võrgus WiFi ruutereid ja ühendu nendega, kasutades valitud WiFi "
-"seadet. \n"
+"seadet.\n"
 
 msgid "Scans default lamedbs sorted by satellite"
 msgstr "Otsib satelliidi järgi valitud vaikimisi lamedb faile"
@@ -6037,7 +5824,6 @@ msgstr "Otsi läände"
 msgid "Searching for available updates. Please wait..."
 msgstr "Otsin uuendusi. Palun oota..."
 
-#
 msgid "Searching for new installed or removed packages. Please wait..."
 msgstr "Otsin uusi installitud või kustutatud pakette. Oota..."
 
@@ -6045,7 +5831,6 @@ msgstr "Otsin uusi installitud või kustutatud pakette. Oota..."
 msgid "Searching your network. Please wait..."
 msgstr "Otsin võrku. Palun oota ..."
 
-#
 msgid "Secondary DNS"
 msgstr "Sekundaarne DNS"
 
@@ -6162,7 +5947,6 @@ msgstr "Vali filtri tüüp"
 msgid "Select upgrade source to edit."
 msgstr "Vali uuenduste allika muutmine."
 
-#
 msgid "Select video input with up/down buttons"
 msgstr "Vali video sisend"
 
@@ -6182,17 +5966,14 @@ msgstr "Vali WiFi võrk"
 msgid "Select your choice."
 msgstr "Tee oma valik."
 
-#
 msgid "Send DiSEqC"
 msgstr "DiSEqC"
 
-#
 msgid "Send DiSEqC only on satellite change"
-msgstr "Saada DiSEqC anult satelliidi vahetamisel "
+msgstr "Saada DiSEqC anult satelliidi vahetamisel"
 
-#
 msgid "Seperate titles with a main menu"
-msgstr "eraldi pealkirjad koos peamenüüga"
+msgstr "Eraldi pealkirjad koos peamenüüga"
 
 #
 msgid "Sequence repeat"
@@ -6210,7 +5991,6 @@ msgstr "Serveri IP"
 msgid "Server share"
 msgstr "Serveri võrgukoht"
 
-#
 msgid "Service"
 msgstr "Kanaliinfo"
 
@@ -6234,7 +6014,6 @@ msgstr "Kanal on lisatud Lemmikutesse."
 msgid "Service has been added to the selected bouquet."
 msgstr "Kanal on lisatud valitud nimekirja."
 
-#
 msgid ""
 "Service invalid!\n"
 "(Timeout reading PMT)"
@@ -6250,17 +6029,15 @@ msgstr ""
 "Valitud kanalit ei leitud!\n"
 "(SID ei leitud PAT-st)"
 
-#
 msgid "Service scan"
 msgstr "Kanali otsing"
 
-#
 msgid ""
 "Service unavailable!\n"
 "Check tuner configuration!"
 msgstr ""
 "Pole kanalit!\n"
-"Kontrolli tüüneri seadeid"
+"Kontrolli tüüneri seadeid!"
 
 #
 msgid "Serviceinfo"
@@ -6281,9 +6058,8 @@ msgstr "Määra lõppaeg"
 msgid "Set Voltage and 22KHz"
 msgstr "Vali pinge ja 22 KHz"
 
-#
 msgid "Set available internal memory threshold for the warning."
-msgstr "Sea saadaoleva sisemälu mahu hoiatusnivoo "
+msgstr "Sea saadaoleva sisemälu mahu hoiatusnivoo"
 
 #
 #, python-format
@@ -6294,7 +6070,6 @@ msgstr "Määra viide %i ms (saab muuta)"
 msgid "Set interface as default Interface"
 msgstr "Määra vaikimisi võrguliideseks"
 
-#
 msgid "Set limits"
 msgstr "Seadista limiidid"
 
@@ -6368,7 +6143,6 @@ msgstr ""
 msgid "Show Info"
 msgstr "Näita Infot"
 
-#
 msgid "Show Message when Recording starts"
 msgstr "Näita kui Salvestus algab"
 
@@ -6403,17 +6177,14 @@ msgstr "Näita kerimisel inforiba"
 msgid "Show positioner movement"
 msgstr "Näita positsioneeri liikumist"
 
-#
 msgid "Show services beginning with"
 msgstr "Näita kanalid mis algavad"
 
-#
 msgid "Show the radio player..."
-msgstr "Kuula raadiot"
+msgstr "Kuula raadiot..."
 
-#
 msgid "Show the tv player..."
-msgstr "Näita TV-d"
+msgstr "Näita TV-d..."
 
 msgid "Show webcam pictures on your TV Screen"
 msgstr "Näita veebikaamera pilte TV ekraanil"
@@ -6452,11 +6223,9 @@ msgstr "Lülita välja peale"
 msgid "Signal Strength:"
 msgstr "Signaali tugevus:"
 
-#
 msgid "Signal: "
-msgstr "Signaal"
+msgstr "Signaal"
 
-#
 msgid "Similar"
 msgstr "Sarnased"
 
@@ -6504,7 +6273,6 @@ msgstr "Välimus"
 msgid "SkinSelector shows a menu with selectable skins"
 msgstr "SkinSelector näitab valitavate välimustega menüüd"
 
-#
 msgid "Skins"
 msgstr "Välimus"
 
@@ -6512,7 +6280,6 @@ msgstr "Välimus"
 msgid "Sleep Timer"
 msgstr "Unetaimer"
 
-#
 msgid "Sleep timer action:"
 msgstr "Unetaimeri seaded:"
 
@@ -6541,9 +6308,8 @@ msgstr "Aeglane"
 msgid "Slow Motion speeds"
 msgstr "Aeglustuskiirused"
 
-#
 msgid "Software"
-msgstr "Alusta"
+msgstr "Tarkvara"
 
 #
 msgid "Software management"
@@ -6577,12 +6343,11 @@ msgstr "Kahjuks MediaScanner ei ole seadistatud!"
 msgid "Sorry no backups found!"
 msgstr "Ei leidnud varukoopiat"
 
-#
 msgid ""
 "Sorry your backup destination is not writeable.\n"
 "Please choose an other one."
 msgstr ""
-"Varukoopia asukohta ei leidunud.\n"
+"Varukoopia asukohta ei saa salvestada.\n"
 "Vali uus asukoht."
 
 #
@@ -6593,13 +6358,12 @@ msgstr "Kahjuks pole detaile saadaval"
 msgid "Sorry, video is not available!"
 msgstr "Kahjuks pole video saadaval!"
 
-#
 msgid ""
 "Sorry, your backup destination is not writeable.\n"
 "\n"
 "Please choose another one."
 msgstr ""
-"Varukoopia asukohta ei leidunud.\n"
+"Varukoopia asukohta ei saa salvestada.\n"
 "\n"
 "Vali uus asukoht."
 
@@ -6640,7 +6404,6 @@ msgstr "Hispaania"
 msgid "Spanish"
 msgstr "Hispaania"
 
-#
 msgid "Split preview mode"
 msgstr "Poolitatud eelvaate režiim"
 
@@ -6652,7 +6415,6 @@ msgstr "Sport"
 msgid "Standby"
 msgstr "Ootele"
 
-#
 msgid "Standby / Restart"
 msgstr "Välja lülitamine"
 
@@ -6769,11 +6531,9 @@ msgstr "Mängi podcast'e"
 msgid "Streaming modules for the orf.at iptv web page."
 msgstr "Voogesitus moodul orf.at iptv veebilehele."
 
-#
 msgid "Subservice list..."
 msgstr "Alamteenuste nimekiri"
 
-#
 msgid "Subservices"
 msgstr "Alamteenused"
 
@@ -6805,11 +6565,9 @@ msgstr "Rootsi"
 msgid "Swedish"
 msgstr "Rootsi"
 
-#
 msgid "Switch to next subservice"
 msgstr "Vaheta järgmisele alamteenusele"
 
-#
 msgid "Switch to previous subservice"
 msgstr "Vaheta eelmisele alamteenusele"
 
@@ -6821,13 +6579,11 @@ msgstr "Ümberlülitatavate tuunerite tüübid:"
 msgid "Symbol Rate"
 msgstr "SR"
 
-#
 msgid "Symbolrate"
-msgstr "Symbolrate"
+msgstr "Sümbolrate"
 
-#
 msgid "System"
-msgstr "Seaded"
+msgstr "Süsteem"
 
 #. TRANSLATORS: Add here whatever should be shown in the "translator" about screen, up to 6 lines (use \n for newline)
 msgid "TRANSLATOR_INFO"
@@ -6861,9 +6617,8 @@ msgstr "Võtmesõnad"
 msgid "Tags the Timer/Recording will have."
 msgstr "Nimesilt taimerile/salvestusele."
 
-#
 msgid "Tags: "
-msgstr "Silt:"
+msgstr "Silt: "
 
 #
 msgid "Taiwan"
@@ -6873,7 +6628,6 @@ msgstr "Taivan"
 msgid "Temperature and Fan control"
 msgstr "Temp. ja ventilaatori kontroll"
 
-#
 msgid "Terrestrial"
 msgstr "Digitaalne TV (DVB-T)"
 
@@ -6881,13 +6635,11 @@ msgstr "Digitaalne TV (DVB-T)"
 msgid "Terrestrial provider"
 msgstr "DVB-T Levitaja"
 
-#
 msgid "Test DiSEqC settings"
-msgstr "Valiku seaded"
+msgstr "Testi DiSEqC seadeid"
 
-#
 msgid "Test Type"
-msgstr "Taimeri tüüp"
+msgstr "Testi tüüp"
 
 #
 # File: tmp/enigma2_plugins/genuinedreambox/src/plugin.py, line: 80
@@ -6905,17 +6657,15 @@ msgstr "Testi vastuvõtja kohtvõrgu seadeid.\n"
 msgid "Test your DiSEqC equipment"
 msgstr "Proovi oma DiSEqC seadmeid"
 
-#
 msgid "Test-Messagebox?"
-msgstr "testsõnum ?"
+msgstr "Testsõnum ?"
 
-#
 msgid ""
 "Thank you for using the wizard.\n"
 "Please press OK to continue."
 msgstr ""
 "Täname, et kasutasite abilist.\n"
-"Jätkamiseks vajutage OK"
+"Jätkamiseks vajutage OK."
 
 #
 msgid ""
@@ -6943,7 +6693,6 @@ msgstr ""
 "allapoole määratud suurust. Saad kasutada seda abilist mõne lisa "
 "kustutamiseks."
 
-#
 msgid ""
 "The DVD standard doesn't support H.264 (HDTV) video streams. Do you want to "
 "create a Dreambox format data DVD (which will not play in stand-alone DVD "
@@ -6965,7 +6714,7 @@ msgstr ""
 "See juhtub ainult siis, kui vastuvõtja on ootel ja lähema 20 minuti jooksul "
 "ei salvestata või planeerita salvestust. \n"
 "Vastuvõtja alustab tööd ise või hakkab salvestama. Sellepärast ei pea ootama "
-"vastuvõtja sisselülitumist. "
+"vastuvõtja sisselülitumist."
 
 msgid ""
 "The Hotplug plugin notifies your system of newly added or removed devices."
@@ -6985,7 +6734,7 @@ msgid "The PIN code has been changed successfully."
 msgstr "PIN kood on muudetud."
 
 msgid "The PIN codes you entered are different."
-msgstr "Sisestatud PIN koodid on erinevad. "
+msgstr "Sisestatud PIN koodid on erinevad."
 
 msgid ""
 "The PicturePlayer displays your photos on the TV.\n"
@@ -7093,7 +6842,6 @@ msgid ""
 "the classic editor."
 msgstr ""
 
-#
 #, python-format
 msgid ""
 "The following device was found:\n"
@@ -7108,9 +6856,8 @@ msgstr ""
 "\n"
 "Kas Te soovite USB pulka alglaetavaks?"
 
-#
 msgid "The following files were found..."
-msgstr "Leitud järgmised failid"
+msgstr "Leitud järgmised failid..."
 
 #
 msgid ""
@@ -7121,11 +6868,9 @@ msgstr ""
 "Sisendport tuleks nüüd seadistada.\n"
 "Saad ekraani seadistada mõne testpildi abil.Kas soovid seda teha?"
 
-#
 msgid "The installation of the default services lists is finished."
 msgstr "Vaikimisi saatjate nimekirja install lõpetatud."
 
-#
 msgid ""
 "The installation of the default settings is finished. You can now continue "
 "configuring your Dreambox by pressing the OK button on the remote control."
@@ -7153,7 +6898,6 @@ msgstr "Pakett:"
 msgid "The path %s already exists."
 msgstr "Kaust %s on juba olemas."
 
-#
 msgid "The pin code you entered is wrong."
 msgstr "Vale kood."
 
@@ -7169,7 +6913,6 @@ msgstr "Välimus on KingSize eraldusega 1024x576"
 msgid "The sleep timer has been activated."
 msgstr "Unetaimer on aktiveeritud"
 
-#
 msgid "The sleep timer has been disabled."
 msgstr "Unetaimer välja lülitatud."
 
@@ -7208,15 +6951,13 @@ msgstr ""
 msgid "The wizard is finished now."
 msgstr "Toiming on nüüd lõpetatud. Vajuta OK"
 
-#
 msgid "There are at least "
-msgstr "Seal on vähemalt"
+msgstr "Seal on vähemalt "
 
 #
 msgid "There are currently no outstanding actions."
 msgstr "Praegu ei ole täitmata tegevusi."
 
-#
 msgid "There are no default services lists in your image."
 msgstr "Selles tarkvaras ei ole vaikimisi saatjate nimekirja."
 
@@ -7228,9 +6969,8 @@ msgstr "Selles tarkvaras ei ole vaikimisi seadeid"
 msgid "There are no updates available."
 msgstr "Uuendusi ei ole saadaval."
 
-#
 msgid "There are now "
-msgstr "Seal on nüüd"
+msgstr "Seal on nüüd "
 
 #
 msgid ""
@@ -7259,7 +6999,6 @@ msgid ""
 "apply this update now?"
 msgstr "Teie Dreamboxile on sertifikaadi uuendus? Kas uuendame kohe?"
 
-#
 msgid ""
 "This DVD RW medium is already formatted - reformatting will erase all "
 "content on the disc."
@@ -7613,7 +7352,6 @@ msgstr "Edastamise moodus"
 msgid "Transmission mode"
 msgstr "Edastamise moodus"
 
-#
 msgid "Transponder"
 msgstr "Transponder"
 
@@ -7665,23 +7403,18 @@ msgstr "Häälesta"
 msgid "Tune failed!"
 msgstr "Häälestus nurjus!"
 
-#
 msgid "Tuner"
 msgstr "Tüüner"
 
-#
 msgid "Tuner "
-msgstr "Tüüner"
+msgstr "Tüüner "
 
-#
 msgid "Tuner Slot"
 msgstr "Tüüneri pesa"
 
-#
 msgid "Tuner configuration"
 msgstr "Tüüneri seaded"
 
-#
 msgid "Tuner status"
 msgstr "Tüüneri olek"
 
@@ -7697,9 +7430,8 @@ msgstr "Türgi"
 msgid "Two"
 msgstr "Kaks"
 
-#
 msgid "Type"
-msgstr "Tippi"
+msgstr "Tüüp"
 
 #
 msgid "Type of scan"
@@ -7713,7 +7445,6 @@ msgstr "USALS"
 msgid "USB Stick"
 msgstr "USB-mälupulk"
 
-#
 msgid "USB stick wizard"
 msgstr "USB-mälupulk"
 
@@ -7721,31 +7452,27 @@ msgstr "USB-mälupulk"
 msgid "Ukrainian"
 msgstr "Ukraina"
 
-#
 msgid ""
 "Unable to complete filesystem check.\n"
 "Error: "
 msgstr ""
 "Failisüsteemi kontroll nurjus.\n"
-"Viga:"
+"Viga: "
 
-#
 msgid ""
 "Unable to initialize harddisk.\n"
 "Error: "
 msgstr ""
 "Kõvaketta formaatimine nurjus.\n"
-"Viga:"
+"Viga: "
 
 #
 msgid "Uncommitted DiSEqC command"
 msgstr "Uncommitted DiSEqC-käsk"
 
-#
 msgid "Undo install"
 msgstr "Tühista install"
 
-#
 msgid "Undo uninstall"
 msgstr "Tühista uninstall"
 
@@ -7753,15 +7480,12 @@ msgstr "Tühista uninstall"
 msgid "UnhandledKey"
 msgstr "Käsitlematu võti."
 
-#
 msgid "Unicable"
-msgstr "Luba"
+msgstr "Unicable"
 
-#
 msgid "Unicable LNB"
-msgstr "Universaal LNB"
+msgstr "Unicable LNB"
 
-#
 msgid "Unicable Martix"
 msgstr "Unicable Martix"
 
@@ -7780,7 +7504,6 @@ msgstr "Universaal LNB"
 msgid "Unknown network adapter."
 msgstr "Tundmatu võrgu adapter"
 
-#
 msgid ""
 "Unless this is enabled AutoTimer will NOT automatically look for events "
 "matching your AutoTimers but only when you leave the GUI with the green "
@@ -7818,7 +7541,7 @@ msgstr ""
 "tohiks enam uuendamist küsida."
 
 msgid "Updatefeed not available."
-msgstr "uuenduslink pole saadaval."
+msgstr "Uuenduslink pole saadaval."
 
 #
 # File: tmp/enigma2_plugins/genuinedreambox/src/plugin.py, line: 150
@@ -7838,13 +7561,11 @@ msgstr "Uuendan tarkvara kausta"
 msgid "Updating, please wait..."
 msgstr "Uuendan, palun oota..."
 
-#
 msgid "Updating... Please wait... This can take some minutes..."
 msgstr "Uuendan. Oota...See võib kesta mõne minuti."
 
-#
 msgid "Upgrade finished."
-msgstr "Uuendus valmis"
+msgstr "Uuendus valmis."
 
 #
 msgid "Upgrading"
@@ -7909,7 +7630,6 @@ msgstr "Kasuta Networkwizard abilist valitud võrguliidese seadmiseks"
 msgid "Use the Networkwizard to configure your Network\n"
 msgstr "Kasuta seadistusabilist oma võrgu seadistamiseks\n"
 
-#
 msgid ""
 "Use the left and right buttons to change an option.\n"
 "\n"
@@ -7943,11 +7663,9 @@ msgstr "Kasuta hetkel jooksva kanali aega"
 msgid "Use usals for this sat"
 msgstr "Kasuta USALS sellel satelliidil"
 
-#
 msgid "Use wizard to set up basic features"
 msgstr "Kasuta toimingut põhiomaduste seadmiseks"
 
-#
 msgid "Used service scan type"
 msgstr "Kasutatud skaneerimise tüüp"
 
@@ -7967,11 +7685,9 @@ msgstr "Kasutajahaldur"
 msgid "Username"
 msgstr "Kasutajatunnus"
 
-#
 msgid "VCR scart"
-msgstr "VCR SCART"
+msgstr "VCR scart"
 
-#
 msgid "VMGM (intro trailer)"
 msgstr "VMGM (intro trailer)"
 
@@ -7985,9 +7701,8 @@ msgid ""
 "Verify your Dreambox authenticity by running the genuine dreambox plugin!"
 msgstr "Kontrolli Dreamboxi audentsust \"genuine dreambox\" laienduse abil!"
 
-#
 msgid "Vertical"
-msgstr "vertikaal"
+msgstr "Vertikaal"
 
 #
 msgid "Video Fine-Tuning"
@@ -8005,7 +7720,6 @@ msgstr "Video-väljund"
 msgid "Video Setup"
 msgstr "Video-seaded"
 
-#
 msgid "Video Wizard"
 msgstr "Video Toiming"
 
@@ -8021,7 +7735,6 @@ msgstr "Pildi paranduste seaded"
 msgid "Video enhancement setup"
 msgstr "Pildi paranduste sätted"
 
-#
 msgid ""
 "Video input selection\n"
 "\n"
@@ -8034,7 +7747,7 @@ msgstr ""
 "\n"
 "Vajuta OK, kui näed seda lehekülge TV ekraanil(või vali teine sisend).\n"
 "\n"
-"Järgmist sisendit proovitakse automaatselt 30 sekundi möödudes."
+"Järgmist sisendit proovitakse automaatselt 10 sekundi möödudes."
 
 #
 msgid "Video mode selection."
@@ -8086,7 +7799,6 @@ msgstr "Vaata pilte..."
 msgid "View Rass interactive..."
 msgstr "Vaata Rass interactive"
 
-#
 msgid "View Video CD..."
 msgstr "Vaata Vido CD"
 
@@ -8098,15 +7810,13 @@ msgstr "Vaata aktiivseid allalaadimisi"
 msgid "View details"
 msgstr "Vaata detaile"
 
-#
 msgid "View list of available "
-msgstr "Vaata saadaval olevat nimekirja"
+msgstr "Vaata saadaval olevat nimekirja "
 
 #
 msgid "View list of available CommonInterface extensions"
 msgstr "Vaata CI laienduste nimekirja"
 
-#
 msgid "View list of available Display and Userinterface extensions."
 msgstr "Vaata kuvamis ja kasutajaliidese laienduste nimekirja."
 
@@ -8118,9 +7828,8 @@ msgstr "Vaata EPG laienduste nimekirja."
 msgid "View list of available Satellite equipment extensions."
 msgstr "Vaata võimalike SAT seadmete laienduste nimekirja."
 
-#
 msgid "View list of available communication extensions."
-msgstr "Vaata infovahetus laienduste nimekirja"
+msgstr "Vaata infovahetus laienduste nimekirja."
 
 #
 msgid "View list of available default settings"
@@ -8170,9 +7879,8 @@ msgstr "Vaata, muuda või kustuta vastuvõtja haakepunkte."
 msgid "View, edit or delete usernames and passwords for your network."
 msgstr "Vaata, muuda või kustuta oma võrgu kasutajanimesid ja salasõnu."
 
-#
 msgid "Views: "
-msgstr "Vaated:"
+msgstr "Vaated: "
 
 #
 msgid "Virtual KeyBoard"
@@ -8276,7 +7984,6 @@ msgstr "Iganädalane (Esmaspäev)"
 msgid "Weekly (Sunday)"
 msgstr "Iganädalane (Pühapäev)"
 
-#
 msgid ""
 "Welcome to the Cutlist editor.\n"
 "\n"
@@ -8288,6 +7995,7 @@ msgstr ""
 "Tere tulemast salvestise editorisse.\n"
 "\n"
 "Keri lõike koha algusesse.Vajuta OK, 'lõike algus'.\n"
+"\n"
 "Edasi otsi lõike lõpp, vajuta OK.Tehtud."
 
 #
@@ -8336,11 +8044,13 @@ msgid ""
 "cleaned up.\n"
 "You can use this wizard to remove some extensions.\n"
 msgstr ""
+"Teretulemast mälupuhastaja abilisse.\n"
+"\n"
 "Vastuvõtjas kasutatav vaba sisemälu maht on langenud alla 2 MB.\n"
-"Oma vastuvõtja stabiilse töö kindlustamiseks oleks vaja sisemälu puhastada \n"
+"\\Oma vastuvõtja stabiilse töö kindlustamiseks oleks vaja sisemälu "
+"puhastada.\n"
 "Saad kasutada seda puhastusabilist mõnede laienduste eemaldamiseks.\n"
 
-#
 msgid ""
 "Welcome.\n"
 "\n"
@@ -8353,9 +8063,9 @@ msgstr ""
 "\n"
 "Kui Te tahate ühendada oma vastuvõtja interneti, siis see abiline juhendab "
 "Teid vastuvõtja võrguseadistamisel.\n"
+"\n"
 "Vajutage OK võrguseadistamise alustamiseks"
 
-#
 msgid ""
 "Welcome.\n"
 "\n"
@@ -8365,7 +8075,7 @@ msgstr ""
 "Teretulemast.\n"
 "\n"
 "See nõustaja aitab luua uut AutoTaimerit, vastavalt Teie kirjeldustele ja "
-"üldseadetele. "
+"üldseadetele."
 
 #
 msgid ""
@@ -8379,9 +8089,8 @@ msgstr ""
 "See stardiabiline juhendab vastuvõtja põhiseadete tegemisel.\n"
 "Vajuta puldil OK nuppu järgmise sammu juurde minekuks."
 
-#
 msgid "Welcome..."
-msgstr "Tere tulemast"
+msgstr "Tere tulemast..."
 
 #
 msgid "West"
@@ -8529,7 +8238,7 @@ msgid ""
 msgstr ""
 "NFIFlash lisa abil saab ette valmistada USB pulga koos vastuvõtja "
 "tarkvaraga. \n"
-"Siis saab sellel pulgal asuva tarkvara salvestada vastuvõtja flash mällu. "
+"Siis saab sellel pulgal asuva tarkvara salvestada vastuvõtja flash mällu."
 
 msgid ""
 "With the NetworkWizard you can easily configure your network step by step."
@@ -8573,7 +8282,6 @@ msgstr "Kirjutamise viga. Kõvaketas täis?\n"
 msgid "Write failed!"
 msgstr "Kirjutamine nurjus!"
 
-#
 msgid "YPbPr"
 msgstr "YPbPr"
 
@@ -8585,14 +8293,12 @@ msgstr "Aasta"
 msgid "Yes"
 msgstr "Jah"
 
-#
 msgid "Yes to all"
 msgstr "Kõigile JAH"
 
 msgid "Yes, always"
 msgstr "Jah, alati"
 
-#
 msgid "Yes, and delete this movie"
 msgstr "Jah, kustuta see salvestis"
 
@@ -8644,15 +8350,12 @@ msgstr "Jah, tagasi salvestiste nimekirja"
 msgid "Yes, view the tutorial"
 msgstr "Jah, vaata juhendit"
 
-#
 msgid "You can cancel the installation."
 msgstr "Te saate paigaldust tühistada."
 
-#
 msgid "You can cancel the removal."
 msgstr "Te saate tühistada eemaldamise."
 
-#
 msgid ""
 "You can choose some default settings now. Please select the settings you "
 "want to be installed."
@@ -8660,19 +8363,15 @@ msgstr ""
 "Saad valida nüüd mõningaid vaikimisi seadeid.Palun vali seaded, mida soovid "
 "installida."
 
-#
 msgid "You can choose, what you want to install..."
-msgstr "Saad valida, mida tahad installida"
+msgstr "Saad valida, mida tahad installida..."
 
-#
 msgid "You can install this plugin."
 msgstr "Te saate paigaldada selle laienduse."
 
-#
 msgid "You can only burn Dreambox recordings!"
 msgstr "Te saate plaadile kirjutada ainult vastuvõtja salvestusi!"
 
-#
 msgid "You can remove this plugin."
 msgstr "Te saate eemaldada selle laienduse."
 
@@ -8687,11 +8386,9 @@ msgstr ""
 msgid "You cannot delete this!"
 msgstr "Seda ei saa kustutada!"
 
-#
 msgid "You chose not to install any default services lists."
 msgstr "Ei soovinud installida ühtegi vaikimisi teenuste nimekirja."
 
-#
 msgid ""
 "You chose not to install any default settings. You can however install the "
 "default settings later in the settings menu."
@@ -8699,7 +8396,6 @@ msgstr ""
 "Ei soovinud installida ühtegi vaikimisi seadet.Siiski saab ka hiljem "
 "vaikimisi seadeid installida seadete menüüst."
 
-#
 msgid ""
 "You chose not to install anything. Please press OK finish the install wizard."
 msgstr "Ei soovinud installida midagi.Vajuta OK väljumiseks."
@@ -8721,7 +8417,6 @@ msgid ""
 "Do you want to remove trailing whitespaces?"
 msgstr ""
 
-#
 msgid ""
 "You have chosen to backup your settings. Please press OK to start the backup "
 "now."
@@ -8734,11 +8429,12 @@ msgstr ""
 "Te soovite luua uue alglaetava USB-pulga tarkvarale.Kõik vana info USB "
 "pulgal läheb kaduma !!!"
 
-#
 msgid ""
 "You have chosen to restore your settings. Enigma2 will restart after "
 "restore. Please press OK to start the restore now."
-msgstr "Oled valinud turvakoopia kõvakettale. Vajuta OK alustamiseks nüüd."
+msgstr ""
+"Oled valinud oma seadete taastamise.Enigma2 taaskäivitub pärast taastamist. "
+"Vajuta nüüd OK taastamise alustamiseks."
 
 #
 #, python-format
@@ -8783,7 +8479,6 @@ msgid ""
 "Please confirm if this was intentional, if not they will be removed."
 msgstr ""
 
-#
 msgid ""
 "Your Dreambox is now ready to use.\n"
 "\n"
@@ -8795,7 +8490,6 @@ msgstr ""
 "Teie vastuvõtja interneti ühendus töötab.\n"
 "\n"
 
-#
 msgid ""
 "Your Dreambox is now ready to use.\n"
 "\n"
@@ -8809,17 +8503,14 @@ msgstr ""
 "\n"
 "Vajutage OK jätkamiseks"
 
-#
 msgid "Your Dreambox will restart after pressing OK on your remote control."
 msgstr "Teie vastuvõtja teeb pärast puldilt OK vajutamist taaskäivituse."
 
-#
 msgid ""
 "Your backup succeeded. We will now continue to explain the further upgrade "
 "process."
 msgstr "Turvakoopia valmis. Me informeerime edasistest uuenduste käigust"
 
-#
 msgid ""
 "Your collection exceeds the size of a single layer medium, you will need a "
 "blank dual layer DVD!"
@@ -8840,7 +8531,6 @@ msgstr ""
 msgid "Your current collection will get lost!"
 msgstr "Praegune kogumik kustutatakse!"
 
-#
 msgid "Your dreambox is shutting down. Please stand by..."
 msgstr "Lülitan välja. Palun oota"
 
@@ -8936,21 +8626,17 @@ msgstr "Suurenda letterbox/anamorph filme."
 msgid "Zydas"
 msgstr "Zydas"
 
-#
 msgid "[alternative edit]"
-msgstr "[Lisavõimaluste lisamine ja kustutamine]"
+msgstr "[lisavõimaluste lisamine ja kustutamine]"
 
-#
 msgid "[bouquet edit]"
-msgstr "[Nimekirjade lisamine ja kustutamine]"
+msgstr "[nimekirjade lisamine ja kustutamine]"
 
-#
 msgid "[favourite edit]"
-msgstr "[Lemmikute lisamine ja kustutamine]"
+msgstr "[lemmikute lisamine ja kustutamine]"
 
-#
 msgid "[move mode]"
-msgstr "[Lemmikute häälestamine]"
+msgstr "[lemmikute häälestamine]"
 
 msgid "a HD skin from Kerni"
 msgstr "HD välimus Kernilt"
@@ -8963,25 +8649,21 @@ msgstr "CI kasutajaliidese määratud kanalid/teenused/levitajad"
 msgid "a gui to assign services/providers/caids to common interface modules"
 msgstr "CI kasutajaliidese määratud kanalid/levitajad/caids"
 
-#
 msgid "abort alternatives edit"
-msgstr "Tühista muudatused"
+msgstr "tühista muudatused"
 
-#
 msgid "abort bouquet edit"
-msgstr "Tühista muudatused"
+msgstr "tühista muudatused"
 
-#
 msgid "abort favourites edit"
-msgstr "Tühista muudatused"
+msgstr "tühista muudatused"
 
 #
 msgid "about to start"
 msgstr "just algab"
 
-#
 msgid "activate current configuration"
-msgstr "Aktiveeri muudatused"
+msgstr "aktiveeri muudatused"
 
 #
 msgid "activate network adapter configuration"
@@ -8991,73 +8673,58 @@ msgstr "aktiveeri võrgukaardi seaded"
 msgid "add AutoTimer..."
 msgstr "lisa autotaimer"
 
-#
 msgid "add Provider"
-msgstr "Lisa levitaja"
+msgstr "lisa levitaja"
 
 #
 msgid "add Service"
 msgstr "lisa Kanal"
 
-#
 msgid "add a nameserver entry"
-msgstr "Lisa nimeserver"
+msgstr "lisa nimeserver"
 
-#
 msgid "add alternatives"
-msgstr "Valikute lisamine"
+msgstr "valikute lisamine"
 
-#
 msgid "add bookmark"
-msgstr "Lisa uus tähis"
+msgstr "lisa uus tähis"
 
-#
 msgid "add bouquet"
-msgstr "Lisa nimekiri"
+msgstr "lisa nimekiri"
 
-#
 msgid "add directory to playlist"
-msgstr "Lisa kataloog esitusloendisse"
+msgstr "lisa kataloog esitusloendisse"
 
-#
 msgid "add file to playlist"
-msgstr "Lisa fail esitusloendisse"
+msgstr "lisa fail esitusloendisse"
 
-#
 msgid "add files to playlist"
-msgstr "Lisa failid esitusloendisse"
+msgstr "lisa failid esitusloendisse"
 
 #
 msgid "add filters"
 msgstr "lisa filtrid"
 
-#
 msgid "add marker"
-msgstr "Lisa marker"
+msgstr "lisa marker"
 
-#
 msgid "add recording (enter recording duration)"
-msgstr "Salvesta (sisesta salvestise kestvus)"
+msgstr "salvesta (sisesta salvestise kestvus)"
 
-#
 msgid "add recording (enter recording endtime)"
-msgstr "Salvesta (sisesta salvestise lõpuaeg)"
+msgstr "salvesta (sisesta salvestise lõpuaeg)"
 
-#
 msgid "add recording (indefinitely)"
-msgstr "Salvesta (pidev salvestus)"
+msgstr "salvesta (pidev salvestus)"
 
-#
 msgid "add recording (stop after current event)"
-msgstr "Salvesta (lõpeta peale praegust programmi)"
+msgstr "salvesta (lõpeta peale praegust programmi)"
 
-#
 msgid "add service to bouquet"
-msgstr "Lisa kanal nimekirja"
+msgstr "lisa kanal nimekirja"
 
-#
 msgid "add service to favourites"
-msgstr "Lisa kanal Lemmikutesse"
+msgstr "lisa kanal Lemmikutesse"
 
 #
 msgid "add services"
@@ -9080,19 +8747,19 @@ msgstr "tähestikujärjekord"
 
 msgid "assign color buttons (red/green/yellow/blue) to plugins from MOVIELIST."
 msgstr ""
-"Omista värvilised nupud (punane/roheline/kollane/sinine) MOVIELIST lisadele."
+"omista värvilised nupud (punane/roheline/kollane/sinine) MOVIELIST lisadele."
 
 msgid "assign color buttons to plugins from MOVIELIST"
-msgstr "Omista värvilised nupud MOVIELIST lisadele"
+msgstr "omista värvilised nupud MOVIELIST lisadele"
 
 msgid ""
 "assign long key-press (red/green/yellow/blue) to plugins or E2 functions."
 msgstr ""
-"Omista pikk vajutus (punane/roheline/kollane/sinine) lisadele või E2 "
+"omista pikk vajutus (punane/roheline/kollane/sinine) lisadele või E2 "
 "toimingutele."
 
 msgid "assign long key-press on color buttons to plugins or E2 functions"
-msgstr "Omista värviliste nuppude pikk vajutus lisadele või E2 toimingutele"
+msgstr "omista värviliste nuppude pikk vajutus lisadele või E2 toimingutele"
 
 #
 msgid "assigned CAIds:"
@@ -9102,39 +8769,32 @@ msgstr "määratud CAId-d:"
 msgid "assigned Services/Provider:"
 msgstr "määratud kanalid/levitajad:"
 
-#
 #, python-format
 msgid "audio track (%s) format"
-msgstr "Audio raja (%s) formaat"
+msgstr "audio raja (%s) formaat"
 
-#
 #, python-format
 msgid "audio track (%s) language"
-msgstr "Audio raja (%s) keel"
+msgstr "audio raja (%s) keel"
 
-#
 msgid "audio tracks"
-msgstr "Audio rajad"
+msgstr "audio rajad"
 
-#
 msgid "auto"
-msgstr "Automaatne"
+msgstr "automaatne"
 
 #
 msgid "available"
 msgstr "saadaval"
 
-#
 msgid "back"
-msgstr "Tagasi"
+msgstr "tagasi"
 
-#
 msgid "background image"
-msgstr "Taustapilt"
+msgstr "taustapilt"
 
-#
 msgid "backgroundcolor"
-msgstr "Taust"
+msgstr "taust"
 
 #
 msgid "better"
@@ -9152,10 +8812,9 @@ msgstr "keelatud"
 msgid "blue"
 msgstr "sinine"
 
-#
 #, python-format
 msgid "burn audio track (%s)"
-msgstr "Kirjuta audio rada/rajad (%s)"
+msgstr "kirjuta audio rada/rajad (%s)"
 
 #
 msgid "case-insensitive search"
@@ -9165,13 +8824,11 @@ msgstr "tõstutundetu otsing"
 msgid "case-sensitive search"
 msgstr "tõstutundlik otsing"
 
-#
 msgid "change recording (duration)"
-msgstr "Muuda salvestuse kestus"
+msgstr "muuda salvestuse kestust"
 
-#
 msgid "change recording (endtime)"
-msgstr "Muuda salvestuse lõpuaeg"
+msgstr "muuda salvestuse lõpuaega"
 
 #
 msgid "chapters"
@@ -9185,9 +8842,8 @@ msgstr "ringpolarisatsioon vasak"
 msgid "circular right"
 msgstr "ringpolarisatsioon parem"
 
-#
 msgid "clear playlist"
-msgstr "Tühjenda esitusloend"
+msgstr "tühjenda esitusloend"
 
 #
 msgid "complex"
@@ -9197,20 +8853,17 @@ msgstr "keeruline"
 msgid "config menu"
 msgstr "seadete menüü"
 
-#
 msgid "confirmed"
-msgstr "Kinnitatud"
+msgstr "kinnitatud"
 
-#
 msgid "connected"
-msgstr "Ã\9chendatud"
+msgstr "ühendatud"
 
-#
 msgid "continue"
-msgstr "Jätka"
+msgstr "jätka"
 
 msgid "control multiple Dreamboxes with different RCs"
-msgstr "Juhi mitut vastuvõtjat erinevate pultidega"
+msgstr "juhi mitut vastuvõtjat erinevate pultidega"
 
 #
 msgid "copy to bouquets"
@@ -9220,9 +8873,8 @@ msgstr "kopeeri nimekirjadesse"
 msgid "could not be removed"
 msgstr "eemaldamine võimatu"
 
-#
 msgid "create directory"
-msgstr "Loo kataloog"
+msgstr "loo kataloog"
 
 #, python-format
 msgid "currently installed image: %s"
@@ -9232,33 +8884,27 @@ msgstr "praegu installitud tarkvara: %s"
 msgid "daily"
 msgstr "iga päev"
 
-#
 msgid "day"
-msgstr "Päev"
+msgstr "päev"
 
-#
 msgid "delete"
-msgstr "Kustuta"
+msgstr "kustuta"
 
 #
 msgid "delete cut"
 msgstr "kustuta lõige"
 
-#
 msgid "delete file"
-msgstr "Kustuta fail"
+msgstr "kustuta fail"
 
-#
 msgid "delete playlist entry"
-msgstr "Kustuta esitusloendi kirje"
+msgstr "kustuta esitusloendi kirje"
 
-#
 msgid "delete saved playlist"
-msgstr "Kustuta salvestatud esitusloend"
+msgstr "kustuta salvestatud esitusloend"
 
-#
 msgid "delete..."
-msgstr "Kustuta"
+msgstr "kustuta..."
 
 msgid "description"
 msgstr "kirjeldus"
@@ -9275,29 +8921,25 @@ msgstr "keela move mode"
 msgid "disabled"
 msgstr "keelatud"
 
-#
 msgid "disconnected"
-msgstr "Lahtiühendatud"
+msgstr "lahtiühendatud"
 
 #
 msgid "do not change"
 msgstr "ära muuda"
 
-#
 msgid "do nothing"
-msgstr "Ã\84ra tee midagi"
+msgstr "ära tee midagi"
 
-#
 msgid "don't record"
-msgstr "Ã\84ra tee midagi"
+msgstr "ära salvesta"
 
 #
 msgid "done!"
 msgstr "valmis"
 
-#
 msgid "edit alternatives"
-msgstr "Lisavõimaluste lisamine ja kustutamine"
+msgstr "lisavõimaluste lisamine ja kustutamine"
 
 #
 msgid "edit filters"
@@ -9315,17 +8957,15 @@ msgstr "tühi"
 msgid "enable"
 msgstr "luba"
 
-#
 msgid "enable bouquet edit"
-msgstr "Luba nimekirjade muutmine"
+msgstr "luba nimekirjade muutmine"
 
 #
 msgid "enable favourite edit"
 msgstr "luba Lemmikute muutmine"
 
-#
 msgid "enable move mode"
-msgstr "Luba liigutamine menüüdes"
+msgstr "luba liigutamine menüüdes"
 
 #
 msgid "enabled"
@@ -9339,9 +8979,8 @@ msgstr "salvesta muudatused ja välju"
 msgid "end bouquet edit"
 msgstr "salvesta muudatused ja välju"
 
-#
 msgid "end cut here"
-msgstr "Lõpeta lõige siin"
+msgstr "lõpeta lõige siin"
 
 #
 msgid "end favourites edit"
@@ -9359,33 +8998,26 @@ msgstr "on võrdne"
 msgid "exact match"
 msgstr "täpne vaste"
 
-#
 msgid "exit DVD player or return to file browser"
-msgstr "Välju DVD-mängijast või mine tagasi failisirvijasse"
+msgstr "välju DVD-mängijast või mine tagasi failisirvijasse"
 
-#
 msgid "exit mediaplayer"
-msgstr "Välju meediamängijast"
+msgstr "välju meediamängijast"
 
-#
 msgid "exit movielist"
-msgstr "Välju salvestiste loendist"
+msgstr "välju salvestiste loendist"
 
-#
 msgid "exit nameserver configuration"
-msgstr "Välju nimeserverite seadistusest"
+msgstr "välju nimeserverite seadistusest"
 
-#
 msgid "exit network adapter configuration"
-msgstr "Võrgu häälestamine"
+msgstr "võrgu häälestamine"
 
-#
 msgid "exit network interface list"
-msgstr "Välju võrguliideste nimekirjast"
+msgstr "välju võrguliideste nimekirjast"
 
-#
 msgid "exit networkadapter setup menu"
-msgstr "Välju võrguliidese seademenüüst"
+msgstr "välju võrguliidese seademenüüst"
 
 #
 msgid "fileformats (BMP, PNG, JPG, GIF)"
@@ -9399,9 +9031,8 @@ msgstr "faili nimi"
 msgid "fine-tune your display"
 msgstr "peenhäälesta ekraani"
 
-#
 msgid "forward to the next chapter"
-msgstr "Hüppa järgmisele peatükile"
+msgstr "hüppa järgmisele peatükile"
 
 #
 msgid "free"
@@ -9423,25 +9054,21 @@ msgstr "mine ooterežiimi"
 msgid "grab this frame as bitmap"
 msgstr "salvesta see kaader bitmapina"
 
-#
 msgid "green"
-msgstr "vaba"
+msgstr "roheline"
 
-#
 msgid "hear radio..."
-msgstr "Kuula raadiot"
+msgstr "kuula raadiot..."
 
-#
 msgid "help..."
-msgstr "Abi"
+msgstr "abi..."
 
 #
 msgid "hide extended description"
 msgstr "peida laiendatud programmi info"
 
-#
 msgid "hide player"
-msgstr "Peida mängija"
+msgstr "peida mängija"
 
 #
 msgid "horizontal"
@@ -9483,33 +9110,26 @@ msgstr "käivita moodul"
 msgid "insert mark here"
 msgstr "pane märk siia"
 
-#
 msgid "jump back to the previous title"
-msgstr "Hüppa eelmisele salvestisele"
+msgstr "hüppa eelmisele salvestisele"
 
-#
 msgid "jump forward to the next title"
-msgstr "Hüppa järgmisele salvestisele"
+msgstr "hüppa järgmisele salvestisele"
 
-#
 msgid "jump to listbegin"
-msgstr "Mine nimekirja algusse"
+msgstr "mine nimekirja algusse"
 
-#
 msgid "jump to listend"
-msgstr "Mine loendi lõppu"
+msgstr "mine loendi lõppu"
 
-#
 msgid "jump to next marked position"
-msgstr "Mine järgmise lõikemärgini"
+msgstr "mine järgmise lõikemärgini"
 
-#
 msgid "jump to previous marked position"
-msgstr "Mine eelmise lõikemärgini"
+msgstr "mine eelmise lõikemärgini"
 
-#
 msgid "leave movie player..."
-msgstr "Lõpeta salvestise taasesitus"
+msgstr "lõpeta salvestise taasesitus..."
 
 #
 msgid "left"
@@ -9523,25 +9143,20 @@ msgstr "pikkus"
 msgid "list of EPG views..."
 msgstr "EPG vaadete nimekiri..."
 
-#
 msgid "list style compact"
-msgstr "Nimekirja stiil: compact"
+msgstr "nimekirja stiil: compact"
 
-#
 msgid "list style compact with description"
-msgstr "Nimekirja stiil: compact kirjeldusega"
+msgstr "nimekirja stiil: compact kirjeldusega"
 
-#
 msgid "list style default"
-msgstr "Nimekirja stiil: default"
+msgstr "nimekirja stiil: default"
 
-#
 msgid "list style single line"
-msgstr "Nimekirja stiil: single line"
+msgstr "nimekirja stiil: single line"
 
-#
 msgid "load playlist"
-msgstr "Lae esitusloend"
+msgstr "lae esitusloend"
 
 #
 msgid "locked"
@@ -9555,9 +9170,8 @@ msgstr "läbiviik kuni"
 msgid "manual"
 msgstr "juhend"
 
-#
 msgid "menu"
-msgstr "Menüü"
+msgstr "menüü"
 
 #
 msgid "menulist"
@@ -9583,27 +9197,21 @@ msgstr "kuu"
 msgid "move PiP to main picture"
 msgstr "Muuda PiP peapildiks"
 
-#
 msgid "move down to last entry"
-msgstr "Liigu viimasele reale"
+msgstr "liigu viimasele reale"
 
-#
 msgid "move down to next entry"
-msgstr "Liigu järgmisele reale"
+msgstr "liigu järgmisele reale"
 
-#
 msgid "move up to first entry"
-msgstr "Liigu esimesele reale"
+msgstr "liigu esimesele reale"
 
-#
 msgid "move up to previous entry"
-msgstr "Liigu eelmisele reale"
+msgstr "liigu eelmisele reale"
 
-#
 msgid "movie list"
-msgstr "Salvestiste loend"
+msgstr "salvestiste loend"
 
-#
 msgid "multinorm"
 msgstr "multinorm"
 
@@ -9611,13 +9219,11 @@ msgstr "multinorm"
 msgid "never"
 msgstr "mitte kunagi"
 
-#
 msgid "next channel"
-msgstr "Järgmine kanal"
+msgstr "järgmine kanal"
 
-#
 msgid "next channel in history"
-msgstr "Järgmine kanal ajaloos"
+msgstr "järgmine kanal ajaloos"
 
 #
 msgid "no"
@@ -9649,9 +9255,8 @@ msgstr "ilma ooterežiimita"
 msgid "no timeout"
 msgstr "ilma vaheajata"
 
-#
 msgid "none"
-msgstr "Mitte midagi"
+msgstr "mitte midagi"
 
 #
 msgid "not configured"
@@ -9697,21 +9302,17 @@ msgstr "nädalapäevast"
 msgid "once"
 msgstr "üks kord"
 
-#
 msgid "open nameserver configuration"
-msgstr "Tüüneri seaded"
+msgstr "nimeserveri seaded"
 
-#
 msgid "open servicelist"
-msgstr "Ava kanalite nimekiri"
+msgstr "ava kanalite nimekiri"
 
-#
 msgid "open servicelist(down)"
-msgstr "Ava kanalite nimekiri (alla)"
+msgstr "ava kanalite nimekiri (alla)"
 
-#
 msgid "open servicelist(up)"
-msgstr "Ava kanalite nimekiri (üles)"
+msgstr "ava kanalite nimekiri (üles)"
 
 #
 msgid "partial match"
@@ -9721,21 +9322,17 @@ msgstr "osaline vaste"
 msgid "pass"
 msgstr "lubatud"
 
-#
 msgid "pause"
-msgstr "Paus"
+msgstr "paus"
 
-#
 msgid "play entry"
-msgstr "Taasesita"
+msgstr "taasesita"
 
-#
 msgid "play from next mark or playlist entry"
-msgstr "Taasesita järgmisest märgist või valikust"
+msgstr "taasesita järgmisest märgist või valikust"
 
-#
 msgid "play from previous mark or playlist entry"
-msgstr "Taasesita eelmisest märgist"
+msgstr "taasesita eelmisest märgist"
 
 #
 msgid "please press OK when ready"
@@ -9745,13 +9342,11 @@ msgstr "vajuta OK kui valmis"
 msgid "please wait, loading picture..."
 msgstr "Pilti laetakse. Oota..."
 
-#
 msgid "previous channel"
-msgstr "Eelmine kanal"
+msgstr "eelmine kanal"
 
-#
 msgid "previous channel in history"
-msgstr "Eelmine kanal ajaloos"
+msgstr "eelmine kanal ajaloos"
 
 #
 msgid "record"
@@ -9761,9 +9356,8 @@ msgstr "salvestus"
 msgid "recording..."
 msgstr "salvestan"
 
-#
 msgid "red"
-msgstr "P"
+msgstr "punane"
 
 msgid "redesigned Kerni-HD1 skin"
 msgstr "redesigned Kerni-HD1 välimus"
@@ -9771,9 +9365,8 @@ msgstr "redesigned Kerni-HD1 välimus"
 msgid "redirect notifications to Growl"
 msgstr "saada teated edasi Growl-i"
 
-#
 msgid "remove a nameserver entry"
-msgstr "Kustuta nimeserver"
+msgstr "kustuta nimeserver"
 
 #
 msgid "remove after this position"
@@ -9787,9 +9380,8 @@ msgstr "kustuta kõik lisakanalid"
 msgid "remove all new found flags"
 msgstr "kustuta kõik uus kanal-tunnused"
 
-#
 msgid "remove before this position"
-msgstr "Kustuta kõik enne seda kohta"
+msgstr "kustuta kõik enne seda kohta"
 
 #
 msgid "remove bookmark"
@@ -9799,9 +9391,8 @@ msgstr "kustuta järjehoidja"
 msgid "remove directory"
 msgstr "kustuta kataloog"
 
-#
 msgid "remove entry"
-msgstr "Kustuta"
+msgstr "kustuta"
 
 #
 msgid "remove from parental protection"
@@ -9827,21 +9418,18 @@ msgstr "korda esitusloendit"
 msgid "repeated"
 msgstr "korduvalt"
 
-#
 msgid "rewind to the previous chapter"
-msgstr "Hüppa eelmisele peatükile"
+msgstr "hüppa eelmisele peatükile"
 
 #
 msgid "right"
 msgstr "parem"
 
-#
 msgid "save last directory on exit"
-msgstr "Palun vali sihtkaust või meedia"
+msgstr "salvesta väljumisel viimane vali sihtkaust või meedia"
 
-#
 msgid "save playlist"
-msgstr "Salvesta esitusloend"
+msgstr "salvesta esitusloend"
 
 #
 msgid "save playlist on exit"
@@ -9860,54 +9448,46 @@ msgstr "otsing käib - %d%% valmis!"
 msgid "scan state"
 msgstr "otsingu seis"
 
-#
 msgid "second"
 msgstr "sekund"
 
-#
 msgid "second cable of motorized LNB"
-msgstr "second cable of motorized LNB"
+msgstr ""
 
 #
 msgid "seconds"
 msgstr "sekundit"
 
 msgid "see service-epg (and PiP) from channels in an infobar"
-msgstr "Vaata inforiba kanalite teenuse EPG (ja pilt-pildis)"
+msgstr "vaata inforiba kanalite teenuse EPG (ja pilt-pildis)"
 
-#
 msgid "select"
-msgstr "Vali"
+msgstr "vali"
 
 #
 msgid "select CAId"
 msgstr "vali CAId"
 
-#
 msgid "select CAId's"
-msgstr "Vali CAID-id"
+msgstr "vali CAID-id"
 
-#
 msgid "select interface"
-msgstr "Vali võrguliides"
+msgstr "vali võrguliides"
 
-#
 msgid "select menu entry"
-msgstr "Kustuta valik"
+msgstr "vali menüüpunkt"
 
-#
 msgid "select movie"
-msgstr "Vali salvestis"
+msgstr "vali salvestis"
 
-#
 msgid "select the movie path"
-msgstr "Vali salvestiste kataloog"
+msgstr "vali salvestiste kataloog"
 
 msgid "service PIN"
 msgstr "kanali PIN"
 
 msgid "set enigma2 to standby-mode after startup"
-msgstr "pärast taaskäivitust läheb enigma2 ooterežiimi "
+msgstr "pärast taaskäivitust läheb enigma2 ooterežiimi"
 
 #
 msgid "sets the Audio Delay (LipSync)"
@@ -9916,61 +9496,47 @@ msgstr "seab audio viite (LipSync)"
 msgid "setup PIN"
 msgstr "seadete PIN"
 
-#
 msgid "show DVD main menu"
-msgstr "Näita DVD peamenüüd"
+msgstr "näita DVD peamenüüd"
 
-#
 msgid "show EPG..."
-msgstr "Näita EPG"
+msgstr "näita EPG..."
 
-#
 msgid "show Infoline"
-msgstr "Näita Infot"
+msgstr "näita Infot"
 
-#
 msgid "show all"
-msgstr "Näita kõik"
+msgstr "näita kõik"
 
-#
 msgid "show alternatives"
-msgstr "Näita alternatiivsed kanalid"
+msgstr "näita alternatiivsed kanalid"
 
-#
 msgid "show event details"
-msgstr "Näita detailsemat infot"
+msgstr "näita detailsemat infot"
 
-#
 msgid "show extended description"
-msgstr "Näita laiendatud kirjeldus"
+msgstr "näita laiendatud kirjeldus"
 
-#
 msgid "show first selected tag"
-msgstr "Näita esimene valitud märksõna"
+msgstr "näita esimene valitud märksõna"
 
-#
 msgid "show second selected tag"
-msgstr "Näita teine valitud märksõna"
+msgstr "näita teine valitud märksõna"
 
-#
 msgid "show shutdown menu"
-msgstr "Näita shutdown menüü"
+msgstr "näita shutdown menüü"
 
-#
 msgid "show single service EPG..."
-msgstr "Näita ühe kanali EPG"
+msgstr "näita ühe kanali EPG"
 
-#
 msgid "show tag menu"
-msgstr "Näita märksõnade loend"
+msgstr "näita märksõnade loend"
 
-#
 msgid "show transponder info"
-msgstr "Näita transponderi infot"
+msgstr "näita transponderi infot"
 
-#
 msgid "shuffle playlist"
-msgstr "Sega esitusloend"
+msgstr "sega esitusloend"
 
 #
 msgid "shut down"
@@ -9984,21 +9550,17 @@ msgstr "lülita välja"
 msgid "simple"
 msgstr "lihtne"
 
-#
 msgid "skip backward"
-msgstr "Mine tagasi"
+msgstr "mine tagasi"
 
-#
 msgid "skip backward (enter time)"
-msgstr "Mine tagasi (sisesta aeg)"
+msgstr "mine tagasi (sisesta aeg)"
 
-#
 msgid "skip forward"
-msgstr "Mine edasi"
+msgstr "mine edasi"
 
-#
 msgid "skip forward (enter time)"
-msgstr "Mine edasi (sisesta aeg)"
+msgstr "mine edasi (sisesta aeg)"
 
 #
 msgid "slide picture in loop"
@@ -10012,7 +9574,6 @@ msgstr "ajaline järjestus"
 msgid "special characters"
 msgstr "erimärgid"
 
-#
 msgid "standard"
 msgstr "standard"
 
@@ -10020,19 +9581,15 @@ msgstr "standard"
 msgid "standby"
 msgstr "ootele"
 
-#
 msgid "start cut here"
-msgstr "Alusta lõiget siit"
+msgstr "alusta lõiget siit"
 
-#
 msgid "start directory"
-msgstr "/var kaust"
+msgstr "juur kaust"
 
-#
 msgid "start timeshift"
-msgstr "Alusta ajanihkega"
+msgstr "alusta ajanihkega"
 
-#
 msgid "stereo"
 msgstr "stereo"
 
@@ -10040,53 +9597,42 @@ msgstr "stereo"
 msgid "stop PiP"
 msgstr "sulge PiP"
 
-#
 msgid "stop entry"
-msgstr "Peata"
+msgstr "peata"
 
-#
 msgid "stop recording"
-msgstr "Lõpeta salvestus"
+msgstr "lõpeta salvestus"
 
-#
 msgid "stop timeshift"
-msgstr "Lõpeta ajanihe"
+msgstr "lõpeta ajanihe"
 
 #
 msgid "swap PiP and main picture"
 msgstr "vaheta PiP- ja peapilt"
 
-#
 msgid "switch to bookmarks"
-msgstr "Mine lemmikute-loendisse"
+msgstr "mine lemmikute-loendisse"
 
-#
 msgid "switch to filelist"
-msgstr "Mine faililoendisse"
+msgstr "mine faililoendisse"
 
-#
 msgid "switch to playlist"
-msgstr "Mine esitusloendisse"
+msgstr "mine esitusloendisse"
 
-#
 msgid "switch to the next angle"
-msgstr "Vali järgmine vaatenurk"
+msgstr "vali järgmine vaatenurk"
 
-#
 msgid "switch to the next audio track"
-msgstr "Vali järgmine helikanal"
+msgstr "vali järgmine helikanal"
 
-#
 msgid "switch to the next subtitle language"
-msgstr "Vali järgmine subtiiter"
+msgstr "vali järgmine subtiiter"
 
-#
 msgid "template file"
-msgstr "Kustutamine nurjus!"
+msgstr ""
 
-#
 msgid "textcolor"
-msgstr "Värviline"
+msgstr "värviline"
 
 #
 msgid "this recording"
@@ -10096,13 +9642,11 @@ msgstr "see salvestis"
 msgid "this service is protected by a parental control pin"
 msgstr "see kanal on kaitstud lapselukuga"
 
-#
 msgid "toggle a cut mark at the current position"
-msgstr "Pane lõikemärk praegusele kohale"
+msgstr "pane lõikemärk praegusele kohale"
 
-#
 msgid "toggle time, chapter, audio, subtitle info"
-msgstr "Vaheta aja,salvestuse,heli,subtiitri info"
+msgstr "vaheta aja,salvestuse,heli,subtiitri info"
 
 msgid "tuner is not supported"
 msgstr "tuuner pole toetatud"
@@ -10126,9 +9670,8 @@ msgstr "tundmatu kanal"
 msgid "until standby/restart"
 msgstr "kuni ooterežiimini/taaskäivitamiseni"
 
-#
 msgid "use as HDD replacement"
-msgstr "Kasuta HDD asenduseks"
+msgstr "kasuta HDD asenduseks"
 
 msgid "use your Dreambox as Web proxy"
 msgstr "kasuta oma vasuvõtjat proksiserverina"
@@ -10144,13 +9687,11 @@ msgstr "kasutaja määratud"
 msgid "vertical"
 msgstr "vertikaal"
 
-#
 msgid "view extensions..."
-msgstr "Näita laiendused"
+msgstr "näita laiendusi..."
 
-#
 msgid "view recordings..."
-msgstr "Näita salvestisi"
+msgstr "näita salvestisi..."
 
 #
 msgid "wait for ci..."
@@ -10172,13 +9713,11 @@ msgstr "edukalt eemaldatud"
 msgid "weekly"
 msgstr "iga nädal"
 
-#
 msgid "whitelist"
-msgstr "whitelist"
+msgstr ""
 
-#
 msgid "working"
-msgstr "Salvestab"
+msgstr "salvestab"
 
 #
 msgid "yellow"
@@ -10192,12 +9731,11 @@ msgstr "jah"
 msgid "yes (keep feeds)"
 msgstr "jah (hoia feedid)"
 
-#
 msgid ""
 "your dreambox might be unusable now. Please consult the manual for further "
 "assistance before rebooting your dreambox."
 msgstr ""
-"Teie vastuvõtja võib olla nüüd kasutu.Uuri juhendit täiendava abileidmiseks "
+"teie vastuvõtja võib olla nüüd kasutu.Uuri juhendit täiendava abileidmiseks "
 "enne vastuvõtja alglaadimist."
 
 #
index baf1a84..188d3fe 100755 (executable)
--- a/po/fi.po
+++ b/po/fi.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2010-11-01 13:01+0000\n"
-"PO-Revision-Date: 2010-11-13 18:57+0200\n"
+"PO-Revision-Date: 2010-11-18 18:59+0200\n"
 "Last-Translator: Timo <timojarvenpaa@hotmail.com>\n"
 "Language-Team: none\n"
 "Language: fi\n"
@@ -3631,6 +3631,8 @@ msgstr "Hallitse verkkojakoja"
 msgid ""
 "Manage your music files in a database, play it with Merlin Music Player."
 msgstr ""
+"Hallitse musiikkitiedostojen tietokantaa, toista se Merlin-"
+"musiikkisoittimella."
 
 msgid "Manage your network shares..."
 msgstr "Hallitse verkkojakoja..."
@@ -3701,6 +3703,9 @@ msgid ""
 "Play all your favorite music and video files, organize them in playlists, "
 "view cover and album information."
 msgstr ""
+"Mediasoitin toistaa musiikin ja videot.\n"
+"Toista kaikki suosikkimusiikkisi ja videosi, järjestä niistä soittolistoja, "
+"näytä kansikuvia ja albumien tietoja."
 
 #
 msgid "Medium is not a writeable DVD!"
index 025f7a6..05e191e 100755 (executable)
--- a/po/is.po
+++ b/po/is.po
@@ -6,13 +6,13 @@ msgstr ""
 "Project-Id-Version: Icelandic translation v.1.44\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2010-11-01 13:01+0000\n"
-"PO-Revision-Date: 2010-10-06 12:12+0200\n"
+"PO-Revision-Date: 2010-11-18 19:57+0200\n"
 "Last-Translator: Baldur <bsveinsson@gmail.com>\n"
 "Language-Team: Polar Team/LT Team <baddi@oreind.is>\n"
+"Language: is\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: is\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Pootle 2.0.3\n"
 "X-Poedit-Language: Icelandic\n"
@@ -374,23 +374,20 @@ msgstr "<Sjálfgefinn staður bíómynda>"
 msgid "<Last timer location>"
 msgstr "<Síðasti staður tímastillinga>"
 
-#
 msgid "<unknown>"
-msgstr "<óþekktur>"
+msgstr "<óþekkt>"
 
-#
 msgid "??"
 msgstr "??"
 
-#
 msgid "A"
 msgstr "A"
 
 msgid "A BackToTheRoots-Skin .. or good old times."
-msgstr ""
+msgstr "BackToTheRoots-Skin eða gömlu góðu dagarnir."
 
 msgid "A BackToTheRoots-Skin ... or good old times."
-msgstr ""
+msgstr "BackToTheRoots-Skin eða gömlu góðu dagarnir."
 
 msgid "A basic ftp client"
 msgstr "Einfalt ftp forrit"
@@ -1052,10 +1049,10 @@ msgid "Brightness"
 msgstr "Birta"
 
 msgid "Browse for and connect to network shares"
-msgstr ""
+msgstr "Leita að og tengjast við samnýtt gögn á netinu"
 
 msgid "Browse for nfs/cifs shares and connect to them."
-msgstr ""
+msgstr "Leita að nfs/cifs samnýttum diskum á netinu og tengjast þeim."
 
 msgid "Browse network neighbourhood"
 msgstr "Leita á nærneti"
@@ -1070,7 +1067,7 @@ msgid "Burn to DVD"
 msgstr "Brenna á DVD"
 
 msgid "Burn your recordings to DVD"
-msgstr ""
+msgstr "Brenna þínar upptökur á DVD disk"
 
 msgid "Bus: "
 msgstr "Rás:"
@@ -1095,6 +1092,8 @@ msgid ""
 "CDInfo enables gathering album and track details from CDDB and CD-Text when "
 "playing Audio CDs in Mediaplayer."
 msgstr ""
+"CDinfo gerir mögulegt að ná í upplýsingar um disk og lög frá CDDB og CD-"
+"Texta þegar spilaður er hljómdiskur."
 
 msgid "CI assignment"
 msgstr "CI stillingar"
@@ -1334,7 +1333,7 @@ msgid "Compact Flash"
 msgstr "Compact Flash"
 
 msgid "Complete"
-msgstr "Búið"
+msgstr "Allt"
 
 msgid "Complex (allows mixing audio tracks and aspects)"
 msgstr "Flókið (mögulegt að blanda hljóð rásir og stærðar hlutföll)"
index 0c4395c..bc2a30c 100755 (executable)
--- a/po/pl.po
+++ b/po/pl.po
@@ -129,7 +129,7 @@ msgid " extensions."
 msgstr "Rozszerzenia"
 
 msgid " ms"
-msgstr ""
+msgstr " ms"
 
 msgid " packages selected."
 msgstr "Wybrane paczki"
@@ -379,16 +379,16 @@ msgid "A"
 msgstr "A"
 
 msgid "A BackToTheRoots-Skin .. or good old times."
-msgstr ""
+msgstr "Powrót do korzeni-Skórka .. lub starych dobrych czasów."
 
 msgid "A BackToTheRoots-Skin ... or good old times."
-msgstr ""
+msgstr "Powrót do korzeni-Skórka ... lub starych dobrych czasów."
 
 msgid "A basic ftp client"
-msgstr ""
+msgstr "Podstawowy klient ftp"
 
 msgid "A client for www.dyndns.org"
-msgstr ""
+msgstr "Klient dla www.dyndns.org"
 
 #
 #, python-format
@@ -423,10 +423,10 @@ msgid "A graphical EPG for all services of an specific bouquet"
 msgstr "Graficzny EPG dla wszystkich usług określonego bukietu"
 
 msgid "A graphical EPG interface"
-msgstr ""
+msgstr "Graficzny interfejs EPG"
 
 msgid "A graphical EPG interface."
-msgstr ""
+msgstr "Graficzny interfejs EPG."
 
 #
 msgid ""
@@ -437,13 +437,13 @@ msgstr ""
 "Zaktualizować istniejący wpis i kontynuować?\n"
 
 msgid "A nice looking HD skin from Kerni"
-msgstr ""
+msgstr "Fajnie wyglądająca skórka HD od Kerni"
 
 msgid "A nice looking HD skin in Brushed Alu Design from Kerni."
-msgstr ""
+msgstr "Fajnie wyglądająca skórka HD w tonacji starego aluminium od Kerni"
 
 msgid "A nice looking skin from Kerni"
-msgstr ""
+msgstr "Fajnie wyglądająca skórka od Kerni"
 
 #
 #, python-format
@@ -496,7 +496,7 @@ msgstr ""
 "Czy chcesz wyłączyć drugi interfejs sieciowy?"
 
 msgid "A simple downloading application for other plugins"
-msgstr ""
+msgstr "Prosta aplikacja pobierania dla innych wtyczek"
 
 #
 msgid ""
@@ -563,10 +563,10 @@ msgid "About..."
 msgstr "Informacje o tunerze..."
 
 msgid "Access to the ARD-Mediathek"
-msgstr ""
+msgstr "Dostęp do ARD-Mediathek"
 
 msgid "Access to the ARD-Mediathek online video database."
-msgstr ""
+msgstr "Dostęp online do bazy danych wideo ARD-Mediathek"
 
 #
 msgid "Accesspoint:"
@@ -699,10 +699,10 @@ msgstr ""
 "zobaczyć inny testowy ekran."
 
 msgid "Adult streaming plugin"
-msgstr ""
+msgstr "Wtyczka dla dorosłych"
 
 msgid "Adult streaming plugin."
-msgstr ""
+msgstr "Wtyczka dla dorosłych."
 
 #
 msgid "Advanced Options"
@@ -732,6 +732,8 @@ msgid ""
 "After a reboot or power outage, StartupToStandby will bring your Dreambox to "
 "standby-mode."
 msgstr ""
+"Po zaniku zasilania lub restarcie, funkcja StartupToStandby przełączy "
+"Dreamboxa do trybu czuwania."
 
 #
 msgid "After event"
@@ -747,7 +749,7 @@ msgstr ""
 "Dreamboxa."
 
 msgid "Ai.HD skin-style control plugin"
-msgstr ""
+msgstr "Wyczka kontroli skóry Ai.HD"
 
 #
 msgid "Album"
@@ -774,10 +776,10 @@ msgid "Allow zapping via Webinterface"
 msgstr "Zezwól na przełącznie z poziomu Web"
 
 msgid "Allows the execution of TuxboxPlugins."
-msgstr ""
+msgstr "Umożliwia wykonanie TuxboxPlugins."
 
 msgid "Allows user to download files from rapidshare in the background."
-msgstr ""
+msgstr "Pozwala użytkownikowi na pobieranie w tle plików z rapidshare."
 
 #
 msgid "Alpha"
@@ -792,7 +794,7 @@ msgid "Alternative services tuner priority"
 msgstr "Alternatywny priorytet usług tunera"
 
 msgid "Always ask"
-msgstr ""
+msgstr "Zawsze pytaj"
 
 #
 msgid "Always ask before sending"
@@ -895,7 +897,7 @@ msgid "Aspect Ratio"
 msgstr "Format obrazu:"
 
 msgid "Assigning providers/services/caids to a CI module"
-msgstr ""
+msgstr "Przypisywanie dostawców / usług / CAID do modułu CI"
 
 msgid "Atheros"
 msgstr "Atheros"
@@ -920,6 +922,8 @@ msgid ""
 "AudoSync allows delaying the sound output (Bitstream/PCM) so that it is "
 "synchronous to the picture."
 msgstr ""
+"AudoSync pozwala na opóźnienia dźwięku (Bitstream / PCM), synchronizuje sie "
+"do obrazu."
 
 #
 msgid "Australia"
@@ -973,6 +977,8 @@ msgid ""
 "AutoTimer scans the EPG and creates Timers depending on user-defined search  "
 "criteria."
 msgstr ""
+"AutoTimer skanuje EPG i tworzy Timery w zależności od zdefiniowanych przez "
+"użytkownika kryteriów."
 
 #
 msgid "Automatic"
@@ -983,30 +989,32 @@ msgid "Automatic Scan"
 msgstr "Automatyczne skanowanie"
 
 msgid "Automatic volume adjustment"
-msgstr ""
+msgstr "Automatyczna regulacja głośności"
 
 msgid "Automatic volume adjustment for ac3/dts services."
-msgstr ""
+msgstr "Automatyczna regulacja głośności dla kanałów w AC3 / DTS."
 
 msgid "Automatically change video resolution"
-msgstr ""
+msgstr "Automatyczna zmiana rozdzielczości wideo"
 
 msgid ""
 "Automatically changes the output resolution depending on the video "
 "resolution you are watching."
 msgstr ""
+"Automatycznie zmienia rozdzielczości w zależności od rozdzielczości wideo "
+"jaką oglądasz."
 
 msgid "Automatically create timer events based on keywords"
-msgstr ""
+msgstr "Automatycznie tworzy timery na podstawie słów kluczowych"
 
 msgid "Automatically informs you on low internal memory"
-msgstr ""
+msgstr "Automatycznie informuje o niskim poziomie pamięci wewnętrznej"
 
 msgid "Automatically refresh EPG"
-msgstr ""
+msgstr "Automatyczne odświeżanie EPG"
 
 msgid "Automatically send crashlogs to Dream Multimedia"
-msgstr ""
+msgstr "Automatyczne wysyłanie crash logów do Dream Multimedia"
 
 #
 msgid "Autos & Vehicles"
@@ -1029,10 +1037,10 @@ msgid "BA"
 msgstr "BA"
 
 msgid "BASIC-HD Skin by Ismail Demir"
-msgstr ""
+msgstr "BASIC-HD Skin by Ismail Demir"
 
 msgid "BASIC-HD Skin for Dreambox Images created from Ismail Demir"
-msgstr ""
+msgstr "BASIC-HD Skin for Dreambox Images created from Ismail Demir"
 
 #
 msgid "BB"
@@ -1123,10 +1131,10 @@ msgid "Blue boost"
 msgstr "Niebieski"
 
 msgid "Bonjour/Avahi control plugin"
-msgstr ""
+msgstr "Wtyczka kontroli Bonjour/Avahi"
 
 msgid "Bonjour/Avahi control plugin."
-msgstr ""
+msgstr "Wtyczka kontroli Bonjour/Avahi."
 
 #
 msgid "Bookmarks"
@@ -1145,10 +1153,10 @@ msgid "Brightness"
 msgstr "Jasność"
 
 msgid "Browse for and connect to network shares"
-msgstr ""
+msgstr "Przeglądaj i łącz się do udziałów sieciowych"
 
 msgid "Browse for nfs/cifs shares and connect to them."
-msgstr ""
+msgstr "Przeglądaj udziały NFS / CIFS i podłącz się do nich."
 
 #
 msgid "Browse network neighbourhood"
@@ -1166,7 +1174,7 @@ msgid "Burn to DVD"
 msgstr "Wypal na DVD..."
 
 msgid "Burn your recordings to DVD"
-msgstr ""
+msgstr "Wypal swoje nagrania na DVD"
 
 #
 msgid "Bus: "
@@ -1193,6 +1201,8 @@ msgid ""
 "CDInfo enables gathering album and track details from CDDB and CD-Text when "
 "playing Audio CDs in Mediaplayer."
 msgstr ""
+"CDInfo umożliwia gromadzenie albumów i utworów z CDDB i CD-Text podczas "
+"odtwarzania płyt Audio CD w Media playerze."
 
 #
 msgid "CI assignment"
@@ -1215,10 +1225,10 @@ msgid "Cache Thumbnails"
 msgstr "Przechowuj miniatury"
 
 msgid "Callmonitor for NCID-based call notification"
-msgstr ""
+msgstr "Monitor rozmów dla NCID-bazowych powiadomieniach połączenia"
 
 msgid "Callmonitor for the Fritz!Box routers"
-msgstr ""
+msgstr "Callmonitor dla routerów Fritz!Box"
 
 msgid "Can't connect to server. Please check your network!"
 msgstr "Nie można się połączyć. Sprawdź sieć!"
@@ -1272,13 +1282,13 @@ msgid "Change pin code"
 msgstr "Zmień kod pin"
 
 msgid "Change service PIN"
-msgstr ""
+msgstr "Zmień PIN serwisu"
 
 msgid "Change service PINs"
-msgstr ""
+msgstr "Zmień PINy serwisu"
 
 msgid "Change setup PIN"
-msgstr ""
+msgstr "Zmień konfigurację PIN"
 
 #
 msgid "Change step size"
@@ -1289,7 +1299,7 @@ msgid "Change the hostname of your Dreambox."
 msgstr "Zmień nazwę hosta w Dreamboxie."
 
 msgid "Changelog"
-msgstr ""
+msgstr "Lista zmian"
 
 #
 msgid "Channel"
@@ -1360,7 +1370,7 @@ msgid "Choose bouquet"
 msgstr "Wybierz bukiet"
 
 msgid "Choose image to download"
-msgstr ""
+msgstr "Wybierz Image do pobrania"
 
 #
 msgid "Choose target folder"
@@ -1399,10 +1409,10 @@ msgid "Cleanup Wizard settings"
 msgstr "Kreator czyszczenia"
 
 msgid "Cleanup timerlist automatically"
-msgstr ""
+msgstr "Czyść listę Timerów automatycznie"
 
 msgid "Cleanup timerlist automatically."
-msgstr ""
+msgstr "Czyść listę Timerów automatycznie."
 
 #
 msgid "CleanupWizard"
@@ -1532,7 +1542,7 @@ msgid "Configure nameservers"
 msgstr "Konfiguracja nameservera"
 
 msgid "Configure your WLAN network interface"
-msgstr ""
+msgstr "Konfiguracja karty sieciowej WLAN"
 
 #
 msgid "Configure your internal LAN"
@@ -1595,28 +1605,28 @@ msgid "Contrast"
 msgstr "Kontrast"
 
 msgid "Control your Dreambox with your Web browser."
-msgstr ""
+msgstr "Zarządzaj Dreamboxem przez przeglądarkę internetową."
 
 msgid "Control your Dreambox with your browser"
-msgstr ""
+msgstr "Zarządzaj Dreamboxem przez przeglądarkę internetową"
 
 msgid "Control your dreambox with only the MUTE button"
-msgstr ""
+msgstr "Sterowanie Dreamboxem tylko za pomocą przycisku MUTE"
 
 msgid "Control your dreambox with only the MUTE button."
-msgstr ""
+msgstr "Sterowanie Dreamboxem tylko za pomocą przycisku MUTE."
 
 msgid "Control your internal system fan."
-msgstr ""
+msgstr "Sterowanie wewnętrznego wentylatora."
 
 msgid "Control your kids's tv usage"
-msgstr ""
+msgstr "Zarządzaj kotrolą rodzicielską"
 
 msgid "Control your system fan"
-msgstr ""
+msgstr "Sterowanie wentylatorem systemu."
 
 msgid "Copy, rename, delete, move local files on your Dreambox."
-msgstr ""
+msgstr "Kopiuj, zmieniaj nazwy, usuwaj, przenoś pliki lokalne na Dreambox."
 
 #
 msgid "Could not connect to Dreambox .NFI Image Feed Server:"
@@ -1664,10 +1674,10 @@ msgid "Create DVD-ISO"
 msgstr "Stwórz DVD-ISO"
 
 msgid "Create a backup of your Video DVD on your DreamBox hard drive."
-msgstr ""
+msgstr "Tworzy kopię zapasową Twojego Video DVD na twardym dysku DreamBoxa."
 
 msgid "Create a backup of your Video-DVD"
-msgstr ""
+msgstr "Tworzy kopię zapasową Twojego Video DVD"
 
 #
 msgid "Create a new AutoTimer."
@@ -1686,13 +1696,13 @@ msgid "Create movie folder failed"
 msgstr "Tworzenie katalogu filmu nie powiodło się"
 
 msgid "Create preview pictures of your Movies"
-msgstr ""
+msgstr "Tworzy zdjęciowy podgląd twoich filmów"
 
 msgid "Create remote timers"
-msgstr ""
+msgstr "Tworzenie zdalnych Timerów"
 
 msgid "Create timers on remote Dreamboxes."
-msgstr ""
+msgstr "Zdalne tworzenie Timerów na Dreamboxach."
 
 #
 #, python-format
@@ -1712,7 +1722,7 @@ msgid "Current Transponder"
 msgstr "Aktualny Transponder"
 
 msgid "Current device: "
-msgstr ""
+msgstr "Obecne urządzenia:"
 
 #
 msgid "Current settings:"
@@ -1727,7 +1737,7 @@ msgid "Current version:"
 msgstr "Aktualna wersja:"
 
 msgid "Currently installed image"
-msgstr ""
+msgstr "Aktualnie zainstalowane Image"
 
 #
 #, python-format
@@ -1759,23 +1769,23 @@ msgid "Customize"
 msgstr "Konfiguracja"
 
 msgid "Customize Vali-XD skins"
-msgstr ""
+msgstr "Dostosuj skórki Vali-XD"
 
 msgid "Customize Vali-XD skins by yourself."
-msgstr ""
+msgstr "Dostosuj przez siebie skórki Vali-XD."
 
 #
 msgid "Cut"
 msgstr "Wytnij"
 
 msgid "Cut your movies"
-msgstr ""
+msgstr "Przycinaj swoje filmy"
 
 msgid "Cut your movies."
-msgstr ""
+msgstr "Przycinaj swoje filmy."
 
 msgid "CutListEditor allows you to edit your movies"
-msgstr ""
+msgstr "CutListEditor pozwala na edycję filmów"
 
 msgid ""
 "CutListEditor allows you to edit your movies.\n"
@@ -1783,6 +1793,11 @@ msgid ""
 "cut'.\n"
 "Then seek to the end, press OK, select 'end cut'. That's it."
 msgstr ""
+"CutListEditor pozwala na edycję filmów.\n"
+"Zaznacz odkąd chcesz wyciąć. Naciśnij przycisk OK, wybierz opcję \"rozpocząć "
+"cięcie.\n"
+"Następnie zaznacz koniec, naciśnij OK, wybierz \"koniec cięcia\". To "
+"wszystko."
 
 #
 msgid "Cutlist editor..."
@@ -1833,13 +1848,16 @@ msgid "DVD media toolbox"
 msgstr "Narzedzia nośnika DVD"
 
 msgid "DVDPlayer plays your DVDs on your Dreambox"
-msgstr ""
+msgstr "DVDPlayer odtworzy płyty DVD na Twoim Dreamboxie"
 
 msgid ""
 "DVDPlayer plays your DVDs on your Dreambox.\n"
 "With the DVDPlayer you can play your DVDs on your Dreambox from a DVD or "
 "even from an iso file or video_ts folder on your harddisc or network."
 msgstr ""
+"DVDPlayer odtworzy płyty DVD na Twoim Dreamboxie.\n"
+"Za pomocą DVDPlayer można odtwarzać filmy DVD na Dreambox z czytnikiem DVD "
+"lub z pliku iso oraz foldera VIDEO_TS na dysku twardym lub z sieci."
 
 #
 msgid "Danish"
@@ -1895,10 +1913,10 @@ msgid "Defaults"
 msgstr "Domyślne"
 
 msgid "Define a startup service"
-msgstr ""
+msgstr "Zdefiniuj usługi startowe"
 
 msgid "Define a startup service for your Dreambox."
-msgstr ""
+msgstr "Zdefiniuj usługi startowe dla Twojego Dreamboxa."
 
 #
 msgid "Delay"
@@ -1946,7 +1964,7 @@ msgid "Deselect"
 msgstr "Odznacz"
 
 msgid "Details for plugin: "
-msgstr ""
+msgstr "Szczegóły dotyczące wtyczki:"
 
 #
 msgid "Detected HDD:"
@@ -1993,7 +2011,7 @@ msgid "Dir:"
 msgstr "Katalog:"
 
 msgid "Direct playback of Youtube videos"
-msgstr ""
+msgstr "Bezpośrednie odtwarzanie filmów z YouTube"
 
 #
 msgid "Direct playback of linked titles without menu"
@@ -2069,10 +2087,10 @@ msgid "Display search results by:"
 msgstr "Pokaż rezultat wyszukiwania wg:"
 
 msgid "Display your photos on the TV"
-msgstr ""
+msgstr "Wyświetlanie zdjęć na ekranie telewizora"
 
 msgid "Displays movie information from the InternetMovieDatabase"
-msgstr ""
+msgstr "Wyświetla napisy z InternetMovieDatabase"
 
 #
 #, python-format
@@ -2141,7 +2159,7 @@ msgstr "Czy chcesz wykonać kolejne ręczne skanowanie?"
 
 #, python-format
 msgid "Do you want to download the image to %s ?"
-msgstr ""
+msgstr "Czy chcesz pobrać Image do %s ?"
 
 #
 msgid "Do you want to enable the parental control feature on your dreambox?"
@@ -2237,7 +2255,7 @@ msgstr "Ładuj"
 
 #, python-format
 msgid "Download %s from Server"
-msgstr ""
+msgstr "Pobrano %s z Serwera"
 
 #
 msgid "Download .NFI-Files for USB-Flasher"
@@ -2252,7 +2270,7 @@ msgid "Download Video"
 msgstr "Pobierz film"
 
 msgid "Download files from Rapidshare"
-m