summaryrefslogtreecommitdiff
authorYan Yan <yan.yan@amlogic.com>2017-11-30 06:57:35 (GMT)
committer Yan Yan <yan.yan@amlogic.com>2017-11-30 07:00:48 (GMT)
commit14f70825588deca02173507ec23ececc789db191 (patch)
tree4adb67352a5d24efcaeb9e748982e5a1dbb109c0
parentec185989ea362a690c4d1e298e89023817ddf2e1 (diff)
downloadlibzvbi-14f70825588deca02173507ec23ececc789db191.zip
libzvbi-14f70825588deca02173507ec23ececc789db191.tar.gz
libzvbi-14f70825588deca02173507ec23ececc789db191.tar.bz2
DTVCC: add flash support
PD# 155813 Change-Id: Ifec5db7ac9544cfa39e7951b9c66385f0b3fcf60
Diffstat
-rwxr-xr-xsrc/dtvcc.c62
-rw-r--r--src/dtvcc.h3
2 files changed, 50 insertions, 15 deletions
diff --git a/src/dtvcc.c b/src/dtvcc.c
index aa538a1..ca8b1b8 100755
--- a/src/dtvcc.c
+++ b/src/dtvcc.c
@@ -2071,7 +2071,7 @@ static int webtv_check(struct caption_recorder *cr, char * buf,int len)
}
sprintf(temp,"%04X\n",(int)~sum&0xffff);
buf++;
- if(!strncmp(buf,temp,4))
+ if (!strncmp(buf,temp,4))
{
buf[5]=0;
if (cr->cur_ch[cr->field] >= 0 && cr->cc_fp[cr->cur_ch[cr->field]]) {
@@ -2581,9 +2581,11 @@ dtvcc_set_pen_color (struct dtvcc_service * ds,
c = buf[1];
dw->curr_pen.style.fg_opacity = c >> 6;
dw->curr_pen.style.fg_color = c & 0x3F;
+ dw->curr_pen.style.fg_flash = ((c>>6)==1)?1:0;
c = buf[2];
dw->curr_pen.style.bg_opacity = c >> 6;
dw->curr_pen.style.bg_color = c & 0x3F;
+ dw->curr_pen.style.bg_flash = ((c>>6)==1)?1:0;
return TRUE;
}
@@ -2660,6 +2662,7 @@ dtvcc_set_window_attributes (struct dtvcc_service * ds,
c = buf[1];
dw->style.fill_opacity = c >> 6;
dw->style.fill_color = c & 0x3F;
+ dw->style.window_flash = ((c>>6)==1)?1:0;
c = buf[2];
dw->style.border_type = border_type;
dw->style.border_color = c & 0x3F;
@@ -2903,7 +2906,7 @@ 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) {
+ if (ds->curr_window == NULL && ds->created == 0) {
return FALSE;
//return TRUE;
}
@@ -3228,14 +3231,14 @@ dtvcc_delay_cmd (struct dtvcc_decoder * dc,
struct timespec now_ts;
int plus_one_second = 0;
clock_gettime(CLOCK_REALTIME, &now_ts);
- if(delay_cmd == 0x8D)
+ if (delay_cmd == 0x8D)
{
/* Set trigger time
Until that time, sevice stop decoding.
*/
/* Delay time is tenths of second */
/* We set the timer a little faster to avoid double delay conflict */
- if((1000000000 - (delay_time%10) * 100000000) > now_ts.tv_nsec)
+ if ((1000000000 - (delay_time%10) * 100000000) > now_ts.tv_nsec)
{
ds->delay_timer.tv_nsec = ((delay_time % 10) * 100000000 + now_ts.tv_nsec) % 1000000000;
ds->delay_timer.tv_sec = (1 + now_ts.tv_sec + delay_time/10) -1;
@@ -3250,7 +3253,7 @@ dtvcc_delay_cmd (struct dtvcc_decoder * dc,
ds->delay_cancel = 0;
AM_DEBUG(1, "Enter delay cmd, now %d until %d", now_ts.tv_sec, ds->delay_timer.tv_sec);
}
- else if(delay_cmd == 0x8E)
+ else if (delay_cmd == 0x8E)
{
ds->delay = 0;
ds->delay_cancel = 1;
@@ -3577,13 +3580,13 @@ dtvcc_decode_packet (struct dtvcc_decoder * dc,
ds = &dc->service[i];
if (0 == ds->service_data_in)
continue;
- if(!ds->delay ||
+ if (!ds->delay ||
(ds->delay && ds->service_data_in>=128))
{
AM_DEBUG(1, "service datain %d", ds->service_data_in);
success = dtvcc_decode_syntactic_elements
(dc, ds, ds->service_data, ds->service_data_in);
- if(ds->service_data_in>=128)
+ if (ds->service_data_in >= 128)
{
ds->delay = 0;
ds->delay_cancel = 0;
@@ -3962,26 +3965,25 @@ tvcc_decode_data (struct tvcc_decoder *td,
/* Only handle effect */
void update_service_status(struct tvcc_decoder *td)
{
- int i;
+ int i, j, k, l;
struct timespec ts_now;
struct dtvcc_decoder *decoder;
+ struct dtvcc_pen_style *target_pen;
decoder = &td->dtvcc;
+ clock_gettime(CLOCK_REALTIME, &ts_now);
pthread_mutex_lock(&td->mutex);
/* CS1 - CS6 */
for (i = 0; i < 6; ++i) {
struct dtvcc_service *ds;
struct program *pr;
vbi_bool success;
-
ds = &decoder->service[i];
/* Check every effect */
-#if 1
- if(ds->delay)
+ if (ds->delay)
{
struct vbi_event event;
/* time is up */
- clock_gettime(CLOCK_REALTIME, &ts_now);
- if((ts_now.tv_sec > ds->delay_timer.tv_sec) ||
+ if ((ts_now.tv_sec > ds->delay_timer.tv_sec) ||
((ts_now.tv_sec == ds->delay_timer.tv_sec) &&(ts_now.tv_nsec > ds->delay_timer.tv_nsec)) ||
ds->delay_cancel)
{
@@ -3992,9 +3994,39 @@ void update_service_status(struct tvcc_decoder *td)
(decoder, ds, ds->service_data, ds->service_data_in);
ds->service_data_in = 0;
- }
+ }
+ }
+ for (j = 0; j < 8; j++)
+ {
+ if (ds->window[j].style.window_flash)
+ {
+ /*window flash treatment */
+ if (ds->window[j].style.window_flash)
+ {
+ ds->window[j].style.fill_opacity = (ts_now.tv_sec%2)?0:3;
+ ds->update = 1;
+ }
+
+ /* Pen flash treatment */
+ for (k = 0; k < 16; k++)
+ {
+ for (l =0; l<42; l++)
+ {
+ target_pen = &ds->window[j].pen[k][l];
+ if (target_pen->bg_flash)
+ {
+ target_pen->bg_opacity = (ts_now.tv_sec%2)?0:3;
+ ds->update = 1;
+ }
+ if (target_pen->fg_flash)
+ {
+ target_pen->fg_opacity = (ts_now.tv_sec%2)?0:3;
+ ds->update = 1;
+ }
+ }
+ }
+ }
}
-#endif
}
{
int i;
diff --git a/src/dtvcc.h b/src/dtvcc.h
index 9697d5c..8fec64b 100644
--- a/src/dtvcc.h
+++ b/src/dtvcc.h
@@ -308,6 +308,8 @@ struct dtvcc_pen_style {
enum opacity bg_opacity;
dtvcc_color edge_color;
+ vbi_bool fg_flash;
+ vbi_bool bg_flash;
};
struct dtvcc_pen {
@@ -327,6 +329,7 @@ struct dtvcc_window_style {
dtvcc_color fill_color;
enum opacity fill_opacity;
+ vbi_bool window_flash;
enum edge border_type;
dtvcc_color border_color;