summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcehoyos <cehoyos@b3059339-0415-0410-9bf9-f77b7e298cf2>2009-11-07 12:31:05 +0000
committercehoyos <cehoyos@b3059339-0415-0410-9bf9-f77b7e298cf2>2009-11-07 12:31:05 +0000
commit423c415534f7393c07247b87ab4d95f6d0635474 (patch)
treedd986257786302c543d7a1807b4c310d15883276
parent1698db0726e4b7c11f4dc47dfc823df5ab1cd80d (diff)
downloadmpv-423c415534f7393c07247b87ab4d95f6d0635474.tar.bz2
mpv-423c415534f7393c07247b87ab4d95f6d0635474.tar.xz
Separate teletext from tv support.
Path by Francesco Lavra, francescolavra interfree it git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@29848 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--cfg-common.h8
-rw-r--r--command.c37
-rwxr-xr-xconfigure2
-rw-r--r--libmpcodecs/dec_teletext.c11
-rw-r--r--libmpcodecs/dec_teletext.h11
-rw-r--r--libmpdemux/demuxer.h3
-rw-r--r--mpcommon.c17
-rw-r--r--stream/tv.c21
-rw-r--r--stream/tv.h10
-rw-r--r--stream/tvi_dshow.c7
-rw-r--r--stream/tvi_v4l.c5
-rw-r--r--stream/tvi_v4l2.c5
12 files changed, 81 insertions, 56 deletions
diff --git a/cfg-common.h b/cfg-common.h
index 991234f0c0..198fcca59d 100644
--- a/cfg-common.h
+++ b/cfg-common.h
@@ -126,10 +126,10 @@ const m_option_t tvopts_conf[]={
#endif /* defined(CONFIG_TV_V4L) || defined(CONFIG_TV_V4L2) */
{"adevice", &stream_tv_defaults.adevice, CONF_TYPE_STRING, 0, 0, 0, NULL},
#ifdef CONFIG_TV_TELETEXT
- {"tdevice", &stream_tv_defaults.tdevice, CONF_TYPE_STRING, 0, 0, 0, NULL},
- {"tpage", &stream_tv_defaults.tpage, CONF_TYPE_INT, CONF_RANGE, 100, 899, NULL},
- {"tformat", &stream_tv_defaults.tformat, CONF_TYPE_INT, CONF_RANGE, 0, 3, NULL},
- {"tlang", &stream_tv_defaults.tlang, CONF_TYPE_INT, CONF_RANGE, -1, 0x7f, NULL},
+ {"tdevice", &stream_tv_defaults.teletext.device, CONF_TYPE_STRING, 0, 0, 0, NULL},
+ {"tpage", &stream_tv_defaults.teletext.page, CONF_TYPE_INT, CONF_RANGE, 100, 899, NULL},
+ {"tformat", &stream_tv_defaults.teletext.format, CONF_TYPE_INT, CONF_RANGE, 0, 3, NULL},
+ {"tlang", &stream_tv_defaults.teletext.lang, CONF_TYPE_INT, CONF_RANGE, -1, 0x7f, NULL},
#endif /* CONFIG_TV_TELETEXT */
{"audioid", &stream_tv_defaults.audio_id, CONF_TYPE_INT, CONF_RANGE, 0, 9, NULL},
#ifdef CONFIG_TV_DSHOW
diff --git a/command.c b/command.c
index 37a0780cbd..0998ea8136 100644
--- a/command.c
+++ b/command.c
@@ -1889,8 +1889,7 @@ static int mp_property_teletext_common(m_option_t * prop, int action, void *arg,
SET is GET+1
STEP is GET+2
*/
- tvi_handle_t *tvh = mpctx->demuxer->priv;
- if (mpctx->demuxer->type != DEMUXER_TYPE_TV || !tvh)
+ if (!mpctx->demuxer->teletext)
return M_PROPERTY_UNAVAILABLE;
if(!base_ioctl)
return M_PROPERTY_ERROR;
@@ -1899,31 +1898,30 @@ static int mp_property_teletext_common(m_option_t * prop, int action, void *arg,
case M_PROPERTY_GET:
if (!arg)
return M_PROPERTY_ERROR;
- result=tvh->functions->control(tvh->priv, base_ioctl, arg);
+ result=teletext_control(mpctx->demuxer->teletext, base_ioctl, arg);
break;
case M_PROPERTY_SET:
if (!arg)
return M_PROPERTY_ERROR;
M_PROPERTY_CLAMP(prop, *(int *) arg);
- result=tvh->functions->control(tvh->priv, base_ioctl+1, arg);
+ result=teletext_control(mpctx->demuxer->teletext, base_ioctl+1, arg);
break;
case M_PROPERTY_STEP_UP:
case M_PROPERTY_STEP_DOWN:
- result=tvh->functions->control(tvh->priv, base_ioctl, &val);
+ result=teletext_control(mpctx->demuxer->teletext, base_ioctl, &val);
val += (arg ? *(int *) arg : 1) * (action == M_PROPERTY_STEP_DOWN ? -1 : 1);
- result=tvh->functions->control(tvh->priv, base_ioctl+1, &val);
+ result=teletext_control(mpctx->demuxer->teletext, base_ioctl+1, &val);
break;
default:
return M_PROPERTY_NOT_IMPLEMENTED;
}
- return result == TVI_CONTROL_TRUE ? M_PROPERTY_OK : M_PROPERTY_ERROR;
+ return result == VBI_CONTROL_TRUE ? M_PROPERTY_OK : M_PROPERTY_ERROR;
}
static int mp_property_teletext_mode(m_option_t * prop, int action, void *arg,
MPContext * mpctx)
{
- tvi_handle_t *tvh = mpctx->demuxer->priv;
int result;
int val;
@@ -1932,7 +1930,8 @@ static int mp_property_teletext_mode(m_option_t * prop, int action, void *arg,
if(result!=M_PROPERTY_OK)
return result;
- if(tvh->functions->control(tvh->priv, prop->priv, &val)==TVI_CONTROL_TRUE && val)
+ if(teletext_control(mpctx->demuxer->teletext,
+ (int)prop->priv, &val)==VBI_CONTROL_TRUE && val)
mp_input_set_section("teletext");
else
mp_input_set_section("tv");
@@ -1942,17 +1941,17 @@ static int mp_property_teletext_mode(m_option_t * prop, int action, void *arg,
static int mp_property_teletext_page(m_option_t * prop, int action, void *arg,
MPContext * mpctx)
{
- tvi_handle_t *tvh = mpctx->demuxer->priv;
int result;
int val;
- if (mpctx->demuxer->type != DEMUXER_TYPE_TV || !tvh)
+ if (!mpctx->demuxer->teletext)
return M_PROPERTY_UNAVAILABLE;
switch(action){
case M_PROPERTY_STEP_UP:
case M_PROPERTY_STEP_DOWN:
//This should be handled separately
val = (arg ? *(int *) arg : 1) * (action == M_PROPERTY_STEP_DOWN ? -1 : 1);
- result=tvh->functions->control(tvh->priv, TV_VBI_CONTROL_STEP_PAGE, &val);
+ result=teletext_control(mpctx->demuxer->teletext,
+ TV_VBI_CONTROL_STEP_PAGE, &val);
break;
default:
result=mp_property_teletext_common(prop,action,arg,mpctx);
@@ -2870,23 +2869,23 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
if (mpctx->file_format == DEMUXER_TYPE_TV)
tv_step_chanlist((tvi_handle_t *) (mpctx->demuxer->priv));
break;
+#endif /* CONFIG_TV */
#ifdef CONFIG_TV_TELETEXT
case MP_CMD_TV_TELETEXT_ADD_DEC:
{
- tvi_handle_t* tvh=(tvi_handle_t *)(mpctx->demuxer->priv);
- if (mpctx->file_format == DEMUXER_TYPE_TV)
- tvh->functions->control(tvh->priv,TV_VBI_CONTROL_ADD_DEC,&(cmd->args[0].v.s));
+ if (mpctx->demuxer->teletext)
+ teletext_control(mpctx->demuxer->teletext,TV_VBI_CONTROL_ADD_DEC,
+ &(cmd->args[0].v.s));
break;
}
case MP_CMD_TV_TELETEXT_GO_LINK:
{
- tvi_handle_t* tvh=(tvi_handle_t *)(mpctx->demuxer->priv);
- if (mpctx->file_format == DEMUXER_TYPE_TV)
- tvh->functions->control(tvh->priv,TV_VBI_CONTROL_GO_LINK,&(cmd->args[0].v.i));
+ if (mpctx->demuxer->teletext)
+ teletext_control(mpctx->demuxer->teletext,TV_VBI_CONTROL_GO_LINK,
+ &(cmd->args[0].v.i));
break;
}
#endif /* CONFIG_TV_TELETEXT */
-#endif /* CONFIG_TV */
case MP_CMD_SUB_LOAD:
if (sh_video) {
diff --git a/configure b/configure
index 9c85f6116d..b85339eaa2 100755
--- a/configure
+++ b/configure
@@ -7620,7 +7620,7 @@ echocheck "TV teletext interface"
if test "$_tv_teletext" = auto ; then
_tv_teletext=no
if test "$_freetype" = yes && test "$_pthreads" = yes; then
- if test "$_tv_v4l2" = yes || test "$_v4l" = yes || test "$_tv_dshow" = yes; then
+ if test "$_tv_v4l2" = yes || test "$_v4l" = yes || test "$_tv_dshow" = yes || test "$_dvbin" = yes; then
_tv_teletext=yes
fi
fi
diff --git a/libmpcodecs/dec_teletext.c b/libmpcodecs/dec_teletext.c
index b7f1353a55..aa72dae72f 100644
--- a/libmpcodecs/dec_teletext.c
+++ b/libmpcodecs/dec_teletext.c
@@ -90,7 +90,6 @@
#include <pthread.h>
-#include "stream/tv.h"
#include "dec_teletext.h"
#include "mp_msg.h"
#include "help_mp.h"
@@ -1653,15 +1652,15 @@ int teletext_control(void* p, int cmd, void *arg)
case TV_VBI_CONTROL_RESET:
{
int i;
- tv_param_t* tv_param=arg;
+ struct tt_param* tt_param=arg;
pthread_mutex_lock(&(priv->buffer_mutex));
priv->pagenumdec=0;
clear_cache(priv);
- priv->pagenum=steppage(0,tv_param->tpage&0x7ff,1);
- priv->tformat=tv_param->tformat;
+ priv->pagenum=steppage(0,tt_param->page&0x7ff,1);
+ priv->tformat=tt_param->format;
priv->subpagenum=0x3f7f;
pll_reset(priv,fine_tune);
- if(tv_param->tlang==-1){
+ if(tt_param->lang==-1){
mp_msg(MSGT_TELETEXT,MSGL_INFO,MSGTR_TV_TTSupportedLanguages);
for(i=0; tt_languages[i].lang_code; i++){
mp_msg(MSGT_TELETEXT,MSGL_INFO," %3d %s\n",
@@ -1671,7 +1670,7 @@ int teletext_control(void* p, int cmd, void *arg)
tt_languages[i].lang_code, tt_languages[i].lang_name);
}else{
for(i=0; tt_languages[i].lang_code; i++){
- if(tt_languages[i].lang_code==tv_param->tlang)
+ if(tt_languages[i].lang_code==tt_param->lang)
break;
}
if (priv->primary_language!=tt_languages[i].lang_code){
diff --git a/libmpcodecs/dec_teletext.h b/libmpcodecs/dec_teletext.h
index ce83bbae58..1d367e362b 100644
--- a/libmpcodecs/dec_teletext.h
+++ b/libmpcodecs/dec_teletext.h
@@ -23,11 +23,22 @@
#ifndef MPLAYER_DEC_TELETEXT_H
#define MPLAYER_DEC_TELETEXT_H
+struct tt_param {
+ char *device; ///< teletext device
+ int format; ///< teletext display format
+ int page; ///< start teletext page
+ int lang; ///< primary language code
+};
+
#define VBI_CONTROL_FALSE 0
#define VBI_CONTROL_TRUE 1
#define VBI_CONTROL_UNKNOWN -1
+#ifdef CONFIG_TV_TELETEXT
int teletext_control(void* p, int cmd, void *arg);
+#else
+#define teletext_control(p, cmd, arg) VBI_CONTROL_FALSE
+#endif
/*
TELETEXT controls (through teletext_control() )
diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h
index 5d62f1bb52..bf0d4412ed 100644
--- a/libmpdemux/demuxer.h
+++ b/libmpdemux/demuxer.h
@@ -242,6 +242,9 @@ typedef struct demuxer_st {
void* v_streams[MAX_V_STREAMS]; // video sterams (sh_video_t)
void *s_streams[MAX_S_STREAMS]; // dvd subtitles (flag)
+ // pointer to teletext decoder private data, if demuxer stream contains teletext
+ void *teletext;
+
demux_chapter_t* chapters;
int num_chapters;
diff --git a/mpcommon.c b/mpcommon.c
index ed0c11e725..575ddd0425 100644
--- a/mpcommon.c
+++ b/mpcommon.c
@@ -11,7 +11,6 @@
#include "spudec.h"
#include "version.h"
#include "vobsub.h"
-#include "stream/tv.h"
#include "libmpcodecs/dec_teletext.h"
#include "libavutil/intreadwrite.h"
#include "m_option.h"
@@ -209,29 +208,29 @@ void update_subtitles(sh_video_t *sh_video, double refpts, demux_stream_t *d_dvd
void update_teletext(sh_video_t *sh_video, demuxer_t *demuxer, int reset)
{
#ifdef CONFIG_TV_TELETEXT
- tvi_handle_t* tvh=demuxer->priv;
int page_changed;
- if (demuxer->type != DEMUXER_TYPE_TV || !tvh) return;
+ if (!demuxer->teletext)
+ 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)!=VBI_CONTROL_TRUE)
+ if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_IS_CHANGED,&page_changed)!=VBI_CONTROL_TRUE)
page_changed=1;
if(!page_changed)
return;
- if(tvh->functions->control(tvh->priv,TV_VBI_CONTROL_GET_VBIPAGE,&vo_osd_teletext_page)!=VBI_CONTROL_TRUE)
+ if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_VBIPAGE,&vo_osd_teletext_page)!=VBI_CONTROL_TRUE)
vo_osd_teletext_page=NULL;
- if(tvh->functions->control(tvh->priv,TV_VBI_CONTROL_GET_HALF_PAGE,&vo_osd_teletext_half)!=VBI_CONTROL_TRUE)
+ if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_HALF_PAGE,&vo_osd_teletext_half)!=VBI_CONTROL_TRUE)
vo_osd_teletext_half=0;
- if(tvh->functions->control(tvh->priv,TV_VBI_CONTROL_GET_MODE,&vo_osd_teletext_mode)!=VBI_CONTROL_TRUE)
+ if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_MODE,&vo_osd_teletext_mode)!=VBI_CONTROL_TRUE)
vo_osd_teletext_mode=0;
- if(tvh->functions->control(tvh->priv,TV_VBI_CONTROL_GET_FORMAT,&vo_osd_teletext_format)!=VBI_CONTROL_TRUE)
+ if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_FORMAT,&vo_osd_teletext_format)!=VBI_CONTROL_TRUE)
vo_osd_teletext_format=0;
vo_osd_changed(OSDTYPE_TELETEXT);
- tvh->functions->control(tvh->priv,TV_VBI_CONTROL_MARK_UNCHANGED,NULL);
+ teletext_control(demuxer->teletext,TV_VBI_CONTROL_MARK_UNCHANGED,NULL);
#endif
}
diff --git a/stream/tv.c b/stream/tv.c
index 7e7ba263fa..b27486d086 100644
--- a/stream/tv.c
+++ b/stream/tv.c
@@ -334,7 +334,8 @@ int tv_set_norm(tvi_handle_t *tvh, char* norm)
mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TV_CannotSetNorm);
return 0;
}
- tvh->functions->control(tvh->priv,TV_VBI_CONTROL_RESET,tvh->tv_param);
+ teletext_control(tvh->demuxer->teletext,TV_VBI_CONTROL_RESET,
+ &tvh->tv_param->teletext);
return 1;
}
@@ -348,7 +349,8 @@ int tv_set_norm_i(tvi_handle_t *tvh, int norm)
return 0;
}
- tvh->functions->control(tvh->priv,TV_VBI_CONTROL_RESET,tvh->tv_param);
+ teletext_control(tvh->demuxer->teletext,TV_VBI_CONTROL_RESET,
+ &tvh->tv_param->teletext);
return 1;
}
@@ -669,7 +671,11 @@ static demuxer_t* demux_open_tv(demuxer_t *demuxer)
if(!(tvh=tv_begin(demuxer->stream->priv))) return NULL;
if (!tvh->functions->init(tvh->priv)) return NULL;
- tvh->functions->control(tvh->priv,TVI_CONTROL_VBI_INIT,&(tvh->tv_param->tdevice));
+ tvh->demuxer = demuxer;
+ tvh->functions->control(tvh->priv,TVI_CONTROL_VBI_INIT,
+ &(tvh->tv_param->teletext.device));
+ tvh->functions->control(tvh->priv,TVI_CONTROL_GET_VBI_PTR,
+ &demuxer->teletext);
if (!open_tv(tvh)){
tv_uninit(tvh);
@@ -812,7 +818,8 @@ no_audio:
if(funcs->control(tvh->priv,TVI_CONTROL_VID_SET_GAIN,&tvh->tv_param->gain)!=TVI_CONTROL_TRUE)
mp_msg(MSGT_TV,MSGL_WARN,"Unable to set gain control!\n");
- funcs->control(tvh->priv,TV_VBI_CONTROL_RESET,tvh->tv_param);
+ teletext_control(demuxer->teletext,TV_VBI_CONTROL_RESET,
+ &tvh->tv_param->teletext);
return demuxer;
}
@@ -893,7 +900,8 @@ int tv_set_freq(tvi_handle_t *tvh, unsigned long freq)
mp_msg(MSGT_TV, MSGL_V, MSGTR_TV_CurrentFrequency,
freq, (float)freq/16);
}
- tvh->functions->control(tvh->priv,TV_VBI_CONTROL_RESET,tvh->tv_param);
+ teletext_control(tvh->demuxer->teletext,TV_VBI_CONTROL_RESET,
+ &tvh->tv_param->teletext);
return 1;
}
@@ -1074,7 +1082,8 @@ int tv_step_norm(tvi_handle_t *tvh)
return 0;
}
}
- tvh->functions->control(tvh->priv,TV_VBI_CONTROL_RESET,tvh->tv_param);
+ teletext_control(tvh->demuxer->teletext,TV_VBI_CONTROL_RESET,
+ &tvh->tv_param->teletext);
return 1;
}
diff --git a/stream/tv.h b/stream/tv.h
index abcbb0b680..48ff88ecc2 100644
--- a/stream/tv.h
+++ b/stream/tv.h
@@ -25,6 +25,9 @@
#ifndef MPLAYER_TV_H
#define MPLAYER_TV_H
+#include "libmpcodecs/dec_teletext.h"
+#include "libmpdemux/demuxer.h"
+
typedef struct tv_param_s {
char *freq;
char *channel;
@@ -62,10 +65,7 @@ typedef struct tv_param_s {
int hue;
int saturation;
int gain;
- char *tdevice; ///< teletext device
- int tformat; ///< teletext display format
- int tpage; ///< start teletext page
- int tlang; ///< primary language code
+ struct tt_param teletext;
int scan;
int scan_threshold;
@@ -125,6 +125,7 @@ typedef struct tvi_handle_s {
const tvi_functions_t *functions;
void *priv;
int seq;
+ demuxer_t *demuxer;
/* specific */
int norm;
@@ -220,6 +221,7 @@ typedef struct {
//tvi_* ioctl (not dec_teletext.c !!!)
#define TVI_CONTROL_VBI_INIT 0x501 ///< vbi init
+#define TVI_CONTROL_GET_VBI_PTR 0x502 ///< get teletext private pointer
int tv_set_color_options(tvi_handle_t *tvh, int opt, int val);
int tv_get_color_options(tvi_handle_t *tvh, int opt, int* val);
diff --git a/stream/tvi_dshow.c b/stream/tvi_dshow.c
index 28bf0a141f..40951a698e 100644
--- a/stream/tvi_dshow.c
+++ b/stream/tvi_dshow.c
@@ -2552,7 +2552,7 @@ static HRESULT build_vbi_chain(priv_t *priv)
if(priv->chains[2]->rbuf)
return S_OK;
- if(priv->tv_param->tdevice)
+ if(priv->tv_param->teletext.device)
{
priv->chains[2]->rbuf=calloc(1,sizeof(grabber_ringbuffer_t));
if(!priv->chains[2]->rbuf)
@@ -3493,8 +3493,9 @@ static int control(priv_t * priv, int cmd, void *arg)
priv->priv_vbi=NULL;
return TVI_CONTROL_TRUE;
}
- default:
- return teletext_control(priv->priv_vbi,cmd,arg);
+ case TVI_CONTROL_GET_VBI_PTR:
+ *(void **)arg=priv->priv_vbi;
+ return TVI_CONTROL_TRUE;
#endif
}
return TVI_CONTROL_UNKNOWN;
diff --git a/stream/tvi_v4l.c b/stream/tvi_v4l.c
index a674722ec3..eb09610d34 100644
--- a/stream/tvi_v4l.c
+++ b/stream/tvi_v4l.c
@@ -1530,8 +1530,9 @@ static int control(priv_t *priv, int cmd, void *arg)
}
return TVI_CONTROL_TRUE;
}
- default:
- return teletext_control(priv->priv_vbi,cmd,arg);
+ case TVI_CONTROL_GET_VBI_PTR:
+ *(void **)arg=priv->priv_vbi;
+ return TVI_CONTROL_TRUE;
#endif
}
diff --git a/stream/tvi_v4l2.c b/stream/tvi_v4l2.c
index a47ea11400..fe2789e24d 100644
--- a/stream/tvi_v4l2.c
+++ b/stream/tvi_v4l2.c
@@ -1057,8 +1057,9 @@ static int control(priv_t *priv, int cmd, void *arg)
}
return TVI_CONTROL_TRUE;
}
- default:
- return teletext_control(priv->priv_vbi,cmd,arg);
+ case TVI_CONTROL_GET_VBI_PTR:
+ *(void **)arg=priv->priv_vbi;
+ return TVI_CONTROL_TRUE;
#endif
}
mp_msg(MSGT_TV, MSGL_V, "%s: unknown control: %d\n", info.short_name, cmd);