eAUTable: add stop()
[enigma2.git] / lib / dvb / pmt.cpp
1 #include <lib/base/eerror.h>
2 #include <lib/dvb/pmt.h>
3 #include <lib/dvb/specs.h>
4 #include <lib/dvb/dvb.h>
5 #include <lib/dvb/metaparser.h>
6 #include <lib/dvb_ci/dvbci.h>
7 #include <lib/dvb/epgcache.h>
8 #include <dvbsi++/ca_program_map_section.h>
9 #include <dvbsi++/descriptor_tag.h>
10 #include <dvbsi++/iso639_language_descriptor.h>
11 #include <dvbsi++/stream_identifier_descriptor.h>
12
13 eDVBServicePMTHandler::eDVBServicePMTHandler(int record)
14         :m_ca_servicePtr(0)
15 {
16         m_record = record;
17         eDVBResourceManager::getInstance(m_resourceManager);
18         CONNECT(m_PMT.tableReady, eDVBServicePMTHandler::PMTready);
19         CONNECT(m_PAT.tableReady, eDVBServicePMTHandler::PATready);
20         eDebug("new PMT handler record: %d", m_record);
21 }
22
23 eDVBServicePMTHandler::~eDVBServicePMTHandler()
24 {
25         eDebug("delete PMT handler record: %d", m_record);
26         if (m_ca_servicePtr)
27         {
28                 eDebug("unregister caservice");
29                 uint8_t demux_num;
30                 m_demux->getCADemuxID(demux_num);
31                 ePtr<eTable<ProgramMapSection> > ptr;
32                 m_PMT.getCurrent(ptr);
33                 eDVBCAService::unregister_service(m_reference, demux_num, ptr);
34                 eDVBCIInterfaces::getInstance()->removePMTHandler(this);
35         }
36 }
37
38 void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel)
39 {
40         int state;
41         channel->getState(state);
42         
43         if ((m_last_channel_state != iDVBChannel::state_ok)
44                 && (state == iDVBChannel::state_ok) && (!m_demux))
45         {
46                 if (m_channel)
47                         if (m_channel->getDemux(m_demux, m_record ? 0 : iDVBChannel::capDecode))
48                                 eDebug("Allocating a demux for now tuned-in channel failed.");
49                 
50                 serviceEvent(eventTuned);
51                 
52                 if (m_demux)
53                 {
54                         eDebug("ok ... now we start!!");
55
56                         m_PAT.begin(eApp, eDVBPATSpec(), m_demux);
57
58                         if ( m_service && !m_service->cacheEmpty() )
59                                 serviceEvent(eventNewProgramInfo);
60                 }
61         } else if ((m_last_channel_state != iDVBChannel::state_failed) && 
62                         (state == iDVBChannel::state_failed))
63         {
64                 eDebug("tune failed.");
65                 serviceEvent(eventTuneFailed);
66         }
67 }
68
69 void eDVBServicePMTHandler::PMTready(int error)
70 {
71         if (error)
72                 serviceEvent(eventNoPMT);
73         else
74         {
75                 serviceEvent(eventNewProgramInfo);
76                 eEPGCache::getInstance()->PMTready(this);
77                 if (!m_pvr_channel)
78                 {
79                         if(!m_ca_servicePtr)   // don't send campmt to camd.socket for playbacked services
80                         {
81                                 uint8_t demux_num;
82                                 m_demux->getCADemuxID(demux_num);
83                                 eDVBCAService::register_service(m_reference, demux_num, m_ca_servicePtr);
84                                 eDVBCIInterfaces::getInstance()->addPMTHandler(this);
85                         }
86                         eDVBCIInterfaces::getInstance()->gotPMT(this);
87                 }
88                 if (m_ca_servicePtr)
89                 {
90                         ePtr<eTable<ProgramMapSection> > ptr;
91                         if (!m_PMT.getCurrent(ptr))
92                                 m_ca_servicePtr->buildCAPMT(ptr);
93                         else
94                                 eDebug("eDVBServicePMTHandler cannot call buildCAPMT");
95                 }
96         }
97 }
98
99 void eDVBServicePMTHandler::PATready(int)
100 {
101         eDebug("got PAT");
102         ePtr<eTable<ProgramAssociationSection> > ptr;
103         if (!m_PAT.getCurrent(ptr))
104         {
105                 int pmtpid = -1;
106                 std::vector<ProgramAssociationSection*>::const_iterator i;
107                 for (i = ptr->getSections().begin(); i != ptr->getSections().end(); ++i)
108                 {
109                         const ProgramAssociationSection &pat = **i;
110                         ProgramAssociationConstIterator program;
111                         for (program = pat.getPrograms()->begin(); program != pat.getPrograms()->end(); ++program)
112                                 if (eServiceID((*program)->getProgramNumber()) == m_reference.getServiceID())
113                                         pmtpid = (*program)->getProgramMapPid();
114                 }
115                 if (pmtpid == -1)
116                         serviceEvent(eventNoPATEntry);
117                 else
118                         m_PMT.begin(eApp, eDVBPMTSpec(pmtpid, m_reference.getServiceID().get()), m_demux);
119         } else
120                 serviceEvent(eventNoPAT);
121 }
122
123 int eDVBServicePMTHandler::getProgramInfo(struct program &program)
124 {
125         ePtr<eTable<ProgramMapSection> > ptr;
126
127         program.videoStreams.clear();
128         program.audioStreams.clear();
129         program.pcrPid = -1;
130         program.isCrypted = false;
131
132         if (!m_PMT.getCurrent(ptr))
133         {
134                 int cached_apid_ac3 = -1;
135                 int cached_apid_mpeg = -1;
136                 int cached_vpid = -1;
137                 if ( m_service && !m_service->cacheEmpty() )
138                 {
139                         cached_vpid = m_service->getCachePID(eDVBService::cVPID);
140                         cached_apid_mpeg = m_service->getCachePID(eDVBService::cAC3PID);
141                         cached_apid_ac3 = m_service->getCachePID(eDVBService::cAPID);
142                 }
143                 eDVBTableSpec table_spec;
144                 ptr->getSpec(table_spec);
145                 program.pmtPid = table_spec.pid < 0x1fff ? table_spec.pid : -1;
146                 std::vector<ProgramMapSection*>::const_iterator i;
147                 for (i = ptr->getSections().begin(); i != ptr->getSections().end(); ++i)
148                 {
149                         const ProgramMapSection &pmt = **i;
150                         program.pcrPid = pmt.getPcrPid();
151                         
152                         ElementaryStreamInfoConstIterator es;
153                         for (es = pmt.getEsInfo()->begin(); es != pmt.getEsInfo()->end(); ++es)
154                         {
155                                 int isaudio = 0, isvideo = 0, cadescriptors = 0;
156                                 videoStream video;
157                                 audioStream audio;
158                                 audio.component_tag=-1;
159                                 video.component_tag=-1;
160
161                                 video.pid = (*es)->getPid();
162                                 audio.pid = (*es)->getPid();
163
164                                 switch ((*es)->getType())
165                                 {
166                                 case 0x01: // MPEG 1 video
167                                 case 0x02: // MPEG 2 video
168                                         isvideo = 1;
169                                         //break; fall through !!!
170                                 case 0x03: // MPEG 1 audio
171                                 case 0x04: // MPEG 2 audio:
172                                         if (!isvideo)
173                                         {
174                                                 isaudio = 1;
175                                                 audio.type = audioStream::atMPEG;
176                                         }
177                                         //break; fall through !!!
178                                 case 0x06: // PES Private
179                                                 /* PES private can contain AC-3, DTS or lots of other stuff.
180                                                    check descriptors to get the exact type. */
181                                         for (DescriptorConstIterator desc = (*es)->getDescriptors()->begin();
182                                                         desc != (*es)->getDescriptors()->end(); ++desc)
183                                         {
184                                                 switch ((*desc)->getTag())
185                                                 {
186                                                 case AC3_DESCRIPTOR:
187                                                         if (!isvideo)
188                                                         {
189                                                                 isaudio = 1;
190                                                                 audio.type = audioStream::atAC3;
191                                                         }
192                                                         break;
193                                                 case ISO_639_LANGUAGE_DESCRIPTOR:
194                                                         if (!isvideo)
195                                                         {
196                                                                 const Iso639LanguageList *languages = ((Iso639LanguageDescriptor*)*desc)->getIso639Languages();
197                                                                         /* use last language code */
198                                                                 for (Iso639LanguageConstIterator i(languages->begin()); i != languages->end(); ++i)
199                                                                         audio.language_code = (*i)->getIso639LanguageCode();
200                                                         }
201                                                         break;
202                                                 case STREAM_IDENTIFIER_DESCRIPTOR:
203                                                         audio.component_tag =
204                                                                 video.component_tag =
205                                                                         ((StreamIdentifierDescriptor*)*desc)->getComponentTag();
206                                                         break;
207                                                 case CA_DESCRIPTOR:
208                                                         ++cadescriptors;
209                                                         break;
210                                                 }
211                                         }
212                                         break;
213                                 }
214                                 if (isaudio)
215                                 {
216                                         if ( !program.audioStreams.empty() &&
217                                                 ( audio.pid == cached_apid_ac3 || audio.pid == cached_apid_mpeg) )
218                                         {
219                                                 program.audioStreams.push_back(program.audioStreams[0]);
220                                                 program.audioStreams[0] = audio;
221                                         }
222                                         else
223                                                 program.audioStreams.push_back(audio);
224                                 }
225                                 else if (isvideo)
226                                 {
227                                         if ( !program.videoStreams.empty() && video.pid == cached_vpid )
228                                         {
229                                                 program.videoStreams.push_back(program.videoStreams[0]);
230                                                 program.videoStreams[0] = video;
231                                         }
232                                         else
233                                                 program.videoStreams.push_back(video);
234                                 }
235                                 else
236                                         continue;
237                                 if ( cadescriptors > 0 )
238                                         program.isCrypted=true;
239                         }
240                         if ( !program.isCrypted )
241                         {
242                                 for (DescriptorConstIterator desc = pmt.getDescriptors()->begin();
243                                         desc != pmt.getDescriptors()->end(); ++desc)
244                                 {
245                                         switch ((*desc)->getTag())
246                                         {
247                                         case CA_DESCRIPTOR:
248                                                 program.isCrypted=true;
249                                                 break;
250                                         }
251                                 }
252                                 break;
253                         }
254                 }
255                 return 0;
256         }
257         else if ( m_service && !m_service->cacheEmpty() )
258         {
259                 int vpid = m_service->getCachePID(eDVBService::cVPID),
260                         apid_ac3 = m_service->getCachePID(eDVBService::cAC3PID),
261                         apid_mpeg = m_service->getCachePID(eDVBService::cAPID),
262                         pcrpid = m_service->getCachePID(eDVBService::cPCRPID),
263                         cnt=0;
264                 if ( vpid != -1 )
265                 {
266                         videoStream s;
267                         s.pid = vpid;
268                         program.videoStreams.push_back(s);
269                         ++cnt;
270                 }
271                 if ( apid_ac3 != -1 )
272                 {
273                         audioStream s;
274                         s.type = audioStream::atAC3;
275                         s.pid = apid_ac3;
276                         program.audioStreams.push_back(s);
277                         ++cnt;
278                 }
279                 if ( apid_mpeg != -1 )
280                 {
281                         audioStream s;
282                         s.type = audioStream::atMPEG;
283                         s.pid = apid_mpeg;
284                         program.audioStreams.push_back(s);
285                         ++cnt;
286                 }
287                 if ( pcrpid != -1 )
288                 {
289                         ++cnt;
290                         program.pcrPid = pcrpid;
291                 }
292                 if ( cnt )
293                         return 0;
294         }
295         return -1;
296 }
297
298 int eDVBServicePMTHandler::getChannel(eUsePtr<iDVBChannel> &channel)
299 {
300         channel = m_channel;
301         if (channel)
302                 return 0;
303         else
304                 return -1;
305 }
306
307 int eDVBServicePMTHandler::getDemux(ePtr<iDVBDemux> &demux)
308 {
309         demux = m_demux;
310         if (demux)
311                 return 0;
312         else
313                 return -1;
314 }
315
316 int eDVBServicePMTHandler::getPVRChannel(ePtr<iDVBPVRChannel> &pvr_channel)
317 {
318         pvr_channel = m_pvr_channel;
319         if (pvr_channel)
320                 return 0;
321         else
322                 return -1;
323 }
324
325 int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref)
326 {
327         RESULT res;
328         m_reference = ref;
329         
330                 /* is this a normal (non PVR) channel? */
331         if (ref.path.empty())
332         {
333                 eDVBChannelID chid;
334                 ref.getChannelID(chid);
335                 res = m_resourceManager->allocateChannel(chid, m_channel);
336                 eDebug("allocate Channel: res %d", res);
337         } else
338         {
339                 eDVBMetaParser parser;
340                 
341                 if (parser.parseFile(ref.path))
342                         eWarning("no .meta file found, trying original service ref.");
343                 else
344                         m_reference = parser.m_ref;
345                 
346                 eDebug("alloc PVR");
347                         /* allocate PVR */
348                 res = m_resourceManager->allocatePVRChannel(m_pvr_channel);
349                 if (res)
350                         eDebug("allocatePVRChannel failed!\n");
351                 m_channel = m_pvr_channel;
352         }
353         
354         if (m_channel)
355         {
356                 m_channel->connectStateChange(
357                         slot(*this, &eDVBServicePMTHandler::channelStateChanged), 
358                         m_channelStateChanged_connection);
359                 m_last_channel_state = -1;
360                 channelStateChanged(m_channel);
361         } else
362         {
363                 serviceEvent(eventTuneFailed);
364                 return res;
365         }
366
367         if (m_pvr_channel)
368                 m_pvr_channel->playFile(ref.path.c_str());
369
370         ePtr<iDVBChannelList> db;
371         if (!m_resourceManager->getChannelList(db))
372                 db->getService((eServiceReferenceDVB&)m_reference, m_service);
373
374         return res;
375 }
376
377 std::map<eServiceReferenceDVB, eDVBCAService*> eDVBCAService::exist;
378
379 eDVBCAService::eDVBCAService()
380         :m_prev_build_hash(0), m_sendstate(0), m_retryTimer(eApp)
381 {
382         memset(m_used_demux, 0xFF, sizeof(m_used_demux));
383         CONNECT(m_retryTimer.timeout, eDVBCAService::sendCAPMT);
384         Connect();
385 }
386
387 eDVBCAService::~eDVBCAService()
388 {
389         eDebug("[eDVBCAService] free service %s", m_service.toString().c_str());
390         ::close(m_sock);
391 }
392
393 RESULT eDVBCAService::register_service( const eServiceReferenceDVB &ref, int demux_num, eDVBCAService *&caservice )
394 {
395         CAServiceMap::iterator it = exist.find(ref);
396         if ( it != exist.end() )
397                 caservice = it->second;
398         else
399         {
400                 caservice = (exist[ref]=new eDVBCAService());
401                 caservice->m_service = ref;
402                 eDebug("[eDVBCAService] new service %s", ref.toString().c_str() );
403         }
404 // search free demux entry
405         int iter=0, max_demux_slots = sizeof(caservice->m_used_demux);
406
407         while ( iter < max_demux_slots && caservice->m_used_demux[iter] != 0xFF )
408                 ++iter;
409
410         if ( iter < max_demux_slots )
411         {
412                 caservice->m_used_demux[iter] = demux_num & 0xFF;
413                 eDebug("[eDVBCAService] add demux %d to slot %d service %s", demux_num, iter, ref.toString().c_str());
414         }
415         else
416         {
417                 eDebug("[eDVBCAService] no more demux slots free for service %s!!", ref.toString().c_str());
418                 return -1;
419         }
420         return 0;
421 }
422
423 RESULT eDVBCAService::unregister_service( const eServiceReferenceDVB &ref, int demux_num, eTable<ProgramMapSection> *ptr )
424 {
425         CAServiceMap::iterator it = exist.find(ref);
426         if ( it == exist.end() )
427         {
428                 eDebug("[eDVBCAService] try to unregister non registered %s", ref.toString().c_str());
429                 return -1;
430         }
431         else
432         {
433                 eDVBCAService *caservice = it->second;
434                 bool freed = false;
435                 int iter = 0,
436                         used_demux_slots = 0,
437                         max_demux_slots = sizeof(caservice->m_used_demux)/sizeof(int);
438                 while ( iter < max_demux_slots )
439                 {
440                         if ( caservice->m_used_demux[iter] != 0xFF )
441                         {
442                                 if ( !freed && caservice->m_used_demux[iter] == demux_num )
443                                 {
444                                         eDebug("[eDVBCAService] free slot %d demux %d for service %s", iter, caservice->m_used_demux[iter], caservice->m_service.toString().c_str() );
445                                         caservice->m_used_demux[iter] = 0xFF;
446                                         freed=true;
447                                 }
448                                 else
449                                         ++used_demux_slots;
450                         }
451                         ++iter;
452                 }
453                 if (!freed)
454                 {
455                         eDebug("[eDVBCAService] couldn't free demux slot for demux %d", demux_num);
456                         return -1;
457                 }
458                 if (!used_demux_slots)  // no more used.. so we remove it
459                 {
460                         delete it->second;
461                         exist.erase(it);
462                 }
463                 else
464                 {
465                         if (ptr)
466                                 it->second->buildCAPMT(ptr);
467                         else
468                                 eDebug("[eDVBCAService] can not send updated demux info");
469                 }
470         }
471         return 0;
472 }
473
474 void eDVBCAService::Connect()
475 {
476         memset(&m_servaddr, 0, sizeof(struct sockaddr_un));
477         m_servaddr.sun_family = AF_UNIX;
478         strcpy(m_servaddr.sun_path, "/tmp/camd.socket");
479         m_clilen = sizeof(m_servaddr.sun_family) + strlen(m_servaddr.sun_path);
480         m_sock = socket(PF_UNIX, SOCK_STREAM, 0);
481         connect(m_sock, (struct sockaddr *) &m_servaddr, m_clilen);
482         fcntl(m_sock, F_SETFL, O_NONBLOCK);
483         int val=1;
484         setsockopt(m_sock, SOL_SOCKET, SO_REUSEADDR, &val, 4);
485 }
486
487 void eDVBCAService::buildCAPMT(eTable<ProgramMapSection> *ptr)
488 {
489         if (!ptr)
490                 return;
491
492         eDVBTableSpec table_spec;
493         ptr->getSpec(table_spec);
494
495         int pmtpid = table_spec.pid,
496                 pmt_version = table_spec.version;
497
498         uint8_t demux_mask = 0;
499         uint8_t first_demux_num = 0xFF;
500
501 #if 1
502         int iter=0, max_demux_slots = sizeof(m_used_demux);
503         while ( iter < max_demux_slots )
504         {
505                 if ( m_used_demux[iter] != 0xFF )
506                 {
507                         if ( first_demux_num == 0xFF )
508                                 first_demux_num = m_used_demux[iter];
509                         demux_mask |= (1 << m_used_demux[iter]);
510                 }
511                 ++iter;
512         }
513 #else
514         demux_mask = 3;
515         first_demux_num = 0;
516 #endif
517
518         if ( first_demux_num == 0xFF )
519         {
520                 eDebug("[eDVBCAService] no demux found for service %s", m_service.toString().c_str() );
521                 return;
522         }
523
524         eDebug("demux %d mask %02x prevhash %08x", first_demux_num, demux_mask, m_prev_build_hash);
525
526         unsigned int build_hash = (pmtpid << 16);
527         build_hash |= (demux_mask << 8);
528         build_hash |= (pmt_version&0xFF);
529
530         if ( build_hash == m_prev_build_hash )
531         {
532                 eDebug("[eDVBCAService] don't build/send the same CA PMT twice");
533                 return;
534         }
535
536         std::vector<ProgramMapSection*>::const_iterator i=ptr->getSections().begin();
537         if ( i != ptr->getSections().end() )
538         {
539                 CaProgramMapSection capmt(*i++, m_prev_build_hash ? 0x05 /*update*/ : 0x03 /*only*/, 0x01 );
540
541                 while( i != ptr->getSections().end() )
542                 {
543 //                      eDebug("append");
544                         capmt.append(*i++);
545                 }
546
547                 // add our private descriptors to capmt
548                 uint8_t tmp[10];
549
550                 tmp[0]=0x84;  // pmt pid
551                 tmp[1]=0x02;
552                 tmp[2]=pmtpid>>8;
553                 tmp[3]=pmtpid&0xFF;
554                 capmt.injectDescriptor(tmp, false);
555
556                 tmp[0] = 0x82; // demux
557                 tmp[1] = 0x02;
558                 tmp[2] = demux_mask;    // descramble bitmask
559                 tmp[3] = first_demux_num; // read section data from demux number
560                 capmt.injectDescriptor(tmp, false);
561
562                 tmp[0] = 0x81; // dvbnamespace
563                 tmp[1] = 0x08;
564                 tmp[2] = m_service.getDVBNamespace().get()>>24;
565                 tmp[3]=(m_service.getDVBNamespace().get()>>16)&0xFF;
566                 tmp[4]=(m_service.getDVBNamespace().get()>>8)&0xFF;
567                 tmp[5]=m_service.getDVBNamespace().get()&0xFF;
568                 tmp[6]=m_service.getTransportStreamID().get()>>8;
569                 tmp[7]=m_service.getTransportStreamID().get()&0xFF;
570                 tmp[8]=m_service.getOriginalNetworkID().get()>>8;
571                 tmp[9]=m_service.getOriginalNetworkID().get()&0xFF;
572                 capmt.injectDescriptor(tmp, false);
573
574                 capmt.writeToBuffer(m_capmt);
575         }
576
577         m_prev_build_hash = build_hash;
578
579         if ( m_sendstate != 0xFFFFFFFF )
580                 m_sendstate=0;
581         sendCAPMT();
582 }
583
584 void eDVBCAService::sendCAPMT()
585 {
586         if ( m_sendstate && m_sendstate != 0xFFFFFFFF ) // broken pipe retry
587         {
588                 ::close(m_sock);
589                 Connect();
590         }
591
592         int wp=0;
593         if ( m_capmt[3] & 0x80 )
594         {
595                 int i=0;
596                 int lenbytes = m_capmt[3] & ~0x80;
597                 while(i < lenbytes)
598                         wp = (wp << 8) | m_capmt[4 + i++];
599                 wp+=4;
600                 wp+=lenbytes;
601         }
602         else
603         {
604                 wp = m_capmt[3];
605                 wp+=4;
606         }
607
608         if ( write(m_sock, m_capmt, wp) == wp )
609         {
610                 m_sendstate=0xFFFFFFFF;
611                 eDebug("[eDVBCAService] send %d bytes",wp);
612 #if 1
613                 for(int i=0;i<wp;i++)
614                         eDebugNoNewLine("%02x ", m_capmt[i]);
615                 eDebug("");
616 #endif
617         }
618         else
619         {
620                 switch(m_sendstate)
621                 {
622                         case 0xFFFFFFFF:
623                                 ++m_sendstate;
624                                 m_retryTimer.start(0,true);
625 //                              eDebug("[eDVBCAService] send failed .. immediate retry");
626                                 break;
627                         default:
628                                 m_retryTimer.start(5000,true);
629 //                              eDebug("[eDVBCAService] send failed .. retry in 5 sec");
630                                 break;
631                 }
632                 ++m_sendstate;
633         }
634 }