From da6c816204eb3364a4527bc086d27e79cd2af0e5 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Thu, 5 Jan 2012 17:10:38 +0000 Subject: Commenting out DataSnapShot message "Registering service discovery capability" for now. Please uncomment if/when needed. --- OpenSim/Region/DataSnapshot/DataRequestHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/DataSnapshot/DataRequestHandler.cs b/OpenSim/Region/DataSnapshot/DataRequestHandler.cs index b760454..93648d6 100644 --- a/OpenSim/Region/DataSnapshot/DataRequestHandler.cs +++ b/OpenSim/Region/DataSnapshot/DataRequestHandler.cs @@ -67,7 +67,7 @@ namespace OpenSim.Region.DataSnapshot public void OnRegisterCaps(UUID agentID, Caps caps) { - m_log.Info("[DATASNAPSHOT]: Registering service discovery capability for " + agentID); +// m_log.InfoFormat("[DATASNAPSHOT]: Registering service discovery capability for {0}", agentID); string capsBase = "/CAPS/" + caps.CapsObjectPath; caps.RegisterHandler("PublicSnapshotDataInfo", new RestStreamHandler("POST", capsBase + m_discoveryPath, OnDiscoveryAttempt)); -- cgit v1.1 From c201b54b8524033310c59fe353616e84616a542e Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Thu, 5 Jan 2012 19:40:54 +0000 Subject: Improve "app rebake" command to return a better message if no uploaded texture ids were available for the rebake request --- OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs | 12 ++++++------ .../CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs | 7 ++++++- OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs | 5 ++++- .../Avatar/Appearance/AppearanceInfoModule.cs | 13 +++++++++---- 4 files changed, 25 insertions(+), 12 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs index 3e31b7d..b53f0af 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs @@ -107,9 +107,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP } else { -// m_log.DebugFormat( -// "[LL IMAGE MANAGER]: Received duplicate of existing request for {0}, start packet {1} from {2}", -// newRequest.RequestedAssetID, newRequest.PacketNumber, m_client.Name); + m_log.DebugFormat( + "[LL IMAGE MANAGER]: Received duplicate of existing request for {0}, start packet {1} from {2}", + newRequest.RequestedAssetID, newRequest.PacketNumber, m_client.Name); //m_log.DebugFormat("[TEX]: (UPD) ID={0}: D={1}, S={2}, P={3}", // newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority); @@ -168,9 +168,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP } else { -// m_log.DebugFormat( -// "[LL IMAGE MANAGER]: Received request for {0}, start packet {1} from {2}", -// newRequest.RequestedAssetID, newRequest.PacketNumber, m_client.Name); + m_log.DebugFormat( + "[LL IMAGE MANAGER]: Received request for {0}, start packet {1} from {2}", + newRequest.RequestedAssetID, newRequest.PacketNumber, m_client.Name); //m_log.DebugFormat("[TEX]: (NEW) ID={0}: D={1}, S={2}, P={3}", // newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority); diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index 9df0592..d68d28c 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs @@ -321,8 +321,10 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory return (defonly ? false : true); } - public void RequestRebake(IScenePresence sp, bool missingTexturesOnly) + public int RequestRebake(IScenePresence sp, bool missingTexturesOnly) { + int texturesRebaked = 0; + for (int i = 0; i < AvatarAppearance.BAKE_INDICES.Length; i++) { int idx = AvatarAppearance.BAKE_INDICES[i]; @@ -359,8 +361,11 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory face.TextureID, idx, sp.Name); } + texturesRebaked++; sp.ControllingClient.SendRebakeAvatarTextures(face.TextureID); } + + return texturesRebaked; } #endregion diff --git a/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs b/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs index 04df9c3..39a760c 100644 --- a/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs @@ -82,7 +82,10 @@ namespace OpenSim.Region.Framework.Interfaces /// If true, only request a rebake for the textures that are missing. /// If false then we request a rebake of all textures for which we already have references. /// - void RequestRebake(IScenePresence sp, bool missingTexturesOnly); + /// + /// Number of rebake requests made. This will depend upon whether we've previously received texture IDs. + /// + int RequestRebake(IScenePresence sp, bool missingTexturesOnly); void QueueAppearanceSend(UUID agentid); void QueueAppearanceSave(UUID agentid); diff --git a/OpenSim/Region/OptionalModules/Avatar/Appearance/AppearanceInfoModule.cs b/OpenSim/Region/OptionalModules/Avatar/Appearance/AppearanceInfoModule.cs index 7e15718..39cd4c9 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Appearance/AppearanceInfoModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Appearance/AppearanceInfoModule.cs @@ -240,11 +240,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance ScenePresence sp = scene.GetScenePresence(firstname, lastname); if (sp != null && !sp.IsChildAgent) { - MainConsole.Instance.OutputFormat( - "Requesting rebake of uploaded textures for {0}", - sp.Name, scene.RegionInfo.RegionName); + int rebakesRequested = scene.AvatarFactory.RequestRebake(sp, false); - scene.AvatarFactory.RequestRebake(sp, false); + if (rebakesRequested > 0) + MainConsole.Instance.OutputFormat( + "Requesting rebake of {0} uploaded textures for {1} in {2}", + rebakesRequested, sp.Name, scene.RegionInfo.RegionName); + else + MainConsole.Instance.OutputFormat( + "No texture IDs available for rebake request for {0} in {1}", + sp.Name, scene.RegionInfo.RegionName); } } } -- cgit v1.1 From 50e459d265ab2a25d41afee82e475a530f0cfd5a Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Thu, 5 Jan 2012 19:44:06 +0000 Subject: recomment log messages I accidentally left uncommented --- OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs index b53f0af..3e31b7d 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs @@ -107,9 +107,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP } else { - m_log.DebugFormat( - "[LL IMAGE MANAGER]: Received duplicate of existing request for {0}, start packet {1} from {2}", - newRequest.RequestedAssetID, newRequest.PacketNumber, m_client.Name); +// m_log.DebugFormat( +// "[LL IMAGE MANAGER]: Received duplicate of existing request for {0}, start packet {1} from {2}", +// newRequest.RequestedAssetID, newRequest.PacketNumber, m_client.Name); //m_log.DebugFormat("[TEX]: (UPD) ID={0}: D={1}, S={2}, P={3}", // newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority); @@ -168,9 +168,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP } else { - m_log.DebugFormat( - "[LL IMAGE MANAGER]: Received request for {0}, start packet {1} from {2}", - newRequest.RequestedAssetID, newRequest.PacketNumber, m_client.Name); +// m_log.DebugFormat( +// "[LL IMAGE MANAGER]: Received request for {0}, start packet {1} from {2}", +// newRequest.RequestedAssetID, newRequest.PacketNumber, m_client.Name); //m_log.DebugFormat("[TEX]: (NEW) ID={0}: D={1}, S={2}, P={3}", // newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority); -- cgit v1.1 From 7319ba62dd1791a3dade5b5453e369d955de48a2 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Thu, 5 Jan 2012 20:51:49 +0000 Subject: Move simulator asset info commands to an optional module from the connector. Make them conform with service side commands. This stops them appearing twice when Hypergrid is enabled. --- .../OptionalModules/Asset/AssetInfoModule.cs | 134 +++++++++++++++++++++ .../Minimodule/Interfaces/IInventoryItem.cs | 5 +- 2 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 OpenSim/Region/OptionalModules/Asset/AssetInfoModule.cs (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/OptionalModules/Asset/AssetInfoModule.cs b/OpenSim/Region/OptionalModules/Asset/AssetInfoModule.cs new file mode 100644 index 0000000..9ea6343 --- /dev/null +++ b/OpenSim/Region/OptionalModules/Asset/AssetInfoModule.cs @@ -0,0 +1,134 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text; +using log4net; +using Mono.Addins; +using Nini.Config; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Framework.Console; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.Region.OptionalModules.Asset +{ + /// + /// A module that just holds commands for inspecting assets. + /// + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "AssetInfoModule")] + public class AssetInfoModule : ISharedRegionModule + { +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private Scene m_scene; + + public string Name { get { return "Asset Information Module"; } } + + public Type ReplaceableInterface { get { return null; } } + + public void Initialise(IConfigSource source) + { +// m_log.DebugFormat("[ASSET INFO MODULE]: INITIALIZED MODULE"); + } + + public void PostInitialise() + { +// m_log.DebugFormat("[ASSET INFO MODULE]: POST INITIALIZED MODULE"); + } + + public void Close() + { +// m_log.DebugFormat("[ASSET INFO MODULE]: CLOSED MODULE"); + } + + public void AddRegion(Scene scene) + { +// m_log.DebugFormat("[ASSET INFO MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName); + } + + public void RemoveRegion(Scene scene) + { +// m_log.DebugFormat("[ASSET INFO MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName); + } + + public void RegionLoaded(Scene scene) + { +// m_log.DebugFormat("[ASSET INFO MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); + + if (m_scene == null) + m_scene = scene; + + MainConsole.Instance.Commands.AddCommand( + "asset", false, "dump asset", + "dump asset ", + "Dump an asset", + HandleDumpAsset); + } + + void HandleDumpAsset(string module, string[] args) + { + if (args.Length < 3) + { + MainConsole.Instance.Output("Usage is dump asset "); + return; + } + + UUID assetId; + string rawAssetId = args[2]; + + if (!UUID.TryParse(rawAssetId, out assetId)) + { + MainConsole.Instance.OutputFormat("ERROR: {0} is not a valid ID format", rawAssetId); + return; + } + + AssetBase asset = m_scene.AssetService.Get(assetId.ToString()); + if (asset == null) + { + MainConsole.Instance.OutputFormat("ERROR: No asset found with ID {0}", assetId); + return; + } + + string fileName = rawAssetId; + + using (FileStream fs = new FileStream(fileName, FileMode.CreateNew)) + { + using (BinaryWriter bw = new BinaryWriter(fs)) + { + bw.Write(asset.Data); + } + } + + MainConsole.Instance.OutputFormat("Asset dumped to file {0}", fileName); + } + } +} \ No newline at end of file diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IInventoryItem.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IInventoryItem.cs index 16cd7e4..a8e545c 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IInventoryItem.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IInventoryItem.cs @@ -30,8 +30,7 @@ using OpenMetaverse; using OpenMetaverse.Assets; namespace OpenSim.Region.OptionalModules.Scripting.Minimodule -{ - +{ /// /// This implements the methods needed to operate on individual inventory items. /// @@ -39,6 +38,6 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule { int Type { get; } UUID AssetID { get; } - T RetrieveAsset() where T : Asset, new(); + T RetrieveAsset() where T : OpenMetaverse.Assets.Asset, new(); } } -- cgit v1.1 From da0fc3c8f572adba69e52e1d7f528946ab1f6f23 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Thu, 5 Jan 2012 21:11:32 +0000 Subject: Make "show asset" command available simulator side. Actually make the service command be "show asset" instead of "show digest" this time. Last time I accidnetally just changed the usage message. --- .../OptionalModules/Asset/AssetInfoModule.cs | 51 ++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/OptionalModules/Asset/AssetInfoModule.cs b/OpenSim/Region/OptionalModules/Asset/AssetInfoModule.cs index 9ea6343..a5207eb 100644 --- a/OpenSim/Region/OptionalModules/Asset/AssetInfoModule.cs +++ b/OpenSim/Region/OptionalModules/Asset/AssetInfoModule.cs @@ -88,6 +88,14 @@ namespace OpenSim.Region.OptionalModules.Asset m_scene = scene; MainConsole.Instance.Commands.AddCommand( + "asset", + false, + "show asset", + "show asset ", + "Show asset information", + HandleShowAsset); + + MainConsole.Instance.Commands.AddCommand( "asset", false, "dump asset", "dump asset ", "Dump an asset", @@ -130,5 +138,48 @@ namespace OpenSim.Region.OptionalModules.Asset MainConsole.Instance.OutputFormat("Asset dumped to file {0}", fileName); } + + void HandleShowAsset(string module, string[] args) + { + if (args.Length < 3) + { + MainConsole.Instance.Output("Syntax: show asset "); + return; + } + + AssetBase asset = m_scene.AssetService.Get(args[2]); + + if (asset == null || asset.Data.Length == 0) + { + MainConsole.Instance.Output("Asset not found"); + return; + } + + int i; + + MainConsole.Instance.OutputFormat("Name: {0}", asset.Name); + MainConsole.Instance.OutputFormat("Description: {0}", asset.Description); + MainConsole.Instance.OutputFormat("Type: {0} (type number = {1})", (AssetType)asset.Type, asset.Type); + MainConsole.Instance.OutputFormat("Content-type: {0}", asset.Metadata.ContentType); + MainConsole.Instance.OutputFormat("Size: {0} bytes", asset.Data.Length); + MainConsole.Instance.OutputFormat("Temporary: {0}", asset.Temporary ? "yes" : "no"); + MainConsole.Instance.OutputFormat("Flags: {0}", asset.Metadata.Flags); + + for (i = 0 ; i < 5 ; i++) + { + int off = i * 16; + if (asset.Data.Length <= off) + break; + int len = 16; + if (asset.Data.Length < off + len) + len = asset.Data.Length - off; + + byte[] line = new byte[len]; + Array.Copy(asset.Data, off, line, 0, len); + + string text = BitConverter.ToString(line); + MainConsole.Instance.Output(String.Format("{0:x4}: {1}", off, text)); + } + } } } \ No newline at end of file -- cgit v1.1 From 5ea9740f1b2cc98601cfb15c19e190471c4c42ed Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Thu, 5 Jan 2012 22:40:49 +0000 Subject: Add a "j2k decode" region console command that allows a manual request for a JPEG2000 decode of an asset For debugging purposes. --- .../Agent/TextureSender/J2KDecoderModule.cs | 18 +-- OpenSim/Region/Framework/Interfaces/IJ2KDecoder.cs | 9 +- .../Agent/TextureSender/J2KDecoderCommandModule.cs | 145 +++++++++++++++++++++ 3 files changed, 163 insertions(+), 9 deletions(-) create mode 100644 OpenSim/Region/OptionalModules/Agent/TextureSender/J2KDecoderCommandModule.cs (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs index 14dee84..349d3ac 100644 --- a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs +++ b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs @@ -137,14 +137,9 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender } } - /// - /// Provides a synchronous decode so that caller can be assured that this executes before the next line - /// - /// - /// - public void Decode(UUID assetID, byte[] j2kData) + public bool Decode(UUID assetID, byte[] j2kData) { - DoJ2KDecode(assetID, j2kData); + return DoJ2KDecode(assetID, j2kData); } #endregion IJ2KDecoder @@ -154,11 +149,13 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender /// /// UUID of Asset /// JPEG2000 data - private void DoJ2KDecode(UUID assetID, byte[] j2kData) + private bool DoJ2KDecode(UUID assetID, byte[] j2kData) { // m_log.DebugFormat( // "[J2KDecoderModule]: Doing J2K decoding of {0} bytes for asset {1}", j2kData.Length, assetID); + bool decodedSuccessfully = true; + //int DecodeTime = 0; //DecodeTime = Environment.TickCount; OpenJPEG.J2KLayerInfo[] layers; @@ -196,6 +193,7 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender catch (Exception ex) { m_log.Warn("[J2KDecoderModule]: CSJ2K threw an exception decoding texture " + assetID + ": " + ex.Message); + decodedSuccessfully = false; } } else @@ -204,6 +202,7 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender if (!OpenJPEG.DecodeLayerBoundaries(j2kData, out layers, out components)) { m_log.Warn("[J2KDecoderModule]: OpenJPEG failed to decode texture " + assetID); + decodedSuccessfully = false; } } @@ -212,6 +211,7 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender m_log.Warn("[J2KDecoderModule]: Failed to decode layer data for texture " + assetID + ", guessing sane defaults"); // Layer decoding completely failed. Guess at sane defaults for the layer boundaries layers = CreateDefaultLayers(j2kData.Length); + decodedSuccessfully = false; } // Cache Decoded layers @@ -231,6 +231,8 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender m_notifyList.Remove(assetID); } } + + return decodedSuccessfully; } private OpenJPEG.J2KLayerInfo[] CreateDefaultLayers(int j2kLength) diff --git a/OpenSim/Region/Framework/Interfaces/IJ2KDecoder.cs b/OpenSim/Region/Framework/Interfaces/IJ2KDecoder.cs index 856eb11..0964276 100644 --- a/OpenSim/Region/Framework/Interfaces/IJ2KDecoder.cs +++ b/OpenSim/Region/Framework/Interfaces/IJ2KDecoder.cs @@ -35,6 +35,13 @@ namespace OpenSim.Region.Framework.Interfaces public interface IJ2KDecoder { void BeginDecode(UUID assetID, byte[] j2kData, DecodedCallback callback); - void Decode(UUID assetID, byte[] j2kData); + + /// + /// Provides a synchronous decode so that caller can be assured that this executes before the next line + /// + /// + /// + /// true if decode was successful. false otherwise. + bool Decode(UUID assetID, byte[] j2kData); } } diff --git a/OpenSim/Region/OptionalModules/Agent/TextureSender/J2KDecoderCommandModule.cs b/OpenSim/Region/OptionalModules/Agent/TextureSender/J2KDecoderCommandModule.cs new file mode 100644 index 0000000..b224132 --- /dev/null +++ b/OpenSim/Region/OptionalModules/Agent/TextureSender/J2KDecoderCommandModule.cs @@ -0,0 +1,145 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text; +using log4net; +using Mono.Addins; +using Nini.Config; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Framework.Console; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.Region.OptionalModules.Agent.TextureSender +{ + /// + /// Commands for the J2KDecoder module. For debugging purposes. + /// + /// + /// Placed here so that they can be removed if not required and to keep the J2KDecoder module itself simple. + /// + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "J2KDecoderCommandModule")] + public class J2KDecoderCommandModule : ISharedRegionModule + { +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private Scene m_scene; + + public string Name { get { return "Asset Information Module"; } } + + public Type ReplaceableInterface { get { return null; } } + + public void Initialise(IConfigSource source) + { +// m_log.DebugFormat("[J2K DECODER COMMAND MODULE]: INITIALIZED MODULE"); + } + + public void PostInitialise() + { +// m_log.DebugFormat("[J2K DECODER COMMAND MODULE]: POST INITIALIZED MODULE"); + } + + public void Close() + { +// m_log.DebugFormat("[J2K DECODER COMMAND MODULE]: CLOSED MODULE"); + } + + public void AddRegion(Scene scene) + { +// m_log.DebugFormat("[J2K DECODER COMMAND MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName); + } + + public void RemoveRegion(Scene scene) + { +// m_log.DebugFormat("[J2K DECODER COMMAND MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName); + } + + public void RegionLoaded(Scene scene) + { +// m_log.DebugFormat("[J2K DECODER COMMAND MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); + + if (m_scene == null) + m_scene = scene; + + MainConsole.Instance.Commands.AddCommand( + "j2k", + false, + "j2k decode", + "j2k decode ", + "Do JPEG2000 decoding of an asset.", + "This is for debugging purposes. The asset id given must contain JPEG2000 data.", + HandleDecode); + } + + void HandleDecode(string module, string[] args) + { + if (args.Length < 3) + { + MainConsole.Instance.Output("Usage is j2k decode "); + return; + } + + UUID assetId; + string rawAssetId = args[2]; + + if (!UUID.TryParse(rawAssetId, out assetId)) + { + MainConsole.Instance.OutputFormat("ERROR: {0} is not a valid ID format", rawAssetId); + return; + } + + AssetBase asset = m_scene.AssetService.Get(assetId.ToString()); + if (asset == null) + { + MainConsole.Instance.OutputFormat("ERROR: No asset found with ID {0}", assetId); + return; + } + + if (asset.Type != (sbyte)AssetType.Texture) + { + MainConsole.Instance.OutputFormat("ERROR: Asset {0} is not a texture type", assetId); + return; + } + + IJ2KDecoder decoder = m_scene.RequestModuleInterface(); + if (decoder == null) + { + MainConsole.Instance.OutputFormat("ERROR: No IJ2KDecoder module available"); + return; + } + + if (decoder.Decode(assetId, asset.Data)) + MainConsole.Instance.OutputFormat("Successfully decoded asset {0}", assetId); + else + MainConsole.Instance.OutputFormat("Decode of asset {0} failed", assetId); } + } +} \ No newline at end of file -- cgit v1.1 From b86e7715a8d8f081fa9452d92a9d8f6d52867a12 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Thu, 5 Jan 2012 22:54:33 +0000 Subject: Improve "j2k decode" command to tell us how many layers and components were decoded, instead of just success/failure --- .../Agent/TextureSender/J2KDecoderModule.cs | 21 ++++++++++++++++----- OpenSim/Region/Framework/Interfaces/IJ2KDecoder.cs | 10 ++++++++++ .../Agent/TextureSender/J2KDecoderCommandModule.cs | 16 +++++++++++++--- 3 files changed, 39 insertions(+), 8 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs index 349d3ac..a1a2501 100644 --- a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs +++ b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs @@ -133,13 +133,20 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender // Do Decode! if (decode) - DoJ2KDecode(assetID, j2kData); + Decode(assetID, j2kData); } } public bool Decode(UUID assetID, byte[] j2kData) { - return DoJ2KDecode(assetID, j2kData); + OpenJPEG.J2KLayerInfo[] layers; + int components; + return Decode(assetID, j2kData, out layers, out components); + } + + public bool Decode(UUID assetID, byte[] j2kData, out OpenJPEG.J2KLayerInfo[] layers, out int components) + { + return DoJ2KDecode(assetID, j2kData, out layers, out components); } #endregion IJ2KDecoder @@ -149,7 +156,10 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender /// /// UUID of Asset /// JPEG2000 data - private bool DoJ2KDecode(UUID assetID, byte[] j2kData) + /// layer data + /// number of components + /// true if decode was successful. false otherwise. + private bool DoJ2KDecode(UUID assetID, byte[] j2kData, out OpenJPEG.J2KLayerInfo[] layers, out int components) { // m_log.DebugFormat( // "[J2KDecoderModule]: Doing J2K decoding of {0} bytes for asset {1}", j2kData.Length, assetID); @@ -158,7 +168,9 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender //int DecodeTime = 0; //DecodeTime = Environment.TickCount; - OpenJPEG.J2KLayerInfo[] layers; + + // We don't get this from CSJ2K. Is it relevant? + components = 0; if (!TryLoadCacheForAsset(assetID, out layers)) { @@ -198,7 +210,6 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender } else { - int components; if (!OpenJPEG.DecodeLayerBoundaries(j2kData, out layers, out components)) { m_log.Warn("[J2KDecoderModule]: OpenJPEG failed to decode texture " + assetID); diff --git a/OpenSim/Region/Framework/Interfaces/IJ2KDecoder.cs b/OpenSim/Region/Framework/Interfaces/IJ2KDecoder.cs index 0964276..46d03b3 100644 --- a/OpenSim/Region/Framework/Interfaces/IJ2KDecoder.cs +++ b/OpenSim/Region/Framework/Interfaces/IJ2KDecoder.cs @@ -43,5 +43,15 @@ namespace OpenSim.Region.Framework.Interfaces /// /// true if decode was successful. false otherwise. bool Decode(UUID assetID, byte[] j2kData); + + /// + /// Provides a synchronous decode so that caller can be assured that this executes before the next line + /// + /// + /// + /// layer data + /// number of components + /// true if decode was successful. false otherwise. + bool Decode(UUID assetID, byte[] j2kData, out OpenJPEG.J2KLayerInfo[] layers, out int components); } } diff --git a/OpenSim/Region/OptionalModules/Agent/TextureSender/J2KDecoderCommandModule.cs b/OpenSim/Region/OptionalModules/Agent/TextureSender/J2KDecoderCommandModule.cs index b224132..439096a 100644 --- a/OpenSim/Region/OptionalModules/Agent/TextureSender/J2KDecoderCommandModule.cs +++ b/OpenSim/Region/OptionalModules/Agent/TextureSender/J2KDecoderCommandModule.cs @@ -34,6 +34,7 @@ using log4net; using Mono.Addins; using Nini.Config; using OpenMetaverse; +using OpenMetaverse.Imaging; using OpenSim.Framework; using OpenSim.Framework.Console; using OpenSim.Region.Framework.Interfaces; @@ -137,9 +138,18 @@ namespace OpenSim.Region.OptionalModules.Agent.TextureSender return; } - if (decoder.Decode(assetId, asset.Data)) - MainConsole.Instance.OutputFormat("Successfully decoded asset {0}", assetId); + OpenJPEG.J2KLayerInfo[] layers; + int components; + if (decoder.Decode(assetId, asset.Data, out layers, out components)) + { + MainConsole.Instance.OutputFormat( + "Successfully decoded asset {0} with {1} layers and {2} components", + assetId, layers.Length, components); + } else - MainConsole.Instance.OutputFormat("Decode of asset {0} failed", assetId); } + { + MainConsole.Instance.OutputFormat("Decode of asset {0} failed", assetId); + } + } } } \ No newline at end of file -- cgit v1.1