author | Ke 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) |
commit | 2cae40c4098d8ee5906d0115cfc5cbada1173bbd (patch) | |
tree | 3eb09a46d5e39e4229e176edfd3ccf1643a2e4a8 | |
parent | 36fc794007bb95f05142d1ab513c04a9ef9ca002 (diff) | |
download | libzvbi-2cae40c4098d8ee5906d0115cfc5cbada1173bbd.zip libzvbi-2cae40c4098d8ee5906d0115cfc5cbada1173bbd.tar.gz libzvbi-2cae40c4098d8ee5906d0115cfc5cbada1173bbd.tar.bz2 |
fixed dtvcc decode packet and send event fucntion
Change-Id: If44203b2133abcf98de235479bf7a5423815859c
-rw-r--r-- | src/dtvcc.c | 71 | ||||
-rw-r--r-- | src/dtvcc.h | 1 |
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; |