summaryrefslogtreecommitdiff
authoryan yan <yan.yan@amlogic.com>2017-12-26 08:22:50 (GMT)
committer Yan Yan <yan.yan@amlogic.com>2017-12-26 08:44:56 (GMT)
commit9d245fcf73084e0f6f81c7ce04ae4be1e01e7df4 (patch)
tree7fd48cb83053e4a10622f54aee50108d00a3bcdb
parent4d3468c7a09e62f460510aa027f583f2ded33b0a (diff)
downloadlibzvbi-9d245fcf73084e0f6f81c7ce04ae4be1e01e7df4.zip
libzvbi-9d245fcf73084e0f6f81c7ce04ae4be1e01e7df4.tar.gz
libzvbi-9d245fcf73084e0f6f81c7ce04ae4be1e01e7df4.tar.bz2
DTVCC: add fade and wipe support
PD# NONE Change-Id: I08d7014997f750b8549f5c678a5389f183c900c0
Diffstat
-rw-r--r--Android.mk3
-rw-r--r--src/dtvcc.c79
-rw-r--r--src/dtvcc.h21
3 files changed, 93 insertions, 10 deletions
diff --git a/Android.mk b/Android.mk
index 982a594..aa3f7a6 100644
--- a/Android.mk
+++ b/Android.mk
@@ -18,9 +18,10 @@ endif
LOCAL_ARM_MODE := arm
LOCAL_C_INCLUDES := external/icu4c/common
LOCAL_C_INCLUDES := vendor/amlogic/dvb/include/am_adp
+#LOCAL_C_INCLUDES := external/dvb/include/am_adp
LOCAL_C_INCLUDES += external/icu/icu4c/source/common
-LOCAL_SHARED_LIBRARIES += libicuuc liblog
+LOCAL_SHARED_LIBRARIES += libicuuc liblog libam_adp
LOCAL_PRELINK_MODULE := false
diff --git a/src/dtvcc.c b/src/dtvcc.c
index 387445d..c015b2c 100644
--- a/src/dtvcc.c
+++ b/src/dtvcc.c
@@ -2466,6 +2466,11 @@ dtvcc_put_char (struct dtvcc_decoder * dc,
row = dw->curr_row;
column = dw->curr_column;
+ /* Add row column lock support */
+ /*AM_DEBUG(0, "put_char before ds %d cl %d rl %d col %d row %d col_curr %d row_curr %d win_col %d win_row %d",
+ ds->id, dw->column_lock, dw->row_lock, column, row, dw->curr_column, dw->curr_row,
+ dw->column_count, dw->row_count); */
+
/* FIXME how should we handle TEXT_TAG_NOT_DISPLAYABLE? */
dw->buffer[row][column] = c;
@@ -2488,8 +2493,40 @@ dtvcc_put_char (struct dtvcc_decoder * dc,
dw->streamed &= ~(1 << row);
if (!cc_timestamp_isset (&dw->timestamp_c0))
dw->timestamp_c0 = ds->timestamp;
+#if 1
if (++column >= dw->column_count)
return TRUE;
+#else
+ column ++;
+ /* We handle row column lock here */
+ if (column >= dw->column_count)
+ {
+ if (dw->column_lock == 1)
+ {
+ if (dw->row_lock == 1)
+ {
+ column = dw->column_count;
+ dw->buffer[row][column] = 0;
+ }
+ }
+ else
+ {
+ if (column >= CC_MAX_COLUMNS)
+ {
+ column = CC_MAX_COLUMNS;
+ dw->buffer[row][column] = 0;
+ }
+ else
+ {
+ dw->column_count = column + 1;
+ }
+ }
+ }
+ else
+ {
+ column ++;
+ }
+#endif
break;
case DIR_RIGHT_LEFT:
@@ -2520,7 +2557,6 @@ dtvcc_put_char (struct dtvcc_decoder * dc,
dw->curr_row = row;
dw->curr_column = column;
-
return TRUE;
}
@@ -2716,7 +2752,8 @@ dtvcc_clear_windows (struct dtvcc_decoder * dc,
dw->curr_row = 0;
dw->streamed = 0;
-
+ dw->style.display_effect = 0;
+ dw->effect_status = 0;
if (dw->visible)
dtvcc_render(dc, ds);
@@ -2861,7 +2898,7 @@ dtvcc_define_window (struct dtvcc_decoder * dc,
c = buf[1];
dw->visible = (c >> 5) & 1;
dw->row_lock = (c >> 4) & 1;
- dw->column_lock = (c >> 4) & 1;
+ dw->column_lock = (c >> 3) & 1;
dw->priority = c & 7;
dw->anchor_relative = anchor_relative;
@@ -2938,17 +2975,23 @@ dtvcc_display_windows (struct dtvcc_decoder * dc,
switch (c) {
case 0x89: /* DSW DisplayWindows */
dw->visible = TRUE;
+ dw->effect_status = CC_EFFECT_DISPLAY;
break;
case 0x8A: /* HDW HideWindows */
dw->visible = FALSE;
+ dw->effect_status = CC_EFFECT_HIDE;
break;
case 0x8B: /* TGW ToggleWindows */
dw->visible = was_visible ^ TRUE;
+ dw->effect_status =
+ (dw->visible == TRUE)?CC_EFFECT_DISPLAY:CC_EFFECT_HIDE;
break;
}
+ clock_gettime(CLOCK_REALTIME, &dw->effect_timer);
+
if (!was_visible) {
unsigned int row;
@@ -3224,6 +3267,9 @@ dtvcc_delete_windows (struct dtvcc_decoder * dc,
memset (dw->buffer, 0, sizeof (dw->buffer));
memset (dw->pen, 0, sizeof(dw->pen));
dw->visible = 0;
+ dw->effect_status = 0;
+ dw->effect_percent = 0;
+ dw->style.display_effect = 0;
changed = 1;
}
@@ -3814,6 +3860,7 @@ dtvcc_reset_service (struct dtvcc_service * ds)
ds->created = 0;
ds->delay = 0;
ds->delay_cancel = 0;
+
struct dtvcc_window *dw;
for (i=0;i<8;i++)
{
@@ -3821,7 +3868,7 @@ dtvcc_reset_service (struct dtvcc_service * ds)
ds->window[i].visible = 0;
memset (dw->buffer, 0, sizeof (dw->buffer));
memset (dw->pen, 0, sizeof(dw->pen));
-
+ dw->effect_status = 0;
dw->streamed = 0;
}
ds->update = 1;
@@ -3840,9 +3887,12 @@ dtvcc_reset (struct dtvcc_decoder * dc)
void
dtvcc_init (struct dtvcc_decoder * dc)
{
+ int i;
memset(dc, 0, sizeof(struct dtvcc_decoder));
dtvcc_reset (dc);
cc_timestamp_reset (&dc->timestamp);
+ for (i=0;i<6;i++)
+ dc->service[i].id = i;
}
static void dtvcc_window_to_page(vbi_decoder *vbi, struct dtvcc_window *dw, struct vbi_page *pg)
@@ -4039,10 +4089,25 @@ static void update_service_status_internal (struct tvcc_decoder *td)
for (j = 0; j < 8; j++)
{
+ struct dtvcc_window *target_window;
+ target_window = &ds->window[j];
/*window flash treatment */
- if (ds->window[j].style.window_flash)
+ if (target_window->style.window_flash)
{
- ds->window[j].style.fill_opacity = flash?0:3;
+ target_window->style.fill_opacity = flash?0:3;
+ ds->update = 1;
+ }
+
+ /* Wipe and fade treatment */
+ if (target_window->style.display_effect != 0 &&
+ target_window->effect_status != 0)
+ {
+ target_window->effect_percent =
+ ((ts_now.tv_sec - target_window->effect_timer.tv_sec) * 1000 +
+ (ts_now.tv_nsec - target_window->effect_timer.tv_nsec) / 1000000) *100/
+ (target_window->style.effect_speed * 500);
+ if (target_window->effect_percent > 100)
+ target_window->effect_percent = 100;
ds->update = 1;
}
@@ -4051,7 +4116,7 @@ static void update_service_status_internal (struct tvcc_decoder *td)
{
for (l =0; l<42; l++)
{
- target_pen = &ds->window[j].pen[k][l];
+ target_pen = &target_window->pen[k][l];
if (target_pen->bg_flash)
{
target_pen->bg_opacity = flash?0:3;
diff --git a/src/dtvcc.h b/src/dtvcc.h
index d69758b..83b0ef2 100644
--- a/src/dtvcc.h
+++ b/src/dtvcc.h
@@ -40,6 +40,12 @@ enum cc_mode {
CC_MODE_TEXT
};
+enum cc_effect_status {
+ CC_EFFECT_NONE,
+ CC_EFFECT_DISPLAY,
+ CC_EFFECT_HIDE
+};
+
/* EIA 608-B Section 4.1. */
#define VBI_CAPTION_CC1 1 /* primary synchronous caption service (F1) */
#define VBI_CAPTION_CC2 2 /* special non-synchronous use captions (F1) */
@@ -365,6 +371,12 @@ struct dtvcc_window {
struct dtvcc_window_style style;
+ /* Used for fade and swipe */
+ struct timespec effect_timer;
+ /* 0~100 */
+ int effect_percent;
+ enum cc_effect_status effect_status;
+
/* Our stuff. */
/**
@@ -384,6 +396,7 @@ struct dtvcc_window {
struct dtvcc_service {
/* Interpretation Layer. */
+ int id;
struct dtvcc_window window[8];
struct dtvcc_window old_window[8];
@@ -403,9 +416,11 @@ struct dtvcc_service {
uint8_t service_data[128];
unsigned int service_data_in;
/* For 0x8D 0x8E delay command
- if delay flag is set, decoder stop decoding
- */
+ * if delay flag is set, decoder stop decoding
+ */
struct timespec delay_timer;
+
+
int delay;
int delay_cancel;
@@ -519,6 +534,8 @@ extern void vbi_decode_caption(vbi_decoder *vbi, int line, const uint8_t *bu
extern int get_input_offset();
extern void update_service_status(struct tvcc_decoder *td);
+static vbi_bool dtvcc_carriage_return (struct dtvcc_decoder *dc, struct dtvcc_service * ds);
+
#endif