summaryrefslogtreecommitdiff
path: root/patches/patch-set.1.7.21/0005-Capture-teletext-subtitle-pages-from-PMT.patch
blob: 1600431f2f7d2be07fa10beaba4bbedce370dae1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
From 9960c81bed0689a397f8a3b9e3de91a3f75e5237 Mon Sep 17 00:00:00 2001
From: etobi <git@e-tobi.net>
Date: Fri, 12 Feb 2010 22:06:19 +0100
Subject: [PATCH 5/6] Capture teletext subtitle pages from PMT

---
 remux.c |   24 ++++++++++++++++++++++++
 remux.h |    5 +++++
 2 files changed, 29 insertions(+), 0 deletions(-)

diff --git a/remux.c b/remux.c
index adec265..4f9950f 100644
--- a/remux.c
+++ b/remux.c
@@ -439,6 +439,7 @@ void cPatPmtParser::Reset(void)
   pmtPid = -1;
   vpid = vtype = 0;
   ppid = 0;
+  tpid = 0;
 }
 
 void cPatPmtParser::ParsePat(const uchar *Data, int Length)
@@ -524,6 +525,7 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
      int NumSpids = 0;
      vpid = vtype = 0;
      ppid = 0;
+     tpid = 0;
      apids[0] = 0;
      dpids[0] = 0;
      spids[0] = 0;
@@ -628,6 +630,28 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
                                     spids[NumSpids]= 0;
                                     }
                                  break;
+                            case SI::TeletextDescriptorTag: {
+                                 dbgpatpmt(" teletext");
+                                 tpid = stream.getPid();
+                                 SI::TeletextDescriptor *sd = (SI::TeletextDescriptor *)d;
+                                 SI::TeletextDescriptor::Teletext ttxt;
+                                 if (totalTtxtSubtitlePages < MAXTXTPAGES) {
+                                    for (SI::Loop::Iterator it; sd->teletextLoop.getNext(ttxt, it); ) {
+                                        bool isSubtitlePage = (ttxt.getTeletextType() == 0x02) || (ttxt.getTeletextType() == 0x05);
+                                        if (isSubtitlePage && ttxt.languageCode[0]) {
+                                           dbgpatpmt(" '%s:%x.%x'", ttxt.languageCode, ttxt.getTeletextMagazineNumber(), ttxt.getTeletextPageNumber());
+                                           strn0cpy(teletextSubtitlePages[totalTtxtSubtitlePages].ttxtLanguage, I18nNormalizeLanguageCode(ttxt.languageCode), MAXLANGCODE1);
+                                           teletextSubtitlePages[totalTtxtSubtitlePages].ttxtPage = ttxt.getTeletextPageNumber();
+                                           teletextSubtitlePages[totalTtxtSubtitlePages].ttxtMagazine = ttxt.getTeletextMagazineNumber();
+                                           teletextSubtitlePages[totalTtxtSubtitlePages].ttxtType = ttxt.getTeletextType();
+                                           totalTtxtSubtitlePages++;
+                                           if (totalTtxtSubtitlePages >= MAXTXTPAGES)
+                                              break;
+                                           }
+                                        }
+                                    }
+                                 }
+                                 break;
                             case SI::ISO639LanguageDescriptorTag: {
                                  SI::ISO639LanguageDescriptor *ld = (SI::ISO639LanguageDescriptor *)d;
                                  dbgpatpmt(" '%s'", ld->languageCode);
diff --git a/remux.h b/remux.h
index 80d6afd..5f15dfe 100644
--- a/remux.h
+++ b/remux.h
@@ -220,6 +220,7 @@ private:
   int vpid;
   int ppid;
   int vtype;
+  int tpid;
   int apids[MAXAPIDS + 1]; // list is zero-terminated
   int atypes[MAXAPIDS + 1]; // list is zero-terminated
   char alangs[MAXAPIDS][MAXLANGCODE2];
@@ -266,6 +267,9 @@ public:
   int Vtype(void) const { return vtype; }
        ///< Returns the video stream type as defined by the current PMT, or 0 if no video
        ///< stream type has been detected, yet.
+  int Tpid(void) { return tpid; }
+       ///< Returns the teletext pid as defined by the current PMT, or 0 if no teletext
+       ///< pid has been detected, yet.
   const int *Apids(void) const { return apids; }
   const int *Dpids(void) const { return dpids; }
   const int *Spids(void) const { return spids; }
@@ -280,6 +284,7 @@ public:
   uchar SubtitlingType(int i) const { return (0 <= i && i < MAXSPIDS) ? subtitlingTypes[i] : uchar(0); }
   uint16_t CompositionPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? compositionPageIds[i] : uint16_t(0); }
   uint16_t AncillaryPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? ancillaryPageIds[i] : uint16_t(0); }
+  const tTeletextSubtitlePage* TeletextSubtitlePages() const { return teletextSubtitlePages; }
   };
 
 // TS to PES converter:
-- 
1.7.6.3