summaryrefslogtreecommitdiffstats
path: root/kaffeine/src/player-parts/xine-part/kxinewidget.h
diff options
context:
space:
mode:
Diffstat (limited to 'kaffeine/src/player-parts/xine-part/kxinewidget.h')
-rw-r--r--kaffeine/src/player-parts/xine-part/kxinewidget.h518
1 files changed, 518 insertions, 0 deletions
diff --git a/kaffeine/src/player-parts/xine-part/kxinewidget.h b/kaffeine/src/player-parts/xine-part/kxinewidget.h
new file mode 100644
index 0000000..aac81b4
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/kxinewidget.h
@@ -0,0 +1,518 @@
+/*
+ * kxinewidget.h - a kde / qt api for xine-lib
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ * Copyright (C) 2005-2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef KXINEWIDGET_H
+#define KXINEWIDGET_H
+
+/* define this if you want to use QT only - disables post plugin support (except visualization)! */
+//#define USE_QT_ONLY 1
+
+/* Usage:
+ *
+ * KXineWidget m_xine = new KXineWidget(parent);
+ * m_xine->appendToQueue("the_best_song_of_the_world.mp3");
+ *
+ * You should at least connect to signalXineFatal(const QString&)!
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+/* forward declaration */
+class QWidget;
+class QString;
+class QStringList;
+class QMouseEvent;
+class QTimerEvent;
+class QTime;
+
+#include <qtimer.h>
+#include <qptrlist.h>
+#include <qthread.h>
+#include <X11/Xlib.h>
+#include <xine.h>
+
+
+#ifndef USE_QT_ONLY
+#include "postfilter.h"
+#else
+typedef int PostFilter; /* dummy type */
+#endif
+
+#ifdef HAVE_XCB
+#include <xcb/xcb.h>
+#endif
+
+#define SUPPORTED_PROTOCOLS "file,http,mms,mmst,rtsp,rtp,tcp,pnm,cdda,vcd,vcdo,dvd,dvb,pvr,v4l,net,vdr,smb"
+
+#define DEFAULT_TVTIME_CONFIG "tvtime:method=LinearBlend,enabled=1,pulldown=none,framerate_mode=half_top,judder_correction=0,use_progressive_frame_flag=1,chroma_filter=0,cheap_mode=1"
+
+#define DEFAULT_OSD_FONT_SIZE 18
+#define DEFAULT_OSD_DURATION 5000
+#define OSD_MESSAGE_LOW_PRIORITY 1
+#define OSD_MESSAGE_NORMAL_PRIORITY 2
+
+class KXineWidget : public QWidget, public QThread
+{
+
+ Q_OBJECT
+
+public:
+ KXineWidget(QWidget *parent=0, const char *name=0,
+ const QString& pathToConfigFile = QString::null, const QString& pathToLogoFile = QString::null,
+ const QString& audioDriver = QString::null, const QString& videoDriver = QString::null,
+ bool startManual = false, bool verbose = false);
+ ~KXineWidget();
+
+ enum Speed { Normal = 0, Pause, Fast1, Fast2, Slow1, Slow2, Undefined };
+
+ bool initXine(); /* call this only if you set startManual = true in the constructor */
+ bool isXineReady() const { return m_xineReady; }
+ bool isPlaying() const;
+ Speed getSpeed() const { return m_currentSpeed; }
+ QString getXineLog() const;
+
+ void setQueue(const QStringList& urls) { m_queue = urls; }
+ void appendToQueue(const QString& url) { m_queue.append(url); } /* file to play; call slotPlay() to play queue... */
+ void clearQueue() { m_queue.clear(); }
+ bool isQueueEmpty() const { return m_queue.empty(); }
+
+ void showOSDMessage(const QString& message, uint duration = DEFAULT_OSD_DURATION /* ms */, int priority = OSD_MESSAGE_NORMAL_PRIORITY);
+
+ /* stream info */
+ const QString& getURL() const { return m_trackURL; }
+ const QString& getTitle() const { return m_trackTitle; }
+ const QString& getArtist() const { return m_trackArtist; }
+ const QString& getAlbum() const { return m_trackAlbum; }
+ const QString& getTrackNumber() const { return m_trackNumber; } //may return an empty string with xine-lib 1.0
+ const QString& getGenre() const { return m_trackGenre; }
+ const QString& getYear() const { return m_trackYear; }
+ const QString& getComment() const { return m_trackComment; }
+ const QTime& getLength() const { return m_trackLength; }
+ const QString& getVideoCodec() const { return m_trackVideoCodec; }
+ QSize getVideoSize() const { return QSize(m_videoFrameWidth, m_videoFrameHeight); }
+ int getVideoWidth();
+ int getVideoHeight();
+ uint getVideoBitrate() const { return m_trackVideoBitrate; }
+ const QString& getAudioCodec() const { return m_trackAudioCodec; }
+ uint getAudioBitrate() const { return m_trackAudioBitrate; }
+ const QString& getSubtitleURL() const { return m_trackSubtitleURL; }
+ const QString& getSaveURL() const { return m_trackSaveURL; }
+ bool hasVideo() const { return m_trackHasVideo; }
+ bool hasAudio() const { return m_trackHasAudio; }
+ bool hasChapters() const { return m_trackHasChapters; }
+ bool hasSubtitleURL() const { return !m_trackSubtitleURL.isNull(); }
+ bool hasSaveURL() const { return !m_trackSaveURL.isNull(); }
+ bool isSeekable() const { return m_trackIsSeekable; }
+
+ uint getVolume() const; /* percent */
+ bool SoftwareMixing() const;
+ QTime getPlaytime() const;
+ uint getPosition() const; /* 0..65535 */
+
+ void savePosition(const int pos) { (pos > 0) ? m_savedPos = pos : m_savedPos = 0; }
+
+ /* plugin handling */
+ QStringList getAudioDrivers() const { return m_audioDriverList; }
+ QStringList getVideoDrivers() const { return m_videoDriverList; }
+ void getAutoplayPlugins(QStringList& pluginNames) const;
+ bool getAutoplayPluginURLS(const QString& name, QStringList& urls);
+ QStringList getVisualPlugins() const;
+
+#ifndef USE_QT_ONLY
+ void createDeinterlacePlugin(const QString& configString, QWidget* parent);
+ const QString getDeinterlaceConfig() const;
+ QStringList getVideoFilterNames() const;
+ QStringList getAudioFilterNames() const;
+ QStringList getAudioFilterConfig();
+ QStringList getVideoFilterConfig();
+#endif
+
+ QString getSupportedExtensions() const; /* get mime types xine can play */
+
+ void playNextChapter() const;
+ void playPreviousChapter() const;
+
+ /* config stuff */
+ void setStreamSaveDir(const QString& dir);
+ const QString getStreamSaveDir();
+ void setBroadcasterPort(const uint port);
+ void getVideoSettings(int& hue, int& sat, int& contrast, int& bright,
+ int& avOffset, int& spuOffset) const;
+ void getspuOffset(int& spuOffset) const;
+ /* disc drives devices*/
+ QString audiocdDevice() const;
+ QString vcdDevice() const;
+ QString dvdDevice() const;
+
+ /* dvd stuff */
+ uint currentDVDTitleNumber() const;
+ uint getDVDTitleCount() const;
+ uint currentDVDChapterNumber() const;
+ uint getDVDChapterCount() const;
+ uint currentDVDAngleNumber() const;
+ uint getDVDAngleCount() const;
+
+ /* take a screenshot */
+ QImage getScreenshot() const;
+ void getScreenshot(uchar*& rgb32BitData, int& videoWidth, int& videoHeight, double& scaleFactor) const;
+
+ /* get the xine engine, needed by the xine configuration dialog */
+ const xine_t* const getXineEngine() const;
+ void saveXineConfig();
+
+ /* for fullscreen */
+ void startMouseHideTimer();
+ void stopMouseHideTimer();
+
+ void globalPosChanged(); /* call this if global pos of parent was changed */
+
+signals:
+ void signalXineFatal(const QString& message); /** initXine() not successfull! **/
+ void signalXineError(const QString& message);
+ void signalXineMessage(const QString& message);
+ void signalXineStatus(const QString& status);
+ void signalXineReady();
+ void signalXinePlaying();
+
+ void signalHasChapters(bool);
+ void signalPlaybackFinished();
+ void signalNewChannels(const QStringList& audio, const QStringList& sub, int currentAudio, int currentSub);
+ void signalNewPosition(int, const QTime&);
+
+ void signalTitleChanged();
+ void signalVideoSizeChanged();
+ void signalLengthChanged();
+
+ void signalRightClick(const QPoint&); /* right-click on video window */
+ void signalLeftClick(const QPoint&);
+ void signalMiddleClick();
+ void signalDoubleClick();
+ void signalSyncVolume();
+
+ void signalDvbOSDHidden();
+
+public slots:
+ virtual void polish();
+
+ void slotPlay();
+ void slotStop();
+
+ void slotSetVolume(int);
+ void slotToggleMute();
+ void slotSpeedPause();
+ void slotSpeedNormal();
+ void slotSpeedFaster();
+ void slotSpeedSlower();
+ void slotSetVisualPlugin(const QString& name);
+ void slotSetAudioChannel(int);
+ void slotSetSubtitleChannel(int);
+ void slotSetFileSubtitles(QString);
+ void slotStartSeeking();
+ void slotSeekToPosition(int pos);
+ void slotSeekToPositionBlocking(int pos);
+ void slotSeekToTime(const QTime&);
+ void slotStopSeeking();
+ void slotEnableVideoFilters(bool enable);
+ void slotEnableAudioFilters(bool enable);
+ void slotEject();
+ void slotEnableAutoresize(bool enable);
+ void slotAspectRatioAuto();
+ void slotAspectRatio4_3();
+ void slotAspectRatioAnamorphic(); /* 16:9 */
+ void slotAspectRatioSquare(); /* 1:1 */
+ void slotAspectRatioDVB(); /* 2.11:1 */
+ void slotZoomIn();
+ void slotZoomOut();
+ void slotZoomOff();
+ void slotZoomOutX();
+ void slotZoomInX();
+ void slotZoomOutY();
+ void slotZoomInY();
+ void slotToggleDeinterlace();
+ void slotSetDeinterlaceConfig(const QString&);
+ void slotGetInfoDelayed();
+
+ /* disc drive devices */
+ void slotSetAudiocdDevice(const QString&);
+ void slotSetVcdDevice(const QString&);
+ void slotSetDvdDevice(const QString&);
+
+ void slotSetHue(int hue);
+ void slotSetSaturation(int sat);
+ void slotSetContrast(int contrast);
+ void slotSetBrightness(int bright);
+ void slotSetAVOffset(int av);
+ void slotSetSpuOffset(int spu);
+
+ void slotSetEq30(int val);
+ void slotSetEq60(int val);
+ void slotSetEq125(int val);
+ void slotSetEq250(int val);
+ void slotSetEq500(int val);
+ void slotSetEq1k(int val);
+ void slotSetEq2k(int val);
+ void slotSetEq4k(int val);
+ void slotSetEq8k(int val);
+ void slotSetEq16k(int val);
+ void slotSetVolumeGain(bool gain);
+
+ /* DVD Menus */
+ void slotMenuToggle();
+ void slotMenuTitle();
+ void slotMenuRoot();
+ void slotMenuSubpicture();
+ void slotMenuAudio();
+ void slotMenuAngle();
+ void slotMenuPart();
+ void slotDVDMenuLeft();
+ void slotDVDMenuRight();
+ void slotDVDMenuUp();
+ void slotDVDMenuDown();
+ void slotDVDMenuSelect();
+
+ /***** postprocess filters ****/
+ void slotCreateVideoFilter(const QString& name, QWidget* parent);
+ void slotCreateAudioFilter(const QString& name, QWidget* parent);
+ void slotDeleteVideoFilter(PostFilter* filter);
+ void slotDeleteAudioFilter(PostFilter* filter);
+ void slotRemoveAllVideoFilters();
+ void slotRemoveAllAudioFilters();
+
+protected slots:
+ void slotSendPosition();
+ void slotEmitLengthInfo();
+ void slotHideMouse();
+ void slotOSDHide();
+ void slotNoRecentMessage();
+
+protected:
+ void mouseMoveEvent(QMouseEvent*);
+ void mousePressEvent(QMouseEvent*);
+ void timerEvent(QTimerEvent*);
+ void mouseDoubleClickEvent(QMouseEvent*);
+ void wheelEvent(QWheelEvent*);
+ void initOSD();
+ virtual void run();
+
+private:
+#ifndef HAVE_XCB
+ bool x11Event(XEvent *);
+#else
+ void paintEvent(QPaintEvent *);
+#endif
+ bool unhandledStreamsPresent();
+
+ /********* callbacks and threads ************/
+ static void destSizeCallback(void* p, int video_width, int video_height, double video_aspect,
+ int* dest_width, int* dest_height, double* dest_aspect);
+
+ static void frameOutputCallback(void* p, int video_width, int video_height, double video_aspect,
+ int* dest_x, int* dest_y, int* dest_width, int* dest_height,
+ double* dest_aspect, int* win_x, int* win_y);
+
+ static void videoDriverChangedCallback(void* p, xine_cfg_entry_t* entry);
+ static void audioDriverChangedCallback(void* p, xine_cfg_entry_t* entry);
+ static void audioMixerMethodChangedCallback(void* p, xine_cfg_entry_t* entry);
+ static void showOSDMessagesChangedCallback(void* p, xine_cfg_entry_t* entry);
+ static void sizeForOSDMessagesChangedCallback(void* p, xine_cfg_entry_t* entry);
+ static void fontForOSDMessagesChangedCallback(void* p, xine_cfg_entry_t* entry);
+ static void monitorXResChangedCallback(void* p, xine_cfg_entry_t* entry);
+ static void monitorYResChangedCallback(void* p, xine_cfg_entry_t* entry);
+
+ static void xineEventListener(void* p, const xine_event_t*);
+
+protected:
+ void sendXineError();
+ QTime getLengthInfo();
+#ifndef USE_QT_ONLY
+ void wireVideoFilters();
+ void unwireVideoFilters();
+ void wireAudioFilters();
+ void unwireAudioFilters();
+#endif
+
+ /* HELPER FUNCTIONS */
+public:
+#ifdef USE_QT_ONLY
+ static QString i18n(const char *text);
+#endif
+ static void debugOut(QString);
+ static void errorOut(QString);
+ static void warningOut(QString);
+ static QTime msToTime(int msec);
+ static void yuy2Toyv12(uint8_t *y, uint8_t *u, uint8_t *v, uint8_t *input, int width, int height);
+ static uchar *yv12ToRgb(uint8_t *src_y, uint8_t *src_u, uint8_t *src_v, int width, int height);
+
+protected:
+ QStringList m_queue;
+
+ int seekThreadPos;
+ int seekThreadTime;
+ bool seekThreadPause;
+ bool m_startXineManual;
+ bool m_xineReady;
+ QString m_logoFile;
+ QString m_preferedAudio;
+ QString m_preferedVideo;
+ bool m_xineVerbose;
+ QString m_configFilePath;
+ QStringList m_audioDriverList;
+ QStringList m_videoDriverList;
+
+ /*x11*/
+#ifndef HAVE_XCB
+ Display *connection;
+#else
+ xcb_connection_t *connection;
+#endif
+
+ /*xine*/
+#ifndef HAVE_XCB
+ x11_visual_t m_x11Visual;
+#else
+ xcb_visual_t m_x11Visual;
+#endif
+ xine_t* m_xineEngine;
+ xine_audio_port_t* m_audioDriver;
+ xine_video_port_t* m_videoDriver;
+ xine_stream_t* m_xineStream;
+ xine_event_queue_t* m_eventQueue;
+ xine_osd_t* m_osd;
+ bool m_osdUnscaled;
+ bool m_osdShow;
+ int m_osdSize;
+ char* m_osdFont;
+ char** m_audioChoices;
+ char* m_audioInfo;
+ char** m_videoChoices;
+ char* m_videoInfo;
+ char* m_mixerInfo;
+ char* m_osdShowInfo;
+ char** m_osdSizeOptions;
+ char* m_osdSizeInfo;
+ char* m_osdFontInfo;
+ double monitorXRes, monitorYRes;
+ char *xResInfo;
+ char *yResInfo;
+
+#ifndef USE_QT_ONLY
+ /*postfilter*/
+ QPtrList<PostFilter> m_videoFilterList;
+ bool m_videoFiltersEnabled;
+ QPtrList<PostFilter> m_audioFilterList;
+ bool m_audioFiltersEnabled;
+ PostFilter* m_deinterlaceFilter;
+ bool m_deinterlaceEnabled;
+ PostFilter* m_visualPlugin;
+#else
+ xine_post_t* m_xinePost;
+ xine_post_out_t* m_postAudioSource;
+ xine_post_in_t* m_postInput;
+#endif
+
+ QString m_audioDriverName;
+ QString m_videoDriverName;
+ QString m_visualPluginName;
+
+ int m_videoFrameWidth;
+ int m_videoFrameHeight;
+ double m_videoAspect;
+ int m_globalX;
+ int m_globalY;
+
+ Speed m_currentSpeed;
+ QString m_xineMessage;
+ QString m_xineError;
+ QString m_statusString;
+ bool m_softwareMixer;
+ bool m_volumeGain;
+ double m_displayRatio;
+ QString m_cachedCDPath, m_cachedVCDPath, m_cachedDVDPath;
+ QSize m_newParentSize;
+ int m_currentZoom;
+ int m_currentZoomX, m_currentZoomY;
+ QStringList m_audioCh;
+ QStringList m_subCh;
+ int m_currentAudio, m_currentSub;
+ int m_savedPos;
+ bool m_autoresizeEnabled;
+ bool m_DVDButtonEntered;
+ QString m_newMRLReference;
+
+ QTimer m_posTimer;
+ QTimer m_lengthInfoTimer;
+ uint m_lengthInfoTries;
+ QTimer m_mouseHideTimer;
+ QTimer m_osdTimer;
+ QTimer m_recentMessagesTimer;
+
+ QString m_trackURL;
+ QString m_trackTitle;
+ QString m_trackArtist;
+ QString m_trackAlbum;
+ QString m_trackNumber;
+ QString m_trackGenre;
+ QString m_trackYear;
+ QString m_trackComment;
+ QTime m_trackLength;
+ QString m_trackVideoCodec;
+ uint m_trackVideoBitrate;
+ QString m_trackAudioCodec;
+ uint m_trackAudioBitrate;
+ QString m_trackSubtitleURL;
+ QString m_trackSaveURL;
+ bool m_trackHasVideo;
+ bool m_trackHasAudio;
+ bool m_trackHasChapters;
+ bool m_trackIsSeekable;
+
+ /* dvb */
+signals:
+ void stopDvb();
+
+public:
+ QString TimeShiftFilename;
+
+public slots:
+ void setDvb( const QString &pipeName, const QString &chanName, int haveVideo );
+ void setDvbCurrentNext( const QString &channelName, const QStringList &list );
+ bool openDvb();
+ bool playDvb();
+ void slotPlayTimeShift();
+ void dvbShowOSD();
+ void dvbHideOSD();
+
+private:
+ QString m_dvbChannelName;
+ bool m_dvbSaveTitle;
+ int dvbHaveVideo;
+ QTimer dvbOSDHideTimer;
+ xine_osd_t *dvbOSD;
+ QStringList dvbCurrentNext;
+ unsigned int dvbColor[256];
+ unsigned char dvbTrans[256];
+ void initDvbPalette();
+};
+
+#endif /* KXINEWIDGET_H */