12 : m_parent(parent), m_enabled(
false), m_readPosition(0),
13 m_writePosition(0), m_maxTextSize(0), m_ccMode(CC_CC1),
18 for (
int i = 0; i < MAXTBUFFER; i++)
25 for (
int i = 0; i < MAXTBUFFER; i++)
43 bool last_changed =
true;
49 if (last_changed && (streamIdx ==
m_ccMode))
96 streamIdx = MAXOUTBUFFERS - 1;
107 memcpy(&pagenr, inpos,
sizeof(
int));
108 inpos +=
sizeof(
int);
118 memcpy(&st, inpos,
sizeof(st));
126 QString((
const char*) inpos), st.
row, st.
col);
164 m_ccMode = (mode <= 2) ? ((mode == 1) ? CC_CC1 : CC_CC2) :
165 ((mode == 3) ? CC_CC3 : CC_CC4);
174 memcpy(&subtitle, inpos,
sizeof(subtitle));
177 const int streamIdx = (subtitle.
resumetext & CC_MODE_MASK) >> 4;
179 if (subtitle.
row == 0)
185 LOG(VB_VBI, LOG_DEBUG,
"erase displayed memory");
194 unsigned char *end = inpos + subtitle.
len;
196 int linecont = (subtitle.
resumetext & CC_LINE_CONT);
198 vector<CC608Text*> *ccbuf =
new vector<CC608Text*>;
199 vector<CC608Text*>::iterator ccp;
201 int replace = linecont;
203 bool scroll_prsv =
false;
205 int scroll_ymax = 15;
215 while ((inpos < end) && *inpos != 0 && (char)*inpos ==
'\b')
223 m_state[streamIdx].m_outputText.length() - bscnt,
233 while ((inpos < end) && *inpos != 0 && (char)*inpos ==
' ')
241 unsigned char *cur = inpos;
244 while (cur < end && *cur !=
'\n' && *cur != 0)
248 if (*inpos != 0 || linecont)
253 QString::fromUtf8((
const char *)inpos, -1);
258 QString::fromUtf8((
const char *)inpos, -1);
261 m_state[streamIdx].m_outputText,
262 m_state[streamIdx].m_outputCol,
263 m_state[streamIdx].m_outputRow);
264 ccbuf->push_back(tmpcc);
266 if (ccbuf->size() > 4)
267 LOG(VB_VBI, LOG_DEBUG, QString(
"CC overflow: %1 %2 %3")
268 .arg(m_outputCol) .arg(m_outputRow)
275 }
while (inpos < end);
283 if (
m_state[streamIdx].m_outputRow > 15)
291 else if (subtitle.
rowcount == 0 || row > 1)
295 if (
m_state[streamIdx].m_outputRow > 15)
297 ccp = ccbuf->begin();
298 for (; ccp != ccbuf->end(); ++ccp)
331 scroll_prsv, scroll_yoff, scroll_ymax, streamIdx);
339 (
void *,
unsigned char *,
int,
int,
int),
350 memcpy(&pagenr, inpos,
sizeof(
int));
351 inpos +=
sizeof(
int);
363 vector<CC608Text*> *ccbuf,
int replace,
int scroll,
bool scroll_prsv,
364 int scroll_yoff,
int scroll_ymax,
int streamIdx)
372 vector<CC608Text*>::iterator i;
376 if (
m_state[streamIdx].m_output.buffers.size() && (scroll || replace))
388 int ydel = scroll_yoff + scroll;
389 int ykeep = scroll_ymax;
391 if (scroll_prsv && ylast)
393 ymove = ylast - scroll_ymax;
399 while (i <
m_state[streamIdx].m_output.buffers.end())
408 if (cc->
y > (ylast - replace))
416 if (cc->
y > ydel && cc->
y <= ykeep)
419 cc->
y -= (scroll + ymove);
441 for (i = ccbuf->begin(); i != ccbuf->end(); ++i)
458 for (
int i = 0; i < MAXTBUFFER; i++)
470 if (output && outputStreamIdx < 0)
472 for (
int i = 0; i < MAXOUTBUFFERS; ++i)
476 if (output && outputStreamIdx >= 0)
478 outputStreamIdx = min(outputStreamIdx, MAXOUTBUFFERS - 1);
502 int64_t timecode,
char type)
512 LOG(VB_VBI, LOG_ERR,
"AddTextData(): Text buffer overflow");
520 int prev_readpos = (
m_readPosition - 1 + MAXTBUFFER) % MAXTBUFFER;
538 LOG(VB_VBI, LOG_INFO,
539 QString(
"Writing caption timecode %1 but waiting on %2")