diff options
Diffstat (limited to 'indra/media_plugins')
| -rw-r--r-- | indra/media_plugins/cef/media_plugin_cef.cpp | 24 | ||||
| -rw-r--r-- | indra/media_plugins/libvlc/media_plugin_libvlc.cpp | 80 | 
2 files changed, 88 insertions, 16 deletions
| diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp index ea70e21414..43d3a32e64 100644 --- a/indra/media_plugins/cef/media_plugin_cef.cpp +++ b/indra/media_plugins/cef/media_plugin_cef.cpp @@ -34,6 +34,7 @@  #include "llplugininstance.h"  #include "llpluginmessage.h"  #include "llpluginmessageclasses.h" +#include "llstring.h"  #include "volume_catcher.h"  #include "media_plugin_base.h" @@ -55,7 +56,7 @@ private:  	bool init();  	void onPageChangedCallback(const unsigned char* pixels, int x, int y, const int width, const int height); -	void onCustomSchemeURLCallback(std::string url); +	void onCustomSchemeURLCallback(std::string url, bool user_gesture, bool is_redirect);  	void onConsoleMessageCallback(std::string message, std::string source, int line);  	void onStatusMessageCallback(std::string value);  	void onTitleChangeCallback(std::string title); @@ -299,11 +300,18 @@ void MediaPluginCEF::onOpenPopupCallback(std::string url, std::string target)  ////////////////////////////////////////////////////////////////////////////////  // -void MediaPluginCEF::onCustomSchemeURLCallback(std::string url) +void MediaPluginCEF::onCustomSchemeURLCallback(std::string url, bool user_gesture, bool is_redirect)  {  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_nofollow"); -	message.setValue("uri", url); -	message.setValue("nav_type", "clicked");	// TODO: differentiate between click and navigate to +    message.setValue("uri", url); + +    // indicate if this interaction was from a user click (okay on a SLAPP) or  +    // via a navigation (e.g. a data URL - see SL-18151) (not okay on a SLAPP) +    const std::string nav_type = user_gesture ? "clicked" : "navigated"; + +	message.setValue("nav_type", nav_type); +    message.setValueBoolean("is_redirect", is_redirect); +  	sendMessage(message);  } @@ -592,7 +600,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)              {                  // event callbacks from Dullahan                  mCEFLib->setOnPageChangedCallback(std::bind(&MediaPluginCEF::onPageChangedCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5)); -                mCEFLib->setOnCustomSchemeURLCallback(std::bind(&MediaPluginCEF::onCustomSchemeURLCallback, this, std::placeholders::_1)); +                mCEFLib->setOnCustomSchemeURLCallback(std::bind(&MediaPluginCEF::onCustomSchemeURLCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));                  mCEFLib->setOnConsoleMessageCallback(std::bind(&MediaPluginCEF::onConsoleMessageCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));                  mCEFLib->setOnStatusMessageCallback(std::bind(&MediaPluginCEF::onStatusMessageCallback, this, std::placeholders::_1));                  mCEFLib->setOnTitleChangeCallback(std::bind(&MediaPluginCEF::onTitleChangeCallback, this, std::placeholders::_1)); @@ -616,9 +624,9 @@ void MediaPluginCEF::receiveMessage(const char* message_string)                  // dir as the executable that loaded it (SLPlugin.exe). The code in                   // Dullahan that tried to figure out the location automatically uses                   // the location of the exe which isn't helpful so we tell it explicitly. -                char cur_dir_str[MAX_PATH]; -                GetCurrentDirectoryA(MAX_PATH, cur_dir_str); -                settings.host_process_path = std::string(cur_dir_str); +                std::vector<wchar_t> buffer(MAX_PATH + 1); +                GetCurrentDirectoryW(MAX_PATH, &buffer[0]); +                settings.host_process_path = ll_convert_wide_to_string(&buffer[0]);  #endif                  settings.accept_language_list = mHostLanguage; diff --git a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp index 1afe25e9a1..89144922cc 100644 --- a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp +++ b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp @@ -73,6 +73,7 @@ private:  	static void display(void* data, void* id);  	/*virtual*/ void setDirty(int left, int top, int right, int bottom) /* override, but that is not supported in gcc 4.6 */; +    void setDurationDirty();  	static void eventCallbacks(const libvlc_event_t* event, void* ptr); @@ -93,8 +94,8 @@ private:  	bool mIsLooping; -	float mCurTime; -	float mDuration; +	F64 mCurTime; +	F64 mDuration;  	EStatus mVlcStatus;  }; @@ -214,6 +215,19 @@ void MediaPluginLibVLC::setDirty(int left, int top, int right, int bottom)  }  //////////////////////////////////////////////////////////////////////////////// +// *virtual* +void MediaPluginLibVLC::setDurationDirty() +{ +    LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "updated"); + +    message.setValueReal("current_time", mCurTime); +    message.setValueReal("duration", mDuration); +    message.setValueReal("current_rate", 1.0f); + +    sendMessage(message); +} + +////////////////////////////////////////////////////////////////////////////////  //  void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)  { @@ -233,6 +247,7 @@ void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)  		parent->mDuration = (float)(libvlc_media_get_duration(parent->mLibVLCMedia)) / 1000.0f;  		parent->mVlcStatus = STATUS_PLAYING;  		parent->setVolumeVLC(); +        parent->setDurationDirty();  		break;  	case libvlc_MediaPlayerPaused: @@ -245,6 +260,8 @@ void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)  	case libvlc_MediaPlayerEndReached:  		parent->mVlcStatus = STATUS_DONE; +        parent->mCurTime = parent->mDuration; +        parent->setDurationDirty();  		break;  	case libvlc_MediaPlayerEncounteredError: @@ -253,6 +270,11 @@ void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)  	case libvlc_MediaPlayerTimeChanged:  		parent->mCurTime = (float)libvlc_media_player_get_time(parent->mLibVLCMediaPlayer) / 1000.0f; +        if (parent->mVlcStatus == STATUS_DONE && libvlc_media_player_is_playing(parent->mLibVLCMediaPlayer)) +        { +            parent->mVlcStatus = STATUS_PLAYING; +        } +        parent->setDurationDirty();  		break;  	case libvlc_MediaPlayerPositionChanged: @@ -260,6 +282,7 @@ void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)  	case libvlc_MediaPlayerLengthChanged:  		parent->mDuration = (float)libvlc_media_get_duration(parent->mLibVLCMedia) / 1000.0f; +        parent->setDurationDirty();  		break;  	case libvlc_MediaPlayerTitleChanged: @@ -562,7 +585,24 @@ void MediaPluginLibVLC::receiveMessage(const char* message_string)  						mTextureWidth = texture_width;  						mTextureHeight = texture_height; +                        libvlc_time_t time = 1000.0 * mCurTime; +  						playMedia(); + +                        if (mLibVLCMediaPlayer) +                        { +                            libvlc_media_player_set_time(mLibVLCMediaPlayer, time); +                            time = libvlc_media_player_get_time(mLibVLCMediaPlayer); +                            if (time < 0) +                            { +                                // -1 if there is no media +                                mCurTime = 0; +                            } +                            else +                            { +                                mCurTime = (F64)time / 1000.0; +                            } +                        }  					};  				}; @@ -594,6 +634,13 @@ void MediaPluginLibVLC::receiveMessage(const char* message_string)  				{  					if (mLibVLCMediaPlayer)  					{ +                        if (mVlcStatus == STATUS_DONE && !libvlc_media_player_is_playing(mLibVLCMediaPlayer)) +                        { +                            // stop or vlc will ignore 'play', it will just +                            // make an MediaPlayerEndReached event even if +                            // seek was used +                            libvlc_media_player_stop(mLibVLCMediaPlayer); +                        }  						libvlc_media_player_play(mLibVLCMediaPlayer);  					}  				} @@ -606,15 +653,32 @@ void MediaPluginLibVLC::receiveMessage(const char* message_string)  				}  				else if (message_name == "seek")  				{ -					if (mDuration > 0) -					{ -						F64 normalized_offset = message_in.getValueReal("time") / mDuration; -						libvlc_media_player_set_position(mLibVLCMediaPlayer, normalized_offset); -					} +                    if (mLibVLCMediaPlayer) +                    { +                        libvlc_time_t time = 1000.0 * message_in.getValueReal("time"); +                        libvlc_media_player_set_time(mLibVLCMediaPlayer, time); +                        time = libvlc_media_player_get_time(mLibVLCMediaPlayer); +                        if (time < 0) +                        { +                            // -1 if there is no media +                            mCurTime = 0; +                        } +                        else +                        { +                            mCurTime = (F64)time / 1000.0; +                        } + +                        if (!libvlc_media_player_is_playing(mLibVLCMediaPlayer)) +                        { +                            // if paused, won't trigger update, update now +                            setDurationDirty(); +                        } +                    }  				}  				else if (message_name == "set_loop")  				{ -					mIsLooping = true; +					bool loop = message_in.getValueBoolean("loop"); +					mIsLooping = loop;  				}  				else if (message_name == "set_volume")  				{ | 
