author | Pengfei 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) |
commit | 36fc794007bb95f05142d1ab513c04a9ef9ca002 (patch) | |
tree | 0772d0167f36cdae6292c994dab2d8878e419bf3 | |
parent | 068d447d86b936b7562a125f66f7b444585890ac (diff) | |
download | libzvbi-36fc794007bb95f05142d1ab513c04a9ef9ca002.zip libzvbi-36fc794007bb95f05142d1ab513c04a9ef9ca002.tar.gz libzvbi-36fc794007bb95f05142d1ab513c04a9ef9ca002.tar.bz2 |
708: drop repeat page content, only render changed page.
-rw-r--r-- | src/dtvcc.c | 54 | ||||
-rw-r--r-- | src/dtvcc.h | 2 |
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; |