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