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
23extern "C" {
24#include <cinttypes>
25}
26
29#include "vbilut.h"
30
37void TeletextDecoder::Decode(const unsigned char *buf, int vbimode)
38{
39 int err = 0;
40 int latin1 = -1;
41 int pagenum = 0;
42 int subpagenum = 0;
43 int lang = 0;
44 int flags = 0;
45 uint magazine = 0;
46 uint packet = 0;
47 uint header = 0;
48
50 return;
51
53
54 switch (vbimode)
55 {
56 case VBI_IVTV:
57 header = hamm16(buf, &err);
58
59 if (err & 0xf000)
60 return; // error in data header
61
62 magazine = header & 7;
63 packet = (header >> 3) & 0x1f;
64
65 buf += 2;
66 break;
67
68 case VBI_DVB:
70 // zahl1 = hamm84(buf,&err) * 16 + hamm84(buf+1,&err);
71
72 magazine = 0;
73 if (buf[0] & 0x40)
74 magazine += 1;
75 if (buf[0] & 0x10)
76 magazine += 2;
77 if (buf[0] & 0x04)
78 magazine += 4;
79
80 packet = 0;
81 if (buf[0] & 0x01)
82 packet += 1;
83 if (buf[1] & 0x40)
84 packet += 2;
85 if (buf[1] & 0x10)
86 packet += 4;
87 if (buf[1] & 0x04)
88 packet += 8;
89 if (buf[1] & 0x01)
90 packet += 16;
91
92 if (err == 1)
93 return; // error in data header
94
95 buf += 2;
96 break;
97
98 default:
99 return; // error in vbimode
100 }
101
102 int b1=0;
103 int b2=0;
104 int b3=0;
105 int b4=0;
106 switch (packet)
107 {
108 case 0: // Page Header
109 switch (vbimode)
110 {
111 case VBI_IVTV:
112 b1 = hamm16(buf, &err);// page number
113 b2 = hamm16(buf+2, &err);// subpage number + flags
114 b3 = hamm16(buf+4, &err);// subpage number + flags
115 b4 = hamm16(buf+6, &err);// language code + more flags
116 if (err & 0xf000)
117 return;
118
119 break;
120
121 case VBI_DVB:
122 case VBI_DVB_SUBTITLE:
123 b1 = (hamm84(buf+1, &err)*16)+hamm84(buf, &err);
124 b2 = (hamm84(buf+3, &err)*16)+hamm84(buf+2, &err);
125 b3 = (hamm84(buf+5, &err)*16)+hamm84(buf+4, &err);
126 b4 = (hamm84(buf+7, &err)*16)+hamm84(buf+6, &err);
127 if (err == 1)
128 return;
129
130 break;
131
132 default:
133 return; // error in vbimode
134 }
135
136 subpagenum= (b2 + b3 * 256) & 0x3f7f;
137 pagenum = ((magazine ? magazine : 8)*256) + b1;
138
139 lang = "\0\4\2\6\1\5\3\7"[b4 >> 5] + (latin1 ? 0 : 8);
140 flags = b4 & 0x1F;
141 flags |= b3 & 0xC0;
142 flags |= (b2 & 0x80) >> 2;
143 m_teletextReader->AddPageHeader(pagenum, subpagenum, buf,
144 vbimode, lang, flags);
145
146 break;
147
148 default: // Page Data
149 m_teletextReader->AddTeletextData((magazine ? magazine : 8), packet,
150 buf, vbimode);
151 break;
152 }
153}
void Decode(const unsigned char *buf, int vbimode)
Decodes teletext data.
TeletextReader * m_teletextReader
void AddTeletextData(int magazine, int row, const uint8_t *buf, int vbimode)
void AddPageHeader(int page, int subpage, const uint8_t *buf, int vbimode, int lang, int flags)
unsigned int uint
Definition: compat.h:60
int hamm84(const uint8_t *p, int *err)
Definition: vbilut.cpp:77
int hamm16(const uint8_t *p, int *err)
Definition: vbilut.cpp:87
vbimode
Definition: vbilut.h:7
@ VBI_DVB_SUBTITLE
< DVB packet
Definition: vbilut.h:10
@ VBI_DVB
< IVTV packet
Definition: vbilut.h:9
@ VBI_IVTV
Definition: vbilut.h:8