# HG changeset patch # User ib # Date 1385728892 0 # Node ID 28ea255e40ce245eff0be24bfef8de58302b89d8 # Parent 7766530caa76d0a71a63494860a538b5ffb8ca25 Add support for TV/DVB to the GUI. Support is limited to a single (resp. the first) card. At the same time, add the new GUI option 'gui_tv_digital', the new GUI message 'evPlayTV' and the new GUI font symbol 'b'. Additionally, update the documentation. diff -r 7766530caa76 -r 28ea255e40ce Changelog --- a/Changelog Fri Nov 29 12:34:21 2013 +0000 +++ b/Changelog Fri Nov 29 12:41:32 2013 +0000 @@ -30,6 +30,9 @@ * Android: -wid is supported. This should allow using MPlayer in slave mode, a native window pointer needs to be passed as -wid. Untested. + GUI: + * Support for TV/DVB + 1.1: "We gave up on 1.0" Decoders: diff -r 7766530caa76 -r 28ea255e40ce DOCS/man/de/mplayer.1 --- a/DOCS/man/de/mplayer.1 Fri Nov 29 12:34:21 2013 +0000 +++ b/DOCS/man/de/mplayer.1 Fri Nov 29 12:41:32 2013 +0000 @@ -33,7 +33,7 @@ .\" Titel .\" -------------------------------------------------------------------------- . -.TH MPlayer 1 "03.03.2012" "Das MPlayer Projekt" +.TH MPlayer 1 "11.09.2013" "Das MPlayer Projekt" . .SH NAME mplayer \- Movie Player @@ -619,6 +619,7 @@ gui_main_pos_x, gui_main_pos_y, gui_save_pos (ja/nein), +gui_tv_digital (ja/nein), gui_video_out_pos_x, gui_video_out_pos_y, load_fullscreen (ja/nein), diff -r 7766530caa76 -r 28ea255e40ce DOCS/man/en/mplayer.1 --- a/DOCS/man/en/mplayer.1 Fri Nov 29 12:34:21 2013 +0000 +++ b/DOCS/man/en/mplayer.1 Fri Nov 29 12:41:32 2013 +0000 @@ -31,7 +31,7 @@ .\" Title .\" -------------------------------------------------------------------------- . -.TH MPlayer 1 "2012-03-03" "The MPlayer Project" "The Movie Player" +.TH MPlayer 1 "2013-11-19" "The MPlayer Project" "The Movie Player" . .SH NAME mplayer \- movie player @@ -603,6 +603,7 @@ gui_main_pos_x, gui_main_pos_y, gui_save_pos (yes/no), +gui_tv_digital (yes/no), gui_video_out_pos_x, gui_video_out_pos_y, load_fullscreen (yes/no), diff -r 7766530caa76 -r 28ea255e40ce DOCS/xml/de/skin.xml --- a/DOCS/xml/de/skin.xml Fri Nov 29 12:34:21 2013 +0000 +++ b/DOCS/xml/de/skin.xml Fri Nov 29 12:41:32 2013 +0000 @@ -926,6 +926,7 @@ vStream ist eine Video-CD dStream ist eine DVD uStream ist eine URL + bStream ist eine TV/DVB-Übertragung @@ -1086,6 +1087,15 @@ + evPlayTV + + + Versucht die TV/DVB-Wiedergabe zu beginnen. + + + + + evPlaySwitchToPause diff -r 7766530caa76 -r 28ea255e40ce DOCS/xml/en/skin.xml --- a/DOCS/xml/en/skin.xml Fri Nov 29 12:34:21 2013 +0000 +++ b/DOCS/xml/en/skin.xml Fri Nov 29 12:41:32 2013 +0000 @@ -795,6 +795,7 @@ vstream is a Video CD dstream is a DVD ustream is a URL + bstream is a TV/DVB broadcast @@ -931,6 +932,13 @@ + evPlayTV + + Tries to start TV/DVB broadcast. + + + + evPlaySwitchToPause The opposite of evPauseSwitchToPlay. This message starts diff -r 7766530caa76 -r 28ea255e40ce gui/app/app.c --- a/gui/app/app.c Fri Nov 29 12:34:21 2013 +0000 +++ b/gui/app/app.c Fri Nov 29 12:41:32 2013 +0000 @@ -57,6 +57,7 @@ { evPlayDVD, "evPlayDVD" }, { evLoadURL, "evSetURL" }, // legacy { evLoadURL, "evLoadURL" }, + { evPlayTV, "evPlayTV" }, { evPlaySwitchToPause, "evPlaySwitchToPause" }, { evPauseSwitchToPlay, "evPauseSwitchToPlay" }, { evBackward10sec, "evBackward10sec" }, diff -r 7766530caa76 -r 28ea255e40ce gui/app/app.h --- a/gui/app/app.h Fri Nov 29 12:34:21 2013 +0000 +++ b/gui/app/app.h Fri Nov 29 12:41:32 2013 +0000 @@ -40,6 +40,7 @@ evPlayVCD, evPlayDVD, evLoadURL, + evPlayTV, evPlaySwitchToPause, evPauseSwitchToPlay, evBackward10sec, diff -r 7766530caa76 -r 28ea255e40ce gui/app/cfg.c --- a/gui/app/cfg.c Fri Nov 29 12:34:21 2013 +0000 +++ b/gui/app/cfg.c Fri Nov 29 12:41:32 2013 +0000 @@ -45,6 +45,11 @@ #include "sub/font_load.h" #include "sub/sub.h" +guiTV_t guiTV[2] = { + { STREAMTYPE_TV, "tv" }, + { STREAMTYPE_DVB, "dvb" } +}; + m_config_t *gui_conf; int gtkCacheOn; @@ -93,6 +98,8 @@ int gui_video_pos_x = -3; int gui_video_pos_y = -3; +int gui_tv_digital = True; + int guiWinID = -1; char *skinName; @@ -174,6 +181,10 @@ { "idle", &player_idle_mode, CONF_TYPE_FLAG, CONF_GLOBAL, 0, 1, NULL }, +#ifdef CONFIG_TV + { "gui_tv_digital", &gui_tv_digital, CONF_TYPE_FLAG, 0, 0, 1, NULL }, +#endif + // NOTE TO MYSELF: Do we really need all/any non-gtkOptions, i.e. override mplayer options? { "gui_skin", &skinName, CONF_TYPE_STRING, 0, 0, 0, NULL }, diff -r 7766530caa76 -r 28ea255e40ce gui/app/cfg.h --- a/gui/app/cfg.h Fri Nov 29 12:34:21 2013 +0000 +++ b/gui/app/cfg.h Fri Nov 29 12:41:32 2013 +0000 @@ -22,6 +22,13 @@ #include "m_config.h" #include "m_option.h" +typedef struct { + int StreamType; + char *SchemeName; +} guiTV_t; + +extern guiTV_t guiTV[2]; + extern m_config_t *gui_conf; extern int gtkCacheOn; @@ -82,6 +89,7 @@ extern int gui_main_pos_y; extern int gui_video_pos_x; extern int gui_video_pos_y; +extern int gui_tv_digital; extern int guiWinID; diff -r 7766530caa76 -r 28ea255e40ce gui/app/gui.h --- a/gui/app/gui.h Fri Nov 29 12:34:21 2013 +0000 +++ b/gui/app/gui.h Fri Nov 29 12:41:32 2013 +0000 @@ -41,6 +41,9 @@ /// StreamTypes that are permitted in a playlist #define isPlaylistStreamtype (guiInfo.StreamType == STREAMTYPE_FILE || guiInfo.StreamType == STREAMTYPE_STREAM) +/// StreamTypes that permit seeking +#define isSeekableStreamtype (guiInfo.StreamType != STREAMTYPE_STREAM && guiInfo.StreamType != STREAMTYPE_TV && guiInfo.StreamType != STREAMTYPE_DVB) + /// Check whether @a x/y is inside the rectangle given by @a top @a x/y and @a bottom @a x/y. #define isInside(x, y, tx, ty, bx, by) ((x) > (tx) && (y) > (ty) && (x) < (bx) && (y) < (by)) diff -r 7766530caa76 -r 28ea255e40ce gui/dialog/menu.c --- a/gui/dialog/menu.c Fri Nov 29 12:34:21 2013 +0000 +++ b/gui/dialog/menu.c Fri Nov 29 12:41:32 2013 +0000 @@ -86,6 +86,9 @@ #include "pixmaps/audiolang.xpm" #include "pixmaps/sublang.xpm" #endif +#ifdef CONFIG_TV +#include "pixmaps/tv.xpm" +#endif #include "pixmaps/empty1px.xpm" int gtkPopupMenu; @@ -561,6 +564,9 @@ } #endif AddMenuItem( window1, (const char*)url_xpm, SubMenu,MSGTR_MENU_PlayURL, evLoadURL ); +#ifdef CONFIG_TV + AddMenuItem( window1, (const char*)tv_xpm, SubMenu,MSGTR_MENU_PlayTV, evPlayTV ); +#endif AddMenuItem( window1, (const char*)sub_xpm, SubMenu,MSGTR_MENU_LoadSubtitle" ", evLoadSubtitle ); AddMenuItem( window1, (const char*)nosub_xpm, SubMenu,MSGTR_MENU_DropSubtitle,evDropSubtitle ); AddMenuItem( window1, (const char*)loadeaf_xpm, SubMenu,MSGTR_MENU_LoadExternAudioFile, evLoadAudioFile ); diff -r 7766530caa76 -r 28ea255e40ce gui/dialog/pixmaps/tv.xpm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gui/dialog/pixmaps/tv.xpm Fri Nov 29 12:41:32 2013 +0000 @@ -0,0 +1,28 @@ +/* XPM */ +static const char * const tv_xpm[] = { +"16 16 8 1", +" c #000000", +"! c #FFFFFF", +"# c #666666", +"$ c #999999", +"% c #B3B3B3", +"& c #CCCCCC", +"' c #E6E6E6", +"( c None", +"((((((((((((((((", +"((((((((((((((((", +"( (", +" !!!!!!!!!!!! ", +" ! ! ", +" ! #$%&''&%$# ! ", +" ! #$%&!!&%$# ! ", +" ! #$%&!!&%$# ! ", +" ! #$%&!!&%$# ! ", +" ! #$%&!!&%$# ! ", +" ! #$%&''&%$# ! ", +" ! ! ", +" !!!!!!!!!!!! ", +"( (", +"((((((((((((((((", +"((((((((((((((((" +}; diff -r 7766530caa76 -r 28ea255e40ce gui/dialog/preferences.c --- a/gui/dialog/preferences.c Fri Nov 29 12:34:21 2013 +0000 +++ b/gui/dialog/preferences.c Fri Nov 29 12:41:32 2013 +0000 @@ -108,6 +108,7 @@ static GtkWidget * CBStopXScreenSaver; static GtkWidget * CBPlayBar; static GtkWidget * CBNoIdle; +static GtkWidget * CBTVDigital; static GtkWidget * SBCache; static GtkAdjustment * SBCacheadj; @@ -333,6 +334,7 @@ gtkShowVideoWindow=gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( CBShowVideoWindow ) ); stop_xscreensaver=gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( CBStopXScreenSaver ) ); gtkEnablePlayBar=gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( CBPlayBar ) ); + gui_tv_digital=gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( CBTVDigital ) ); player_idle_mode=!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( CBNoIdle ) ); mplayer( MPLAYER_SET_AUTO_QUALITY,HSPPQualityadj->value,0 ); @@ -967,6 +969,7 @@ CBSaveWinPos=gtkAddCheckButton( MSGTR_PREFERENCES_SaveWinPos,vbox602 ); CBStopXScreenSaver=gtkAddCheckButton( MSGTR_PREFERENCES_XSCREENSAVER,vbox602 ); CBPlayBar=gtkAddCheckButton( MSGTR_PREFERENCES_PlayBar,vbox602 ); + CBTVDigital=gtkAddCheckButton( MSGTR_PREFERENCES_TV_Digital,vbox602 ); CBNoIdle=gtkAddCheckButton( MSGTR_PREFERENCES_NoIdle,vbox602 ); gtkAddHSeparator( vbox602 ); @@ -1272,6 +1275,10 @@ gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( CBPlayBar ),0 ); gtk_widget_set_sensitive( CBPlayBar,FALSE ); } + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( CBTVDigital ),gui_tv_digital ); +#ifndef CONFIG_TV + gtk_widget_set_sensitive( CBTVDigital,FALSE ); +#endif gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( CBNoIdle ),!player_idle_mode ); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( CBCache ),0 ); diff -r 7766530caa76 -r 28ea255e40ce gui/interface.c --- a/gui/interface.c Fri Nov 29 12:34:21 2013 +0000 +++ b/gui/interface.c Fri Nov 29 12:41:32 2013 +0000 @@ -23,6 +23,7 @@ #include "interface.h" #include "app/app.h" +#include "app/cfg.h" #include "app/gui.h" #include "dialog/dialog.h" #include "skin/skin.h" @@ -437,6 +438,15 @@ dvd_angle = guiInfo.Angle; #endif break; + + case STREAMTYPE_TV: + case STREAMTYPE_DVB: + { + char tmp[512]; + + sprintf(tmp, "%s://", guiTV[gui_tv_digital].SchemeName); + uiSetFile(NULL, tmp, SAME_STREAMTYPE); + } } /* video opts */ @@ -632,6 +642,11 @@ memcpy(guiInfo.Subtitle, dvd->subtitles, sizeof(dvd->subtitles)); #endif break; + + case STREAMTYPE_TV: + case STREAMTYPE_DVB: + guiInfo.Tracks = 1; + break; } break; @@ -652,7 +667,7 @@ if (guiInfo.sh_video) guiInfo.CodecName = strdup(guiInfo.sh_video->codec->name); - state = (guiInfo.StreamType == STREAMTYPE_STREAM ? btnDisabled : btnReleased); + state = (isSeekableStreamtype ? btnReleased : btnDisabled); btnSet(evForward10sec, state); btnSet(evBackward10sec, state); btnSet(evForward1min, state); diff -r 7766530caa76 -r 28ea255e40ce gui/ui/actions.c --- a/gui/ui/actions.c Fri Nov 29 12:34:21 2013 +0000 +++ b/gui/ui/actions.c Fri Nov 29 12:41:32 2013 +0000 @@ -76,6 +76,8 @@ case STREAMTYPE_CDDA: case STREAMTYPE_VCD: + case STREAMTYPE_TV: + case STREAMTYPE_DVB: listMgr(PLAYLIST_DELETE, 0); case STREAMTYPE_FILE: case STREAMTYPE_STREAM: @@ -175,6 +177,12 @@ goto play; #endif +#ifdef CONFIG_TV + case evPlayTV: + guiInfo.StreamType = guiTV[gui_tv_digital].StreamType; + goto play; + +#endif case evPlay: case evPlaySwitchToPause: play: @@ -198,6 +206,8 @@ case STREAMTYPE_CDDA: case STREAMTYPE_VCD: case STREAMTYPE_DVD: + case STREAMTYPE_TV: + case STREAMTYPE_DVB: if (!guiInfo.Track) guiInfo.Track = (guiInfo.StreamType == STREAMTYPE_VCD ? 2 : 1); @@ -507,6 +517,8 @@ if (guiInfo.StreamType != STREAMTYPE_CDDA && guiInfo.StreamType != STREAMTYPE_VCD && guiInfo.StreamType != STREAMTYPE_DVD && + guiInfo.StreamType != STREAMTYPE_TV && + guiInfo.StreamType != STREAMTYPE_DVB && (!guiInfo.Filename || (guiInfo.Filename[0] == 0))) return; @@ -721,6 +733,8 @@ case STREAMTYPE_CDDA: case STREAMTYPE_VCD: case STREAMTYPE_DVD: + case STREAMTYPE_TV: + case STREAMTYPE_DVB: break; @@ -786,6 +800,14 @@ break; + case STREAMTYPE_TV: + case STREAMTYPE_DVB: + + if (guiInfo.Playing == GUI_PLAY) + mp_input_queue_cmd(mp_input_parse_cmd("tv_step_channel -1")); + + return; + default: prev = listMgr(PLAYLIST_ITEM_GET_PREV, 0); @@ -846,6 +868,14 @@ break; + case STREAMTYPE_TV: + case STREAMTYPE_DVB: + + if (guiInfo.Playing == GUI_PLAY) + mp_input_queue_cmd(mp_input_parse_cmd("tv_step_channel 1")); + + return; + default: next = listMgr(PLAYLIST_ITEM_GET_NEXT, 0); diff -r 7766530caa76 -r 28ea255e40ce gui/ui/render.c --- a/gui/ui/render.c Fri Nov 29 12:34:21 2013 +0000 +++ b/gui/ui/render.c Fri Nov 29 12:41:32 2013 +0000 @@ -216,6 +216,11 @@ av_strlcat(trbuf, "d", sizeof(trbuf)); break; + case STREAMTYPE_TV: + case STREAMTYPE_DVB: + av_strlcat(trbuf, "b", sizeof(trbuf)); + break; + default: av_strlcat(trbuf, " ", sizeof(trbuf)); break; diff -r 7766530caa76 -r 28ea255e40ce gui/util/string.c --- a/gui/util/string.c Fri Nov 29 12:34:21 2013 +0000 +++ b/gui/util/string.c Fri Nov 29 12:41:32 2013 +0000 @@ -325,6 +325,17 @@ break; + case STREAMTYPE_TV: + case STREAMTYPE_DVB: + + p = MSGTR_NoChannelName; + + if (guiInfo.mpcontext->stream) + stream_control(guiInfo.mpcontext->stream, STREAM_CTRL_GET_CURRENT_CHANNEL, &p); + + av_strlcpy(fname, p, maxlen); + break; + default: av_strlcpy(fname, MSGTR_NoMediaOpened, maxlen); diff -r 7766530caa76 -r 28ea255e40ce gui/win32/skinload.c --- a/gui/win32/skinload.c Fri Nov 29 12:34:21 2013 +0000 +++ b/gui/win32/skinload.c Fri Nov 29 12:41:32 2013 +0000 @@ -62,6 +62,7 @@ { evPlayDVD, "evPlayDVD" }, { evLoadURL, "evSetURL" }, // legacy { evLoadURL, "evLoadURL" }, + { evPlayTV, "evPlayTV" }, { evPlaySwitchToPause, "evPlaySwitchToPause" }, { evPauseSwitchToPlay, "evPauseSwitchToPlay" }, { evBackward10sec, "evBackward10sec" }, diff -r 7766530caa76 -r 28ea255e40ce gui/win32/skinload.h --- a/gui/win32/skinload.h Fri Nov 29 12:34:21 2013 +0000 +++ b/gui/win32/skinload.h Fri Nov 29 12:41:32 2013 +0000 @@ -150,6 +150,7 @@ evPlayVCD, evPlayDVD, evLoadURL, + evPlayTV, evPlaySwitchToPause, evPauseSwitchToPlay, evBackward10sec, diff -r 7766530caa76 -r 28ea255e40ce help/help_mp-de.h --- a/help/help_mp-de.h Fri Nov 29 12:34:21 2013 +0000 +++ b/help/help_mp-de.h Fri Nov 29 12:41:32 2013 +0000 @@ -763,6 +763,7 @@ #define MSGTR_Title "Titel %d" #define MSGTR_NoChapter "Kein Kapitel" #define MSGTR_Chapter "Kapitel %d" +#define MSGTR_NoChannelName "Kein Sendername" #define MSGTR_NoFileLoaded "Keine Datei geladen." #define MSGTR_Filter_UTF8Subtitles "UTF-8 kodierte Untertitel (*.utf, *.utf-8, *.utf8)" #define MSGTR_Filter_AllSubtitles "Alle Untertitel" @@ -847,6 +848,7 @@ #define MSGTR_MENU_PlayVCD "Spiele VCD..." #define MSGTR_MENU_PlayDVD "Spiele DVD..." #define MSGTR_MENU_PlayURL "Spiele URL..." +#define MSGTR_MENU_PlayTV "Spiele TV..." #define MSGTR_MENU_LoadSubtitle "Lade Untertitel..." #define MSGTR_MENU_DropSubtitle "Entferne Untertitel..." #define MSGTR_MENU_LoadExternAudioFile "Lade externe Audiodatei..." @@ -1015,6 +1017,7 @@ #define MSGTR_PREFERENCES_SaveWinPos "Speichere Fensterposition" #define MSGTR_PREFERENCES_XSCREENSAVER "Deaktiviere XScreenSaver" #define MSGTR_PREFERENCES_PlayBar "Aktiviere die Playbar" +#define MSGTR_PREFERENCES_TV_Digital "Digitaler TV-Empfang" #define MSGTR_PREFERENCES_NoIdle "Programm nach der Wiedergabe beenden" #define MSGTR_PREFERENCES_AutoSync "AutoSync ein/aus" #define MSGTR_PREFERENCES_AutoSyncValue "Autosyncwert: " diff -r 7766530caa76 -r 28ea255e40ce help/help_mp-en.h --- a/help/help_mp-en.h Fri Nov 29 12:34:21 2013 +0000 +++ b/help/help_mp-en.h Fri Nov 29 12:41:32 2013 +0000 @@ -557,6 +557,7 @@ #define MSGTR_Title "Title %d" #define MSGTR_NoChapter "No chapter" #define MSGTR_Chapter "Chapter %d" +#define MSGTR_NoChannelName "No channel name" #define MSGTR_NoFileLoaded "No file loaded." #define MSGTR_Filter_UTF8Subtitles "UTF-8 encoded subtitles (*.utf, *.utf-8, *.utf8)" #define MSGTR_Filter_AllSubtitles "All subtitles" @@ -641,6 +642,7 @@ #define MSGTR_MENU_PlayVCD "Play VCD..." #define MSGTR_MENU_PlayDVD "Play DVD..." #define MSGTR_MENU_PlayURL "Play URL..." +#define MSGTR_MENU_PlayTV "Play TV..." #define MSGTR_MENU_LoadSubtitle "Load subtitle..." #define MSGTR_MENU_DropSubtitle "Drop subtitle..." #define MSGTR_MENU_LoadExternAudioFile "Load external audio file..." @@ -808,6 +810,7 @@ #define MSGTR_PREFERENCES_SaveWinPos "Save window position" #define MSGTR_PREFERENCES_XSCREENSAVER "Stop XScreenSaver" #define MSGTR_PREFERENCES_PlayBar "Enable playbar" +#define MSGTR_PREFERENCES_TV_Digital "Digital TV reception" #define MSGTR_PREFERENCES_NoIdle "Quit after playing" #define MSGTR_PREFERENCES_AutoSync "AutoSync on/off" #define MSGTR_PREFERENCES_AutoSyncValue "Autosync: "