From 423c415534f7393c07247b87ab4d95f6d0635474 Mon Sep 17 00:00:00 2001 From: cehoyos Date: Sat, 7 Nov 2009 12:31:05 +0000 Subject: 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 --- cfg-common.h | 8 ++++---- command.c | 37 ++++++++++++++++++------------------- configure | 2 +- libmpcodecs/dec_teletext.c | 11 +++++------ libmpcodecs/dec_teletext.h | 11 +++++++++++ libmpdemux/demuxer.h | 3 +++ mpcommon.c | 17 ++++++++--------- stream/tv.c | 21 +++++++++++++++------ stream/tv.h | 10 ++++++---- stream/tvi_dshow.c | 7 ++++--- stream/tvi_v4l.c | 5 +++-- stream/tvi_v4l2.c | 5 +++-- 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 -#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); -- cgit v1.2.3