00001
00002
00003
00004 #include <cstdlib>
00005
00006 #include "mythlogging.h"
00007 #include "decoderbase.h"
00008 #include "mythplayer.h"
00009 #include "cc708reader.h"
00010
00011 #define LOC QString("CC708Reader: ")
00012 #define CHECKENABLED if (!enabled) return
00013
00014 CC708Reader::CC708Reader(MythPlayer *owner)
00015 : currentservice(1), parent(owner), enabled(false)
00016 {
00017 for (uint i=0; i<64; i++)
00018 {
00019 buf_alloc[i] = 512;
00020 buf[i] = (unsigned char*) malloc(buf_alloc[i]);
00021 buf_size[i] = 0;
00022 delayed[i] = 0;
00023
00024 temp_str_alloc[i] = 512;
00025 temp_str_size[i] = 0;
00026 temp_str[i] = (short*) malloc(temp_str_alloc[i] * sizeof(short));
00027 }
00028 memset(&CC708DelayedDeletes, 0, sizeof(CC708DelayedDeletes));
00029 }
00030
00031 CC708Reader::~CC708Reader()
00032 {
00033 for (uint i=0; i<64; i++)
00034 {
00035 free(buf[i]);
00036 free(temp_str[i]);
00037 }
00038 }
00039
00040 void CC708Reader::ClearBuffers(void)
00041 {
00042 for (uint i = 1; i < 64; i++)
00043 DeleteWindows(i, 0xff);
00044 }
00045
00046 void CC708Reader::SetCurrentWindow(uint service_num, int window_id)
00047 {
00048 CHECKENABLED;
00049 LOG(VB_VBI, LOG_INFO, LOC + QString("SetCurrentWindow(%1, %2)")
00050 .arg(service_num).arg(window_id));
00051 CC708services[service_num].current_window = window_id;
00052 }
00053
00054 void CC708Reader::DefineWindow(
00055 uint service_num, int window_id,
00056 int priority, int visible,
00057 int anchor_point, int relative_pos,
00058 int anchor_vertical, int anchor_horizontal,
00059 int row_count, int column_count,
00060 int row_lock, int column_lock,
00061 int pen_style, int window_style)
00062 {
00063 if (parent && parent->GetDecoder())
00064 {
00065 StreamInfo si(-1, 0, 0, service_num, false, false);
00066 parent->GetDecoder()->InsertTrack(kTrackTypeCC708, si);
00067 }
00068
00069 CHECKENABLED;
00070
00071 CC708DelayedDeletes[service_num & 63] &= ~(1 << window_id);
00072
00073 LOG(VB_VBI, LOG_INFO, LOC +
00074 QString("DefineWindow(%1, %2,\n\t\t\t\t\t")
00075 .arg(service_num).arg(window_id) +
00076 QString(" prio %1, vis %2, ap %3, rp %4, av %5, ah %6")
00077 .arg(priority).arg(visible).arg(anchor_point).arg(relative_pos)
00078 .arg(anchor_vertical).arg(anchor_horizontal) +
00079 QString("\n\t\t\t\t\t row_cnt %1, row_lck %2, "
00080 "col_cnt %3, col_lck %4 ")
00081 .arg(row_count).arg(row_lock)
00082 .arg(column_count).arg(column_lock) +
00083 QString("\n\t\t\t\t\t pen style %1, win style %2)")
00084 .arg(pen_style).arg(window_style));
00085
00086 GetCCWin(service_num, window_id)
00087 .DefineWindow(priority, visible,
00088 anchor_point, relative_pos,
00089 anchor_vertical, anchor_horizontal,
00090 row_count, column_count,
00091 row_lock, column_lock,
00092 pen_style, window_style);
00093
00094 CC708services[service_num].current_window = window_id;
00095 }
00096
00097 void CC708Reader::DeleteWindows(uint service_num, int window_map)
00098 {
00099 CHECKENABLED;
00100 LOG(VB_VBI, LOG_INFO, LOC + QString("DeleteWindows(%1, %2)")
00101 .arg(service_num).arg(window_map, 8, 2, QChar(48)));
00102
00103 for (uint i = 0; i < 8; i++)
00104 if ((1 << i) & window_map)
00105 GetCCWin(service_num, i).Clear();
00106 CC708DelayedDeletes[service_num&63] |= window_map;
00107 }
00108
00109 void CC708Reader::DisplayWindows(uint service_num, int window_map)
00110 {
00111 CHECKENABLED;
00112 LOG(VB_VBI, LOG_INFO, LOC + QString("DisplayWindows(%1, %2)")
00113 .arg(service_num).arg(window_map, 8, 2, QChar(48)));
00114
00115 for (uint i = 0; i < 8; i++)
00116 {
00117 if ((1 << i) & CC708DelayedDeletes[service_num & 63])
00118 {
00119 CC708Window &win = GetCCWin(service_num, i);
00120
00121 win.exists = false;
00122 win.changed = true;
00123 if (win.text)
00124 {
00125 delete [] win.text;
00126 win.text = NULL;
00127 }
00128 }
00129 CC708DelayedDeletes[service_num & 63] = 0;
00130 }
00131
00132 for (uint i = 0; i < 8; i++)
00133 {
00134 if ((1 << i ) & window_map)
00135 {
00136 CC708Window &win = GetCCWin(service_num, i);
00137 win.visible = true;
00138 win.changed = true;
00139 LOG(VB_VBI, LOG_INFO, LOC +
00140 QString("DisplayedWindow(%1, %2)").arg(service_num).arg(i));
00141 }
00142 }
00143 }
00144
00145 void CC708Reader::HideWindows(uint service_num, int window_map)
00146 {
00147 CHECKENABLED;
00148 LOG(VB_VBI, LOG_INFO, LOC + QString("HideWindows(%1, %2)")
00149 .arg(service_num).arg(window_map, 8, 2, QChar(48)));
00150
00151 for (uint i = 0; i < 8; i++)
00152 {
00153 if ((1 << i) & window_map)
00154 {
00155 CC708Window &win = GetCCWin(service_num, i);
00156 win.visible = false;
00157 win.changed = true;
00158 }
00159 }
00160 }
00161
00162 void CC708Reader::ClearWindows(uint service_num, int window_map)
00163 {
00164 CHECKENABLED;
00165 LOG(VB_VBI, LOG_INFO, LOC + QString("ClearWindows(%1, %2)")
00166 .arg(service_num).arg(window_map, 8, 2, QChar(48)));
00167
00168 for (uint i = 0; i < 8; i++)
00169 if ((1 << i) & window_map)
00170 GetCCWin(service_num, i).Clear();
00171 }
00172
00173 void CC708Reader::ToggleWindows(uint service_num, int window_map)
00174 {
00175 CHECKENABLED;
00176 LOG(VB_VBI, LOG_INFO, LOC + QString("ToggleWindows(%1, %2)")
00177 .arg(service_num).arg(window_map, 8, 2, QChar(48)));
00178
00179 for (uint i = 0; i < 8; i++)
00180 {
00181 if ((1 << i) & window_map)
00182 {
00183 CC708Window &win = GetCCWin(service_num, i);
00184 win.visible = !win.visible;
00185 win.changed = true;
00186 }
00187 }
00188 }
00189
00190 void CC708Reader::SetWindowAttributes(
00191 uint service_num,
00192 int fill_color, int fill_opacity,
00193 int border_color, int border_type,
00194 int scroll_dir, int print_dir,
00195 int effect_dir,
00196 int display_effect, int effect_speed,
00197 int justify, int word_wrap)
00198 {
00199 CHECKENABLED;
00200 LOG(VB_VBI, LOG_INFO, LOC + QString("SetWindowAttributes(%1...)")
00201 .arg(service_num));
00202
00203 CC708Window &win = GetCCWin(service_num);
00204
00205 win.fill_color = fill_color & 0x3f;
00206 win.fill_opacity = fill_opacity;
00207 win.border_color = border_color & 0x3f;
00208 win.border_type = border_type;
00209 win.scroll_dir = scroll_dir;
00210 win.print_dir = print_dir;
00211 win.effect_dir = effect_dir;
00212 win.display_effect = display_effect;
00213 win.effect_speed = effect_speed;
00214 win.justify = justify;
00215 win.word_wrap = word_wrap;
00216 }
00217
00218 void CC708Reader::SetPenAttributes(
00219 uint service_num, int pen_size,
00220 int offset, int text_tag, int font_tag,
00221 int edge_type, int underline, int italics)
00222 {
00223 CHECKENABLED;
00224 LOG(VB_VBI, LOG_INFO, LOC + QString("SetPenAttributes(%1, %2,")
00225 .arg(service_num).arg(CC708services[service_num].current_window) +
00226 QString("\n\t\t\t\t\t pen_size %1, offset %2, text_tag %3, "
00227 "font_tag %4,"
00228 "\n\t\t\t\t\t edge_type %5, underline %6, italics %7")
00229 .arg(pen_size).arg(offset).arg(text_tag).arg(font_tag)
00230 .arg(edge_type).arg(underline).arg(italics));
00231
00232 GetCCWin(service_num).pen.SetAttributes(
00233 pen_size, offset, text_tag, font_tag, edge_type, underline, italics);
00234 }
00235
00236 void CC708Reader::SetPenColor(
00237 uint service_num,
00238 int fg_color, int fg_opacity,
00239 int bg_color, int bg_opacity,
00240 int edge_color)
00241 {
00242 CHECKENABLED;
00243 LOG(VB_VBI, LOG_INFO, LOC + QString("SetPenColor(%1...)")
00244 .arg(service_num));
00245
00246 CC708CharacterAttribute &attr = GetCCWin(service_num).pen.attr;
00247
00248 attr.fg_color = fg_color;
00249 attr.fg_opacity = fg_opacity;
00250 attr.bg_color = bg_color;
00251 attr.bg_opacity = bg_opacity;
00252 attr.edge_color = edge_color;
00253 }
00254
00255 void CC708Reader::SetPenLocation(uint service_num, int row, int column)
00256 {
00257 CHECKENABLED;
00258 LOG(VB_VBI, LOG_INFO, LOC + QString("SetPenLocation(%1, (c %2, r %3))")
00259 .arg(service_num).arg(column).arg(row));
00260 GetCCWin(service_num).SetPenLocation(row, column);
00261 }
00262
00263 void CC708Reader::Delay(uint service_num, int tenths_of_seconds)
00264 {
00265 CHECKENABLED;
00266 LOG(VB_VBI, LOG_INFO, LOC + QString("Delay(%1, %2 seconds)")
00267 .arg(service_num).arg(tenths_of_seconds * 0.1f));
00268 }
00269
00270 void CC708Reader::DelayCancel(uint service_num)
00271 {
00272 CHECKENABLED;
00273 LOG(VB_VBI, LOG_INFO, LOC + QString("DelayCancel(%1)").arg(service_num));
00274 }
00275
00276 void CC708Reader::Reset(uint service_num)
00277 {
00278 CHECKENABLED;
00279 LOG(VB_VBI, LOG_INFO, LOC + QString("Reset(%1)").arg(service_num));
00280 DeleteWindows(service_num, 0x7);
00281 DelayCancel(service_num);
00282 }
00283
00284 void CC708Reader::TextWrite(uint service_num,
00285 short* unicode_string, short len)
00286 {
00287 CHECKENABLED;
00288 QString debug = QString();
00289 for (uint i = 0; i < (uint)len; i++)
00290 {
00291 GetCCWin(service_num).AddChar(QChar(unicode_string[i]));
00292 debug += QChar(unicode_string[i]);
00293 }
00294 LOG(VB_VBI, LOG_INFO, LOC + QString("AddText to %1->%2 |%3|")
00295 .arg(service_num).arg(CC708services[service_num].current_window).arg(debug));
00296 }
00297
00298 void CC708Reader::SetOSDFontName(const QString osdfonts[22],
00299 const QString &prefix)
00300 {
00301 osdfontname = osdfonts[0]; osdfontname.detach();
00302 osdccfontname = osdfonts[1]; osdccfontname.detach();
00303 for (int i = 2; i < 22; i++)
00304 {
00305 QString tmp = osdfonts[i]; tmp.detach();
00306 osd708fontnames[i - 2] = tmp;
00307 }
00308 osdprefix = prefix; osdprefix.detach();
00309 }
00310
00311 void CC708Reader::SetOSDThemeName(const QString themename)
00312 {
00313 osdtheme = themename; osdtheme.detach();
00314 }