summaryrefslogtreecommitdiffstats
path: root/stream
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2009-11-16 06:54:22 +0200
committerUoti Urpala <uau@glyph.nonexistent.invalid>2009-11-16 07:01:46 +0200
commit287b62163eed8811b6cd33716c0691d328947d48 (patch)
tree3143d2cb17b32a19e3e7e0aa428210d1bba3eb0b /stream
parent507f4fe6c7811558b1367e4b64855ae7f9bc8da8 (diff)
parentb411278fbb00767b8013604157a43e0203f66f4c (diff)
downloadmpv-287b62163eed8811b6cd33716c0691d328947d48.tar.bz2
mpv-287b62163eed8811b6cd33716c0691d328947d48.tar.xz
Merge svn changes up to r29912
Diffstat (limited to 'stream')
-rw-r--r--stream/dvb_tune.c8
-rw-r--r--stream/stream.c10
-rw-r--r--stream/stream_dvb.c10
-rw-r--r--stream/stream_dvd.c91
-rw-r--r--stream/stream_dvd_common.c96
-rw-r--r--stream/stream_dvd_common.h6
-rw-r--r--stream/stream_dvdnav.c88
-rw-r--r--stream/tv.c25
-rw-r--r--stream/tv.h120
-rw-r--r--stream/tvi_def.h2
-rw-r--r--stream/tvi_dshow.c22
-rw-r--r--stream/tvi_v4l.c19
-rw-r--r--stream/tvi_v4l2.c20
-rw-r--r--stream/tvi_vbi.c1850
14 files changed, 193 insertions, 2174 deletions
diff --git a/stream/dvb_tune.c b/stream/dvb_tune.c
index 8b7bdb7317..214fe871c2 100644
--- a/stream/dvb_tune.c
+++ b/stream/dvb_tune.c
@@ -230,7 +230,7 @@ int dvb_demux_stop(int fd)
mp_msg(MSGT_DEMUX, MSGL_DBG2, "STOPPING FD: %d, RESULT: %d\n", fd, i);
- return (i==0);
+ return i == 0;
}
@@ -241,7 +241,7 @@ int dvb_demux_start(int fd)
mp_msg(MSGT_DEMUX, MSGL_DBG2, "STARTING FD: %d, RESULT: %d\n", fd, i);
- return (i==0);
+ return i == 0;
}
@@ -265,7 +265,7 @@ int dvb_tune(dvb_priv_t *priv, int freq, char pol, int srate, int diseqc, int to
if(ris != 0)
mp_msg(MSGT_DEMUX, MSGL_INFO, "dvb_tune, TUNING FAILED\n");
- return (ris == 0);
+ return ris == 0;
}
@@ -740,5 +740,5 @@ static int tune_it(int fd_frontend, int fd_sec, unsigned int freq, unsigned int
return -1;
}
- return(check_status(fd_frontend, timeout));
+ return check_status(fd_frontend, timeout);
}
diff --git a/stream/stream.c b/stream/stream.c
index 8b8a84760a..8570f0b125 100644
--- a/stream/stream.c
+++ b/stream/stream.c
@@ -245,13 +245,11 @@ int stream_fill_buffer(stream_t *s){
case STREAMTYPE_STREAM:
#ifdef CONFIG_NETWORK
if( s->streaming_ctrl!=NULL && s->streaming_ctrl->streaming_read ) {
- len=s->streaming_ctrl->streaming_read(s->fd,s->buffer,STREAM_BUFFER_SIZE, s->streaming_ctrl);break;
- } else {
- len=read(s->fd,s->buffer,STREAM_BUFFER_SIZE);break;
- }
-#else
- len=read(s->fd,s->buffer,STREAM_BUFFER_SIZE);break;
+ len=s->streaming_ctrl->streaming_read(s->fd,s->buffer,STREAM_BUFFER_SIZE, s->streaming_ctrl);
+ } else
#endif
+ len=read(s->fd,s->buffer,STREAM_BUFFER_SIZE);
+ break;
case STREAMTYPE_DS:
len = demux_read_data((demux_stream_t*)s->priv,s->buffer,STREAM_BUFFER_SIZE);
break;
diff --git a/stream/stream_dvb.c b/stream/stream_dvb.c
index 1e157f162c..7d184b02b2 100644
--- a/stream/stream_dvb.c
+++ b/stream/stream_dvb.c
@@ -323,8 +323,9 @@ static dvb_channels_list *dvb_get_channels(char *filename, int type)
ptr->mod = VSB_8;
else if(! strcmp(mod, "VSB_16") || !strcmp(mod, "16VSB"))
ptr->mod = VSB_16;
+ else if(! strcmp(mod, "QAM_AUTO"))
+ ptr->mod = QAM_AUTO;
- ptr->inv = INVERSION_AUTO;
#endif
}
@@ -342,7 +343,8 @@ static dvb_channels_list *dvb_get_channels(char *filename, int type)
ptr->trans = TRANSMISSION_MODE_2K;
else if(! strcmp(transm, "TRANSMISSION_MODE_8K"))
ptr->trans = TRANSMISSION_MODE_8K;
-
+ else if(! strcmp(transm, "TRANSMISSION_MODE_AUTO"))
+ ptr->trans = TRANSMISSION_MODE_AUTO;
if(! strcmp(gi, "GUARD_INTERVAL_1_32"))
ptr->gi = GUARD_INTERVAL_1_32;
@@ -350,7 +352,9 @@ static dvb_channels_list *dvb_get_channels(char *filename, int type)
ptr->gi = GUARD_INTERVAL_1_16;
else if(! strcmp(gi, "GUARD_INTERVAL_1_8"))
ptr->gi = GUARD_INTERVAL_1_8;
- else ptr->gi = GUARD_INTERVAL_1_4;
+ else if(! strcmp(gi, "GUARD_INTERVAL_1_4"))
+ ptr->gi = GUARD_INTERVAL_1_4;
+ else ptr->gi = GUARD_INTERVAL_AUTO;
if(! strcmp(tmp_lcr, "FEC_1_2"))
ptr->cr_lp =FEC_1_2;
diff --git a/stream/stream_dvd.c b/stream/stream_dvd.c
index 8dc73b96b3..36a8b07d05 100644
--- a/stream/stream_dvd.c
+++ b/stream/stream_dvd.c
@@ -5,25 +5,12 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <fcntl.h>
#include <string.h>
#include "config.h"
#include "mp_msg.h"
#include "help_mp.h"
-#ifdef __FreeBSD__
-#include <sys/cdrio.h>
-#endif
-
-#ifdef __linux__
-#include <linux/cdrom.h>
-#include <scsi/sg.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#endif
-
#include <libgen.h>
#include <errno.h>
@@ -39,84 +26,9 @@
#include "stream_dvd.h"
#include "stream_dvd_common.h"
#include "libmpdemux/demuxer.h"
-#include "ffmpeg_files/intreadwrite.h"
-extern char* dvd_device;
static char* dvd_device_current;
int dvd_angle=1;
-int dvd_speed=0; /* 0 => don't touch speed */
-
-static void dvd_set_speed(char *device, unsigned speed)
-{
-#if defined(__linux__) && defined(SG_IO) && defined(GPCMD_SET_STREAMING)
- int fd;
- unsigned char buffer[28];
- unsigned char cmd[12];
- struct sg_io_hdr sghdr;
- struct stat st;
-
- memset(&st, 0, sizeof(st));
-
- if (stat(device, &st) == -1) return;
-
- if (!S_ISBLK(st.st_mode)) return; /* not a block device */
-
- switch (speed) {
- case 0: /* don't touch speed setting */
- return;
- case -1: /* restore default value */
- if (dvd_speed == 0) return; /* we haven't touched the speed setting */
- mp_tmsg(MSGT_OPEN, MSGL_INFO, "Restoring DVD speed... ");
- break;
- default: /* limit to <speed> KB/s */
- // speed < 100 is multiple of DVD single speed (1350KB/s)
- if (speed < 100)
- speed *= 1350;
- mp_tmsg(MSGT_OPEN, MSGL_INFO, "Limiting DVD speed to %dKB/s... ", speed);
- break;
- }
-
- memset(&sghdr, 0, sizeof(sghdr));
- sghdr.interface_id = 'S';
- sghdr.timeout = 5000;
- sghdr.dxfer_direction = SG_DXFER_TO_DEV;
- sghdr.dxfer_len = sizeof(buffer);
- sghdr.dxferp = buffer;
- sghdr.cmd_len = sizeof(cmd);
- sghdr.cmdp = cmd;
-
- memset(cmd, 0, sizeof(cmd));
- cmd[0] = GPCMD_SET_STREAMING;
- cmd[10] = sizeof(buffer);
-
- memset(buffer, 0, sizeof(buffer));
- /* first sector 0, last sector 0xffffffff */
- AV_WB32(buffer + 8, 0xffffffff);
- if (speed == -1)
- buffer[0] = 4; /* restore default */
- else {
- /* <speed> kilobyte */
- AV_WB32(buffer + 12, speed);
- AV_WB32(buffer + 20, speed);
- }
- /* 1 second */
- AV_WB16(buffer + 18, 1000);
- AV_WB16(buffer + 26, 1000);
-
- fd = open(device, O_RDWR | O_NONBLOCK);
- if (fd == -1) {
- mp_tmsg(MSGT_OPEN, MSGL_INFO, "Couldn't open DVD device for writing, changing DVD speed needs write access.\n");
- return;
- }
-
- if (ioctl(fd, SG_IO, &sghdr) < 0)
- mp_tmsg(MSGT_OPEN, MSGL_INFO, "failed\n");
- else
- mp_tmsg(MSGT_OPEN, MSGL_INFO, "successful\n");
-
- close(fd);
-#endif
-}
#define LIBDVDREAD_VERSION(maj,min,micro) ((maj)*10000 + (min)*100 + (micro))
/*
@@ -133,9 +45,6 @@ static void dvd_set_speed(char *device, unsigned speed)
#endif
#endif
-const char * const dvd_audio_stream_types[8] = { "ac3","unknown","mpeg1","mpeg2ext","lpcm","unknown","dts" };
-const char * const dvd_audio_stream_channels[6] = { "mono", "stereo", "unknown", "unknown", "5.1/6.1", "5.1" };
-
static struct stream_priv_s {
int title;
diff --git a/stream/stream_dvd_common.c b/stream/stream_dvd_common.c
index 9302b5670b..d5c4cc14a6 100644
--- a/stream/stream_dvd_common.c
+++ b/stream/stream_dvd_common.c
@@ -1,7 +1,103 @@
#include "config.h"
+#include <fcntl.h>
#include <inttypes.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
#include <dvdread/ifo_types.h>
+#ifdef __FreeBSD__
+#include <sys/cdrio.h>
+#endif
+
+#ifdef __linux__
+#include <linux/cdrom.h>
+#include <scsi/sg.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#endif
+
+#include "mp_msg.h"
+#include "help_mp.h"
#include "stream_dvd_common.h"
+#include "ffmpeg_files/intreadwrite.h"
+
+const char * const dvd_audio_stream_types[8] = { "ac3","unknown","mpeg1","mpeg2ext","lpcm","unknown","dts" };
+const char * const dvd_audio_stream_channels[6] = { "mono", "stereo", "unknown", "unknown", "5.1/6.1", "5.1" };
+
+int dvd_speed=0; /* 0 => don't touch speed */
+
+void dvd_set_speed(char *device, unsigned speed)
+{
+#if defined(__linux__) && defined(SG_IO) && defined(GPCMD_SET_STREAMING)
+ int fd;
+ unsigned char buffer[28];
+ unsigned char cmd[12];
+ struct sg_io_hdr sghdr;
+ struct stat st;
+
+ memset(&st, 0, sizeof(st));
+
+ if (stat(device, &st) == -1) return;
+
+ if (!S_ISBLK(st.st_mode)) return; /* not a block device */
+
+ switch (speed) {
+ case 0: /* don't touch speed setting */
+ return;
+ case -1: /* restore default value */
+ if (dvd_speed == 0) return; /* we haven't touched the speed setting */
+ mp_tmsg(MSGT_OPEN, MSGL_INFO, "Restoring DVD speed... ");
+ break;
+ default: /* limit to <speed> KB/s */
+ // speed < 100 is multiple of DVD single speed (1350KB/s)
+ if (speed < 100)
+ speed *= 1350;
+ mp_tmsg(MSGT_OPEN, MSGL_INFO, "Limiting DVD speed to %dKB/s... ", speed);
+ break;
+ }
+
+ memset(&sghdr, 0, sizeof(sghdr));
+ sghdr.interface_id = 'S';
+ sghdr.timeout = 5000;
+ sghdr.dxfer_direction = SG_DXFER_TO_DEV;
+ sghdr.dxfer_len = sizeof(buffer);
+ sghdr.dxferp = buffer;
+ sghdr.cmd_len = sizeof(cmd);
+ sghdr.cmdp = cmd;
+
+ memset(cmd, 0, sizeof(cmd));
+ cmd[0] = GPCMD_SET_STREAMING;
+ cmd[10] = sizeof(buffer);
+
+ memset(buffer, 0, sizeof(buffer));
+ /* first sector 0, last sector 0xffffffff */
+ AV_WB32(buffer + 8, 0xffffffff);
+ if (speed == -1)
+ buffer[0] = 4; /* restore default */
+ else {
+ /* <speed> kilobyte */
+ AV_WB32(buffer + 12, speed);
+ AV_WB32(buffer + 20, speed);
+ }
+ /* 1 second */
+ AV_WB16(buffer + 18, 1000);
+ AV_WB16(buffer + 26, 1000);
+
+ fd = open(device, O_RDWR | O_NONBLOCK);
+ if (fd == -1) {
+ mp_tmsg(MSGT_OPEN, MSGL_INFO, "Couldn't open DVD device for writing, changing DVD speed needs write access.\n");
+ return;
+ }
+
+ if (ioctl(fd, SG_IO, &sghdr) < 0)
+ mp_tmsg(MSGT_OPEN, MSGL_INFO, "failed\n");
+ else
+ mp_tmsg(MSGT_OPEN, MSGL_INFO, "successful\n");
+
+ close(fd);
+#endif
+}
/**
\brief Converts DVD time structure to milliseconds.
diff --git a/stream/stream_dvd_common.h b/stream/stream_dvd_common.h
index 906ae02ba6..b5e86c1162 100644
--- a/stream/stream_dvd_common.h
+++ b/stream/stream_dvd_common.h
@@ -5,6 +5,12 @@
#include <inttypes.h>
#include <dvdread/ifo_types.h>
+extern char *dvd_device;
+extern const char * const dvd_audio_stream_channels[6];
+extern const char * const dvd_audio_stream_types[8];
+
+extern int dvd_speed;
+void dvd_set_speed(char *device, unsigned speed);
int mp_dvdtimetomsec(dvd_time_t *dt);
#endif /* MPLAYER_STREAM_DVD_COMMON_H */
diff --git a/stream/stream_dvdnav.c b/stream/stream_dvdnav.c
index 1700463787..3f419dfb65 100644
--- a/stream/stream_dvdnav.c
+++ b/stream/stream_dvdnav.c
@@ -47,10 +47,6 @@ typedef struct {
unsigned int state;
} dvdnav_priv_t;
-extern char *dvd_device;
-extern char *audio_lang, *dvdsub_lang;
-extern char *dvd_audio_stream_channels[6], *dvd_audio_stream_types[8];
-
static struct stream_priv_s {
int track;
char* device;
@@ -91,6 +87,8 @@ static dvdnav_priv_t * new_dvdnav_stream(char * filename) {
return NULL;
}
+ dvd_set_speed(priv->filename, dvd_speed);
+
if(dvdnav_open(&(priv->dvdnav),priv->filename)!=DVDNAV_STATUS_OK)
{
free(priv->filename);
@@ -295,6 +293,7 @@ static void stream_dvdnav_close(stream_t *s) {
dvdnav_priv_t *priv = s->priv;
dvdnav_close(priv->dvdnav);
priv->dvdnav = NULL;
+ dvd_set_speed(priv->filename, -1);
free(priv);
}
@@ -350,8 +349,10 @@ static int fill_buffer(stream_t *s, char *but, int len)
if(dvdnav_current_title_info(priv->dvdnav, &tit, &part) == DVDNAV_STATUS_OK) {
mp_msg(MSGT_CPLAYER,MSGL_V, "\r\nDVDNAV, NEW TITLE %d\r\n", tit);
dvdnav_get_highlight (priv, 0);
- if(priv->title > 0 && tit != priv->title)
+ if(priv->title > 0 && tit != priv->title) {
+ priv->state |= NAV_FLAG_EOF;
return 0;
+ }
}
break;
}
@@ -365,8 +366,10 @@ static int fill_buffer(stream_t *s, char *but, int len)
priv->state |= NAV_FLAG_WAIT_READ;
if(priv->title > 0 && dvd_last_chapter > 0) {
int tit=0, part=0;
- if(dvdnav_current_title_info(priv->dvdnav, &tit, &part) == DVDNAV_STATUS_OK && part > dvd_last_chapter)
+ if(dvdnav_current_title_info(priv->dvdnav, &tit, &part) == DVDNAV_STATUS_OK && part > dvd_last_chapter) {
+ priv->state |= NAV_FLAG_EOF;
return 0;
+ }
}
dvdnav_get_highlight (priv, 1);
}
@@ -517,9 +520,9 @@ static void show_audio_subs_languages(dvdnav_t *nav)
uint8_t lg;
uint16_t i, lang, format, id, channels;
int base[7] = {128, 0, 0, 0, 160, 136, 0};
- char tmp[3];
for(i=0; i<8; i++)
{
+ char tmp[] = "unknown";
lg = dvdnav_get_audio_logical_stream(nav, i);
if(lg == 0xff) continue;
channels = dvdnav_audio_stream_channels(nav, lg);
@@ -528,41 +531,37 @@ static void show_audio_subs_languages(dvdnav_t *nav)
else
channels--;
lang = dvdnav_audio_stream_to_lang(nav, lg);
- if(lang == 0xFFFF)
- tmp[0] = tmp[1] = '?';
- else
+ if(lang != 0xFFFF)
{
tmp[0] = lang >> 8;
tmp[1] = lang & 0xFF;
+ tmp[2] = 0;
}
- tmp[2] = 0;
format = dvdnav_audio_stream_format(nav, lg);
if(format == 0xFFFF || format > 6)
format = 1; //unknown
id = i + base[format];
- if (lang != 0xFFFF) {
- mp_tmsg(MSGT_OPEN,MSGL_STATUS,"audio stream: %d format: %s (%s) language: %s aid: %d.\n", i,
- dvd_audio_stream_types[format], dvd_audio_stream_channels[channels], tmp, id);
- if(lang && tmp[0])
+ mp_tmsg(MSGT_OPEN,MSGL_STATUS,"audio stream: %d format: %s (%s) language: %s aid: %d.\n", i,
+ dvd_audio_stream_types[format], dvd_audio_stream_channels[channels], tmp, id);
+ if (lang != 0xFFFF && lang && tmp[0])
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_LANG=%s\n", id, tmp);
- }
}
for(i=0; i<32; i++)
{
+ char tmp[] = "unknown";
lg = dvdnav_get_spu_logical_stream(nav, i);
if(lg == 0xff) continue;
- lang = dvdnav_spu_stream_to_lang(nav, lg);
- if(lang == 0xFFFF)
- tmp[0] = tmp[1] = '?';
- else
+ lang = dvdnav_spu_stream_to_lang(nav, i);
+ if(lang != 0xFFFF)
{
tmp[0] = lang >> 8;
tmp[1] = lang & 0xFF;
+ tmp[2] = 0;
}
- tmp[2] = 0;
- if (lang != 0xFFFF)
- mp_tmsg(MSGT_OPEN,MSGL_STATUS,"subtitle ( sid ): %d language: %s\n", i+0x20, tmp);
+ mp_msg(MSGT_OPEN,MSGL_STATUS,"subtitle ( sid ): %d language: %s\n", lg, tmp);
+ if (lang != 0xFFFF && lang && tmp[0])
+ mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", lg, tmp);
}
}
@@ -698,11 +697,11 @@ static int mp_dvdnav_get_aid_from_format (stream_t *stream, int index, uint8_t l
format = dvdnav_audio_stream_format(priv->dvdnav, lg);
switch(format) {
case DVDNAV_FORMAT_AC3:
- return (index + 128);
+ return index + 128;
case DVDNAV_FORMAT_DTS:
- return (index + 136);
+ return index + 136;
case DVDNAV_FORMAT_LPCM:
- return (index + 160);
+ return index + 160;
case DVDNAV_FORMAT_MPEGAUDIO:
return index;
default:
@@ -713,27 +712,6 @@ static int mp_dvdnav_get_aid_from_format (stream_t *stream, int index, uint8_t l
}
/**
- * \brief mp_dvdnav_aid_from_audio_num() returns the audio id corresponding to the logical number
- * \param stream: - stream pointer
- * \param audio_num: - logical number
- * \return -1 on error, current subtitle id if successful
- */
-int mp_dvdnav_aid_from_audio_num(stream_t *stream, int audio_num) {
- dvdnav_priv_t * priv = stream->priv;
- int k;
- uint8_t lg;
-
- for(k=0; k<32; k++) {
- lg = dvdnav_get_audio_logical_stream(priv->dvdnav, k);
- if (lg == 0xff) continue;
- if (lg != audio_num) continue;
-
- return mp_dvdnav_get_aid_from_format (stream, k, lg);
- }
- return -1;
-}
-
-/**
* \brief mp_dvdnav_aid_from_lang() returns the audio id corresponding to the language code 'lang'
* \param stream: - stream pointer
* \param lang: 2-characters language code[s], eventually separated by spaces of commas
@@ -801,9 +779,9 @@ int mp_dvdnav_sid_from_lang(stream_t *stream, unsigned char *language) {
for(k=0; k<32; k++) {
lg = dvdnav_get_spu_logical_stream(priv->dvdnav, k);
if(lg == 0xff) continue;
- lang = dvdnav_spu_stream_to_lang(priv->dvdnav, lg);
+ lang = dvdnav_spu_stream_to_lang(priv->dvdnav, k);
if(lang != 0xFFFF && lang == lcode) {
- return k;
+ return lg;
}
}
language += 2;
@@ -820,12 +798,16 @@ int mp_dvdnav_sid_from_lang(stream_t *stream, unsigned char *language) {
* \return 0 on error, 1 if successful
*/
int mp_dvdnav_lang_from_sid(stream_t *stream, int sid, unsigned char *buf) {
- uint8_t lg;
+ uint8_t k;
uint16_t lang;
dvdnav_priv_t *priv = stream->priv;
if(sid < 0) return 0;
- lg = dvdnav_get_spu_logical_stream(priv->dvdnav, sid);
- lang = dvdnav_spu_stream_to_lang(priv->dvdnav, lg);
+ for (k=0; k<32; k++)
+ if (dvdnav_get_spu_logical_stream(priv->dvdnav, k) == sid)
+ break;
+ if (k == 32)
+ return 0;
+ lang = dvdnav_spu_stream_to_lang(priv->dvdnav, k);
if(lang == 0xffff) return 0;
buf[0] = lang >> 8;
buf[1] = lang & 0xFF;
@@ -846,7 +828,7 @@ int mp_dvdnav_number_of_subs(stream_t *stream) {
for(k=0; k<32; k++) {
lg = dvdnav_get_spu_logical_stream(priv->dvdnav, k);
if(lg == 0xff) continue;
- n++;
+ if(lg >= n) n = lg + 1;
}
return n;
}
diff --git a/stream/tv.c b/stream/tv.c
index 324e059c5d..85a79267b6 100644
--- a/stream/tv.c
+++ b/stream/tv.c
@@ -29,6 +29,7 @@
#include "libaf/af_format.h"
#include "libmpcodecs/img_format.h"
+#include "libmpcodecs/dec_teletext.h"
#include "libavutil/avstring.h"
#include "osdep/timer.h"
@@ -333,7 +334,8 @@ int tv_set_norm(tvi_handle_t *tvh, char* norm)
mp_tmsg(MSGT_TV, MSGL_ERR, "Error: Cannot set norm!\n");
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;
}
@@ -347,8 +349,9 @@ static 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);
- return(1);
+ teletext_control(tvh->demuxer->teletext,TV_VBI_CONTROL_RESET,
+ &tvh->tv_param->teletext);
+ return 1;
}
static int open_tv(tvi_handle_t *tvh)
@@ -675,7 +678,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);
@@ -818,7 +825,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;
}
@@ -830,6 +838,7 @@ static void demux_close_tv(demuxer_t *demuxer)
tv_uninit(tvh);
free(tvh);
demuxer->priv=NULL;
+ demuxer->teletext=NULL;
}
/* utilities for mplayer (not mencoder!!) */
@@ -899,7 +908,8 @@ int tv_set_freq(tvi_handle_t *tvh, unsigned long freq)
mp_tmsg(MSGT_TV, MSGL_V, "Current frequency: %lu (%.3f)\n",
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;
}
@@ -1080,7 +1090,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 d177628e85..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;
@@ -218,42 +219,9 @@ typedef struct {
#define TVI_CONTROL_SPC_SET_INPUT 0x402 /* set input channel (tv,s-video,composite..) */
#define TVI_CONTROL_SPC_GET_NORMID 0x403 /* get normid from norm name */
-//tvi_* ioctl (not tvi_vbi.c !!!)
+//tvi_* ioctl (not dec_teletext.c !!!)
#define TVI_CONTROL_VBI_INIT 0x501 ///< vbi init
-
-/*
- TELETEXT controls (through teletext_control() )
- NOTE:
- _SET_ should be _GET_ +1
- _STEP_ should be _GET_ +2
-*/
-#define TV_VBI_CONTROL_GET_MODE 0x510 ///< get current mode teletext
-#define TV_VBI_CONTROL_SET_MODE 0x511 ///< on/off grab teletext
-
-#define TV_VBI_CONTROL_GET_PAGE 0x513 ///< get grabbed teletext page
-#define TV_VBI_CONTROL_SET_PAGE 0x514 ///< set grab teletext page number
-#define TV_VBI_CONTROL_STEP_PAGE 0x515 ///< step grab teletext page number
-
-#define TV_VBI_CONTROL_GET_SUBPAGE 0x516 ///< get grabbed teletext page
-#define TV_VBI_CONTROL_SET_SUBPAGE 0x517 ///< set grab teletext page number
-
-#define TV_VBI_CONTROL_GET_FORMAT 0x519 ///< get teletext format
-#define TV_VBI_CONTROL_SET_FORMAT 0x51a ///< set teletext format
-
-#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
-#define TV_VBI_CONTROL_RESET 0x553 ///< vbi reset
-#define TV_VBI_CONTROL_START 0x554 ///< vbi start
-#define TV_VBI_CONTROL_STOP 0x555 ///< vbi stop
-#define TV_VBI_CONTROL_DECODE_PAGE 0x556 ///< decode vbi page
-#define TV_VBI_CONTROL_GET_NETWORKNAME 0x557 ///< get current network name
+#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);
@@ -292,78 +260,4 @@ void tv_start_scan(tvi_handle_t *tvh, int start);
#define TV_NORM_PALN 6
#define TV_NORM_NTSCJP 7
-#define VBI_TFORMAT_TEXT 0 ///< text mode
-#define VBI_TFORMAT_BW 1 ///< black&white mode
-#define VBI_TFORMAT_GRAY 2 ///< grayscale mode
-#define VBI_TFORMAT_COLOR 3 ///< color mode (require color_spu patch!)
-
-#define VBI_MAX_PAGES 0x800 ///< max sub pages number
-#define VBI_MAX_SUBPAGES 64 ///< max sub pages number
-
-#define VBI_ROWS 25 ///< teletext page height in rows
-#define VBI_COLUMNS 40 ///< teletext page width in chars
-#define VBI_TIME_LINEPOS 26 ///< time line pos in page header
-
-typedef
-enum{
- TT_FORMAT_OPAQUE=0, ///< opaque
- TT_FORMAT_TRANSPARENT, ///< transparent
- TT_FORMAT_OPAQUE_INV, ///< opaque with inverted colors
- TT_FORMAT_TRANSPARENT_INV ///< transparent with inverted colors
-} teletext_format;
-
-typedef
-enum{
- TT_ZOOM_NORMAL=0,
- TT_ZOOM_TOP_HALF,
- TT_ZOOM_BOTTOM_HALF
-} teletext_zoom;
-
-typedef struct tt_char_s{
- unsigned int unicode; ///< unicode (utf8) character
- unsigned char fg; ///< foreground color
- unsigned char bg; ///< background color
- unsigned char gfx; ///< 0-no gfx, 1-solid gfx, 2-separated gfx
- unsigned char flh; ///< 0-no flash, 1-flash
- unsigned char hidden; ///< char is hidden (for subtitle pages)
- unsigned char ctl; ///< control character
- unsigned char lng; ///< lang: 0-secondary language,1-primary language
- unsigned char raw; ///< raw character (as received from device)
-} tt_char;
-
-typedef struct tt_link_s{
- int pagenum; ///< page number
- int subpagenum; ///< subpage number
-} tt_link_t;
-
-typedef struct tt_page_s{
- int pagenum; ///< page number
- int subpagenum; ///< subpage number
- unsigned char primary_lang; ///< primary language code
- unsigned char secondary_lang; ///< secondary language code
- unsigned char active; ///< page is complete and ready for rendering
- unsigned char flags; ///< page flags
- unsigned char raw[VBI_ROWS*VBI_COLUMNS]; ///< page data
- struct tt_page_s* next_subpage;
- struct tt_link_s links[6];
-} tt_page;
-
-#define TT_PGFL_SUPPRESS_HEADER 0x01
-#define TT_PGFL_UPDATE_INDICATOR 0x02
-#define TT_PGFL_INTERRUPTED_SEQ 0x04
-#define TT_PGFL_INHIBIT_DISPLAY 0x08
-#define TT_PGFL_NEWFLASH 0x10
-#define TT_PGFL_SUBTITLE 0x20
-#define TT_PGFL_ERASE_PAGE 0x40
-#define TT_PGFL_MAGAZINE_SERIAL 0x80
-
-typedef struct tt_stream_props_s{
- int sampling_rate;
- int samples_per_line;
- int offset;
- int count[2]; ///< number of lines in first and second fields
- int interlaced; ///< vbi data are interlaced
- int bufsize; ///< required buffer size
-} tt_stream_props;
-
#endif /* MPLAYER_TV_H */
diff --git a/stream/tvi_def.h b/stream/tvi_def.h
index 3c0ef8edb0..f15fcce481 100644
--- a/stream/tvi_def.h
+++ b/stream/tvi_def.h
@@ -15,8 +15,6 @@ static int get_video_framesize(priv_t *priv);
static double grab_audio_frame(priv_t *priv, char *buffer, int len);
static int get_audio_framesize(priv_t *priv);
-int teletext_control(void* p, int cmd, void *arg);
-
static const tvi_functions_t functions =
{
init,
diff --git a/stream/tvi_dshow.c b/stream/tvi_dshow.c
index b77f9cb20a..09c6328d8d 100644
--- a/stream/tvi_dshow.c
+++ b/stream/tvi_dshow.c
@@ -76,6 +76,7 @@
#include <stdio.h>
#include "libmpcodecs/img_format.h"
+#include "libmpcodecs/dec_teletext.h"
#include "libaf/af_format.h"
#include "help_mp.h"
#include "osdep/timer.h"
@@ -2263,7 +2264,6 @@ static int get_audio_framesize(priv_t * priv)
return priv->chains[1]->rbuf->blocksize;
}
-#ifdef CONFIG_TV_TELETEXT
static int vbi_get_props(priv_t* priv,tt_stream_props* ptsp)
{
if(!priv || !ptsp)
@@ -2309,7 +2309,6 @@ static void vbi_grabber(priv_t* priv)
}
free(buf);
}
-#endif /* CONFIG_TV_TELETEXT */
/**
* \brief fills given buffer with video data (usually one frame)
@@ -2354,9 +2353,7 @@ static double grab_video_frame(priv_t * priv, char *buffer, int len)
rb->count--;
LeaveCriticalSection(rb->pMutex);
-#ifdef CONFIG_TV_TELETEXT
vbi_grabber(priv);
-#endif
return pts;
}
@@ -2545,13 +2542,12 @@ static HRESULT build_audio_chain(priv_t *priv)
*/
static HRESULT build_vbi_chain(priv_t *priv)
{
-#ifdef CONFIG_TV_TELETEXT
HRESULT hr;
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)
@@ -2565,7 +2561,6 @@ static HRESULT build_vbi_chain(priv_t *priv)
return 0;
}
}
-#endif
return S_OK;
}
@@ -2901,10 +2896,8 @@ static int init(priv_t * priv)
OLE_QUERYINTERFACE(priv->pBuilder,IID_IBaseFilter,pBF);
OLE_CALL_ARGS(pBF,SetSyncSource,rc);
}
-#ifdef CONFIG_TV_TELETEXT
if(vbi_get_props(priv,&(priv->tsp))!=TVI_CONTROL_TRUE)
break;
-#endif
result = 1;
} while(0);
@@ -2974,9 +2967,7 @@ static int uninit(priv_t * priv)
if (priv->dwRegister) {
RemoveFromRot(priv->dwRegister);
}
-#ifdef CONFIG_TV_TELETEXT
teletext_control(priv->priv_vbi,TV_VBI_CONTROL_STOP,(void*)1);
-#endif
//stop audio grabber thread
if (priv->state && priv->pMediaControl) {
@@ -3481,20 +3472,19 @@ static int control(priv_t * priv, int cmd, void *arg)
case TVI_CONTROL_IMMEDIATE:
priv->immediate_mode = 1;
return TVI_CONTROL_TRUE;
-#ifdef CONFIG_TV_TELETEXT
case TVI_CONTROL_VBI_INIT:
{
void* ptr;
ptr=&(priv->tsp);
- if(teletext_control(NULL,TV_VBI_CONTROL_START,&ptr)==TVI_CONTROL_TRUE)
+ if(teletext_control(NULL,TV_VBI_CONTROL_START,&ptr)==VBI_CONTROL_TRUE)
priv->priv_vbi=ptr;
else
priv->priv_vbi=NULL;
return TVI_CONTROL_TRUE;
}
- default:
- return teletext_control(priv->priv_vbi,cmd,arg);
-#endif
+ case TVI_CONTROL_GET_VBI_PTR:
+ *(void **)arg=priv->priv_v