[vlc-commits] [Git][videolan/vlc][master] 4 commits: qt: don't return invalid time/duration as subSecond/subHour

Felix Paul Kühne (@fkuehne) gitlab at videolan.org
Sat Nov 29 07:38:27 UTC 2025



Felix Paul Kühne pushed to branch master at VideoLAN / VLC


Commits:
f65deb4f by Pierre Lamot at 2025-11-29T08:12:40+01:00
qt: don't return invalid time/duration as subSecond/subHour

- - - - -
a25dc910 by Pierre Lamot at 2025-11-29T08:12:40+01:00
qt: distinguish invalid durations

- - - - -
556b217f by Pierre Lamot at 2025-11-29T08:12:40+01:00
qt: add arithmetic operators to VLCDuration

- - - - -
310b6683 by Pierre Lamot at 2025-11-29T08:12:40+01:00
qt: store playlist item duration as VLCDuration

- - - - -


8 changed files:

- modules/gui/qt/Makefile.am
- modules/gui/qt/meson.build
- modules/gui/qt/playlist/playlist_item.cpp
- modules/gui/qt/playlist/playlist_item.hpp
- modules/gui/qt/playlist/playlist_model.cpp
- modules/gui/qt/playlist/playlist_model_p.hpp
- modules/gui/qt/util/vlctick.cpp
- modules/gui/qt/util/vlctick.hpp


Changes:

=====================================
modules/gui/qt/Makefile.am
=====================================
@@ -1623,6 +1623,7 @@ test_ml_model_SOURCES = \
 	tests/test_ml_model.cpp \
 	util/base_model.hpp util/base_model_p.hpp  util/base_model.cpp \
 	util/listcache.hpp \
+	util/vlctick.cpp util/vlctick.hpp \
 	util/locallistcacheloader.hpp \
 	medialibrary/mlqmltypes.hpp \
 	medialibrary/mlbasemodel.hpp medialibrary/mlbasemodel.cpp \
@@ -1636,6 +1637,7 @@ nodist_test_ml_model_SOURCES = \
 	util/base_model.moc.cpp \
 	util/listcache.moc.cpp \
 	util/locallistcacheloader.moc.cpp \
+	util/vlctick.moc.cpp \
 	medialibrary/mlqmltypes.moc.cpp \
 	medialibrary/mlbasemodel.moc.cpp \
 	medialibrary/medialib.moc.cpp \


=====================================
modules/gui/qt/meson.build
=====================================
@@ -1195,6 +1195,7 @@ if qt6_dep.found()
                 'tests/test_ml_model.cpp',
                 'tests/vlc_stub_modules.cpp',
                 'util/base_model.cpp',
+                'util/vlctick.cpp',
                 'medialibrary/mlbasemodel.cpp',
                 'medialibrary/medialib.cpp',
                 'medialibrary/mlthreadpool.cpp',
@@ -1206,15 +1207,16 @@ if qt6_dep.found()
             ),
             'moc_headers': files(
                 'tests/vlc_stub_modules.cpp',
-	            'util/base_model.hpp',
-	            'util/listcache.hpp',
-	            'util/locallistcacheloader.hpp',
-	            'medialibrary/mlqmltypes.hpp',
-	            'medialibrary/mlbasemodel.hpp',
-	            'medialibrary/medialib.hpp',
-	            'medialibrary/mlthreadpool.hpp',
-	            'playlist/playlist_controller.hpp',
-	            'playlist/playlist_item.hpp',
+                'util/base_model.hpp',
+                'util/listcache.hpp',
+                'util/locallistcacheloader.hpp',
+                'util/vlctick.hpp',
+                'medialibrary/mlqmltypes.hpp',
+                'medialibrary/mlbasemodel.hpp',
+                'medialibrary/medialib.hpp',
+                'medialibrary/mlthreadpool.hpp',
+                'playlist/playlist_controller.hpp',
+                'playlist/playlist_item.hpp',
             ),
             'suite': ['qt'],
             'include_directories' : qt_include_dir,


=====================================
modules/gui/qt/playlist/playlist_item.cpp
=====================================
@@ -16,6 +16,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 #include "playlist_item.hpp"
+#include "util/vlctick.hpp"
 #include <vlc_input_item.h>
 
 //namespace vlc {
@@ -61,7 +62,7 @@ QUrl PlaylistItem::getArtwork() const
     return d->artwork;
 }
 
-vlc_tick_t PlaylistItem::getDuration() const
+VLCDuration PlaylistItem::getDuration() const
 {
     return d->duration;
 }
@@ -75,7 +76,11 @@ void PlaylistItem::sync() {
     input_item_t *media = inputItem();
     assert(media);
     vlc_mutex_locker locker(&media->lock);
-    d->duration = media->i_duration;
+    d->duration =
+        (media->i_duration == INPUT_DURATION_INDEFINITE
+            || media->i_duration == INPUT_DURATION_UNSET)
+        ? VLCDuration{}
+        : VLCDuration{media->i_duration};
     d->url      = media->psz_uri;
 
     if (media->p_meta) {


=====================================
modules/gui/qt/playlist/playlist_item.hpp
=====================================
@@ -30,6 +30,8 @@
 #include <QUrl>
 #include <QMetaType>
 
+#include "util/vlctick.hpp"
+
 
 //namespace vlc {
 //  namespace playlist {
@@ -53,7 +55,7 @@ public:
     Q_PROPERTY(QString artist READ getArtist CONSTANT  FINAL)
     Q_PROPERTY(QString album READ getAlbum CONSTANT  FINAL)
     Q_PROPERTY(QUrl artwork READ getArtwork CONSTANT  FINAL)
-    Q_PROPERTY(vlc_tick_t duration READ getDuration CONSTANT  FINAL)
+    Q_PROPERTY(VLCDuration duration READ getDuration CONSTANT  FINAL)
     Q_PROPERTY(QUrl url READ getUrl CONSTANT  FINAL)
 
     PlaylistItem(vlc_playlist_item_t *item = nullptr);
@@ -84,7 +86,7 @@ public:
 
     QUrl getArtwork() const;
 
-    vlc_tick_t getDuration() const;
+    VLCDuration getDuration() const;
 
     QUrl getUrl() const;
 
@@ -103,7 +105,7 @@ private:
         QString album;
         QUrl artwork;
 
-        vlc_tick_t duration;
+        VLCDuration duration;
 
         QUrl url;
     };


=====================================
modules/gui/qt/playlist/playlist_model.cpp
=====================================
@@ -178,7 +178,7 @@ void PlaylistListModelPrivate::onItemsReset(const QVector<PlaylistItem>&& newCon
     m_items = newContent;
     q->endResetModel();
 
-    m_duration = VLC_TICK_FROM_SEC(0);
+    m_duration = VLCDuration();
     if (m_items.size())
     {
         for(const auto& i : m_items)
@@ -242,6 +242,14 @@ void PlaylistListModelPrivate::onItemsRemoved(size_t index, size_t count)
     m_items.remove(index, count);
     q->endRemoveRows();
 
+    //maybe we removed the only valid elements
+    if (m_duration.toVLCTick() == 0 && m_duration.valid())
+    {
+        m_duration = VLCDuration();
+        for(const auto& i : m_items)
+            m_duration += i.getDuration();
+    }
+
     emit q->countChanged(m_items.size());
 }
 
@@ -303,7 +311,7 @@ VLCDuration
 PlaylistListModel::getDuration() const
 {
     Q_D(const PlaylistListModel);
-    return VLCDuration(d->m_duration);
+    return d->m_duration;
 }
 
 PlaylistItem


=====================================
modules/gui/qt/playlist/playlist_model_p.hpp
=====================================
@@ -66,7 +66,7 @@ public:
     QVector<PlaylistItem> m_items;
     ssize_t m_current = -1;
 
-    vlc_tick_t m_duration = 0;
+    VLCDuration m_duration = VLCDuration{};
 };
 
 } //namespace playlist


=====================================
modules/gui/qt/util/vlctick.cpp
=====================================
@@ -36,12 +36,12 @@ VLCTick::VLCTick(vlc_tick_t ticks)
 
 bool VLCTick::isSubSecond() const
 {
-    return asMilliseconds() < 1000;
+    return valid() && asMilliseconds() < 1000;
 }
 
 bool VLCTick::isSubHour() const
 {
-    return asSeconds() < 3600;
+    return valid() && asSeconds() < 3600;
 }
 
 QString VLCTick::formatHMS(int formatFlags) const
@@ -168,22 +168,28 @@ int VLCTick::toMilliseconds() const
 
 VLCDuration::VLCDuration()
     : VLCTick(0)
+    , m_valid(false)
 {
+
 }
 
 VLCDuration::VLCDuration(vlc_tick_t t)
     : VLCTick(t)
+    , m_valid(true)
 {
 }
 
 VLCDuration VLCDuration::operator*(double f) const
 {
-    return VLCDuration(m_ticks * f);
+    if (m_valid)
+        return VLCDuration(m_ticks * f);
+    else
+        return {};
 }
 
 bool VLCDuration::operator==(const VLCDuration &rhs) const
 {
-    return m_ticks == rhs.m_ticks;
+    return m_valid == rhs.m_valid && m_ticks == rhs.m_ticks;
 }
 
 bool VLCDuration::operator>(const VLCDuration &rhs) const
@@ -191,6 +197,34 @@ bool VLCDuration::operator>(const VLCDuration &rhs) const
     return m_ticks > rhs.m_ticks;
 }
 
+VLCDuration VLCDuration::operator+(const VLCDuration &rhs) const
+{
+    if (m_valid || rhs.m_valid)
+        return VLCDuration{m_ticks + rhs.m_ticks};
+    return VLCDuration{};
+}
+
+VLCDuration& VLCDuration::operator+=(const VLCDuration &rhs)
+{
+    m_valid |= rhs.m_valid;
+    m_ticks += rhs.m_ticks;
+    return *this;
+}
+
+VLCDuration VLCDuration::operator-(const VLCDuration &rhs) const
+{
+    if (m_valid || rhs.m_valid)
+        return VLCDuration{m_ticks + rhs.m_ticks};
+    return VLCDuration{};
+}
+
+VLCDuration& VLCDuration::operator-=(const VLCDuration &rhs)
+{
+    m_valid |= rhs.m_valid;
+    m_ticks -= rhs.m_ticks;
+    return *this;
+}
+
 double VLCDuration::toSecf() const
 {
     return secf_from_vlc_tick(m_ticks);
@@ -198,7 +232,10 @@ double VLCDuration::toSecf() const
 
 VLCDuration VLCDuration::scale(float scalar) const
 {
-    return VLCDuration(m_ticks * scalar);
+    if (m_valid)
+        return VLCDuration(m_ticks * scalar);
+    else
+        return {};
 }
 
 VLCDuration VLCDuration::fromMS(int64_t ms)
@@ -218,7 +255,7 @@ int64_t VLCDuration::asSeconds() const
 
 bool VLCDuration::valid() const
 {
-    return true;
+    return m_valid;
 }
 
 ///// VLCTime


=====================================
modules/gui/qt/util/vlctick.hpp
=====================================
@@ -104,6 +104,10 @@ public:
     VLCDuration(vlc_tick_t);
 
     VLCDuration operator*(double) const;
+    VLCDuration operator+(const VLCDuration &) const;
+    VLCDuration& operator+=(const VLCDuration &);
+    VLCDuration operator-(const VLCDuration &) const;
+    VLCDuration& operator-=(const VLCDuration &);
     bool operator==(const VLCDuration &) const;
     bool operator>(const VLCDuration &) const;
 
@@ -116,6 +120,9 @@ public:
     int64_t asMilliseconds() const override;
     int64_t asSeconds() const override;
     bool valid() const override;
+
+private:
+    bool m_valid;
 };
 
 class VLCTime : public VLCTick



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/342abe8c6794332b4ae3440f4bd2428d760ded74...310b6683039d62a3577f549196de0fdd1ecb9513

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/342abe8c6794332b4ae3440f4bd2428d760ded74...310b6683039d62a3577f549196de0fdd1ecb9513
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list