MythTV master
cc708reader.cpp
Go to the documentation of this file.
1// -*- Mode: c++ -*-
2// Copyright (c) 2003-2005, Daniel Kristjansson
3
4#include <cstdlib>
5
7
10#include "mythplayer.h"
11
12#define LOC QString("CC708Reader: ")
13#define CHECKENABLED if (!m_enabled) return
14
16 : m_parent(owner)
17{
18 for (uint i=0; i < k708MaxServices; i++)
19 {
20 m_bufAlloc[i] = 512;
21 m_buf[i] = (unsigned char*) malloc(m_bufAlloc[i]);
22 m_bufSize[i] = 0;
23 m_delayed[i] = false;
24
25 m_tempStrAlloc[i] = 512;
26 m_tempStrSize[i] = 0;
27 m_tempStr[i] = (int16_t*) malloc(m_tempStrAlloc[i] * sizeof(int16_t));
28 }
30}
31
33{
34 for (uint i=0; i < k708MaxServices; i++)
35 {
36 free(m_buf[i]);
37 free(m_tempStr[i]);
38 }
39}
40
42{
43 for (uint i = 1; i < k708MaxServices; i++)
44 DeleteWindows(i, 0xff);
45}
46
47void CC708Reader::SetCurrentWindow(uint service_num, int window_id)
48{
50 LOG(VB_VBI, LOG_DEBUG, LOC + QString("SetCurrentWindow(%1, %2)")
51 .arg(service_num).arg(window_id));
52 m_cc708services[service_num].m_currentWindow = window_id;
53}
54
56 uint service_num, int window_id,
57 int priority, bool visible,
58 int anchor_point, int relative_pos,
59 int anchor_vertical, int anchor_horizontal,
60 int row_count, int column_count,
61 int row_lock, int column_lock,
62 int pen_style, int window_style)
63{
64
66
67 m_cc708DelayedDeletes[service_num & 63] &= ~(1 << window_id);
68
69 LOG(VB_VBI, LOG_DEBUG, LOC +
70 QString("DefineWindow(%1, %2,\n\t\t\t\t\t")
71 .arg(service_num).arg(window_id) +
72 QString(" prio %1, vis %2, ap %3, rp %4, av %5, ah %6")
73 .arg(priority).arg(visible).arg(anchor_point).arg(relative_pos)
74 .arg(anchor_vertical).arg(anchor_horizontal) +
75 QString("\n\t\t\t\t\t row_cnt %1, row_lck %2, "
76 "col_cnt %3, col_lck %4 ")
77 .arg(row_count).arg(row_lock)
78 .arg(column_count).arg(column_lock) +
79 QString("\n\t\t\t\t\t pen style %1, win style %2)")
80 .arg(pen_style).arg(window_style));
81
82 GetCCWin(service_num, window_id)
83 .DefineWindow(priority, visible,
84 anchor_point, relative_pos,
85 anchor_vertical, anchor_horizontal,
86 row_count, column_count,
87 row_lock, column_lock,
88 pen_style, window_style);
89
90 m_cc708services[service_num].m_currentWindow = window_id;
91}
92
93void CC708Reader::DeleteWindows(uint service_num, int window_map)
94{
96 LOG(VB_VBI, LOG_DEBUG, LOC + QString("DeleteWindows(%1, %2)")
97 .arg(service_num).arg(window_map, 8, 2, QChar(48)));
98
99 for (uint i = 0; i < 8; i++)
100 if ((1 << i) & window_map)
101 GetCCWin(service_num, i).Clear();
102 m_cc708DelayedDeletes[service_num&63] |= window_map;
103}
104
105void CC708Reader::DisplayWindows(uint service_num, int window_map)
106{
108 LOG(VB_VBI, LOG_DEBUG, LOC + QString("DisplayWindows(%1, %2)")
109 .arg(service_num).arg(window_map, 8, 2, QChar(48)));
110
111 for (uint i = 0; i < 8; i++)
112 {
113 if ((1 << i) & m_cc708DelayedDeletes[service_num & 63])
114 {
115 CC708Window &win = GetCCWin(service_num, i);
116 QMutexLocker locker(&win.m_lock);
117
118 win.SetExists(false);
119 if (win.m_text)
120 {
121 delete [] win.m_text;
122 win.m_text = nullptr;
123 }
124 }
125 m_cc708DelayedDeletes[service_num & 63] = 0;
126 }
127
128 for (uint i = 0; i < 8; i++)
129 {
130 if ((1 << i ) & window_map)
131 {
132 CC708Window &win = GetCCWin(service_num, i);
133 win.SetVisible(true);
134 LOG(VB_VBI, LOG_DEBUG, LOC +
135 QString("DisplayedWindow(%1, %2)").arg(service_num).arg(i));
136 }
137 }
138}
139
140void CC708Reader::HideWindows(uint service_num, int window_map)
141{
143 LOG(VB_VBI, LOG_DEBUG, LOC + QString("HideWindows(%1, %2)")
144 .arg(service_num).arg(window_map, 8, 2, QChar(48)));
145
146 for (uint i = 0; i < 8; i++)
147 {
148 if ((1 << i) & window_map)
149 {
150 CC708Window &win = GetCCWin(service_num, i);
151 win.SetVisible(false);
152 }
153 }
154}
155
156void CC708Reader::ClearWindows(uint service_num, int window_map)
157{
159 LOG(VB_VBI, LOG_DEBUG, LOC + QString("ClearWindows(%1, %2)")
160 .arg(service_num).arg(window_map, 8, 2, QChar(48)));
161
162 for (uint i = 0; i < 8; i++)
163 if ((1 << i) & window_map)
164 GetCCWin(service_num, i).Clear();
165}
166
167void CC708Reader::ToggleWindows(uint service_num, int window_map)
168{
170 LOG(VB_VBI, LOG_DEBUG, LOC + QString("ToggleWindows(%1, %2)")
171 .arg(service_num).arg(window_map, 8, 2, QChar(48)));
172
173 for (uint i = 0; i < 8; i++)
174 {
175 if ((1 << i) & window_map)
176 {
177 CC708Window &win = GetCCWin(service_num, i);
178 win.SetVisible(!win.GetVisible());
179 }
180 }
181}
182
184 uint service_num,
185 int fill_color, int fill_opacity,
186 int border_color, int border_type,
187 int scroll_dir, int print_dir,
188 int effect_dir,
189 int display_effect, int effect_speed,
190 int justify, int word_wrap)
191{
193 LOG(VB_VBI, LOG_DEBUG, LOC + QString("SetWindowAttributes(%1...)")
194 .arg(service_num));
195
196 CC708Window &win = GetCCWin(service_num);
197
198 win.m_fill_color = fill_color & 0x3f;
199 win.m_fill_opacity = fill_opacity;
200 win.m_border_color = border_color & 0x3f;
201 win.m_border_type = border_type;
202 win.m_scroll_dir = scroll_dir;
203 win.m_print_dir = print_dir;
204 win.m_effect_dir = effect_dir;
205 win.m_display_effect = display_effect;
206 win.m_effect_speed = effect_speed;
207 win.m_justify = justify;
208 win.m_word_wrap = word_wrap;
209}
210
212 uint service_num, int pen_size,
213 int offset, int text_tag, int font_tag,
214 int edge_type, int underline, int italics)
215{
217 LOG(VB_VBI, LOG_DEBUG, LOC + QString("SetPenAttributes(%1, %2,")
218 .arg(service_num).arg(m_cc708services[service_num].m_currentWindow) +
219 QString("\n\t\t\t\t\t pen_size %1, offset %2, text_tag %3, "
220 "font_tag %4,"
221 "\n\t\t\t\t\t edge_type %5, underline %6, italics %7")
222 .arg(pen_size).arg(offset).arg(text_tag).arg(font_tag)
223 .arg(edge_type).arg(underline).arg(italics));
224
225 GetCCWin(service_num).m_pen.SetAttributes(
226 pen_size, offset, text_tag, font_tag, edge_type, underline, italics);
227}
228
230 uint service_num,
231 int fg_color, int fg_opacity,
232 int bg_color, int bg_opacity,
233 int edge_color)
234{
236 LOG(VB_VBI, LOG_DEBUG,
237 LOC + QString("SetPenColor(service=%1, fg%2.%3, bg=%4.%5, edge=%6)")
238 .arg(service_num).arg(fg_color).arg(fg_opacity)
239 .arg(bg_color).arg(bg_opacity).arg(edge_color));
240
241 CC708CharacterAttribute &attr = GetCCWin(service_num).m_pen.m_attr;
242
243 attr.m_fgColor = fg_color;
244 attr.m_fgOpacity = fg_opacity;
245 attr.m_bgColor = bg_color;
246 attr.m_bgOpacity = bg_opacity;
247 attr.m_edgeColor = edge_color;
248}
249
250void CC708Reader::SetPenLocation(uint service_num, int row, int column)
251{
253 LOG(VB_VBI, LOG_DEBUG, LOC + QString("SetPenLocation(%1, (c %2, r %3))")
254 .arg(service_num).arg(column).arg(row));
255 GetCCWin(service_num).SetPenLocation(row, column);
256}
257
258void CC708Reader::Delay(uint service_num, int tenths_of_seconds)
259{
261 LOG(VB_VBI, LOG_DEBUG, LOC + QString("Delay(%1, %2 seconds)")
262 .arg(service_num).arg(tenths_of_seconds * 0.1F));
263}
264
266{
268 LOG(VB_VBI, LOG_DEBUG, LOC + QString("DelayCancel(%1)").arg(service_num));
269}
270
271void CC708Reader::Reset(uint service_num)
272{
274 LOG(VB_VBI, LOG_DEBUG, LOC + QString("Reset(%1)").arg(service_num));
275 DeleteWindows(service_num, 0xff);
276 DelayCancel(service_num);
277}
278
280 int16_t* unicode_string, int16_t len)
281{
283 QString debug = QString();
284 for (uint i = 0; i < (uint)len; i++)
285 {
286 GetCCWin(service_num).AddChar(QChar(unicode_string[i]));
287 debug += QChar(unicode_string[i]);
288 }
289 LOG(VB_VBI, LOG_DEBUG, LOC + QString("AddText to %1->%2 |%3|")
290 .arg(service_num).arg(m_cc708services[service_num].m_currentWindow).arg(debug));
291}
#define LOC
Definition: cc708reader.cpp:12
#define CHECKENABLED
Definition: cc708reader.cpp:13
const uint k708MaxServices
Definition: cc708reader.h:13
CC708CharacterAttribute m_attr
Definition: cc708window.h:169
void SetAttributes(int pen_size, int offset, int text_tag, int font_tag, int edge_type, int underline, int italics)
Definition: cc708window.h:155
virtual void Reset(uint service_num)
virtual void SetPenColor(uint service_num, int fg_color, int fg_opacity, int bg_color, int bg_opacity, int edge_color)
std::array< int, k708MaxServices > m_tempStrSize
Definition: cc708reader.h:84
virtual void TextWrite(uint service_num, int16_t *unicode_string, int16_t len)
virtual void ClearWindows(uint service_num, int window_map)
virtual ~CC708Reader()
Definition: cc708reader.cpp:32
virtual void DefineWindow(uint service_num, int window_id, int priority, bool visible, int anchor_point, int relative_pos, int anchor_vertical, int anchor_horizontal, int row_count, int column_count, int row_lock, int column_lock, int pen_style, int window_style)
Definition: cc708reader.cpp:55
CC708Window & GetCCWin(uint service_num, uint window_id)
Definition: cc708reader.h:28
std::array< int16_t *, k708MaxServices > m_tempStr
Definition: cc708reader.h:82
virtual void Delay(uint service_num, int tenths_of_seconds)
std::array< CC708Service, k708MaxServices > m_cc708services
Definition: cc708reader.h:87
CC708Reader(MythPlayer *owner)
Definition: cc708reader.cpp:15
std::array< int, k708MaxServices > m_cc708DelayedDeletes
Definition: cc708reader.h:88
std::array< uint, k708MaxServices > m_bufAlloc
Definition: cc708reader.h:78
std::array< uint, k708MaxServices > m_bufSize
Definition: cc708reader.h:79
virtual void DeleteWindows(uint service_num, int window_map)
Definition: cc708reader.cpp:93
virtual void SetWindowAttributes(uint service_num, int fill_color, int fill_opacity, int border_color, int border_type, int scroll_dir, int print_dir, int effect_dir, int display_effect, int effect_speed, int justify, int word_wrap)
virtual void DisplayWindows(uint service_num, int window_map)
std::array< int, k708MaxServices > m_tempStrAlloc
Definition: cc708reader.h:83
virtual void SetPenAttributes(uint service_num, int pen_size, int offset, int text_tag, int font_tag, int edge_type, int underline, int italics)
void ClearBuffers(void)
Definition: cc708reader.cpp:41
virtual void ToggleWindows(uint service_num, int window_map)
virtual void HideWindows(uint service_num, int window_map)
virtual void SetCurrentWindow(uint service_num, int window_id)
Definition: cc708reader.cpp:47
std::array< unsigned char *, k708MaxServices > m_buf
Definition: cc708reader.h:77
virtual void DelayCancel(uint service_num)
virtual void SetPenLocation(uint service_num, int row, int column)
std::array< bool, k708MaxServices > m_delayed
Definition: cc708reader.h:80
uint m_fill_opacity
Definition: cc708window.h:262
CC708Pen m_pen
Definition: cc708window.h:279
uint m_effect_dir
Definition: cc708window.h:267
void SetVisible(bool value)
Definition: cc708window.h:296
uint m_scroll_dir
Definition: cc708window.h:265
uint m_print_dir
Definition: cc708window.h:266
uint m_border_type
Definition: cc708window.h:264
uint m_justify
Definition: cc708window.h:270
uint m_effect_speed
Definition: cc708window.h:269
bool GetVisible(void) const
Definition: cc708window.h:288
uint m_display_effect
Definition: cc708window.h:268
void Clear(void)
void DefineWindow(int priority, bool visible, int anchor_point, int relative_pos, int anchor_vertical, int anchor_horizontal, int row_count, int column_count, int row_lock, int column_lock, int pen_style, int window_style)
void AddChar(QChar ch)
CC708Character * m_text
Definition: cc708window.h:278
uint m_border_color
Definition: cc708window.h:263
QRecursiveMutex m_lock
Definition: cc708window.h:310
void SetPenLocation(uint row, uint column)
uint m_word_wrap
Definition: cc708window.h:271
uint m_fill_color
Definition: cc708window.h:261
void SetExists(bool value)
Definition: cc708window.h:290
unsigned int uint
Definition: freesurround.h:24
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
VERBOSE_PREAMBLE Most debug(nodatabase, notimestamp, noextra)") VERBOSE_MAP(VB_GENERAL