Mercurial > mplayer.hg
changeset 23573:21c28c2645fe
Revert r23530.
r23530 breaks policy: notification was not sent to mailing list,
agreements of other devs were not received.
Code also should be reviewed/cleaned up/fixed.
author | voroshil |
---|---|
date | Thu, 21 Jun 2007 08:18:51 +0000 |
parents | a00685941686 |
children | 9f2d63b24552 |
files | Changelog DOCS/man/en/mplayer.1 DOCS/tech/MAINTAINERS DOCS/tech/slave.txt cfg-common.h command.c configure input/input.c input/input.h libvo/sub.c libvo/sub.h mpcommon.c mplayer.c spudec.c spudec.h stream/Makefile stream/tv.c stream/tv.h stream/tvi_vbi.c stream/tvi_vbi.h |
diffstat | 20 files changed, 2 insertions(+), 1950 deletions(-) [+] |
line wrap: on
line diff
--- a/Changelog Wed Jun 20 18:19:03 2007 +0000 +++ b/Changelog Thu Jun 21 08:18:51 2007 +0000 @@ -51,7 +51,6 @@ * support H.264 over RTSP * "device" and "adevice" suboptions now works for *BSD BT848 tv driver too * dvdnav:// now depends on mplayer's fork of libdvdnav - * Teletext support for tv:// (v4l and v4l2 only) FFmpeg/libavcodec: * Intel Music coder audio decoder
--- a/DOCS/man/en/mplayer.1 Wed Jun 20 18:19:03 2007 +0000 +++ b/DOCS/man/en/mplayer.1 Thu Jun 21 08:18:51 2007 +0000 @@ -423,26 +423,6 @@ .PP .RS . -(The following keys are only valid if teletext support is enabled during -compilation: they are used for controlling TV teletext) -.RE -.PP -.PD 0 -.RS -.IPs "X" -Switch teletext between on, off and transparent mode. -.IPs "Q" -Next teletext page. -.IPs "W" -Previous teletext page. -.IPs "E" -In text mode flips top or bottom piece of page otherwise -zooms teletext page: top or bottom or normal. -.RE -.PD 1 -.PP -.RS -. .TP .B mouse control .PD 0 @@ -1882,12 +1862,6 @@ .IPs quality=<0\-100> Choose the quality of the JPEG compression (< 60 recommended for full size). -.IPs tdevice=<value> (default: none) -Specify TV teletext device (example: /dev/\:vbi0). -.IPs tformat=<text|bw|gray|color> (default: gray) -Specify TV teletext display mode. (Note: color mode requires color SPU support.) -.IPs tpage=<100-999> (default: 100) -Specify starting TV teletext page number . .RE . .TP
--- a/DOCS/tech/MAINTAINERS Wed Jun 20 18:19:03 2007 +0000 +++ b/DOCS/tech/MAINTAINERS Thu Jun 21 08:18:51 2007 +0000 @@ -77,7 +77,6 @@ * libmpdemux: Roberto Togni, Nico Sabbi * libmpcodecs: Roberto Togni * TV input/capture: Vladimir Voroshilov - * TV teletext: Vladimir Voroshilov * network streaming: Roberto Togni, Nico Sabbi, Benjamin Zores * DVD/VOB subtitles: None * config files & commandline parser: Alban Bedel
--- a/DOCS/tech/slave.txt Wed Jun 20 18:19:03 2007 +0000 +++ b/DOCS/tech/slave.txt Thu Jun 21 08:18:51 2007 +0000 @@ -314,19 +314,6 @@ Toggle vsync (1 == on, 0 == off). If [value] is not provided, vsync status is inverted. -teletext_add_dec <value> - On/off teletext page number editing mode and append given digit to - previously entered one - 0..9 - append apropriate digit (enables editing mode if called from normal mode, and - switches to normal mode when third digit is entered. - - - delete last digit from page number (backspace amulation, works only in page number - editing mode) - -teletext_go_link <value> - Follow given links on current teletext page - 0 - go to initial page (specified by -tv tpage= parameter) - 1..6 - follow given link - tv_step_channel <channel> Select next/previous TV channel. @@ -460,8 +447,4 @@ tv_contrast int -100 100 X X X tv_saturation int -100 100 X X X tv_hue int -100 100 X X X -teletext_page int 100 999 X X X -teletext_mode int 0 3 X X X 0 - off, 1 - opaque, 2 - transparent, - 3 - transparent inverted (bw format) -teletext_format int 0 3 X 0 - text, 1 - b/w, 2 - gray, 3 - color -teletext_half_page int 0 2 X X X 0 - off, 1 - top half, 2- bottom half +
--- a/cfg-common.h Wed Jun 20 18:19:03 2007 +0000 +++ b/cfg-common.h Thu Jun 21 08:18:51 2007 +0000 @@ -460,11 +460,6 @@ #endif {"adevice", &tv_param_adevice, CONF_TYPE_STRING, 0, 0, 0, NULL}, #endif -#ifdef HAVE_TV_TELETEXT - {"tdevice", &tv_param_tdevice, CONF_TYPE_STRING, 0, 0, 0, NULL}, - {"tformat", &tv_param_tformat, CONF_TYPE_STRING, 0, 0, 0, NULL}, - {"tpage", &tv_param_tpage, CONF_TYPE_INT, CONF_RANGE, 100, 999, NULL}, -#endif {"audioid", &tv_param_audio_id, CONF_TYPE_INT, CONF_RANGE, 0, 9, NULL}, {NULL, NULL, 0, 0, 0, 0, NULL} };
--- a/command.c Wed Jun 20 18:19:03 2007 +0000 +++ b/command.c Thu Jun 21 08:18:51 2007 +0000 @@ -1459,134 +1459,6 @@ #endif -#ifdef HAVE_TV_TELETEXT -/// teletext page (RW) -static int mp_property_teletext_page(m_option_t * prop, int action, void *arg, - MPContext * mpctx) -{ - int val,result; - tvi_handle_t *tvh = mpctx->demuxer->priv; - if (mpctx->demuxer->type != DEMUXER_TYPE_TV || !tvh || !tvh->priv_vbi) - return M_PROPERTY_UNAVAILABLE; - - switch (action) { - case M_PROPERTY_SET: - if (!arg) - return M_PROPERTY_ERROR; - M_PROPERTY_CLAMP(prop, *(int *) arg); - result=tv_teletext_control(tvh, TVI_CONTROL_VBI_SET_PAGE, arg); - break; - case M_PROPERTY_GET: - if (!arg) - return M_PROPERTY_ERROR; - result=tv_teletext_control(tvh, TVI_CONTROL_VBI_GET_PAGE, arg); - break; - case M_PROPERTY_STEP_UP: - case M_PROPERTY_STEP_DOWN: - val = (arg ? *(int *) arg : 1) * (action == M_PROPERTY_STEP_DOWN ? -1 : 1); - result=tv_teletext_control(tvh, TVI_CONTROL_VBI_STEP_PAGE, &val); - break; - default: - return M_PROPERTY_NOT_IMPLEMENTED; - } - return (result==TVI_CONTROL_TRUE?M_PROPERTY_OK:M_PROPERTY_ERROR); -} -/// VBI teletext mode (RW) -static int mp_property_teletext_mode(m_option_t * prop, int action, void *arg, - MPContext * mpctx) -{ - int val,result; - tvi_handle_t *tvh = mpctx->demuxer->priv; - if (mpctx->demuxer->type != DEMUXER_TYPE_TV || !tvh || !tvh->priv_vbi) - return M_PROPERTY_UNAVAILABLE; - - switch (action) { - case M_PROPERTY_SET: - if (!arg) - return M_PROPERTY_ERROR; - M_PROPERTY_CLAMP(prop, *(int *) arg); - result=tv_teletext_control(tvh, TVI_CONTROL_VBI_SET_MODE, arg); - break; - case M_PROPERTY_GET: - if (!arg) - return M_PROPERTY_ERROR; - result=tv_teletext_control(tvh, TVI_CONTROL_VBI_GET_MODE, arg); - break; - case M_PROPERTY_STEP_UP: - case M_PROPERTY_STEP_DOWN: - val = (arg ? *(int *) arg : 1) * (action == M_PROPERTY_STEP_DOWN ? -1 : 1); - result=tv_teletext_control(tvh, TVI_CONTROL_VBI_STEP_MODE, &val); - break; - default: - return M_PROPERTY_NOT_IMPLEMENTED; - } - return (result==TVI_CONTROL_TRUE?M_PROPERTY_OK:M_PROPERTY_ERROR); -} -/// VBI teletext format (R) -static int mp_property_teletext_format(m_option_t * prop, int action, void *arg, - MPContext * mpctx) -{ - int val,result; - tvi_handle_t *tvh = mpctx->demuxer->priv; - if (mpctx->demuxer->type != DEMUXER_TYPE_TV || !tvh || !tvh->priv_vbi) - return M_PROPERTY_UNAVAILABLE; - - switch (action) { - case M_PROPERTY_GET: - if (!arg) - return M_PROPERTY_ERROR; - result=tv_teletext_control(tvh, TVI_CONTROL_VBI_GET_FORMAT, arg); - break; - case M_PROPERTY_SET: - if (!arg) - return M_PROPERTY_ERROR; - M_PROPERTY_CLAMP(prop, *(int *) arg); - result=tv_teletext_control(tvh, TVI_CONTROL_VBI_SET_FORMAT, arg); - break; - case M_PROPERTY_STEP_UP: - case M_PROPERTY_STEP_DOWN: - val = (arg ? *(int *) arg : 1) * (action == M_PROPERTY_STEP_DOWN ? -1 : 1); - result=tv_teletext_control(tvh, TVI_CONTROL_VBI_STEP_FORMAT, &val); - break; - default: - return M_PROPERTY_NOT_IMPLEMENTED; - } - return (result==TVI_CONTROL_TRUE?M_PROPERTY_OK:M_PROPERTY_ERROR); -} - -/// VBI teletext half-page mode (RW) -static int mp_property_teletext_half_page(m_option_t * prop, int action, void *arg, - MPContext * mpctx) -{ - int val,result; - tvi_handle_t *tvh = mpctx->demuxer->priv; - if (mpctx->demuxer->type != DEMUXER_TYPE_TV || !tvh || !tvh->priv_vbi) - return M_PROPERTY_UNAVAILABLE; - - switch (action) { - case M_PROPERTY_GET: - if (!arg) - return M_PROPERTY_ERROR; - result=tv_teletext_control(tvh, TVI_CONTROL_VBI_GET_HALF_PAGE, arg); - break; - case M_PROPERTY_SET: - if (!arg) - return M_PROPERTY_ERROR; - M_PROPERTY_CLAMP(prop, *(int *) arg); - result=tv_teletext_control(tvh, TVI_CONTROL_VBI_SET_HALF_PAGE, arg); - break; - case M_PROPERTY_STEP_UP: - case M_PROPERTY_STEP_DOWN: - val = (arg ? *(int *) arg : 1) * (action == M_PROPERTY_STEP_DOWN ? -1 : 1); - result=tv_teletext_control(tvh, TVI_CONTROL_VBI_STEP_HALF_PAGE, &val); - break; - default: - return M_PROPERTY_NOT_IMPLEMENTED; - } - return (result==TVI_CONTROL_TRUE?M_PROPERTY_OK:M_PROPERTY_ERROR); -} -#endif /* HAVE_TV_TELETEXT */ - ///@} /// All properties available in MPlayer. @@ -1714,17 +1586,6 @@ M_OPT_RANGE, -100, 100, (void *) TV_COLOR_HUE }, #endif -#ifdef HAVE_TV_TELETEXT - { "teletext_page", mp_property_teletext_page, CONF_TYPE_INT, - M_OPT_RANGE, -999, 999, NULL }, - { "teletext_mode", mp_property_teletext_mode, CONF_TYPE_INT, - M_OPT_RANGE, 0, 3, NULL }, - { "teletext_format", mp_property_teletext_format, CONF_TYPE_INT, - M_OPT_RANGE, 0, 3, NULL }, - { "teletext_half_page", mp_property_teletext_half_page, CONF_TYPE_INT, - M_OPT_RANGE, 0, 2, NULL }, -#endif - { NULL, NULL, NULL, 0, 0, 0, NULL } }; @@ -2419,16 +2280,6 @@ if (mpctx->file_format == DEMUXER_TYPE_TV) tv_step_chanlist((tvi_handle_t *) (mpctx->demuxer->priv)); break; -#ifdef HAVE_TV_TELETEXT - case MP_CMD_TV_TELETEXT_ADD_DEC: - if (mpctx->file_format == DEMUXER_TYPE_TV) - tv_teletext_add_dec((tvi_handle_t *) (mpctx->demuxer->priv),cmd->args[0].v.s); - break; - case MP_CMD_TV_TELETEXT_GO_LINK: - if (mpctx->file_format == DEMUXER_TYPE_TV) - tv_teletext_go_link((tvi_handle_t *) (mpctx->demuxer->priv),cmd->args[0].v.i); - break; -#endif /* HAVE_TV_TELETEXT */ #endif /* USE_TV */ case MP_CMD_SUB_LOAD:
--- a/configure Wed Jun 20 18:19:03 2007 +0000 +++ b/configure Thu Jun 21 08:18:51 2007 +0000 @@ -240,7 +240,6 @@ --disable-tv-v4l1 disable Video4Linux TV interface [autodetect] --disable-tv-v4l2 disable Video4Linux2 TV interface [autodetect] --disable-tv-bsdbt848 disable BSD BT848 interface [autodetect] - --disable-tv-teletex disable TV teletext interface [autodetect] --disable-pvr disable Video4Linux2 MPEG PVR [autodetect] --disable-rtc disable RTC (/dev/rtc) on Linux [autodetect] --disable-network disable networking [enable] @@ -589,7 +588,6 @@ _tv_v4l1=auto _tv_v4l2=auto _tv_bsdbt848=auto -_tv_teletext=auto _pvr=auto _network=yes _winsock2=auto @@ -937,8 +935,6 @@ --disable-tv-v4l1) _tv_v4l1=no ;; --enable-tv-v4l2) _tv_v4l2=yes ;; --disable-tv-v4l2) _tv_v4l2=no ;; - --enable-tv-teletext) _tv_teletext=yes ;; - --disable-tv-teletext) _tv_teletext=no ;; --enable-radio) _radio=yes ;; --enable-radio-capture) _radio_capture=yes ;; --disable-radio-capture) _radio_capture=no ;; @@ -6674,28 +6670,6 @@ fi echores "$_tv_v4l2" -echocheck "TV teletext interface" -if test "$_tv_teletext" = auto ; then - _tv_teletext=no - if test linux ; then - cat > $TMPC <<EOF -#include <stdlib.h> -#include <libzvbi.h> -int main(void) { return 0; } -EOF - cc_check && _tv_teletext=yes - fi -fi -if test "$_tv_teletext" = yes ; then - _def_tv_teletext='#define HAVE_TV_TELETEXT 1' - _ld_extra="$_ld_extra -lzvbi" - _inputmodules="tv-teletext $_inputmodules" -else - _noinputmodules="tv-teletext $_noinputmodules" - _def_tv_teletext='#undef HAVE_TV_TELETEXT' -fi -echores "$_tv_teletext" - echocheck "Radio interface" if test "$_radio" = yes ; then @@ -7560,7 +7534,6 @@ TV_V4L1 = $_tv_v4l1 TV_V4L2 = $_tv_v4l2 TV_BSDBT848 = $_tv_bsdbt848 -TV_TELETEXT = $_tv_teletext AUDIO_INPUT = $_audio_input PVR = $_pvr VCD = $_vcd @@ -8126,9 +8099,6 @@ /* Enable *BSD BrookTree TV interface support */ $_def_tv_bsdbt848 -/* Enable TV Teletext Interface support */ -$_def_tv_teletext - /* Enable Radio Interface support */ $_def_radio
--- a/input/input.c Wed Jun 20 18:19:03 2007 +0000 +++ b/input/input.c Thu Jun 21 08:18:51 2007 +0000 @@ -137,10 +137,6 @@ { MP_CMD_LOADLIST, "loadlist", 1, { {MP_CMD_ARG_STRING, {0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, { MP_CMD_RUN, "run", 1, { {MP_CMD_ARG_STRING,{0}}, {-1,{0}} } }, { MP_CMD_VF_CHANGE_RECTANGLE, "change_rectangle", 2, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}}}}, -#ifdef HAVE_TV_TELETEXT - { MP_CMD_TV_TELETEXT_ADD_DEC, "teletext_add_dec", 1, { {MP_CMD_ARG_STRING,{0}}, {-1,{0}} } }, - { MP_CMD_TV_TELETEXT_GO_LINK, "teletext_go_link",1, { { MP_CMD_ARG_INT ,{0}}, { MP_CMD_ARG_INT ,{0}}, {-1,{0}} } }, -#endif #ifdef HAVE_NEW_GUI { MP_CMD_GUI_LOADFILE, "gui_loadfile", 0, { {-1,{0}} } }, @@ -393,12 +389,6 @@ { { 'n', 0 }, "tv_step_norm" }, { { 'u', 0 }, "tv_step_chanlist" }, #endif -#ifdef HAVE_TV_TELETEXT - { { 'X', 0 }, "step_property teletext_mode 1" }, - { { 'E', 0 }, "step_property teletext_half_page 1" }, - { { 'W', 0 }, "step_property teletext_page 1" }, - { { 'Q', 0 }, "step_property teletext_page -1" }, -#endif #ifdef HAVE_JOYSTICK { { JOY_AXIS0_PLUS, 0 }, "seek 10" }, { { JOY_AXIS0_MINUS, 0 }, "seek -10" },
--- a/input/input.h Wed Jun 20 18:19:03 2007 +0000 +++ b/input/input.h Thu Jun 21 08:18:51 2007 +0000 @@ -93,8 +93,6 @@ #define MP_CMD_STEP_PROPERTY 91 #define MP_CMD_RADIO_STEP_FREQ 92 #define MP_CMD_TV_STEP_FREQ 93 -#define MP_CMD_TV_TELETEXT_ADD_DEC 94 -#define MP_CMD_TV_TELETEXT_GO_LINK 95 #define MP_CMD_BALANCE 96 #define MP_CMD_GUI_EVENTS 5000
--- a/libvo/sub.c Wed Jun 20 18:19:03 2007 +0000 +++ b/libvo/sub.c Thu Jun 21 08:18:51 2007 +0000 @@ -68,10 +68,6 @@ font_desc_t* sub_font=NULL; unsigned char* vo_osd_text=NULL; -#ifdef HAVE_TV_TELETEXT -unsigned char* vo_osd_teletex_text=NULL; -int vo_osd_teletext_flip = 0; -#endif int sub_unicode=0; int sub_utf8=0; int sub_pos=100; @@ -234,121 +230,6 @@ } #endif -#ifdef HAVE_TV_TELETEXT -inline static void vo_update_text_teletext(mp_osd_obj_t *obj, int dxs, int dys) -{ - char *p,*pe; - char line[256]; - int h=0,w=0,i,c,w1,font,lines,endline; - int x1,y1,x2,y2; - unsigned char *t; - - obj->flags|=OSDFLAG_CHANGED|OSDFLAG_VISIBLE; - - if (vo_osd_teletex_text==NULL) { - obj->flags&=~OSDFLAG_VISIBLE; - return; - } - p=vo_osd_teletex_text; - lines=0; - endline=0; - do { // calculate teletext size - memset(line,0,sizeof(line)); - if(pe=strchr(p,'\n')) { - if(pe-p>sizeof(line)) - strncpy(line,p,sizeof(line)); - else - strncpy(line,p,pe-p); - } - else - strncpy(line,p,sizeof(line)); - - t=line; - w1=0; - while (*t) { - c = utf8_get_char(&t); - if (!c) c++; // avoid UCS 0 - render_one_glyph(vo_font, c); - w1+=vo_font->width[c]+vo_font->charspace; - } - h+=vo_font->height; - if(w1>w) w=w1; - if(pe) pe++; - p=pe; - lines++; - if(h+vo_font->height*2>dys && endline==0) endline=lines; - } while (pe!=NULL); - h=h+vo_font->height; - w=w-vo_font->charspace; - if (w>dxs){ - // calculate bbox size - x1=0; - x2=dxs; - } - else - { - x1=(dxs-w)/2; - x2=x1+w+1; - } - if (h>dys){ - y1=0; - y2=dys; - } - else { - y1=0; - y2=y1+h+1; - } - obj->bbox.x1 = obj->x = x1; - obj->bbox.y1 = obj->y = y1; - obj->bbox.x2 = x2; - obj->bbox.y2 = y2; - obj->flags |= OSDFLAG_BBOX; - alloc_buf(obj); - p=vo_osd_teletex_text; - h=y1; - if (vo_osd_teletext_flip) - endline=lines-endline; // bottom page - else - endline=0; // top page - lines=0; - do { // show teletext page - memset(line,0,sizeof(line)); - if(pe=strchr(p,'\n')) { - if(pe-p>sizeof(line)) - strncpy(line,p,sizeof(line)); - else - strncpy(line,p,pe-p);} - else - strncpy(line,p,sizeof(line)); - - t=line; - - w1=x1; - if(lines==0 || endline==0 || lines>endline) { - while (*t) { - c = utf8_get_char(&t); - if (!c) c++; // avoid UCS 0 - render_one_glyph(vo_font, c); - if(w1+vo_font->width[c]>=x2) break; - if ((font=vo_font->font[c])>=0) - draw_alpha_buf(obj,w1,h, - vo_font->width[c], - vo_font->pic_a[font]->h, - vo_font->pic_b[font]->bmp+vo_font->start[c], - vo_font->pic_a[font]->bmp+vo_font->start[c], - vo_font->pic_a[font]->w); - w1+=vo_font->width[c]+vo_font->charspace; - } - h+=vo_font->height; - } - if(pe) pe++; - p=pe; - if(h+vo_font->height*2>dys) pe=NULL; - lines++; - } while (pe!=NULL); -} -#endif - int vo_osd_progbar_type=-1; int vo_osd_progbar_value=100; // 0..256 @@ -979,11 +860,6 @@ case OSDTYPE_SUBTITLE: vo_update_text_sub(obj,dxs,dys); break; -#ifdef HAVE_TV_TELETEXT - case OSDTYPE_TELETEXT: - vo_update_text_teletext(obj,dxs,dys); - break; -#endif case OSDTYPE_PROGBAR: vo_update_text_progbar(obj,dxs,dys); break; @@ -1051,9 +927,6 @@ #ifdef USE_DVDNAV new_osd_obj(OSDTYPE_DVDNAV); #endif -#if HAVE_TV_TELETEXT - new_osd_obj(OSDTYPE_TELETEXT); -#endif #ifdef HAVE_FREETYPE force_load_font = 1; #endif @@ -1092,9 +965,6 @@ #ifdef USE_DVDNAV case OSDTYPE_DVDNAV: #endif -#ifdef HAVE_TV_TELETEXT - case OSDTYPE_TELETEXT: -#endif case OSDTYPE_OSD: case OSDTYPE_SUBTITLE: case OSDTYPE_PROGBAR:
--- a/libvo/sub.h Wed Jun 20 18:19:03 2007 +0000 +++ b/libvo/sub.h Thu Jun 21 08:18:51 2007 +0000 @@ -2,10 +2,6 @@ #ifndef __MPLAYER_SUB_H #define __MPLAYER_SUB_H -#ifdef HAVE_TV_TELETEXT -#include "libmpcodecs/mp_image.h" -#endif - typedef struct mp_osd_bbox_s { int x1,y1,x2,y2; } mp_osd_bbox_t; @@ -15,7 +11,6 @@ #define OSDTYPE_PROGBAR 3 #define OSDTYPE_SPU 4 #define OSDTYPE_DVDNAV 5 -#define OSDTYPE_TELETEXT 6 #define OSDFLAG_VISIBLE 1 #define OSDFLAG_CHANGED 2 @@ -69,11 +64,6 @@ extern unsigned char* vo_osd_text; -#ifdef HAVE_TV_TELETEXT -extern unsigned char* vo_osd_teletex_text; -extern int vo_osd_teletext_flip; -#endif - extern int vo_osd_progbar_type; extern int vo_osd_progbar_value; // 0..255
--- a/mpcommon.c Wed Jun 20 18:19:03 2007 +0000 +++ b/mpcommon.c Thu Jun 21 08:18:51 2007 +0000 @@ -7,9 +7,6 @@ #include "libvo/video_out.h" #include "spudec.h" #include "vobsub.h" -#ifdef HAVE_TV_TELETEXT -#include "stream/tv.h" -#endif double sub_last_pts = -303; @@ -141,31 +138,3 @@ } current_module=NULL; } - -void update_teletext(sh_video_t *sh_video, demuxer_t *demuxer, int reset) -{ -#ifdef HAVE_TV_TELETEXT - int half_page; - tvi_handle_t *tvh = demuxer->priv; - if (demuxer->type != DEMUXER_TYPE_TV) return; - if(!tvh) return; - if(vo_spudec) { - tv_teletext_img_t* img=tv_get_teletext_imgpage(tvh); - if(img!=NULL) { - spudec_heartbeat_teletext(vo_spudec, img); - if(img->canvas) - free(img->canvas); - free(img); - vo_osd_changed(OSDTYPE_SPU); - vo_osd_teletex_text=NULL; - vo_osd_changed(OSDTYPE_TELETEXT); - return; - } - vo_osd_changed(OSDTYPE_SPU); - } - vo_osd_teletex_text=tv_get_teletext_txtpage(tvh); - tv_teletext_control(tvh,TVI_CONTROL_VBI_GET_HALF_PAGE,&half_page); - vo_osd_teletext_flip=half_page; - vo_osd_changed(OSDTYPE_TELETEXT); -#endif -}
--- a/mplayer.c Wed Jun 20 18:19:03 2007 +0000 +++ b/mplayer.c Thu Jun 21 08:18:51 2007 +0000 @@ -1040,10 +1040,6 @@ spudec_set_font_factor(vo_spudec,font_factor); } -#ifdef HAVE_TV_TELETEXT - if (vo_spudec==NULL && mpctx->demuxer->type==DEMUXER_TYPE_TV) - vo_spudec=spudec_new_scaled(NULL, mpctx->sh_video->disp_w, mpctx->sh_video->disp_h); -#endif if (vo_spudec!=NULL) inited_flags|=INITED_SPUDEC; } @@ -1626,7 +1622,6 @@ decoded_frame = decode_video(sh_video, start, in_size, 0, pts); if (decoded_frame) { update_subtitles(sh_video, mpctx->d_sub, 0); - update_teletext(sh_video, mpctx->demuxer, 0); update_osd_msg(); current_module = "filter video"; if (filter_video(sh_video, decoded_frame, sh_video->pts)) @@ -2041,7 +2036,6 @@ ++total_frame_cnt; } update_subtitles(sh_video, mpctx->d_sub, 0); - update_teletext(sh_video, mpctx->demuxer, 0); update_osd_msg(); current_module = "decode_video"; decoded_frame = decode_video(sh_video, start, in_size, drop_frame, @@ -2255,7 +2249,6 @@ // be completely wrong (probably 0). mpctx->sh_video->pts = mpctx->d_video->pts; update_subtitles(mpctx->sh_video, mpctx->d_sub, 1); - update_teletext(mpctx->sh_video, mpctx->demuxer, 1); } if (mpctx->sh_audio) { @@ -3130,11 +3123,7 @@ //================== Read SUBTITLES (DVD & TEXT) ========================== if(vo_spudec==NULL && mpctx->sh_video && - (mpctx->stream->type==STREAMTYPE_DVD || mpctx->stream->type == STREAMTYPE_DVDNAV || -#ifdef HAVE_TV_TELETEXT - mpctx->demuxer->type==DEMUXER_TYPE_TV || -#endif - mpctx->d_sub->id >= 0)){ + (mpctx->stream->type==STREAMTYPE_DVD || mpctx->stream->type == STREAMTYPE_DVDNAV || mpctx->d_sub->id >= 0)){ init_vo_spudec(); }
--- a/spudec.c Wed Jun 20 18:19:03 2007 +0000 +++ b/spudec.c Thu Jun 21 08:18:51 2007 +0000 @@ -29,9 +29,6 @@ #include "avutil.h" #endif #include "libswscale/swscale.h" -#ifdef HAVE_TV_TELETEXT -#include "stream/tv.h" -#endif /* Valid values for spu_aamode: 0: none (fastest, most ugly) @@ -1188,115 +1185,3 @@ spu->hw_spu = hw_spu; hw_spu->control(VOCTRL_SET_SPU_PALETTE,spu->global_palette); } - -#ifdef HAVE_TV_TELETEXT -#define VBI_R(rgba) (((rgba) >> 0) & 0xFF) -#define VBI_G(rgba) (((rgba) >> 8) & 0xFF) -#define VBI_B(rgba) (((rgba) >> 16) & 0xFF) -#define VBI_A(rgba) (((rgba) >> 24) & 0xFF) - - -static unsigned char rgbtoy(int r, int g, int b) { - int ret=(257*r+504*g+98*b+16000)/1000; - return ret & 0xff; -} - -/// correction u and v planes half size -#define SPU_DOUBLE_SIZE 1 - -void alloc_images(spudec_handle_t* spu, int cmode) { - - if (spu->image_size < spu->stride * spu->height) { - if (spu->image != NULL) { - free(spu->image); - spu->image_size = 0; - } - spu->image = malloc(2 * spu->stride * spu->height); - if (spu->image) { - spu->image_size = spu->stride * spu->height; - spu->aimage = spu->image + spu->image_size; - } - } -} - -/** - Render from VBI_PIXFMT_RGBA32_LE to spu -**/ -void spudec_heartbeat_teletext(void *this, void *imgptr) -{ - int px,py; - int grey,alpha,cy,cu,cv,alphauv; - uint32_t *canvas; - uint32_t *pin; - spudec_handle_t *spu = (spudec_handle_t*)this; - tv_teletext_img_t *img = (tv_teletext_img_t*)imgptr; - unsigned char *iptr; - unsigned char *aptr; - int h1 = 10; - int hs = 0; - - if(!spu || !img) - return; - if(img->canvas==NULL) { - spudec_reset(spu); - if (spu->image) - free(spu->image); - spu->image=NULL; - spu->image_size = 0; - return; - } - - if(img->half) h1=5; // top half page - if(img->half==2) hs=5; // bottom half page - - spu->start_pts=0; - spu->end_pts=0; - spu->now_pts=1; - spu->orig_frame_width = img->columns*12; // 1 char width 12 pixel - spu->orig_frame_height = img->rows*h1; // 1 char height 10 pixel - spu->scaled_frame_width = 0; - spu->scaled_frame_height = 0; - spu->start_col = 0; - spu->end_col = img->columns*12; - spu->start_row = 0; - spu->end_row = img->rows*h1; - spu->height = img->rows*h1; - spu->width = img->columns*12; - spu->height = (spu->height+3)&(~3); // round to 4 - spu->stride = (spu->width+7)&(~7); // round to 8 - - alloc_images(spu,img->tformat); // alloc images buffer - if (spu->image == NULL) { - spudec_reset(spu); - return; - } - canvas=img->canvas; // RGBA32_LE image - pin=canvas+(hs*img->columns*12*img->rows); - memset(spu->image,0,spu->image_size*2); - - for(py=0;py<img->rows*h1;py++) { - iptr=spu->image+(py-hs)*spu->stride; // image ptr - aptr=spu->aimage+(py-hs)*spu->stride; // alpha ptr - for(px=0;px<img->columns*12;px++) { - grey=rgbtoy(VBI_R(*pin),VBI_G(*pin),VBI_B(*pin)); // RGB to Y - if(grey<=0x10) grey=0; - alpha=VBI_A(*pin); - switch (img->tformat) { - case 0x01: // BW - case 0x02: // Gray - case 0x03: // Color (not supported) - alpha=0x100-alpha; - if (grey + alpha > 255) grey = 256 - alpha; - break; - } - *iptr=grey; // store Y plane - *aptr=alpha; // store alpha - iptr++; - aptr++; - pin++; - } - } - spu->start_pts=0; - spu->end_pts=UINT_MAX; -} -#endif
--- a/spudec.h Wed Jun 20 18:19:03 2007 +0000 +++ b/spudec.h Thu Jun 21 08:18:51 2007 +0000 @@ -20,8 +20,5 @@ void spudec_calc_bbox(void *me, unsigned int dxs, unsigned int dys, unsigned int* bbox); void spudec_draw_scaled(void *me, unsigned int dxs, unsigned int dys, void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)); void spudec_set_forced_subs_only(void * const this, const unsigned int flag); -#ifdef HAVE_TV_TELETEXT -void spudec_heartbeat_teletext(void *this, void *imgptr); -#endif #endif
--- a/stream/Makefile Wed Jun 20 18:19:03 2007 +0000 +++ b/stream/Makefile Thu Jun 21 08:18:51 2007 +0000 @@ -51,7 +51,6 @@ SRCS_COMMON-$(TV_BSDBT848) += tvi_bsdbt848.c SRCS_COMMON-$(TV_V4L1) += tvi_v4l.c audio_in.c SRCS_COMMON-$(TV_V4L2) += tvi_v4l2.c audio_in.c -SRCS_COMMON-$(TV_TELETEXT) += tvi_vbi.c SRCS_COMMON-$(VCD) += stream_vcd.c SRCS_COMMON-$(VSTREAM) += stream_vstream.c
--- a/stream/tv.c Wed Jun 20 18:19:03 2007 +0000 +++ b/stream/tv.c Thu Jun 21 08:18:51 2007 +0000 @@ -34,10 +34,6 @@ #include "frequencies.h" -#ifdef HAVE_TV_TELETEXT -#include "tvi_vbi.h" -#endif - /* some default values */ int tv_param_audiorate = 44100; int tv_param_noaudio = 0; @@ -522,9 +518,6 @@ tv_uninit(tvh); return NULL; } -#ifdef HAVE_TV_TELETEXT - if(tvh->priv_vbi) teletext_control(tvh->priv_vbi,TVI_CONTROL_VBI_START,1); //arg must be not null -#endif funcs = tvh->functions; demuxer->priv=tvh; @@ -664,12 +657,6 @@ static void demux_close_tv(demuxer_t *demuxer) { tvi_handle_t *tvh=(tvi_handle_t*)(demuxer->priv); -#ifdef HAVE_TV_TELETEXT - if(tvh->priv_vbi) { - teletext_uninit(tvh->priv_vbi); - tvh->priv_vbi=NULL; - } -#endif if (!tvh) return; tvh->functions->uninit(tvh->priv); demuxer->priv=NULL; @@ -701,10 +688,6 @@ tvi_driver_list[i]->name, tvi_driver_list[i]->author, tvi_driver_list[i]->comment?tvi_driver_list[i]->comment:""); -#ifdef HAVE_TV_TELETEXT - h->priv_vbi=teletext_init(); -#endif - return h; } } @@ -790,9 +773,6 @@ mp_msg(MSGT_TV, MSGL_V, MSGTR_TV_CurrentFrequency, freq, (float)freq/16); } -#ifdef HAVE_TV_TELETEXT - if (tvh->priv_vbi) teletext_control(tvh->priv_vbi,TVI_CONTROL_VBI_RESET,1); //arg must be not null -#endif return(1); } @@ -952,9 +932,6 @@ return 0; } } -#ifdef HAVE_TV_TELETEXT - if (tvh->priv_vbi) teletext_control(tvh->priv_vbi,TVI_CONTROL_VBI_RESET,1); //arg must be not null -#endif return(1); } @@ -972,61 +949,9 @@ mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TV_CannotSetNorm); return 0; } -#ifdef HAVE_TV_TELETEXT - if (tvh->priv_vbi) teletext_control(tvh->priv_vbi,TVI_CONTROL_VBI_RESET,1); //arg must be not null -#endif return(1); } -#ifdef HAVE_TV_TELETEXT -int tv_teletext_control(tvi_handle_t* tvh, int control, void* arg) -{ - if (!tvh || !tvh->priv_vbi) - return TVI_CONTROL_FALSE; - - return teletext_control(tvh->priv_vbi,control,arg); -} - -int tv_teletext_add_dec(tvi_handle_t *tvh, char *dec) -{ - if(!dec) return 0; - if (teletext_control(tvh->priv_vbi, TVI_CONTROL_VBI_ADD_DEC, &dec)!= TVI_CONTROL_TRUE) - return 0; - return 1; -} - -int tv_teletext_go_link(tvi_handle_t *tvh, int linkno) -{ - if (teletext_control(tvh->priv_vbi, TVI_CONTROL_VBI_GO_LINK, &linkno)!= TVI_CONTROL_TRUE) - return 0; - return 1; -} - -void* tv_get_teletext_vbipage(tvi_handle_t *tvh) -{ - void* page = NULL; - if (teletext_control(tvh->priv_vbi, TVI_CONTROL_VBI_GET_VBIPAGE, &page)!= TVI_CONTROL_TRUE) - return NULL; - return page; -} - -char* tv_get_teletext_txtpage(tvi_handle_t *tvh) -{ - char* page = NULL; - if (teletext_control(tvh->priv_vbi, TVI_CONTROL_VBI_GET_TXTPAGE, &page)!= TVI_CONTROL_TRUE) - return NULL; - return page; -} - -tv_teletext_img_t* tv_get_teletext_imgpage(tvi_handle_t *tvh) -{ - tv_teletext_img_t* tv_teletext_img = NULL; - if (teletext_control(tvh->priv_vbi, TVI_CONTROL_VBI_GET_IMGPAGE, &tv_teletext_img)!= TVI_CONTROL_TRUE) - return NULL; - return tv_teletext_img; -} -#endif - demuxer_desc_t demuxer_desc_tv = { "Tv card demuxer", "tv",
--- a/stream/tv.h Wed Jun 20 18:19:03 2007 +0000 +++ b/stream/tv.h Thu Jun 21 08:18:51 2007 +0000 @@ -43,11 +43,6 @@ #endif extern char* tv_param_adevice; #endif -#ifdef HAVE_TV_TELETEXT -extern char* tv_param_tdevice; ///< teletext vbi device -extern char* tv_param_tformat; ///< format: text,bw,gray,color -extern int tv_param_tpage; ///< page number -#endif extern int tv_param_brightness; extern int tv_param_contrast; extern int tv_param_hue; @@ -77,9 +72,6 @@ typedef struct tvi_handle_s { tvi_functions_t *functions; void *priv; -#ifdef HAVE_TV_TELETEXT - void *priv_vbi; -#endif int seq; /* specific */ @@ -98,18 +90,6 @@ struct tv_channels_s *prev; } tv_channels_t; -#ifdef HAVE_TV_TELETEXT -typedef struct tv_teletext_img_s { - void* canvas; - int tformat; - int columns; - int rows; - int height; - int width; - int half; -} tv_teletext_img_t; -#endif - extern tv_channels_t *tv_channel_list; extern tv_channels_t *tv_channel_current, *tv_channel_last; extern char *tv_channel_last_real; @@ -173,31 +153,6 @@ #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 */ -/* TELETEXT controls */ -#define TVI_CONTROL_VBI_SET_MODE 0x501 ///< on/off grab teletext -#define TVI_CONTROL_VBI_GET_MODE 0x502 ///< get current mode teletext -#define TVI_CONTROL_VBI_STEP_MODE 0x503 ///< step teletext mode - -#define TVI_CONTROL_VBI_SET_PAGE 0x504 ///< set grab teletext page number -#define TVI_CONTROL_VBI_STEP_PAGE 0x505 ///< step grab teletext page number -#define TVI_CONTROL_VBI_GET_PAGE 0x506 ///< get grabbed teletext page - -#define TVI_CONTROL_VBI_SET_FORMAT 0x507 ///< set teletext format -#define TVI_CONTROL_VBI_STEP_FORMAT 0x508 ///< step teletext format -#define TVI_CONTROL_VBI_GET_FORMAT 0x509 ///< get eletext format - -#define TVI_CONTROL_VBI_GET_HALF_PAGE 0x50a ///< get current half page -#define TVI_CONTROL_VBI_STEP_HALF_PAGE 0x50b ///< switch half page -#define TVI_CONTROL_VBI_SET_HALF_PAGE 0x50c ///< switch half page - -#define TVI_CONTROL_VBI_ADD_DEC 0x50d ///< add page number with dec -#define TVI_CONTROL_VBI_GO_LINK 0x50e ///< go link (1..6) -#define TVI_CONTROL_VBI_GET_TXTPAGE 0x50f ///< get grabbed text teletext page -#define TVI_CONTROL_VBI_GET_IMGPAGE 0x510 ///< get grabbed image teletext page -#define TVI_CONTROL_VBI_GET_VBIPAGE 0x511 ///< get vbi_image for grabbed teletext page -#define TVI_CONTROL_VBI_RESET 0x512 ///< vbi reset -#define TVI_CONTROL_VBI_START 0x513 ///< vbi start - extern tvi_handle_t *tv_begin(void); extern int tv_init(tvi_handle_t *tvh); extern int tv_uninit(tvi_handle_t *tvh); @@ -228,20 +183,6 @@ int tv_set_norm(tvi_handle_t *tvh, char* norm); -#ifdef HAVE_TV_TELETEXT -int tv_teletext_control(tvi_handle_t* tvh, int control,void* arg); -/// add dec to pageno -int tv_teletext_add_dec(tvi_handle_t *tvh, char *dec); -/// go link -int tv_teletext_go_link(tvi_handle_t *tvh, int linkno); -/// get current vbi_page -void* tv_get_teletext_vbipage(tvi_handle_t *tvh); -/// get current page text -char* tv_get_teletext_txtpage(tvi_handle_t *tvh); -/// get current page image (RGB32_LB format) -tv_teletext_img_t* tv_get_teletext_imgpage(tvi_handle_t *tvh); -#endif - #define TV_NORM_PAL 1 #define TV_NORM_NTSC 2 #define TV_NORM_SECAM 3
--- a/stream/tvi_vbi.c Wed Jun 20 18:19:03 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1197 +0,0 @@ -#include "config.h" - -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> - -#include "tv.h" -#include "tvi_vbi.h" -#include "mp_msg.h" -#include "libmpcodecs/img_format.h" - -#ifdef USE_ICONV -#include <iconv.h> -#endif - -#define VBI_TEXT_CHARSET "UTF-8" - -char* tv_param_tdevice=NULL; ///< teletext vbi device -char* tv_param_tformat="gray"; ///< format: text,bw,gray,color -int tv_param_tpage=100; ///< page number - - -#ifdef USE_ICONV -/* ------------------------------------------------------------------- - zvbi-0.2.25/src/exp-txt.c skip debug "if(1) fprintf(stderr,) " message ------------------------------------------------------------------- -*/ - -/** - * libzvbi - Text export functions - * - * Copyright (C) 2001, 2002 Michael H. Schimek - * - * Based on code from AleVT 1.5.1 - * Copyright (C) 1998, 1999 Edgar Toernig <froese@gmx.de> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - **/ - -/** $Id$ **/ - -static vbi_bool -print_unicode(iconv_t cd, int endian, int unicode, char **p, int n) -{ - char in[2], *ip, *op; - size_t li, lo, r; - - in[0 + endian] = unicode; - in[1 - endian] = unicode >> 8; - ip = in; op = *p; - li = sizeof(in); lo = n; - - r = iconv(cd, &ip, &li, &op, &lo); - - if ((size_t) -1 == r - || (**p == 0x40 && unicode != 0x0040)) { - in[0 + endian] = 0x20; - in[1 - endian] = 0; - ip = in; op = *p; - li = sizeof(in); lo = n; - - r = iconv(cd, &ip, &li, &op, &lo); - - if ((size_t) -1 == r - || (r == 1 && **p == 0x40)) - goto error; - } - - *p = op; - - return TRUE; - - error: - return FALSE; -} - -static int -vbi_print_page_region_nodebug(vbi_page * pg, char *buf, int size, - const char *format, vbi_bool table, - vbi_bool rtl, int column, int row, int width, - int height) -{ - int endian = vbi_ucs2be(); - int column0, column1, row0, row1; - int x, y, spaces, doubleh, doubleh0; - iconv_t cd; - char *p; - - rtl = rtl; - -#if 0 - if (1) - fprintf (stderr, "vbi_print_page_region '%s' " - "table=%d col=%d row=%d width=%d height=%d\n", - format, table, column, row, width, height); -#endif - - column0 = column; - row0 = row; - column1 = column + width - 1; - row1 = row + height - 1; - - if (!pg || !buf || size < 0 || !format - || column0 < 0 || column1 >= pg->columns - || row0 < 0 || row1 >= pg->rows - || endian < 0) - return 0; - - if ((cd = iconv_open(format, "UCS-2")) == (iconv_t) -1) - return 0; - - p = buf; - - doubleh = 0; - - for (y = row0; y <= row1; y++) { - int x0, x1, xl; - - x0 = (table || y == row0) ? column0 : 0; - x1 = (table || y == row1) ? column1 : (pg->columns - 1); - - xl = (table || y != row0 || (y + 1) != row1) ? -1 : column1; - - doubleh0 = doubleh; - - spaces = 0; - doubleh = 0; - - for (x = x0; x <= x1; x++) { - vbi_char ac = pg->text[y * pg->columns + x]; - - if (table) { - if (ac.size > VBI_DOUBLE_SIZE) - ac.unicode = 0x0020; - } else { - switch (ac.size) { - case VBI_NORMAL_SIZE: - case VBI_DOUBLE_WIDTH: - break; - - case VBI_DOUBLE_HEIGHT: - case VBI_DOUBLE_SIZE: - doubleh++; - break; - - case VBI_OVER_TOP: - case VBI_OVER_BOTTOM: - continue; - - case VBI_DOUBLE_HEIGHT2: - case VBI_DOUBLE_SIZE2: - if (y > row0) - ac.unicode = 0x0020; - break; - } - - /* - * Special case two lines row0 ... row1, and all chars - * in row0, column0 ... column1 are double height: Skip - * row1, don't wrap around. - */ - if (x == xl && doubleh >= (x - x0)) { - x1 = xl; - y = row1; - } - - if (ac.unicode == 0x20 || !vbi_is_print(ac.unicode)) { - spaces++; - continue; - } else { - if (spaces < (x - x0) || y == row0) { - for (; spaces > 0; spaces--) - if (!print_unicode(cd, endian, 0x0020, - &p, buf + size - p)) - goto failure; - } else /* discard leading spaces */ - spaces = 0; - } - } - - if (!print_unicode(cd, endian, ac.unicode, &p, buf + size - p)) - goto failure; - } - - /* if !table discard trailing spaces and blank lines */ - - if (y < row1) { - int left = buf + size - p; - - if (left < 1) - goto failure; - - if (table) { - *p++ = '\n'; /* XXX convert this (eg utf16) */ - } else if (spaces >= (x1 - x0)) { - ; /* suppress blank line */ - } else { - /* exactly one space between adjacent rows */ - if (!print_unicode(cd, endian, 0x0020, &p, left)) - goto failure; - } - } else { - if (doubleh0 > 0) { - ; /* prentend this is a blank double height lower row */ - } else { - for (; spaces > 0; spaces--) - if (!print_unicode(cd, endian, 0x0020, &p, buf + size - p)) - goto failure; - } - } - } - - iconv_close(cd); - return p - buf; - - failure: - iconv_close(cd); - return 0; -} -#endif -/* - end of zvbi-0.2.25/src/exp-txt.c part -*/ - - -/* ------------------------------------------------------------------- - Private routines ------------------------------------------------------------------- -*/ - -/** - * \brief Decode event handler - * \param ev VBI event - * \param data pointer to user defined data - * - */ -static void event_handler(vbi_event * ev, void *data) -{ - priv_vbi_t *user_vbi = (priv_vbi_t *) data; - vbi_page pg; - char *s; - int i; - - switch (ev->type) { - case VBI_EVENT_CAPTION: - mp_msg(MSGT_TV,MSGL_DBG3,"caption\n"); - break; - case VBI_EVENT_NETWORK: - s = ev->ev.network.name; - if (s) { - pthread_mutex_lock(&(user_vbi->buffer_mutex)); - if (user_vbi->network_name) - free(user_vbi->network_name); - user_vbi->network_name = strdup(s); - pthread_mutex_unlock(&(user_vbi->buffer_mutex)); - } - break; - case VBI_EVENT_NETWORK_ID: - s = ev->ev.network.name; - if (s) { - pthread_mutex_lock(&(user_vbi->buffer_mutex)); - if (user_vbi->network_id) - free(user_vbi->network_id); - user_vbi->network_id = strdup(s); - pthread_mutex_unlock(&(user_vbi->buffer_mutex)); - } - break; - case VBI_EVENT_TTX_PAGE: - pthread_mutex_lock(&(user_vbi->buffer_mutex)); - user_vbi->curr_pgno = ev->ev.ttx_page.pgno; // page number - user_vbi->curr_subno = ev->ev.ttx_page.subno; // subpage - i = vbi_bcd2dec(ev->ev.ttx_page.pgno); - if (i > 0 && i < 1000) { - if (!user_vbi->cache[i]) - user_vbi->cache[i] = (vbi_page *) malloc(sizeof(vbi_page)); - vbi_fetch_vt_page(user_vbi->decoder, // fetch page - user_vbi->cache[i], - ev->ev.ttx_page.pgno, - ev->ev.ttx_page.subno, - VBI_WST_LEVEL_3p5, 25, TRUE); - memcpy(user_vbi->theader, user_vbi->cache[i]->text, - sizeof(user_vbi->theader)); - } - pthread_mutex_unlock(&(user_vbi->buffer_mutex)); - break; - } -} - -/** - * \brief Prepares page to be shown on screen - * \param priv_vbi private data structure - * - * This routine adds page number, current time, etc to page header - * - */ -static void process_page(priv_vbi_t * priv_vbi) -{ - char *pagesptr; - int csize, i, j, subtitle = 0, sflg, send; - void *canvas; - char cpage[5]; - vbi_page page; - - memcpy(&(page), priv_vbi->page, sizeof(vbi_page)); - if (priv_vbi->pgno != priv_vbi->page->pgno) { - //don't clear first line - for (i = page.columns; i < 1056; i++) { - page.text[i].unicode = ' '; - page.text[i].background = VBI_TRANSPARENT_COLOR; - } - snprintf(cpage, sizeof(cpage), "%03X", priv_vbi->pgno); - page.text[1].unicode = cpage[0]; - page.text[2].unicode = cpage[1]; - page.text[3].unicode = cpage[2]; - page.text[4].unicode = ' '; - page.text[5].unicode = ' '; - page.text[6].unicode = ' '; - } - - //background page number & title - j=vbi_bcd2dec(priv_vbi->curr_pgno); - if (j>0 && j<1000 && priv_vbi->cache[j]){ - for(i=8;i<priv_vbi->cache[j]->columns;i++){ - page.text[i].unicode = priv_vbi->cache[j]->text[i].unicode; - } - } - - if (page.text[1].unicode == ' ' && page.text[2].unicode == ' ' && - page.text[3].unicode == ' ' && page.text[4].unicode == ' ' && - page.text[5].unicode == ' ' && page.text[5].unicode == ' ' - && !priv_vbi->half) - subtitle = 1; // subtitle page - if (priv_vbi->pagenumdec) { - i = (priv_vbi->pagenumdec >> 12) & 0xf; - switch (i) { - case 1: - page.text[1].unicode = '0' + ((priv_vbi->pagenumdec >> 0) & 0xf); - page.text[2].unicode = '-'; - page.text[3].unicode = '-'; - break; - case 2: - page.text[1].unicode = '0' + ((priv_vbi->pagenumdec >> 4) & 0xf); - page.text[2].unicode = '0' + ((priv_vbi->pagenumdec >> 0) & 0xf); - page.text[3].unicode = '-'; - break; - } - page.text[4].unicode = ' '; - page.text[5].unicode = ' '; - page.text[6].unicode = ' '; - page.text[1].foreground = VBI_WHITE; - page.text[2].foreground = VBI_WHITE; - page.text[3].foreground = VBI_WHITE; - } - priv_vbi->columns = page.columns; - priv_vbi->rows = page.rows; - if (!subtitle) { // update time in header - memcpy(&(page.text[VBI_TIME_LINEPOS]), - &(priv_vbi->theader[VBI_TIME_LINEPOS]), - sizeof(vbi_char) * (priv_vbi->columns - VBI_TIME_LINEPOS)); - } - switch (priv_vbi->tformat) { - case VBI_TFORMAT_TEXT: // mode: text - if (priv_vbi->txtpage) { -#ifdef USE_ICONV - vbi_print_page_region_nodebug(&(page), priv_vbi->txtpage, - VBI_TXT_PAGE_SIZE, VBI_TEXT_CHARSET, TRUE, - 0, 0, 0, page.columns, page.rows); // vbi_page to text without message -#else - vbi_print_page(&(page), priv_vbi->txtpage, - VBI_TXT_PAGE_SIZE, VBI_TEXT_CHARSET, TRUE, 0); -#endif - } - priv_vbi->valid_page = 1; - break; - case VBI_TFORMAT_BW: // mode: black & white - for (i=0; i < (priv_vbi->pgno!=page.pgno?page.columns:1056); i++) { - if (priv_vbi->foreground){ - page.text[i].foreground = VBI_BLACK; - page.text[i].background = VBI_WHITE; - }else{ - page.text[i].foreground = VBI_WHITE; - page.text[i].background = VBI_BLACK; - } - } - case VBI_TFORMAT_GRAY: // mode: grayscale - case VBI_TFORMAT_COLOR: // mode: color (request color spu patch!) - - - - page.color_map[VBI_TRANSPARENT_COLOR] = 0; - if (priv_vbi->alpha) { - if (subtitle) { - for (i = 0; i < page.rows; i++) { - sflg = 0; - send = 0; - for (j = 0; j < page.columns; j++) { - if (page.text[i * page.columns + j].unicode != ' ') { - sflg = 1; - send = j; - } - if (sflg == 0) - page.text[i * page.columns + j].background = - VBI_TRANSPARENT_COLOR; - } - for (j = send + 1; j < page.columns; j++) - page.text[i * page.columns + j].background = - VBI_TRANSPARENT_COLOR; - } - } else { - for (i = 0; i < 1056; i++) - page.text[i].background = VBI_TRANSPARENT_COLOR; - } - } - csize = page.columns * page.rows * 12 * 10 * sizeof(vbi_rgba); - if (csize == 0) - break; - if (csize > priv_vbi->canvas_size) { // test canvas size - if (priv_vbi->canvas) - free(priv_vbi->canvas); - priv_vbi->canvas = malloc(csize); - priv_vbi->canvas_size = 0; - if (priv_vbi->canvas) - priv_vbi->canvas_size = csize; - } - if (priv_vbi->canvas) { - vbi_draw_vt_page(&(page), - priv_vbi->fmt, - priv_vbi->canvas, - priv_vbi->reveal, priv_vbi->flash_on); - priv_vbi->csize = csize; - } - priv_vbi->spudec_proc = 1; - priv_vbi->valid_page = 1; - break; - } -} - -/** - * \brief Update page in cache - * \param priv_vbi private data structure - * - * Routine also calls process_page to refresh currently visible page (if so) - * every time it was received from VBI by background thread. - * - */ -static void update_page(priv_vbi_t * priv_vbi) -{ - int i; - int index; - pthread_mutex_lock(&(priv_vbi->buffer_mutex)); - /* - priv_vbi->redraw=1 - page redraw requested - pgno!=page->pgno - page was switched - curr_pgno==pgno - backgound process just fetched current page, refresh it - */ - if (priv_vbi->redraw || - priv_vbi->pgno != priv_vbi->page->pgno || - priv_vbi->curr_pgno == priv_vbi->pgno) { - index = vbi_bcd2dec(priv_vbi->pgno); - if ( index <= 0 || index > 999 || !priv_vbi->cache[index]) { - // curr_pgno is last decoded page - index = vbi_bcd2dec(priv_vbi->curr_pgno); - } - - if (index <=0 || index >999 || !priv_vbi->cache[index]){ - priv_vbi->valid_page = 0; - memset(priv_vbi->page, 0, sizeof(vbi_page)); - }else - { - memcpy(priv_vbi->page, priv_vbi->cache[index], sizeof(vbi_page)); - process_page(priv_vbi);//prepare page to be shown on screen - } - } - pthread_mutex_unlock(&(priv_vbi->buffer_mutex)); -} - -/** - * \brief background grabber routine - * \param data user-defined data - * - */ -static void *grabber(void *data) -{ - priv_vbi_t *user_vbi = (priv_vbi_t *) data; - vbi_capture_buffer *sliced_buffer; - struct timeval timeout; - unsigned int n_lines; - int r, err_count = 0; - - while (!user_vbi->eof) { - timeout.tv_sec = 0; - timeout.tv_usec = 500; - r = vbi_capture_pull(user_vbi->capture, NULL, &sliced_buffer, &timeout); // grab slices - if (user_vbi->eof) - return NULL; - switch (r) { - case -1: // read error - if (err_count++ > 4) - user_vbi->eof = 1; - break; - case 0: // time out - break; - default: - err_count = 0; - } - if (r != 1) - continue; - n_lines = sliced_buffer->size / sizeof(vbi_sliced); - vbi_decode(user_vbi->decoder, (vbi_sliced *) sliced_buffer->data, - n_lines, sliced_buffer->timestamp); // decode slice - update_page(user_vbi); - } - switch (r) { - case -1: - mp_msg(MSGT_TV, MSGL_ERR, "VBI read error %d (%s)\n", - errno, strerror(errno)); - return NULL; - case 0: - mp_msg(MSGT_TV, MSGL_ERR, "VBI read timeout\n"); - return NULL; - } - return NULL; -} - -/** - * \brief calculate increased/decreased by given value page number - * \param curr current page number in hexadecimal for - * \param direction decimal value (can be negative) to add to value or curr parameter - * \return new page number in hexadecimal form - * - * VBI page numbers are represented in special hexadecimal form, e.g. - * page with number 123 (as seen by user) internally has number 0x123. - * and equation 0x123+8 should be equal to 0x131 instead of regular 0x12b. - * Page numbers 0xYYY (where Y is not belongs to (0..9) and pages below 0x100 and - * higher 0x999 are reserved for internal use. - * - */ -static int steppage(int curr, int direction) -{ - int newpage = vbi_dec2bcd(vbi_bcd2dec(curr) + direction); - if (newpage < 0x100) - newpage = 0x100; - if (newpage > 0x999) - newpage = 0x999; - return newpage; -} - -/** - * \brief toggles teletext page displaying mode - * \param priv_vbi private data structure - * \param flag new mode - * \return - * TVI_CONTROL_TRUE is success, - * TVI_CONTROL_FALSE otherwise - * - * flag: - * 0 - off - * 1 - on & opaque - * 2 - on & transparent - * 3 - on & transparent with black foreground color (only in bw mode) - * - */ -static int teletext_set_mode(priv_vbi_t * priv_vbi, int flag) -{ - if (flag<0 || flag>3) - return TVI_CONTROL_FALSE; - - pthread_mutex_lock(&(priv_vbi->buffer_mutex)); - - priv_vbi->on = flag; - - if (priv_vbi->on > 2 && priv_vbi->tformat != VBI_TFORMAT_BW) - priv_vbi->on = 0; - - priv_vbi->foreground = 0; - priv_vbi->pagenumdec = 0; - priv_vbi->spudec_proc = 1; - priv_vbi->redraw = 1; - switch (priv_vbi->on) { - case 0: - priv_vbi->csize = 0; - break; - case 1: - priv_vbi->alpha = 0; - break; - case 2: - priv_vbi->alpha = 1; - break; - case 3: - priv_vbi->alpha = 1; - priv_vbi->foreground = 1; - break; - } - pthread_mutex_unlock(&(priv_vbi->buffer_mutex)); - return TVI_CONTROL_TRUE; -} - -/** - * \brief get half page mode (only in SPU mode) - * \param priv_vbi private data structure - * \return current mode - * 0 : half mode off - * 1 : top half page - * 2 : bottom half page - */ -static int vbi_get_half(priv_vbi_t * priv_vbi) -{ - int flag = 0; - pthread_mutex_lock(&(priv_vbi->buffer_mutex)); - if (priv_vbi->valid_page) - flag = priv_vbi->half; - priv_vbi->pagenumdec = 0; - pthread_mutex_unlock(&(priv_vbi->buffer_mutex)); - return flag; -} - -/** - * \brief set half page mode (only in SPU mode) - * \param priv_vbi private data structure - * \param flag new half page mode - * \return - * TVI_CONTROL_TRUE is success, - * TVI_CONTROL_FALSE otherwise - * - * - * flag: - * 0 : half mode off - * 1 : top half page - * 2 : bottom half page - */ -static int teletext_set_half_page(priv_vbi_t * priv_vbi, int flag) -{ - if (flag<0 || flag>2) - return TVI_CONTROL_FALSE; - - pthread_mutex_lock(&(priv_vbi->buffer_mutex)); - priv_vbi->half = flag; - if (priv_vbi->tformat == VBI_TFORMAT_TEXT && priv_vbi->half > 1) - priv_vbi->half = 0; - priv_vbi->redraw = 1; - priv_vbi->pagenumdec = 0; - pthread_mutex_unlock(&(priv_vbi->buffer_mutex)); - return TVI_CONTROL_TRUE; -} - -/** - * \brief displays specified page - * \param priv_vbi private data structure - * \param pgno page number to display - * \param subno subpage number - * - */ -static void vbi_setpage(priv_vbi_t * priv_vbi, int pgno, int subno) -{ - pthread_mutex_lock(&(priv_vbi->buffer_mutex)); - priv_vbi->pgno = steppage(0, pgno); - priv_vbi->subno = subno; - priv_vbi->redraw = 1; - priv_vbi->pagenumdec = 0; - pthread_mutex_unlock(&(priv_vbi->buffer_mutex)); -} - -/** - * \brief steps over pages by a given value - * \param priv_vbi private data structure - * \param direction decimal step value (can be negative) - * - */ -static void vbi_steppage(priv_vbi_t * priv_vbi, int direction) -{ - pthread_mutex_lock(&(priv_vbi->buffer_mutex)); - priv_vbi->pgno = steppage(priv_vbi->pgno, direction); - priv_vbi->redraw = 1; - priv_vbi->pagenumdec = 0; - pthread_mutex_unlock(&(priv_vbi->buffer_mutex)); -} - -/** - * \brief append just entered digit to editing page number - * \param priv_vbi private data structure - * \param dec decimal digit to append - * - * dec: - * '0'..'9' append digit - * '-' remove last digit (backspace emulation) - * - * This routine allows user to jump to arbitrary page. - * It implements simple page number editing algorithm. - * - * Subsystem can be on one of two modes: normal and page number edit mode. - * Zero value of priv_vbi->pagenumdec means normal mode - * Non-zero value means page number edit mode and equals to packed - * decimal number of already entered part of page number. - * - * How this works. - * Let's assume that current mode is normal (pagenumdec is zero), teletext page - * 100 are displayed as usual. topmost left corner of page contains page number. - * Then vbi_add_dec is sequentally called (through slave - * command of course) with 1,4,-,2,3 * values of dec parameter. - * - * +-----+------------+------------------+ - * | dec | pagenumxec | displayed number | - * +-----+------------+------------------+ - * | | 0x000 | 100 | - * +-----+------------+------------------+ - * | 1 | 0x001 | __1 | - * +-----+------------+------------------+ - * | 4 | 0x014 | _14 | - * +-----+------------+------------------+ - * | - | 0x001 | __1 | - * +-----+------------+------------------+ - * | 2 | 0x012 | _12 | - * +-----+------------+------------------+ - * | 3 | 0x123 | 123 | - * +-----+------------+------------------+ - * | | 0x000 | 123 | - * +-----+------------+------------------+ - * - * pagenumdec will automatically receive zero value after third digit of page number - * is entered and current page will be switched to another one with entered page number. - * - */ -static void vbi_add_dec(priv_vbi_t * priv_vbi, char *dec) -{ - int count, shift; - if (!dec) - return; - if (!priv_vbi->on) - return; - if ((*dec < '0' || *dec > '9') && *dec != '-') - return; - pthread_mutex_lock(&(priv_vbi->buffer_mutex)); - count = (priv_vbi->pagenumdec >> 12) & 0xf; - if (*dec == '-') { - count--; - if (count) - priv_vbi->pagenumdec = ((priv_vbi->pagenumdec >> 4) & 0xfff) | (count << 12); - else - priv_vbi->pagenumdec = 0; - } else { - shift = count * 4; - count++; - priv_vbi->pagenumdec = - (((priv_vbi->pagenumdec) << 4 | (*dec -'0')) & 0xfff) | (count << 12); - if (count == 3) { - priv_vbi->pgno = priv_vbi->pagenumdec & 0xfff; - priv_vbi->subno = 0; - priv_vbi->redraw = 1; - priv_vbi->pagenumdec = 0; - } - } - pthread_mutex_unlock(&(priv_vbi->buffer_mutex)); -} - -/** - * \brief follows link specified on current page - * \param priv_vbi private data structure - * \param linkno link number (0..6) - * \return - * TVI_CONTROL_FALSE if linkno is outside 0..6 range or if - * teletext is switched off - * TVI_CONTROL_TRUE otherwise - * - * linkno: - * 0: tpage in tv parameters (starting page, usually 100) - * 1..6: follows link on current page with given number - * - * FIXME: quick test shows that this is working strange - * FIXME: routine does not checks whether links exists on page or not - * TODO: more precise look - * - */ -static int vbi_golink(priv_vbi_t * priv_vbi, int linkno) -{ - if (linkno < 0 || linkno > 6) - return TVI_CONTROL_FALSE; - if (!priv_vbi->on) - return TVI_CONTROL_FALSE; - pthread_mutex_lock(&(priv_vbi->buffer_mutex)); - if (linkno == 0) { - priv_vbi->pgno = priv_vbi->tpage; - priv_vbi->subno = priv_vbi->page->nav_link[linkno].subno; - priv_vbi->redraw = 1; - priv_vbi->pagenumdec = 0; - } else { - linkno--; - if (priv_vbi->pgno == priv_vbi->page->pgno) { - priv_vbi->pgno = priv_vbi->page->nav_link[linkno].pgno; - priv_vbi->subno = priv_vbi->page->nav_link[linkno].subno; - priv_vbi->redraw = 1; - priv_vbi->pagenumdec = 0; - } - } - priv_vbi->pagenumdec = 0; - pthread_mutex_unlock(&(priv_vbi->buffer_mutex)); - return TVI_CONTROL_TRUE; -} - -/** - * \brief get pointer to current teletext page - * \param priv_vbi private data structure - * \return pointer to vbi_page structure if teletext is - * switched on and current page is valid, NULL - otherwise - * - */ -static vbi_page *vbi_getpage(priv_vbi_t * priv_vbi) -{ - vbi_page *page = NULL; - - if (!priv_vbi->on) - return NULL; - pthread_mutex_lock(&(priv_vbi->buffer_mutex)); - if (priv_vbi->valid_page) - if (page = malloc(sizeof(vbi_page))) - memcpy(page, priv_vbi->page, sizeof(vbi_page)); - pthread_mutex_unlock(&(priv_vbi->buffer_mutex)); - return page; -} - -/** - * \brief get pointer to current teletext page - * \param priv_vbi private data structure - * \return pointer to character string, containing text-only data of - * teletext page. If teletext is switched off, current page is invalid - * or page format if not equal to "text" then returning value is NULL. - * - */ -static char *vbi_getpagetext(priv_vbi_t * priv_vbi) -{ - char *page = NULL; - - if (!priv_vbi->on) - return NULL; - if (priv_vbi->tformat != VBI_TFORMAT_TEXT && priv_vbi->canvas) - return NULL; - pthread_mutex_lock(&(priv_vbi->buffer_mutex)); - if (priv_vbi->valid_page) - page = priv_vbi->txtpage; - if (!page) - page = priv_vbi->header; - pthread_mutex_unlock(&(priv_vbi->buffer_mutex)); - return page; -} - -/** - * \brief get current page RGBA32 image (only in SPU mode) - * \param priv_vbi private data structure - * \return pointer to tv_teletext_img_t structure, containing among - * other things rendered RGBA32 image of current teletext page. - * return NULL is image is not available for some reason. - * - */ -static tv_teletext_img_t *vbi_getpageimg(priv_vbi_t * priv_vbi) -{ - tv_teletext_img_t *img = NULL; - - if (priv_vbi->tformat == VBI_TFORMAT_TEXT) - return NULL; - if (priv_vbi->spudec_proc == 0) - return NULL; - pthread_mutex_lock(&(priv_vbi->buffer_mutex)); - if (NULL != (img = malloc(sizeof(tv_teletext_img_t)))) { - img->tformat = priv_vbi->tformat; // format: bw|gray|color - img->tformat = VBI_TFORMAT_GRAY; // format: bw|gray|color - img->half = priv_vbi->half; // half mode - img->columns = priv_vbi->columns; // page size - img->rows = priv_vbi->rows; - img->width = priv_vbi->columns * 12; - img->width = priv_vbi->rows * 10; - img->canvas = NULL; - // is page ok? - if (priv_vbi->canvas && priv_vbi->on && priv_vbi->csize && priv_vbi->valid_page) { - - if (NULL != (img->canvas = malloc(priv_vbi->csize))) - memcpy(img->canvas, priv_vbi->canvas, priv_vbi->csize); - } - } - priv_vbi->spudec_proc = 0; - pthread_mutex_unlock(&(priv_vbi->buffer_mutex)); - return img; -} - -/** - * \brief start teletext sybsystem - * \param priv_vbi private data structure - * - * initializes cache, vbi decoder and starts background thread - * - */ -static void vbi_start(priv_vbi_t * priv_vbi) -{ - if (!priv_vbi) - return; - if (NULL != (priv_vbi->txtpage = malloc(VBI_TXT_PAGE_SIZE))) // alloc vbi_page - memset(priv_vbi->txtpage, 0, VBI_TXT_PAGE_SIZE); - priv_vbi->page = malloc(sizeof(vbi_page)); - priv_vbi->cache = (vbi_page **) malloc(1000 * sizeof(vbi_page *)); - memset(priv_vbi->cache, 0, 1000 * sizeof(vbi_page *)); - priv_vbi->decoder = vbi_decoder_new(); - priv_vbi->subno = 0; - priv_vbi->fmt = VBI_PIXFMT_RGBA32_LE; - memset(priv_vbi->theader, 0, sizeof(priv_vbi->theader)); - snprintf(priv_vbi->header, sizeof(priv_vbi->header), "%s", VBI_NO_TELETEXT); - vbi_event_handler_add(priv_vbi->decoder, ~0, event_handler, (void *) priv_vbi); // add event handler - pthread_create(&priv_vbi->grabber_thread, NULL, grabber, priv_vbi); // add grab function - pthread_mutex_init(&priv_vbi->buffer_mutex, NULL); - priv_vbi->valid_page = 0; - priv_vbi->pagenumdec = 0; - mp_msg(MSGT_TV, MSGL_INFO, "Teletext device: %s\n", priv_vbi->device); -} - -/** - * \brief Teletext reset - * \param priv_vbi private data structure - * - * should be called during frequency, norm change, etc - * - */ -static void vbi_reset(priv_vbi_t * priv_vbi) -{ - int i; - pthread_mutex_lock(&(priv_vbi->buffer_mutex)); - if (priv_vbi->canvas) - free(priv_vbi->canvas); - priv_vbi->canvas = NULL; - priv_vbi->canvas_size = 0; - priv_vbi->redraw = 1; - priv_vbi->csize = 0; - priv_vbi->valid_page = 0; - priv_vbi->spudec_proc = 1; - priv_vbi->pagenumdec = 0; - if (priv_vbi->page) - memset(priv_vbi->page, 0, sizeof(vbi_page)); - if (priv_vbi->txtpage) - memset(priv_vbi->txtpage, 0, VBI_TXT_PAGE_SIZE); - memset(priv_vbi->theader, 0, sizeof(priv_vbi->theader)); - if (priv_vbi->cache) { - for (i = 0; i < 1000; i++) { - if (priv_vbi->cache[i]) - free(priv_vbi->cache[i]); - priv_vbi->cache[i] = NULL; - } - } - snprintf(priv_vbi->header, sizeof(priv_vbi->header), "%s", - VBI_NO_TELETEXT); - pthread_mutex_unlock(&(priv_vbi->buffer_mutex)); -} - -/* ---------------------------------------------------------------------------------- - Public routines ---------------------------------------------------------------------------------- -*/ - -/** - * \brief teletext subsystem init - * \note Routine uses global variables tv_param_tdevice, tv_param_tpage - * and tv_param_tformat for initialization. - * - */ -priv_vbi_t *teletext_init(void) -{ - priv_vbi_t *priv_vbi; - int formatid, startpage; - unsigned int services = VBI_SLICED_TELETEXT_B | - VBI_SLICED_CAPTION_525 | - VBI_SLICED_CAPTION_625 | - VBI_SLICED_VBI_525 | - VBI_SLICED_VBI_625 | - VBI_SLICED_WSS_625 | - VBI_SLICED_WSS_CPR1204 | - VBI_SLICED_VPS; - - if (!tv_param_tdevice) - return NULL; - - if (NULL == (priv_vbi = malloc(sizeof(priv_vbi_t)))) - return NULL; - memset(priv_vbi, 0, sizeof(priv_vbi_t)); - formatid = VBI_TFORMAT_TEXT; // default - if (tv_param_tformat != NULL) { - if (strcmp(tv_param_tformat, "text") == 0) - formatid = VBI_TFORMAT_TEXT; - if (strcmp(tv_param_tformat, "bw") == 0) - formatid = VBI_TFORMAT_BW; - if (strcmp(tv_param_tformat, "gray") == 0) - formatid = VBI_TFORMAT_GRAY; - if (strcmp(tv_param_tformat, "color") == 0) - formatid = VBI_TFORMAT_COLOR; - } - startpage = steppage(0, tv_param_tpage); // page number is HEX - if (startpage < 0x100 || startpage > 0x999) - startpage = 0x100; - priv_vbi->device = strdup(tv_param_tdevice); - priv_vbi->tformat = formatid; - priv_vbi->tpage = startpage; // page number - priv_vbi->pgno = startpage; // page number - - - if (!priv_vbi->capture) { - priv_vbi->services = services; // probe v4l2 - priv_vbi->capture = vbi_capture_v4l2_new(priv_vbi->device, // device - 20, // buffer numbers - &(priv_vbi->services), // services - 0, // strict - &(priv_vbi->errstr), // error string - 0); // trace - } - services = priv_vbi->services; - if (priv_vbi->capture == NULL) { - priv_vbi->services = services; // probe v4l - priv_vbi->capture = vbi_capture_v4l_new(priv_vbi->device, - 20, - &(priv_vbi->services), - 0, &(priv_vbi->errstr), 0); - } - - if (!priv_vbi->capture) { - free(priv_vbi->device); - free(priv_vbi); - mp_msg(MSGT_TV, MSGL_INFO, "No teletext\n"); - return NULL; - } - return priv_vbi; -} - -/** - * \brief teletext subsystem uninitialization - * \param priv_vbi private data structure - * - * closes vbi capture, decode and and frees priv_vbi structure - * - */ -void teletext_uninit(priv_vbi_t * priv_vbi) -{ - int i; - if (priv_vbi == NULL) - return; - priv_vbi->eof = 1; - if (priv_vbi->capture){ - vbi_capture_delete(priv_vbi->capture); - priv_vbi->capture = NULL; - } - if (priv_vbi->decoder){ - vbi_event_handler_remove(priv_vbi->decoder, event_handler); - vbi_decoder_delete(priv_vbi->decoder); - priv_vbi->decoder = NULL; - } - if (priv_vbi->grabber_thread) - pthread_join(priv_vbi->grabber_thread, NULL); - pthread_mutex_destroy(&priv_vbi->buffer_mutex); - if (priv_vbi->device){ - free(priv_vbi->device); - priv_vbi->device = NULL; - } - if (priv_vbi->errstr){ - free(priv_vbi->errstr); - priv_vbi->errstr = NULL; - } - if (priv_vbi->canvas){ - free(priv_vbi->canvas); - priv_vbi->canvas = NULL; - } - if (priv_vbi->txtpage){ - free(priv_vbi->txtpage); - priv_vbi->txtpage = NULL; - } - if (priv_vbi->network_name){ - free(priv_vbi->network_name); - priv_vbi->network_name = NULL; - } - if (priv_vbi->network_id){ - free(priv_vbi->network_id); - priv_vbi->network_id = NULL; - } - if (priv_vbi->page){ - free(priv_vbi->page); - priv_vbi->page = NULL; - } - if (priv_vbi->cache) { - for (i = 0; i < 1000; i++) { - if (priv_vbi->cache[i]) - free(priv_vbi->cache[i]); - } - free(priv_vbi->cache); - priv_vbi->cache = NULL; - } - free(priv_vbi); -} - -/** - * \brief Teletext control routine - * \param priv_vbi private data structure - * \param cmd command - * \param arg command parameter (has to be not null) - * - */ -int teletext_control(priv_vbi_t * priv_vbi, int cmd, void *arg) -{ - vbi_page *page = NULL; - char *txtpage = NULL; - tv_teletext_img_t *img = NULL; - if (!priv_vbi) - return TVI_CONTROL_FALSE; - if (!arg) - return TVI_CONTROL_FALSE; - switch (cmd) { - case TVI_CONTROL_VBI_RESET: - vbi_reset(priv_vbi); - return TVI_CONTROL_TRUE; - case TVI_CONTROL_VBI_START: - vbi_start(priv_vbi); - return TVI_CONTROL_TRUE; - case TVI_CONTROL_VBI_GET_FORMAT: - pthread_mutex_lock(&(priv_vbi->buffer_mutex)); - *(int*)arg=priv_vbi->tformat; - pthread_mutex_unlock(&(priv_vbi->buffer_mutex)); - return TVI_CONTROL_TRUE; - case TVI_CONTROL_VBI_SET_MODE: - return teletext_set_mode(priv_vbi, *(int *) arg); - case TVI_CONTROL_VBI_GET_MODE: - pthread_mutex_lock(&(priv_vbi->buffer_mutex)); - *(int*)arg=priv_vbi->on; - pthread_mutex_unlock(&(priv_vbi->buffer_mutex)); - return TVI_CONTROL_TRUE; - case TVI_CONTROL_VBI_STEP_MODE: - { - int val; - pthread_mutex_lock(&(priv_vbi->buffer_mutex)); - val=(priv_vbi->on+*(int*)arg)%4; - pthread_mutex_unlock(&(priv_vbi->buffer_mutex)); - if (val<0) - val+=4; - return teletext_set_mode(priv_vbi,val); - } - case TVI_CONTROL_VBI_GET_HALF_PAGE: - *(void **) arg = (void *) vbi_get_half(priv_vbi); - return TVI_CONTROL_TRUE; - case TVI_CONTROL_VBI_SET_HALF_PAGE: - return teletext_set_half_page(priv_vbi, *(int *) arg); - case TVI_CONTROL_VBI_STEP_HALF_PAGE: - { - int val; - val=(vbi_get_half(priv_vbi)+*(int*)arg)%3; - - if (val<0) - val+=3; - return teletext_set_half_page(priv_vbi,val); - } - - case TVI_CONTROL_VBI_SET_PAGE: - vbi_setpage(priv_vbi, *(int *) arg, 0); - return TVI_CONTROL_TRUE; - case TVI_CONTROL_VBI_STEP_PAGE: - vbi_steppage(priv_vbi, *(int *) arg); - return TVI_CONTROL_TRUE; - case TVI_CONTROL_VBI_ADD_DEC: - vbi_add_dec(priv_vbi, *(char **) arg); - return TVI_CONTROL_TRUE; - case TVI_CONTROL_VBI_GO_LINK: - return vbi_golink(priv_vbi, *(int *) arg); - case TVI_CONTROL_VBI_GET_PAGE: - *(int*) arg = priv_vbi->pgno; - return TVI_CONTROL_TRUE; - case TVI_CONTROL_VBI_GET_VBIPAGE: - if (NULL == (page = vbi_getpage(priv_vbi))) - return TVI_CONTROL_FALSE; - *(void **) arg = (void *) page; - return TVI_CONTROL_TRUE; - case TVI_CONTROL_VBI_GET_TXTPAGE: - if (NULL == (txtpage = vbi_getpagetext(priv_vbi))) - return TVI_CONTROL_FALSE; - *(void **) arg = (void *) txtpage; - return TVI_CONTROL_TRUE; - case TVI_CONTROL_VBI_GET_IMGPAGE: - if (NULL == (img = vbi_getpageimg(priv_vbi))) - return TVI_CONTROL_FALSE; - *(void **) arg = (void *) img; - return TVI_CONTROL_TRUE; - } - return TVI_CONTROL_UNKNOWN; -}
--- a/stream/tvi_vbi.h Wed Jun 20 18:19:03 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -#ifndef __TVI_VBI_H_ -#define __TVI_VBI_H_ - -#include "libzvbi.h" -#include "libmpcodecs/img_format.h" -#include "libmpcodecs/mp_image.h" -#include "tv.h" - -#define VBI_MAX_SUBPAGES 64 ///< max sub pages number -#define VBI_TXT_PAGE_SIZE 42*25*2 ///< max text page size -#define VBI_MAX_LINE_SIZE 42 ///< max line size in text page - -#define VBI_TFORMAT_TEXT 0 ///< text mode -#define VBI_TFORMAT_BW 1 ///< back&white mode -#define VBI_TFORMAT_GRAY 2 ///< grayscale mode -#define VBI_TFORMAT_COLOR 3 ///< color mode (require color_spu patch!) - -#define VBI_NO_TELETEXT "No teletext" - -#define VBI_TRANSPARENT_COLOR 40 ///< transparent color id -#define VBI_TIME_LINEPOS 13 ///< time line pos in page header - -typedef struct { - int on; ///< teletext on/off - - char* device; ///< capture device - unsigned int services; ///< services - vbi_capture* capture; ///< vbi_capture - int capture_fd; ///< capture fd (now not used) - vbi_decoder* decoder; ///< vbi_decoder - char* errstr; ///< error string - pthread_t grabber_thread; ///< grab thread - pthread_mutex_t buffer_mutex; - pthread_mutex_t update_mutex; - int eof; ///< end grab - int tpage; ///< tpage - int pgno; ///< seek page number - int subno; ///< seek subpage - int curr_pgno; ///< current page number - int curr_subno; ///< current subpage - uint32_t pagenumdec; ///< set page num with dec - - vbi_page** cache; - vbi_page *page; ///< vbi_page - int valid_page; ///< valid page flag - char* txtpage; ///< decoded vbi_page to text - vbi_char theader[VBI_MAX_LINE_SIZE]; ///< vbi header - char header[VBI_MAX_LINE_SIZE]; ///< text header - - int tformat; ///< 0:text, 1:bw, 2:gray, 3:color - vbi_pixfmt fmt; ///< image format (only VBI_PIXFMT_RGBA32_LE supported) - void* canvas; ///< stored image data - int csize; ///< stored image size - int canvas_size; ///< image buffer size - int reveal; ///< reveal (now not used) - int flash_on; ///< flash_on (now not used) - int alpha; ///< opacity mode - int foreground; ///< foreground black in bw mode - int half; ///< 0:half mode off, 1:top half page, 2:bottom half page - int redraw; ///< is redraw last image - int columns; ///< page size: coloumns - int rows; ///< page size: rows - int spudec_proc; ///< render image request - - char* network_name; ///< network name - char* network_id; ///< network id - } priv_vbi_t; - -/// teletext subsystem initialization -priv_vbi_t* teletext_init(void); -/// teletext subsystem uninitialization -void teletext_uninit(priv_vbi_t* priv_vbi); -/// ioctl for -int teletext_control(priv_vbi_t* priv_vbi, int cmd, void *args); -#endif