summaryrefslogtreecommitdiff
authorKe Gong <ke.gong@amlogic.com>2017-04-27 02:27:21 (GMT)
committer Ke Gong <ke.gong@amlogic.com>2017-04-27 02:27:21 (GMT)
commit2cae40c4098d8ee5906d0115cfc5cbada1173bbd (patch)
tree3eb09a46d5e39e4229e176edfd3ccf1643a2e4a8
parent36fc794007bb95f05142d1ab513c04a9ef9ca002 (diff)
downloadlibzvbi-2cae40c4098d8ee5906d0115cfc5cbada1173bbd.zip
libzvbi-2cae40c4098d8ee5906d0115cfc5cbada1173bbd.tar.gz
libzvbi-2cae40c4098d8ee5906d0115cfc5cbada1173bbd.tar.bz2
fixed dtvcc decode packet and send event fucntion
Change-Id: If44203b2133abcf98de235479bf7a5423815859c
Diffstat
-rw-r--r--src/dtvcc.c71
-rw-r--r--src/dtvcc.h1
2 files changed, 60 insertions, 12 deletions
diff --git a/src/dtvcc.c b/src/dtvcc.c
index 353c7a3..b2e300c 100644
--- a/src/dtvcc.c
+++ b/src/dtvcc.c
@@ -2258,7 +2258,7 @@ dtvcc_unicode (unsigned int c)
}
static void
-dtvcc_render(struct dtvcc_decoder * dc, struct dtvcc_service * ds)
+dtvcc_event(struct dtvcc_decoder *dc, struct dtvcc_service *ds)
{
vbi_event event;
struct tvcc_decoder *td = PARENT(dc, struct tvcc_decoder, dtvcc);
@@ -2321,6 +2321,12 @@ changed:
}
static void
+dtvcc_render(struct dtvcc_decoder *dc, struct dtvcc_service *ds)
+{
+ ds->update = 1;
+}
+
+static void
dtvcc_reset_service (struct dtvcc_service * ds);
static unsigned int
@@ -2681,6 +2687,8 @@ dtvcc_clear_windows (struct dtvcc_decoder * dc,
}
}
+ dtvcc_render(dc, ds);
+
return TRUE;
}
@@ -3122,20 +3130,25 @@ dtvcc_delete_windows (struct dtvcc_decoder * dc,
dtvcc_window_map window_map)
{
struct dtvcc_window *dw;
+ int i;
- dw = ds->curr_window;
- if (NULL != dw) {
- unsigned int window_id;
-
- window_id = dtvcc_window_id (ds, dw);
- if (0 != (window_map & (1 << window_id))) {
+ for (i = 0; i < N_ELEMENTS(ds->window); i ++) {
+ dw = &ds->window[i];
+
+ if (window_map & (1 << i)) {
dtvcc_stream_event (dc, ds, dw, dw->curr_row);
- ds->curr_window = NULL;
+ if (ds->curr_window == dw)
+ ds->curr_window = NULL;
+
+ dw->visible = 0;
+ memset(dw->buffer, 0, sizeof(dw->buffer));
}
}
ds->created &= ~window_map;
+ dtvcc_render(dc, ds);
+
return TRUE;
}
@@ -3456,6 +3469,28 @@ dtvcc_decode_packet (struct dtvcc_decoder * dc,
}
+void
+dtvcc_try_decode_packet (struct dtvcc_decoder * dc,
+ const struct timeval * tv,
+ int64_t pts)
+{
+ unsigned int packet_size_code;
+ unsigned int packet_size;
+
+ if (dc->packet_size < 1)
+ return;
+
+ packet_size_code = dc->packet[0] & 0x3F;
+ packet_size = 128;
+ if (packet_size_code > 0)
+ packet_size = packet_size_code * 2;
+
+ if (packet_size <= dc->packet_size) {
+ dtvcc_decode_packet(dc, tv, pts);
+ dc->packet_size = 0;
+ }
+}
+
static void
dtvcc_reset_service (struct dtvcc_service * ds)
{
@@ -3697,10 +3732,7 @@ tvcc_decode_data (struct tvcc_decoder *td,
break;
} else if (!cc_valid) {
/* End of DTVCC packet. */
- /*dtvcc_decode_packet (&td->dtvcc,
- &now, pts);
- td->dtvcc.packet_size = 0;*/
- } else if (j >= 128) {
+ } else if (j + 2 > 128) {
/* Packet buffer overflow. */
dtvcc_reset (&td->dtvcc);
td->dtvcc.packet_size = 0;
@@ -3708,6 +3740,8 @@ tvcc_decode_data (struct tvcc_decoder *td,
td->dtvcc.packet[j] = cc_data_1;
td->dtvcc.packet[j + 1] = cc_data_2;
td->dtvcc.packet_size = j + 2;
+
+ dtvcc_try_decode_packet (&td->dtvcc, &now, pts);
}
break;
@@ -3726,10 +3760,23 @@ tvcc_decode_data (struct tvcc_decoder *td,
td->dtvcc.packet[0] = cc_data_1;
td->dtvcc.packet[1] = cc_data_2;
td->dtvcc.packet_size = 2;
+
+ dtvcc_try_decode_packet (&td->dtvcc, &now, pts);
}
break;
}
}
+
+ for (i = 0; i < N_ELEMENTS(td->dtvcc.service); i ++) {
+ struct dtvcc_service *ds = &td->dtvcc.service[i];
+
+ if (ds->update) {
+ dtvcc_event(&td->dtvcc, ds);
+
+ ds->update = 0;
+ }
+ }
+
pthread_mutex_unlock(&td->mutex);
}
diff --git a/src/dtvcc.h b/src/dtvcc.h
index 9b7caa5..88f22e6 100644
--- a/src/dtvcc.h
+++ b/src/dtvcc.h
@@ -383,6 +383,7 @@ struct dtvcc_service {
struct dtvcc_window window[8];
struct dtvcc_window old_window[8];
int old_win_cnt;
+ int update;
struct dtvcc_window * curr_window;