diff options
Diffstat (limited to 'indra')
30 files changed, 176 insertions, 1943 deletions
| diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index 13a31cbce7..100645611e 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -30,7 +30,6 @@ set(cmake_SOURCE_FILES      FindFMODEX.cmake      FindGLH.cmake      FindGoogleBreakpad.cmake -    FindGooglePerfTools.cmake      FindHUNSPELL.cmake      FindJsonCpp.cmake      FindNDOF.cmake @@ -46,11 +45,8 @@ set(cmake_SOURCE_FILES      GLOD.cmake  ##  GStreamer010Plugin.cmake      GetPrerequisites_2_8.cmake -##  Glui.cmake -    Glut.cmake      GoogleBreakpad.cmake      GoogleMock.cmake -    GooglePerfTools.cmake      Havok.cmake      Hunspell.cmake      JPEG.cmake @@ -90,7 +86,6 @@ set(cmake_SOURCE_FILES      Prebuilt.cmake      PulseAudio.cmake      Python.cmake -    QuickTimePlugin.cmake      TemplateCheck.cmake      Tut.cmake      UI.cmake diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 70d85b864c..4c1fb087e7 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -30,21 +30,20 @@ if(WINDOWS)      #*******************************      # Misc shared libs  -    set(debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}") -    set(debug_files -        openjpegd.dll -        libapr-1.dll -        libaprutil-1.dll -        libapriconv-1.dll -        ssleay32.dll -        libeay32.dll -        glod.dll     -        libhunspell.dll -        ) +#    set(debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}") +#    set(debug_files +#        libapr-1.dll +#        libaprutil-1.dll +#        libapriconv-1.dll +#        ssleay32.dll +#        libeay32.dll +#        glod.dll     +#        libhunspell.dll +#        )      set(release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")      set(release_files -        openjpeg.dll +        openjp2.dll          libapr-1.dll          libaprutil-1.dll          libapriconv-1.dll @@ -54,13 +53,8 @@ if(WINDOWS)          libhunspell.dll          ) -    if(USE_TCMALLOC) -      set(debug_files ${debug_files} libtcmalloc_minimal-debug.dll) -      set(release_files ${release_files} libtcmalloc_minimal.dll) -    endif(USE_TCMALLOC) -      if (FMODEX) -      set(debug_files ${debug_files} fmodexL.dll) +#      set(debug_files ${debug_files} fmodexL.dll)        set(release_files ${release_files} fmodex.dll)      endif (FMODEX) @@ -234,10 +228,6 @@ elseif(LINUX)          libfontconfig.so.1         ) -    if (USE_TCMALLOC) -      set(release_files ${release_files} "libtcmalloc_minimal.so") -    endif (USE_TCMALLOC) -      if (FMODEX)        set(debug_files ${debug_files} "libfmodexL.so")        set(release_files ${release_files} "libfmodex.so") @@ -294,13 +284,13 @@ set(third_party_targets ${third_party_targets} ${out_targets}) -copy_if_different( -    ${debug_src_dir} -    "${SHARED_LIB_STAGING_DIR_DEBUG}" -    out_targets -    ${debug_files} -    ) -set(third_party_targets ${third_party_targets} ${out_targets}) +#copy_if_different( +#    ${debug_src_dir} +#    "${SHARED_LIB_STAGING_DIR_DEBUG}" +#    out_targets +#    ${debug_files} +#    ) +#set(third_party_targets ${third_party_targets} ${out_targets})  copy_if_different(      ${release_src_dir} diff --git a/indra/cmake/Glui.cmake b/indra/cmake/Glui.cmake deleted file mode 100644 index db353a91ec..0000000000 --- a/indra/cmake/Glui.cmake +++ /dev/null @@ -1,28 +0,0 @@ -# -*- cmake -*- -include(Linking) -include(Prebuilt) - -if (USESYSTEMLIBS) -    set(GLUI OFF CACHE BOOL -        "GLUI support for the llplugin/llmedia test apps.") -else (USESYSTEMLIBS) -    use_prebuilt_binary(glui) -    set(GLUI ON CACHE BOOL -        "GLUI support for the llplugin/llmedia test apps.") -endif (USESYSTEMLIBS) - -if (LINUX) -    set(GLUI ON CACHE BOOL -        "llplugin media apps HACK for Linux.") -endif (LINUX) - -if (DARWIN OR LINUX) -    set(GLUI_LIBRARY -        glui) -endif (DARWIN OR LINUX) - -if (WINDOWS) -    set(GLUI_LIBRARY -        debug glui32.lib -        optimized glui32.lib) -endif (WINDOWS) diff --git a/indra/cmake/Glut.cmake b/indra/cmake/Glut.cmake deleted file mode 100644 index 314da30652..0000000000 --- a/indra/cmake/Glut.cmake +++ /dev/null @@ -1,19 +0,0 @@ -# -*- cmake -*- -include(Linking) -include(Prebuilt) - -if (WINDOWS) -    use_prebuilt_binary(freeglut) -    set(GLUT_LIBRARY -        debug freeglut_static.lib -        optimized freeglut_static.lib) -endif (WINDOWS) - -if (LINUX) -  FIND_LIBRARY(GLUT_LIBRARY glut) -endif (LINUX) - -if (DARWIN) -  include(CMakeFindFrameworks) -  find_library(GLUT_LIBRARY GLUT) -endif (DARWIN) diff --git a/indra/cmake/GooglePerfTools.cmake b/indra/cmake/GooglePerfTools.cmake deleted file mode 100644 index c1faeb9325..0000000000 --- a/indra/cmake/GooglePerfTools.cmake +++ /dev/null @@ -1,61 +0,0 @@ -# -*- cmake -*- -include(Prebuilt) - -# If you want to enable or disable TCMALLOC in viewer builds, this is the place. -# set ON or OFF as desired. -set (USE_TCMALLOC OFF) - -if (USESYSTEMLIBS) -  include(FindGooglePerfTools) -else (USESYSTEMLIBS) -  if (WINDOWS) -    if (USE_TCMALLOC) -       use_prebuilt_binary(gperftools) -       set(TCMALLOC_LIBRARIES  -         debug libtcmalloc_minimal-debug -         optimized libtcmalloc_minimal) -       set(TCMALLOC_LINK_FLAGS  "/INCLUDE:__tcmalloc") -    else (USE_TCMALLOC) -      set(TCMALLOC_LIBRARIES) -      set(TCMALLOC_LINK_FLAGS) -    endif (USE_TCMALLOC) -    set(GOOGLE_PERFTOOLS_FOUND "YES") -  endif (WINDOWS) -  if (LINUX) -    if (USE_TCMALLOC) -      use_prebuilt_binary(gperftools) -      set(TCMALLOC_LIBRARIES  -        tcmalloc) -    else (USE_TCMALLOC) -      set(TCMALLOC_LIBRARIES) -    endif (USE_TCMALLOC) -    set(PROFILER_LIBRARIES profiler) -    set(GOOGLE_PERFTOOLS_INCLUDE_DIR -        ${LIBS_PREBUILT_DIR}/include) -    set(GOOGLE_PERFTOOLS_FOUND "YES") -  endif (LINUX) -endif (USESYSTEMLIBS) - -if (GOOGLE_PERFTOOLS_FOUND) -  # XXX Disable temporarily, until we have compilation issues on 64-bit -  # Etch sorted. -  set(USE_GOOGLE_PERFTOOLS OFF CACHE BOOL "Build with Google PerfTools support.") -endif (GOOGLE_PERFTOOLS_FOUND) - -if (WINDOWS) -   set(USE_GOOGLE_PERFTOOLS ON) -endif (WINDOWS) - -if (USE_GOOGLE_PERFTOOLS) -  if (USE_TCMALLOC) -    set(TCMALLOC_FLAG -DLL_USE_TCMALLOC=1) -  else (USE_TCMALLOC) -    set(TCMALLOC_FLAG -ULL_USE_TCMALLOC) -  endif (USE_TCMALLOC) -endif (USE_GOOGLE_PERFTOOLS) - -if (USE_GOOGLE_PERFTOOLS) -  include_directories(${GOOGLE_PERFTOOLS_INCLUDE_DIR}) -  set(GOOGLE_PERFTOOLS_LIBRARIES ${TCMALLOC_LIBRARIES} ${STACKTRACE_LIBRARIES} ${PROFILER_LIBRARIES}) -else (USE_GOOGLE_PERFTOOLS) -endif (USE_GOOGLE_PERFTOOLS) diff --git a/indra/cmake/LLCommon.cmake b/indra/cmake/LLCommon.cmake index b50b4bcdb2..3e29297c58 100644 --- a/indra/cmake/LLCommon.cmake +++ b/indra/cmake/LLCommon.cmake @@ -4,7 +4,6 @@ include(APR)  include(Boost)  include(EXPAT)  include(ZLIB) -include(GooglePerfTools)  set(LLCOMMON_INCLUDE_DIRS      ${LIBS_OPEN_DIR}/llcommon @@ -34,8 +33,6 @@ else (LINUX)          ${BOOST_SYSTEM_LIBRARY} )  endif (LINUX) -# add_definitions(${TCMALLOC_FLAG}) -  set(LLCOMMON_LINK_SHARED OFF CACHE BOOL "Build the llcommon target as a static library.")  if(LLCOMMON_LINK_SHARED)    add_definitions(-DLL_COMMON_LINK_SHARED=1) diff --git a/indra/cmake/QuickTimePlugin.cmake b/indra/cmake/QuickTimePlugin.cmake deleted file mode 100644 index c08e153ee3..0000000000 --- a/indra/cmake/QuickTimePlugin.cmake +++ /dev/null @@ -1,48 +0,0 @@ -# -*- cmake -*- - -if(INSTALL_PROPRIETARY) -  include(Prebuilt) -  if (WINDOWS) -    use_prebuilt_binary(quicktime) -  endif (WINDOWS) -endif(INSTALL_PROPRIETARY) - -if (DARWIN) -  include(CMakeFindFrameworks) -  find_library(QUICKTIME_LIBRARY QuickTime) -elseif (WINDOWS) -  set(QUICKTIME_SDK_DIR "$ENV{PROGRAMFILES}/QuickTime SDK" -      CACHE PATH "Location of the QuickTime SDK.") - -  find_library(DEBUG_QUICKTIME_LIBRARY qtmlclient.lib -               PATHS -               ${ARCH_PREBUILT_DIRS_DEBUG} -               "${QUICKTIME_SDK_DIR}\\libraries" -               ) - -  find_library(RELEASE_QUICKTIME_LIBRARY qtmlclient.lib -               PATHS -               ${ARCH_PREBUILT_DIRS_RELEASE} -               "${QUICKTIME_SDK_DIR}\\libraries" -               ) - -  if (DEBUG_QUICKTIME_LIBRARY AND RELEASE_QUICKTIME_LIBRARY) -    set(QUICKTIME_LIBRARY  -        optimized ${RELEASE_QUICKTIME_LIBRARY} -        debug ${DEBUG_QUICKTIME_LIBRARY} -        ) -         -  endif (DEBUG_QUICKTIME_LIBRARY AND RELEASE_QUICKTIME_LIBRARY) -   -  include_directories( -    ${LIBS_PREBUILT_DIR}/include/quicktime -    "${QUICKTIME_SDK_DIR}\\CIncludes" -    ) -endif (DARWIN) - -mark_as_advanced(QUICKTIME_LIBRARY) - -if (QUICKTIME_LIBRARY) -  set(QUICKTIME ON CACHE BOOL "Build with QuickTime streaming media support.") -endif (QUICKTIME_LIBRARY) - diff --git a/indra/cmake/UI.cmake b/indra/cmake/UI.cmake index 31174209a3..77fd505df3 100644 --- a/indra/cmake/UI.cmake +++ b/indra/cmake/UI.cmake @@ -32,9 +32,9 @@ if (USESYSTEMLIBS)      add_definitions(${${pkg}_CFLAGS_OTHERS})    endforeach(pkg)  else (USESYSTEMLIBS) -  if (LINUX OR WINDOWS) +  if (LINUX)      use_prebuilt_binary(gtk-atk-pango-glib) -  endif (LINUX OR WINDOWS) +  endif (LINUX)    if (LINUX)      set(UI_LIBRARIES diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 410a5819b3..493aa5d0f1 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -10,7 +10,6 @@ include(Boost)  include(LLSharedLibs)  include(JsonCpp)  include(GoogleBreakpad) -include(GooglePerfTools)  include(Copy3rdPartyLibs)  include(ZLIB)  include(URIPARSER) @@ -335,8 +334,4 @@ if (LL_TESTS)  ## throwing and catching exceptions.  ##LL_ADD_INTEGRATION_TEST(llexception "" "${test_libs}") -  # *TODO - reenable these once tcmalloc libs no longer break the build. -  #ADD_BUILD_TEST(llallocator llcommon) -  #ADD_BUILD_TEST(llallocator_heap_profile llcommon) -  #ADD_BUILD_TEST(llmemtype llcommon)  endif (LL_TESTS) diff --git a/indra/llcommon/llallocator.cpp b/indra/llcommon/llallocator.cpp index 34fc28d8cc..ac97fb71dd 100644 --- a/indra/llcommon/llallocator.cpp +++ b/indra/llcommon/llallocator.cpp @@ -27,47 +27,6 @@  #include "linden_common.h"  #include "llallocator.h" -#if (LL_USE_TCMALLOC && LL_USE_HEAP_PROFILER) - -#include "google/heap-profiler.h" -#include "google/commandlineflags_public.h" - -DECLARE_bool(heap_profile_use_stack_trace); -//DECLARE_double(tcmalloc_release_rate); - -void LLAllocator::setProfilingEnabled(bool should_enable) -{ -    // NULL disables dumping to disk -    static char const * const PREFIX = NULL; -    if(should_enable) -    { -		HeapProfilerSetUseStackTrace(false); -        HeapProfilerStart(PREFIX); -    } -    else -    { -        HeapProfilerStop(); -    } -} - -// static -bool LLAllocator::isProfiling() -{ -    return IsHeapProfilerRunning(); -} - -std::string LLAllocator::getRawProfile() -{ -    // *TODO - fix google-perftools to accept an buffer to avoid this -    // malloc-copy-free cycle. -    char * buffer = GetHeapProfile(); -    std::string ret = buffer; -    free(buffer); -    return ret; -} - -#else // LL_USE_TCMALLOC -  //  // stub implementations for when tcmalloc is disabled  // @@ -87,8 +46,6 @@ std::string LLAllocator::getRawProfile()      return std::string();  } -#endif // LL_USE_TCMALLOC -  LLAllocatorHeapProfile const & LLAllocator::getProfile()  {      mProf.mLines.clear(); diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp index 8e516d8beb..0d9e19f672 100644 --- a/indra/llcommon/llcoros.cpp +++ b/indra/llcommon/llcoros.cpp @@ -101,7 +101,11 @@ LLCoros::LLCoros():      // Previously we used      // boost::context::guarded_stack_allocator::default_stacksize();      // empirically this is 64KB on Windows and Linux. Try quadrupling. +#if WORD_SIZE == 64 +    mStackSize(512*1024) +#else      mStackSize(256*1024) +#endif  {      // Register our cleanup() method for "mainloop" ticks      LLEventPumps::instance().obtain("mainloop").listen( diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h index 575edddc43..98e08cdc55 100644 --- a/indra/llcommon/llmemory.h +++ b/indra/llcommon/llmemory.h @@ -138,7 +138,6 @@ template <typename T> T* LL_NEXT_ALIGNED_ADDRESS_64(T* address)  //------------------------------------------------------------------------------------------------  //------------------------------------------------------------------------------------------------ -#if !LL_USE_TCMALLOC  inline void* ll_aligned_malloc_16(size_t size) // returned hunk MUST be freed with ll_aligned_free_16().  {  #if defined(LL_WINDOWS) @@ -187,13 +186,6 @@ inline void* ll_aligned_realloc_16(void* ptr, size_t size, size_t old_size) // r  #endif  } -#else // USE_TCMALLOC -// ll_aligned_foo_16 are not needed with tcmalloc -#define ll_aligned_malloc_16 malloc -#define ll_aligned_realloc_16(a,b,c) realloc(a,b) -#define ll_aligned_free_16 free -#endif // USE_TCMALLOC -  inline void* ll_aligned_malloc_32(size_t size) // returned hunk MUST be freed with ll_aligned_free_32().  {  #if defined(LL_WINDOWS) diff --git a/indra/llcorehttp/CMakeLists.txt b/indra/llcorehttp/CMakeLists.txt index 0bb0348d26..6f362df921 100644 --- a/indra/llcorehttp/CMakeLists.txt +++ b/indra/llcorehttp/CMakeLists.txt @@ -213,7 +213,7 @@ endif (DARWIN)      # The following come from LLAddBuildTest.cmake's INTEGRATION_TEST_xxxx target.      set_target_properties(http_texture_load                            PROPERTIES -                          LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:CONSOLE ${TCMALLOC_LINK_FLAGS}" +                          LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:CONSOLE"                            LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO"                            LINK_FLAGS_RELEASE ""                            ) diff --git a/indra/llkdu/CMakeLists.txt b/indra/llkdu/CMakeLists.txt index b8f8b420c3..cb0e204e91 100644 --- a/indra/llkdu/CMakeLists.txt +++ b/indra/llkdu/CMakeLists.txt @@ -40,6 +40,14 @@ set_source_files_properties(${llkdu_HEADER_FILES}  list(APPEND llkdu_SOURCE_FILES ${llkdu_HEADER_FILES}) +# Our KDU package is built with KDU_X86_INTRINSICS in its .vcxproj file. +# Unless that macro is also set for every consumer build, KDU freaks out, +# spamming the viewer log with alignment FUD. +set_source_files_properties(${llkdu_SOURCE_FILES} +                            PROPERTIES +                            COMPILE_DEFINITIONS +                            "KDU_X86_INTRINSICS") +  if (USE_KDU)    add_library (llkdu ${llkdu_SOURCE_FILES}) diff --git a/indra/llkdu/include_kdu_xxxx.h b/indra/llkdu/include_kdu_xxxx.h new file mode 100644 index 0000000000..5e86944994 --- /dev/null +++ b/indra/llkdu/include_kdu_xxxx.h @@ -0,0 +1,40 @@ +/**
 + * @file   include_kdu_xxxx.h
 + * @author Nat Goodspeed
 + * @date   2016-04-25
 + * @brief  
 + * 
 + * $LicenseInfo:firstyear=2016&license=viewerlgpl$
 + * Copyright (c) 2016, Linden Research, Inc.
 + * $/LicenseInfo$
 + */
 +
 +// This file specifically omits #include guards of its own: it's sort of an
 +// #include macro used to wrap KDU #includes with proper incantations. Usage:
 +
 +// #define kdu_xxxx "kdu_compressed.h" // or whichever KDU header
 +// #include "include_kdu_xxxx.h"
 +// // kdu_xxxx #undef'ed by include_kdu_xxxx.h
 +
 +#if LL_DARWIN
 +// don't *really* want to rebuild KDU so turn off specific warnings for this header
 +#pragma clang diagnostic push
 +#pragma clang diagnostic ignored "-Wself-assign-field"
 +#pragma clang diagnostic ignored "-Wunused-private-field"
 +#include kdu_xxxx
 +#pragma clang diagnostic pop
 +#elif LL_WINDOWS
 +// With warnings-as-errors in effect, strange relationship between
 +// jp2_output_box and its subclass jp2_target in kdu_compressed.h
 +// causes build failures. Specifically:
 +// warning C4263: 'void kdu_supp::jp2_target::open(kdu_supp::jp2_family_tgt *)' : member function does not override any base class virtual member function
 +// warning C4264: 'void kdu_supp::jp2_output_box::open(kdu_core::kdu_uint32)' : no override available for virtual member function from base 'kdu_supp::jp2_output_box'; function is hidden
 +#pragma warning(push)
 +#pragma warning(disable : 4263 4264)
 +#include kdu_xxxx
 +#pragma warning(pop)
 +#else // some other platform
 +#include kdu_xxxx
 +#endif
 +
 +#undef kdu_xxxx
 diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index aa405362e8..0540e55e07 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -25,21 +25,42 @@   */  #include "linden_common.h" + +// based on this KDU support group posting: +// https://groups.yahoo.com/neo/groups/kakadu_jpeg2000/conversations/messages/6691 +// Defining this values seems to fix the linker error that appeared with the 7.8 release +#define CORESYS_IMPORTS +  #include "llimagej2ckdu.h"  #include "lltimer.h"  #include "llpointer.h"  #include "llmath.h"  #include "llkdumem.h" -#include "stringize.h" -#include "kdu_block_coding.h" +#define kdu_xxxx "kdu_block_coding.h" +#include "include_kdu_xxxx.h" + +// Avoid ubiquitous necessity of kdu_core:: qualification +using namespace kdu_core;  #include "llexception.h"  #include <boost/exception/diagnostic_information.hpp>  #include <sstream>  #include <iomanip> +// stream kdu_dims to std::ostream +// Turns out this must NOT be in the anonymous namespace! +// It must also precede #include "stringize.h". +inline +std::ostream& operator<<(std::ostream& out, const kdu_dims& dims) +{ +	return out << "(" << dims.pos.x << "," << dims.pos.y << ")," +				  "[" << dims.size.x << "x" << dims.size.y << "]"; +} + +#include "stringize.h" +  namespace {  // Failure to load an image shouldn't crash the whole viewer.  struct KDUError: public LLContinueError @@ -82,19 +103,10 @@ std::string report_kdu_exception(kdu_exception mb)  }  } // anonymous namespace -// stream kdu_dims to std::ostream -// Turns out this must NOT be in the anonymous namespace! -inline -std::ostream& operator<<(std::ostream& out, const kdu_dims& dims) -{ -	return out << "(" << dims.pos.x << "," << dims.pos.y << ")," -				  "[" << dims.size.x << "x" << dims.size.y << "]"; -} -  class kdc_flow_control {  public: -	kdc_flow_control(kdu_image_in_base *img_in, kdu_codestream codestream); +	kdc_flow_control(kdu_supp::kdu_image_in_base *img_in, kdu_codestream codestream);  	~kdc_flow_control();  	bool advance_components();  	void process_components(); @@ -103,7 +115,7 @@ private:  	struct kdc_component_flow_control {  	public: -		kdu_image_in_base *reader; +		kdu_supp::kdu_image_in_base *reader;  		int vert_subsampling;  		int ratio_counter;  /*  Initialized to 0, decremented by `count_delta';                                  when < 0, a new line must be processed, after @@ -143,7 +155,8 @@ std::string LLImageJ2CKDU::getEngineInfo() const  class LLKDUDecodeState  {  public: -	LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap); +	LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap, +					 kdu_codestream* codestreamp);  	~LLKDUDecodeState();  	bool processTileDecode(F32 decode_time, bool limit_time = true); @@ -345,9 +358,9 @@ void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, bool keep_codestream, ECod  			// This method is only called from methods that catch KDUError.  			// We want to fail the image load, not crash the viewer.  			LLTHROW(KDUError(STRINGIZE("Component " << idx << " dimensions " -									 << other_dims -									 << " do not match component 0 dimensions " -									 << dims << "!"))); +									   << stringize(other_dims) +									   << " do not match component 0 dimensions " +									   << stringize(dims) << "!")));  		}  	} @@ -559,7 +572,8 @@ bool LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco  					kdu_coords offset = tile_dims.pos - dims.pos;  					int row_gap = channels*dims.size.x; // inter-row separation  					kdu_byte *buf = buffer + offset.y*row_gap + offset.x*channels; -					mDecodeState.reset(new LLKDUDecodeState(tile, buf, row_gap)); +					mDecodeState.reset(new LLKDUDecodeState(tile, buf, row_gap, +															mCodeStreamp.get()));  				}  				// Do the actual processing  				F32 remaining_time = decode_time - decode_timer.getElapsedTimeF32(); @@ -1247,7 +1261,8 @@ all necessary level shifting, type conversion, rounding and truncation. */  	}  } -LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap) +LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap, +								   kdu_codestream* codestreamp)  {  	S32 c; @@ -1293,7 +1308,7 @@ LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap)  			mEngines[c] = kdu_synthesis(res,&mAllocator,use_shorts);  		}  	} -	mAllocator.finalize(); // Actually creates buffering resources +	mAllocator.finalize(*codestreamp); // Actually creates buffering resources  	for (c = 0; c < mNumComponents; c++)  	{  		mLines[c].create(); // Grabs resources from the allocator. @@ -1351,7 +1366,7 @@ separation between consecutive rows in the real buffer. */  // kdc_flow_control  -kdc_flow_control::kdc_flow_control (kdu_image_in_base *img_in, kdu_codestream codestream) +kdc_flow_control::kdc_flow_control (kdu_supp::kdu_image_in_base *img_in, kdu_codestream codestream)  {  	int n; diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h index 7d234435a4..b57e4cc40e 100644 --- a/indra/llkdu/llimagej2ckdu.h +++ b/indra/llkdu/llimagej2ckdu.h @@ -37,15 +37,8 @@  #include "kdu_messaging.h"  #include "kdu_params.h" -// don't *really* want to rebuild KDU so turn off specific warnings for this header -#if LL_DARWIN -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunused-private-field" -#include "kdu_compressed.h" -#pragma clang diagnostic pop -#else -#include "kdu_compressed.h" -#endif +#define kdu_xxxx "kdu_compressed.h" +#include "include_kdu_xxxx.h"  #include "kdu_sample_processing.h"  #include <boost/scoped_ptr.hpp> @@ -111,17 +104,19 @@ private:  			}  		} -		kdu_codestream* operator->() { return &mCodeStream; } +		// for those few times when you need a raw kdu_codestream* +		kdu_core::kdu_codestream* get() { return &mCodeStream; } +		kdu_core::kdu_codestream* operator->() { return &mCodeStream; }  	private: -		kdu_codestream mCodeStream; +		kdu_core::kdu_codestream mCodeStream;  	};  	// Encode variable  	boost::scoped_ptr<LLKDUMemSource> mInputp;  	CodeStreamHolder mCodeStreamp; -	boost::scoped_ptr<kdu_coords> mTPosp; // tile position -	boost::scoped_ptr<kdu_dims> mTileIndicesp; +	boost::scoped_ptr<kdu_core::kdu_coords> mTPosp; // tile position +	boost::scoped_ptr<kdu_core::kdu_dims> mTileIndicesp;  	int mBlocksSize;  	int mPrecinctsSize;  	int mLevels; diff --git a/indra/llkdu/llkdumem.cpp b/indra/llkdu/llkdumem.cpp index 0347475559..96e9da25d8 100644 --- a/indra/llkdu/llkdumem.cpp +++ b/indra/llkdu/llkdumem.cpp @@ -28,6 +28,9 @@  #include "llkdumem.h"  #include "llerror.h" +using namespace kdu_core; +using kd_supp_image_local::image_line_buf; +  #if defined(LL_WINDOWS)  # pragma warning(disable: 4702) // unreachable code  #endif diff --git a/indra/llkdu/llkdumem.h b/indra/llkdu/llkdumem.h index fab913d93b..09d81f38de 100644 --- a/indra/llkdu/llkdumem.h +++ b/indra/llkdu/llkdumem.h @@ -29,26 +29,22 @@  // Support classes for reading and writing from memory buffers in KDU  #define KDU_NO_THREADS -// don't *really* want to rebuild KDU so turn off specific warnings for this header -#if LL_DARWIN -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wself-assign-field" -#pragma clang diagnostic ignored "-Wunused-private-field" -#include "kdu_image.h" -#pragma clang diagnostic pop -#else -#include "kdu_image.h" -#endif + +#define kdu_xxxx "kdu_image.h" +#include "include_kdu_xxxx.h"  #include "kdu_elementary.h"  #include "kdu_messaging.h"  #include "kdu_params.h" -#include "kdu_compressed.h" + +#define kdu_xxxx "kdu_compressed.h" +#include "include_kdu_xxxx.h" +  #include "kdu_sample_processing.h"  #include "image_local.h"  #include "stdtypes.h" -class LLKDUMemSource: public kdu_compressed_source +class LLKDUMemSource: public kdu_core::kdu_compressed_source  {  public:  	LLKDUMemSource(U8 *input_buffer, U32 size) @@ -62,7 +58,7 @@ public:  	{  	} -	int read(kdu_byte *buf, int num_bytes) +	int read(kdu_core::kdu_byte *buf, int num_bytes)  	{  		U32 num_out;  		num_out = num_bytes; @@ -87,7 +83,7 @@ private:  	U32 mCurPos;  }; -class LLKDUMemTarget: public kdu_compressed_target +class LLKDUMemTarget: public kdu_core::kdu_compressed_target  {  public:  	LLKDUMemTarget(U8 *output_buffer, U32 &output_size, const U32 buffer_size) @@ -102,7 +98,7 @@ public:  	{  	} -	bool write(const kdu_byte *buf, int num_bytes) +	bool write(const kdu_core::kdu_byte *buf, int num_bytes)  	{  		U32 num_out;  		num_out = num_bytes; @@ -126,7 +122,7 @@ private:  	U32 *mOutputSize;  }; -class LLKDUMemIn : public kdu_image_in_base +class LLKDUMemIn : public kdu_supp::kdu_image_in_base  {  public:  	LLKDUMemIn(const U8 *data, @@ -134,10 +130,10 @@ public:  				const U16 rows,  				const U16 cols,  				U8 in_num_components, -				siz_params *siz); +				kdu_core::siz_params *siz);  	~LLKDUMemIn(); -	bool get(int comp_idx, kdu_line_buf &line, int x_tnum); +	bool get(int comp_idx, kdu_core::kdu_line_buf &line, int x_tnum);  private:  	const U8 *mData; @@ -146,8 +142,8 @@ private:  	int rows, cols;  	int alignment_bytes; // Number of 0's at end of each line.  	int precision[3]; -	image_line_buf *incomplete_lines; // Each "sample" represents a full pixel -	image_line_buf *free_lines; +	kd_supp_image_local::image_line_buf *incomplete_lines; // Each "sample" represents a full pixel +	kd_supp_image_local::image_line_buf *free_lines;  	int num_unread_rows;  	U32 mCurPos; diff --git a/indra/llkdu/tests/llimagej2ckdu_test.cpp b/indra/llkdu/tests/llimagej2ckdu_test.cpp index e8b550baa6..ae6138d4c6 100644 --- a/indra/llkdu/tests/llimagej2ckdu_test.cpp +++ b/indra/llkdu/tests/llimagej2ckdu_test.cpp @@ -30,14 +30,12 @@  #include "llimagej2ckdu.h"  #if LL_DARWIN +// For this source, it's true that private fields in llkdumem.h are unused.  #pragma clang diagnostic push  #pragma clang diagnostic ignored "-Wunused-private-field"  #include "llkdumem.h"  #pragma clang diagnostic pop -#else -#include "llkdumem.h"  #endif -  #include "kdu_block_coding.h"  // Tut header  #include "lltut.h" @@ -113,17 +111,19 @@ void LLImageJ2C::setLastError(const std::string&, const std::string&) { }  bool LLImageJ2C::updateData() { return false; }  void LLImageJ2C::updateRawDiscardLevel() { } -LLKDUMemIn::LLKDUMemIn(const U8*, const U32, const U16, const U16, const U8, siz_params*) { } +LLKDUMemIn::LLKDUMemIn(const U8*, const U32, const U16, const U16, const U8, kdu_core::siz_params*) { }  LLKDUMemIn::~LLKDUMemIn() { } -bool LLKDUMemIn::get(int, kdu_line_buf&, int) { return false; } +bool LLKDUMemIn::get(int, kdu_core::kdu_line_buf&, int) { return false; }  // Stub Kakadu Library calls +// they're all namespaced now +namespace kdu_core {  kdu_tile_comp kdu_tile::access_component(int ) { kdu_tile_comp a; return a; }  kdu_block_encoder::kdu_block_encoder() { }  kdu_block_decoder::kdu_block_decoder() { }  void kdu_block::set_max_passes(int , bool ) { }  void kdu_block::set_max_bytes(int , bool ) { } -void kdu_tile::close(kdu_thread_env* ) { } +void kdu_tile::close(kdu_thread_env *, bool) {}  int kdu_tile::get_num_components() { return 0; }  bool kdu_tile::get_ycc() { return false; }  void kdu_tile::set_components_of_interest(int , const int* ) { } @@ -156,14 +156,14 @@ void kdu_codestream::set_fussy() { }  void kdu_codestream::get_dims(int, kdu_dims&, bool ) { }  int kdu_codestream::get_min_dwt_levels() { return 5; }  int kdu_codestream::get_max_tile_layers() { return 1; } -void kdu_codestream::change_appearance(bool, bool, bool) { } +void kdu_codestream::change_appearance(bool, bool, bool, kdu_thread_env *) {}  void kdu_codestream::get_tile_dims(kdu_coords, int, kdu_dims&, bool ) { }  void kdu_codestream::destroy() { }  void kdu_codestream::collect_timing_stats(int ) { }  void kdu_codestream::set_max_bytes(kdu_long, bool, bool ) { }  void kdu_codestream::get_valid_tiles(kdu_dims& ) { }  void kdu_codestream::create(kdu_compressed_source*, kdu_thread_env*) { } -void kdu_codestream::apply_input_restrictions( int, int, int, int, kdu_dims*, kdu_component_access_mode ) { } +void kdu_codestream::apply_input_restrictions(int, int, int, int, kdu_dims const *, kdu_component_access_mode, kdu_thread_env *, kdu_quality_limiter const *) {}  void kdu_codestream::get_subsampling(int , kdu_coords&, bool ) { }  void kdu_codestream::flush(kdu_long *, int, kdu_uint16 *, bool, bool, double, kdu_thread_env*, int) { }  void kdu_codestream::set_resilient(bool ) { } @@ -178,13 +178,15 @@ siz_params* kdu_codestream::access_siz() { return NULL; }  kdu_tile kdu_codestream::open_tile(kdu_coords , kdu_thread_env* ) { kdu_tile a; return a; }  kdu_codestream_comment kdu_codestream::add_comment() { kdu_codestream_comment a; return a; }  void kdu_subband::close_block(kdu_block*, kdu_thread_env*) { } -void kdu_subband::get_valid_blocks(kdu_dims &indices) { } -kdu_block* kdu_subband::open_block(kdu_coords, int*, kdu_thread_env*) { return NULL; } +void kdu_subband::get_valid_blocks(kdu_dims &indices) const { } +kdu_block * kdu_subband::open_block(kdu_coords, int *, kdu_thread_env *, int, bool) { return NULL; }  bool kdu_codestream_comment::put_text(const char*) { return false; }  void kdu_customize_warnings(kdu_message*) { }  void kdu_customize_errors(kdu_message*) { } -kdu_long kdu_multi_analysis::create(kdu_codestream, kdu_tile, kdu_thread_env*, kdu_thread_queue*, int, kdu_roi_image*, int) { kdu_long a = 0; return a; } +kdu_long kdu_multi_analysis::create(kdu_codestream, kdu_tile, kdu_thread_env *,kdu_thread_queue *, int, kdu_roi_image *, int, kdu_sample_allocator *, kdu_push_pull_params const *) { return kdu_long(0); } +void kdu_multi_analysis::destroy(kdu_thread_env *) {}  siz_params::siz_params() : kdu_params(NULL, false, false, false, false, false) { } +siz_params::~siz_params() {}  void siz_params::finalize(bool ) { }  void siz_params::copy_with_xforms(kdu_params*, int, int, bool, bool, bool) { }  int siz_params::write_marker_segment(kdu_output*, kdu_params*, int) { return 0; } @@ -193,10 +195,15 @@ bool siz_params::read_marker_segment(kdu_uint16, int, kdu_byte a[], int) { retur  kdu_decoder::kdu_decoder(kdu_subband , kdu_sample_allocator*, bool , float, int, kdu_thread_env*, kdu_thread_queue*, int) { }  void kdu_codestream::create(siz_params*, kdu_compressed_target*, kdu_dims*, int, kdu_long, kdu_thread_env* ) { } +kdu_sample_allocator::~kdu_sample_allocator() {} +void kdu_sample_allocator::do_finalize(kdu_codestream) {}  void (*kdu_convert_ycc_to_rgb_rev16)(kdu_int16*,kdu_int16*,kdu_int16*,int);  void (*kdu_convert_ycc_to_rgb_irrev16)(kdu_int16*,kdu_int16*,kdu_int16*,int);  void (*kdu_convert_ycc_to_rgb_rev32)(kdu_int32*,kdu_int32*,kdu_int32*,int);  void (*kdu_convert_ycc_to_rgb_irrev32)(float*,float*,float*,int); +bool kdu_core_sample_alignment_checker(int, int, int, int, bool, bool) { return false; } +void kdu_pull_ifc::destroy() {} +} // namespace kdu_core  // -------------------------------------------------------------------------------------------  // TUT diff --git a/indra/media_plugins/CMakeLists.txt b/indra/media_plugins/CMakeLists.txt index 9055e0111a..22af50ab26 100644 --- a/indra/media_plugins/CMakeLists.txt +++ b/indra/media_plugins/CMakeLists.txt @@ -8,7 +8,6 @@ if (LINUX)  endif (LINUX)  if (DARWIN) -    add_subdirectory(quicktime)      add_subdirectory(cef)  endif (DARWIN) @@ -17,5 +16,3 @@ if (WINDOWS)      add_subdirectory(winmmshim)      add_subdirectory(libvlc)  endif (WINDOWS) - -### add_subdirectory(example) diff --git a/indra/media_plugins/quicktime/CMakeLists.txt b/indra/media_plugins/quicktime/CMakeLists.txt deleted file mode 100755 index 58391007ff..0000000000 --- a/indra/media_plugins/quicktime/CMakeLists.txt +++ /dev/null @@ -1,94 +0,0 @@ -# -*- cmake -*- - -project(media_plugin_quicktime) - -include(00-Common) -include(LLCommon) -include(LLImage) -include(LLPlugin) -include(LLMath) -include(LLRender) -include(LLWindow) -include(Linking) -include(PluginAPI) -include(MediaPluginBase) -include(OpenGL) -include(QuickTimePlugin) - -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} -) -include_directories(SYSTEM -    ${LLCOMMON_SYSTEM_INCLUDE_DIRS} -    ) - -if (DARWIN) -    include(CMakeFindFrameworks) -    find_library(CARBON_LIBRARY Carbon) -endif (DARWIN) - - -### media_plugin_quicktime - -set(media_plugin_quicktime_SOURCE_FILES -    media_plugin_quicktime.cpp -    ) - -add_library(media_plugin_quicktime -    SHARED -    ${media_plugin_quicktime_SOURCE_FILES} -) - -target_link_libraries(media_plugin_quicktime -  ${LLPLUGIN_LIBRARIES} -  ${MEDIA_PLUGIN_BASE_LIBRARIES} -  ${LLCOMMON_LIBRARIES} -  ${QUICKTIME_LIBRARY} -  ${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" -    ) -endif (WINDOWS) - -if (QUICKTIME) - -    add_definitions(-DLL_QUICKTIME_ENABLED=1) - -    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_quicktime -        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" -      ) - -# We use a bunch of deprecated system APIs. -    set_source_files_properties( -        media_plugin_quicktime.cpp PROPERTIES -        COMPILE_FLAGS -Wno-deprecated-declarations -        ) -    find_library(CARBON_LIBRARY Carbon) -    target_link_libraries(media_plugin_quicktime ${CARBON_LIBRARY}) -  endif (DARWIN) -endif (QUICKTIME) - diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp deleted file mode 100755 index b43598e4a5..0000000000 --- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp +++ /dev/null @@ -1,1085 +0,0 @@ -/** - * @file media_plugin_quicktime.cpp - * @brief QuickTime 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" -  -#if LL_QUICKTIME_ENABLED -  -#if defined(LL_DARWIN) -#include <QuickTime/QuickTime.h> -#elif defined(LL_WINDOWS) -#include "llwin32headers.h" -#include "MacTypes.h" -#include "QTML.h" -#include "Movies.h" -#include "QDoffscreen.h" -#include "FixMath.h" -#include "QTLoadLibraryUtils.h" -#endif - - - -// TODO: Make sure that the only symbol exported from this library is LLPluginInitEntryPoint -//////////////////////////////////////////////////////////////////////////////// -// -class MediaPluginQuickTime : public MediaPluginBase -{ -public: -	MediaPluginQuickTime(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data); -	~MediaPluginQuickTime(); - -	/* virtual */ void receiveMessage(const char *message_string); - -private: - -	int mNaturalWidth; -	int mNaturalHeight; -	Movie mMovieHandle; -	GWorldPtr mGWorldHandle; -	ComponentInstance mMovieController; -	int mCurVolume; -	bool mMediaSizeChanging; -	bool mIsLooping; -	std::string mMovieTitle; -	bool mReceivedTitle; -	const int mMinWidth; -	const int mMaxWidth; -	const int mMinHeight; -	const int mMaxHeight; -	F64 mPlayRate; -	std::string mNavigateURL; - -	enum ECommand { -		COMMAND_NONE, -		COMMAND_STOP, -		COMMAND_PLAY, -		COMMAND_FAST_FORWARD, -		COMMAND_FAST_REWIND, -		COMMAND_PAUSE, -		COMMAND_SEEK, -	}; -	ECommand mCommand; - -	// Override this to add current time and duration to the message -	/*virtual*/ void setDirty(int left, int top, int right, int bottom) -	{ -		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "updated"); - -		message.setValueS32("left", left); -		message.setValueS32("top", top); -		message.setValueS32("right", right); -		message.setValueS32("bottom", bottom); - -		if(mMovieHandle) -		{ -			message.setValueReal("current_time", getCurrentTime()); -			message.setValueReal("duration", getDuration()); -			message.setValueReal("current_rate", Fix2X(GetMovieRate(mMovieHandle))); -		} - -		sendMessage(message); -	} - - -	static Rect rectFromSize(int width, int height) -	{ -		Rect result; - - -		result.left = 0; -		result.top = 0; -		result.right = width; -		result.bottom = height; - -		return result; -	} - -	Fixed getPlayRate(void) -	{ -		Fixed result; -		if(mPlayRate == 0.0f) -		{ -			// Default to the movie's preferred rate -			result = GetMoviePreferredRate(mMovieHandle); -			if(result == 0) -			{ -				// Don't return a 0 play rate, ever. -				std::cerr << "Movie's preferred rate is 0, forcing to 1.0." << std::endl; -				result = X2Fix(1.0f); -			} -		} -		else -		{ -			result = X2Fix(mPlayRate); -		} - -		return result; -	} - -	void load( const std::string url ) -	{ - -		if ( url.empty() ) -			return; - -		// Stop and unload any existing movie before starting another one. -		unload(); - -		setStatus(STATUS_LOADING); - -		//In case std::string::c_str() makes a copy of the url data, -		//make sure there is memory to hold it before allocating memory for handle. -		//if fails, NewHandleClear(...) should return NULL. -		const char* url_string = url.c_str() ; -		Handle handle = NewHandleClear( ( Size )( url.length() + 1 ) ); - -		if ( NULL == handle || noErr != MemError() || NULL == *handle ) -		{ -			setStatus(STATUS_ERROR); -			return; -		} - -		BlockMove( url_string, *handle, ( Size )( url.length() + 1 ) ); - -		OSErr err = NewMovieFromDataRef( &mMovieHandle, newMovieActive | newMovieDontInteractWithUser | newMovieAsyncOK | newMovieIdleImportOK, nil, handle, URLDataHandlerSubType ); -		DisposeHandle( handle ); -		if ( noErr != err ) -		{ -			setStatus(STATUS_ERROR); -			return; -		}; -		 -		mNavigateURL = url; -		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin"); -		message.setValue("uri", mNavigateURL); -		sendMessage(message); - -		// do pre-roll actions (typically fired for streaming movies but not always) -		PrePrerollMovie( mMovieHandle, 0, getPlayRate(), moviePrePrerollCompleteCallback, ( void * )this ); - -		Rect movie_rect = rectFromSize(mWidth, mHeight); - -		// make a new movie controller -		mMovieController = NewMovieController( mMovieHandle, &movie_rect, mcNotVisible | mcTopLeftMovie ); - -		// movie controller -		MCSetActionFilterWithRefCon( mMovieController, mcActionFilterCallBack, ( long )this ); - -		SetMoviePlayHints( mMovieHandle, hintsAllowDynamicResize, hintsAllowDynamicResize ); - -		// function that gets called when a frame is drawn -		SetMovieDrawingCompleteProc( mMovieHandle, movieDrawingCallWhenChanged, movieDrawingCompleteCallback, ( long )this ); - -		setStatus(STATUS_LOADED); - -		sizeChanged(); -	}; - -	bool unload() -	{ -		// new movie and have to get title again -		mReceivedTitle = false; - -		if ( mMovieHandle ) -		{ -			StopMovie( mMovieHandle ); -			if ( mMovieController ) -			{ -				MCMovieChanged( mMovieController, mMovieHandle ); -			}; -		}; - -		if ( mMovieController ) -		{ -			MCSetActionFilterWithRefCon( mMovieController, NULL, (long)this ); -			DisposeMovieController( mMovieController ); -			mMovieController = NULL; -		}; - -		if ( mMovieHandle ) -		{ -			SetMovieDrawingCompleteProc( mMovieHandle, movieDrawingCallWhenChanged, nil, ( long )this ); -			DisposeMovie( mMovieHandle ); -			mMovieHandle = NULL; -		}; - -        mGWorldHandle = NULL; -         -		setStatus(STATUS_NONE); - -		return true; -	} - -	bool navigateTo( const std::string url ) -	{ -		unload(); -		load( url ); - -		return true; -	}; - -	bool sizeChanged() -	{ -		if ( ! mMovieHandle ) -			return false; - -		// Check to see whether the movie's natural size has updated -		{ -			int width, height; -			getMovieNaturalSize(&width, &height); -			if((width != 0) && (height != 0) && ((width != mNaturalWidth) || (height != mNaturalHeight))) -			{ -				mNaturalWidth = width; -				mNaturalHeight = height; - -				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_request"); -				message.setValue("name", mTextureSegmentName); -				message.setValueS32("width", width); -				message.setValueS32("height", height); -				sendMessage(message); -				//std::cerr << "<--- Sending size change request to application with name: " << mTextureSegmentName << " - size is " << width << " x " << height << std::endl; -			} -		} -         - -		// sanitize destination size -		Rect dest_rect = rectFromSize(mWidth, mHeight); - -		// media depth won't change -		int depth_bits = mDepth * 8; -		long rowbytes = mDepth * mTextureWidth; - -		if(mPixels != NULL) -		{ -			// We have pixels.  Set up a GWorld pointing at the texture. -			OSErr result = QTNewGWorldFromPtr( &mGWorldHandle, depth_bits, &dest_rect, NULL, NULL, 0, (Ptr)mPixels, rowbytes); -			if ( noErr != result ) -			{ -				// TODO: unrecoverable??  throw exception?  return something? -				return false; -			} -		} -		else -		{ -			// We don't have pixels. Create a fake GWorld we can point the movie at when it's not safe to render normally. -			Rect tempRect = rectFromSize(1, 1); -			OSErr result = QTNewGWorld( &mGWorldHandle, depth_bits, &tempRect, NULL, NULL, 0); -			if ( noErr != result ) -			{ -				// TODO: unrecoverable??  throw exception?  return something? -				return false; -			} -		} - -		SetMovieGWorld( mMovieHandle, mGWorldHandle, NULL ); -         -		// Set up the movie display matrix -		{ -			// scale movie to fit rect and invert vertically to match opengl image format -			MatrixRecord transform; -			SetIdentityMatrix( &transform );	// transforms are additive so start from identify matrix -			double scaleX = (double) mWidth / mNaturalWidth; -			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 ) ); -			SetMovieMatrix( mMovieHandle, &transform ); -		} - -		// update movie controller -		if ( mMovieController ) -		{ -			MCSetControllerPort( mMovieController, mGWorldHandle ); -			MCPositionController( mMovieController, &dest_rect, &dest_rect, -								  mcTopLeftMovie | mcPositionDontInvalidate ); -			MCMovieChanged( mMovieController, mMovieHandle ); -		} - - -		// Emit event with size change so the calling app knows about it too -		// TODO: -		//LLMediaEvent event( this ); -		//mEventEmitter.update( &LLMediaObserver::onMediaSizeChange, event ); - -		return true; -	} -	static Boolean mcActionFilterCallBack( MovieController mc, short action, void *params, long ref ) -	{ -		Boolean result = false; - -		MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref; - -		switch( action ) -		{ -			// handle window resizing -			case mcActionControllerSizeChanged: -				// Ensure that the movie draws correctly at the new size -				self->sizeChanged(); -				break; - -			// Block any movie controller actions that open URLs. -			case mcActionLinkToURL: -			case mcActionGetNextURL: -			case mcActionLinkToURLExtended: -				// Prevent the movie controller from handling the message -				result = true; -				break; - -			default: -				break; -		}; - -		return result; -	}; - -	static OSErr movieDrawingCompleteCallback( Movie call_back_movie, long ref ) -	{ -		MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref; - -		// IMPORTANT: typically, a consumer who is observing this event will set a flag -		// when this event is fired then render later. Be aware that the media stream -		// can change during this period - dimensions, depth, format etc. -		//LLMediaEvent event( self ); -//		self->updateQuickTime(); -		// TODO ^^^ - - -		if ( self->mWidth > 0 && self->mHeight > 0 ) -			self->setDirty( 0, 0, self->mWidth, self->mHeight ); - -		return noErr; -	}; - -	static void moviePrePrerollCompleteCallback( Movie movie, OSErr preroll_err, void *ref ) -	{ -		MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref; - -		// TODO: -		//LLMediaEvent event( self ); -		//self->mEventEmitter.update( &LLMediaObserver::onMediaPreroll, event ); -		 -		// Send a "navigate complete" event. -		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete"); -		message.setValue("uri", self->mNavigateURL); -		message.setValueS32("result_code", 200); -		message.setValue("result_string", "OK"); -		self->sendMessage(message); -	}; - - -	void rewind() -	{ -		GoToBeginningOfMovie( mMovieHandle ); -		MCMovieChanged( mMovieController, mMovieHandle ); -	}; - -	bool processState() -	{ -		if ( mCommand == COMMAND_PLAY ) -		{ -			if ( mStatus == STATUS_LOADED || mStatus == STATUS_PAUSED || mStatus == STATUS_PLAYING || mStatus == STATUS_DONE ) -			{ -				long state = GetMovieLoadState( mMovieHandle ); - -				if ( state >= kMovieLoadStatePlaythroughOK ) -				{ -					// if the movie is at the end (generally because it reached it naturally) -					// and we play is requested, jump back to the start of the movie. -					// note: this is different from having loop flag set. -					if ( IsMovieDone( mMovieHandle ) ) -					{ -						Fixed rate = X2Fix( 0.0 ); -						MCDoAction( mMovieController, mcActionPlay, (void*)rate ); -						rewind(); -					}; - -					MCDoAction( mMovieController, mcActionPrerollAndPlay, (void*)getPlayRate() ); -					MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume ); -					setStatus(STATUS_PLAYING); -					mCommand = COMMAND_NONE; -				}; -			}; -		} -		else -		if ( mCommand == COMMAND_STOP ) -		{ -			if ( mStatus == STATUS_PLAYING || mStatus == STATUS_PAUSED || mStatus == STATUS_DONE ) -			{ -				if ( GetMovieLoadState( mMovieHandle ) >= kMovieLoadStatePlaythroughOK ) -				{ -					Fixed rate = X2Fix( 0.0 ); -					MCDoAction( mMovieController, mcActionPlay, (void*)rate ); -					rewind(); - -					setStatus(STATUS_LOADED); -					mCommand = COMMAND_NONE; -				}; -			}; -		} -		else -		if ( mCommand == COMMAND_PAUSE ) -		{ -			if ( mStatus == STATUS_PLAYING ) -			{ -				if ( GetMovieLoadState( mMovieHandle ) >= kMovieLoadStatePlaythroughOK ) -				{ -					Fixed rate = X2Fix( 0.0 ); -					MCDoAction( mMovieController, mcActionPlay, (void*)rate ); -					setStatus(STATUS_PAUSED); -					mCommand = COMMAND_NONE; -				}; -			}; -		}; - -		return true; -	}; - -	void play(F64 rate) -	{ -		mPlayRate = rate; -		mCommand = COMMAND_PLAY; -	}; - -	void stop() -	{ -		mCommand = COMMAND_STOP; -	}; - -	void pause() -	{ -		mCommand = COMMAND_PAUSE; -	}; - -	void getMovieNaturalSize(int *movie_width, int *movie_height) -	{ -		Rect rect; - -		GetMovieNaturalBoundsRect( mMovieHandle, &rect ); - -		int width  = ( rect.right - rect.left ); -		int height = ( rect.bottom - rect.top ); - -		// make sure width and height fall in valid range -		if ( width < mMinWidth ) -			width = mMinWidth; - -		if ( width > mMaxWidth ) -			width = mMaxWidth; - -		if ( height < mMinHeight ) -			height = mMinHeight; - -		if ( height > mMaxHeight ) -			height = mMaxHeight; - -		// return the new rect -		*movie_width = width; -		*movie_height = height; -	} - -	void updateQuickTime(int milliseconds) -	{ -		if ( ! mMovieHandle ) -			return; - -		if ( ! mMovieController ) -			return; - -		// this wasn't required in 1.xx viewer but we have to manually  -		// work the Windows message pump now -		#if defined( LL_WINDOWS ) -		MSG msg; -		while ( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )  -		{ -			GetMessage( &msg, NULL, 0, 0 ); -			TranslateMessage( &msg ); -			DispatchMessage( &msg ); -		}; -		#endif - -		MCIdle( mMovieController ); - -		if ( ! mGWorldHandle ) -			return; - -		if ( mMediaSizeChanging ) -			return; - -		// update state machine -		processState(); - -		// see if title arrived and if so, update member variable with contents -		checkTitle(); -		 -		// QT call to see if we are at the end - can't do with controller -		if ( IsMovieDone( mMovieHandle ) ) -		{ -			// special code for looping - need to rewind at the end of the movie -			if ( mIsLooping ) -			{ -				// go back to start -				rewind(); - -				if ( mMovieController ) -				{ -					// kick off new play -					MCDoAction( mMovieController, mcActionPrerollAndPlay, (void*)getPlayRate() ); - -					// set the volume -					MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume ); -				}; -			} -			else -			{ -				if(mStatus == STATUS_PLAYING) -				{ -					setStatus(STATUS_DONE); -				} -			} -		} - -	}; -     -	void seek( F64 time ) -	{ -		if ( mMovieController ) -		{ -			TimeRecord when; -			when.scale = GetMovieTimeScale( mMovieHandle ); -			when.base = 0; - -			// 'time' is in (floating point) seconds.  The timebase time will be in 'units', where -			// there are 'scale' units per second. -			SInt64 raw_time = ( SInt64 )( time * (double)( when.scale ) ); - -			when.value.hi = ( SInt32 )( raw_time >> 32 ); -			when.value.lo = ( SInt32 )( ( raw_time & 0x00000000FFFFFFFF ) ); - -			MCDoAction( mMovieController, mcActionGoToTime, &when ); -		}; -	}; - -	F64 getLoadedDuration() 	  	  -	{ 	  	  -		TimeValue duration; 	  	  -		if(GetMaxLoadedTimeInMovie( mMovieHandle, &duration ) != noErr) 	  	  -		{ 	  	  -			// If GetMaxLoadedTimeInMovie returns an error, return the full duration of the movie. 	  	  -			duration = GetMovieDuration( mMovieHandle ); 	  	  -		} 	  	  -		TimeValue scale = GetMovieTimeScale( mMovieHandle ); 	  	  - -		return (F64)duration / (F64)scale; 	  	  -	}; 	  	  - -	F64 getDuration() -	{ -		TimeValue duration = GetMovieDuration( mMovieHandle ); -		TimeValue scale = GetMovieTimeScale( mMovieHandle ); - -		return (F64)duration / (F64)scale; -	}; - -	F64 getCurrentTime() -	{ -		TimeValue curr_time = GetMovieTime( mMovieHandle, 0 ); -		TimeValue scale = GetMovieTimeScale( mMovieHandle ); - -		return (F64)curr_time / (F64)scale; -	}; - -	void setVolume( F64 volume ) -	{ -		mCurVolume = (short)(volume * ( double ) 0x100 ); - -		if ( mMovieController ) -		{ -			MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume ); -		}; -	}; - -	//////////////////////////////////////////////////////////////////////////////// -	// -	void update(int milliseconds = 0) -	{ -		updateQuickTime(milliseconds); -	}; - -	//////////////////////////////////////////////////////////////////////////////// -	// -	void mouseDown( int x, int y ) -	{ -	}; - -	//////////////////////////////////////////////////////////////////////////////// -	// -	void mouseUp( int x, int y ) -	{ -	}; - -	//////////////////////////////////////////////////////////////////////////////// -	// -	void mouseMove( int x, int y ) -	{ -	}; - -	//////////////////////////////////////////////////////////////////////////////// -	// -	void keyPress( unsigned char key ) -	{ -	}; - -	//////////////////////////////////////////////////////////////////////////////// -	// Grab movie title into mMovieTitle - should be called repeatedly -	// until it returns true since movie title takes a while to become  -	// available. -	const bool getMovieTitle() -	{ -		// grab meta data from movie -		QTMetaDataRef media_data_ref; -		OSErr result = QTCopyMovieMetaData( mMovieHandle, &media_data_ref ); -		if ( noErr != result )  -			return false; - -		// look up "Display Name" in meta data -		OSType meta_data_key = kQTMetaDataCommonKeyDisplayName; -		QTMetaDataItem item = kQTMetaDataItemUninitialized; -		result = (OSErr)QTMetaDataGetNextItem( media_data_ref, kQTMetaDataStorageFormatWildcard,  -										0, kQTMetaDataKeyFormatCommon,  -										(const UInt8 *)&meta_data_key,  -										sizeof( meta_data_key ), &item ); -		if ( noErr != result )  -			return false; - -		// find the size of the title -		ByteCount size; -		result = (OSErr)QTMetaDataGetItemValue( media_data_ref, item, NULL, 0, &size ); -		if ( noErr != result || size <= 0 /*|| size > 1024  FIXME: arbitrary limit */ )  -			return false; - -		// allocate some space and grab it -		UInt8* item_data = new UInt8[ size + 1 ]; -		memset( item_data, 0, ( size + 1 ) * sizeof( UInt8 ) ); -		result = (OSErr)QTMetaDataGetItemValue( media_data_ref, item, item_data, size, NULL ); -		if ( noErr != result )  -		{ -			delete [] item_data; -			return false; -		}; - -		// save it -		if ( strlen( (char*)item_data ) ) -			mMovieTitle = std::string( (char* )item_data ); -		else -			mMovieTitle = ""; - -		// clean up -		delete [] item_data; - -		return true; -	}; - -	// called regularly to see if title changed -	void checkTitle() -	{ -		// we did already receive title so keep checking -		if ( ! mReceivedTitle ) -		{ -			// grab title from movie meta data -			if ( getMovieTitle() ) -			{ -				// pass back to host application -				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text"); -				message.setValue("name", mMovieTitle ); -				sendMessage( message ); - -				// stop looking once we find a title for this movie. -				// TODO: this may to be reset if movie title changes -				// during playback but this is okay for now -				mReceivedTitle = true; -			}; -		}; -	}; -}; - -MediaPluginQuickTime::MediaPluginQuickTime( -	LLPluginInstance::sendMessageFunction host_send_func, -	void *host_user_data ) : -	MediaPluginBase(host_send_func, host_user_data), -	mMinWidth( 0 ), -	mMaxWidth( 2048 ), -	mMinHeight( 0 ), -	mMaxHeight( 2048 ) -{ -//	std::cerr << "MediaPluginQuickTime constructor" << std::endl; - -	mNaturalWidth = -1; -	mNaturalHeight = -1; -	mMovieHandle = 0; -	mGWorldHandle = 0; -	mMovieController = 0; -	mCurVolume = 0x99; -	mMediaSizeChanging = false; -	mIsLooping = false; -	mMovieTitle = std::string(); -	mReceivedTitle = false; -	mCommand = COMMAND_NONE; -	mPlayRate = 0.0f; -	mStatus = STATUS_NONE; -} - -MediaPluginQuickTime::~MediaPluginQuickTime() -{ -//	std::cerr << "MediaPluginQuickTime destructor" << std::endl; - -	ExitMovies(); - -#ifdef LL_WINDOWS -	TerminateQTML(); -//		std::cerr << "QuickTime closing down" << std::endl; -#endif -} - - -void MediaPluginQuickTime::receiveMessage(const char *message_string) -{ -//	std::cerr << "MediaPluginQuickTime::receiveMessage: received message: \"" << message_string << "\"" << std::endl; -	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") -			{ -				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; -				// Normally a plugin would only specify one of these two subclasses, but this is a demo... -				versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME] = LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME_VERSION; -				message.setValueLLSD("versions", versions); - -				#ifdef LL_WINDOWS - -				// QuickTime 7.6.4 has an issue (that was not present in 7.6.2) with initializing QuickTime -				// according to this article: http://lists.apple.com/archives/QuickTime-API/2009/Sep/msg00097.html -				// The solution presented there appears to work. -				QTLoadLibrary("qtcf.dll"); - -				// main initialization for QuickTime - only required on Windows -				OSErr result = InitializeQTML( 0L ); -				if ( result != noErr ) -				{ -					//TODO: If no QT on Windows, this fails - respond accordingly. -				} -				else -				{ -					//std::cerr << "QuickTime initialized" << std::endl; -				}; -				#endif - -				// required for both Windows and Mac -				EnterMovies(); - -				std::string plugin_version = "QuickTime media plugin, QuickTime version "; - -				long version = 0; -				Gestalt( gestaltQuickTimeVersion, &version ); -				std::ostringstream codec( "" ); -				codec << std::hex << version << std::dec; -				plugin_version += codec.str(); -				message.setValue("plugin_version", plugin_version); -				sendMessage(message); -			} -			else if(message_name == "idle") -			{ -				// no response is necessary here. -				F64 time = message_in.getValueReal("time"); - -				// Convert time to milliseconds for update() -				update((int)(time * 1000.0f)); -			} -			else if(message_name == "cleanup") -			{ -				// TODO: clean up here -			} -			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"); -//				std::cerr << "MediaPluginQuickTime::receiveMessage: shared memory added, name: " << name -//					<< ", size: " << info.mSize -//					<< ", address: " << info.mAddress -//					<< std::endl; - -				mSharedSegments.insert(SharedSegmentMap::value_type(name, info)); - -			} -			else if(message_name == "shm_remove") -			{ -				std::string name = message_in.getValue("name"); - -//				std::cerr << "MediaPluginQuickTime::receiveMessage: shared memory remove, name = " << name << std::endl; - -				SharedSegmentMap::iterator iter = mSharedSegments.find(name); -				if(iter != mSharedSegments.end()) -				{ -					if(mPixels == iter->second.mAddress) -					{ -						// This is the currently active pixel buffer.  Make sure we stop drawing to it. -						mPixels = NULL; -						mTextureSegmentName.clear(); - -						// Make sure the movie GWorld is no longer pointed at the shared segment. -						sizeChanged(); -					} -					mSharedSegments.erase(iter); -				} -				else -				{ -//					std::cerr << "MediaPluginQuickTime::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 << "MediaPluginQuickTime::receiveMessage: unknown base message: " << message_name << std::endl; -			} -		} -		else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA) -		{ -			if(message_name == "init") -			{ -				// This is the media init message -- all necessary data for initialization should have been received. - -				// Plugin gets to decide the texture parameters to use. -				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params"); -				#if defined(LL_WINDOWS) -					// Values for Windows -					mDepth = 3; -					message.setValueU32("format", GL_RGB); -					message.setValueU32("type", GL_UNSIGNED_BYTE); - -					// We really want to pad the texture width to a multiple of 32 bytes, but since we're using 3-byte pixels, it doesn't come out even. -					// Padding to a multiple of 3*32 guarantees it'll divide out properly. -					message.setValueU32("padding", 32 * 3); -				#else -					// Values for Mac -					mDepth = 4; -					message.setValueU32("format", GL_BGRA_EXT); -					#ifdef __BIG_ENDIAN__ -						message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8_REV ); -					#else -						message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8); -					#endif - -					// Pad texture width to a multiple of 32 bytes, to line up with cache lines. -					message.setValueU32("padding", 32); -				#endif -				message.setValueS32("depth", mDepth); -				message.setValueU32("internalformat", GL_RGB); - -                // 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", true);	// true == use OpenGL-style coordinates, false == (0,0) is upper left. -				message.setValueBoolean("allow_downsample", true); -				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"); - -				//std::cerr << "---->Got size change instruction from application with name: " << name << " - size is " << width << " x " << height << std::endl; - -				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); - -				if(!name.empty()) -				{ -					// Find the shared memory region with this name -					SharedSegmentMap::iterator iter = mSharedSegments.find(name); -					if(iter != mSharedSegments.end()) -					{ -//						std::cerr << "%%% Got size change, new size is " << width << " by " << height << std::endl; -//						std::cerr << "%%%%  texture size is " << texture_width << " by " << texture_height << std::endl; - -						mPixels = (unsigned char*)iter->second.mAddress; -						mTextureSegmentName = name; -						mWidth = width; -						mHeight = height; - -						mTextureWidth = texture_width; -						mTextureHeight = texture_height; - -						mMediaSizeChanging = false; - -						sizeChanged(); - -						update(); -					}; -				}; -			} -			else if(message_name == "load_uri") -			{ -				std::string uri = message_in.getValue("uri"); -				load( uri ); -				sendStatus(); -			} -			else if(message_name == "mouse_event") -			{ -				std::string event = message_in.getValue("event"); -				S32 x = message_in.getValueS32("x"); -				S32 y = message_in.getValueS32("y"); - -				if(event == "down") -				{ -					mouseDown(x, y); -				} -				else if(event == "up") -				{ -					mouseUp(x, y); -				} -				else if(event == "move") -				{ -					mouseMove(x, y); -				}; -			}; -		} -		else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME) -		{ -			if(message_name == "stop") -			{ -				stop(); -			} -			else if(message_name == "start") -			{ -				F64 rate = 0.0; -				if(message_in.hasValue("rate")) -				{ -					rate = message_in.getValueReal("rate"); -				} -				play(rate); -			} -			else if(message_name == "pause") -			{ -				pause(); -			} -			else if(message_name == "seek") -			{ -				F64 time = message_in.getValueReal("time"); -				seek(time); -			} -			else if(message_name == "set_loop") -			{ -				bool loop = message_in.getValueBoolean("loop"); -				mIsLooping = loop; -			} -			else if(message_name == "set_volume") -			{ -				F64 volume = message_in.getValueReal("volume"); -				setVolume(volume); -			} -		} -		else -		{ -//			std::cerr << "MediaPluginQuickTime::receiveMessage: unknown message class: " << message_class << std::endl; -		}; -	}; -} - -int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data) -{ -	MediaPluginQuickTime *self = new MediaPluginQuickTime(host_send_func, host_user_data); -	*plugin_send_func = MediaPluginQuickTime::staticReceiveMessage; -	*plugin_user_data = (void*)self; - -	return 0; -} - -#else // LL_QUICKTIME_ENABLED - -// Stubbed-out class with constructor/destructor (necessary or windows linker -// will just think its dead code and optimize it all out) -class MediaPluginQuickTime : public MediaPluginBase -{ -public: -	MediaPluginQuickTime(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data); -	~MediaPluginQuickTime(); -	/* virtual */ void receiveMessage(const char *message_string); -}; - -MediaPluginQuickTime::MediaPluginQuickTime( -	LLPluginInstance::sendMessageFunction host_send_func, -	void *host_user_data ) : -	MediaPluginBase(host_send_func, host_user_data) -{ -    // no-op -} - -MediaPluginQuickTime::~MediaPluginQuickTime() -{ -    // no-op -} - -void MediaPluginQuickTime::receiveMessage(const char *message_string) -{ -    // no-op -} - -// We're building without quicktime enabled.  Just refuse to initialize. -int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data) -{ -    return -1; -} - -#endif // LL_QUICKTIME_ENABLED diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 16edd39ecc..ac5e12c392 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -13,7 +13,6 @@ include(DragDrop)  include(EXPAT)  include(FMODEX)  include(GLOD) -include(GooglePerfTools)  include(Hunspell)  include(JsonCpp)  include(LLAppearance) @@ -1680,7 +1679,7 @@ if (WINDOWS)      set_target_properties(${VIEWER_BINARY_NAME}          PROPERTIES          # *TODO -reenable this once we get server usage sorted out -        LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS ${TCMALLOC_LINK_FLAGS} /LARGEADDRESSAWARE" +        LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS /LARGEADDRESSAWARE"          LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO /LARGEADDRESSAWARE"          LINK_FLAGS_RELEASE "/FORCE:MULTIPLE /MAP\"secondlife-bin.MAP\" /OPT:REF /LARGEADDRESSAWARE"          ) @@ -1700,20 +1699,8 @@ if (WINDOWS)      # In the meantime, if you have any ideas on how to easily maintain one list, either here or in viewer_manifest.py      # and have the build deps get tracked *please* tell me about it. -    if(USE_TCMALLOC) -      # Configure a var for tcmalloc location, if used. -      # Note the need to specify multiple names explicitly. -      set(GOOGLE_PERF_TOOLS_SOURCE -        ${SHARED_LIB_STAGING_DIR}/Release/libtcmalloc_minimal.dll -        ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/libtcmalloc_minimal.dll -        ${SHARED_LIB_STAGING_DIR}/Debug/libtcmalloc_minimal-debug.dll -        ) -     endif(USE_TCMALLOC) - -      set(COPY_INPUT_DEPENDENCIES        # The following commented dependencies are determined at variably at build time. Can't do this here. -      #${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libtcmalloc_minimal.dll => None ... Skipping libtcmalloc_minimal.dll        ${CMAKE_SOURCE_DIR}/../etc/message.xml        ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg        ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/llcommon.dll @@ -1955,7 +1942,6 @@ target_link_libraries(${VIEWER_BINARY_NAME}      ${LLLOGIN_LIBRARIES}      ${LLPHYSICS_LIBRARIES}      ${LLPHYSICSEXTENSIONS_LIBRARIES} -    ${TCMALLOC_LIBRARIES}      ${LLAPPEARANCE_LIBRARIES}      ) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 5cf2e4555d..e12b8cfecd 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -6332,17 +6332,6 @@        <key>Value</key>        <integer>512</integer>      </map> -    <key>MemProfiling</key> -    <map> -      <key>Comment</key> -      <string>You want to use tcmalloc's memory profiling options.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map>      <key>MenuAccessKeyTime</key>      <map>        <key>Comment</key> @@ -10024,28 +10013,28 @@      <key>Value</key>      <integer>0</integer>    </map> -  <key>RenderUseFarClip</key> -  <map> -    <key>Comment</key> -    <string>If false, frustum culling will ignore far clip plane.</string> -    <key>Persist</key> -    <integer>1</integer> -    <key>Type</key> -    <string>Boolean</string> -    <key>Value</key> -    <integer>1</integer> -  </map> -  <key>RenderUseImpostors</key> -  <map> -    <key>Comment</key> +    <key>RenderUseFarClip</key> +    <map> +      <key>Comment</key> +      <string>If false, frustum culling will ignore far clip plane.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map> +    <key>RenderUseImpostors</key> +    <map> +      <key>Comment</key>      <string>OBSOLETE and UNUSED. See RenderAvatarMaxNonImpostors and RenderAvatarMaxComplexity.</string> -    <key>Persist</key> +      <key>Persist</key>      <integer>0</integer> -    <key>Type</key> -    <string>Boolean</string> -    <key>Value</key> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key>      <integer>0</integer> -  </map> +    </map>    <key>RenderAutoMuteByteLimit</key>    <map>      <key>Comment</key> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 66d730d1ac..29751edfac 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -386,10 +386,7 @@ class Windows_i686_Manifest(ViewerManifest):                  print "Skipping fmodex audio library(assuming other audio engine)"              # For textures -            if self.args['configuration'].lower() == 'debug': -                self.path("openjpegd.dll") -            else: -                self.path("openjpeg.dll") +            self.path("openjpeg.dll")              # These need to be installed as a SxS assembly, currently a 'private' assembly.              # See http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx diff --git a/indra/test/CMakeLists.txt b/indra/test/CMakeLists.txt index 55442b2521..8344cead57 100644 --- a/indra/test/CMakeLists.txt +++ b/indra/test/CMakeLists.txt @@ -102,7 +102,6 @@ target_link_libraries(lltest      ${BOOST_CONTEXT_LIBRARY}      ${BOOST_SYSTEM_LIBRARY}      ${DL_LIBRARY} -    ${GOOGLE_PERFTOOLS_LIBRARIES}      )  if (WINDOWS) diff --git a/indra/test_apps/llplugintest/CMakeLists.txt b/indra/test_apps/llplugintest/CMakeLists.txt deleted file mode 100644 index e682eaccca..0000000000 --- a/indra/test_apps/llplugintest/CMakeLists.txt +++ /dev/null @@ -1,336 +0,0 @@ -# -*- cmake -*- -project(llplugintest) - -include(00-Common) -include(OpenGL) -include(LLCommon) -include(LLPlugin) -include(Linking) -include(LLSharedLibs) -include(PluginAPI) -include(LLImage) -include(LLMath) -include(LLMessage) -include(LLRender) -include(LLWindow) -include(Glut) -include(Glui) - -include_directories( -    ${LLPLUGIN_INCLUDE_DIRS} -    ${LLCOMMON_INCLUDE_DIRS} -    ${LLIMAGE_INCLUDE_DIRS} -    ${LLMATH_INCLUDE_DIRS} -    ${LLMESSAGE_INCLUDE_DIRS} -    ${LLRENDER_INCLUDE_DIRS} -    ${LLWINDOW_INCLUDE_DIRS} -) -include_directories(SYSTEM -    ${LLCOMMON_SYSTEM_INCLUDE_DIRS} -    ) - -if (DARWIN) -    include(CMakeFindFrameworks) -    find_library(COREFOUNDATION_LIBRARY CoreFoundation) -endif (DARWIN) - -### demo_plugin - -#set(demo_plugin_SOURCE_FILES -#    demo_plugin.cpp -#    ) -# -#add_library(demo_plugin -#    SHARED -#    ${demo_plugin_SOURCE_FILES} -#) -# -#target_link_libraries(demo_plugin -#  ${LLPLUGIN_LIBRARIES} -#  ${LLCOMMON_LIBRARIES} -#  ${PLUGIN_API_WINDOWS_LIBRARIES} -#) -# -#add_dependencies(demo_plugin -#  ${LLPLUGIN_LIBRARIES} -#  ${LLCOMMON_LIBRARIES} -#) -# -#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( -#    demo_plugin -#    PROPERTIES -#    PREFIX "" -#    BUILD_WITH_INSTALL_RPATH 1 -#    INSTALL_NAME_DIR "@executable_path" -#  ) -#endif (DARWIN) - -### plugin_host - -#set(plugin_host_SOURCE_FILES -#    plugin_host.cpp -#    ) -# -#add_executable(plugin_host -#    WIN32 -#    ${plugin_host_SOURCE_FILES} -#) -# -#set_target_properties(plugin_host -#    PROPERTIES -#    WIN32_EXECUTABLE -#    FALSE -#) -# -#target_link_libraries(plugin_host -#  ${LLPLUGIN_LIBRARIES} -#  ${LLCOMMON_LIBRARIES} -#  ${PLUGIN_API_WINDOWS_LIBRARIES} -#) -# -#add_dependencies(plugin_host -#  demo_plugin -#  ${LLPLUGIN_LIBRARIES} -#  ${LLCOMMON_LIBRARIES} -#) - -### plugin_process_launcher - -#set(plugin_process_launcher_SOURCE_FILES -#    plugin_process_launcher.cpp -#    ) -# -#add_executable(plugin_process_launcher -#    WIN32 -#    ${plugin_process_launcher_SOURCE_FILES} -#) -# -#set_target_properties(plugin_process_launcher -#    PROPERTIES -#    WIN32_EXECUTABLE -#    FALSE -#) -# -#target_link_libraries(plugin_process_launcher -#  ${LLPLUGIN_LIBRARIES} -#  ${LLMESSAGE_LIBRARIES} -#  ${LLCOMMON_LIBRARIES} -#  ${PLUGIN_API_WINDOWS_LIBRARIES} -#) -# -#add_dependencies(plugin_process_launcher -#  SLPlugin -#  demo_plugin -#  ${LLPLUGIN_LIBRARIES} -#  ${LLMESSAGE_LIBRARIES} -#  ${LLCOMMON_LIBRARIES} -#) - -### media_simple_test - -#set(media_simple_test_SOURCE_FILES -#    media_simple_test.cpp -#    ) -# -#add_executable(media_simple_test -#    WIN32 -#    ${media_simple_test_SOURCE_FILES} -#) -# -#add_dependencies(media_simple_test stage_third_party_libs) -# -#set_target_properties(media_simple_test -#    PROPERTIES -#    WIN32_EXECUTABLE -#    FALSE -#) -# -#target_link_libraries(media_simple_test -#  ${GLUT_LIBRARY} -#  ${OPENGL_LIBRARIES} -#  ${LLCOMMON_LIBRARIES} -#) - -### media_plugin_test - -#set(media_plugin_test_SOURCE_FILES -#    media_plugin_test.cpp -#    ) -# -#add_executable(media_plugin_test -#    WIN32 -#    ${media_plugin_test_SOURCE_FILES} -#) -# -#set_target_properties(media_plugin_test -#    PROPERTIES -#    WIN32_EXECUTABLE -#    FALSE -#) -# -#target_link_libraries(media_plugin_test -#  ${GLUT_LIBRARY} -#  ${OPENGL_LIBRARIES} -#  ${LLPLUGIN_LIBRARIES} -#  ${LLMESSAGE_LIBRARIES} -#  ${LLCOMMON_LIBRARIES} -#  ${PLUGIN_API_WINDOWS_LIBRARIES} -#) -# -#add_dependencies(media_plugin_test -#  stage_third_party_libs -#  SLPlugin -#  demo_media_plugin -#  ${LLPLUGIN_LIBRARIES} -#  ${LLMESSAGE_LIBRARIES} -#  ${LLCOMMON_LIBRARIES} -#) - -### demo_media_plugin - -#set(demo_media_plugin_SOURCE_FILES -#    demo_media_plugin.cpp -#    ) -# -#add_library(demo_media_plugin -#    SHARED -#    ${demo_media_plugin_SOURCE_FILES} -#) -# -#target_link_libraries(demo_media_plugin -#  ${LLPLUGIN_LIBRARIES} -#  ${LLCOMMON_LIBRARIES} -#  ${PLUGIN_API_WINDOWS_LIBRARIES} -#) -# -#add_dependencies(demo_media_plugin -#  ${LLPLUGIN_LIBRARIES} -#  ${LLCOMMON_LIBRARIES} -#) -# -#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( -#    demo_media_plugin -#    PROPERTIES -#    PREFIX "" -#    BUILD_WITH_INSTALL_RPATH 1 -#    INSTALL_NAME_DIR "@executable_path" -#  ) -#endif (DARWIN) - -### demo_media_plugin_2 - -#set(demo_media_plugin_2_SOURCE_FILES -#    demo_media_plugin_2.cpp -#    ) -# -#add_library(demo_media_plugin_2 -#    SHARED -#    ${demo_media_plugin_2_SOURCE_FILES} -#) -# -#target_link_libraries(demo_media_plugin_2 -#  ${LLPLUGIN_LIBRARIES} -#  ${LLCOMMON_LIBRARIES} -#  ${PLUGIN_API_WINDOWS_LIBRARIES} -#) -# -#add_dependencies(demo_media_plugin_2 -#  ${LLPLUGIN_LIBRARIES} -#  ${LLCOMMON_LIBRARIES} -#) -# -#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( -#    demo_media_plugin_2 -#    PROPERTIES -#    PREFIX "" -#    BUILD_WITH_INSTALL_RPATH 1 -#    INSTALL_NAME_DIR "@executable_path" -#  ) -#endif (DARWIN) - -# Gather build products of the various dependencies into the build directory for the testbed. - -if(WINDOWS) -  #******************** -  # Plugin test library deploy -  # -  # Debug config runtime files required for the plugin test mule -  set(plugintest_debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}") -  set(plugintest_debug_files -    libeay32.dll -    libglib-2.0-0.dll -    libgmodule-2.0-0.dll -    libgobject-2.0-0.dll -    libgthread-2.0-0.dll -    ssleay32.dll -    ) -  copy_if_different( -    ${plugintest_debug_src_dir} -    "${CMAKE_CURRENT_BINARY_DIR}/Debug" -    out_targets -    ${plugintest_debug_files} -    ) -  set(plugin_test_targets ${plugin_test_targets} ${out_targets}) -   -  # Release & ReleaseDebInfo config runtime files required for the plugin test mule -  set(plugintest_release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}") -  set(plugintest_release_files -    libeay32.dll -    libglib-2.0-0.dll -    libgmodule-2.0-0.dll -    libgobject-2.0-0.dll -    libgthread-2.0-0.dll -    ssleay32.dll -    ) -  copy_if_different( -    ${plugintest_release_src_dir} -    "${CMAKE_CURRENT_BINARY_DIR}/Release" -    out_targets -    ${plugintest_release_files} -    ) -  set(plugin_test_targets ${plugin_test_targets} ${out_targets}) - -  copy_if_different( -    ${plugintest_release_src_dir} -    "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo" -    out_targets -    ${plugintest_release_files} -    ) -  set(plugin_test_targets ${plugin_test_targets} ${out_targets}) - -   add_custom_target(copy_plugintest_libs ALL -     DEPENDS  -     ${plugin_test_targets} -     ) - -endif(WINDOWS) - -if (DARWIN) -  set(plugintest_release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}") -  set(plugintest_release_files -    libexception_handler.dylib -    libaprutil-1.0.dylib -    libapr-1.0.dylib -    libexpat.1.5.2.dylib -    ) -  copy_if_different( -    ${plugintest_release_src_dir} -    "${PLUGINS_DESTINATION_DIR}" -    out_targets -    ${plugintest_release_files} -    ) -  set(plugin_test_targets ${plugin_test_targets} ${out_targets}) - -  add_custom_target(copy_plugintest_libs ALL -    DEPENDS  -    ${plugin_test_targets} -    ) - -endif (DARWIN) - diff --git a/indra/test_apps/llplugintest/README.Linden b/indra/test_apps/llplugintest/README.Linden deleted file mode 100644 index 4a9f223c21..0000000000 --- a/indra/test_apps/llplugintest/README.Linden +++ /dev/null @@ -1,21 +0,0 @@ - -1.  Description - -    Exercises SLPlugin.  Demonstrates mediakit plugin reuse and -    switchover as MIME type changes (web, quicktime, flash). - - -2.  Running - -  2.1  Mac - -    Make certain '.' is included in PATH.  E.g.: - -       PATH=.:"$PATH" open build-darwin-i386/test_apps/llmediaplugintest/RelWithDebInfo/llmediaplugintest.app - -    Otherwise the program won't find SLPlugin and will timeout and -    fail after 30 seconds and give you little information as to why. - -    Running 'dtruss' on plugin test applications will give you a great -    deal of insight into why they aren't activating. - diff --git a/indra/test_apps/llplugintest/bookmarks.txt b/indra/test_apps/llplugintest/bookmarks.txt deleted file mode 100644 index 2ff64f217f..0000000000 --- a/indra/test_apps/llplugintest/bookmarks.txt +++ /dev/null @@ -1,37 +0,0 @@ -# format is description, url (don't put ',' chars in description :) -# if no ',' found, whole line is used for both description and url -(WK) Google Home Page,http://www.google.com -(WK) BBC News Home Page,http://news.bbc.co.uk -(WK) Second Life,http://secondlife.com -(WK) WebKit Home ,http://www.webkit.org -(WK) Yahoo News,http://news.yahoo.com -(WK) Canvas Paint (DHTML version of MS Paint),http://www.canvaspaint.org -(WK) DHTML Lemmings!,http://www.elizium.nu/scripts/lemmings/ -(WK) DHTML graphics demos,http://www.dhteumeuleu.com/ -(WK) Shared paint app,http://colorillo.com/ac79?1l0q6cp -(Flash) YouTube,http://youtube.com -(Flash) Vimeo,http://www.vimeo.com/1778399 -(Flash) Simple whiteboard,http://www.imaginationcubed.com/ -(Flash) Dabble Board,http://www.dabbleboard.com/draw -(Flash) Bubble Shooter game,http://www.wiicade.com/playGame.aspx?gameID=72&gameName=Bubble%20Shooter  -(Flash) Pixlr photo editor,http://pixlr.com/editor/ -(Flash) Scribd,http://www.scribd.com/doc/14427744/Second-Life-Quickstart-Guide -(Flash) MAME,http://yvern.com/fMAME/fMAME.html -(QT) Local sample,file:///C|/Program Files/QuickTime/Sample.mov -(QT) Movie - Watchmen Trailer,http://trailers.apple.com/movies/wb/watchmen/watchmen-tlr2_480p.mov -(QT) Movie - Transformers - Revenge of the Fallen,http://trailers.apple.com/movies/paramount/transformers2/transformersrevengeofthefallen-tlr1_h.320.mov -(QT) Movie - Terminator Salvation,http://trailers.apple.com/movies/wb/terminatorsalvation/terminatorsalvation-tlr3_h.320.mov -(QT) Movie - Angels and Demons,http://trailers.apple.com/movies/sony_pictures/angelsanddemons/angelsanddemons-video_h.320.mov -(QT) Movie - Sin City Trailer,http://trailers.apple.com/movies/miramax/sin_city/sin_city_480.mov -(QT) Movie - The Incredibles Trailer,http://trailers.apple.com/movies/disney/the_incredibles/the_incredibles-tlr_a480.mov -(QT) Movie - Streaming Apple Event,http://stream.qtv.apple.com/events/mar/0903lajkszg/m_090374535329zdwg_650_ref.mov -(QT) Movie - MPEG-4 from Amazon S3,http://s3.amazonaws.com/callum-linden/flashdemo/interactive_flash_demo.mp4 -(QT) Movie - Star Trek,http://trailers.apple.com/movies/paramount/star_trek/startrek-tlr3_h.320.mov -(QT) Movie - Ice Age 3,http://trailers.apple.com/movies/fox/ice_age_iii/iceage3-tlrd_h.320.mov -(QT) Movie - AstroBoy,http://trailers.apple.com/movies/summit/astroboy/astroboy-tsr_h.320.mov -(QT) Movie - Ante Up,http://trailers.apple.com/movies/independent/anteup/anteup_h.320.mov -(QT) Movie - Every Little Step,http://trailers.apple.com/movies/sony/everylittlestep/everylittlestep-clip_h.320.mov -(QT) Movie - The Informers,http://trailers.apple.com/movies/independent/theinformers/theinformers_h.320.mov -(QT) Animated GIF,http://upload.wikimedia.org/wikipedia/commons/4/44/Optical.greysquares.arp-animated.gif -(QT) Apple Text Descriptors,http://ubrowser.com/tmp/apple_text.txt -(EX) Example Plugin,example://blah | 
