00001
00002
00003 #ifndef _VIDEO_DISPLAY_PROFILE_H_
00004 #define _VIDEO_DISPLAY_PROFILE_H_
00005
00006 #include <vector>
00007 using namespace std;
00008
00009 #include <qstringlist.h>
00010 #include <qdeepcopy.h>
00011 #include <qmutex.h>
00012 #include <qsize.h>
00013 #include <qmap.h>
00014
00015 #include "mythcontext.h"
00016
00017 typedef QMap<QString,QString> pref_map_t;
00018 typedef QMap<QString,QStringList> safe_map_t;
00019 typedef QStringList safe_list_t;
00020 typedef QMap<QString,uint> priority_map_t;
00021
00022 class ProfileItem
00023 {
00024 public:
00025 ProfileItem() : profileid(0) {}
00026 ~ProfileItem() {}
00027
00028 void Clear(void) { pref.clear(); }
00029
00030
00031 void SetProfileID(uint id) { profileid = id; }
00032 void Set(const QString &value, const QString &data)
00033 { pref[value] = data; }
00034
00035
00036
00037 uint GetProfileID(void) const { return profileid; }
00038
00039 QString Get(const QString &value) const
00040 {
00041 pref_map_t::const_iterator it = pref.find(value);
00042 if (it != pref.end())
00043 return *it;
00044 return QString::null;
00045 }
00046
00047 uint GetPriority(void) const
00048 {
00049 QString tmp = Get("pref_priority");
00050 return (tmp.isEmpty()) ? 0 : tmp.toUInt();
00051 }
00052
00053 pref_map_t GetAll(void) const { return pref; }
00054
00055
00056 bool IsMatch(const QSize &size, float rate) const;
00057 bool IsValid(QString *reason = NULL) const;
00058
00059 bool operator<(const ProfileItem &other) const;
00060
00061 QString toString(void) const;
00062
00063 private:
00064 uint profileid;
00065 pref_map_t pref;
00066 };
00067 typedef vector<ProfileItem> item_list_t;
00068
00069 class MPUBLIC VideoDisplayProfile
00070 {
00071 public:
00072 VideoDisplayProfile();
00073 ~VideoDisplayProfile();
00074
00075 void SetInput(const QSize &size);
00076 void SetOutput(float framerate);
00077
00078 void SetVideoRenderer(const QString &video_renderer);
00079
00080 QString GetDecoder(void) const
00081 { return GetPreference("pref_decoder"); }
00082 bool IsDecoderCompatible(const QString &decoder);
00083
00084 uint GetMaxCPUs(void) const
00085 { return GetPreference("pref_max_cpus").toUInt(); }
00086
00087 QString GetVideoRenderer(void) const
00088 { return GetPreference("pref_videorenderer"); }
00089
00090 QString GetOSDRenderer(void) const
00091 { return GetPreference("pref_osdrenderer"); }
00092 bool IsOSDFadeEnabled(void) const
00093 { return GetPreference("pref_osdfade").toInt(); }
00094
00095 QString GetDeinterlacer(void) const
00096 { return GetPreference("pref_deint0"); }
00097 QString GetFallbackDeinterlacer(void) const
00098 { return GetPreference("pref_deint1"); }
00099
00100 QString GetFilters(void) const
00101 { return GetPreference("pref_filters"); }
00102
00103 QString GetFilteredDeint(const QString &override);
00104
00105 QString toString(void) const;
00106
00107 static QStringList GetDecoders(void);
00108 static QStringList GetDecoderNames(void);
00109 static QString GetDecoderName(const QString &decoder);
00110 static QString GetDecoderHelp(QString decoder = QString::null);
00111
00112 static QString GetDefaultProfileName(const QString &hostname);
00113 static void SetDefaultProfileName(const QString &profilename,
00114 const QString &hostname);
00115 static uint GetProfileGroupID(const QString &profilename,
00116 const QString &hostname);
00117 static QStringList GetProfiles(const QString &hostname);
00118
00119 static bool DeleteProfileGroup(const QString &groupname,
00120 const QString &hostname);
00121 static uint CreateProfileGroup(const QString &groupname,
00122 const QString &hostname);
00123
00124 static void CreateProfile(
00125 uint grpid, uint priority,
00126 QString cmp0, uint width0, uint height0,
00127 QString cmp1, uint width1, uint height1,
00128 QString decoder, uint max_cpus, QString videorenderer,
00129 QString osdrenderer, bool osdfade,
00130 QString deint0, QString deint1, QString filters);
00131
00132 static void DeleteProfiles(const QString &hostname);
00133 static void CreateProfiles(const QString &hostname);
00134 static void CreateOldProfiles(const QString &hostname);
00135 static void CreateNewProfiles(const QString &hostname);
00136
00137 static QStringList GetVideoRenderers(const QString &decoder);
00138 static QString GetVideoRendererHelp(const QString &renderer);
00139 static QString GetPreferredVideoRenderer(const QString &decoder);
00140 static QStringList GetDeinterlacers(const QString &video_renderer);
00141 static QString GetDeinterlacerName(const QString short_name);
00142 static QString GetDeinterlacerHelp(const QString &deint);
00143 static QStringList GetOSDs(const QString &video_renderer);
00144 static QString GetOSDHelp(const QString &osd);
00145 static bool IsFilterAllowed( const QString &video_renderer);
00146
00147 static QStringList GetFilteredRenderers(const QString &decoder,
00148 const QStringList &renderers);
00149 static QString GetBestVideoRenderer(const QStringList &renderers);
00150
00151 static item_list_t LoadDB(uint groupid);
00152 static bool DeleteDB(uint groupid, const item_list_t&);
00153 static bool SaveDB(uint groupid, item_list_t&);
00154
00155 private:
00156 item_list_t::const_iterator FindMatch(const QSize &size, float framerate);
00157 void LoadBestPreferences(const QSize &size, float framerate);
00158
00159 QString GetActualVideoRenderer(void) const
00160 { return QDeepCopy<QString>(last_video_renderer); }
00161
00162 QString GetPreference(const QString &key) const;
00163 void SetPreference(const QString &key, const QString &value);
00164
00165 static void init_statics(void);
00166
00167 private:
00168 mutable QMutex lock;
00169 QSize last_size;
00170 float last_rate;
00171 QString last_video_renderer;
00172 pref_map_t pref;
00173 item_list_t all_pref;
00174
00175 static QMutex safe_lock;
00176 static bool safe_initialized;
00177 static safe_map_t safe_renderer;
00178 static safe_map_t safe_deint;
00179 static safe_map_t safe_osd;
00180 static safe_map_t safe_equiv_dec;
00181 static safe_list_t safe_custom;
00182 static priority_map_t safe_renderer_priority;
00183 static pref_map_t dec_name;
00184 };
00185
00186 #endif // _VIDEO_DISPLAY_PROFILE_H_