diff options
Diffstat (limited to 'stream')
-rw-r--r-- | stream/dvb_tune.c | 8 | ||||
-rw-r--r-- | stream/stream.c | 10 | ||||
-rw-r--r-- | stream/stream_dvb.c | 10 | ||||
-rw-r--r-- | stream/stream_dvd.c | 91 | ||||
-rw-r--r-- | stream/stream_dvd_common.c | 96 | ||||
-rw-r--r-- | stream/stream_dvd_common.h | 6 | ||||
-rw-r--r-- | stream/stream_dvdnav.c | 88 | ||||
-rw-r--r-- | stream/tv.c | 25 | ||||
-rw-r--r-- | stream/tv.h | 120 | ||||
-rw-r--r-- | stream/tvi_def.h | 2 | ||||
-rw-r--r-- | stream/tvi_dshow.c | 22 | ||||
-rw-r--r-- | stream/tvi_v4l.c | 19 | ||||
-rw-r--r-- | stream/tvi_v4l2.c | 20 | ||||
-rw-r--r-- | stream/tvi_vbi.c | 1850 |
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 |