fix refcounts
[enigma2.git] / lib / dvb / pmt.cpp
index ccc779605db576cbfb47772432586272aa48d30e..7f560c8e6c7d9b0227fc17d48bb939f5ed617b36 100644 (file)
@@ -13,6 +13,7 @@
 #include <dvbsi++/iso639_language_descriptor.h>
 #include <dvbsi++/stream_identifier_descriptor.h>
 #include <dvbsi++/subtitling_descriptor.h>
+#include <dvbsi++/teletext_descriptor.h>
 
 eDVBServicePMTHandler::eDVBServicePMTHandler()
        :m_ca_servicePtr(0), m_dvb_scan(0), m_decode_demux_num(0xFF)
@@ -140,7 +141,7 @@ void eDVBServicePMTHandler::PATready(int)
 
 PyObject *eDVBServicePMTHandler::getCaIds()
 {
-       PyObject *ret=0;
+       ePyObject ret;
 
        program prog;
 
@@ -156,7 +157,7 @@ PyObject *eDVBServicePMTHandler::getCaIds()
                }
        }
 
-       return ret ? ret : PyList_New(0);
+       return ret ? (PyObject*)ret : (PyObject*)PyList_New(0);
 }
 
 int eDVBServicePMTHandler::getProgramInfo(struct program &program)
@@ -245,13 +246,36 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
                                                                        s.composition_page_id = (*it)->getCompositionPageId();
                                                                        s.ancillary_page_id = (*it)->getAncillaryPageId();
                                                                        s.language_code = (*it)->getIso639LanguageCode();
+//                                                                     eDebug("add dvb subtitle %s PID %04x, type %d, composition page %d, ancillary_page %d",
+//                                                                             s.language_code.c_str(), s.pid, s.subtitling_type, s.composition_page_id, s.ancillary_page_id);
                                                                        program.subtitleStreams.push_back(s);
                                                                }
                                                                break;
                                                        }
                                                        case TELETEXT_DESCRIPTOR:
                                                                if ( program.textPid == -1 || (*es)->getPid() == cached_tpid )
-                                                                       program.textPid = (*es)->getPid();
+                                                               {
+                                                                       subtitleStream s;
+                                                                       s.subtitling_type = 0x01; // EBU TELETEXT SUBTITLES
+                                                                       s.pid = program.textPid = (*es)->getPid();
+                                                                       TeletextDescriptor *d = (TeletextDescriptor*)(*desc);
+                                                                       const VbiTeletextList *list = d->getVbiTeletexts();
+                                                                       for (VbiTeletextConstIterator it(list->begin()); it != list->end(); ++it)
+                                                                       {
+                                                                               switch((*it)->getTeletextType())
+                                                                               {
+                                                                                       case 0x02: // Teletext subtitle page
+                                                                                       case 0x05: // Teletext subtitle page for hearing impaired pepople
+                                                                                               s.language_code = (*it)->getIso639LanguageCode();
+                                                                                               s.teletext_page_number = (*it)->getTeletextPageNumber();
+                                                                                               s.teletext_magazine_number = (*it)->getTeletextMagazineNumber();
+//                                                                                             eDebug("add teletext subtitle %s PID %04x, page number %d, magazine number %d",
+//                                                                                                     s.language_code.c_str(), s.pid, s.teletext_page_number, s.teletext_magazine_number);
+                                                                                               program.subtitleStreams.push_back(s);
+                                                                                               break;
+                                                                               }
+                                                                       }
+                                                               }
                                                                break;
                                                        case DTS_DESCRIPTOR:
                                                                isaudio = 1;
@@ -520,7 +544,7 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux,
                }
        } else
        {
-               serviceEvent(eventTuneFailed);
+               serviceEvent(eventNoResources);
                return res;
        }
 
@@ -832,3 +856,52 @@ void eDVBCAService::sendCAPMT()
                ++m_sendstate;
        }
 }
+
+static PyObject *createTuple(int pid, const char *type)
+{
+       PyObject *r = PyTuple_New(2);
+       PyTuple_SetItem(r, 0, PyInt_FromLong(pid));
+       PyTuple_SetItem(r, 1, PyString_FromString(type));
+       return r;
+}
+
+static inline PyList_AppendSteal(PyObject *list, PyObject *item)
+{
+       PyList_Append(list, item);
+       Py_DECREF(item);
+}
+
+PyObject *eDVBServicePMTHandler::program::createPythonObject()
+{
+       PyObject *r = PyDict_New();
+
+       PyObject *l = PyList_New(0);
+       
+       PyList_AppendSteal(l, createTuple(0, "pat"));
+
+       if (pmtPid != -1)
+               PyList_AppendSteal(l, createTuple(pmtPid, "pmt"));
+       
+       for (std::vector<eDVBServicePMTHandler::videoStream>::const_iterator
+                       i(videoStreams.begin()); 
+                       i != videoStreams.end(); ++i)
+               PyList_AppendSteal(l, createTuple(i->pid, "video"));
+
+       for (std::vector<eDVBServicePMTHandler::audioStream>::const_iterator
+                       i(audioStreams.begin()); 
+                       i != audioStreams.end(); ++i)
+               PyList_AppendSteal(l, createTuple(i->pid, "audio"));
+
+       for (std::vector<eDVBServicePMTHandler::subtitleStream>::const_iterator
+                       i(subtitleStreams.begin());
+                       i != subtitleStreams.end(); ++i)
+               PyList_AppendSteal(l, createTuple(i->pid, "subtitle"));
+
+       PyList_AppendSteal(l, createTuple(pcrPid, "pcr"));
+
+       if (textPid != -1)
+               PyList_AppendSteal(l, createTuple(textPid, "text"));
+               
+       PyDict_SetItemString(r, "pids", l);
+       return r;
+}