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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file media_plugin_base.cpp
  3.  * @brief Media plugin base class for LLMedia API plugin system
  4.  *
  5.  * All plugins should be a subclass of MediaPluginBase. 
  6.  *
  7.  * @cond
  8.  * $LicenseInfo:firstyear=2008&license=viewergpl$
  9.  * 
  10.  * Copyright (c) 2008-2010, Linden Research, Inc.
  11.  * 
  12.  * Second Life Viewer Source Code
  13.  * The source code in this file ("Source Code") is provided by Linden Lab
  14.  * to you under the terms of the GNU General Public License, version 2.0
  15.  * ("GPL"), unless you have obtained a separate licensing agreement
  16.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  17.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  18.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  19.  * 
  20.  * There are special exceptions to the terms and conditions of the GPL as
  21.  * it is applied to this Source Code. View the full text of the exception
  22.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  23.  * online at
  24.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  25.  * 
  26.  * By copying, modifying or distributing this software, you acknowledge
  27.  * that you have read and understood your obligations described above,
  28.  * and agree to abide by those obligations.
  29.  * 
  30.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  31.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  32.  * COMPLETENESS OR PERFORMANCE.
  33.  * $/LicenseInfo$
  34.  * @endcond
  35.  */
  36. #include "linden_common.h"
  37. #include "media_plugin_base.h"
  38. // TODO: Make sure that the only symbol exported from this library is LLPluginInitEntryPoint
  39. ////////////////////////////////////////////////////////////////////////////////
  40. /// Media plugin constructor.
  41. ///
  42. /// @param[in] host_send_func Function for sending messages from plugin to plugin loader shell
  43. /// @param[in] host_user_data Message data for messages from plugin to plugin loader shell
  44. MediaPluginBase::MediaPluginBase(
  45. LLPluginInstance::sendMessageFunction host_send_func,
  46. void *host_user_data )
  47. {
  48. mHostSendFunction = host_send_func;
  49. mHostUserData = host_user_data;
  50. mDeleteMe = false;
  51. mPixels = 0;
  52. mWidth = 0;
  53. mHeight = 0;
  54. mTextureWidth = 0;
  55. mTextureHeight = 0;
  56. mDepth = 0;
  57. mStatus = STATUS_NONE;
  58. }
  59. /**
  60.  * Converts current media status enum value into string (STATUS_LOADING into "loading", etc.)
  61.  * 
  62.  * @return Media status string ("loading", "playing", "paused", etc)
  63.  *
  64.  */
  65. std::string MediaPluginBase::statusString()
  66. {
  67. std::string result;
  68. switch(mStatus)
  69. {
  70. case STATUS_LOADING: result = "loading"; break;
  71. case STATUS_LOADED: result = "loaded"; break;
  72. case STATUS_ERROR: result = "error"; break;
  73. case STATUS_PLAYING: result = "playing"; break;
  74. case STATUS_PAUSED: result = "paused"; break;
  75. case STATUS_DONE: result = "done"; break;
  76. default:
  77. // keep the empty string
  78. break;
  79. }
  80. return result;
  81. }
  82. /**
  83.  * Set media status.
  84.  * 
  85.  * @param[in] status Media status (STATUS_LOADING, STATUS_PLAYING, STATUS_PAUSED, etc)
  86.  *
  87.  */
  88. void MediaPluginBase::setStatus(EStatus status)
  89. {
  90. if(mStatus != status)
  91. {
  92. mStatus = status;
  93. sendStatus();
  94. }
  95. }
  96. /**
  97.  * Receive message from plugin loader shell.
  98.  * 
  99.  * @param[in] message_string Message string
  100.  * @param[in] user_data Message data
  101.  *
  102.  */
  103. void MediaPluginBase::staticReceiveMessage(const char *message_string, void **user_data)
  104. {
  105. MediaPluginBase *self = (MediaPluginBase*)*user_data;
  106. if(self != NULL)
  107. {
  108. self->receiveMessage(message_string);
  109. // If the plugin has processed the delete message, delete it.
  110. if(self->mDeleteMe)
  111. {
  112. delete self;
  113. *user_data = NULL;
  114. }
  115. }
  116. }
  117. /**
  118.  * Send message to plugin loader shell.
  119.  * 
  120.  * @param[in] message Message data being sent to plugin loader shell
  121.  *
  122.  */
  123. void MediaPluginBase::sendMessage(const LLPluginMessage &message)
  124. {
  125. std::string output = message.generate();
  126. mHostSendFunction(output.c_str(), &mHostUserData);
  127. }
  128. /**
  129.  * Notifies plugin loader shell that part of display area needs to be redrawn.
  130.  * 
  131.  * @param[in] left Left X coordinate of area to redraw (0,0 is at top left corner)
  132.  * @param[in] top Top Y coordinate of area to redraw (0,0 is at top left corner)
  133.  * @param[in] right Right X-coordinate of area to redraw (0,0 is at top left corner)
  134.  * @param[in] bottom Bottom Y-coordinate of area to redraw (0,0 is at top left corner)
  135.  *
  136.  */
  137. void MediaPluginBase::setDirty(int left, int top, int right, int bottom)
  138. {
  139. LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "updated");
  140. message.setValueS32("left", left);
  141. message.setValueS32("top", top);
  142. message.setValueS32("right", right);
  143. message.setValueS32("bottom", bottom);
  144. sendMessage(message);
  145. }
  146. /**
  147.  * Sends "media_status" message to plugin loader shell ("loading", "playing", "paused", etc.)
  148.  * 
  149.  */
  150. void MediaPluginBase::sendStatus()
  151. {
  152. LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "media_status");
  153. message.setValue("status", statusString());
  154. sendMessage(message);
  155. }
  156. #if LL_WINDOWS
  157. # define LLSYMEXPORT __declspec(dllexport)
  158. #elif LL_LINUX
  159. # define LLSYMEXPORT __attribute__ ((visibility("default")))
  160. #else
  161. # define LLSYMEXPORT /**/
  162. #endif
  163. extern "C"
  164. {
  165. LLSYMEXPORT int LLPluginInitEntryPoint(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data);
  166. }
  167. /**
  168.  * Plugin initialization and entry point. Establishes communication channel for messages between plugin and plugin loader shell.  TODO:DOC - Please check!
  169.  * 
  170.  * @param[in] host_send_func Function for sending messages from plugin to plugin loader shell
  171.  * @param[in] host_user_data Message data for messages from plugin to plugin loader shell
  172.  * @param[out] plugin_send_func Function for plugin to receive messages from plugin loader shell
  173.  * @param[out] plugin_user_data Pointer to plugin instance
  174.  *
  175.  * @return int, where 0=success
  176.  *
  177.  */
  178. LLSYMEXPORT int
  179. LLPluginInitEntryPoint(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
  180. {
  181. return init_media_plugin(host_send_func, host_user_data, plugin_send_func, plugin_user_data);
  182. }
  183. #ifdef WIN32
  184. int WINAPI DllEntryPoint( HINSTANCE hInstance, unsigned long reason, void* params )
  185. {
  186. return 1;
  187. }
  188. #endif