summaryrefslogtreecommitdiff
authorPengfei Liu <pengfei.liu@amlogic.com>2017-04-26 08:13:40 (GMT)
committer Pengfei Liu <pengfei.liu@amlogic.com>2017-04-26 08:13:40 (GMT)
commit36fc794007bb95f05142d1ab513c04a9ef9ca002 (patch)
tree0772d0167f36cdae6292c994dab2d8878e419bf3
parent068d447d86b936b7562a125f66f7b444585890ac (diff)
downloadlibzvbi-36fc794007bb95f05142d1ab513c04a9ef9ca002.zip
libzvbi-36fc794007bb95f05142d1ab513c04a9ef9ca002.tar.gz
libzvbi-36fc794007bb95f05142d1ab513c04a9ef9ca002.tar.bz2
708: drop repeat page content, only render changed page.
Diffstat
-rw-r--r--src/dtvcc.c54
-rw-r--r--src/dtvcc.h2
2 files changed, 54 insertions, 2 deletions
diff --git a/src/dtvcc.c b/src/dtvcc.c
index bb12255..353c7a3 100644
--- a/src/dtvcc.c
+++ b/src/dtvcc.c
@@ -101,6 +101,8 @@ extern void
vbi_send_event(vbi_decoder *vbi, vbi_event *ev);
extern void
vbi_decode_caption(vbi_decoder *vbi, int line, uint8_t *buf);
+static void
+dtvcc_get_visible_windows(struct dtvcc_service *ds, int *cnt, struct dtvcc_window **windows);
/* EIA 608-B decoder. */
@@ -2260,6 +2262,52 @@ dtvcc_render(struct dtvcc_decoder * dc, struct dtvcc_service * ds)
{
vbi_event event;
struct tvcc_decoder *td = PARENT(dc, struct tvcc_decoder, dtvcc);
+ struct dtvcc_window *win[8];
+ int i, cnt;
+
+ cnt = 8;
+ dtvcc_get_visible_windows(ds, &cnt, win);
+ if (!cnt)
+ return;
+
+ if (cnt != ds->old_win_cnt)
+ goto changed;
+
+ for (i = 0; i < cnt; i ++) {
+ struct dtvcc_window *w1 = win[i];
+ struct dtvcc_window *w2 = &ds->old_window[i];
+
+ if (memcmp(w1->buffer, w2->buffer, sizeof(w1->buffer))) {
+ goto changed;
+ }
+
+ if (memcmp(&w1->style, &w2->style, sizeof(w1->style))) {
+ goto changed;
+ }
+
+ if (memcmp(&w1->curr_pen, &w2->curr_pen, sizeof(w1->curr_pen))) {
+ goto changed;
+ }
+
+ if (w1->row_count != w2->row_count) {
+ goto changed;
+ }
+
+ if (w1->column_count != w2->column_count) {
+ goto changed;
+ }
+
+ if (w1->visible != w2->visible) {
+ goto changed;
+ }
+ }
+
+ return;
+changed:
+ for (i = 0; i < cnt; i ++) {
+ ds->old_window[i] = *win[i];
+ }
+ ds->old_win_cnt = cnt;
event.type = VBI_EVENT_CAPTION;
event.ev.caption.pgno = ds - dc->service + 1 + 8/*after 8 cc channels*/;
@@ -3430,6 +3478,8 @@ dtvcc_reset (struct dtvcc_decoder * dc)
void
dtvcc_init (struct dtvcc_decoder * dc)
{
+ memset(dc, 0, sizeof(struct dtvcc_decoder));
+
dtvcc_reset (dc);
cc_timestamp_reset (&dc->timestamp);
@@ -3647,9 +3697,9 @@ tvcc_decode_data (struct tvcc_decoder *td,
break;
} else if (!cc_valid) {
/* End of DTVCC packet. */
- dtvcc_decode_packet (&td->dtvcc,
+ /*dtvcc_decode_packet (&td->dtvcc,
&now, pts);
- td->dtvcc.packet_size = 0;
+ td->dtvcc.packet_size = 0;*/
} else if (j >= 128) {
/* Packet buffer overflow. */
dtvcc_reset (&td->dtvcc);
diff --git a/src/dtvcc.h b/src/dtvcc.h
index 24f4f58..9b7caa5 100644
--- a/src/dtvcc.h
+++ b/src/dtvcc.h
@@ -381,6 +381,8 @@ struct dtvcc_service {
/* Interpretation Layer. */
struct dtvcc_window window[8];
+ struct dtvcc_window old_window[8];
+ int old_win_cnt;
struct dtvcc_window * curr_window;