From 7c835c98eec9fd66ecf79a2eb71470e8f9021ede Mon Sep 17 00:00:00 2001 From: Ke Gong Date: Wed, 27 Dec 2017 09:27:15 +0000 Subject: Merge "DTVCC: add fade and wipe support" into ics-amlogic --- 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 -- cgit