summaryrefslogtreecommitdiff
authorYan 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)
commit80b7e2a7cebcf1154f8f2d85b7463950ce1ed376 (patch)
tree3abbdc6862fa029df246798f231b9c8e5f38630b
parentf058aa9b624ffcf661295287c64b6d062f3a2d2f (diff)
downloadlibzvbi-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
Diffstat
-rw-r--r--Android.mk1
-rwxr-xr-xsrc/caption.c49
-rw-r--r--src/cc.h1
-rwxr-xr-xsrc/dtvcc.c41
4 files changed, 56 insertions, 36 deletions
diff --git a/Android.mk b/Android.mk
index 754ec5a..37f662e 100644
--- a/Android.mk
+++ b/Android.mk
@@ -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);
diff --git a/src/cc.h b/src/cc.h
index 2267b16..ff6244e 100644
--- a/src/cc.h
+++ b/src/cc.h
@@ -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;