llpluginclassmedia.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:13k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llpluginclassmedia.h
  3.  * @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.
  4.  *
  5.  * @cond
  6.  * $LicenseInfo:firstyear=2008&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2008-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  * @endcond
  33.  */
  34. #ifndef LL_LLPLUGINCLASSMEDIA_H
  35. #define LL_LLPLUGINCLASSMEDIA_H
  36. #include "llgltypes.h"
  37. #include "llpluginprocessparent.h"
  38. #include "llrect.h"
  39. #include "llpluginclassmediaowner.h"
  40. #include <queue>
  41. #include "v4color.h"
  42. class LLPluginClassMedia : public LLPluginProcessParentOwner
  43. {
  44. LOG_CLASS(LLPluginClassMedia);
  45. public:
  46. LLPluginClassMedia(LLPluginClassMediaOwner *owner);
  47. virtual ~LLPluginClassMedia();
  48. // local initialization, called by the media manager when creating a source
  49. virtual bool init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path);
  50. // undoes everything init() didm called by the media manager when destroying a source
  51. virtual void reset();
  52. void idle(void);
  53. // All of these may return 0 or an actual valid value.
  54. // Callers need to check the return for 0, and not use the values in that case.
  55. int getWidth() const { return (mMediaWidth > 0) ? mMediaWidth : 0; };
  56. int getHeight() const { return (mMediaHeight > 0) ? mMediaHeight : 0; };
  57. int getNaturalWidth() const { return mNaturalMediaWidth; };
  58. int getNaturalHeight() const { return mNaturalMediaHeight; };
  59. int getSetWidth() const { return mSetMediaWidth; };
  60. int getSetHeight() const { return mSetMediaHeight; };
  61. int getBitsWidth() const { return (mTextureWidth > 0) ? mTextureWidth : 0; };
  62. int getBitsHeight() const { return (mTextureHeight > 0) ? mTextureHeight : 0; };
  63. int getTextureWidth() const;
  64. int getTextureHeight() const;
  65. int getFullWidth() const { return mFullMediaWidth; };
  66. int getFullHeight() const { return mFullMediaHeight; };
  67. // This may return NULL.  Callers need to check for and handle this case.
  68. unsigned char* getBitsData();
  69. // gets the format details of the texture data
  70. // These may return 0 if they haven't been set up yet.  The caller needs to detect this case.
  71. int getTextureDepth() const { return mRequestedTextureDepth; };
  72. int getTextureFormatInternal() const { return mRequestedTextureInternalFormat; };
  73. int getTextureFormatPrimary() const { return mRequestedTextureFormat; };
  74. int getTextureFormatType() const { return mRequestedTextureType; };
  75. bool getTextureFormatSwapBytes() const { return mRequestedTextureSwapBytes; };
  76. bool getTextureCoordsOpenGL() const { return mRequestedTextureCoordsOpenGL; };
  77. void setSize(int width, int height);
  78. void setAutoScale(bool auto_scale);
  79. void setBackgroundColor(LLColor4 color) { mBackgroundColor = color; };
  80. // Returns true if all of the texture parameters (depth, format, size, and texture size) are set up and consistent.
  81. // This will initially be false, and will also be false for some time after setSize while the resize is processed.
  82. // Note that if this returns true, it is safe to use all the get() functions above without checking for invalid return values
  83. // until you call idle() again.
  84. bool textureValid(void);
  85. bool getDirty(LLRect *dirty_rect = NULL);
  86. void resetDirty(void);
  87. typedef enum 
  88. {
  89. MOUSE_EVENT_DOWN,
  90. MOUSE_EVENT_UP,
  91. MOUSE_EVENT_MOVE,
  92. MOUSE_EVENT_DOUBLE_CLICK
  93. }EMouseEventType;
  94. void mouseEvent(EMouseEventType type, int button, int x, int y, MASK modifiers);
  95. typedef enum 
  96. {
  97. KEY_EVENT_DOWN,
  98. KEY_EVENT_UP,
  99. KEY_EVENT_REPEAT
  100. }EKeyEventType;
  101. bool keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data);
  102. void scrollEvent(int x, int y, MASK modifiers);
  103. // Text may be unicode (utf8 encoded)
  104. bool textInput(const std::string &text, MASK modifiers, LLSD native_key_data);
  105. void loadURI(const std::string &uri);
  106. // "Loading" means uninitialized or any state prior to fully running (processing commands)
  107. bool isPluginLoading(void) { return mPlugin?mPlugin->isLoading():false; };
  108. // "Running" means the steady state -- i.e. processing messages
  109. bool isPluginRunning(void) { return mPlugin?mPlugin->isRunning():false; };
  110. // "Exited" means any regular or error state after "Running" (plugin may have crashed or exited normally)
  111. bool isPluginExited(void) { return mPlugin?mPlugin->isDone():false; };
  112. std::string getPluginVersion() { return mPlugin?mPlugin->getPluginVersion():std::string(""); };
  113. bool getDisableTimeout() { return mPlugin?mPlugin->getDisableTimeout():false; };
  114. void setDisableTimeout(bool disable) { if(mPlugin) mPlugin->setDisableTimeout(disable); };
  115. // Inherited from LLPluginProcessParentOwner
  116. /* virtual */ void receivePluginMessage(const LLPluginMessage &message);
  117. /* virtual */ void pluginLaunchFailed();
  118. /* virtual */ void pluginDied();
  119. typedef enum 
  120. {
  121. PRIORITY_UNLOADED, // media plugin isn't even loaded.
  122. PRIORITY_STOPPED, // media is not playing, shouldn't need to update at all.
  123. PRIORITY_HIDDEN, // media is not being displayed or is out of view, don't need to do graphic updates, but may still update audio, playhead, etc.
  124. PRIORITY_SLIDESHOW, // media is in the far distance, updates very infrequently
  125. PRIORITY_LOW, // media is in the distance, may be rendered at reduced size
  126. PRIORITY_NORMAL, // normal (default) priority
  127. PRIORITY_HIGH // media has user focus and/or is taking up most of the screen
  128. }EPriority;
  129. static const char* priorityToString(EPriority priority);
  130. void setPriority(EPriority priority);
  131. void setLowPrioritySizeLimit(int size);
  132. F64 getCPUUsage();
  133. // Valid after a MEDIA_EVENT_CURSOR_CHANGED event
  134. std::string getCursorName() const { return mCursorName; };
  135. LLPluginClassMediaOwner::EMediaStatus getStatus() const { return mStatus; }
  136. void cut();
  137. bool canCut() const { return mCanCut; };
  138. void copy();
  139. bool canCopy() const { return mCanCopy; };
  140. void paste();
  141. bool canPaste() const { return mCanPaste; };
  142. ///////////////////////////////////
  143. // media browser class functions
  144. bool pluginSupportsMediaBrowser(void);
  145. void focus(bool focused);
  146. void clear_cache();
  147. void clear_cookies();
  148. void enable_cookies(bool enable);
  149. void proxy_setup(bool enable, const std::string &host = LLStringUtil::null, int port = 0);
  150. void browse_stop();
  151. void browse_reload(bool ignore_cache = false);
  152. void browse_forward();
  153. void browse_back();
  154. void set_status_redirect(int code, const std::string &url);
  155. void setBrowserUserAgent(const std::string& user_agent);
  156. // This is valid after MEDIA_EVENT_NAVIGATE_BEGIN or MEDIA_EVENT_NAVIGATE_COMPLETE
  157. std::string getNavigateURI() const { return mNavigateURI; };
  158. // These are valid after MEDIA_EVENT_NAVIGATE_COMPLETE
  159. S32 getNavigateResultCode() const { return mNavigateResultCode; };
  160. std::string getNavigateResultString() const { return mNavigateResultString; };
  161. bool getHistoryBackAvailable() const { return mHistoryBackAvailable; };
  162. bool getHistoryForwardAvailable() const { return mHistoryForwardAvailable; };
  163. // This is valid after MEDIA_EVENT_PROGRESS_UPDATED
  164. int getProgressPercent() const { return mProgressPercent; };
  165. // This is valid after MEDIA_EVENT_STATUS_TEXT_CHANGED
  166. std::string getStatusText() const { return mStatusText; };
  167. // This is valid after MEDIA_EVENT_LOCATION_CHANGED
  168. std::string getLocation() const { return mLocation; };
  169. // This is valid after MEDIA_EVENT_CLICK_LINK_HREF or MEDIA_EVENT_CLICK_LINK_NOFOLLOW
  170. std::string getClickURL() const { return mClickURL; };
  171. // This is valid after MEDIA_EVENT_CLICK_LINK_HREF
  172. std::string getClickTarget() const { return mClickTarget; };
  173. typedef enum 
  174. {
  175. TARGET_NONE,        // empty href target string
  176. TARGET_BLANK,       // target to open link in user's preferred browser
  177. TARGET_EXTERNAL,    // target to open link in external browser
  178. TARGET_OTHER        // nonempty and unsupported target type
  179. }ETargetType;
  180. // This is valid after MEDIA_EVENT_CLICK_LINK_HREF
  181. ETargetType getClickTargetType() const { return mClickTargetType; };
  182. std::string getMediaName() const { return mMediaName; };
  183. std::string getMediaDescription() const { return mMediaDescription; };
  184. // Crash the plugin.  If you use this outside of a testbed, you will be punished.
  185. void crashPlugin();
  186. // Hang the plugin.  If you use this outside of a testbed, you will be punished.
  187. void hangPlugin();
  188. ///////////////////////////////////
  189. // media time class functions
  190. bool pluginSupportsMediaTime(void);
  191. void stop();
  192. void start(float rate = 0.0f);
  193. void pause();
  194. void seek(float time);
  195. void setLoop(bool loop);
  196. void setVolume(float volume);
  197. float getVolume();
  198. F64 getCurrentTime(void) const { return mCurrentTime; };
  199. F64 getDuration(void) const { return mDuration; };
  200. F64 getCurrentPlayRate(void) { return mCurrentRate; };
  201. F64 getLoadedDuration(void) const { return mLoadedDuration; };
  202. // Initialize the URL history of the plugin by sending
  203. // "init_history" message 
  204. void initializeUrlHistory(const LLSD& url_history);
  205. protected:
  206. LLPluginClassMediaOwner *mOwner;
  207. // Notify this object's owner that an event has occurred.
  208. void mediaEvent(LLPluginClassMediaOwner::EMediaEvent event);
  209. void sendMessage(const LLPluginMessage &message);  // Send message internally, either queueing or sending directly.
  210. std::queue<LLPluginMessage> mSendQueue; // Used to queue messages while the plugin initializes.
  211. void setSizeInternal(void);
  212. bool mTextureParamsReceived; // the mRequestedTexture* fields are only valid when this is true
  213. S32  mRequestedTextureDepth;
  214. LLGLenum mRequestedTextureInternalFormat;
  215. LLGLenum mRequestedTextureFormat;
  216. LLGLenum mRequestedTextureType;
  217. bool mRequestedTextureSwapBytes;
  218. bool mRequestedTextureCoordsOpenGL;
  219. std::string mTextureSharedMemoryName;
  220. size_t mTextureSharedMemorySize;
  221. // True to scale requested media up to the full size of the texture (i.e. next power of two)
  222. bool mAutoScaleMedia;
  223. // default media size for the plugin, from the texture_params message.
  224. int mDefaultMediaWidth;
  225. int mDefaultMediaHeight;
  226. // Size that has been requested by the plugin itself
  227. int mNaturalMediaWidth;
  228. int mNaturalMediaHeight;
  229. // Size that has been requested with setSize()
  230. int mSetMediaWidth;
  231. int mSetMediaHeight;
  232. // Full calculated media size (before auto-scale and downsample calculations)
  233. int mFullMediaWidth;
  234. int mFullMediaHeight;
  235. // Actual media size being set (after auto-scale)
  236. int mRequestedMediaWidth;
  237. int mRequestedMediaHeight;
  238. // Texture size calculated from actual media size
  239. int mRequestedTextureWidth;
  240. int mRequestedTextureHeight;
  241. // Size that the plugin has acknowledged
  242. int mTextureWidth;
  243. int mTextureHeight;
  244. int mMediaWidth;
  245. int mMediaHeight;
  246. float mRequestedVolume;
  247. // Priority of this media stream
  248. EPriority mPriority;
  249. int mLowPrioritySizeLimit;
  250. bool mAllowDownsample;
  251. int mPadding;
  252. LLPluginProcessParent *mPlugin;
  253. LLRect mDirtyRect;
  254. std::string translateModifiers(MASK modifiers);
  255. std::string mCursorName;
  256. int mLastMouseX;
  257. int mLastMouseY;
  258. LLPluginClassMediaOwner::EMediaStatus mStatus;
  259. F64 mSleepTime;
  260. bool mCanCut;
  261. bool mCanCopy;
  262. bool mCanPaste;
  263. std::string mMediaName;
  264. std::string mMediaDescription;
  265. LLColor4 mBackgroundColor;
  266. /////////////////////////////////////////
  267. // media_browser class
  268. std::string mNavigateURI;
  269. S32 mNavigateResultCode;
  270. std::string mNavigateResultString;
  271. bool mHistoryBackAvailable;
  272. bool mHistoryForwardAvailable;
  273. std::string mStatusText;
  274. int mProgressPercent;
  275. std::string mLocation;
  276. std::string mClickURL;
  277. std::string mClickTarget;
  278. ETargetType     mClickTargetType;
  279. /////////////////////////////////////////
  280. // media_time class
  281. F64 mCurrentTime;
  282. F64 mDuration;
  283. F64 mCurrentRate;
  284. F64 mLoadedDuration;
  285. };
  286. #endif // LL_LLPLUGINCLASSMEDIA_H