summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mpcommon.c11
-rw-r--r--stream/tv.h3
-rw-r--r--stream/tvi_vbi.c24
3 files changed, 37 insertions, 1 deletions
diff --git a/mpcommon.c b/mpcommon.c
index ce1188680f..0a8bf790c0 100644
--- a/mpcommon.c
+++ b/mpcommon.c
@@ -146,8 +146,17 @@ void update_teletext(sh_video_t *sh_video, demuxer_t *demuxer, int reset)
{
#ifdef HAVE_TV_TELETEXT
tvi_handle_t* tvh=demuxer->priv;
+ int page_changed;
+
if (demuxer->type != DEMUXER_TYPE_TV || !tvh) return;
+ //Also forcing page update when such ioctl is not supported or call error occured
+ if(tvh->functions->control(tvh->priv,TV_VBI_CONTROL_IS_CHANGED,&page_changed)!=TVI_CONTROL_TRUE)
+ page_changed=1;
+
+ if(!page_changed)
+ return;
+
if(tvh->functions->control(tvh->priv,TV_VBI_CONTROL_GET_VBIPAGE,&vo_osd_teletext_page)!=TVI_CONTROL_TRUE)
vo_osd_teletext_page=NULL;
if(tvh->functions->control(tvh->priv,TV_VBI_CONTROL_GET_HALF_PAGE,&vo_osd_teletext_half)!=TVI_CONTROL_TRUE)
@@ -157,5 +166,7 @@ void update_teletext(sh_video_t *sh_video, demuxer_t *demuxer, int reset)
if(tvh->functions->control(tvh->priv,TV_VBI_CONTROL_GET_FORMAT,&vo_osd_teletext_format)!=TVI_CONTROL_TRUE)
vo_osd_teletext_format=0;
vo_osd_changed(OSDTYPE_TELETEXT);
+
+ tvh->functions->control(tvh->priv,TV_VBI_CONTROL_MARK_UNCHANGED,NULL);
#endif
}
diff --git a/stream/tv.h b/stream/tv.h
index 31d5785282..f69d8f3371 100644
--- a/stream/tv.h
+++ b/stream/tv.h
@@ -198,6 +198,9 @@ typedef struct {
#define TV_VBI_CONTROL_GET_HALF_PAGE 0x51c ///< get current half page
#define TV_VBI_CONTROL_SET_HALF_PAGE 0x51d ///< switch half page
+#define TV_VBI_CONTROL_IS_CHANGED 0x540 ///< teletext page is changed
+#define TV_VBI_CONTROL_MARK_UNCHANGED 0x541 ///< teletext page is changed
+
#define TV_VBI_CONTROL_ADD_DEC 0x550 ///< add page number with dec
#define TV_VBI_CONTROL_GO_LINK 0x551 ///< go link (1..6) NYI
#define TV_VBI_CONTROL_GET_VBIPAGE 0x552 ///< get vbi_image for grabbed teletext page
diff --git a/stream/tvi_vbi.c b/stream/tvi_vbi.c
index 7cfd27e20c..930dab4e48 100644
--- a/stream/tvi_vbi.c
+++ b/stream/tvi_vbi.c
@@ -96,6 +96,7 @@
#include "libmpcodecs/img_format.h"
#include "libavutil/common.h"
#include "input/input.h"
+#include "osdep/timer.h"
//#define DEBUG_DUMP 1
@@ -150,6 +151,8 @@ typedef struct {
unsigned int universaltime;
unsigned char networkname[21];
int cache_reset;
+ /// "page changed" flag: 0-unchanged, 1-entire page, 3-only header
+ int page_changed;
} priv_vbi_t;
static unsigned char fixParity[256];
@@ -1635,7 +1638,7 @@ int teletext_control(void* p, int cmd, void *arg)
if (!priv && cmd!=TV_VBI_CONTROL_START)
return TVI_CONTROL_FALSE;
- if (!arg && cmd!=TV_VBI_CONTROL_STOP)
+ if (!arg && cmd!=TV_VBI_CONTROL_STOP && cmd!=TV_VBI_CONTROL_MARK_UNCHANGED)
return TVI_CONTROL_FALSE;
switch (cmd) {
@@ -1669,6 +1672,7 @@ int teletext_control(void* p, int cmd, void *arg)
priv->primary_language=tt_languages[i].lang_code;
}
}
+ priv->page_changed=1;
pthread_mutex_unlock(&(priv->buffer_mutex));
return TVI_CONTROL_TRUE;
}
@@ -1696,6 +1700,7 @@ int teletext_control(void* p, int cmd, void *arg)
init_cache(priv);
init_vbi_consts(priv);
pll_reset(priv,fine_tune);
+ priv->page_changed=1;
return TVI_CONTROL_TRUE;
}
case TV_VBI_CONTROL_STOP:
@@ -1705,16 +1710,19 @@ int teletext_control(void* p, int cmd, void *arg)
if(priv->ptsp)
free(priv->ptsp);
destroy_cache(priv);
+ priv->page_changed=1;
free(priv);
return TVI_CONTROL_TRUE;
}
case TV_VBI_CONTROL_SET_MODE:
priv->on=(*(int*)arg%2);
+ priv->page_changed=1;
return TVI_CONTROL_TRUE;
case TV_VBI_CONTROL_GET_MODE:
*(int*)arg=priv->on;
return TVI_CONTROL_TRUE;
case TV_VBI_CONTROL_SET_FORMAT:
+ priv->page_changed=1;
return teletext_set_format(priv, *(int *) arg);
case TV_VBI_CONTROL_GET_FORMAT:
pthread_mutex_lock(&(priv->buffer_mutex));
@@ -1734,6 +1742,7 @@ int teletext_control(void* p, int cmd, void *arg)
val+=3;
pthread_mutex_lock(&(priv->buffer_mutex));
priv->zoom=val;
+ priv->page_changed=1;
pthread_mutex_unlock(&(priv->buffer_mutex));
return TVI_CONTROL_TRUE;
}
@@ -1756,6 +1765,7 @@ int teletext_control(void* p, int cmd, void *arg)
priv->subpagenum=pgc->links[val-1].subpagenum;
else
priv->subpagenum=get_subpagenum_from_cache(priv,priv->pagenum);
+ priv->page_changed=1;
pthread_mutex_unlock(&(priv->buffer_mutex));
return TVI_CONTROL_TRUE;
}
@@ -1768,6 +1778,7 @@ int teletext_control(void* p, int cmd, void *arg)
priv->pagenum=val&0x7ff;
priv->subpagenum=get_subpagenum_from_cache(priv,priv->pagenum);
priv->pagenumdec=0;
+ priv->page_changed=1;
pthread_mutex_unlock(&(priv->buffer_mutex));
return TVI_CONTROL_TRUE;
}
@@ -1778,6 +1789,7 @@ int teletext_control(void* p, int cmd, void *arg)
priv->pagenum=steppage(priv->pagenum, direction,1);
priv->subpagenum=get_subpagenum_from_cache(priv,priv->pagenum);
priv->pagenumdec=0;
+ priv->page_changed=1;
pthread_mutex_unlock(&(priv->buffer_mutex));
return TVI_CONTROL_TRUE;
}
@@ -1792,6 +1804,7 @@ int teletext_control(void* p, int cmd, void *arg)
priv->subpagenum=0x3f7f;
if(priv->subpagenum>=VBI_MAX_SUBPAGES)
priv->subpagenum=VBI_MAX_SUBPAGES-1;
+ priv->page_changed=1;
pthread_mutex_unlock(&(priv->buffer_mutex));
return TVI_CONTROL_TRUE;
case TV_VBI_CONTROL_GET_SUBPAGE:
@@ -1799,6 +1812,7 @@ int teletext_control(void* p, int cmd, void *arg)
return TVI_CONTROL_TRUE;
case TV_VBI_CONTROL_ADD_DEC:
vbi_add_dec(priv, *(char **) arg);
+ priv->page_changed=1;
return TVI_CONTROL_TRUE;
case TV_VBI_CONTROL_DECODE_PAGE:
vbi_decode(priv,*(unsigned char**)arg);
@@ -1812,6 +1826,14 @@ int teletext_control(void* p, int cmd, void *arg)
case TV_VBI_CONTROL_GET_NETWORKNAME:
*(void **)arg=priv->networkname;
return TVI_CONTROL_TRUE;
+ case TV_VBI_CONTROL_MARK_UNCHANGED:
+ priv->page_changed=0;
+ return TVI_CONTROL_TRUE;
+ case TV_VBI_CONTROL_IS_CHANGED:
+ if((GetTimerMS()/250)%2) //forcing page update every 1/4 sec
+ priv->page_changed=3; //mark that header update is enough
+ *(int*)arg=priv->page_changed;
+ return TVI_CONTROL_TRUE;
}
return TVI_CONTROL_UNKNOWN;
}