public void EndPage() { if (_pageNumInProgress == -1) { return; // no page in progress } if ((_pageNumInProgress < 0 || _pageNumInProgress >= 966)) { ServiceRegistration.Get <ILogger>().Debug("DANGER DANGER!, endpage with pageNumInProgress = %i", _pageNumInProgress); return; } ServiceRegistration.Get <ILogger>().Debug("Finished Page {0}", _pageNumInProgress); //bool hasContent = false; for (int i = 0; i < 25; i++) { bool boxed = false; byte[] lineContent = GetLine(i); for (int j = 0; j < 40; j++) { // Remove spacing attributes ( see 12.2 of the draft) // FIXME: Some subtitles will have the attributed 'double height' // and therefore have an empty line between subs. // �s this content a space attribute? if (MSB3_NP(lineContent[j]) == 0) { if (LSB4(lineContent[j]) == SPACE_ATTRIB_BOX_START) { //LogDebug("BS - boxed is true"); boxed = true; //hasContent = true; } else if (LSB4(lineContent[j]) == SPACE_ATTRIB_BOX_END) { //LogDebug("BE - boxed is false"); boxed = false; } // remove spacing attribute lineContent[j] = TELETEXT_BLANK; } else if (!boxed) { // if we are not in boxed mode, // we dont want to keep the content lineContent[j] = TELETEXT_BLANK; Assert(true, "EndPage: Boxed not set as expected"); } } SetLine(i, lineContent); } /*if(!hasContent) { * ServiceRegistration.Get<ILogger>().Debug("(BLANK PAGE)"); * }*/ byte[] text = new byte[TELETEXT_WIDTH * TELETEXT_LINES]; Array.Copy(_pageContent, text, TELETEXT_LINES * TELETEXT_WIDTH); TextConversion.Convert(_language, text); LineContent[] lc = new LineContent[TELETEXT_LINES]; string realLang = ""; lock (LangInfo) { if (LangInfo.ContainsKey(_pageNumInProgress)) { realLang = LangInfo[_pageNumInProgress]; } } for (int line = 0; line < TELETEXT_LINES; line++) { StringBuilder lineBuilder = new StringBuilder(); for (int c = 0; c < TELETEXT_WIDTH; c++) { lineBuilder.Append((char)text[line * TELETEXT_WIDTH + c]); } lc[line] = new LineContent(); if (realLang != "") { lc[line].line = TextConversion.ConvertLineLangSpecific(realLang, lineBuilder.ToString()); } else { lc[line].line = lineBuilder.ToString(); } lc[line].doubleHeight = true; } StringBuilder textBuilder = new StringBuilder(); for (int i = 0; i < text.Length; i++) { //sbuf.Append((char)text[i]); textBuilder.Append((char)text[i]); //sbuf.Append("" + ((int)pageContent[i]) + " "); if (((i + 1) % 40) == 0) { textBuilder.Append('\n'); } } // prepare subtitle TextSubtitle sub = new TextSubtitle(); sub.Encoding = _language; sub.Page = _pageNumInProgress; sub.Language = realLang; sub.Text = textBuilder.ToString(); sub.LineContents = lc; sub.TimeOut = ulong.MaxValue; // never timeout (will be replaced by other page) sub.TimeStamp = _presentTime; Assert(String.IsNullOrEmpty(sub.Text), "Sub.text == null!"); if (_owner.SubPageInfoCallback != null) { TeletextPageEntry pageEntry = new TeletextPageEntry { Language = String.Copy(sub.Language), Encoding = (TeletextCharTable)sub.Encoding, Page = sub.Page }; _owner.SubPageInfoCallback(pageEntry); } _owner.SubtitleRender.OnTextSubtitle(ref sub); _pageNumInProgress = -1; }
// Currently unused, teletext subtitles are not yet (re-)implemented! public void OnTextSubtitle(ref TextSubtitle sub) { ServiceRegistration.Get<ILogger>().Debug("On TextSubtitle called"); try { if (sub.Page == _activeSubPage) { ServiceRegistration.Get<ILogger>().Debug("Page: " + sub.Page); ServiceRegistration.Get<ILogger>().Debug("Character table: " + sub.Encoding); ServiceRegistration.Get<ILogger>().Debug("Timeout: " + sub.TimeOut); ServiceRegistration.Get<ILogger>().Debug("Timestamp" + sub.TimeStamp); ServiceRegistration.Get<ILogger>().Debug("Language: " + sub.Language); String content = sub.Text; if (content == null) { ServiceRegistration.Get<ILogger>().Error("OnTextSubtitle: sub.txt == null!"); return; } } } catch (Exception e) { ServiceRegistration.Get<ILogger>().Error("Problem with TEXT_SUBTITLE"); ServiceRegistration.Get<ILogger>().Error(e); } try { // if we dont need the subtitle if (!_renderSubtitles || _useBitmap || (_activeSubPage != sub.Page)) { ServiceRegistration.Get<ILogger>().Debug("Text subtitle (page {0}) discarded: useBitmap is {1} and activeSubPage is {2}", sub.Page, _useBitmap, _activeSubPage); return; } ServiceRegistration.Get<ILogger>().Debug("Text subtitle (page {0}) ACCEPTED: useBitmap is {1} and activeSubPage is {2}", sub.Page, _useBitmap, _activeSubPage); Subtitle subtitle = new Subtitle { SubBitmap = RenderText(sub.LineContents), TimeOut = sub.TimeOut, PresentTime = sub.TimeStamp / 90000.0f + _startPos, Height = (uint) SkinContext.SkinResources.SkinHeight, Width = (uint) SkinContext.SkinResources.SkinWidth, FirstScanLine = 0 }; lock (_subtitles) { while (_subtitles.Count >= MAX_SUBTITLES_IN_QUEUE) { ServiceRegistration.Get<ILogger>().Debug("SubtitleRenderer: Subtitle queue too big, discarding first element"); _subtitles.RemoveFirst(); } _subtitles.AddLast(subtitle); ServiceRegistration.Get<ILogger>().Debug("SubtitleRenderer: Text subtitle added, now have {0} subtitles in cache {1} pos on last render was {2}", _subtitles.Count, subtitle, _currentTime); } } catch (Exception e) { ServiceRegistration.Get<ILogger>().Error("Problem processing text subtitle"); ServiceRegistration.Get<ILogger>().Error(e); } }
// Currently unused, teletext subtitles are not yet (re-)implemented! public void OnTextSubtitle(ref TextSubtitle sub) { ServiceRegistration.Get <ILogger>().Debug("On TextSubtitle called"); try { if (sub.Page == _activeSubPage) { ServiceRegistration.Get <ILogger>().Debug("Page: " + sub.Page); ServiceRegistration.Get <ILogger>().Debug("Character table: " + sub.Encoding); ServiceRegistration.Get <ILogger>().Debug("Timeout: " + sub.TimeOut); ServiceRegistration.Get <ILogger>().Debug("Timestamp" + sub.TimeStamp); ServiceRegistration.Get <ILogger>().Debug("Language: " + sub.Language); String content = sub.Text; if (content == null) { ServiceRegistration.Get <ILogger>().Error("OnTextSubtitle: sub.txt == null!"); return; } } } catch (Exception e) { ServiceRegistration.Get <ILogger>().Error("Problem with TEXT_SUBTITLE"); ServiceRegistration.Get <ILogger>().Error(e); } try { // if we dont need the subtitle if (!_renderSubtitles || _useBitmap || (_activeSubPage != sub.Page)) { ServiceRegistration.Get <ILogger>().Debug("Text subtitle (page {0}) discarded: useBitmap is {1} and activeSubPage is {2}", sub.Page, _useBitmap, _activeSubPage); return; } ServiceRegistration.Get <ILogger>().Debug("Text subtitle (page {0}) ACCEPTED: useBitmap is {1} and activeSubPage is {2}", sub.Page, _useBitmap, _activeSubPage); Subtitle subtitle = new Subtitle { SubBitmap = RenderText(sub.LineContents), TimeOut = sub.TimeOut, PresentTime = sub.TimeStamp / 90000.0f + _startPos, Height = (uint)SkinContext.SkinResources.SkinHeight, Width = (uint)SkinContext.SkinResources.SkinWidth, FirstScanLine = 0 }; lock (_subtitles) { while (_subtitles.Count >= MAX_SUBTITLES_IN_QUEUE) { ServiceRegistration.Get <ILogger>().Debug("SubtitleRenderer: Subtitle queue too big, discarding first element"); _subtitles.RemoveFirst(); } _subtitles.AddLast(subtitle); ServiceRegistration.Get <ILogger>().Debug("SubtitleRenderer: Text subtitle added, now have {0} subtitles in cache {1} pos on last render was {2}", _subtitles.Count, subtitle, _currentTime); } } catch (Exception e) { ServiceRegistration.Get <ILogger>().Error("Problem processing text subtitle"); ServiceRegistration.Get <ILogger>().Error(e); } }
public void EndPage() { if (_pageNumInProgress == -1) return; // no page in progress if ((_pageNumInProgress < 0 || _pageNumInProgress >= 966)) { ServiceRegistration.Get<ILogger>().Debug("DANGER DANGER!, endpage with pageNumInProgress = %i", _pageNumInProgress); return; } ServiceRegistration.Get<ILogger>().Debug("Finished Page {0}", _pageNumInProgress); //bool hasContent = false; for (int i = 0; i < 25; i++) { bool boxed = false; byte[] lineContent = GetLine(i); for (int j = 0; j < 40; j++) { // Remove spacing attributes ( see 12.2 of the draft) // FIXME: Some subtitles will have the attributed 'double height' // and therefore have an empty line between subs. // �s this content a space attribute? if (MSB3_NP(lineContent[j]) == 0) { if (LSB4(lineContent[j]) == SPACE_ATTRIB_BOX_START) { //LogDebug("BS - boxed is true"); boxed = true; //hasContent = true; } else if (LSB4(lineContent[j]) == SPACE_ATTRIB_BOX_END) { //LogDebug("BE - boxed is false"); boxed = false; } // remove spacing attribute lineContent[j] = TELETEXT_BLANK; } else if (!boxed) { // if we are not in boxed mode, // we dont want to keep the content lineContent[j] = TELETEXT_BLANK; Assert(true, "EndPage: Boxed not set as expected"); } } SetLine(i, lineContent); } /*if(!hasContent) { ServiceRegistration.Get<ILogger>().Debug("(BLANK PAGE)"); }*/ byte[] text = new byte[TELETEXT_WIDTH*TELETEXT_LINES]; Array.Copy(_pageContent, text, TELETEXT_LINES*TELETEXT_WIDTH); TextConversion.Convert(_language, text); LineContent[] lc = new LineContent[TELETEXT_LINES]; string realLang = ""; lock (LangInfo) { if (LangInfo.ContainsKey(_pageNumInProgress)) { realLang = LangInfo[_pageNumInProgress]; } } for (int line = 0; line < TELETEXT_LINES; line++) { StringBuilder lineBuilder = new StringBuilder(); for (int c = 0; c < TELETEXT_WIDTH; c++) { lineBuilder.Append((char) text[line*TELETEXT_WIDTH + c]); } lc[line] = new LineContent(); if (realLang != "") { lc[line].line = TextConversion.ConvertLineLangSpecific(realLang, lineBuilder.ToString()); } else { lc[line].line = lineBuilder.ToString(); } lc[line].doubleHeight = true; } StringBuilder textBuilder = new StringBuilder(); for (int i = 0; i < text.Length; i++) { //sbuf.Append((char)text[i]); textBuilder.Append((char) text[i]); //sbuf.Append("" + ((int)pageContent[i]) + " "); if (((i + 1)%40) == 0) { textBuilder.Append('\n'); } } // prepare subtitle TextSubtitle sub = new TextSubtitle(); sub.Encoding = _language; sub.Page = _pageNumInProgress; sub.Language = realLang; sub.Text = textBuilder.ToString(); sub.LineContents = lc; sub.TimeOut = ulong.MaxValue; // never timeout (will be replaced by other page) sub.TimeStamp = _presentTime; Assert(String.IsNullOrEmpty(sub.Text), "Sub.text == null!"); if (_owner.SubPageInfoCallback != null) { TeletextPageEntry pageEntry = new TeletextPageEntry { Language = String.Copy(sub.Language), Encoding = (TeletextCharTable) sub.Encoding, Page = sub.Page }; _owner.SubPageInfoCallback(pageEntry); } _owner.SubtitleRender.OnTextSubtitle(ref sub); _pageNumInProgress = -1; }