MythTV  master
teletextdecoder.cpp
Go to the documentation of this file.
1 /* =============================================================
2  * File : vbidecoder.cpp
3  * Author: Frank Muenchow <beebof@gmx.de>
4  * Martin Barnasconi
5  * Date : 2005-10-25
6  *
7  * This program is free software; you can redistribute it
8  * and/or modify it under the terms of the GNU General
9  * Public License as published by the Free Software Foundation;
10  * either version 2, or (at your option)
11  * any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * ============================================================= */
19 #include <cctype>
20 #include <cstdint>
21 #include <cstring>
22 
23 extern "C" {
24 #include <cinttypes>
25 #include "recorders/vbitext/vt.h"
26 }
27 
29 
32 #include "osd.h"
33 #include "vbilut.h"
34 
41 void TeletextDecoder::Decode(const unsigned char *buf, int vbimode)
42 {
43  int err = 0;
44  int latin1 = -1;
45  int pagenum = 0;
46  int subpagenum = 0;
47  int lang = 0;
48  int flags = 0;
49  uint magazine = 0;
50  uint packet = 0;
51  uint header = 0;
52 
53  if (!m_teletextReader)
54  return;
55 
57 
58  switch (vbimode)
59  {
60  case VBI_IVTV:
61  header = hamm16(buf, &err);
62 
63  if (err & 0xf000)
64  return; // error in data header
65 
66  magazine = header & 7;
67  packet = (header >> 3) & 0x1f;
68 
69  buf += 2;
70  break;
71 
72  case VBI_DVB:
73  case VBI_DVB_SUBTITLE:
74  // zahl1 = hamm84(buf,&err) * 16 + hamm84(buf+1,&err);
75 
76  magazine = 0;
77  if (buf[0] & 0x40)
78  magazine += 1;
79  if (buf[0] & 0x10)
80  magazine += 2;
81  if (buf[0] & 0x04)
82  magazine += 4;
83 
84  packet = 0;
85  if (buf[0] & 0x01)
86  packet += 1;
87  if (buf[1] & 0x40)
88  packet += 2;
89  if (buf[1] & 0x10)
90  packet += 4;
91  if (buf[1] & 0x04)
92  packet += 8;
93  if (buf[1] & 0x01)
94  packet += 16;
95 
96  if (err == 1)
97  return; // error in data header
98 
99  buf += 2;
100  break;
101 
102  default:
103  return; // error in vbimode
104  }
105 
106  int b1=0;
107  int b2=0;
108  int b3=0;
109  int b4=0;
110  switch (packet)
111  {
112  case 0: // Page Header
113  switch (vbimode)
114  {
115  case VBI_IVTV:
116  b1 = hamm16(buf, &err);// page number
117  b2 = hamm16(buf+2, &err);// subpage number + flags
118  b3 = hamm16(buf+4, &err);// subpage number + flags
119  b4 = hamm16(buf+6, &err);// language code + more flags
120  if (err & 0xf000)
121  return;
122 
123  break;
124 
125  case VBI_DVB:
126  case VBI_DVB_SUBTITLE:
127  b1 = hamm84(buf+1, &err)*16+hamm84(buf, &err);
128  b2 = hamm84(buf+3, &err)*16+hamm84(buf+2, &err);
129  b3 = hamm84(buf+5, &err)*16+hamm84(buf+4, &err);
130  b4 = hamm84(buf+7, &err)*16+hamm84(buf+6, &err);
131  if (err == 1)
132  return;
133 
134  break;
135 
136  default:
137  return; // error in vbimode
138  }
139 
140  subpagenum= (b2 + b3 * 256) & 0x3f7f;
141  pagenum = (magazine ? magazine : 8)*256 + b1;
142 
143  lang = "\0\4\2\6\1\5\3\7"[b4 >> 5] + (latin1 ? 0 : 8);
144  flags = b4 & 0x1F;
145  flags |= b3 & 0xC0;
146  flags |= (b2 & 0x80) >> 2;
147  m_teletextReader->AddPageHeader(pagenum, subpagenum, buf,
148  vbimode, lang, flags);
149 
150  break;
151 
152  default: // Page Data
153  m_teletextReader->AddTeletextData((magazine ? magazine : 8), packet,
154  buf, vbimode);
155  break;
156  }
157 }
VBI_IVTV
@ VBI_IVTV
Definition: vbilut.h:23
vt.h
hamm84
int hamm84(const uint8_t *p, int *err)
Definition: vbilut.cpp:333
TeletextDecoder::Decode
void Decode(const unsigned char *buf, int vbimode)
Decodes teletext data.
Definition: teletextdecoder.cpp:41
vbimode
vbimode
Definition: vbilut.h:21
osd.h
teletextreader.h
VBI_DVB_SUBTITLE
@ VBI_DVB_SUBTITLE
< DVB packet
Definition: vbilut.h:25
mythlogging.h
vbilut.h
uint
unsigned int uint
Definition: compat.h:81
TeletextDecoder::m_teletextReader
TeletextReader * m_teletextReader
Definition: teletextdecoder.h:19
VBI_DVB
@ VBI_DVB
< IVTV packet
Definition: vbilut.h:24
TeletextReader::AddTeletextData
void AddTeletextData(int magazine, int row, const uint8_t *buf, int vbimode)
Definition: teletextreader.cpp:402
TeletextReader::AddPageHeader
void AddPageHeader(int page, int subpage, const uint8_t *buf, int vbimode, int lang, int flags)
Definition: teletextreader.cpp:304
hamm16
int hamm16(const uint8_t *p, int *err)
Definition: vbilut.cpp:343
TeletextDecoder::m_decoderType
int m_decoderType
Definition: teletextdecoder.h:20
teletextdecoder.h