+ int isaudio = 0, isvideo = 0;
+ videoStream video;
+ audioStream audio;
+ audio.component_tag=video.component_tag=-1;
+ video.type = videoStream::vtMPEG2;
+
+ switch ((*es)->getType())
+ {
+ case 0x1b: // AVC Video Stream (MPEG4 H264)
+ video.type = videoStream::vtMPEG4_H264;
+ case 0x01: // MPEG 1 video
+ case 0x02: // MPEG 2 video
+ isvideo = 1;
+ //break; fall through !!!
+ case 0x03: // MPEG 1 audio
+ case 0x04: // MPEG 2 audio:
+ if (!isvideo)
+ {
+ isaudio = 1;
+ audio.type = audioStream::atMPEG;
+ }
+ //break; fall through !!!
+ case 0x06: // PES Private
+ /* PES private can contain AC-3, DTS or lots of other stuff.
+ check descriptors to get the exact type. */
+ for (DescriptorConstIterator desc = (*es)->getDescriptors()->begin();
+ desc != (*es)->getDescriptors()->end(); ++desc)
+ {
+ switch ((*desc)->getTag())
+ {
+ case SUBTITLING_DESCRIPTOR:
+ {
+ SubtitlingDescriptor *d = (SubtitlingDescriptor*)(*desc);
+ const SubtitlingList *list = d->getSubtitlings();
+ subtitleStream s;
+ s.pid = (*es)->getPid();
+ for (SubtitlingConstIterator it(list->begin()); it != list->end(); ++it)
+ {
+ s.subtitling_type = (*it)->getSubtitlingType();
+ 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 )
+ {
+ 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;
+ audio.type = audioStream::atDTS;
+ break;
+ case AAC_DESCRIPTOR:
+ isaudio = 1;
+ audio.type = audioStream::atAAC;
+ break;
+ case AC3_DESCRIPTOR:
+ isaudio = 1;
+ audio.type = audioStream::atAC3;
+ break;
+ case ISO_639_LANGUAGE_DESCRIPTOR:
+ if (!isvideo)
+ {
+ const Iso639LanguageList *languages = ((Iso639LanguageDescriptor*)*desc)->getIso639Languages();
+ /* use last language code */
+ for (Iso639LanguageConstIterator i(languages->begin()); i != languages->end(); ++i)
+ audio.language_code = (*i)->getIso639LanguageCode();
+ }
+ break;
+ case STREAM_IDENTIFIER_DESCRIPTOR:
+ audio.component_tag =
+ video.component_tag =
+ ((StreamIdentifierDescriptor*)*desc)->getComponentTag();
+ break;
+ case CA_DESCRIPTOR:
+ {
+ CaDescriptor *descr = (CaDescriptor*)(*desc);
+ program.caids.insert(descr->getCaSystemId());
+ break;
+ }
+ }
+ }
+ break;
+ }
+ if (isaudio)
+ {
+ audio.pid = (*es)->getPid();
+
+ /* if we find the cached pids, this will be our default stream */
+ if (audio.pid == cached_apid_ac3 || audio.pid == cached_apid_mpeg)
+ program.defaultAudioStream = program.audioStreams.size();
+
+ /* also, we need to know the first non-mpeg (i.e. "ac3"/dts/...) stream */
+ if ((audio.type != audioStream::atMPEG) && ((first_ac3 == -1) || (audio.pid == cached_apid_ac3)))
+ first_ac3 = program.audioStreams.size();
+
+ program.audioStreams.push_back(audio);
+ }
+ else if (isvideo)
+ {
+ video.pid = (*es)->getPid();
+ if ( !program.videoStreams.empty() && video.pid == cached_vpid )
+ {
+ program.videoStreams.push_back(program.videoStreams[0]);
+ program.videoStreams[0] = video;
+ }
+ else
+ program.videoStreams.push_back(video);
+ }
+ 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());
+ }