author | Yan Yan <yan.yan@amlogic.com> | 2017-11-12 06:32:28 (GMT) |
---|---|---|
committer | yan.yan <yan.yan@amlogic.com> | 2017-11-12 06:50:36 (GMT) |
commit | 80b7e2a7cebcf1154f8f2d85b7463950ce1ed376 (patch) | |
tree | 3abbdc6862fa029df246798f231b9c8e5f38630b | |
parent | f058aa9b624ffcf661295287c64b6d062f3a2d2f (diff) | |
download | libzvbi-80b7e2a7cebcf1154f8f2d85b7463950ce1ed376.zip libzvbi-80b7e2a7cebcf1154f8f2d85b7463950ce1ed376.tar.gz libzvbi-80b7e2a7cebcf1154f8f2d85b7463950ce1ed376.tar.bz2 |
1. Call update in atv putchar
2. Send event in render
3. Remap G2 set codes
4. Display problem when one line is full of solid spaces. 608 protocol
PD# 152764
Change-Id: I0c5eee5ad112946a48e2f585054d7f6897611375
-rw-r--r-- | Android.mk | 1 | ||||
-rwxr-xr-x | src/caption.c | 49 | ||||
-rw-r--r-- | src/cc.h | 1 | ||||
-rwxr-xr-x | src/dtvcc.c | 41 |
4 files changed, 56 insertions, 36 deletions
@@ -17,6 +17,7 @@ endif LOCAL_ARM_MODE := arm LOCAL_C_INCLUDES := external/icu4c/common +LOCAL_C_INCLUDES := external/dvb/include/am_adp LOCAL_C_INCLUDES += external/icu/icu4c/source/common LOCAL_SHARED_LIBRARIES += libicuuc liblog diff --git a/src/caption.c b/src/caption.c index 47680f9..d15ad4d 100755 --- a/src/caption.c +++ b/src/caption.c @@ -35,6 +35,7 @@ #include "tables.h" #include "vbi.h" #include <android/log.h> +#include "am_debug.h" #define elements(array) (sizeof(array) / sizeof(array[0])) @@ -808,11 +809,20 @@ roll_up(vbi_page *pg, int first_row, int last_row) static inline void update(cc_channel *ch) { +#if 1 +int i; vbi_char *acp = ch->line - ch->pg[ch->hidden].text + ch->pg[ch->hidden^1].text; memcpy(acp, ch->line, sizeof(*acp) * COLUMNS); - render(ch->pg + 1, ch->row); +#if 0 + AM_DEBUG(1,"+++ Display line"); + for (i=0;i<sizeof(*acp) * COLUMNS;i++) + { + AM_DEBUG(1,"+++ %x ", ch->line[i].unicode); + } +#endif +#endif } static void @@ -854,9 +864,7 @@ word_break(struct caption *cc, cc_channel *ch, int upd) * XXX should not render if space follows space, * but force in long words. */ - - update(ch); - render(ch->pg + 1, ch->row); + ch->update = 1; } static inline void @@ -881,10 +889,10 @@ put_char(struct caption *cc, cc_channel *ch, vbi_char c) ch->line[COLUMNS - 2] = c; } - - if ((c.unicode & 0x7F) == 0x20) - word_break(cc, ch, 1); - update(ch); + ch->update = 1; + //if ((c.unicode & 0x7F) == 0x20) + // word_break(cc, ch, 1); + //AM_DEBUG(1, "add render in putchar"); } static inline cc_channel * @@ -900,15 +908,18 @@ erase_memory(struct caption *cc, cc_channel *ch, int page) { vbi_page *pg = ch->pg + page; vbi_char *acp = pg->text; - vbi_char c = cc->transp_space[ch >= &cc->channel[4]]; + memset(pg->text, 0, 1056*sizeof(vbi_char)); +#if 0 + //vbi_char c = cc->transp_space[ch >= &cc->channel[4]]; + vbi_char c = {0}; int i,j; - for (i = 0; i < COLUMNS * ROWS; acp++, i++) *acp = c; pg->dirty.y0 = 0; pg->dirty.y1 = ROWS - 1; pg->dirty.roll = ROWS; +#endif } static const vbi_color @@ -1159,7 +1170,7 @@ caption_command(vbi_decoder *vbi, struct caption *cc, .text[ch->row1 * COLUMNS]; word_break(cc, ch, 1); - update(ch); + ch->update = 1; if (ch->mode == MODE_ROLL_UP) { @@ -1170,7 +1181,7 @@ caption_command(vbi_decoder *vbi, struct caption *cc, } if (ch->mode != MODE_POP_ON) { - update(ch); + ch->update = 1; roll_up(ch->pg + (ch->hidden ^ 1), ch->row1, last_row); } @@ -1190,7 +1201,7 @@ caption_command(vbi_decoder *vbi, struct caption *cc, word_break(cc, ch, 0); if (ch->mode != MODE_POP_ON) { - update(ch); + ch->update = 1; render(ch->pg + (ch->hidden ^ 1), ch->row); } @@ -1295,7 +1306,7 @@ vbi_decode_caption(vbi_decoder *vbi, int line, uint8_t *buf) int field2 = 1, i; pthread_mutex_lock(&cc->mutex); - + AM_DEBUG(1, "vbi_data: line: %d %x %x", line, buf[0], buf[1]); switch (line) { case 21: /* NTSC */ case 22: /* PAL */ @@ -1386,6 +1397,10 @@ vbi_decode_caption(vbi_decoder *vbi, int line, uint8_t *buf) putchar(_vbi_to_ascii (buf[1])); fflush(stdout); ) +#if 0 + AM_DEBUG(1, "text value: %c %c %x %x", _vbi_to_ascii(buf[0]), + _vbi_to_ascii(buf[1]), buf[0], buf[1]); +#endif ch = &cc->channel[(cc->curr_chan & 5) + field2 * 2]; @@ -1425,6 +1440,12 @@ vbi_decode_caption(vbi_decoder *vbi, int line, uint8_t *buf) put_char(cc, ch, c); } } + for (i=0; i<8; i++) + { + if (cc->channel[i].update == 1) + update(&cc->channel[i]); + cc->channel[i].update = 0; + } finish: pthread_mutex_unlock(&cc->mutex); @@ -64,6 +64,7 @@ typedef struct { int hidden; vbi_page pg[2]; + int update; } cc_channel; struct caption { diff --git a/src/dtvcc.c b/src/dtvcc.c index c3b570c..0599fb3 100755 --- a/src/dtvcc.c +++ b/src/dtvcc.c @@ -33,6 +33,7 @@ #include "libzvbi.h" #include "dtvcc.h" +#include "am_debug.h" #define elements(array) (sizeof(array) / sizeof(array[0])) @@ -50,7 +51,6 @@ #define N_ELEMENTS(array) (sizeof (array) / sizeof ((array)[0])) #define CLEAR(var) memset (&(var), 0, sizeof (var)) - /* FIXME __typeof__ is a GCC extension. */ #undef SWAP #define SWAP(x, y) \ @@ -2149,6 +2149,7 @@ dtvcc_g2 [96] = { 0x2022, 0, 0, + 0, 0x2122, /* 0x1039 Trademark sign */ 0x0161, /* 0x103A s with caron */ 0, @@ -2446,7 +2447,7 @@ dtvcc_put_char (struct dtvcc_decoder * dc, { struct dtvcc_window *dw; unsigned int row; - unsigned int column; + unsigned int column,i; dc = dc; /* unused */ @@ -2466,6 +2467,8 @@ dtvcc_put_char (struct dtvcc_decoder * dc, dw->buffer[row][column] = c; dw->pen[row][column] = dw->curr_pen.style; + if (dw->visible) + dtvcc_render(dc, ds); switch (dw->style.print_direction) { case DIR_LEFT_RIGHT: @@ -2504,8 +2507,6 @@ dtvcc_put_char (struct dtvcc_decoder * dc, dw->curr_row = row; dw->curr_column = column; - if (dw->visible) - dtvcc_render(dc, ds); return TRUE; } @@ -2604,10 +2605,12 @@ dtvcc_set_pen_attributes (struct dtvcc_service * ds, c = buf[1]; offset = (c >> 2) & 3; pen_size = c & 3; + //TODO: why not larger than 3 + /* if ((offset | pen_size) >= 3) { ds->error_line = __LINE__; return FALSE; - } + } */ c = buf[2]; edge_type = (c >> 3) & 7; @@ -2897,8 +2900,6 @@ dtvcc_display_windows (struct dtvcc_decoder * dc, window_map &= ds->created; - //printf("display %02x %p %02x\n", c, ds->curr_window, ds->created); - if(ds->curr_window == NULL && ds->created == 0) { return FALSE; //return TRUE; @@ -3188,7 +3189,6 @@ dtvcc_delete_windows (struct dtvcc_decoder * dc, if (NULL != dw) { unsigned int window_id; - window_id = dtvcc_window_id (ds, dw); if (ds->created & (1 << window_id)) { if (window_map & (1 << window_id)) { @@ -3235,10 +3235,8 @@ dtvcc_command (struct dtvcc_decoder * dc, if (*se_length > n_bytes) { ds->error_line = __LINE__; - //return FALSE; return TRUE; } - switch (c) { case 0x08: /* BS Backspace */ return dtvcc_backspace (dc, ds); @@ -3372,13 +3370,12 @@ dtvcc_decode_syntactic_elements (struct dtvcc_decoder * dc, ds->timestamp = dc->timestamp; #if 0 - printf("servie %d\n", n_bytes); + AM_DEBUG(1, "+++++++++++++++++++++ servie %d\n", n_bytes); { int i; for (i = 0; i < n_bytes; i ++) - printf("%02x ", buf[i]); - printf("\n"); + AM_DEBUG(1, "++++++++++++++ %02x ", buf[i]); } #endif while (n_bytes > 0) { @@ -3397,7 +3394,6 @@ dtvcc_decode_syntactic_elements (struct dtvcc_decoder * dc, if (!dtvcc_decode_se (dc, ds, &se_length, buf, n_bytes)) { - //printf("decode se error\n"); return FALSE; } @@ -3432,14 +3428,13 @@ dtvcc_decode_packet (struct dtvcc_decoder * dc, /* sequence_number [2], packet_size_code [6], packet_data [n * 8] */ - +#if 1 if (dc->next_sequence_number >= 0 && 0 != ((dc->packet[0] ^ dc->next_sequence_number) & 0xC0)) { - printf("seq reset\n"); dtvcc_reset (dc); return; } - +#endif dc->next_sequence_number = dc->packet[0] + 0x40; packet_size_code = dc->packet[0] & 0x3F; @@ -3453,6 +3448,7 @@ dtvcc_decode_packet (struct dtvcc_decoder * dc, /* dtvcc_reset (dc); return;*/ + //AM_DEBUG(1, "packet size larger than dc packet_size"); packet_size = dc->packet_size; } @@ -3511,7 +3507,9 @@ dtvcc_decode_packet (struct dtvcc_decoder * dc, //printf("srv %d %d %d %d\n", service_number, header_size, block_size, packet_size); if (i + header_size + block_size > packet_size) + { break; + } //goto service_block_incomplete; if (service_number <= 6) { @@ -3529,7 +3527,6 @@ dtvcc_decode_packet (struct dtvcc_decoder * dc, i += header_size + block_size; } - //printf("check\n"); for (i = 0; i < 6; ++i) { struct dtvcc_service *ds; struct program *pr; @@ -3579,6 +3576,7 @@ dtvcc_try_decode_packet (struct dtvcc_decoder * dc, return; packet_size_code = dc->packet[0] & 0x3F; + packet_size = 128; if (packet_size_code > 0) packet_size = packet_size_code * 2; @@ -3603,7 +3601,6 @@ dtvcc_reset (struct dtvcc_decoder * dc) { dtvcc_reset_service (&dc->service[0]); dtvcc_reset_service (&dc->service[1]); - dc->packet_size = 0; dc->next_sequence_number = -1; } @@ -3783,7 +3780,9 @@ tvcc_decode_data (struct tvcc_decoder *td, return; process_cc_data_flag = buf[1] & 0x40; if (!process_cc_data_flag) + { return; + } cc_count = buf[1] & 0x1F; dtvcc = FALSE; @@ -3844,7 +3843,7 @@ tvcc_decode_data (struct tvcc_decoder *td, case DTVCC_DATA: j = td->dtvcc.packet_size; - //printf("atsc data %d %d %02x %02x\n", j, cc_valid, cc_data_1, cc_data_2); + //AM_DEBUG(1, "ccdata ========== atsc data packet_size %d valid:%d type: %x data1:%x data2:%x\n", j, cc_valid, cc_type, cc_data_1, cc_data_2); if (j <= 0) { /* Missed packet start. */ break; @@ -3866,7 +3865,6 @@ tvcc_decode_data (struct tvcc_decoder *td, case DTVCC_START: dtvcc = TRUE; j = td->dtvcc.packet_size; - //printf("atsc start %d %d %02x %02x\n", j, cc_valid, cc_data_1, cc_data_2); if (j > 0) { /* End of DTVCC packet. */ dtvcc_decode_packet (&td->dtvcc, @@ -3901,7 +3899,6 @@ tvcc_decode_data (struct tvcc_decoder *td, pthread_mutex_unlock(&td->mutex); vbi_send_event(td->vbi, &event); - pthread_mutex_lock(&td->mutex); ds->update = 0; |