diff options
37 files changed, 996 insertions, 88 deletions
| diff --git a/autobuild.xml b/autobuild.xml index 072dfa678a..34785f6f2a 100755 --- a/autobuild.xml +++ b/autobuild.xml @@ -1484,11 +1484,11 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>29a1f64df46094eda0d681821a98d17e</string> +              <string>705c0d33a4af1a1ee76098ba7f46d551</string>                <key>hash_algorithm</key>                <string>md5</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llceflib_3p-llceflib/rev/311349/arch/Darwin/installer/llceflib-1.5.3.311349-darwin-311349.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llceflib_3p-llceflib/rev/315894/arch/Darwin/installer/llceflib-1.5.3.315894-darwin-315894.tar.bz2</string>              </map>              <key>name</key>              <string>darwin</string> @@ -1498,18 +1498,18 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>827b7c339a2cd401d9d23f9ee02cb83f</string> +              <string>7de13dc8894dfab5c38317bd8a876392</string>                <key>hash_algorithm</key>                <string>md5</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llceflib_3p-llceflib/rev/311349/arch/CYGWIN/installer/llceflib-1.5.3.311349-windows-311349.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llceflib_3p-llceflib/rev/315894/arch/CYGWIN/installer/llceflib-1.5.3.315894-windows-315894.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string>            </map>          </map>          <key>version</key> -        <string>1.5.3.311349</string> +        <string>1.5.3.315894</string>        </map>        <key>llphysicsextensions_source</key>        <map> @@ -2135,6 +2135,46 @@          <key>version</key>          <string>0.8.0.1</string>        </map> +      <key>vlc-bin</key> +      <map> +        <key>copyright</key> +        <string>Copyright (C) 1998-2016 VLC authors and VideoLAN</string> +        <key>license</key> +        <string>GPL2</string> +        <key>license_file</key> +        <string>LICENSES/vlc.txt</string> +        <key>name</key> +        <string>vlc-bin</string> +        <key>platforms</key> +        <map> +          <key>linux</key> +          <map> +            <key>archive</key> +            <map> +              <key>hash</key> +              <string>2f410640df3f9812d1abff02a414cfa8</string> +              <key>url</key> +              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-vlc-bin/rev/315283/arch/Linux/vlc_bin-2.2.3-linux-201606011750-r10.tar.bz2</string> +            </map> +            <key>name</key> +            <string>linux</string> +          </map> +          <key>windows</key> +          <map> +            <key>archive</key> +            <map> +              <key>hash</key> +              <string>3bdbb86adc2119a0b7bb17a54372dcd2</string> +              <key>url</key> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-vlc-bin/rev/315283/arch/CYGWIN/installer/vlc_bin-2.2.3.315283-windows-315283.tar.bz2</string> +            </map> +            <key>name</key> +            <string>windows</string> +          </map> +        </map> +        <key>version</key> +        <string>2.2.3.315283</string> +      </map>        <key>xmlrpc-epi</key>        <map>          <key>copyright</key> diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index 6dc8e3dfbf..13a31cbce7 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -24,7 +24,6 @@ set(cmake_SOURCE_FILES      DirectX.cmake      DragDrop.cmake      EXPAT.cmake -##  ExamplePlugin.cmake      FindAPR.cmake      FindAutobuild.cmake      FindBerkeleyDB.cmake @@ -100,6 +99,7 @@ set(cmake_SOURCE_FILES      Variables.cmake      ViewerMiscLibs.cmake      VisualLeakDetector.cmake +    LibVLCPlugin.cmake      XmlRpcEpi.cmake      ZLIB.cmake      ) diff --git a/indra/cmake/LLWindow.cmake b/indra/cmake/LLWindow.cmake index ba07a80f05..80af7ff2ab 100644 --- a/indra/cmake/LLWindow.cmake +++ b/indra/cmake/LLWindow.cmake @@ -18,7 +18,7 @@ else (USESYSTEMLIBS)      use_prebuilt_binary(SDL)      set (SDL_FOUND TRUE)      set (SDL_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/i686-linux) -    set (SDL_LIBRARY SDL directfb fusion direct) +    set (SDL_LIBRARY SDL directfb fusion direct X11)    endif (LINUX)  endif (USESYSTEMLIBS) diff --git a/indra/cmake/LibVLCPlugin.cmake b/indra/cmake/LibVLCPlugin.cmake new file mode 100644 index 0000000000..4472676fb4 --- /dev/null +++ b/indra/cmake/LibVLCPlugin.cmake @@ -0,0 +1,27 @@ +# -*- cmake -*- +include(Linking) +include(Prebuilt) + +if (USESYSTEMLIBS) +    set(LIBVLCPLUGIN OFF CACHE BOOL +        "LIBVLCPLUGIN support for the llplugin/llmedia test apps.") +else (USESYSTEMLIBS) +    use_prebuilt_binary(vlc-bin) +    set(LIBVLCPLUGIN ON CACHE BOOL +        "LIBVLCPLUGIN support for the llplugin/llmedia test apps.") +        set(VLC_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/vlc) +endif (USESYSTEMLIBS) + +if (WINDOWS) +    set(VLC_PLUGIN_LIBRARIES +        libvlc.lib +        libvlccore.lib +    ) +elseif (DARWIN) +elseif (LINUX) +    # Specify a full path to make sure we get a static link +    set(VLC_PLUGIN_LIBRARIES +        ${LIBS_PREBUILT_DIR}/lib/libvlc.a +        ${LIBS_PREBUILT_DIR}/lib/libvlccore.a +    ) +endif (WINDOWS) diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt index 32aa08a2b7..9f9ca6c39c 100644 --- a/indra/edit-me-to-trigger-new-build.txt +++ b/indra/edit-me-to-trigger-new-build.txt @@ -1,3 +1,4 @@  2014-02-25 10:34 + diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index b30bc1aed6..2554ccdbe4 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -349,8 +349,8 @@ void LLGLSLShader::unloadInternal()          for (GLsizei i = 0; i < count; i++)          {              glDetachObjectARB(mProgramObject, obj[i]); -            glDeleteObjectARB(obj[i]); -        } +                glDeleteObjectARB(obj[i]); +            }          glDeleteObjectARB(mProgramObject); @@ -1274,6 +1274,28 @@ void LLGLSLShader::uniformMatrix4fv(U32 index, U32 count, GLboolean transpose, c      }  } +void LLGLSLShader::uniform1b(U32 index, GLboolean x) +{ +	if (mProgramObject > 0) +	{ +		if (mUniform.size() <= index) +		{ +			UNIFORM_ERRS << "Uniform index out of bounds." << LL_ENDL; +			return; +		} + +		if (mUniform[index] >= 0) +		{ +			std::map<GLint, LLVector4>::iterator iter = mValue.find(mUniform[index]); +			if (iter == mValue.end() || iter->second.mV[0] != x) +			{ +				glUniform1iARB(mUniform[index], x); +				mValue[mUniform[index]] = LLVector4(x, 0.f, 0.f, 0.f); +			} +		} +	} +} +  GLint LLGLSLShader::getUniformLocation(const LLStaticHashedString& uniform)  {      GLint ret = -1; diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h index 0746e8760a..8663a5a5ff 100644 --- a/indra/llrender/llglslshader.h +++ b/indra/llrender/llglslshader.h @@ -125,6 +125,7 @@ public:  	void uniform3fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v);  	void uniform4fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v);  	void uniformMatrix4fv(const LLStaticHashedString& uniform, U32 count, GLboolean transpose, const GLfloat *v); +	void uniform1b(U32 index, GLboolean b);  	void setMinimumAlpha(F32 minimum); diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 69420dd0bb..b5ed67f66a 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -1466,6 +1466,14 @@ U32 LLRender::getMatrixMode()  	return mMatrixMode;  } +void LLRender::setInverseTexCoordByY(bool v) +{ +	LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; +	if (shader) +	{ +		shader->uniform1b(LLShaderMgr::INVERSE_TEX_Y, v); +	} +}  void LLRender::loadIdentity()  { diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index a67fb8da52..4c3547f8e4 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -355,6 +355,7 @@ public:  	void multMatrix(const GLfloat* m);  	void matrixMode(U32 mode);	  	U32 getMatrixMode(); +	void setInverseTexCoordByY(bool v);  	const glh::matrix4f& getModelviewMatrix();  	const glh::matrix4f& getProjectionMatrix(); diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index b297223c2e..7d857c6930 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -520,7 +520,7 @@ void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns, const std::string&  		if (!filename.empty())  		{              LL_CONT << "From " << filename << ":\n"; -        } +		}          LL_CONT << log << LL_ENDL;  	}   } @@ -1190,6 +1190,7 @@ void LLShaderMgr::initAttribsAndUniforms()  	mReservedUniforms.push_back("origin");  	mReservedUniforms.push_back("display_gamma"); +	mReservedUniforms.push_back("invert_tex_y");  	llassert(mReservedUniforms.size() == END_RESERVED_UNIFORMS);  	std::set<std::string> dupe_check; diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 394b38f832..50b7c8b9d9 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -215,7 +215,8 @@ public:  		TERRAIN_ALPHARAMP,  		SHINY_ORIGIN, -DISPLAY_GAMMA, +		DISPLAY_GAMMA, +		INVERSE_TEX_Y,  		END_RESERVED_UNIFORMS  	} eGLSLReservedUniforms; diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 8f7cac1f61..bbc55b785c 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -807,7 +807,7 @@ LLView* LLView::childrenHandleHover(S32 x, S32 y, MASK mask)  LLView*	LLView::childFromPoint(S32 x, S32 y, bool recur)  {  	if (!getVisible()) -		return false; +		return NULL;  	BOOST_FOREACH(LLView* viewp, mChildList)  	{ diff --git a/indra/media_plugins/CMakeLists.txt b/indra/media_plugins/CMakeLists.txt index 24eb3947b4..9055e0111a 100644 --- a/indra/media_plugins/CMakeLists.txt +++ b/indra/media_plugins/CMakeLists.txt @@ -4,15 +4,18 @@ add_subdirectory(base)  if (LINUX)      add_subdirectory(gstreamer010) +    add_subdirectory(libvlc)  endif (LINUX) -if (WINDOWS OR DARWIN) +if (DARWIN)      add_subdirectory(quicktime)      add_subdirectory(cef) -endif (WINDOWS OR DARWIN) +endif (DARWIN)  if (WINDOWS) +    add_subdirectory(cef)      add_subdirectory(winmmshim) +    add_subdirectory(libvlc)  endif (WINDOWS)  ### add_subdirectory(example) diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp index 8d9d1dd975..be16ff7946 100644 --- a/indra/media_plugins/cef/media_plugin_cef.cpp +++ b/indra/media_plugins/cef/media_plugin_cef.cpp @@ -100,6 +100,12 @@ private:  	LLCEFLib* mLLCEFLib;      VolumeCatcher mVolumeCatcher; + +	U8 *mPopupBuffer; +	U32 mPopupW; +	U32 mPopupH; +	U32 mPopupX; +	U32 mPopupY;  };  //////////////////////////////////////////////////////////////////////////////// @@ -127,12 +133,19 @@ MediaPluginBase(host_send_func, host_user_data)  	mCookiePath = "";  	mPickedFile = "";  	mLLCEFLib = new LLCEFLib(); + +	mPopupBuffer = NULL; +	mPopupW = 0; +	mPopupH = 0; +	mPopupX = 0; +	mPopupY = 0;  }  ////////////////////////////////////////////////////////////////////////////////  //  MediaPluginCEF::~MediaPluginCEF()  { +	delete[] mPopupBuffer;  }  //////////////////////////////////////////////////////////////////////////////// @@ -155,20 +168,28 @@ void MediaPluginCEF::postDebugMessage(const std::string& msg)  //  void MediaPluginCEF::onPageChangedCallback(unsigned char* pixels, int x, int y, int width, int height, bool is_popup)  { -	if (mPixels && pixels) +	if( is_popup ) +	{ +		delete mPopupBuffer; +		mPopupBuffer = NULL; +		mPopupH = 0; +		mPopupW = 0; +		mPopupX = 0; +		mPopupY = 0; +	} + +	if( mPixels && pixels )  	{  		if (is_popup)  		{ -			for (int line = 0; line < height; ++line) +			if( width > 0 && height> 0 )  			{ -				int inverted_y = mHeight - y - height; -				int src = line * width * mDepth; -				int dst = (inverted_y + line) * mWidth * mDepth + x * mDepth; - -				if (dst + width * mDepth < mWidth * mHeight * mDepth) -				{ -					memcpy(mPixels + dst, pixels + src, width * mDepth); -				} +				mPopupBuffer = new U8[ width * height * mDepth ]; +				memcpy( mPopupBuffer, pixels, width * height * mDepth ); +				mPopupH = height; +				mPopupW = width; +				mPopupX = x; +				mPopupY = y;  			}  		}  		else @@ -177,6 +198,23 @@ void MediaPluginCEF::onPageChangedCallback(unsigned char* pixels, int x, int y,  			{  				memcpy(mPixels, pixels, mWidth * mHeight * mDepth);  			} +			if( mPopupBuffer && mPopupH && mPopupW ) +			{ +				U32 bufferSize = mWidth * mHeight * mDepth; +				U32 popupStride = mPopupW * mDepth; +				U32 bufferStride = mWidth * mDepth; +				int dstY = mPopupY; + +				int src = 0; +				int dst = dstY  * mWidth * mDepth + mPopupX * mDepth; + +				for( int line = 0; dst + popupStride < bufferSize && line < mPopupH; ++line ) +				{ +					memcpy( mPixels + dst, mPopupBuffer + src, popupStride ); +					src += popupStride; +					dst += bufferStride; +				} +			}  		}  		setDirty(0, 0, mWidth, mHeight); @@ -488,7 +526,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  				message.setValueU32("internalformat", GL_RGB);  				message.setValueU32("format", GL_BGRA);  				message.setValueU32("type", GL_UNSIGNED_BYTE); -				message.setValueBoolean("coords_opengl", true); +				message.setValueBoolean("coords_opengl", false);  				sendMessage(message);  			}  			else if (message_name == "set_user_data_path") @@ -559,6 +597,8 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  				S32 x = message_in.getValueS32("x");  				S32 y = message_in.getValueS32("y"); +				y = mHeight - y; +  				// only even send left mouse button events to LLCEFLib  				// (partially prompted by crash in OS X CEF when sending right button events)  				// we catch the right click in viewer and display our own context menu anyway diff --git a/indra/media_plugins/libvlc/CMakeLists.txt b/indra/media_plugins/libvlc/CMakeLists.txt new file mode 100644 index 0000000000..535d29125b --- /dev/null +++ b/indra/media_plugins/libvlc/CMakeLists.txt @@ -0,0 +1,86 @@ +# -*- cmake -*- + +project(media_plugin_libvlc) + +include(00-Common) +include(LLCommon) +include(LLImage) +include(LLPlugin) +include(LLMath) +include(LLRender) +include(LLWindow) +include(Linking) +include(PluginAPI) +include(MediaPluginBase) +include(OpenGL) + +include(LibVLCPlugin) + +include_directories( +    ${LLPLUGIN_INCLUDE_DIRS} +    ${MEDIA_PLUGIN_BASE_INCLUDE_DIRS} +    ${LLCOMMON_INCLUDE_DIRS} +    ${LLMATH_INCLUDE_DIRS} +    ${LLIMAGE_INCLUDE_DIRS} +    ${LLRENDER_INCLUDE_DIRS} +    ${LLWINDOW_INCLUDE_DIRS} +    ${VLC_INCLUDE_DIR} +) +include_directories(SYSTEM +    ${LLCOMMON_SYSTEM_INCLUDE_DIRS} +    ) + + +### media_plugin_libvlc + +if(NOT WORD_SIZE EQUAL 32) +  if(WINDOWS) +    add_definitions(/FIXED:NO) +  else(WINDOWS) # not windows therefore gcc LINUX and DARWIN +    add_definitions(-fPIC) +  endif(WINDOWS) +endif(NOT WORD_SIZE EQUAL 32) + +set(media_plugin_libvlc_SOURCE_FILES +    media_plugin_libvlc.cpp +    ) + +add_library(media_plugin_libvlc +    SHARED +    ${media_plugin_libvlc_SOURCE_FILES} +) + +target_link_libraries(media_plugin_libvlc +  ${LLPLUGIN_LIBRARIES} +  ${MEDIA_PLUGIN_BASE_LIBRARIES} +  ${LLCOMMON_LIBRARIES} +  ${VLC_PLUGIN_LIBRARIES} +  ${PLUGIN_API_WINDOWS_LIBRARIES} +) + +add_dependencies(media_plugin_libvlc +  ${LLPLUGIN_LIBRARIES} +  ${MEDIA_PLUGIN_BASE_LIBRARIES} +  ${LLCOMMON_LIBRARIES} +) + +if (WINDOWS) +  set_target_properties( +    media_plugin_libvlc +    PROPERTIES +    LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /LTCG /NODEFAULTLIB:LIBCMT" +    ) +endif (WINDOWS) + +if (DARWIN) +  # Don't prepend 'lib' to the executable name, and don't embed a full path in the library's install name +  set_target_properties( +    media_plugin_libvlc +    PROPERTIES +    PREFIX "" +    BUILD_WITH_INSTALL_RPATH 1 +    INSTALL_NAME_DIR "@executable_path" +    LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp" +  ) + +endif (DARWIN) diff --git a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp new file mode 100644 index 0000000000..3852d10c44 --- /dev/null +++ b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp @@ -0,0 +1,398 @@ +/** + * @file media_plugin_libvlc.cpp + * @brief LibVLC plugin for LLMedia API plugin system + * + * @cond + * $LicenseInfo:firstyear=2008&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + * @endcond + */ + +#include "linden_common.h" + +#include "llgl.h" +#include "llplugininstance.h" +#include "llpluginmessage.h" +#include "llpluginmessageclasses.h" +#include "media_plugin_base.h" + +#include "vlc/vlc.h" +#include "vlc/libvlc_version.h" + +//////////////////////////////////////////////////////////////////////////////// +// +class MediaPluginLibVLC : +        public MediaPluginBase +{ +    public: +        MediaPluginLibVLC( LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data ); +        ~MediaPluginLibVLC(); + +        /*virtual*/ void receiveMessage( const char* message_string ); + +    private: +        bool init(); + +		void initVLC(); +		void playMedia(); +		void resetVLC(); + +		static void* lock(void* data, void** p_pixels); +		static void unlock(void* data, void* id, void* const* raw_pixels); +		static void display(void* data, void* id); + +		libvlc_instance_t* gLibVLC; +		libvlc_media_t* gLibVLCMedia; +		libvlc_media_player_t* gLibVLCMediaPlayer; + +		struct gVLCContext +		{ +			unsigned char* texture_pixels; +			libvlc_media_player_t* mp; +			MediaPluginLibVLC* parent; +		}; +		struct gVLCContext gVLCCallbackContext; + +		std::string mURL; +}; + +//////////////////////////////////////////////////////////////////////////////// +// +MediaPluginLibVLC::MediaPluginLibVLC( LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data ) : +    MediaPluginBase( host_send_func, host_user_data ) +{ +	mTextureWidth = 0; +	mTextureHeight = 0; +    mWidth = 0; +    mHeight = 0; +    mDepth = 4; +    mPixels = 0; + +	gLibVLC = 0; +	gLibVLCMedia = 0; +	gLibVLCMediaPlayer = 0; + +	mURL = std::string(); +} + +//////////////////////////////////////////////////////////////////////////////// +// +MediaPluginLibVLC::~MediaPluginLibVLC() +{ +} + +///////////////////////////////////////////////////////////////////////////////// +// +void* MediaPluginLibVLC::lock(void* data, void** p_pixels) +{ +	struct gVLCContext* context = (gVLCContext*)data; + +	*p_pixels = context->texture_pixels; + +	return NULL; +} + +///////////////////////////////////////////////////////////////////////////////// +// +void MediaPluginLibVLC::unlock(void* data, void* id, void* const* raw_pixels) +{ +	// nothing to do here for the moment. +	// we can modify the raw_pixels here if we want to. +} + +//////////////////////////////////////////////////////////////////////////////// +// +void MediaPluginLibVLC::display(void* data, void* id) +{ +	struct gVLCContext* context = (gVLCContext*)data; + +	context->parent->setDirty(0, 0, context->parent->mWidth, context->parent->mHeight); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void MediaPluginLibVLC::initVLC() +{ +	char const* vlc_argv[] = +	{ +		"--no-xlib", +	}; + +	int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv); +	gLibVLC = libvlc_new(vlc_argc, vlc_argv); + +	if (!gLibVLC) +	{ +		// for the moment, if this fails, the plugin will fail and  +		// the media sub-system will tell the viewer something went wrong. +	} +} + +//////////////////////////////////////////////////////////////////////////////// +// +void MediaPluginLibVLC::resetVLC() +{ +	libvlc_media_player_stop(gLibVLCMediaPlayer); +	libvlc_media_player_release(gLibVLCMediaPlayer); +	libvlc_release(gLibVLC); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void MediaPluginLibVLC::playMedia() +{ +	if (mURL.length() == 0) +	{ +		return; +	} + +	if (gLibVLCMediaPlayer) +	{ +		libvlc_media_player_stop(gLibVLCMediaPlayer); +		libvlc_media_player_release(gLibVLCMediaPlayer); +	} + +	gLibVLCMedia = libvlc_media_new_location(gLibVLC, mURL.c_str()); +	if (!gLibVLCMedia) +	{ +		gLibVLCMediaPlayer = 0; +		return; +	} + +	gLibVLCMediaPlayer = libvlc_media_player_new_from_media(gLibVLCMedia); +	if (!gLibVLCMediaPlayer) +	{ +		return; +	} + +	libvlc_media_release(gLibVLCMedia); + +	gVLCCallbackContext.parent = this; +	gVLCCallbackContext.texture_pixels = mPixels; +	gVLCCallbackContext.mp = gLibVLCMediaPlayer; + +	libvlc_video_set_callbacks(gLibVLCMediaPlayer, lock, unlock, display, &gVLCCallbackContext); +	libvlc_video_set_format(gLibVLCMediaPlayer, "RV32", mWidth, mHeight, mWidth * mDepth); +	libvlc_media_player_play(gLibVLCMediaPlayer); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void MediaPluginLibVLC::receiveMessage( const char* message_string ) +{ +    LLPluginMessage message_in; + +    if(message_in.parse(message_string) >= 0) +    { +        std::string message_class = message_in.getClass(); +        std::string message_name = message_in.getName(); +        if(message_class == LLPLUGIN_MESSAGE_CLASS_BASE) +        { +            if(message_name == "init") +            { +				initVLC(); + +                LLPluginMessage message("base", "init_response"); +                LLSD versions = LLSD::emptyMap(); +                versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION; +                versions[LLPLUGIN_MESSAGE_CLASS_MEDIA] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION; +                versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER] = LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER_VERSION; +                message.setValueLLSD("versions", versions); + +				std::ostringstream s; +				s << "LibVLC plugin "; +				s << LIBVLC_VERSION_MAJOR; +				s << "."; +				s << LIBVLC_VERSION_MINOR; +				s << "."; +				s << LIBVLC_VERSION_REVISION; + +                message.setValue("plugin_version", s.str()); +                sendMessage(message); +            } +            else if(message_name == "idle") +            { +            } +            else if(message_name == "cleanup") +            { +				resetVLC(); +            } +            else if(message_name == "shm_added") +            { +                SharedSegmentInfo info; +                info.mAddress = message_in.getValuePointer("address"); +                info.mSize = (size_t)message_in.getValueS32("size"); +                std::string name = message_in.getValue("name"); + +                mSharedSegments.insert(SharedSegmentMap::value_type(name, info)); + +            } +            else if(message_name == "shm_remove") +            { +                std::string name = message_in.getValue("name"); + +                SharedSegmentMap::iterator iter = mSharedSegments.find(name); +                if(iter != mSharedSegments.end()) +                { +                    if(mPixels == iter->second.mAddress) +                    { +						libvlc_media_player_stop(gLibVLCMediaPlayer); +						libvlc_media_player_release(gLibVLCMediaPlayer); +						gLibVLCMediaPlayer = 0; + +                        mPixels = NULL; +                        mTextureSegmentName.clear(); +                    } +                    mSharedSegments.erase(iter); +                } +                else +                { +					//std::cerr << "MediaPluginWebKit::receiveMessage: unknown shared memory region!" << std::endl; +                } + +                // Send the response so it can be cleaned up. +                LLPluginMessage message("base", "shm_remove_response"); +                message.setValue("name", name); +                sendMessage(message); +            } +            else +            { +				//std::cerr << "MediaPluginWebKit::receiveMessage: unknown base message: " << message_name << std::endl; +            } +        } +        else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA) +        { +            if(message_name == "init") +            { +                LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params"); +                message.setValueS32("default_width", 1024); +                message.setValueS32("default_height", 1024); +                message.setValueS32("depth", mDepth); +				message.setValueU32("internalformat", GL_RGB); +                message.setValueU32("format", GL_BGRA_EXT); +                message.setValueU32("type", GL_UNSIGNED_BYTE); +                message.setValueBoolean("coords_opengl", false); +                sendMessage(message); +            } +            else if(message_name == "size_change") +            { +                std::string name = message_in.getValue("name"); +                S32 width = message_in.getValueS32("width"); +                S32 height = message_in.getValueS32("height"); +                S32 texture_width = message_in.getValueS32("texture_width"); +                S32 texture_height = message_in.getValueS32("texture_height"); + +                if(!name.empty()) +                { +                    // Find the shared memory region with this name +                    SharedSegmentMap::iterator iter = mSharedSegments.find(name); +                    if(iter != mSharedSegments.end()) +                    { +                        mPixels = (unsigned char*)iter->second.mAddress; +                        mWidth = width; +                        mHeight = height; +                        mTextureWidth = texture_width; +                        mTextureHeight = texture_height; + +						playMedia(); +					}; +                }; + +				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response"); +				message.setValue("name", name); +				message.setValueS32("width", width); +				message.setValueS32("height", height); +				message.setValueS32("texture_width", texture_width); +				message.setValueS32("texture_height", texture_height); +				sendMessage(message); +            } +            else if(message_name == "load_uri") +            { +				mURL = message_in.getValue("uri"); +				playMedia(); +            } +        } +		else  +		if (message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME) +		{ +			if (message_name == "stop") +			{ +				if (gLibVLCMediaPlayer) +				{ +					libvlc_media_player_stop(gLibVLCMediaPlayer); +				} +			} +			else if (message_name == "start") +			{ +				if (gLibVLCMediaPlayer) +				{ +					libvlc_media_player_play(gLibVLCMediaPlayer); +				} +			} +			else if (message_name == "pause") +			{ +				if (gLibVLCMediaPlayer) +				{ +					libvlc_media_player_pause(gLibVLCMediaPlayer); +				} +			} +			else if (message_name == "seek") +			{ +			} +			else if (message_name == "set_loop") +			{ +			} +			else if (message_name == "set_volume") +			{ +				if (gLibVLCMediaPlayer) +				{ +					F64 volume = message_in.getValueReal("volume"); +					libvlc_audio_set_volume(gLibVLCMediaPlayer, (int)(volume * 100)); +				} +			} +		} +    } +} + +//////////////////////////////////////////////////////////////////////////////// +// +bool MediaPluginLibVLC::init() +{ +    LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text" ); +    message.setValue( "name", "LibVLC Plugin" ); +    sendMessage( message ); + +    return true; +}; + +//////////////////////////////////////////////////////////////////////////////// +// +int init_media_plugin( LLPluginInstance::sendMessageFunction host_send_func, +                        void* host_user_data, +                        LLPluginInstance::sendMessageFunction *plugin_send_func, +                        void **plugin_user_data ) +{ +    MediaPluginLibVLC* self = new MediaPluginLibVLC( host_send_func, host_user_data ); +    *plugin_send_func = MediaPluginLibVLC::staticReceiveMessage; +    *plugin_user_data = ( void* )self; + +    return 0; +} diff --git a/indra/media_plugins/quicktime/CMakeLists.txt b/indra/media_plugins/quicktime/CMakeLists.txt index c5615145be..58391007ff 100644..100755 --- a/indra/media_plugins/quicktime/CMakeLists.txt +++ b/indra/media_plugins/quicktime/CMakeLists.txt @@ -14,7 +14,6 @@ include(PluginAPI)  include(MediaPluginBase)  include(OpenGL)  include(QuickTimePlugin) -include(Boost)  include_directories(      ${LLPLUGIN_INCLUDE_DIRS} @@ -54,12 +53,17 @@ target_link_libraries(media_plugin_quicktime    ${PLUGIN_API_WINDOWS_LIBRARIES}  ) +add_dependencies(media_plugin_quicktime +  ${LLPLUGIN_LIBRARIES} +  ${MEDIA_PLUGIN_BASE_LIBRARIES} +  ${LLCOMMON_LIBRARIES} +) +  if (WINDOWS)    set_target_properties(      media_plugin_quicktime      PROPERTIES -    LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /NODEFAULTLIB:LIBCMT" -    LINK_FLAGS_DEBUG "/MANIFEST:NO /SAFESEH:NO /NODEFAULTLIB:LIBCMTD" +    LINK_FLAGS "/MANIFEST:NO"      )  endif (WINDOWS) diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp index 7ef5a0fe44..6d4c6ca43d 100644..100755 --- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp +++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp @@ -311,7 +311,9 @@ private:  			MatrixRecord transform;  			SetIdentityMatrix( &transform );	// transforms are additive so start from identify matrix  			double scaleX = (double) mWidth / mNaturalWidth; -			double scaleY = -1.0 * (double) mHeight / mNaturalHeight; + +            // 2016-05-31 CP remove local flip (via -1.0) since texture coods for media on a prim are now flipped for VLC/CEF +			double scaleY = 1.0 * (double) mHeight / mNaturalHeight;  			double centerX = mWidth / 2.0;  			double centerY = mHeight / 2.0;  			ScaleMatrix( &transform, X2Fix( scaleX ), X2Fix( scaleY ), X2Fix( centerX ), X2Fix( centerY ) ); @@ -837,9 +839,7 @@ void MediaPluginQuickTime::receiveMessage(const char *message_string)  			else if(message_name == "cleanup")  			{  				// TODO: clean up here -                LLPluginMessage message("base", "goodbye"); -                sendMessage(message); -            } +			}  			else if(message_name == "shm_added")  			{  				SharedSegmentInfo info; @@ -921,7 +921,10 @@ void MediaPluginQuickTime::receiveMessage(const char *message_string)  				#endif  				message.setValueS32("depth", mDepth);  				message.setValueU32("internalformat", GL_RGB); -				message.setValueBoolean("coords_opengl", true);	// true == use OpenGL-style coordinates, false == (0,0) is upper left. + +                // note this apparently only has an effect when media is opened in 2D browser.  +                // see https://jira.secondlife.com/browse/BUG-18252 - media flipped in 2D so flipping it back. +				message.setValueBoolean("coords_opengl", false);	// true == use OpenGL-style coordinates, false == (0,0) is upper left.  				message.setValueBoolean("allow_downsample", true);  				sendMessage(message);  			} diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 8d863631cf..f7f01a6e4e 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1753,6 +1753,7 @@ if (WINDOWS)        SLPlugin        media_plugin_quicktime        media_plugin_cef +      media_plugin_libvlc        winmm_shim        windows-crash-logger        ) @@ -1968,6 +1969,7 @@ if (LINUX)      linux-crash-logger      SLPlugin      media_plugin_gstreamer010 +    media_plugin_libvlc      llcommon      ) @@ -2075,7 +2077,7 @@ if (DARWIN)        ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py      ) -  add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_cef mac-crash-logger) +  add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_libvlc media_plugin_cef mac-crash-logger)    add_dependencies(${VIEWER_BINARY_NAME} mac-crash-logger)    if (ENABLE_SIGNING) diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl index 3c026796c8..7e83389f6e 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl @@ -26,6 +26,13 @@  uniform mat3 normal_matrix;  uniform mat4 texture_matrix0;  uniform mat4 modelview_projection_matrix; +uniform bool invert_tex_y = false; +const mat4 invTexM = mat4( +  1, 0, 0, 0, +  0,-1, 0, 0, +  0, 0, 1, 0, +  0, 0, 0, 1 +);   ATTRIBUTE vec3 position;  ATTRIBUTE vec4 diffuse_color; @@ -44,6 +51,10 @@ void main()  	//transform vertex  	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);   	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; +  if(invert_tex_y)  +	{ +		vary_texcoord0 = vec2(invTexM * vec4(vary_texcoord0,0,1)).xy; +	}  	passTextureIndex();  	vary_normal = normalize(normal_matrix * normal); diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl index 8e899e3e0f..2595712882 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl @@ -26,6 +26,13 @@  uniform mat4 texture_matrix0;  uniform mat4 modelview_matrix;  uniform mat4 modelview_projection_matrix; +uniform bool invert_tex_y = false; +const mat4 invTexM = mat4( +  1, 0, 0, 0, +  0,-1, 0, 0, +  0, 0, 1, 0, +  0, 0, 0, 1 +);  ATTRIBUTE vec3 position; @@ -62,6 +69,10 @@ void main()  #endif  	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; +  if(invert_tex_y)  +	{ +		vary_texcoord0 = vec2(invTexM * vec4(vary_texcoord0,0,1)).xy; +	}  	calcAtmospherics(pos.xyz); diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl index fc20d3270e..a8efcd9857 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl @@ -26,6 +26,14 @@  uniform mat4 texture_matrix0;  uniform mat4 modelview_matrix;  uniform mat4 modelview_projection_matrix; + +uniform bool invert_tex_y = false; +const mat4 invTexM = mat4( +  1, 0, 0, 0, +  0,-1, 0, 0, +  0, 0, 1, 0, +  0, 0, 0, 1 +);  ATTRIBUTE vec3 position;  void passTextureIndex(); @@ -49,6 +57,11 @@ void main()  	vec4 pos = (modelview_matrix * vert);  	gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);  	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; +   +  if(invert_tex_y)  +	{ +		vary_texcoord0 = vec2(invTexM * vec4(vary_texcoord0,0,1)).xy; +	}  	calcAtmospherics(pos.xyz); diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl index 37a20383e2..c744dc1397 100644 --- a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl @@ -27,6 +27,13 @@ uniform mat3 normal_matrix;  uniform mat4 texture_matrix0;  uniform mat4 modelview_matrix;  uniform mat4 modelview_projection_matrix; +uniform bool invert_tex_y = false; +const mat4 invTexM = mat4( +  1, 0, 0, 0, +  0,-1, 0, 0, +  0, 0, 1, 0, +  0, 0, 0, 1 +);   ATTRIBUTE vec3 position;  void passTextureIndex(); @@ -51,7 +58,10 @@ void main()  	gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);  	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0, 0, 1)).xy; -	 +	if(invert_tex_y)  +	{ +		vary_texcoord0 = vec2(invTexM * vec4(vary_texcoord0,0,1)).xy; +	}  	vec3 norm = normalize(normal_matrix * normal); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index b6d02ea2f8..c8153cabda 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -124,7 +124,10 @@  #include "llcoros.h"  #if !LL_LINUX  #include "cef/llceflib.h" -#endif +#if LL_WINDOWS +#include "vlc/libvlc_version.h" +#endif // LL_WINDOWS +#endif // LL_LINUX  // Third party library includes  #include <boost/bind.hpp> @@ -3342,6 +3345,19 @@ LLSD LLAppViewer::getViewerInfo() const  	info["LLCEFLIB_VERSION"] = LLCEFLIB_VERSION;  #else  	info["LLCEFLIB_VERSION"] = "Undefined"; + +#endif + +#if LL_WINDOWS +	std::ostringstream ver_codec; +	ver_codec << LIBVLC_VERSION_MAJOR; +	ver_codec << "."; +	ver_codec << LIBVLC_VERSION_MINOR; +	ver_codec << "."; +	ver_codec << LIBVLC_VERSION_REVISION; +	info["LIBVLC_VERSION"] = ver_codec.str(); +#else +	info["LIBVLC_VERSION"] = "Undefined";  #endif  	S32 packets_in = LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_IN); diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index f74164aea6..a6cf917cbd 100644 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -473,6 +473,10 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL ba  				if (params.mTextureList[i].notNull())  				{  					gGL.getTexUnit(i)->bind(params.mTextureList[i], TRUE); +					if (LLViewerTexture::MEDIA_TEXTURE == params.mTextureList[i]->getType()) +					{ +						gGL.setInverseTexCoordByY(true); +					}  				}  			}  		} @@ -482,13 +486,54 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL ba  			{  				params.mTexture->addTextureStats(params.mVSize);  				gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ; + +				if (!gPipeline.mVertexShadersEnabled) +				{ +					if (LLViewerTexture::MEDIA_TEXTURE == params.mTexture->getType() && !params.mTextureMatrix) +					{ +						static const float fIdntInvY[] = { +							1, 0, 0, 0, +							0, -1, 0, 0, +							0, 0, 1, 0, +							0, 0, 0, 1 +						}; + +						gGL.getTexUnit(0)->activate(); +						gGL.matrixMode(LLRender::MM_TEXTURE); +						gGL.loadMatrix((GLfloat*)fIdntInvY); +						gPipeline.mTextureMatrixOps++; + +						tex_setup = true; +					} +				} +				else +				{ +					gGL.setInverseTexCoordByY(LLViewerTexture::MEDIA_TEXTURE == params.mTexture->getType()); +				} +  				if (params.mTextureMatrix)  				{  					tex_setup = true;  					gGL.getTexUnit(0)->activate();  					gGL.matrixMode(LLRender::MM_TEXTURE);  					gGL.loadMatrix((GLfloat*) params.mTextureMatrix->mMatrix); + +					if (LLViewerTexture::MEDIA_TEXTURE == params.mTexture->getType() && !gPipeline.mVertexShadersEnabled) +					{ +						static const float fIdntInvY[] = { +							1, 0, 0, 0, +							0, -1, 0, 0, +							0, 0, 1, 0, +							0, 0, 0, 1 +						}; + +						gGL.multMatrix(fIdntInvY); +						gPipeline.mMatrixOpCount++; +					} +  					gPipeline.mTextureMatrixOps++; + +					tex_setup = true;  				}  			}  			else diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp index 024e315632..c039b3b8f4 100644 --- a/indra/newview/llfloaterwebcontent.cpp +++ b/indra/newview/llfloaterwebcontent.cpp @@ -81,7 +81,8 @@ LLFloaterWebContent::LLFloaterWebContent( const Params& params )  	mCommitCallbackRegistrar.add( "WebContent.Reload", boost::bind( &LLFloaterWebContent::onClickReload, this ));  	mCommitCallbackRegistrar.add( "WebContent.Stop", boost::bind( &LLFloaterWebContent::onClickStop, this ));  	mCommitCallbackRegistrar.add( "WebContent.EnterAddress", boost::bind( &LLFloaterWebContent::onEnterAddress, this )); -	mCommitCallbackRegistrar.add( "WebContent.PopExternal", boost::bind( &LLFloaterWebContent::onPopExternal, this )); +	mCommitCallbackRegistrar.add( "WebContent.PopExternal", boost::bind(&LLFloaterWebContent::onPopExternal, this)); +	mCommitCallbackRegistrar.add( "WebContent.TestVideo", boost::bind(&LLFloaterWebContent::onTestVideo, this, _2));  }  BOOL LLFloaterWebContent::postBuild() @@ -229,7 +230,7 @@ void LLFloaterWebContent::preCreate(LLFloaterWebContent::Params& p)  		for(LLFloaterReg::const_instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); iter++)  		{  			LL_DEBUGS() << "    " << (*iter)->getKey()["target"] << LL_ENDL; -		} +		}	  		if(instances.size() >= (size_t)browser_window_limit)  		{ @@ -243,9 +244,9 @@ void LLFloaterWebContent::open_media(const Params& p)  {  	// Specifying a mime type of text/html here causes the plugin system to skip the MIME type probe and just open a browser plugin.  	LLViewerMedia::proxyWindowOpened(p.target(), p.id()); -	mWebBrowser->setHomePageUrl(p.url, HTTP_CONTENT_TEXT_HTML); +	mWebBrowser->setHomePageUrl(p.url);  	mWebBrowser->setTarget(p.target); -	mWebBrowser->navigateTo(p.url, HTTP_CONTENT_TEXT_HTML, p.clean_browser); +	mWebBrowser->navigateTo(p.url);  	set_current_url(p.url); @@ -499,7 +500,7 @@ void LLFloaterWebContent::onEnterAddress()      LLStringUtil::trim(url);  	if ( url.length() > 0 )  	{ -		mWebBrowser->navigateTo(url, HTTP_CONTENT_TEXT_HTML); +		mWebBrowser->navigateTo(url);  	};  } @@ -508,9 +509,18 @@ void LLFloaterWebContent::onPopExternal()  	// make sure there is at least something there.  	// (perhaps this test should be for minimum length of a URL)  	std::string url = mAddressCombo->getValue().asString(); -    LLStringUtil::trim(url); -	if ( url.length() > 0 ) +	LLStringUtil::trim(url); +	if (url.length() > 0) +	{ +		LLWeb::loadURLExternal(url); +	}; +} + +void LLFloaterWebContent::onTestVideo(std::string url) +{ +	LLStringUtil::trim(url); +	if (url.length() > 0)  	{ -		LLWeb::loadURLExternal( url ); +		mWebBrowser->navigateTo(url);  	};  } diff --git a/indra/newview/llfloaterwebcontent.h b/indra/newview/llfloaterwebcontent.h index 4291fd9f2c..519b575b38 100644 --- a/indra/newview/llfloaterwebcontent.h +++ b/indra/newview/llfloaterwebcontent.h @@ -92,6 +92,7 @@ protected:  	void onClickStop();  	void onEnterAddress();  	void onPopExternal(); +	void onTestVideo(std::string url);  	static void preCreate(Params& p);  	void open_media(const Params& ); diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 9cf3249983..08c927483f 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -911,7 +911,7 @@ void LLMediaCtrl::convertInputCoords(S32& x, S32& y)  	}  	x = ll_round((F32)x * LLUI::getScaleFactor().mV[VX]); -	if ( ! coords_opengl ) +	if (  coords_opengl )  	{  		y = ll_round((F32)(y) * LLUI::getScaleFactor().mV[VY]);  	} diff --git a/indra/newview/llsurfacepatch.cpp b/indra/newview/llsurfacepatch.cpp index 2d06b8599c..d28a7cc048 100644 --- a/indra/newview/llsurfacepatch.cpp +++ b/indra/newview/llsurfacepatch.cpp @@ -230,8 +230,8 @@ void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3  	const F32 xyScaleInv = (1.f / xyScale)*(0.2222222222f);  	F32 vec[3] = { -					fmod((F32)(mOriginGlobal.mdV[0] + x)*xyScaleInv, 256.f), -					fmod((F32)(mOriginGlobal.mdV[1] + y)*xyScaleInv, 256.f), +                    (F32)fmod((F32)(mOriginGlobal.mdV[0] + x)*xyScaleInv, 256.f), +                    (F32)fmod((F32)(mOriginGlobal.mdV[1] + y)*xyScaleInv, 256.f),  					0.f  				};  	F32 rand_val = llclamp(noise2(vec)* 0.75f + 0.5f, 0.f, 1.f); diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 11d3706821..cee47a591e 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -957,10 +957,10 @@ void LLWorld::updateWaterObjects()  	center_y = min_y + (wy >> 1);  	S32 add_boundary[4] = { -		512 - (max_x - region_x), -		512 - (max_y - region_y), -		512 - (region_x - min_x), -		512 - (region_y - min_y) }; +		(S32)(512 - (max_x - region_x)), +		(S32)(512 - (max_y - region_y)), +		(S32)(512 - (region_x - min_x)), +		(S32)(512 - (region_y - min_y)) };  	S32 dir;  	for (dir = 0; dir < 8; dir++) diff --git a/indra/newview/skins/default/textures/icons/Video_URL_Off.png b/indra/newview/skins/default/textures/icons/Video_URL_Off.pngBinary files differ new file mode 100644 index 0000000000..40e5df7d81 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Video_URL_Off.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 72037a84b3..01e8c16937 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -676,7 +676,10 @@ with the same filename but different name    <texture name="Unread_Chiclet" file_name="bottomtray/Unread_Chiclet.png" preload="false" />    <texture name="UpArrow_Off" file_name="icons/UpArrow_Off.png" preload="false" /> -	<texture name="Vertical Drag Handle" file_name="widgets/vertical_drag_handle.png" scale.left="2" scale.right="7" scale.bottom="8" scale.top="120"  scale_type="scale_outer"/> + +  <texture name="Video_URL_Off" file_name="icons/Video_URL_Off.png" preload="true" /> +   +  <texture name="Vertical Drag Handle" file_name="widgets/vertical_drag_handle.png" scale.left="2" scale.right="7" scale.bottom="8" scale.top="120"  scale_type="scale_outer"/>      <texture name="Volume_Background" file_name="windows/Volume_Background.png" preload="false"             scale.left="6" scale.top="33" scale.right="63" scale.bottom="10" /> diff --git a/indra/newview/skins/default/xui/en/floater_web_content.xml b/indra/newview/skins/default/xui/en/floater_web_content.xml index a80440e844..7b63a67415 100644 --- a/indra/newview/skins/default/xui/en/floater_web_content.xml +++ b/indra/newview/skins/default/xui/en/floater_web_content.xml @@ -25,10 +25,10 @@      <layout_panel        auto_resize="false"        default_tab_group="1" -      height="22" +      height="44"        layout="topleft"        left="0" -      min_height="20" +      min_height="40"        name="nav_controls"        top="400"        width="770"> @@ -152,6 +152,112 @@          <button.commit_callback            function="WebContent.PopExternal" />        </button> + +      <button +        image_overlay="Video_URL_Off" +		    image_disabled="PushButton_Disabled" +		    image_disabled_selected="PushButton_Disabled" +		    image_selected="PushButton_Selected" +		    image_unselected="PushButton_Off" +        chrome="true" +        tool_tip="MPEG4 Video Test" +        enabled="true" +        follows="left|top" +        height="22" +        layout="topleft" +        left="1" +        name="VLC Plugin Test" +        top="22" +        width="22"> +        <button.commit_callback +          function="WebContent.TestVideo" +          parameter="https://callum-linden.s3.amazonaws.com/sample_media/ss.mp4"/> +      </button> + +      <button +        image_overlay="Video_URL_Off" +		    image_disabled="PushButton_Disabled" +		    image_disabled_selected="PushButton_Disabled" +		    image_selected="PushButton_Selected" +		    image_unselected="PushButton_Off" +        chrome="true" +        tool_tip="MKV Video Test" +        enabled="true" +        follows="left|top" +        height="22" +        layout="topleft" +        left="27" +        name="VLC Plugin Test" +        top="22" +        width="22"> +        <button.commit_callback +          function="WebContent.TestVideo" +          parameter="https://callum-linden.s3.amazonaws.com/sample_media/jellyfish.mkv"/> +      </button> + +      <button +        image_overlay="Video_URL_Off" +		    image_disabled="PushButton_Disabled" +		    image_disabled_selected="PushButton_Disabled" +		    image_selected="PushButton_Selected" +		    image_unselected="PushButton_Off" +        chrome="true" +        tool_tip="WebM Video Test" +        enabled="true" +        follows="left|top" +        height="22" +        layout="topleft" +        left="51" +        name="VLC Plugin Test" +        top="22" +        width="22"> +        <button.commit_callback +          function="WebContent.TestVideo" +          parameter="https://callum-linden.s3.amazonaws.com/sample_media/jumprope.webm"/> +      </button> + +      <button +        image_overlay="Video_URL_Off" +		    image_disabled="PushButton_Disabled" +		    image_disabled_selected="PushButton_Disabled" +		    image_selected="PushButton_Selected" +		    image_unselected="PushButton_Off" +        chrome="true" +        tool_tip="MP3 audio Test" +        enabled="true" +        follows="left|top" +        height="22" +        layout="topleft" +        left="75" +        name="VLC Plugin Test" +        top="22" +        width="22"> +        <button.commit_callback +          function="WebContent.TestVideo" +          parameter="https://callum-linden.s3.amazonaws.com/alegria.mp3"/> +      </button> + +      <button +        image_overlay="Video_URL_Off" +		    image_disabled="PushButton_Disabled" +		    image_disabled_selected="PushButton_Disabled" +		    image_selected="PushButton_Selected" +		    image_unselected="PushButton_Off" +        chrome="true" +        tool_tip="FLV Test" +        enabled="true" +        follows="left|top" +        height="22" +        layout="topleft" +        left="99" +        name="VLC Plugin Test" +        top="22" +        width="22"> +        <button.commit_callback +          function="WebContent.TestVideo" +          parameter="https://callum-linden.s3.amazonaws.com/sample_media/vandal.flv"/> +      </button> +      </layout_panel>      <layout_panel        height="40" diff --git a/indra/newview/skins/default/xui/en/mime_types.xml b/indra/newview/skins/default/xui/en/mime_types.xml index 7cb4a6e53b..c27fac6731 100644 --- a/indra/newview/skins/default/xui/en/mime_types.xml +++ b/indra/newview/skins/default/xui/en/mime_types.xml @@ -130,10 +130,21 @@  			movie  		</widgettype>  		<impl> -			media_plugin_quicktime +			media_plugin_cef  		</impl>  	</scheme> -	<mimetype name="blank"> +  <scheme name="libvlc"> +    <label name="libvlc_label"> +      LibVLC supported media +    </label> +    <widgettype> +      movie +    </widgettype> +    <impl> +      media_plugin_libvlc +    </impl> +  </scheme> +  <mimetype name="blank">  		<label name="blank_label">  			- None -  		</label> @@ -163,7 +174,7 @@  			audio  		</widgettype>  		<impl> -			media_plugin_quicktime +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype name="video/*"> @@ -174,7 +185,7 @@  			movie  		</widgettype>  		<impl> -			media_plugin_quicktime +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype name="image/*"> @@ -196,7 +207,7 @@  			movie  		</widgettype>  		<impl> -			media_plugin_quicktime +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype name="application/javascript"> @@ -218,7 +229,7 @@  			audio  		</widgettype>  		<impl> -			media_plugin_quicktime +			media_plugin_cef  		</impl>  	</mimetype>  	<mimetype name="application/pdf"> @@ -295,7 +306,7 @@  			audio  		</widgettype>  		<impl> -			media_plugin_quicktime +			media_plugin_cef  		</impl>  	</mimetype>  	<mimetype name="audio/mpeg"> @@ -306,7 +317,7 @@  			audio  		</widgettype>  		<impl> -			media_plugin_quicktime +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype name="audio/x-aiff"> @@ -317,7 +328,7 @@  			audio  		</widgettype>  		<impl> -			media_plugin_quicktime +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype name="audio/x-wav"> @@ -328,7 +339,7 @@  			audio  		</widgettype>  		<impl> -			media_plugin_quicktime +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype menu="1" name="image/bmp"> @@ -438,7 +449,7 @@  			movie  		</widgettype>  		<impl> -			media_plugin_quicktime +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype name="video/mp4"> @@ -449,10 +460,21 @@  			movie  		</widgettype>  		<impl> -			media_plugin_quicktime +			media_plugin_libvlc  		</impl>  	</mimetype> -	<mimetype menu="1" name="video/quicktime"> +  <mimetype name="application/octet-stream"> +    <label name="video/octet-stream"> +      Movie +    </label> +    <widgettype> +      movie +    </widgettype> +    <impl> +      media_plugin_libvlc +    </impl> +  </mimetype> +  <mimetype menu="1" name="video/quicktime">  		<label name="video/quicktime_label">  			Movie (QuickTime)  		</label> @@ -460,7 +482,7 @@  			movie  		</widgettype>  		<impl> -			media_plugin_quicktime +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype name="video/x-ms-asf"> @@ -471,7 +493,7 @@  			movie  		</widgettype>  		<impl> -			media_plugin_quicktime +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype name="video/x-ms-wmv"> @@ -482,7 +504,7 @@  			movie  		</widgettype>  		<impl> -			media_plugin_quicktime +			media_plugin_cef  		</impl>  	</mimetype>  	<mimetype menu="1" name="video/x-msvideo"> @@ -493,7 +515,7 @@  			movie  		</widgettype>  		<impl> -			media_plugin_quicktime +			media_plugin_cef  		</impl>  	</mimetype>  </mimetypes> diff --git a/indra/newview/skins/default/xui/en/mime_types_linux.xml b/indra/newview/skins/default/xui/en/mime_types_linux.xml index 84aeaf3b54..7188b1e699 100644 --- a/indra/newview/skins/default/xui/en/mime_types_linux.xml +++ b/indra/newview/skins/default/xui/en/mime_types_linux.xml @@ -130,7 +130,7 @@  			movie  		</widgettype>  		<impl> -			media_plugin_gstreamer +			media_plugin_libvlc  		</impl>  	</scheme>  	<mimetype name="blank"> @@ -163,7 +163,7 @@  			audio  		</widgettype>  		<impl> -			media_plugin_gstreamer +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype name="video/*"> @@ -174,7 +174,7 @@  			movie  		</widgettype>  		<impl> -			media_plugin_gstreamer +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype name="image/*"> @@ -196,7 +196,7 @@  			movie  		</widgettype>  		<impl> -			media_plugin_gstreamer +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype name="application/javascript"> @@ -218,7 +218,7 @@  			audio  		</widgettype>  		<impl> -			media_plugin_gstreamer +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype name="application/pdf"> @@ -295,7 +295,7 @@  			audio  		</widgettype>  		<impl> -			media_plugin_gstreamer +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype name="audio/mpeg"> @@ -306,7 +306,7 @@  			audio  		</widgettype>  		<impl> -			media_plugin_gstreamer +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype name="audio/x-aiff"> @@ -317,7 +317,7 @@  			audio  		</widgettype>  		<impl> -			media_plugin_gstreamer +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype name="audio/x-wav"> @@ -328,7 +328,7 @@  			audio  		</widgettype>  		<impl> -			media_plugin_gstreamer +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype menu="1" name="image/bmp"> @@ -438,7 +438,7 @@  			movie  		</widgettype>  		<impl> -			media_plugin_gstreamer +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype name="video/mp4"> @@ -449,7 +449,7 @@  			movie  		</widgettype>  		<impl> -			media_plugin_gstreamer +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype menu="1" name="video/quicktime"> @@ -460,7 +460,7 @@  			movie  		</widgettype>  		<impl> -			media_plugin_gstreamer +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype name="video/x-ms-asf"> @@ -471,7 +471,7 @@  			movie  		</widgettype>  		<impl> -			media_plugin_gstreamer +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype name="video/x-ms-wmv"> @@ -482,7 +482,7 @@  			movie  		</widgettype>  		<impl> -			media_plugin_gstreamer +			media_plugin_libvlc  		</impl>  	</mimetype>  	<mimetype menu="1" name="video/x-msvideo"> @@ -493,7 +493,7 @@  			movie  		</widgettype>  		<impl> -			media_plugin_gstreamer +			media_plugin_libvlc  		</impl>  	</mimetype>  </mimetypes> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index ae63546082..3be74218a2 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -51,12 +51,13 @@ OpenGL Version: [OPENGL_VERSION]  J2C Decoder Version: [J2C_VERSION]  Audio Driver Version: [AUDIO_DRIVER_VERSION]  LLCEFLib/CEF Version: [LLCEFLIB_VERSION] +LibVLC Version: [LIBVLC_VERSION]  Voice Server Version: [VOICE_VERSION]  	</string>  	<string name="AboutTraffic">Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)</string>  	<string name="ErrorFetchingServerReleaseNotesURL">Error fetching server release notes URL.</string>  	<string name="BuildConfiguration">Build Configuration</string> - +	  	<!--  progress -->  	<string name="ProgressRestoring">Restoring...</string>  	<string name="ProgressChangingResolution">Changing resolution...</string> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 1c77cf805e..04cc4774e4 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -436,6 +436,11 @@ class Windows_i686_Manifest(ViewerManifest):              self.path("media_plugin_cef.dll")              self.end_prefix() +        # Media plugins - LibVLC +        if self.prefix(src='../media_plugins/libvlc/%s' % self.args['configuration'], dst="llplugin"): +            self.path("media_plugin_libvlc.dll") +            self.end_prefix() +          # winmm.dll shim          if self.prefix(src='../media_plugins/winmmshim/%s' % self.args['configuration'], dst=""):              self.path("winmm.dll") @@ -542,6 +547,12 @@ class Windows_i686_Manifest(ViewerManifest):              self.path("zh-TW.pak")              self.end_prefix() +            if self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="llplugin"): +                self.path("libvlc.dll") +                self.path("libvlccore.dll") +                self.path("plugins/") +                self.end_prefix() +          # pull in the crash logger and updater from other projects          # tag:"crash-logger" here as a cue to the exporter          self.path(src='../win_crash_logger/%s/windows-crash-logger.exe' % self.args['configuration'], @@ -1081,8 +1092,18 @@ class LinuxManifest(ViewerManifest):          # plugins          if self.prefix(src="", dst="bin/llplugin"):              self.path("../media_plugins/gstreamer010/libmedia_plugin_gstreamer010.so", "libmedia_plugin_gstreamer.so") +            self.path("../media_plugins/libvlc/libmedia_plugin_libvlc.so", "libmedia_plugin_libvlc.so")              self.end_prefix("bin/llplugin") +        if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'vlc', 'plugins'), dst="bin/llplugin/vlc/plugins"): +            self.path( "plugins.dat" ) +            self.path( "*/*.so" ) +            self.end_prefix() + +        if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib' ), dst="lib"): +            self.path( "libvlc*.so*" ) +            self.end_prefix() +          # llcommon          if not self.path("../llcommon/libllcommon.so", "lib/libllcommon.so"):              print "Skipping llcommon.so (assuming llcommon was linked statically)" @@ -1136,7 +1157,7 @@ class LinuxManifest(ViewerManifest):      def strip_binaries(self):          if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer():              print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build" -            self.run_command(r"find %(d)r/bin %(d)r/lib -type f \! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure +            self.run_command(r"find %(d)r/bin %(d)r/lib -type f \! -name update_install \! -name *.dat | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure  class Linux_i686_Manifest(LinuxManifest):      def construct(self): | 
