You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
523 lines
16 KiB
523 lines
16 KiB
/*
|
|
* kxinewidget.h - a tde / tqt 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 TQt only - disables post plugin support (except visualization)! */
|
|
//#define USE_TQT_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 TQString&)!
|
|
*
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include <config.h>
|
|
#endif
|
|
|
|
/* forward declaration */
|
|
class TQWidget;
|
|
class TQString;
|
|
class TQStringList;
|
|
class TQMouseEvent;
|
|
class TQTimerEvent;
|
|
class TQTime;
|
|
|
|
#include <tqtimer.h>
|
|
#include <tqptrlist.h>
|
|
#include <tqthread.h>
|
|
#include <X11/Xlib.h>
|
|
#include <xine.h>
|
|
|
|
|
|
#ifndef USE_TQT_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 TQWidget, public TQThread
|
|
{
|
|
|
|
TQ_OBJECT
|
|
|
|
|
|
public:
|
|
KXineWidget(TQWidget *parent=0, const char *name=0,
|
|
const TQString& pathToConfigFile = TQString(), const TQString& pathToLogoFile = TQString(),
|
|
const TQString& audioDriver = TQString(), const TQString& videoDriver = TQString(),
|
|
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; }
|
|
TQString getXineLog() const;
|
|
|
|
void setQueue(const TQStringList& urls) { m_queue = urls; }
|
|
void appendToQueue(const TQString& 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 TQString& message, uint duration = DEFAULT_OSD_DURATION /* ms */, int priority = OSD_MESSAGE_NORMAL_PRIORITY);
|
|
|
|
/* stream info */
|
|
const TQString& getURL() const { return m_trackURL; }
|
|
const TQString& getTitle() const { return m_trackTitle; }
|
|
const TQString& getArtist() const { return m_trackArtist; }
|
|
const TQString& getAlbum() const { return m_trackAlbum; }
|
|
const TQString& getTrackNumber() const { return m_trackNumber; } //may return an empty string with xine-lib 1.0
|
|
const TQString& getGenre() const { return m_trackGenre; }
|
|
const TQString& getYear() const { return m_trackYear; }
|
|
const TQString& getComment() const { return m_trackComment; }
|
|
const TQTime& getLength() const { return m_trackLength; }
|
|
const TQString& getVideoCodec() const { return m_trackVideoCodec; }
|
|
TQSize getVideoSize() const { return TQSize(m_videoFrameWidth, m_videoFrameHeight); }
|
|
int getVideoWidth();
|
|
int getVideoHeight();
|
|
uint getVideoBitrate() const { return m_trackVideoBitrate; }
|
|
const TQString& getAudioCodec() const { return m_trackAudioCodec; }
|
|
uint getAudioBitrate() const { return m_trackAudioBitrate; }
|
|
const TQString& getSubtitleURL() const { return m_trackSubtitleURL; }
|
|
const TQString& 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;
|
|
TQTime getPlaytime() const;
|
|
uint getPosition() const; /* 0..65535 */
|
|
|
|
void savePosition(const int pos) { (pos > 0) ? m_savedPos = pos : m_savedPos = 0; }
|
|
|
|
/* plugin handling */
|
|
TQStringList getAudioDrivers() const { return m_audioDriverList; }
|
|
TQStringList getVideoDrivers() const { return m_videoDriverList; }
|
|
void getAutoplayPlugins(TQStringList& pluginNames) const;
|
|
bool getAutoplayPluginURLS(const TQString& name, TQStringList& urls);
|
|
TQStringList getVisualPlugins() const;
|
|
|
|
#ifndef USE_TQT_ONLY
|
|
void createDeinterlacePlugin(const TQString& configString, TQWidget* parent);
|
|
const TQString getDeinterlaceConfig() const;
|
|
TQStringList getVideoFilterNames() const;
|
|
TQStringList getAudioFilterNames() const;
|
|
TQStringList getAudioFilterConfig();
|
|
TQStringList getVideoFilterConfig();
|
|
#endif
|
|
|
|
TQString getSupportedExtensions() const; /* get mime types xine can play */
|
|
|
|
void playNextChapter() const;
|
|
void playPreviousChapter() const;
|
|
|
|
/* config stuff */
|
|
void setStreamSaveDir(const TQString& dir);
|
|
const TQString 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*/
|
|
TQString audiocdDevice() const;
|
|
TQString vcdDevice() const;
|
|
TQString 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 */
|
|
TQImage 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 TQString& message); /** initXine() not successfull! **/
|
|
void signalXineError(const TQString& message);
|
|
void signalXineMessage(const TQString& message);
|
|
void signalXineStatus(const TQString& status);
|
|
void signalXineReady();
|
|
void signalXinePlaying();
|
|
|
|
void signalHasChapters(bool);
|
|
void signalPlaybackFinished();
|
|
void signalNewChannels(const TQStringList& audio, const TQStringList& sub, int currentAudio, int currentSub);
|
|
void signalNewPosition(int, const TQTime&);
|
|
|
|
void signalTitleChanged();
|
|
void signalVideoSizeChanged();
|
|
void signalLengthChanged();
|
|
|
|
void signalRightClick(const TQPoint&); /* right-click on video window */
|
|
void signalLeftClick(const TQPoint&);
|
|
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 TQString& name);
|
|
void slotSetAudioChannel(int);
|
|
void slotSetSubtitleChannel(int);
|
|
void slotSetFileSubtitles(TQString);
|
|
void slotStartSeeking();
|
|
void slotSeekToPosition(int pos);
|
|
void slotSeekToPositionBlocking(int pos);
|
|
void slotSeekToTime(const TQTime&);
|
|
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 TQString&);
|
|
void slotGetInfoDelayed();
|
|
|
|
/* disc drive devices */
|
|
void slotSetAudiocdDevice(const TQString&);
|
|
void slotSetVcdDevice(const TQString&);
|
|
void slotSetDvdDevice(const TQString&);
|
|
|
|
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 TQString& name, TQWidget* parent);
|
|
void slotCreateAudioFilter(const TQString& name, TQWidget* 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(TQMouseEvent*);
|
|
void mousePressEvent(TQMouseEvent*);
|
|
void timerEvent(TQTimerEvent*);
|
|
void mouseDoubleClickEvent(TQMouseEvent*);
|
|
void wheelEvent(TQWheelEvent*);
|
|
void initOSD();
|
|
virtual void run();
|
|
|
|
static int makeVolumeLogarithmic(int volume);
|
|
|
|
static bool s_logarithmicVolume;
|
|
|
|
private:
|
|
#ifndef HAVE_XCB
|
|
bool x11Event(XEvent *);
|
|
#else
|
|
void paintEvent(TQPaintEvent *);
|
|
#endif
|
|
|
|
/********* 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();
|
|
TQTime getLengthInfo();
|
|
#ifndef USE_TQT_ONLY
|
|
void wireVideoFilters();
|
|
void unwireVideoFilters();
|
|
void wireAudioFilters();
|
|
void unwireAudioFilters();
|
|
#endif
|
|
|
|
/* HELPER FUNCTIONS */
|
|
public:
|
|
#ifdef USE_TQT_ONLY
|
|
static TQString i18n(const char *text);
|
|
#endif
|
|
static void debugOut(TQString);
|
|
static void errorOut(TQString);
|
|
static void warningOut(TQString);
|
|
static TQTime 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:
|
|
TQStringList m_queue;
|
|
|
|
int seekThreadPos;
|
|
int seekThreadTime;
|
|
bool seekThreadPause;
|
|
bool m_startXineManual;
|
|
bool m_xineReady;
|
|
TQString m_logoFile;
|
|
TQString m_preferedAudio;
|
|
TQString m_preferedVideo;
|
|
bool m_xineVerbose;
|
|
TQString m_configFilePath;
|
|
TQStringList m_audioDriverList;
|
|
TQStringList 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_TQT_ONLY
|
|
/*postfilter*/
|
|
TQPtrList<PostFilter> m_videoFilterList;
|
|
bool m_videoFiltersEnabled;
|
|
TQPtrList<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
|
|
|
|
TQString m_audioDriverName;
|
|
TQString m_videoDriverName;
|
|
TQString m_visualPluginName;
|
|
|
|
int m_videoFrameWidth;
|
|
int m_videoFrameHeight;
|
|
double m_videoAspect;
|
|
int m_globalX;
|
|
int m_globalY;
|
|
|
|
Speed m_currentSpeed;
|
|
TQString m_xineMessage;
|
|
TQString m_xineError;
|
|
TQString m_statusString;
|
|
bool m_softwareMixer;
|
|
bool m_volumeGain;
|
|
double m_displayRatio;
|
|
TQString m_cachedCDPath, m_cachedVCDPath, m_cachedDVDPath;
|
|
TQSize m_newParentSize;
|
|
int m_currentZoom;
|
|
int m_currentZoomX, m_currentZoomY;
|
|
TQStringList m_audioCh;
|
|
TQStringList m_subCh;
|
|
int m_currentAudio, m_currentSub;
|
|
int m_savedPos;
|
|
bool m_autoresizeEnabled;
|
|
bool m_DVDButtonEntered;
|
|
TQString m_newMRLReference;
|
|
|
|
TQTimer m_posTimer;
|
|
TQTimer m_lengthInfoTimer;
|
|
uint m_lengthInfoTries;
|
|
TQTimer m_mouseHideTimer;
|
|
TQTimer m_osdTimer;
|
|
TQTimer m_recentMessagesTimer;
|
|
|
|
TQString m_trackURL;
|
|
TQString m_trackTitle;
|
|
TQString m_trackArtist;
|
|
TQString m_trackAlbum;
|
|
TQString m_trackNumber;
|
|
TQString m_trackGenre;
|
|
TQString m_trackYear;
|
|
TQString m_trackComment;
|
|
TQTime m_trackLength;
|
|
TQString m_trackVideoCodec;
|
|
uint m_trackVideoBitrate;
|
|
TQString m_trackAudioCodec;
|
|
uint m_trackAudioBitrate;
|
|
TQString m_trackSubtitleURL;
|
|
TQString m_trackSaveURL;
|
|
bool m_trackHasVideo;
|
|
bool m_trackHasAudio;
|
|
bool m_trackHasChapters;
|
|
bool m_trackIsSeekable;
|
|
|
|
/* dvb */
|
|
signals:
|
|
void stopDvb();
|
|
|
|
public:
|
|
TQString TimeShiftFilename;
|
|
|
|
public slots:
|
|
void setDvb( const TQString &pipeName, const TQString &chanName, int haveVideo );
|
|
void setDvbCurrentNext( const TQString &channelName, const TQStringList &list );
|
|
bool openDvb();
|
|
bool playDvb();
|
|
void slotPlayTimeShift();
|
|
void dvbShowOSD();
|
|
void dvbHideOSD();
|
|
|
|
private:
|
|
TQString m_dvbChannelName;
|
|
bool m_dvbSaveTitle;
|
|
int dvbHaveVideo;
|
|
TQTimer dvbOSDHideTimer;
|
|
xine_osd_t *dvbOSD;
|
|
TQStringList dvbCurrentNext;
|
|
unsigned int dvbColor[256];
|
|
unsigned char dvbTrans[256];
|
|
void initDvbPalette();
|
|
};
|
|
|
|
#endif /* KXINEWIDGET_H */
|