File indexing completed on 2024-12-08 07:28:30

0001 /*
0002     SPDX-FileCopyrightText: 2007 Jean-Baptiste Mardelle <jb@kdenlive.org>
0003 
0004 SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #pragma once
0008 
0009 #include "utils/gentime.h"
0010 
0011 #include "kdenlive_debug.h"
0012 
0013 #include <QDomElement>
0014 #include <QHash>
0015 #include <QPersistentModelIndex>
0016 #include <QString>
0017 #include <QUuid>
0018 #include <cassert>
0019 #include <memory>
0020 
0021 const int MAXCLIPDURATION = 15000;
0022 
0023 namespace Kdenlive {
0024 
0025 enum MonitorId { NoMonitor = 0x01, ClipMonitor = 0x02, ProjectMonitor = 0x04, RecordMonitor = 0x08, StopMotionMonitor = 0x10, RenderMonitor = 0x20 };
0026 enum ConfigPage {
0027     PageMisc = 0,
0028     PageEnv,
0029     PageTimeline,
0030     PageTools,
0031     PageCapture,
0032     PageJogShuttle,
0033     PagePlayback,
0034     PageTranscode,
0035     PageProjectDefaults,
0036     PageColorsGuides,
0037     PageSpeech,
0038     NoPage
0039 };
0040 
0041 const int DefaultThumbHeight = 100;
0042 } // namespace Kdenlive
0043 
0044 enum class GroupType {
0045     Normal,
0046     Selection, // in that case, the group is used to emulate a selection
0047     AVSplit,   // in that case, the group links the audio and video of the same clip
0048     Leaf       // This is a leaf (clip or composition)
0049 };
0050 
0051 const QString groupTypeToStr(GroupType t);
0052 GroupType groupTypeFromStr(const QString &s);
0053 
0054 // We can not use just ObjectType as name because that causes conflicts with Xcode on macOS
0055 enum class KdenliveObjectType { TimelineClip, TimelineComposition, TimelineTrack, TimelineMix, TimelineSubtitle, BinClip, Master, NoItem };
0056 // using ObjectId = std::pair<ObjectType, std::pair<int, QUuid>>;
0057 struct ObjectId
0058 {
0059     KdenliveObjectType type;
0060     int itemId;
0061     QUuid uuid;
0062     explicit constexpr ObjectId(const KdenliveObjectType tp = KdenliveObjectType::NoItem, int id = -1, const QUuid uid = QUuid())
0063         : type(tp)
0064         , itemId(id)
0065         , uuid(uid)
0066     {
0067     }
0068     /*inline ObjectId &operator=(const ObjectId &a)
0069     {
0070         type = a.type;
0071         itemId = a.itemId;
0072         uuid = a.uuid;
0073         return *this;
0074     }*/
0075     inline bool operator==(const ObjectId &a) const
0076     {
0077         if (a.type == type && a.itemId == itemId && a.uuid == uuid)
0078             return true;
0079         else
0080             return false;
0081     }
0082     inline bool operator!=(const ObjectId &a) const
0083     {
0084         if (a.type != type || a.itemId != itemId || a.uuid != uuid)
0085             return true;
0086         else
0087             return false;
0088     }
0089 };
0090 
0091 enum class MixAlignment { AlignNone, AlignLeft, AlignRight, AlignCenter };
0092 
0093 enum OperationType {
0094     None = 0,
0095     WaitingForConfirm,
0096     MoveOperation,
0097     ResizeStart,
0098     ResizeEnd,
0099     RollingStart,
0100     RollingEnd,
0101     RippleStart,
0102     RippleEnd,
0103     FadeIn,
0104     FadeOut,
0105     TransitionStart,
0106     TransitionEnd,
0107     MoveGuide,
0108     KeyFrame,
0109     Seek,
0110     Spacer,
0111     RubberSelection,
0112     ScrollTimeline,
0113     ZoomTimeline
0114 };
0115 
0116 namespace PlaylistState {
0117 Q_NAMESPACE
0118 enum ClipState { VideoOnly = 1, AudioOnly = 2, Disabled = 3, Unknown = 4 };
0119 Q_ENUM_NS(ClipState)
0120 } // namespace PlaylistState
0121 
0122 namespace FileStatus {
0123 Q_NAMESPACE
0124 enum ClipStatus { StatusReady = 0, StatusProxy, StatusMissing, StatusWaiting, StatusDeleting, StatusProxyOnly };
0125 Q_ENUM_NS(ClipStatus)
0126 } // namespace PlaylistState
0127 
0128 // returns a pair corresponding to (video, audio)
0129 std::pair<bool, bool> stateToBool(PlaylistState::ClipState state);
0130 PlaylistState::ClipState stateFromBool(std::pair<bool, bool> av);
0131 
0132 namespace TimelineMode {
0133 enum EditMode { NormalEdit = 0, OverwriteEdit = 1, InsertEdit = 2 };
0134 }
0135 
0136 namespace AssetListType {
0137 Q_NAMESPACE
0138 enum AssetType { Preferred, Video, Audio, Custom, CustomAudio, Template, TemplateAudio, Favorites, AudioComposition, VideoShortComposition, VideoComposition, AudioTransition, VideoTransition, Text, Hidden = -1 };
0139 Q_ENUM_NS(AssetType)
0140 }
0141 
0142 namespace ClipType {
0143 Q_NAMESPACE
0144 enum ProducerType {
0145     Unknown = 0,
0146     Audio = 1,
0147     Video = 2,
0148     AV = 3,
0149     Color = 4,
0150     Image = 5,
0151     Text = 6,
0152     SlideShow = 7,
0153     Virtual = 8,
0154     Playlist = 9,
0155     WebVfx = 10,
0156     TextTemplate = 11,
0157     QText = 12,
0158     Composition = 13,
0159     Track = 14,
0160     Qml = 15,
0161     Animation = 16,
0162     Timeline = 17
0163 };
0164 Q_ENUM_NS(ProducerType)
0165 } // namespace ClipType
0166 
0167 enum ProjectItemType { ProjectClipType = 0, ProjectFolderType, ProjectSubclipType };
0168 
0169 enum GraphicsRectItem { AVWidget = 70000, LabelWidget, TransitionWidget, GroupWidget };
0170 
0171 namespace ToolType {
0172 Q_NAMESPACE
0173 enum ProjectTool {
0174     SelectTool = 0,
0175     RazorTool = 1,
0176     SpacerTool = 2,
0177     RippleTool = 3,
0178     RollTool = 4,
0179     SlipTool = 5,
0180     SlideTool = 6,
0181     MulticamTool = 7
0182 };
0183 Q_ENUM_NS(ProjectTool)
0184 }
0185 
0186 enum MonitorSceneType {
0187     MonitorSceneNone = 0,
0188     MonitorSceneDefault,
0189     MonitorSceneGeometry,
0190     MonitorSceneCorners,
0191     MonitorSceneRoto,
0192     MonitorSceneSplit,
0193     MonitorSceneTrimming,
0194     MonitorSplitTrack
0195 };
0196 
0197 enum MessageType { DefaultMessage, ProcessingJobMessage, OperationCompletedMessage, InformationMessage, ErrorMessage, MltError, TooltipMessage };
0198 
0199 namespace BinMessage {
0200 enum BinCategory { NoMessage = 0, ProfileMessage, StreamsMessage, InformationMessage, UpdateMessage };
0201 }
0202 
0203 enum TrackType { AudioTrack = 0, VideoTrack = 1, AnyTrack = 2, SubtitleTrack = 3 };
0204 
0205 enum CacheType {
0206     SystemCacheRoot = -1,
0207     CacheRoot = 0,
0208     CacheBase = 1,
0209     CachePreview = 2,
0210     CacheProxy = 3,
0211     CacheAudio = 4,
0212     CacheThumbs = 5,
0213     CacheSequence = 6,
0214     CacheTmpWorkFiles = 7
0215 };
0216 
0217 enum TrimMode { NormalTrim, RippleTrim, RollingTrim, SlipTrim, SlideTrim };
0218 
0219 class TrackInfo
0220 {
0221 
0222 public:
0223     TrackType type;
0224     QString trackName;
0225     bool isMute;
0226     bool isBlind;
0227     bool isLocked;
0228     int duration;
0229     /*EffectsList effectsList;
0230     TrackInfo()
0231         : type(VideoTrack)
0232         , isMute(0)
0233         , isBlind(0)
0234         , isLocked(0)
0235         , duration(0)
0236         , effectsList(true)
0237     {
0238     }*/
0239 };
0240 
0241 struct requestClipInfo
0242 {
0243     QDomElement xml;
0244     QString clipId;
0245     int imageHeight;
0246     bool replaceProducer;
0247 
0248     bool operator==(const requestClipInfo &a) const { return clipId == a.clipId; }
0249 };
0250 
0251 typedef QMap<QString, QString> stringMap;
0252 typedef QMap<int, QMap<int, QByteArray>> audioByteArray;
0253 using audioShortVector = QVector<qint16>;
0254 
0255 class ItemInfo
0256 {
0257 public:
0258     /** startPos is the position where the clip starts on the track */
0259     GenTime startPos;
0260     /** endPos is the duration where the clip ends on the track */
0261     GenTime endPos;
0262     /** cropStart is the position where the sub-clip starts, relative to the clip's 0 position */
0263     GenTime cropStart;
0264     /** cropDuration is the duration of the clip */
0265     GenTime cropDuration;
0266     /** Track number */
0267     int track{0};
0268     ItemInfo() = default;
0269     bool isValid() const { return startPos != endPos; }
0270     bool contains(GenTime pos) const
0271     {
0272         if (startPos == endPos) {
0273             return true;
0274         }
0275         return (pos <= endPos && pos >= startPos);
0276     }
0277     bool operator==(const ItemInfo &a) const { return startPos == a.startPos && endPos == a.endPos && track == a.track && cropStart == a.cropStart; }
0278 };
0279 
0280 class TransitionInfo
0281 {
0282 public:
0283     /** startPos is the position where the clip starts on the track */
0284     GenTime startPos;
0285     /** endPos is the duration where the clip ends on the track */
0286     GenTime endPos;
0287     /** the track on which the transition is (b_track)*/
0288     int b_track{0};
0289     /** the track on which the transition is applied (a_track)*/
0290     int a_track{0};
0291     /** Does the user request for a special a_track */
0292     bool forceTrack{false};
0293     TransitionInfo() = default;
0294 };
0295 
0296 class CommentedTime
0297 {
0298 public:
0299     CommentedTime();
0300     CommentedTime(const GenTime &time, QString comment, int markerType = 0);
0301     CommentedTime(const QString &hash, const GenTime &time);
0302 
0303     QString comment() const;
0304     GenTime time() const;
0305     /** @brief Returns a string containing infos needed to store marker info. string equals marker type + QLatin1Char(':') + marker comment */
0306     QString hash() const;
0307     void setComment(const QString &comm);
0308     void setTime(const GenTime &t);
0309     void setMarkerType(int t);
0310     int markerType() const;
0311 
0312     /* Implementation of > operator; Works identically as with basic types. */
0313     bool operator>(const CommentedTime &op) const;
0314     /* Implementation of < operator; Works identically as with basic types. */
0315     bool operator<(const CommentedTime &op) const;
0316     /* Implementation of >= operator; Works identically as with basic types. */
0317     bool operator>=(const CommentedTime &op) const;
0318     /* Implementation of <= operator; Works identically as with basic types. */
0319     bool operator<=(const CommentedTime &op) const;
0320     /* Implementation of == operator; Works identically as with basic types. */
0321     bool operator==(const CommentedTime &op) const;
0322     /* Implementation of != operator; Works identically as with basic types. */
0323     bool operator!=(const CommentedTime &op) const;
0324 
0325 private:
0326     GenTime m_time;
0327     QString m_comment;
0328     int m_type{0};
0329 };
0330 
0331 class SubtitledTime
0332 {
0333 public:
0334     SubtitledTime();
0335     SubtitledTime(const GenTime &start, QString sub, const GenTime &end);
0336     
0337     QString subtitle() const;
0338     GenTime start() const;
0339     GenTime end() const;
0340     
0341     void setSubtitle(const QString &sub);
0342     void setEndTime(const GenTime &end);
0343     
0344     /* Implementation of > operator; Works identically as with basic types. */
0345     bool operator>(const SubtitledTime &op) const;
0346     /* Implementation of < operator; Works identically as with basic types. */
0347     bool operator<(const SubtitledTime &op) const;
0348     /* Implementation of == operator; Works identically as with basic types. */
0349     bool operator==(const SubtitledTime &op) const;
0350     /* Implementation of != operator; Works identically as with basic types. */
0351     bool operator!=(const SubtitledTime &op) const;
0352     
0353 private:
0354     GenTime m_starttime;
0355     QString m_subtitle;
0356     GenTime m_endtime;
0357 };
0358 
0359 QDebug operator<<(QDebug qd, const ItemInfo &info);
0360 
0361 // we provide hash function for qstring and QPersistentModelIndex
0362 namespace std {
0363 template <> struct hash<QPersistentModelIndex>
0364 {
0365     std::size_t operator()(const QPersistentModelIndex &k) const { return qHash(k); }
0366 };
0367 } // namespace std
0368 
0369 // The following is a hack that allows one to use shared_from_this in the case of a multiple inheritance.
0370 // Credit: https://stackoverflow.com/questions/14939190/boost-shared-from-this-and-multiple-inheritance
0371 template <typename T> struct enable_shared_from_this_virtual;
0372 
0373 class enable_shared_from_this_virtual_base : public std::enable_shared_from_this<enable_shared_from_this_virtual_base>
0374 {
0375     using base_type = std::enable_shared_from_this<enable_shared_from_this_virtual_base>;
0376     template <typename T> friend struct enable_shared_from_this_virtual;
0377 
0378     std::shared_ptr<enable_shared_from_this_virtual_base> shared_from_this() { return base_type::shared_from_this(); }
0379     std::shared_ptr<enable_shared_from_this_virtual_base const> shared_from_this() const { return base_type::shared_from_this(); }
0380 };
0381 
0382 template <typename T> struct enable_shared_from_this_virtual : virtual enable_shared_from_this_virtual_base
0383 {
0384     using base_type = enable_shared_from_this_virtual_base;
0385 
0386 public:
0387     std::shared_ptr<T> shared_from_this()
0388     {
0389         std::shared_ptr<T> result(base_type::shared_from_this(), static_cast<T *>(this));
0390         return result;
0391     }
0392 
0393     std::shared_ptr<T const> shared_from_this() const
0394     {
0395         std::shared_ptr<T const> result(base_type::shared_from_this(), static_cast<T const *>(this));
0396         return result;
0397     }
0398 };
0399 
0400 // This is a small trick to have a QAbstractItemModel with shared_from_this enabled without multiple inheritance
0401 // Be careful, if you use this class, you have to make sure to init weak_this_ when you construct a shared_ptr to your object
0402 template <class T> class QAbstractItemModel_shared_from_this : public QAbstractItemModel
0403 {
0404 protected:
0405     QAbstractItemModel_shared_from_this()
0406         : QAbstractItemModel()
0407     {
0408     }
0409 
0410 public:
0411     std::shared_ptr<T> shared_from_this()
0412     {
0413         std::shared_ptr<T> p(weak_this_);
0414         assert(p.get() == this);
0415         return p;
0416     }
0417 
0418     std::shared_ptr<T const> shared_from_this() const
0419     {
0420         std::shared_ptr<T const> p(weak_this_);
0421         assert(p.get() == this);
0422         return p;
0423     }
0424 
0425 public: // actually private, but avoids compiler template friendship issues
0426     mutable std::weak_ptr<T> weak_this_;
0427 };