1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
// (C) 2005 Max Howell (max.howell@methylblue.com)
// See COPYING file for licensing information
#include <kurl.h>
#include "../mxcl.library.h"
#include "theStream.h"
#include "xineEngine.h"
namespace Codeine
{
#define e VideoWindow::s_instance
TDEConfig*
TheStream::profile()
{
//TODO a unique id for discs, and then even to also record chapters etc.
// if( url().protocol() == "dvd" )
// return Codeine::config( TQString( "dvd:/" ) + prettyTitle() );
// else
return Codeine::config( url().prettyURL() );
}
const KURL&
TheStream::url()
{ return e->m_url; }
bool
TheStream::canSeek()
//FIXME!
{ return e->m_url.protocol() != "http"; }
bool
TheStream::hasAudio()
{ return xine_get_stream_info( e->m_stream, XINE_STREAM_INFO_HAS_AUDIO ); }
bool
TheStream::hasVideo()
{ return xine_get_stream_info( e->m_stream, XINE_STREAM_INFO_HAS_VIDEO ); }
TQSize
TheStream::defaultVideoSize()
{
return !e->m_stream
? TQSize()
: TQSize(
xine_get_stream_info( e->m_stream, XINE_STREAM_INFO_VIDEO_WIDTH ),
xine_get_stream_info( e->m_stream, XINE_STREAM_INFO_VIDEO_HEIGHT ) );
}
int TheStream::aspectRatio()
{ return xine_get_param( e->m_stream, XINE_PARAM_VO_ASPECT_RATIO ); }
int TheStream::subtitleChannel()
{ return xine_get_param( e->m_stream, XINE_PARAM_SPU_CHANNEL ); }
int TheStream::audioChannel()
{ return xine_get_param( e->m_stream, XINE_PARAM_AUDIO_CHANNEL_LOGICAL ); }
TQString
TheStream::prettyTitle()
{
const KURL &url = e->m_url;
const TQString artist = TQString::fromUtf8( xine_get_meta_info( e->m_stream, XINE_META_INFO_ARTIST ) );
const TQString title = TQString::fromUtf8( xine_get_meta_info( e->m_stream, XINE_META_INFO_TITLE ) );
if (hasVideo() && !title.isEmpty())
return title;
else if (!title.isEmpty() && !artist.isEmpty())
return artist + " - " + title;
else if (url.protocol() != "http" && !url.fileName().isEmpty()) {
const TQString n = url.fileName();
return KURL::decode_string( n.left( n.findRev( '.' ) ).replace( '_', ' ' ) ); }
else
return url.prettyURL();
}
TQMap<MetaData, TQString> TheStream::metaData()
{
#define xmeta(x) xine_get_meta_info(e->m_stream, (x))
TQMap<MetaData, TQString> data;
data[MetaData::Title] = xmeta(XINE_META_INFO_TITLE);
data[MetaData::Comment] = xmeta(XINE_META_INFO_COMMENT);
data[MetaData::Artist] = xmeta(XINE_META_INFO_ARTIST);
data[MetaData::Genre] = xmeta(XINE_META_INFO_GENRE);
data[MetaData::Album] = xmeta(XINE_META_INFO_ALBUM);
data[MetaData::Year] = xmeta(XINE_META_INFO_YEAR);
data[MetaData::VideoCodec] = xmeta(XINE_META_INFO_VIDEOCODEC);
data[MetaData::AudioCodec] = xmeta(XINE_META_INFO_AUDIOCODEC);
return data;
#undef xmeta
}
TQMap<StreamInfo, TQString> TheStream::info()
{
#define xinfo(x) TQString::number(xine_get_stream_info(e->m_stream, (x)))
TQMap<StreamInfo, TQString> data;
data[StreamInfo::VideoWidth] = xinfo(XINE_STREAM_INFO_VIDEO_WIDTH);
data[StreamInfo::VideoHeight] = xinfo(XINE_STREAM_INFO_VIDEO_HEIGHT);
data[StreamInfo::VideoBitRate] = xinfo(XINE_STREAM_INFO_VIDEO_BITRATE);
data[StreamInfo::AudioBits] = xinfo(XINE_STREAM_INFO_AUDIO_BITS);
data[StreamInfo::AudioSampleRate] = xinfo(XINE_STREAM_INFO_AUDIO_SAMPLERATE);
data[StreamInfo::AudioBitRate] = xinfo(XINE_STREAM_INFO_AUDIO_BITRATE);
return data;
#undef xinfo
}
#undef e
}
|