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