mirror of
https://github.com/mpv-player/mpv
synced 2025-03-31 07:51:55 +00:00
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
This commit is contained in:
parent
1698db0726
commit
423c415534
@ -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
|
||||
|
37
command.c
37
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) {
|
||||
|
2
configure
vendored
2
configure
vendored
@ -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
|
||||
|
@ -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){
|
||||
|
@ -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() )
|
||||
|
@ -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;
|
||||
|
||||
|
17
mpcommon.c
17
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
|
||||
}
|
||||
|
||||
|
21
stream/tv.c
21
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;
|
||||
}
|
||||
|
||||
|
10
stream/tv.h
10
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);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user