summaryrefslogtreecommitdiff
path: root/indra/newview/llviewerparcelmedia.cpp
diff options
context:
space:
mode:
authorJosh Bell <josh@lindenlab.com>2008-02-14 01:45:59 +0000
committerJosh Bell <josh@lindenlab.com>2008-02-14 01:45:59 +0000
commit98fd90ddd6595f2ee7e626c14117f51def621ec5 (patch)
tree9a9caf8bffa53b753fe850f445bd133195e9bb03 /indra/newview/llviewerparcelmedia.cpp
parent89d938efe371645756240da72f4c359c36985060 (diff)
svn merge -r 79730:79944 svn+ssh://svn.lindenlab.com/svn/linden/branches/parcel_media/sl-parcelmedia-6 --> release
QAR-275 Parcel Media Sam made me do it.
Diffstat (limited to 'indra/newview/llviewerparcelmedia.cpp')
-rw-r--r--indra/newview/llviewerparcelmedia.cpp340
1 files changed, 340 insertions, 0 deletions
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
new file mode 100644
index 0000000000..33c8ed919c
--- /dev/null
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -0,0 +1,340 @@
+/**
+ * @file llviewerparcelmedia.cpp
+ * @author Callum Prentice & James Cook
+ * @brief Handlers for multimedia on a per-parcel basis
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+#include "llviewerprecompiledheaders.h"
+#include "llviewerparcelmedia.h"
+
+#include "llagent.h"
+#include "llviewercontrol.h"
+#include "llviewermedia.h"
+#include "llviewerregion.h"
+#include "llparcel.h"
+#include "llviewerparcelmgr.h"
+#include "lluuid.h"
+#include "message.h"
+#include "llviewerparcelmediaautoplay.h"
+#include "llfirstuse.h"
+
+// Static Variables
+
+S32 LLViewerParcelMedia::sMediaParcelLocalID = 0;
+LLUUID LLViewerParcelMedia::sMediaRegionID;
+
+// Move this to its own file.
+// helper class that tries to download a URL from a web site and calls a method
+// on the Panel Land Media and to discover the MIME type
+class LLMimeDiscoveryResponder : public LLHTTPClient::Responder
+{
+public:
+ LLMimeDiscoveryResponder( )
+ {}
+
+
+
+ virtual void completedHeader(U32 status, const std::string& reason, const LLSD& content)
+ {
+ std::string media_type = content["content-type"].asString();
+ std::string::size_type idx1 = media_type.find_first_of(";");
+ std::string mime_type = media_type.substr(0, idx1);
+ completeAny(status, mime_type);
+ }
+
+ virtual void error( U32 status, const std::string& reason )
+ {
+ completeAny(status, "none/none");
+ }
+
+ void completeAny(U32 status, const std::string& mime_type)
+ {
+ LLViewerMedia::setMimeType(mime_type);
+ }
+};
+
+// static
+void LLViewerParcelMedia::initClass()
+{
+ LLMessageSystem* msg = gMessageSystem;
+ msg->setHandlerFunc("ParcelMediaCommandMessage", processParcelMediaCommandMessage );
+ msg->setHandlerFunc("ParcelMediaUpdate", processParcelMediaUpdate );
+ LLViewerParcelMediaAutoPlay::initClass();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerParcelMedia::update(LLParcel* parcel)
+{
+ if (/*LLViewerMedia::hasMedia()*/ true)
+ {
+ // we have a player
+ if (parcel)
+ {
+ // we're in a parcel
+ bool new_parcel = false;
+ S32 parcelid = parcel->getLocalID();
+ LLUUID regionid = gAgent.getRegion()->getRegionID();
+ if (parcelid != sMediaParcelLocalID || regionid != sMediaRegionID)
+ {
+ sMediaParcelLocalID = parcelid;
+ sMediaRegionID = regionid;
+ new_parcel = true;
+ }
+
+ std::string mediaUrl = std::string ( parcel->getMediaURL () );
+ LLString::trim(mediaUrl);
+
+ // has something changed?
+ if ( ( LLViewerMedia::getMediaURL() != mediaUrl )
+ || ( LLViewerMedia::getMediaTextureID() != parcel->getMediaID () ) )
+ {
+ bool video_was_playing = FALSE;
+ bool same_media_id = LLViewerMedia::getMediaTextureID() == parcel->getMediaID ();
+
+ if (LLViewerMedia::isMediaPlaying())
+ {
+ video_was_playing = TRUE;
+ }
+
+ if ( !mediaUrl.empty() && same_media_id && ! new_parcel)
+ {
+ // Someone has "changed the channel", changing the URL of a video
+ // you were already watching. Automatically play provided the texture ID is the same
+ if (video_was_playing)
+ {
+ // Poke the mime type in before calling play.
+ // This is necessary because in this instance we are not waiting
+ // for the results of a header curl. In order to change the channel
+ // a mime type MUST be provided.
+ LLViewerMedia::setMimeType(parcel->getMediaType());
+ play(parcel);
+ }
+ }
+ else
+ {
+ stop();
+ }
+
+ // Discover the MIME type
+ // Disabled for the time being. Get the mime type from the parcel.
+ if(gSavedSettings.getBOOL("AutoMimeDiscovery"))
+ {
+ LLHTTPClient::getHeaderOnly( mediaUrl, new LLMimeDiscoveryResponder());
+ }
+ else
+ {
+ LLViewerMedia::setMimeType(parcel->getMediaType());
+ }
+
+ }
+ }
+ else
+ {
+ stop();
+ }
+ }
+ /*
+ else
+ {
+ // no audio player, do a first use dialog if their is media here
+ if (parcel)
+ {
+ std::string mediaUrl = std::string ( parcel->getMediaURL () );
+ if (!mediaUrl.empty ())
+ {
+ if (gSavedSettings.getWarning("QuickTimeInstalled"))
+ {
+ gSavedSettings.setWarning("QuickTimeInstalled", FALSE);
+
+ LLNotifyBox::showXml("NoQuickTime" );
+ };
+ }
+ }
+ }
+ */
+}
+
+// static
+void LLViewerParcelMedia::play(LLParcel* parcel)
+{
+ llinfos << "play" << llendl;
+
+ if (!parcel) return;
+
+ if (!gSavedSettings.getBOOL("AudioStreamingVideo"))
+ return;
+
+ std::string media_url = parcel->getMediaURL();
+ std::string mime_type = parcel->getMediaType();
+ LLUUID placeholder_texture_id = parcel->getMediaID();
+ U8 media_auto_scale = parcel->getMediaAutoScale();
+ U8 media_loop = parcel->getMediaLoop();
+ S32 media_width = parcel->getMediaWidth();
+ S32 media_height = parcel->getMediaHeight();
+ LLViewerMedia::play(media_url, mime_type, placeholder_texture_id,
+ media_width, media_height, media_auto_scale,
+ media_loop);
+ LLFirstUse::useMedia();
+
+ LLViewerParcelMediaAutoPlay::playStarted();
+}
+
+// static
+void LLViewerParcelMedia::stop()
+{
+
+ LLViewerMedia::stop();
+}
+
+// static
+void LLViewerParcelMedia::pause()
+{
+ LLViewerMedia::pause();
+}
+
+// static
+void LLViewerParcelMedia::start()
+{
+ LLViewerMedia::start();
+ LLFirstUse::useMedia();
+
+ LLViewerParcelMediaAutoPlay::playStarted();
+}
+
+// static
+void LLViewerParcelMedia::seek(F32 time)
+{
+ LLViewerMedia::seek(time);
+}
+
+
+// static
+LLMediaBase::EStatus LLViewerParcelMedia::getStatus()
+{
+ return LLViewerMedia::getStatus();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerParcelMedia::processParcelMediaCommandMessage( LLMessageSystem *msg, void ** )
+{
+ // extract the agent id
+ // LLUUID agent_id;
+ // msg->getUUID( agent_id );
+
+ U32 flags;
+ U32 command;
+ F32 time;
+ msg->getU32( "CommandBlock", "Flags", flags );
+ msg->getU32( "CommandBlock", "Command", command);
+ msg->getF32( "CommandBlock", "Time", time );
+
+ if (flags &( (1<<PARCEL_MEDIA_COMMAND_STOP)
+ | (1<<PARCEL_MEDIA_COMMAND_PAUSE)
+ | (1<<PARCEL_MEDIA_COMMAND_PLAY)
+ | (1<<PARCEL_MEDIA_COMMAND_LOOP)
+ | (1<<PARCEL_MEDIA_COMMAND_UNLOAD) ))
+ {
+ // stop
+ if( command == PARCEL_MEDIA_COMMAND_STOP )
+ {
+ stop();
+ }
+ else
+ // pause
+ if( command == PARCEL_MEDIA_COMMAND_PAUSE )
+ {
+ pause();
+ }
+ else
+ // play
+ if( command == PARCEL_MEDIA_COMMAND_PLAY )
+ {
+ if (LLViewerMedia::isMediaPaused())
+ {
+ start();
+ }
+ else
+ {
+ LLParcel *parcel = gParcelMgr->getAgentParcel();
+ play(parcel);
+ }
+ }
+ else
+ // loop
+ if( command == PARCEL_MEDIA_COMMAND_LOOP )
+ {
+ //llinfos << ">>> LLMediaEngine::process_parcel_media with command = " <<( '0' + command ) << llendl;
+
+ // huh? what is play?
+ //convertImageAndLoadUrl( play );
+ //convertImageAndLoadUrl( true, false, std::string() );
+ }
+ else
+ // unload
+ if( command == PARCEL_MEDIA_COMMAND_UNLOAD )
+ {
+ stop();
+ }
+ }
+
+ if (flags & (1<<PARCEL_MEDIA_COMMAND_TIME))
+ {
+ if(! LLViewerMedia::hasMedia())
+ {
+ LLParcel *parcel = gParcelMgr->getAgentParcel();
+ play(parcel);
+ }
+ seek(time);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerParcelMedia::processParcelMediaUpdate( LLMessageSystem *msg, void ** )
+{
+ LLUUID media_id;
+ std::string media_url;
+ std::string media_type;
+ S32 media_width = 0;
+ S32 media_height = 0;
+ U8 media_auto_scale = FALSE;
+ U8 media_loop = FALSE;
+
+ msg->getUUID( "DataBlock", "MediaID", media_id );
+ char media_url_buffer[257];
+ msg->getString( "DataBlock", "MediaURL", 255, media_url_buffer );
+ media_url = media_url_buffer;
+ msg->getU8("DataBlock", "MediaAutoScale", media_auto_scale);
+
+ if (msg->getNumberOfBlocks("DataBlockExtended")) // do we have the extended data?
+ {
+ char media_type_buffer[257];
+ msg->getString("DataBlockExtended", "MediaType", 255, media_type_buffer);
+ media_type = media_type_buffer;
+ msg->getU8("DataBlockExtended", "MediaLoop", media_loop);
+ msg->getS32("DataBlockExtended", "MediaWidth", media_width);
+ msg->getS32("DataBlockExtended", "MediaHeight", media_height);
+ }
+
+ LLParcel *parcel = gParcelMgr->getAgentParcel();
+ BOOL same = FALSE;
+ if (parcel)
+ {
+ same = ((parcel->getMediaURL() == media_url) &&
+ (parcel->getMediaType() == media_type) &&
+ (parcel->getMediaID() == media_id) &&
+ (parcel->getMediaWidth() == media_width) &&
+ (parcel->getMediaHeight() == media_height) &&
+ (parcel->getMediaAutoScale() == media_auto_scale) &&
+ (parcel->getMediaLoop() == media_loop));
+ }
+
+ if (!same)
+ LLViewerMedia::play(media_url, media_type, media_id,
+ media_auto_scale, media_width, media_height,
+ media_loop);
+}