]> git.tdb.fi Git - xinema.git/blobdiff - source/xinestream.cpp
Create an icon for the remote
[xinema.git] / source / xinestream.cpp
index 7317f7c8838449e8e901676ea4b8ebce4799760a..416902a3d7b835907ddc39ef0384a2a3369f7c85 100644 (file)
@@ -7,7 +7,12 @@ using namespace Msp;
 
 XineStream::XineStream(XineEngine &e, const string &mrl):
        engine(e),
+       filename(mrl.substr(mrl.rfind('/')+1)),
        state(STOPPED),
+       title(filename),
+       video_width(0),
+       video_height(0),
+       framerate(0.0f),
        current_audio(0),
        current_spu(OFF),
        channels_changed(false)
@@ -22,6 +27,11 @@ XineStream::XineStream(XineEngine &e, const string &mrl):
        engine.add_stream(*this);
 }
 
+const string &XineStream::get_title() const
+{
+       return title.empty() ? filename : title;
+}
+
 XineStream::~XineStream()
 {
        engine.remove_stream(*this);
@@ -113,14 +123,50 @@ void XineStream::tick()
        update_info();
 }
 
+bool XineStream::equals(const string &s1, const char *s2)
+{
+       if(!s2)
+               return s1.empty();
+       return !s1.compare(s2);
+}
+
 void XineStream::update_info()
 {
        const char *xt = xine_get_meta_info(stream, XINE_META_INFO_TITLE);
-       if((xt && title.compare(xt)) || (!xt && !title.empty()))
+       if(!equals(title, xt))
        {
                MutexLock lock(mutex);
                title = (xt ? xt : string());
-               signal_title_changed.emit(title);
+               signal_title_changed.emit(get_title());
+       }
+
+       unsigned w = xine_get_stream_info(stream, XINE_STREAM_INFO_VIDEO_WIDTH);
+       unsigned h = xine_get_stream_info(stream, XINE_STREAM_INFO_VIDEO_HEIGHT);
+       if(w!=video_width || h!=video_height)
+       {
+               MutexLock lock(mutex);
+               video_width = w;
+               video_height = h;
+               signal_video_size_changed.emit(video_width, video_height);
+       }
+
+       unsigned frame_dur = xine_get_stream_info(stream, XINE_STREAM_INFO_FRAME_DURATION);
+       float fps = (frame_dur ? 90000.0f/frame_dur : 0.0f);
+       if(fps!=framerate)
+       {
+               MutexLock lock(mutex);
+               framerate = fps;
+               signal_framerate_changed.emit(framerate);
+       }
+
+       const char *xvc = xine_get_meta_info(stream, XINE_META_INFO_VIDEOCODEC);
+       const char *xac = xine_get_meta_info(stream, XINE_META_INFO_AUDIOCODEC);
+       if(!equals(video_codec, xvc) || !equals(audio_codec, xac))
+       {
+               MutexLock lock(mutex);
+               video_codec = (xvc ? xvc : string());
+               audio_codec = (xac ? xac : string());
+               signal_codecs_changed.emit(video_codec, audio_codec);
        }
 
        int dur_msec, pos_msec;