From d19f09bdacdabf5ba2ee12e15f4474f6dbeddf5d Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey Date: Sat, 2 Jun 2012 05:06:24 +0100 Subject: [PATCH 01/57] Some rough hacks to get GridProxy to return information on specific cap requests via the command line GridProxyApp. Also comments out some noisy http request logging --- Programs/GridProxy/GridProxy.cs | 25 +- Programs/GridProxy/GridProxyMain.cs | 4 +- Programs/GridProxy/Plugins/CapAnalyst.cs | 875 +++++++++++++++++++++++ 3 files changed, 895 insertions(+), 9 deletions(-) create mode 100644 Programs/GridProxy/Plugins/CapAnalyst.cs diff --git a/Programs/GridProxy/GridProxy.cs b/Programs/GridProxy/GridProxy.cs index f7e8e85a..f28afbd3 100644 --- a/Programs/GridProxy/GridProxy.cs +++ b/Programs/GridProxy/GridProxy.cs @@ -370,9 +370,9 @@ namespace GridProxy Thread connThread = new Thread((ThreadStart)delegate { - OpenMetaverse.Logger.Log(">T> LoginProxy", Helpers.LogLevel.Debug); +// OpenMetaverse.Logger.Log(">T> LoginProxy", Helpers.LogLevel.Debug); ProxyHTTP(client); - OpenMetaverse.Logger.Log(" headers, byte[] content, int reqNo) { +// Console.WriteLine("ProxyCaps {0} {1}", meth, uri); Match match = new Regex(@"^(https?)://([^:/]+)(:\d+)?(/.*)$").Match(uri); if (!match.Success) { @@ -640,6 +641,9 @@ namespace GridProxy CapsRequest capReq = null; bool shortCircuit = false; bool requestFailed = false; if (cap != null) { +// if (cap.CapType != "GetTexture" && cap.CapType != "ViewerStats" && cap.CapType != "ViewerMetrics") +// Console.WriteLine("CAP request {0} {1}", meth, cap.CapType); + capReq = new CapsRequest(cap); if (cap.ReqFmt == CapsDataFormat.OSD) @@ -748,7 +752,7 @@ namespace GridProxy } else if (cap == null) { - OpenMetaverse.Logger.Log(string.Format("{0} {1}", req.Method, req.Address.ToString()), Helpers.LogLevel.Info); +// OpenMetaverse.Logger.Log(string.Format("{0} {1}", req.Method, req.Address.ToString()), Helpers.LogLevel.Info); } resp = (HttpWebResponse)req.GetResponse(); } @@ -879,8 +883,11 @@ namespace GridProxy } consoleMsg += "\n" + respString + "\n--------"; - OpenMetaverse.Logger.Log(consoleMsg, Helpers.LogLevel.Debug); - OpenMetaverse.Logger.Log("[" + reqNo + "] Fixed-up response:\n" + respString + "\n--------", Helpers.LogLevel.Debug); +// OpenMetaverse.Logger.Log(consoleMsg, Helpers.LogLevel.Debug); + +// if (cap.CapType == "FetchInventory2" || cap.CapType == "FetchInventoryDescendents2") + +// OpenMetaverse.Logger.Log("[" + reqNo + "] Fixed-up response:\n" + respString + "\n--------", Helpers.LogLevel.Debug); try { @@ -915,6 +922,8 @@ namespace GridProxy if (!String.IsNullOrEmpty(val)) { + OpenMetaverse.Logger.Log(string.Format("Got CAP {0}:{1}", key, val), Helpers.LogLevel.Debug); + if (!KnownCaps.ContainsKey(val)) { CapsDataFormat resFmt = BinaryResponseCaps.Contains(key) ? CapsDataFormat.Binary : CapsDataFormat.OSD; diff --git a/Programs/GridProxy/GridProxyMain.cs b/Programs/GridProxy/GridProxyMain.cs index 04430ca7..ad4c0e48 100644 --- a/Programs/GridProxy/GridProxyMain.cs +++ b/Programs/GridProxy/GridProxyMain.cs @@ -8,7 +8,9 @@ class ProxyMain { ProxyFrame p = new ProxyFrame(args); ProxyPlugin analyst = new Analyst(p); - analyst.Init(); + analyst.Init(); + ProxyPlugin capAnalyst = new CapAnalyst(p); + capAnalyst.Init(); p.proxy.Start(); } } \ No newline at end of file diff --git a/Programs/GridProxy/Plugins/CapAnalyst.cs b/Programs/GridProxy/Plugins/CapAnalyst.cs new file mode 100644 index 00000000..d02fff0e --- /dev/null +++ b/Programs/GridProxy/Plugins/CapAnalyst.cs @@ -0,0 +1,875 @@ +/* + * Analyst.cs: proxy that makes packet inspection and modifcation interactive + * See the README for usage instructions. + * + * Copyright (c) 2006 Austin Jennings + * Modified by "qode" and "mcortez" on December 21st, 2006 to work with the new + * pregen + * All rights reserved. + * + * - 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. + * - Neither the name of the openmetaverse.org 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR 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; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Net; +using System.Text.RegularExpressions; +using System.Reflection; +using System.Xml; +using Nwc.XmlRpc; +using OpenMetaverse; +using OpenMetaverse.StructuredData; +using OpenMetaverse.Packets; +using GridProxy; + + +public class CapAnalyst : ProxyPlugin +{ + private ProxyFrame frame; + private Proxy proxy; + private HashSet loggedCaps = new HashSet(); + private string logGrep = null; + private Dictionary> modifiedPackets = new Dictionary>(); + private Assembly openmvAssembly; + private StreamWriter output; + + //private PacketDecoder DecodePacket = new PacketDecoder(); + + public CapAnalyst(ProxyFrame frame) + { + this.frame = frame; + this.proxy = frame.proxy; + } + + ~CapAnalyst() + { + if (output != null) + output.Close(); + } + + public override void Init() + { + openmvAssembly = Assembly.Load("OpenMetaverse"); + if (openmvAssembly == null) throw new Exception("Assembly load exception"); + + // build the table of /command delegates + InitializeCommandDelegates(); + + // handle command line arguments + foreach (string arg in frame.Args) + if (arg == "--log-all") + LogAll(); + else if (arg.Contains("--log-whitelist=")) + LogWhitelist(arg.Substring(arg.IndexOf('=') + 1)); + else if (arg.Contains("--no-log-blacklist=")) + NoLogBlacklist(arg.Substring(arg.IndexOf('=') + 1)); + else if (arg.Contains("--output=")) + SetOutput(arg.Substring(arg.IndexOf('=') + 1)); + + StartLogCap("FetchInventory2"); + StartLogCap("FetchInventoryDescendents2"); + + Console.WriteLine("CapAnalyst loaded"); + } + + // InitializeCommandDelegates: configure Analyst's commands + private void InitializeCommandDelegates() + { + frame.AddCommand("/logcap", new ProxyFrame.CommandDelegate(CmdLog)); + frame.AddCommand("/-logcap", new ProxyFrame.CommandDelegate(CmdNoLog)); +// frame.AddCommand("/grep", new ProxyFrame.CommandDelegate(CmdGrep)); +// frame.AddCommand("/drop", new ProxyFrame.CommandDelegate(CmdDrop)); +// frame.AddCommand("/-drop", new ProxyFrame.CommandDelegate(CmdNoDrop)); +// frame.AddCommand("/set", new ProxyFrame.CommandDelegate(CmdSet)); +// frame.AddCommand("/-set", new ProxyFrame.CommandDelegate(CmdNoSet)); +// frame.AddCommand("/inject", new ProxyFrame.CommandDelegate(CmdInject)); +// frame.AddCommand("/in", new ProxyFrame.CommandDelegate(CmdInject)); + } + +// private static PacketType packetTypeFromName(string name) +// { +// Type packetTypeType = typeof(PacketType); +// System.Reflection.FieldInfo f = packetTypeType.GetField(name); +// if (f == null) throw new ArgumentException("Bad packet type"); +// return (PacketType)Enum.ToObject(packetTypeType, (int)f.GetValue(packetTypeType)); +// } + + // CmdLog: handle a /log command + private void CmdLog(string[] words) + { + if (words.Length != 2) + SayToUser("Usage: /logcap "); + else if (words[1] == "*") + { + LogAll(); + SayToUser("logging all caps"); + } + else + { +// PacketType pType; +// try +// { +// pType = packetTypeFromName(words[1]); +// } +// catch (ArgumentException) +// { +// SayToUser("Bad cap name: " + words[1]); +// return; +// } + string capName = words[1]; + + StartLogCap(capName); + SayToUser("logging " + capName); + } + } + + private void StartLogCap(string capName) + { + loggedCaps.Add(capName); + proxy.AddCapsDelegate(capName, LogCap); + } + + // CmdNoLog: handle a /-log command + private void CmdNoLog(string[] words) + { + if (words.Length != 2) + SayToUser("Usage: /-logcap "); + else if (words[1] == "*") + { + NoLogAll(); + SayToUser("stopped logging all caps"); + } + else + { +// PacketType pType = packetTypeFromName(words[1]); + string capName = words[1]; + loggedCaps.Remove(capName); + proxy.RemoveCapRequestDelegate(capName, LogCap); + + SayToUser("stopped logging " + capName); + } + } + + // CmdGrep: handle a /grep command + private void CmdGrep(string[] words) + { + if (words.Length == 1) + { + logGrep = null; + SayToUser("stopped filtering logs"); + } + else + { + string[] regexArray = new string[words.Length - 1]; + Array.Copy(words, 1, regexArray, 0, words.Length - 1); + logGrep = String.Join(" ", regexArray); + SayToUser("filtering log with " + logGrep); + } + } + + private void CmdDrop(string[] words) + { + throw new NotImplementedException(); + } + + private void CmdNoDrop(string[] words) + { + throw new NotImplementedException(); + } + + // CmdSet: handle a /set command + private void CmdSet(string[] words) + { +// if (words.Length < 5) +// SayToUser("Usage: /set "); +// else +// { +// PacketType pType; +// try +// { +// pType = packetTypeFromName(words[1]); +// } +// catch (ArgumentException) +// { +// SayToUser("Bad packet name: " + words[1]); +// return; +// } +// +// string[] valueArray = new string[words.Length - 4]; +// Array.Copy(words, 4, valueArray, 0, words.Length - 4); +// string valueString = String.Join(" ", valueArray); +// object value; +// try +// { +// value = MagicCast(words[1], words[2], words[3], valueString); +// } +// catch (Exception e) +// { +// SayToUser(e.Message); +// return; +// } +// +// Dictionary fields; +// if (modifiedPackets.ContainsKey(pType)) +// fields = (Dictionary)modifiedPackets[pType]; +// else +// fields = new Dictionary(); +// +// fields[new BlockField(words[2], words[3])] = value; +// modifiedPackets[pType] = fields; +// +// proxy.AddDelegate(pType, Direction.Incoming, new PacketDelegate(ModifyIn)); +// proxy.AddDelegate(pType, Direction.Outgoing, new PacketDelegate(ModifyOut)); +// +// SayToUser("setting " + words[1] + "." + words[2] + "." + words[3] + " = " + valueString); +// } + } + + // CmdNoSet: handle a /-set command + private void CmdNoSet(string[] words) + { +// if (words.Length == 2 && words[1] == "*") +// { +// foreach (PacketType pType in modifiedPackets.Keys) +// { +// proxy.RemoveDelegate(pType, Direction.Incoming, new PacketDelegate(ModifyIn)); +// proxy.RemoveDelegate(pType, Direction.Outgoing, new PacketDelegate(ModifyOut)); +// } +// modifiedPackets = new Dictionary>(); +// +// SayToUser("stopped setting all fields"); +// } +// else if (words.Length == 4) +// { +// PacketType pType; +// try +// { +// pType = packetTypeFromName(words[1]); +// } +// catch (ArgumentException) +// { +// SayToUser("Bad packet name: " + words[1]); +// return; +// } +// +// +// if (modifiedPackets.ContainsKey(pType)) +// { +// Dictionary fields = modifiedPackets[pType]; +// fields.Remove(new BlockField(words[2], words[3])); +// +// if (fields.Count == 0) +// { +// modifiedPackets.Remove(pType); +// +// proxy.RemoveDelegate(pType, Direction.Incoming, new PacketDelegate(ModifyIn)); +// proxy.RemoveDelegate(pType, Direction.Outgoing, new PacketDelegate(ModifyOut)); +// } +// } +// +// SayToUser("stopped setting " + words[1] + "." + words[2] + "." + words[3]); +// } +// else +// SayToUser("Usage: /-set "); + } + + + // CmdInject: handle an /inject command + private void CmdInject(string[] words) + { +// if (words.Length < 2) +// SayToUser("Usage: /inject [value]"); +// else +// { +// string[] valueArray = new string[words.Length - 2]; +// Array.Copy(words, 2, valueArray, 0, words.Length - 2); +// string value = String.Join(" ", valueArray); +// +// FileStream fs = null; +// StreamReader sr = null; +// Direction direction = Direction.Incoming; +// string name = null; +// string block = null; +// object blockObj = null; +// Type packetClass = null; +// Packet packet = null; +// +// try +// { +// fs = File.OpenRead(words[1] + ".packet"); +// sr = new StreamReader(fs); +// +// string line; +// while ((line = sr.ReadLine()) != null) +// { +// Match match; +// +// if (name == null) +// { +// match = (new Regex(@"^\s*(in|out)\s+(\w+)\s*$")).Match(line); +// if (!match.Success) +// { +// SayToUser("expecting direction and packet name, got: " + line); +// return; +// } +// +// string lineDir = match.Groups[1].Captures[0].ToString(); +// string lineName = match.Groups[2].Captures[0].ToString(); +// +// if (lineDir == "in") +// direction = Direction.Incoming; +// else if (lineDir == "out") +// direction = Direction.Outgoing; +// else +// { +// SayToUser("expecting 'in' or 'out', got: " + line); +// return; +// } +// +// name = lineName; +// packetClass = openmvAssembly.GetType("OpenMetaverse.Packets." + name + "Packet"); +// if (packetClass == null) throw new Exception("Couldn't get class " + name + "Packet"); +// ConstructorInfo ctr = packetClass.GetConstructor(new Type[] { }); +// if (ctr == null) throw new Exception("Couldn't get suitable constructor for " + name + "Packet"); +// packet = (Packet)ctr.Invoke(new object[] { }); +// //Console.WriteLine("Created new " + name + "Packet"); +// } +// else +// { +// match = (new Regex(@"^\s*\[(\w+)\]\s*$")).Match(line); +// if (match.Success) +// { +// block = match.Groups[1].Captures[0].ToString(); +// FieldInfo blockField = packetClass.GetField(block); +// if (blockField == null) throw new Exception("Couldn't get " + name + "Packet." + block); +// Type blockClass = blockField.FieldType; +// if (blockClass.IsArray) +// { +// blockClass = blockClass.GetElementType(); +// ConstructorInfo ctr = blockClass.GetConstructor(new Type[] { }); +// if (ctr == null) throw new Exception("Couldn't get suitable constructor for " + blockClass.Name); +// blockObj = ctr.Invoke(new object[] { }); +// object[] arr = (object[])blockField.GetValue(packet); +// object[] narr = (object[])Array.CreateInstance(blockClass, arr.Length + 1); +// Array.Copy(arr, narr, arr.Length); +// narr[arr.Length] = blockObj; +// blockField.SetValue(packet, narr); +// //Console.WriteLine("Added block "+block); +// } +// else +// { +// blockObj = blockField.GetValue(packet); +// } +// if (blockObj == null) throw new Exception("Got " + name + "Packet." + block + " == null"); +// //Console.WriteLine("Got block " + name + "Packet." + block); +// +// continue; +// } +// +// if (block == null) +// { +// SayToUser("expecting block name, got: " + line); +// return; +// } +// +// match = (new Regex(@"^\s*(\w+)\s*=\s*(.*)$")).Match(line); +// if (match.Success) +// { +// string lineField = match.Groups[1].Captures[0].ToString(); +// string lineValue = match.Groups[2].Captures[0].ToString(); +// object fval; +// +// //FIXME: use of MagicCast inefficient +// if (lineValue == "$Value") +// fval = MagicCast(name, block, lineField, value); +// else if (lineValue == "$UUID") +// fval = UUID.Random(); +// else if (lineValue == "$AgentID") +// fval = frame.AgentID; +// else if (lineValue == "$SessionID") +// fval = frame.SessionID; +// else +// fval = MagicCast(name, block, lineField, lineValue); +// +// MagicSetField(blockObj, lineField, fval); +// continue; +// } +// +// SayToUser("expecting block name or field, got: " + line); +// return; +// } +// } +// +// if (name == null) +// { +// SayToUser("expecting direction and packet name, got EOF"); +// return; +// } +// +// packet.Header.Reliable = true; +// //if (protocolManager.Command(name).Encoded) +// // packet.Header.Zerocoded = true; +// proxy.InjectPacket(packet, direction); +// +// SayToUser("injected " + words[1]); +// } +// catch (Exception e) +// { +// SayToUser("failed to inject " + words[1] + ": " + e.Message); +// Console.WriteLine("failed to inject " + words[1] + ": " + e.Message + "\n" + e.StackTrace); +// } +// finally +// { +// if (fs != null) +// fs.Close(); +// if (sr != null) +// sr.Close(); +// } +// } + } + + // SayToUser: send a message to the user as in-world chat + private void SayToUser(string message) + { + ChatFromSimulatorPacket packet = new ChatFromSimulatorPacket(); + packet.ChatData.FromName = Utils.StringToBytes("Analyst"); + packet.ChatData.SourceID = UUID.Random(); + packet.ChatData.OwnerID = frame.AgentID; + packet.ChatData.SourceType = (byte)2; + packet.ChatData.ChatType = (byte)1; + packet.ChatData.Audible = (byte)1; + packet.ChatData.Position = new Vector3(0, 0, 0); + packet.ChatData.Message = Utils.StringToBytes(message); + proxy.InjectPacket(packet, Direction.Incoming); + } + + // BlockField: product type for a block name and field name + private struct BlockField + { + public string block; + public string field; + + + public BlockField(string block, string field) + { + this.block = block; + this.field = field; + } + } + + private static void MagicSetField(object obj, string field, object val) + { + Type cls = obj.GetType(); + + FieldInfo fieldInf = cls.GetField(field); + if (fieldInf == null) + { + PropertyInfo prop = cls.GetProperty(field); + if (prop == null) throw new Exception("Couldn't find field " + cls.Name + "." + field); + prop.SetValue(obj, val, null); + //throw new Exception("FIXME: can't set properties"); + } + else + { + fieldInf.SetValue(obj, val); + } + } + + // MagicCast: given a packet/block/field name and a string, convert the string to a value of the appropriate type + private object MagicCast(string name, string block, string field, string value) + { + Type packetClass = openmvAssembly.GetType("OpenMetaverse.Packets." + name + "Packet"); + if (packetClass == null) throw new Exception("Couldn't get class " + name + "Packet"); + + FieldInfo blockField = packetClass.GetField(block); + if (blockField == null) throw new Exception("Couldn't get " + name + "Packet." + block); + Type blockClass = blockField.FieldType; + if (blockClass.IsArray) blockClass = blockClass.GetElementType(); + // Console.WriteLine("DEBUG: " + blockClass.Name); + + FieldInfo fieldField = blockClass.GetField(field); PropertyInfo fieldProp = null; + Type fieldClass = null; + if (fieldField == null) + { + fieldProp = blockClass.GetProperty(field); + if (fieldProp == null) throw new Exception("Couldn't get " + name + "Packet." + block + "." + field); + fieldClass = fieldProp.PropertyType; + } + else + { + fieldClass = fieldField.FieldType; + } + + try + { + if (fieldClass == typeof(byte)) + { + return Convert.ToByte(value); + } + else if (fieldClass == typeof(ushort)) + { + return Convert.ToUInt16(value); + } + else if (fieldClass == typeof(uint)) + { + return Convert.ToUInt32(value); + } + else if (fieldClass == typeof(ulong)) + { + return Convert.ToUInt64(value); + } + else if (fieldClass == typeof(sbyte)) + { + return Convert.ToSByte(value); + } + else if (fieldClass == typeof(short)) + { + return Convert.ToInt16(value); + } + else if (fieldClass == typeof(int)) + { + return Convert.ToInt32(value); + } + else if (fieldClass == typeof(long)) + { + return Convert.ToInt64(value); + } + else if (fieldClass == typeof(float)) + { + return Convert.ToSingle(value); + } + else if (fieldClass == typeof(double)) + { + return Convert.ToDouble(value); + } + else if (fieldClass == typeof(UUID)) + { + return new UUID(value); + } + else if (fieldClass == typeof(bool)) + { + if (value.ToLower() == "true") + return true; + else if (value.ToLower() == "false") + return false; + else + throw new Exception(); + } + else if (fieldClass == typeof(byte[])) + { + return Utils.StringToBytes(value); + } + else if (fieldClass == typeof(Vector3)) + { + Vector3 result; + if (Vector3.TryParse(value, out result)) + return result; + else + throw new Exception(); + } + else if (fieldClass == typeof(Vector3d)) + { + Vector3d result; + if (Vector3d.TryParse(value, out result)) + return result; + else + throw new Exception(); + } + else if (fieldClass == typeof(Vector4)) + { + Vector4 result; + if (Vector4.TryParse(value, out result)) + return result; + else + throw new Exception(); + } + else if (fieldClass == typeof(Quaternion)) + { + Quaternion result; + if (Quaternion.TryParse(value, out result)) + return result; + else + throw new Exception(); + } + else + { + throw new Exception("unsupported field type " + fieldClass); + } + } + catch + { + throw new Exception("unable to interpret " + value + " as " + fieldClass); + } + } + + // ModifyIn: modify an incoming packet + private Packet ModifyIn(Packet packet, IPEndPoint endPoint) + { + return Modify(packet, endPoint, Direction.Incoming); + } + + // ModifyOut: modify an outgoing packet + private Packet ModifyOut(Packet packet, IPEndPoint endPoint) + { + return Modify(packet, endPoint, Direction.Outgoing); + } + + // Modify: modify a packet + private Packet Modify(Packet packet, IPEndPoint endPoint, Direction direction) + { + if (modifiedPackets.ContainsKey(packet.Type)) + { + try + { + Dictionary changes = modifiedPackets[packet.Type]; + Type packetClass = packet.GetType(); + + foreach (KeyValuePair change in changes) + { + BlockField bf = change.Key; + FieldInfo blockField = packetClass.GetField(bf.block); + if (blockField.FieldType.IsArray) // We're modifying a variable block. + { + // Modify each block in the variable block identically. + // This is really simple, can probably be improved. + object[] blockArray = (object[])blockField.GetValue(packet); + foreach (object blockElement in blockArray) + { + MagicSetField(blockElement, bf.field, change.Value); + } + } + else + { + //Type blockClass = blockField.FieldType; + object blockObject = blockField.GetValue(packet); + MagicSetField(blockObject, bf.field, change.Value); + } + } + } + catch (Exception e) + { + Console.WriteLine("failed to modify " + packet.Type + ": " + e.Message); + Console.WriteLine(e.StackTrace); + } + } + + return packet; + } + + // LogAll: register logging delegates for all packets + private void LogAll() + { +// Type packetTypeType = typeof(PacketType); +// System.Reflection.MemberInfo[] packetTypes = packetTypeType.GetMembers(); +// +// for (int i = 0; i < packetTypes.Length; i++) +// { +// if (packetTypes[i].MemberType == System.Reflection.MemberTypes.Field && packetTypes[i].DeclaringType == packetTypeType) +// { +// string name = packetTypes[i].Name; +// PacketType pType; +// +// try +// { +// pType = packetTypeFromName(name); +// } +// catch (Exception) +// { +// continue; +// } +// +// loggedCaps[pType] = null; +// +// proxy.AddDelegate(pType, Direction.Incoming, new PacketDelegate(LogPacketIn)); +// proxy.AddDelegate(pType, Direction.Outgoing, new PacketDelegate(LogPacketOut)); +// } +// } + } + + private void LogWhitelist(string whitelistFile) + { +// try +// { +// string[] lines = File.ReadAllLines(whitelistFile); +// int count = 0; +// +// for (int i = 0; i < lines.Length; i++) +// { +// string line = lines[i].Trim(); +// if (line.Length == 0) +// continue; +// +// PacketType pType; +// +// try +// { +// pType = packetTypeFromName(line); +// proxy.AddDelegate(pType, Direction.Incoming, new PacketDelegate(LogPacketIn)); +// proxy.AddDelegate(pType, Direction.Outgoing, new PacketDelegate(LogPacketOut)); +// ++count; +// } +// catch (ArgumentException) +// { +// Console.WriteLine("Bad packet name: " + line); +// } +// } +// +// Console.WriteLine(String.Format("Logging {0} packet types loaded from whitelist", count)); +// } +// catch (Exception) +// { +// Console.WriteLine("Failed to load packet whitelist from " + whitelistFile); +// } + } + + private void NoLogBlacklist(string blacklistFile) + { +// try +// { +// string[] lines = File.ReadAllLines(blacklistFile); +// int count = 0; +// +// for (int i = 0; i < lines.Length; i++) +// { +// string line = lines[i].Trim(); +// if (line.Length == 0) +// continue; +// +// PacketType pType; +// +// try +// { +// pType = packetTypeFromName(line); +// string[] noLogStr = new string[] {"/-log", line}; +// CmdNoLog(noLogStr); +// ++count; +// } +// catch (ArgumentException) +// { +// Console.WriteLine("Bad packet name: " + line); +// } +// } +// +// Console.WriteLine(String.Format("Not logging {0} packet types loaded from blacklist", count)); +// } +// catch (Exception) +// { +// Console.WriteLine("Failed to load packet blacklist from " + blacklistFile); +// } + } + + private void SetOutput(string outputFile) + { + try + { + output = new StreamWriter(outputFile, false); + Console.WriteLine("Logging packets to " + outputFile); + } + catch (Exception) + { + Console.WriteLine(String.Format("Failed to open {0} for logging", outputFile)); + } + } + + // NoLogAll: unregister logging delegates for all packets + private void NoLogAll() + { +// Type packetTypeType = typeof(PacketType); +// System.Reflection.MemberInfo[] packetTypes = packetTypeType.GetMembers(); +// +// for (int i = 0; i < packetTypes.Length; i++) +// { +// if (packetTypes[i].MemberType == System.Reflection.MemberTypes.Field && packetTypes[i].DeclaringType == packetTypeType) +// { +// string name = packetTypes[i].Name; +// PacketType pType; +// +// try +// { +// pType = packetTypeFromName(name); +// } +// catch (Exception) +// { +// continue; +// } +// +// loggedCaps.Remove(pType); +// +// proxy.RemoveDelegate(pType, Direction.Incoming, new PacketDelegate(LogPacketIn)); +// proxy.RemoveDelegate(pType, Direction.Outgoing, new PacketDelegate(LogPacketOut)); +// } +// } + } + + private bool LogCap(CapsRequest req, CapsStage stage) + { + if (stage == CapsStage.Request) + return false; + + using (StringWriter sw = new StringWriter()) + { + using (XmlTextWriter xtw = new XmlTextWriter(sw)) + { + xtw.Formatting = Formatting.Indented; + OSDParser.SerializeLLSDXmlElement(xtw, req.Request); + } + + Console.WriteLine("REQUEST {0}", req.Info.CapType); + Console.WriteLine(sw.ToString()); + } + + using (StringWriter sw = new StringWriter()) + { + using (XmlTextWriter xtw = new XmlTextWriter(sw)) + { + xtw.Formatting = Formatting.Indented; + OSDParser.SerializeLLSDXmlElement(xtw, req.Response); + } + + Console.WriteLine("RESPONSE {0}", req.Info.CapType); + Console.WriteLine(sw.ToString()); + } + + Console.WriteLine("------------------------------"); + + // We don't want to stop any other delegates from executing. + return false; + } + + // InterpretOptions: produce a string representing a packet's header options + private static string InterpretOptions(Header header) + { + return "[" + + (header.AppendedAcks ? "Ack" : " ") + + " " + + (header.Resent ? "Res" : " ") + + " " + + (header.Reliable ? "Rel" : " ") + + " " + + (header.Zerocoded ? "Zer" : " ") + + "]" + ; + } +} \ No newline at end of file From 89a1c0155173115743d4a7e4312942dd8899748f Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Tue, 31 Jul 2012 21:46:18 +0200 Subject: [PATCH 02/57] LIBOMV-951: Added support for the script teleport permission --- OpenMetaverse/AgentManager.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OpenMetaverse/AgentManager.cs b/OpenMetaverse/AgentManager.cs index b387535f..2f915b17 100644 --- a/OpenMetaverse/AgentManager.cs +++ b/OpenMetaverse/AgentManager.cs @@ -76,7 +76,9 @@ namespace OpenMetaverse /// Script wants to track avatars camera position and rotation TrackCamera = 1 << 10, /// Script wants to control your camera - ControlCamera = 1 << 11 + ControlCamera = 1 << 11, + /// Script wants the ability to teleport you + Teleport = 1 << 12 } /// From 422b161df04dfdcf02abbf255fb3d06f1481aa1c Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey Date: Thu, 30 Aug 2012 01:20:18 +0100 Subject: [PATCH 03/57] Use the 1.2.10 log4net.dll taken from the Apache website which ships the publickeytoken to replace the existing libomv 1.2.10 log4net.dll This comes from http://archive.apache.org/dist/incubator/log4net/1.2.10/incubating-log4net-1.2.10.zip:bin/net/2.0/release/log4net.dll OpenSimulator currently ships this version, but this means that in some circumstances libomv fails to load the logger DLL. Since the DLL containing the publickeytoken is arguably superior (since it identifies the library as coming from apache) I'm proposing replacement of the existing DLL in libomv which has an unrecorded origin (possibly self compiled). --- bin/log4net.dll | Bin 241664 -> 270336 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/log4net.dll b/bin/log4net.dll index 974b4939f04a66e160ff48ef5c00d2b82cc26eb5..ffc57e11254ad9530867b35d15aaf38eb4747d8d 100644 GIT binary patch literal 270336 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 From 1729ce34bb1d9a100467ea4d3ae9172066f7f60f Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey Date: Thu, 30 Aug 2012 01:20:18 +0100 Subject: [PATCH 04/57] Use the 1.2.10 log4net.dll taken from the Apache website which ships the publickeytoken to replace the existing libomv 1.2.10 log4net.dll This comes from http://archive.apache.org/dist/incubator/log4net/1.2.10/incubating-log4net-1.2.10.zip:bin/net/2.0/release/log4net.dll OpenSimulator currently ships this version, but this means that in some circumstances libomv fails to load the logger DLL. Since the DLL containing the publickeytoken is arguably superior (since it identifies the library as coming from apache) I'm proposing replacement of the existing DLL in libomv which has an unrecorded origin (possibly self compiled). --- bin/log4net.dll | Bin 241664 -> 270336 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/log4net.dll b/bin/log4net.dll index 974b4939f04a66e160ff48ef5c00d2b82cc26eb5..ffc57e11254ad9530867b35d15aaf38eb4747d8d 100644 GIT binary patch literal 270336 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 From 112fd49427ffb1a5deca94d09edef69e149f3743 Mon Sep 17 00:00:00 2001 From: SignpostMarv Date: Thu, 6 Sep 2012 12:00:58 +0100 Subject: [PATCH 05/57] since constructors support each other, adding explicit operators for minor reduction in typing required --- OpenMetaverseTypes/Vector3.cs | 11 +++++++++++ OpenMetaverseTypes/Vector3d.cs | 10 ++++++++++ 2 files changed, 21 insertions(+) diff --git a/OpenMetaverseTypes/Vector3.cs b/OpenMetaverseTypes/Vector3.cs index e702e693..da02c24e 100644 --- a/OpenMetaverseTypes/Vector3.cs +++ b/OpenMetaverseTypes/Vector3.cs @@ -566,6 +566,17 @@ namespace OpenMetaverse return Cross(value1, value2); } + /// + /// Explicit casting for Vector3d > Vector3 + /// + /// + /// + public static explicit operator Vector3(Vector3d value) + { + Vector3d foo = (Vector3d)Vector3.Zero; + return new Vector3(value); + } + #endregion Operators /// A vector with a value of 0,0,0 diff --git a/OpenMetaverseTypes/Vector3d.cs b/OpenMetaverseTypes/Vector3d.cs index 084ac3d7..9606bab5 100644 --- a/OpenMetaverseTypes/Vector3d.cs +++ b/OpenMetaverseTypes/Vector3d.cs @@ -497,6 +497,16 @@ namespace OpenMetaverse return Cross(value1, value2); } + /// + /// Explicit casting for Vector3 > Vector3d + /// + /// + /// + public static explicit operator Vector3d(Vector3 value) + { + return new Vector3d(value); + } + #endregion Operators /// A vector with a value of 0,0,0 From d7ad73f5c2b86dfca19b1716d47f27f5b4475699 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey Date: Thu, 6 Sep 2012 22:40:39 +0100 Subject: [PATCH 06/57] Update libopenjpeg to 1.5 on Linux 32 and 64-bit. I also took the liberty of changing the library name from libopenjpeg-dotnet-2.1.3.0-dotnet-1*.so to libopenjpeg-dotnet-2-1.5.0-dotnet-1*.so To me, "2.1.3.0" looked like a full version number whereas it is really "2" and libopenjpeg "1.3.0" Not sure what the "2" is, maybe dotnet 2 However, it might be better to get rid of this version information altogether - after all the openjpeg-dotnet.dll libraries do not have it --- ...ibopenjpeg-dotnet-2.1.3.0-dotnet-1-i686.so | Bin 124540 -> 139088 bytes ...openjpeg-dotnet-2.1.3.0-dotnet-1-x86_64.so | Bin 142616 -> 149392 bytes openjpeg-dotnet/Makefile | 4 +- openjpeg-dotnet/libopenjpeg/bio.c | 374 +- openjpeg-dotnet/libopenjpeg/bio.h | 250 +- openjpeg-dotnet/libopenjpeg/cio.c | 382 +- openjpeg-dotnet/libopenjpeg/cio.h | 172 +- openjpeg-dotnet/libopenjpeg/dwt.c | 1683 +++--- openjpeg-dotnet/libopenjpeg/dwt.h | 226 +- openjpeg-dotnet/libopenjpeg/event.c | 243 +- openjpeg-dotnet/libopenjpeg/event.h | 116 +- openjpeg-dotnet/libopenjpeg/fix.h | 128 +- openjpeg-dotnet/libopenjpeg/image.c | 181 +- openjpeg-dotnet/libopenjpeg/image.h | 96 +- openjpeg-dotnet/libopenjpeg/int.h | 238 +- openjpeg-dotnet/libopenjpeg/j2k.c | 5032 +++++++++-------- openjpeg-dotnet/libopenjpeg/j2k.h | 892 +-- openjpeg-dotnet/libopenjpeg/j2k_lib.c | 118 +- openjpeg-dotnet/libopenjpeg/j2k_lib.h | 108 +- openjpeg-dotnet/libopenjpeg/jp2.c | 1921 ++++--- openjpeg-dotnet/libopenjpeg/jp2.h | 411 +- openjpeg-dotnet/libopenjpeg/jpt.c | 310 +- openjpeg-dotnet/libopenjpeg/jpt.h | 150 +- openjpeg-dotnet/libopenjpeg/mct.c | 338 +- openjpeg-dotnet/libopenjpeg/mct.h | 196 +- openjpeg-dotnet/libopenjpeg/mqc.c | 1130 ++-- openjpeg-dotnet/libopenjpeg/mqc.h | 397 +- openjpeg-dotnet/libopenjpeg/openjpeg.c | 672 +-- openjpeg-dotnet/libopenjpeg/openjpeg.h | 1821 +++--- openjpeg-dotnet/libopenjpeg/opj_includes.h | 265 +- openjpeg-dotnet/libopenjpeg/opj_malloc.h | 35 +- openjpeg-dotnet/libopenjpeg/pi.c | 1926 +++---- openjpeg-dotnet/libopenjpeg/pi.h | 310 +- openjpeg-dotnet/libopenjpeg/raw.c | 174 +- openjpeg-dotnet/libopenjpeg/raw.h | 200 +- openjpeg-dotnet/libopenjpeg/t1.c | 2809 +++++---- openjpeg-dotnet/libopenjpeg/t1.h | 294 +- .../libopenjpeg/t1_generate_luts.c | 8 +- openjpeg-dotnet/libopenjpeg/t2.c | 1580 +++--- openjpeg-dotnet/libopenjpeg/t2.h | 208 +- openjpeg-dotnet/libopenjpeg/tcd.c | 3040 +++++----- openjpeg-dotnet/libopenjpeg/tcd.h | 571 +- openjpeg-dotnet/libopenjpeg/tgt.c | 426 +- openjpeg-dotnet/libopenjpeg/tgt.h | 228 +- 44 files changed, 15407 insertions(+), 14256 deletions(-) diff --git a/bin/libopenjpeg-dotnet-2.1.3.0-dotnet-1-i686.so b/bin/libopenjpeg-dotnet-2.1.3.0-dotnet-1-i686.so index 0106b56ff98ca81ac9497e521277623cbdb3c98e..591436847b00541642952d8b9777030d708442ce 100644 GIT binary patch literal 139088 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 Sm>H2YRL2fGE+u0?rsX8Y$9%8-IZ7-uD( zUr~`)0y|#JiJE^|-crwT${SkA1Tm`3jZPTU>MtW*u|Jj=iL8 z@g& zpo7>9G(v=oRIscOF(dF6E07ugj#5nj|Ns6kN`Pk*G0M|e-`XKr4<7%RyRbSNp^U;Z zhhh7kU4Ye=Svd`ue0^{D zWqFO*r$vQIJl2z>Ns@Xc&6YG*(z%kBNLnfBYDw2i+9>HJNw-S6L(&dOKalhXNfo!j zhgH&eNfRVZmNZpTpQPE6=1MwC(n3j#C9ROOQqt9uu90+ur1wj@QPNG4Zk2SKr0tTv zDQTyqA4sZ8dO*^CNsmct!KN$aZk5z2X`H0-k|s!+ENQBwK1s7B&6RYPq=k|eOIjgm zrKGDRT_foRN$;0*qokW8-74ueN!ulTQ_@aJKaf}d(oM)t zx)poPq@@@KNw3EJCDKBS$)woFOd`d`Z89mQOsS;U81<5F!`&s)aX14aMSHSI7hoTj z6eIXFQk)^=l3u1Lvq-T4nonAWy=+o!6c>_iz*z|?_CZTXaS-4q#U6D9DGpL9NuO4f z8q&YvEQvH%QC5@Qit}7j?3*@_#w*Ht(uvsjC&i_q`$;9ay7WyWA4EiR;8E+ryJVp6|^zS$`Bt2hIj*)VM{XEczpnuX=pnuXU zpnp=%lSuv0Kj}v3pL7iLPl`E^i}at+Kj~kfe^Q)tB#~_ ze^PAlSCGC4{gYk{{gVcvf6@z~f6}$kKj~EHpY&AdpY$~7pL8YkPnrq+lRBV(($k@T z(u<&f(mz4}q&P>|Oj-y1lP-q-NiTr@NmoJtq_d!ZQXB-lN$Q0DN$-OGNq+_XlimXT zlP-t;N$-aKNza1*N$-LFNzaDwuK&_C%y=%4f) z=%2J6`X^0-{z-og{ga*x{gYk^{gXZk{gb+(f6_~!f70>LKk38JKj~G_KdB4)C%p;! zCtU&klg@$uNuP!ON$-IENuPrLNtZ(Zq+6hW(kkemGz0o4O@;nRbD)3H8t9+&H_$(6 z0Qx6=4f-ej2lP+c0R59rhW<$>K>wtxp?}i3&_8KD?nnj>SagU_xv{o2?+25j1wJ1b z7^rXdkI*NWpa$Nf)t|y4T40Ce##Sc8{e*v-`R^m>-r{fI5p)!BO0D#CBlo}~FleQa z(LEgk!>|-_U#q8CU>Jl_$bWj81f~KDUBrz7^R+OZxIthyv4^-uU`7=t6PE~_K9 zM&e}R5`i}ndx`S}ZX)&(=Lo!+IEUCP@K)knVvoSvi1UeE0yh&E659pdL0m$t2u#ry zRuK0cWBcDEt|9Ign4&IRP23^y+r$mT%>q;Og&T;Q1pa`yk+@OdZsLu^4FZ2o+(cX> zFjZ5ymAFLU1H{e5`2tf_h3&*S0{=kVLF^Tnsw?ay_6U58xSQA|u!7e@o!Bn0nYfQw z5!gc9Pu%w(wx2iI3zZn)Zh`H@7UB+pdDEzn*C~6N1$GiUiJJtDBX$ut3hW}r%oyz# z*iGyqt`Rt%IGMOa-~?hXalXJFVjppiz)8fs?$+ZKIGH$?*duT%aXzt2U@vhYv0dN{ z;u2y-U>|V>aopDFh0gkWB?2EHZYItbxR1D&tlMMPN zt`Rt%IGMOa-~?hXalXJFVjppiz)8e8#9o1uiF1iP0;dw^6T1ZV5*HHN1)Uz}KdfzA{%3GjK%-G@DeBY+!wWDU3WReWhRS46t}pV2Az2n{R4G{nzVQ z6QKIBqI!q+XU-Gr_xexQ0y^KC{iA~-Om(;iIs!W!H{R5$#kpG>_;F|G%bZn&|Y?XU@?4 zZl_l1wnKguC0dqUn`!MmGoYK)7KH5k;)MNyp9j<|yE@bAzfLQ5JJfIY{S^4ZRNq|w z@0L$3wVw_QKzc_N{A;_r#kK|i-xX*X6=)u*PO)oKEaRt`k+tj}E&DC2PYJY`P`omK+c#8760ow3&8ov9;GN^}FAs?osu9y83OP+eAjY zO=dSaooV-{*Y7R=sO1Yw?H7W#pA6obZCg5QTbcvSqXOGUqCr}gWqg)dU2H9T-nPX; zgUPa-@D_0IWAhp`6t=@GxZ8{+G0e@7FT^zs+DNx*rIwa%i|vK>#OB%~vH}!6zSOLy z^Fsib>m+O0X)Qe#PxI=NgOg2x+wG&&Nf!TzoAX*xe!5j;???85sO*ylv)^tldt2>q z(JiYpO@W;;iOp)MrFVPpNy6^J|BxL^VzV~M8cMg5&zd6x{+OFvTRvfEsipQ4A%g#z z!?$f)Mh148P_``KgmyLEn%I1^Vc&rR+3GBJDr%XgkHUPpw$=QlNm2c7uUhHOfZ61z z#cm(WB3GT}j)T79z=M7nMiyj=t8Z3!+UhvNuRo|J+v?dh>kr!MSCa0v)nk#Y)DQS? z*RrgkOf$MTI)|;EGkV&g*ZaQL@_{z@Zvz8emF`PyFJ!nc=?oMDZnn--Gu#PX#qNZU zE8Q;8OW4WOOsm?)uC)bS3w3W-GcDzR3W75n~V0LZ5e2nFR&vU`U1Cg>FB~CuTesdMJ=?N-ce`R)kO|94w9EdO z@~5;chvqed|DN&4Vnj&$2^@%n@SLc?1-Ux(f5K7Jwl-l>P=CmOa-hl_<9C23{q64| zK_oyzXJAKMtClHz#w!T!{dj19hre)+O}Do;Fc?xdLllNBq-8f{_cs2;7ZZ%W;m+ag_aP^@)M)CN&2vIE78$*ede{|2!3XfX*XA)r5b3 z^BdvR5}R){>O=YQ;K8H6j>%?iYY6v8wMkAb-I3B#cA9OA2@XM>gyQ36dZ@{vX1ncL zx;>(;47W8HP*@!rro~Xf1)`dGRug8(=%4T(s4@YH%Z3;-P_<8=BC5`2)s?W@ui-6F zl9L9z%+@P8f*gHH>A ztMX4_0cyV}9ZZ?Qqs5d19pX>;OS@1ROsamDt^N+M4r_g=CGfM!wwAN?x?Q$9&WeNC zef^NFmEQ;`R2?kQ+u%axRDG|=je4-pl?jJ)n34qO1HV{C1%$u+xt;O)hn8#z4x{HL$9j!uKK-I ze?;YGRBr7}fLJWrCE&a6UX}vxmK$MLn!edHFy^T0Xh*feUV6NCUMbrdoOXFk%h4Fqu%=f1KGMvJ zOGOi3i*Dj}HgShxKSxcr`ZLkn_qZ^#7#!6C=*D(i5W9H_grdIJd$-{Zpp*Jy?7#Hx zk$!{e;E!y<>TuGYYQ$65XqOr7dOVojA!Ue0S%vaw=oaV=0?IQw z=AMP1;7{6HC0qpUZJ@l0wuT-mtPLOR!;jh4Vvi9Tk8n%#fu&u7{F2`k*ckhoMGLb# zW(d32q5#3Jtqun$3X)g0;U6+w)h-xrH{?e9QjFUA>kmb&+qPDt7!5PC^d>e4JrCOV zFue~q@hab--p~2(dN=fYDOfP{`?SFqMMiUwc4>jtmk#!U(D>$ zzuA9)_IH@Nva5Sqdd@YyzUQcF51S(7?x4cVHRutFUq8Ml@EH1u_5=y?taCuhEXVr4dP_J3@Sx}g!=%pwE8`;0~|LV@bfkI@eq?9?IXo4viR_Y8? zx+~xnKf-bsoH!L*-Ds?QkhnrPj9|vje)xEMZ!X$xhyO!^Dp0Gh`c@GzK{0i_(lSm_ z4j;tmBvLw`{6d1 z0m7eFRQ;K?Xw!DnIs2;a(agJhH;^Upj-KVRt-T5<5x~Z*4WKbFs*1#2!D;UvLlZ5% zGs699I{J*Qt`lo3mbmF@qbkA-!qu_8SbrAG2y9KWfcheaj#(_{z8JRdV63;p%{9X%HCc78|)zT_Mm^D7pnaIDr-O4EIebFIrrpDI;zHA1;M7e{;Sa+7tHOUi#<$en{xeuq z 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�PM(vvK;o%^EnwT& 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 z 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%0A%t&oV_TXaT3XYhY{v-ZCGyQ*yY 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 bG@g_c_h?}HpYl0WmrHTt{_X@z#VGw3Bu0Sz literal 124540 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 diff --git a/bin/libopenjpeg-dotnet-2.1.3.0-dotnet-1-x86_64.so b/bin/libopenjpeg-dotnet-2.1.3.0-dotnet-1-x86_64.so index be11bb477d2472fed86638a14a6b8bb7603f4e6b..421dc56dec586c81d36da0341fe9b7daeb40cb83 100644 GIT binary patch literal 149392 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 literal 142616 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%0DUdgbhn}e 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%0A1SLvCJ(qbrDt9Ah+M2$J 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 = (bio->buf << 8) & 0xffff; - bio->ct = bio->buf == 0xff00 ? 7 : 8; - if (bio->bp >= bio->end) { - return 1; - } - *bio->bp++ = bio->buf >> 8; - return 0; -} - -static int bio_bytein(opj_bio_t *bio) { - bio->buf = (bio->buf << 8) & 0xffff; - bio->ct = bio->buf == 0xff00 ? 7 : 8; - if (bio->bp >= bio->end) { - return 1; - } - bio->buf |= *bio->bp++; - return 0; -} - -static void bio_putbit(opj_bio_t *bio, int b) { - if (bio->ct == 0) { - bio_byteout(bio); - } - bio->ct--; - bio->buf |= b << bio->ct; -} - -static int bio_getbit(opj_bio_t *bio) { - if (bio->ct == 0) { - bio_bytein(bio); - } - bio->ct--; - return (bio->buf >> bio->ct) & 1; -} - -/* -========================================================== - Bit Input/Output interface -========================================================== -*/ - -opj_bio_t* bio_create(void) { - opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t)); - return bio; -} - -void bio_destroy(opj_bio_t *bio) { - if(bio) { - opj_free(bio); - } -} - -int bio_numbytes(opj_bio_t *bio) { - return (bio->bp - bio->start); -} - -void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len) { - bio->start = bp; - bio->end = bp + len; - bio->bp = bp; - bio->buf = 0; - bio->ct = 8; -} - -void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len) { - bio->start = bp; - bio->end = bp + len; - bio->bp = bp; - bio->buf = 0; - bio->ct = 0; -} - -void bio_write(opj_bio_t *bio, int v, int n) { - int i; - for (i = n - 1; i >= 0; i--) { - bio_putbit(bio, (v >> i) & 1); - } -} - -int bio_read(opj_bio_t *bio, int n) { - int i, v; - v = 0; - for (i = n - 1; i >= 0; i--) { - v += bio_getbit(bio) << i; - } - return v; -} - -int bio_flush(opj_bio_t *bio) { - bio->ct = 0; - if (bio_byteout(bio)) { - return 1; - } - if (bio->ct == 7) { - bio->ct = 0; - if (bio_byteout(bio)) { - return 1; - } - } - return 0; -} - -int bio_inalign(opj_bio_t *bio) { - bio->ct = 0; - if ((bio->buf & 0xff) == 0xff) { - if (bio_bytein(bio)) { - return 1; - } - bio->ct = 0; - } - return 0; -} +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#include "opj_includes.h" + +/** @defgroup BIO BIO - Individual bit input-output stream */ +/*@{*/ + +/** @name Local static functions */ +/*@{*/ + +/** +Write a bit +@param bio BIO handle +@param b Bit to write (0 or 1) +*/ +static void bio_putbit(opj_bio_t *bio, int b); +/** +Read a bit +@param bio BIO handle +@return Returns the read bit +*/ +static int bio_getbit(opj_bio_t *bio); +/** +Write a byte +@param bio BIO handle +@return Returns 0 if successful, returns 1 otherwise +*/ +static int bio_byteout(opj_bio_t *bio); +/** +Read a byte +@param bio BIO handle +@return Returns 0 if successful, returns 1 otherwise +*/ +static int bio_bytein(opj_bio_t *bio); + +/*@}*/ + +/*@}*/ + +/* +========================================================== + local functions +========================================================== +*/ + +static int bio_byteout(opj_bio_t *bio) { + bio->buf = (bio->buf << 8) & 0xffff; + bio->ct = bio->buf == 0xff00 ? 7 : 8; + if (bio->bp >= bio->end) { + return 1; + } + *bio->bp++ = bio->buf >> 8; + return 0; +} + +static int bio_bytein(opj_bio_t *bio) { + bio->buf = (bio->buf << 8) & 0xffff; + bio->ct = bio->buf == 0xff00 ? 7 : 8; + if (bio->bp >= bio->end) { + return 1; + } + bio->buf |= *bio->bp++; + return 0; +} + +static void bio_putbit(opj_bio_t *bio, int b) { + if (bio->ct == 0) { + bio_byteout(bio); + } + bio->ct--; + bio->buf |= b << bio->ct; +} + +static int bio_getbit(opj_bio_t *bio) { + if (bio->ct == 0) { + bio_bytein(bio); + } + bio->ct--; + return (bio->buf >> bio->ct) & 1; +} + +/* +========================================================== + Bit Input/Output interface +========================================================== +*/ + +opj_bio_t* bio_create(void) { + opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t)); + return bio; +} + +void bio_destroy(opj_bio_t *bio) { + if(bio) { + opj_free(bio); + } +} + +int bio_numbytes(opj_bio_t *bio) { + return (bio->bp - bio->start); +} + +void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len) { + bio->start = bp; + bio->end = bp + len; + bio->bp = bp; + bio->buf = 0; + bio->ct = 8; +} + +void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len) { + bio->start = bp; + bio->end = bp + len; + bio->bp = bp; + bio->buf = 0; + bio->ct = 0; +} + +void bio_write(opj_bio_t *bio, int v, int n) { + int i; + for (i = n - 1; i >= 0; i--) { + bio_putbit(bio, (v >> i) & 1); + } +} + +int bio_read(opj_bio_t *bio, int n) { + int i, v; + v = 0; + for (i = n - 1; i >= 0; i--) { + v += bio_getbit(bio) << i; + } + return v; +} + +int bio_flush(opj_bio_t *bio) { + bio->ct = 0; + if (bio_byteout(bio)) { + return 1; + } + if (bio->ct == 7) { + bio->ct = 0; + if (bio_byteout(bio)) { + return 1; + } + } + return 0; +} + +int bio_inalign(opj_bio_t *bio) { + bio->ct = 0; + if ((bio->buf & 0xff) == 0xff) { + if (bio_bytein(bio)) { + return 1; + } + bio->ct = 0; + } + return 0; +} diff --git a/openjpeg-dotnet/libopenjpeg/bio.h b/openjpeg-dotnet/libopenjpeg/bio.h index 81f93f36..764d7cb2 100644 --- a/openjpeg-dotnet/libopenjpeg/bio.h +++ b/openjpeg-dotnet/libopenjpeg/bio.h @@ -1,125 +1,125 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#ifndef __BIO_H -#define __BIO_H -/** -@file bio.h -@brief Implementation of an individual bit input-output (BIO) - -The functions in BIO.C have for goal to realize an individual bit input - output. -*/ - -/** @defgroup BIO BIO - Individual bit input-output stream */ -/*@{*/ - -/** -Individual bit input-output stream (BIO) -*/ -typedef struct opj_bio { - /** pointer to the start of the buffer */ - unsigned char *start; - /** pointer to the end of the buffer */ - unsigned char *end; - /** pointer to the present position in the buffer */ - unsigned char *bp; - /** temporary place where each byte is read or written */ - unsigned int buf; - /** coder : number of bits free to write. decoder : number of bits read */ - int ct; -} opj_bio_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a new BIO handle -@return Returns a new BIO handle if successful, returns NULL otherwise -*/ -opj_bio_t* bio_create(void); -/** -Destroy a previously created BIO handle -@param bio BIO handle to destroy -*/ -void bio_destroy(opj_bio_t *bio); -/** -Number of bytes written. -@param bio BIO handle -@return Returns the number of bytes written -*/ -int bio_numbytes(opj_bio_t *bio); -/** -Init encoder -@param bio BIO handle -@param bp Output buffer -@param len Output buffer length -*/ -void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len); -/** -Init decoder -@param bio BIO handle -@param bp Input buffer -@param len Input buffer length -*/ -void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len); -/** -Write bits -@param bio BIO handle -@param v Value of bits -@param n Number of bits to write -*/ -void bio_write(opj_bio_t *bio, int v, int n); -/** -Read bits -@param bio BIO handle -@param n Number of bits to read -@return Returns the corresponding read number -*/ -int bio_read(opj_bio_t *bio, int n); -/** -Flush bits -@param bio BIO handle -@return Returns 1 if successful, returns 0 otherwise -*/ -int bio_flush(opj_bio_t *bio); -/** -Passes the ending bits (coming from flushing) -@param bio BIO handle -@return Returns 1 if successful, returns 0 otherwise -*/ -int bio_inalign(opj_bio_t *bio); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __BIO_H */ - +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#ifndef __BIO_H +#define __BIO_H +/** +@file bio.h +@brief Implementation of an individual bit input-output (BIO) + +The functions in BIO.C have for goal to realize an individual bit input - output. +*/ + +/** @defgroup BIO BIO - Individual bit input-output stream */ +/*@{*/ + +/** +Individual bit input-output stream (BIO) +*/ +typedef struct opj_bio { + /** pointer to the start of the buffer */ + unsigned char *start; + /** pointer to the end of the buffer */ + unsigned char *end; + /** pointer to the present position in the buffer */ + unsigned char *bp; + /** temporary place where each byte is read or written */ + unsigned int buf; + /** coder : number of bits free to write. decoder : number of bits read */ + int ct; +} opj_bio_t; + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Create a new BIO handle +@return Returns a new BIO handle if successful, returns NULL otherwise +*/ +opj_bio_t* bio_create(void); +/** +Destroy a previously created BIO handle +@param bio BIO handle to destroy +*/ +void bio_destroy(opj_bio_t *bio); +/** +Number of bytes written. +@param bio BIO handle +@return Returns the number of bytes written +*/ +int bio_numbytes(opj_bio_t *bio); +/** +Init encoder +@param bio BIO handle +@param bp Output buffer +@param len Output buffer length +*/ +void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len); +/** +Init decoder +@param bio BIO handle +@param bp Input buffer +@param len Input buffer length +*/ +void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len); +/** +Write bits +@param bio BIO handle +@param v Value of bits +@param n Number of bits to write +*/ +void bio_write(opj_bio_t *bio, int v, int n); +/** +Read bits +@param bio BIO handle +@param n Number of bits to read +@return Returns the corresponding read number +*/ +int bio_read(opj_bio_t *bio, int n); +/** +Flush bits +@param bio BIO handle +@return Returns 1 if successful, returns 0 otherwise +*/ +int bio_flush(opj_bio_t *bio); +/** +Passes the ending bits (coming from flushing) +@param bio BIO handle +@return Returns 1 if successful, returns 0 otherwise +*/ +int bio_inalign(opj_bio_t *bio); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __BIO_H */ + diff --git a/openjpeg-dotnet/libopenjpeg/cio.c b/openjpeg-dotnet/libopenjpeg/cio.c index 946b650b..b8a7ecf8 100644 --- a/openjpeg-dotnet/libopenjpeg/cio.c +++ b/openjpeg-dotnet/libopenjpeg/cio.c @@ -1,191 +1,191 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#include "opj_includes.h" - -/* ----------------------------------------------------------------------- */ - -opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length) { - opj_cp_t *cp = NULL; - opj_cio_t *cio = (opj_cio_t*)opj_malloc(sizeof(opj_cio_t)); - if(!cio) return NULL; - cio->cinfo = cinfo; - if(buffer && length) { - /* wrap a user buffer containing the encoded image */ - cio->openmode = OPJ_STREAM_READ; - cio->buffer = buffer; - cio->length = length; - } - else if(!buffer && !length && cinfo) { - /* allocate a buffer for the encoded image */ - cio->openmode = OPJ_STREAM_WRITE; - switch(cinfo->codec_format) { - case CODEC_J2K: - cp = ((opj_j2k_t*)cinfo->j2k_handle)->cp; - break; - case CODEC_JP2: - cp = ((opj_jp2_t*)cinfo->jp2_handle)->j2k->cp; - break; - default: - opj_free(cio); - return NULL; - } - cio->length = (unsigned int) (0.1625 * cp->img_size + 2000); /* 0.1625 = 1.3/8 and 2000 bytes as a minimum for headers */ - cio->buffer = (unsigned char *)opj_malloc(cio->length); - if(!cio->buffer) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error allocating memory for compressed bitstream\n"); - opj_free(cio); - return NULL; - } - } - else { - opj_free(cio); - return NULL; - } - - /* Initialize byte IO */ - cio->start = cio->buffer; - cio->end = cio->buffer + cio->length; - cio->bp = cio->buffer; - - return cio; -} - -void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio) { - if(cio) { - if(cio->openmode == OPJ_STREAM_WRITE) { - /* destroy the allocated buffer */ - opj_free(cio->buffer); - } - /* destroy the cio */ - opj_free(cio); - } -} - - -/* ----------------------------------------------------------------------- */ - -/* - * Get position in byte stream. - */ -int OPJ_CALLCONV cio_tell(opj_cio_t *cio) { - return cio->bp - cio->start; -} - -/* - * Set position in byte stream. - * - * pos : position, in number of bytes, from the beginning of the stream - */ -void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos) { - cio->bp = cio->start + pos; -} - -/* - * Number of bytes left before the end of the stream. - */ -int cio_numbytesleft(opj_cio_t *cio) { - return cio->end - cio->bp; -} - -/* - * Get pointer to the current position in the stream. - */ -unsigned char *cio_getbp(opj_cio_t *cio) { - return cio->bp; -} - -/* - * Write a byte. - */ -bool cio_byteout(opj_cio_t *cio, unsigned char v) { - if (cio->bp >= cio->end) { - opj_event_msg(cio->cinfo, EVT_ERROR, "write error\n"); - return false; - } - *cio->bp++ = v; - return true; -} - -/* - * Read a byte. - */ -unsigned char cio_bytein(opj_cio_t *cio) { - if (cio->bp >= cio->end) { - opj_event_msg(cio->cinfo, EVT_ERROR, "read error: passed the end of the codestream (start = %d, current = %d, end = %d\n", cio->start, cio->bp, cio->end); - return 0; - } - return *cio->bp++; -} - -/* - * Write some bytes. - * - * v : value to write - * n : number of bytes to write - */ -unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n) { - int i; - for (i = n - 1; i >= 0; i--) { - if( !cio_byteout(cio, (unsigned char) ((v >> (i << 3)) & 0xff)) ) - return 0; - } - return n; -} - -/* - * Read some bytes. - * - * n : number of bytes to read - * - * return : value of the n bytes read - */ -unsigned int cio_read(opj_cio_t *cio, int n) { - int i; - unsigned int v; - v = 0; - for (i = n - 1; i >= 0; i--) { - v += cio_bytein(cio) << (i << 3); - } - return v; -} - -/* - * Skip some bytes. - * - * n : number of bytes to skip - */ -void cio_skip(opj_cio_t *cio, int n) { - cio->bp += n; -} - - - +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#include "opj_includes.h" + +/* ----------------------------------------------------------------------- */ + +opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length) { + opj_cp_t *cp = NULL; + opj_cio_t *cio = (opj_cio_t*)opj_malloc(sizeof(opj_cio_t)); + if(!cio) return NULL; + cio->cinfo = cinfo; + if(buffer && length) { + /* wrap a user buffer containing the encoded image */ + cio->openmode = OPJ_STREAM_READ; + cio->buffer = buffer; + cio->length = length; + } + else if(!buffer && !length && cinfo) { + /* allocate a buffer for the encoded image */ + cio->openmode = OPJ_STREAM_WRITE; + switch(cinfo->codec_format) { + case CODEC_J2K: + cp = ((opj_j2k_t*)cinfo->j2k_handle)->cp; + break; + case CODEC_JP2: + cp = ((opj_jp2_t*)cinfo->jp2_handle)->j2k->cp; + break; + default: + opj_free(cio); + return NULL; + } + cio->length = (unsigned int) (0.1625 * cp->img_size + 2000); /* 0.1625 = 1.3/8 and 2000 bytes as a minimum for headers */ + cio->buffer = (unsigned char *)opj_malloc(cio->length); + if(!cio->buffer) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error allocating memory for compressed bitstream\n"); + opj_free(cio); + return NULL; + } + } + else { + opj_free(cio); + return NULL; + } + + /* Initialize byte IO */ + cio->start = cio->buffer; + cio->end = cio->buffer + cio->length; + cio->bp = cio->buffer; + + return cio; +} + +void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio) { + if(cio) { + if(cio->openmode == OPJ_STREAM_WRITE) { + /* destroy the allocated buffer */ + opj_free(cio->buffer); + } + /* destroy the cio */ + opj_free(cio); + } +} + + +/* ----------------------------------------------------------------------- */ + +/* + * Get position in byte stream. + */ +int OPJ_CALLCONV cio_tell(opj_cio_t *cio) { + return cio->bp - cio->start; +} + +/* + * Set position in byte stream. + * + * pos : position, in number of bytes, from the beginning of the stream + */ +void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos) { + cio->bp = cio->start + pos; +} + +/* + * Number of bytes left before the end of the stream. + */ +int cio_numbytesleft(opj_cio_t *cio) { + return cio->end - cio->bp; +} + +/* + * Get pointer to the current position in the stream. + */ +unsigned char *cio_getbp(opj_cio_t *cio) { + return cio->bp; +} + +/* + * Write a byte. + */ +opj_bool cio_byteout(opj_cio_t *cio, unsigned char v) { + if (cio->bp >= cio->end) { + opj_event_msg(cio->cinfo, EVT_ERROR, "write error\n"); + return OPJ_FALSE; + } + *cio->bp++ = v; + return OPJ_TRUE; +} + +/* + * Read a byte. + */ +unsigned char cio_bytein(opj_cio_t *cio) { + if (cio->bp >= cio->end) { + opj_event_msg(cio->cinfo, EVT_ERROR, "read error: passed the end of the codestream (start = %d, current = %d, end = %d\n", cio->start, cio->bp, cio->end); + return 0; + } + return *cio->bp++; +} + +/* + * Write some bytes. + * + * v : value to write + * n : number of bytes to write + */ +unsigned int cio_write(opj_cio_t *cio, unsigned long long int v, int n) { + int i; + for (i = n - 1; i >= 0; i--) { + if( !cio_byteout(cio, (unsigned char) ((v >> (i << 3)) & 0xff)) ) + return 0; + } + return n; +} + +/* + * Read some bytes. + * + * n : number of bytes to read + * + * return : value of the n bytes read + */ +unsigned int cio_read(opj_cio_t *cio, int n) { + int i; + unsigned int v; + v = 0; + for (i = n - 1; i >= 0; i--) { + v += cio_bytein(cio) << (i << 3); + } + return v; +} + +/* + * Skip some bytes. + * + * n : number of bytes to skip + */ +void cio_skip(opj_cio_t *cio, int n) { + cio->bp += n; +} + + + diff --git a/openjpeg-dotnet/libopenjpeg/cio.h b/openjpeg-dotnet/libopenjpeg/cio.h index fd60ac6f..ce1a13ec 100644 --- a/openjpeg-dotnet/libopenjpeg/cio.h +++ b/openjpeg-dotnet/libopenjpeg/cio.h @@ -1,86 +1,86 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#ifndef __CIO_H -#define __CIO_H -/** -@file cio.h -@brief Implementation of a byte input-output process (CIO) - -The functions in CIO.C have for goal to realize a byte input / output process. -*/ - -/** @defgroup CIO CIO - byte input-output stream */ -/*@{*/ - -/** @name Exported functions (see also openjpeg.h) */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Number of bytes left before the end of the stream -@param cio CIO handle -@return Returns the number of bytes before the end of the stream -*/ -int cio_numbytesleft(opj_cio_t *cio); -/** -Get pointer to the current position in the stream -@param cio CIO handle -@return Returns a pointer to the current position -*/ -unsigned char *cio_getbp(opj_cio_t *cio); -/** -Write some bytes -@param cio CIO handle -@param v Value to write -@param n Number of bytes to write -@return Returns the number of bytes written or 0 if an error occured -*/ -unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n); -/** -Read some bytes -@param cio CIO handle -@param n Number of bytes to read -@return Returns the value of the n bytes read -*/ -unsigned int cio_read(opj_cio_t *cio, int n); -/** -Skip some bytes -@param cio CIO handle -@param n Number of bytes to skip -*/ -void cio_skip(opj_cio_t *cio, int n); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __CIO_H */ - +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#ifndef __CIO_H +#define __CIO_H +/** +@file cio.h +@brief Implementation of a byte input-output process (CIO) + +The functions in CIO.C have for goal to realize a byte input / output process. +*/ + +/** @defgroup CIO CIO - byte input-output stream */ +/*@{*/ + +/** @name Exported functions (see also openjpeg.h) */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Number of bytes left before the end of the stream +@param cio CIO handle +@return Returns the number of bytes before the end of the stream +*/ +int cio_numbytesleft(opj_cio_t *cio); +/** +Get pointer to the current position in the stream +@param cio CIO handle +@return Returns a pointer to the current position +*/ +unsigned char *cio_getbp(opj_cio_t *cio); +/** +Write some bytes +@param cio CIO handle +@param v Value to write +@param n Number of bytes to write +@return Returns the number of bytes written or 0 if an error occured +*/ +unsigned int cio_write(opj_cio_t *cio, unsigned long long int v, int n); +/** +Read some bytes +@param cio CIO handle +@param n Number of bytes to read +@return Returns the value of the n bytes read +*/ +unsigned int cio_read(opj_cio_t *cio, int n); +/** +Skip some bytes +@param cio CIO handle +@param n Number of bytes to skip +*/ +void cio_skip(opj_cio_t *cio, int n); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __CIO_H */ + diff --git a/openjpeg-dotnet/libopenjpeg/dwt.c b/openjpeg-dotnet/libopenjpeg/dwt.c index 7a8cb98b..0fbfc203 100644 --- a/openjpeg-dotnet/libopenjpeg/dwt.c +++ b/openjpeg-dotnet/libopenjpeg/dwt.c @@ -1,825 +1,858 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2007, Jonathan Ballard - * Copyright (c) 2007, Callum Lerwick - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#ifdef __SSE__ -#include -#endif - -#include "opj_includes.h" - -/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */ -/*@{*/ - -#define WS(i) v->mem[(i)*2] -#define WD(i) v->mem[(1+(i)*2)] - -/** @name Local data structures */ -/*@{*/ - -typedef struct dwt_local { - int* mem; - int dn; - int sn; - int cas; -} dwt_t; - -typedef union { - float f[4]; -} v4; - -typedef struct v4dwt_local { - v4* wavelet ; - int dn ; - int sn ; - int cas ; -} v4dwt_t ; - -static const float dwt_alpha = 1.586134342f; // 12994 -static const float dwt_beta = 0.052980118f; // 434 -static const float dwt_gamma = -0.882911075f; // -7233 -static const float dwt_delta = -0.443506852f; // -3633 - -static const float K = 1.230174105f; // 10078 -/* FIXME: What is this constant? */ -static const float c13318 = 1.625732422f; - -/*@}*/ - -/** -Virtual function type for wavelet transform in 1-D -*/ -typedef void (*DWT1DFN)(dwt_t* v); - -/** @name Local static functions */ -/*@{*/ - -/** -Forward lazy transform (horizontal) -*/ -static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas); -/** -Forward lazy transform (vertical) -*/ -static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas); -/** -Inverse lazy transform (horizontal) -*/ -static void dwt_interleave_h(dwt_t* h, int *a); -/** -Inverse lazy transform (vertical) -*/ -static void dwt_interleave_v(dwt_t* v, int *a, int x); -/** -Forward 5-3 wavelet transform in 1-D -*/ -static void dwt_encode_1(int *a, int dn, int sn, int cas); -/** -Inverse 5-3 wavelet transform in 1-D -*/ -static void dwt_decode_1(dwt_t *v); -/** -Forward 9-7 wavelet transform in 1-D -*/ -static void dwt_encode_1_real(int *a, int dn, int sn, int cas); -/** -Explicit calculation of the Quantization Stepsizes -*/ -static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize); -/** -Inverse wavelet transform in 2-D. -*/ -static void dwt_decode_tile(opj_tcd_tilecomp_t* tilec, int i, DWT1DFN fn); - -/*@}*/ - -/*@}*/ - -#define S(i) a[(i)*2] -#define D(i) a[(1+(i)*2)] -#define S_(i) ((i)<0?S(0):((i)>=sn?S(sn-1):S(i))) -#define D_(i) ((i)<0?D(0):((i)>=dn?D(dn-1):D(i))) -/* new */ -#define SS_(i) ((i)<0?S(0):((i)>=dn?S(dn-1):S(i))) -#define DD_(i) ((i)<0?D(0):((i)>=sn?D(sn-1):D(i))) - -/*

*/ -/* This table contains the norms of the 5-3 wavelets for different bands. */ -/* */ -static const double dwt_norms[4][10] = { - {1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3}, - {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, - {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, - {.7186, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93} -}; - -/* */ -/* This table contains the norms of the 9-7 wavelets for different bands. */ -/* */ -static const double dwt_norms_real[4][10] = { - {1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9}, - {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0}, - {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0}, - {2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2} -}; - -/* -========================================================== - local functions -========================================================== -*/ - -/* */ -/* Forward lazy transform (horizontal). */ -/* */ -static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas) { - int i; - for (i=0; i */ -/* Forward lazy transform (vertical). */ -/*
*/ -static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas) { - int i; - for (i=0; i */ -/* Inverse lazy transform (horizontal). */ -/* */ -static void dwt_interleave_h(dwt_t* h, int *a) { - int *ai = a; - int *bi = h->mem + h->cas; - int i = h->sn; - while( i-- ) { - *bi = *(ai++); - bi += 2; - } - ai = a + h->sn; - bi = h->mem + 1 - h->cas; - i = h->dn ; - while( i-- ) { - *bi = *(ai++); - bi += 2; - } -} - -/* */ -/* Inverse lazy transform (vertical). */ -/* */ -static void dwt_interleave_v(dwt_t* v, int *a, int x) { - int *ai = a; - int *bi = v->mem + v->cas; - int i = v->sn; - while( i-- ) { - *bi = *ai; - bi += 2; - ai += x; - } - ai = a + (v->sn * x); - bi = v->mem + 1 - v->cas; - i = v->dn ; - while( i-- ) { - *bi = *ai; - bi += 2; - ai += x; - } -} - - -/* */ -/* Forward 5-3 wavelet transform in 1-D. */ -/* */ -static void dwt_encode_1(int *a, int dn, int sn, int cas) { - int i; - - if (!cas) { - if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < dn; i++) D(i) -= (S_(i) + S_(i + 1)) >> 1; - for (i = 0; i < sn; i++) S(i) += (D_(i - 1) + D_(i) + 2) >> 2; - } - } else { - if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */ - S(0) *= 2; - else { - for (i = 0; i < dn; i++) S(i) -= (DD_(i) + DD_(i - 1)) >> 1; - for (i = 0; i < sn; i++) D(i) += (SS_(i) + SS_(i + 1) + 2) >> 2; - } - } -} - -/* */ -/* Inverse 5-3 wavelet transform in 1-D. */ -/* */ -static void dwt_decode_1_(int *a, int dn, int sn, int cas) { - int i; - - if (!cas) { - if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < sn; i++) S(i) -= (D_(i - 1) + D_(i) + 2) >> 2; - for (i = 0; i < dn; i++) D(i) += (S_(i) + S_(i + 1)) >> 1; - } - } else { - if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */ - S(0) /= 2; - else { - for (i = 0; i < sn; i++) D(i) -= (SS_(i) + SS_(i + 1) + 2) >> 2; - for (i = 0; i < dn; i++) S(i) += (DD_(i) + DD_(i - 1)) >> 1; - } - } -} - -/* */ -/* Inverse 5-3 wavelet transform in 1-D. */ -/* */ -static void dwt_decode_1(dwt_t *v) { - dwt_decode_1_(v->mem, v->dn, v->sn, v->cas); -} - -/* */ -/* Forward 9-7 wavelet transform in 1-D. */ -/* */ -static void dwt_encode_1_real(int *a, int dn, int sn, int cas) { - int i; - if (!cas) { - if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < dn; i++) - D(i) -= fix_mul(S_(i) + S_(i + 1), 12993); - for (i = 0; i < sn; i++) - S(i) -= fix_mul(D_(i - 1) + D_(i), 434); - for (i = 0; i < dn; i++) - D(i) += fix_mul(S_(i) + S_(i + 1), 7233); - for (i = 0; i < sn; i++) - S(i) += fix_mul(D_(i - 1) + D_(i), 3633); - for (i = 0; i < dn; i++) - D(i) = fix_mul(D(i), 5038); /*5038 */ - for (i = 0; i < sn; i++) - S(i) = fix_mul(S(i), 6659); /*6660 */ - } - } else { - if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < dn; i++) - S(i) -= fix_mul(DD_(i) + DD_(i - 1), 12993); - for (i = 0; i < sn; i++) - D(i) -= fix_mul(SS_(i) + SS_(i + 1), 434); - for (i = 0; i < dn; i++) - S(i) += fix_mul(DD_(i) + DD_(i - 1), 7233); - for (i = 0; i < sn; i++) - D(i) += fix_mul(SS_(i) + SS_(i + 1), 3633); - for (i = 0; i < dn; i++) - S(i) = fix_mul(S(i), 5038); /*5038 */ - for (i = 0; i < sn; i++) - D(i) = fix_mul(D(i), 6659); /*6660 */ - } - } -} - -static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize) { - int p, n; - p = int_floorlog2(stepsize) - 13; - n = 11 - int_floorlog2(stepsize); - bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff; - bandno_stepsize->expn = numbps - p; -} - -/* -========================================================== - DWT interface -========================================================== -*/ - -/* */ -/* Forward 5-3 wavelet transform in 2-D. */ -/* */ -void dwt_encode(opj_tcd_tilecomp_t * tilec) { - int i, j, k; - int *a = NULL; - int *aj = NULL; - int *bj = NULL; - int w, l; - - w = tilec->x1-tilec->x0; - l = tilec->numresolutions-1; - a = tilec->data; - - for (i = 0; i < l; i++) { - int rw; /* width of the resolution level computed */ - int rh; /* height of the resolution level computed */ - int rw1; /* width of the resolution level once lower than computed one */ - int rh1; /* height of the resolution level once lower than computed one */ - int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ - int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ - int dn, sn; - - rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0; - rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0; - rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0; - rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0; - - cas_row = tilec->resolutions[l - i].x0 % 2; - cas_col = tilec->resolutions[l - i].y0 % 2; - - sn = rh1; - dn = rh - rh1; - bj = (int*)opj_malloc(rh * sizeof(int)); - for (j = 0; j < rw; j++) { - aj = a + j; - for (k = 0; k < rh; k++) bj[k] = aj[k*w]; - dwt_encode_1(bj, dn, sn, cas_col); - dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col); - } - opj_free(bj); - - sn = rw1; - dn = rw - rw1; - bj = (int*)opj_malloc(rw * sizeof(int)); - for (j = 0; j < rh; j++) { - aj = a + j * w; - for (k = 0; k < rw; k++) bj[k] = aj[k]; - dwt_encode_1(bj, dn, sn, cas_row); - dwt_deinterleave_h(bj, aj, dn, sn, cas_row); - } - opj_free(bj); - } -} - - -/* */ -/* Inverse 5-3 wavelet transform in 2-D. */ -/* */ -void dwt_decode(opj_tcd_tilecomp_t* tilec, int numres) { - dwt_decode_tile(tilec, numres, &dwt_decode_1); -} - - -/* */ -/* Get gain of 5-3 wavelet transform. */ -/* */ -int dwt_getgain(int orient) { - if (orient == 0) - return 0; - if (orient == 1 || orient == 2) - return 1; - return 2; -} - -/* */ -/* Get norm of 5-3 wavelet. */ -/* */ -double dwt_getnorm(int level, int orient) { - return dwt_norms[orient][level]; -} - -/* */ -/* Forward 9-7 wavelet transform in 2-D. */ -/* */ - -void dwt_encode_real(opj_tcd_tilecomp_t * tilec) { - int i, j, k; - int *a = NULL; - int *aj = NULL; - int *bj = NULL; - int w, l; - - w = tilec->x1-tilec->x0; - l = tilec->numresolutions-1; - a = tilec->data; - - for (i = 0; i < l; i++) { - int rw; /* width of the resolution level computed */ - int rh; /* height of the resolution level computed */ - int rw1; /* width of the resolution level once lower than computed one */ - int rh1; /* height of the resolution level once lower than computed one */ - int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ - int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ - int dn, sn; - - rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0; - rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0; - rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0; - rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0; - - cas_row = tilec->resolutions[l - i].x0 % 2; - cas_col = tilec->resolutions[l - i].y0 % 2; - - sn = rh1; - dn = rh - rh1; - bj = (int*)opj_malloc(rh * sizeof(int)); - for (j = 0; j < rw; j++) { - aj = a + j; - for (k = 0; k < rh; k++) bj[k] = aj[k*w]; - dwt_encode_1_real(bj, dn, sn, cas_col); - dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col); - } - opj_free(bj); - - sn = rw1; - dn = rw - rw1; - bj = (int*)opj_malloc(rw * sizeof(int)); - for (j = 0; j < rh; j++) { - aj = a + j * w; - for (k = 0; k < rw; k++) bj[k] = aj[k]; - dwt_encode_1_real(bj, dn, sn, cas_row); - dwt_deinterleave_h(bj, aj, dn, sn, cas_row); - } - opj_free(bj); - } -} - - -/* */ -/* Get gain of 9-7 wavelet transform. */ -/* */ -int dwt_getgain_real(int orient) { - (void)orient; - return 0; -} - -/* */ -/* Get norm of 9-7 wavelet. */ -/* */ -double dwt_getnorm_real(int level, int orient) { - return dwt_norms_real[orient][level]; -} - -void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec) { - int numbands, bandno; - numbands = 3 * tccp->numresolutions - 2; - for (bandno = 0; bandno < numbands; bandno++) { - double stepsize; - int resno, level, orient, gain; - - resno = (bandno == 0) ? 0 : ((bandno - 1) / 3 + 1); - orient = (bandno == 0) ? 0 : ((bandno - 1) % 3 + 1); - level = tccp->numresolutions - 1 - resno; - gain = (tccp->qmfbid == 0) ? 0 : ((orient == 0) ? 0 : (((orient == 1) || (orient == 2)) ? 1 : 2)); - if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { - stepsize = 1.0; - } else { - double norm = dwt_norms_real[orient][level]; - stepsize = (1 << (gain)) / norm; - } - dwt_encode_stepsize((int) floor(stepsize * 8192.0), prec + gain, &tccp->stepsizes[bandno]); - } -} - - -/* */ -/* Determine maximum computed resolution level for inverse wavelet transform */ -/* */ -static int dwt_decode_max_resolution(opj_tcd_resolution_t* restrict r, int i) { - int mr = 1; - int w; - while( --i ) { - r++; - if( mr < ( w = r->x1 - r->x0 ) ) - mr = w ; - if( mr < ( w = r->y1 - r->y0 ) ) - mr = w ; - } - return mr ; -} - - -/* */ -/* Inverse wavelet transform in 2-D. */ -/* */ -static void dwt_decode_tile(opj_tcd_tilecomp_t* tilec, int numres, DWT1DFN dwt_1D) { - dwt_t h; - dwt_t v; - - opj_tcd_resolution_t* tr = tilec->resolutions; - - int rw = tr->x1 - tr->x0; /* width of the resolution level computed */ - int rh = tr->y1 - tr->y0; /* height of the resolution level computed */ - - int w = tilec->x1 - tilec->x0; - - h.mem = opj_aligned_malloc(dwt_decode_max_resolution(tr, numres) * sizeof(int)); - v.mem = h.mem; - - while( --numres) { - int * restrict tiledp = tilec->data; - int j; - - ++tr; - h.sn = rw; - v.sn = rh; - - rw = tr->x1 - tr->x0; - rh = tr->y1 - tr->y0; - - h.dn = rw - h.sn; - h.cas = tr->x0 % 2; - - for(j = 0; j < rh; ++j) { - dwt_interleave_h(&h, &tiledp[j*w]); - (dwt_1D)(&h); - memcpy(&tiledp[j*w], h.mem, rw * sizeof(int)); - } - - v.dn = rh - v.sn; - v.cas = tr->y0 % 2; - - for(j = 0; j < rw; ++j){ - int k; - dwt_interleave_v(&v, &tiledp[j], w); - (dwt_1D)(&v); - for(k = 0; k < rh; ++k) { - tiledp[k * w + j] = v.mem[k]; - } - } - } - opj_aligned_free(h.mem); -} - -static void v4dwt_interleave_h(v4dwt_t* restrict w, float* restrict a, int x, int size){ - float* restrict bi = (float*) (w->wavelet + w->cas); - int count = w->sn; - int i, k; - for(k = 0; k < 2; ++k){ - for(i = 0; i < count; ++i){ - int j = i; - bi[i*8 ] = a[j]; - j += x; - if(j > size) continue; - bi[i*8 + 1] = a[j]; - j += x; - if(j > size) continue; - bi[i*8 + 2] = a[j]; - j += x; - if(j > size) continue; - bi[i*8 + 3] = a[j]; - } - bi = (float*) (w->wavelet + 1 - w->cas); - a += w->sn; - size -= w->sn; - count = w->dn; - } -} - -static void v4dwt_interleave_v(v4dwt_t* restrict v , float* restrict a , int x){ - v4* restrict bi = v->wavelet + v->cas; - int i; - for(i = 0; i < v->sn; ++i){ - memcpy(&bi[i*2], &a[i*x], 4 * sizeof(float)); - } - a += v->sn * x; - bi = v->wavelet + 1 - v->cas; - for(i = 0; i < v->dn; ++i){ - memcpy(&bi[i*2], &a[i*x], 4 * sizeof(float)); - } -} - -#ifdef __SSE__ - -static void v4dwt_decode_step1_sse(v4* w, int count, const __m128 c){ - __m128* restrict vw = (__m128*) w; - int i; - for(i = 0; i < count; ++i){ - __m128 tmp = vw[i*2]; - vw[i*2] = tmp * c; - } -} - -static void v4dwt_decode_step2_sse(v4* l, v4* w, int k, int m, __m128 c){ - __m128* restrict vl = (__m128*) l; - __m128* restrict vw = (__m128*) w; - int i; - for(i = 0; i < m; ++i){ - __m128 tmp1 = vl[ 0]; - __m128 tmp2 = vw[-1]; - __m128 tmp3 = vw[ 0]; - vw[-1] = tmp2 + ((tmp1 + tmp3) * c); - vl = vw; - vw += 2; - } - if(m >= k){ - return; - } - c += c; - c *= vl[0]; - for(; m < k; ++m){ - __m128 tmp = vw[-1]; - vw[-1] = tmp + c; - vw += 2; - } -} - -#else - -static void v4dwt_decode_step1(v4* w, int count, const float c){ - float* restrict fw = (float*) w; - int i; - for(i = 0; i < count; ++i){ - float tmp1 = fw[i*8 ]; - float tmp2 = fw[i*8 + 1]; - float tmp3 = fw[i*8 + 2]; - float tmp4 = fw[i*8 + 3]; - fw[i*8 ] = tmp1 * c; - fw[i*8 + 1] = tmp2 * c; - fw[i*8 + 2] = tmp3 * c; - fw[i*8 + 3] = tmp4 * c; - } -} - -static void v4dwt_decode_step2(v4* l, v4* w, int k, int m, float c){ - float* restrict fl = (float*) l; - float* restrict fw = (float*) w; - int i; - for(i = 0; i < m; ++i){ - float tmp1_1 = fl[0]; - float tmp1_2 = fl[1]; - float tmp1_3 = fl[2]; - float tmp1_4 = fl[3]; - float tmp2_1 = fw[-4]; - float tmp2_2 = fw[-3]; - float tmp2_3 = fw[-2]; - float tmp2_4 = fw[-1]; - float tmp3_1 = fw[0]; - float tmp3_2 = fw[1]; - float tmp3_3 = fw[2]; - float tmp3_4 = fw[3]; - fw[-4] = tmp2_1 + ((tmp1_1 + tmp3_1) * c); - fw[-3] = tmp2_2 + ((tmp1_2 + tmp3_2) * c); - fw[-2] = tmp2_3 + ((tmp1_3 + tmp3_3) * c); - fw[-1] = tmp2_4 + ((tmp1_4 + tmp3_4) * c); - fl = fw; - fw += 8; - } - if(m < k){ - float c1; - float c2; - float c3; - float c4; - c += c; - c1 = fl[0] * c; - c2 = fl[1] * c; - c3 = fl[2] * c; - c4 = fl[3] * c; - for(; m < k; ++m){ - float tmp1 = fw[-4]; - float tmp2 = fw[-3]; - float tmp3 = fw[-2]; - float tmp4 = fw[-1]; - fw[-4] = tmp1 + c1; - fw[-3] = tmp2 + c2; - fw[-2] = tmp3 + c3; - fw[-1] = tmp4 + c4; - fw += 8; - } - } -} - -#endif - -/* */ -/* Inverse 9-7 wavelet transform in 1-D. */ -/* */ -static void v4dwt_decode(v4dwt_t* restrict dwt){ - int a, b; - if(dwt->cas == 0) { - if(!((dwt->dn > 0) || (dwt->sn > 1))){ - return; - } - a = 0; - b = 1; - }else{ - if(!((dwt->sn > 0) || (dwt->dn > 1))) { - return; - } - a = 1; - b = 0; - } -#ifdef __SSE__ - v4dwt_decode_step1_sse(dwt->wavelet+a, dwt->sn, _mm_set1_ps(K)); - v4dwt_decode_step1_sse(dwt->wavelet+b, dwt->dn, _mm_set1_ps(c13318)); - v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(dwt_delta)); - v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(dwt_gamma)); - v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(dwt_beta)); - v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(dwt_alpha)); -#else - v4dwt_decode_step1(dwt->wavelet+a, dwt->sn, K); - v4dwt_decode_step1(dwt->wavelet+b, dwt->dn, c13318); - v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), dwt_delta); - v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), dwt_gamma); - v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), dwt_beta); - v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), dwt_alpha); -#endif -} - -/* */ -/* Inverse 9-7 wavelet transform in 2-D. */ -/* */ -void dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, int numres){ - v4dwt_t h; - v4dwt_t v; - - opj_tcd_resolution_t* res = tilec->resolutions; - - int rw = res->x1 - res->x0; /* width of the resolution level computed */ - int rh = res->y1 - res->y0; /* height of the resolution level computed */ - - int w = tilec->x1 - tilec->x0; - - h.wavelet = (v4*) opj_aligned_malloc((dwt_decode_max_resolution(res, numres)+5) * sizeof(v4)); - v.wavelet = h.wavelet; - - while( --numres) { - float * restrict aj = (float*) tilec->data; - int bufsize = (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0); - int j; - - h.sn = rw; - v.sn = rh; - - ++res; - - rw = res->x1 - res->x0; /* width of the resolution level computed */ - rh = res->y1 - res->y0; /* height of the resolution level computed */ - - h.dn = rw - h.sn; - h.cas = res->x0 % 2; - - for(j = rh; j > 0; j -= 4){ - v4dwt_interleave_h(&h, aj, w, bufsize); - v4dwt_decode(&h); - if(j >= 4){ - int k; - for(k = rw; --k >= 0;){ - aj[k ] = h.wavelet[k].f[0]; - aj[k+w ] = h.wavelet[k].f[1]; - aj[k+w*2] = h.wavelet[k].f[2]; - aj[k+w*3] = h.wavelet[k].f[3]; - } - }else{ - int k; - for(k = rw; --k >= 0;){ - switch(j) { - case 3: aj[k+w*2] = h.wavelet[k].f[2]; - case 2: aj[k+w ] = h.wavelet[k].f[1]; - case 1: aj[k ] = h.wavelet[k].f[0]; - } - } - } - aj += w*4; - bufsize -= w*4; - } - - v.dn = rh - v.sn; - v.cas = res->y0 % 2; - - aj = (float*) tilec->data; - for(j = rw; j > 0; j -= 4){ - v4dwt_interleave_v(&v, aj, w); - v4dwt_decode(&v); - if(j >= 4){ - int k; - for(k = 0; k < rh; ++k){ - memcpy(&aj[k*w], &v.wavelet[k], 4 * sizeof(float)); - } - }else{ - int k; - for(k = 0; k < rh; ++k){ - memcpy(&aj[k*w], &v.wavelet[k], j * sizeof(float)); - } - } - aj += 4; - } - } - - opj_aligned_free(h.wavelet); -} - +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2007, Jonathan Ballard + * Copyright (c) 2007, Callum Lerwick + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#ifdef __SSE__ +#include +#endif + +#include "opj_includes.h" + +/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */ +/*@{*/ + +#define WS(i) v->mem[(i)*2] +#define WD(i) v->mem[(1+(i)*2)] + +/** @name Local data structures */ +/*@{*/ + +typedef struct dwt_local { + int* mem; + int dn; + int sn; + int cas; +} dwt_t; + +typedef union { + float f[4]; +} v4; + +typedef struct v4dwt_local { + v4* wavelet ; + int dn ; + int sn ; + int cas ; +} v4dwt_t ; + +static const float dwt_alpha = 1.586134342f; /* 12994 */ +static const float dwt_beta = 0.052980118f; /* 434 */ +static const float dwt_gamma = -0.882911075f; /* -7233 */ +static const float dwt_delta = -0.443506852f; /* -3633 */ + +static const float K = 1.230174105f; /* 10078 */ +/* FIXME: What is this constant? */ +static const float c13318 = 1.625732422f; + +/*@}*/ + +/** +Virtual function type for wavelet transform in 1-D +*/ +typedef void (*DWT1DFN)(dwt_t* v); + +/** @name Local static functions */ +/*@{*/ + +/** +Forward lazy transform (horizontal) +*/ +static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas); +/** +Forward lazy transform (vertical) +*/ +static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas); +/** +Inverse lazy transform (horizontal) +*/ +static void dwt_interleave_h(dwt_t* h, int *a); +/** +Inverse lazy transform (vertical) +*/ +static void dwt_interleave_v(dwt_t* v, int *a, int x); +/** +Forward 5-3 wavelet transform in 1-D +*/ +static void dwt_encode_1(int *a, int dn, int sn, int cas); +/** +Inverse 5-3 wavelet transform in 1-D +*/ +static void dwt_decode_1(dwt_t *v); +/** +Forward 9-7 wavelet transform in 1-D +*/ +static void dwt_encode_1_real(int *a, int dn, int sn, int cas); +/** +Explicit calculation of the Quantization Stepsizes +*/ +static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize); +/** +Inverse wavelet transform in 2-D. +*/ +static void dwt_decode_tile(opj_tcd_tilecomp_t* tilec, int i, DWT1DFN fn); + +/*@}*/ + +/*@}*/ + +#define S(i) a[(i)*2] +#define D(i) a[(1+(i)*2)] +#define S_(i) ((i)<0?S(0):((i)>=sn?S(sn-1):S(i))) +#define D_(i) ((i)<0?D(0):((i)>=dn?D(dn-1):D(i))) +/* new */ +#define SS_(i) ((i)<0?S(0):((i)>=dn?S(dn-1):S(i))) +#define DD_(i) ((i)<0?D(0):((i)>=sn?D(sn-1):D(i))) + +/* */ +/* This table contains the norms of the 5-3 wavelets for different bands. */ +/* */ +static const double dwt_norms[4][10] = { + {1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3}, + {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, + {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, + {.7186, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93} +}; + +/* */ +/* This table contains the norms of the 9-7 wavelets for different bands. */ +/* */ +static const double dwt_norms_real[4][10] = { + {1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9}, + {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0}, + {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0}, + {2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2} +}; + +/* +========================================================== + local functions +========================================================== +*/ + +/* */ +/* Forward lazy transform (horizontal). */ +/* */ +static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas) { + int i; + for (i=0; i */ +/* Forward lazy transform (vertical). */ +/* */ +static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas) { + int i; + for (i=0; i */ +/* Inverse lazy transform (horizontal). */ +/* */ +static void dwt_interleave_h(dwt_t* h, int *a) { + int *ai = a; + int *bi = h->mem + h->cas; + int i = h->sn; + while( i-- ) { + *bi = *(ai++); + bi += 2; + } + ai = a + h->sn; + bi = h->mem + 1 - h->cas; + i = h->dn ; + while( i-- ) { + *bi = *(ai++); + bi += 2; + } +} + +/* */ +/* Inverse lazy transform (vertical). */ +/* */ +static void dwt_interleave_v(dwt_t* v, int *a, int x) { + int *ai = a; + int *bi = v->mem + v->cas; + int i = v->sn; + while( i-- ) { + *bi = *ai; + bi += 2; + ai += x; + } + ai = a + (v->sn * x); + bi = v->mem + 1 - v->cas; + i = v->dn ; + while( i-- ) { + *bi = *ai; + bi += 2; + ai += x; + } +} + + +/* */ +/* Forward 5-3 wavelet transform in 1-D. */ +/* */ +static void dwt_encode_1(int *a, int dn, int sn, int cas) { + int i; + + if (!cas) { + if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ + for (i = 0; i < dn; i++) D(i) -= (S_(i) + S_(i + 1)) >> 1; + for (i = 0; i < sn; i++) S(i) += (D_(i - 1) + D_(i) + 2) >> 2; + } + } else { + if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */ + S(0) *= 2; + else { + for (i = 0; i < dn; i++) S(i) -= (DD_(i) + DD_(i - 1)) >> 1; + for (i = 0; i < sn; i++) D(i) += (SS_(i) + SS_(i + 1) + 2) >> 2; + } + } +} + +/* */ +/* Inverse 5-3 wavelet transform in 1-D. */ +/* */ +static void dwt_decode_1_(int *a, int dn, int sn, int cas) { + int i; + + if (!cas) { + if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ + for (i = 0; i < sn; i++) S(i) -= (D_(i - 1) + D_(i) + 2) >> 2; + for (i = 0; i < dn; i++) D(i) += (S_(i) + S_(i + 1)) >> 1; + } + } else { + if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */ + S(0) /= 2; + else { + for (i = 0; i < sn; i++) D(i) -= (SS_(i) + SS_(i + 1) + 2) >> 2; + for (i = 0; i < dn; i++) S(i) += (DD_(i) + DD_(i - 1)) >> 1; + } + } +} + +/* */ +/* Inverse 5-3 wavelet transform in 1-D. */ +/* */ +static void dwt_decode_1(dwt_t *v) { + dwt_decode_1_(v->mem, v->dn, v->sn, v->cas); +} + +/* */ +/* Forward 9-7 wavelet transform in 1-D. */ +/* */ +static void dwt_encode_1_real(int *a, int dn, int sn, int cas) { + int i; + if (!cas) { + if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ + for (i = 0; i < dn; i++) + D(i) -= fix_mul(S_(i) + S_(i + 1), 12993); + for (i = 0; i < sn; i++) + S(i) -= fix_mul(D_(i - 1) + D_(i), 434); + for (i = 0; i < dn; i++) + D(i) += fix_mul(S_(i) + S_(i + 1), 7233); + for (i = 0; i < sn; i++) + S(i) += fix_mul(D_(i - 1) + D_(i), 3633); + for (i = 0; i < dn; i++) + D(i) = fix_mul(D(i), 5038); /*5038 */ + for (i = 0; i < sn; i++) + S(i) = fix_mul(S(i), 6659); /*6660 */ + } + } else { + if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */ + for (i = 0; i < dn; i++) + S(i) -= fix_mul(DD_(i) + DD_(i - 1), 12993); + for (i = 0; i < sn; i++) + D(i) -= fix_mul(SS_(i) + SS_(i + 1), 434); + for (i = 0; i < dn; i++) + S(i) += fix_mul(DD_(i) + DD_(i - 1), 7233); + for (i = 0; i < sn; i++) + D(i) += fix_mul(SS_(i) + SS_(i + 1), 3633); + for (i = 0; i < dn; i++) + S(i) = fix_mul(S(i), 5038); /*5038 */ + for (i = 0; i < sn; i++) + D(i) = fix_mul(D(i), 6659); /*6660 */ + } + } +} + +static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize) { + int p, n; + p = int_floorlog2(stepsize) - 13; + n = 11 - int_floorlog2(stepsize); + bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff; + bandno_stepsize->expn = numbps - p; +} + +/* +========================================================== + DWT interface +========================================================== +*/ + +/* */ +/* Forward 5-3 wavelet transform in 2-D. */ +/* */ +void dwt_encode(opj_tcd_tilecomp_t * tilec) { + int i, j, k; + int *a = NULL; + int *aj = NULL; + int *bj = NULL; + int w, l; + + w = tilec->x1-tilec->x0; + l = tilec->numresolutions-1; + a = tilec->data; + + for (i = 0; i < l; i++) { + int rw; /* width of the resolution level computed */ + int rh; /* height of the resolution level computed */ + int rw1; /* width of the resolution level once lower than computed one */ + int rh1; /* height of the resolution level once lower than computed one */ + int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ + int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ + int dn, sn; + + rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0; + rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0; + rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0; + rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0; + + cas_row = tilec->resolutions[l - i].x0 % 2; + cas_col = tilec->resolutions[l - i].y0 % 2; + + sn = rh1; + dn = rh - rh1; + bj = (int*)opj_malloc(rh * sizeof(int)); + for (j = 0; j < rw; j++) { + aj = a + j; + for (k = 0; k < rh; k++) bj[k] = aj[k*w]; + dwt_encode_1(bj, dn, sn, cas_col); + dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col); + } + opj_free(bj); + + sn = rw1; + dn = rw - rw1; + bj = (int*)opj_malloc(rw * sizeof(int)); + for (j = 0; j < rh; j++) { + aj = a + j * w; + for (k = 0; k < rw; k++) bj[k] = aj[k]; + dwt_encode_1(bj, dn, sn, cas_row); + dwt_deinterleave_h(bj, aj, dn, sn, cas_row); + } + opj_free(bj); + } +} + + +/* */ +/* Inverse 5-3 wavelet transform in 2-D. */ +/* */ +void dwt_decode(opj_tcd_tilecomp_t* tilec, int numres) { + dwt_decode_tile(tilec, numres, &dwt_decode_1); +} + + +/* */ +/* Get gain of 5-3 wavelet transform. */ +/* */ +int dwt_getgain(int orient) { + if (orient == 0) + return 0; + if (orient == 1 || orient == 2) + return 1; + return 2; +} + +/* */ +/* Get norm of 5-3 wavelet. */ +/* */ +double dwt_getnorm(int level, int orient) { + return dwt_norms[orient][level]; +} + +/* */ +/* Forward 9-7 wavelet transform in 2-D. */ +/* */ + +void dwt_encode_real(opj_tcd_tilecomp_t * tilec) { + int i, j, k; + int *a = NULL; + int *aj = NULL; + int *bj = NULL; + int w, l; + + w = tilec->x1-tilec->x0; + l = tilec->numresolutions-1; + a = tilec->data; + + for (i = 0; i < l; i++) { + int rw; /* width of the resolution level computed */ + int rh; /* height of the resolution level computed */ + int rw1; /* width of the resolution level once lower than computed one */ + int rh1; /* height of the resolution level once lower than computed one */ + int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ + int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ + int dn, sn; + + rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0; + rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0; + rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0; + rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0; + + cas_row = tilec->resolutions[l - i].x0 % 2; + cas_col = tilec->resolutions[l - i].y0 % 2; + + sn = rh1; + dn = rh - rh1; + bj = (int*)opj_malloc(rh * sizeof(int)); + for (j = 0; j < rw; j++) { + aj = a + j; + for (k = 0; k < rh; k++) bj[k] = aj[k*w]; + dwt_encode_1_real(bj, dn, sn, cas_col); + dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col); + } + opj_free(bj); + + sn = rw1; + dn = rw - rw1; + bj = (int*)opj_malloc(rw * sizeof(int)); + for (j = 0; j < rh; j++) { + aj = a + j * w; + for (k = 0; k < rw; k++) bj[k] = aj[k]; + dwt_encode_1_real(bj, dn, sn, cas_row); + dwt_deinterleave_h(bj, aj, dn, sn, cas_row); + } + opj_free(bj); + } +} + + +/* */ +/* Get gain of 9-7 wavelet transform. */ +/* */ +int dwt_getgain_real(int orient) { + (void)orient; + return 0; +} + +/* */ +/* Get norm of 9-7 wavelet. */ +/* */ +double dwt_getnorm_real(int level, int orient) { + return dwt_norms_real[orient][level]; +} + +void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec) { + int numbands, bandno; + numbands = 3 * tccp->numresolutions - 2; + for (bandno = 0; bandno < numbands; bandno++) { + double stepsize; + int resno, level, orient, gain; + + resno = (bandno == 0) ? 0 : ((bandno - 1) / 3 + 1); + orient = (bandno == 0) ? 0 : ((bandno - 1) % 3 + 1); + level = tccp->numresolutions - 1 - resno; + gain = (tccp->qmfbid == 0) ? 0 : ((orient == 0) ? 0 : (((orient == 1) || (orient == 2)) ? 1 : 2)); + if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { + stepsize = 1.0; + } else { + double norm = dwt_norms_real[orient][level]; + stepsize = (1 << (gain)) / norm; + } + dwt_encode_stepsize((int) floor(stepsize * 8192.0), prec + gain, &tccp->stepsizes[bandno]); + } +} + + +/* */ +/* Determine maximum computed resolution level for inverse wavelet transform */ +/* */ +static int dwt_decode_max_resolution(opj_tcd_resolution_t* restrict r, int i) { + int mr = 1; + int w; + while( --i ) { + r++; + if( mr < ( w = r->x1 - r->x0 ) ) + mr = w ; + if( mr < ( w = r->y1 - r->y0 ) ) + mr = w ; + } + return mr ; +} + + +/* */ +/* Inverse wavelet transform in 2-D. */ +/* */ +static void dwt_decode_tile(opj_tcd_tilecomp_t* tilec, int numres, DWT1DFN dwt_1D) { + dwt_t h; + dwt_t v; + + opj_tcd_resolution_t* tr = tilec->resolutions; + + int rw = tr->x1 - tr->x0; /* width of the resolution level computed */ + int rh = tr->y1 - tr->y0; /* height of the resolution level computed */ + + int w = tilec->x1 - tilec->x0; + + h.mem = (int*)opj_aligned_malloc(dwt_decode_max_resolution(tr, numres) * sizeof(int)); + v.mem = h.mem; + + while( --numres) { + int * restrict tiledp = tilec->data; + int j; + + ++tr; + h.sn = rw; + v.sn = rh; + + rw = tr->x1 - tr->x0; + rh = tr->y1 - tr->y0; + + h.dn = rw - h.sn; + h.cas = tr->x0 % 2; + + for(j = 0; j < rh; ++j) { + dwt_interleave_h(&h, &tiledp[j*w]); + (dwt_1D)(&h); + memcpy(&tiledp[j*w], h.mem, rw * sizeof(int)); + } + + v.dn = rh - v.sn; + v.cas = tr->y0 % 2; + + for(j = 0; j < rw; ++j){ + int k; + dwt_interleave_v(&v, &tiledp[j], w); + (dwt_1D)(&v); + for(k = 0; k < rh; ++k) { + tiledp[k * w + j] = v.mem[k]; + } + } + } + opj_aligned_free(h.mem); +} + +static void v4dwt_interleave_h(v4dwt_t* restrict w, float* restrict a, int x, int size){ + float* restrict bi = (float*) (w->wavelet + w->cas); + int count = w->sn; + int i, k; + for(k = 0; k < 2; ++k){ + if (count + 3 * x < size && ((size_t) a & 0x0f) == 0 && ((size_t) bi & 0x0f) == 0 && (x & 0x0f) == 0) { + /* Fast code path */ + for(i = 0; i < count; ++i){ + int j = i; + bi[i*8 ] = a[j]; + j += x; + bi[i*8 + 1] = a[j]; + j += x; + bi[i*8 + 2] = a[j]; + j += x; + bi[i*8 + 3] = a[j]; + } + } else { + /* Slow code path */ + for(i = 0; i < count; ++i){ + int j = i; + bi[i*8 ] = a[j]; + j += x; + if(j > size) continue; + bi[i*8 + 1] = a[j]; + j += x; + if(j > size) continue; + bi[i*8 + 2] = a[j]; + j += x; + if(j > size) continue; + bi[i*8 + 3] = a[j]; + } + } + bi = (float*) (w->wavelet + 1 - w->cas); + a += w->sn; + size -= w->sn; + count = w->dn; + } +} + +static void v4dwt_interleave_v(v4dwt_t* restrict v , float* restrict a , int x){ + v4* restrict bi = v->wavelet + v->cas; + int i; + for(i = 0; i < v->sn; ++i){ + memcpy(&bi[i*2], &a[i*x], 4 * sizeof(float)); + } + a += v->sn * x; + bi = v->wavelet + 1 - v->cas; + for(i = 0; i < v->dn; ++i){ + memcpy(&bi[i*2], &a[i*x], 4 * sizeof(float)); + } +} + +#ifdef __SSE__ + +static void v4dwt_decode_step1_sse(v4* w, int count, const __m128 c){ + __m128* restrict vw = (__m128*) w; + int i; + /* 4x unrolled loop */ + for(i = 0; i < count >> 2; ++i){ + *vw = _mm_mul_ps(*vw, c); + vw += 2; + *vw = _mm_mul_ps(*vw, c); + vw += 2; + *vw = _mm_mul_ps(*vw, c); + vw += 2; + *vw = _mm_mul_ps(*vw, c); + vw += 2; + } + count &= 3; + for(i = 0; i < count; ++i){ + *vw = _mm_mul_ps(*vw, c); + vw += 2; + } +} + +static void v4dwt_decode_step2_sse(v4* l, v4* w, int k, int m, __m128 c){ + __m128* restrict vl = (__m128*) l; + __m128* restrict vw = (__m128*) w; + int i; + __m128 tmp1, tmp2, tmp3; + tmp1 = vl[0]; + for(i = 0; i < m; ++i){ + tmp2 = vw[-1]; + tmp3 = vw[ 0]; + vw[-1] = _mm_add_ps(tmp2, _mm_mul_ps(_mm_add_ps(tmp1, tmp3), c)); + tmp1 = tmp3; + vw += 2; + } + vl = vw - 2; + if(m >= k){ + return; + } + c = _mm_add_ps(c, c); + c = _mm_mul_ps(c, vl[0]); + for(; m < k; ++m){ + __m128 tmp = vw[-1]; + vw[-1] = _mm_add_ps(tmp, c); + vw += 2; + } +} + +#else + +static void v4dwt_decode_step1(v4* w, int count, const float c){ + float* restrict fw = (float*) w; + int i; + for(i = 0; i < count; ++i){ + float tmp1 = fw[i*8 ]; + float tmp2 = fw[i*8 + 1]; + float tmp3 = fw[i*8 + 2]; + float tmp4 = fw[i*8 + 3]; + fw[i*8 ] = tmp1 * c; + fw[i*8 + 1] = tmp2 * c; + fw[i*8 + 2] = tmp3 * c; + fw[i*8 + 3] = tmp4 * c; + } +} + +static void v4dwt_decode_step2(v4* l, v4* w, int k, int m, float c){ + float* restrict fl = (float*) l; + float* restrict fw = (float*) w; + int i; + for(i = 0; i < m; ++i){ + float tmp1_1 = fl[0]; + float tmp1_2 = fl[1]; + float tmp1_3 = fl[2]; + float tmp1_4 = fl[3]; + float tmp2_1 = fw[-4]; + float tmp2_2 = fw[-3]; + float tmp2_3 = fw[-2]; + float tmp2_4 = fw[-1]; + float tmp3_1 = fw[0]; + float tmp3_2 = fw[1]; + float tmp3_3 = fw[2]; + float tmp3_4 = fw[3]; + fw[-4] = tmp2_1 + ((tmp1_1 + tmp3_1) * c); + fw[-3] = tmp2_2 + ((tmp1_2 + tmp3_2) * c); + fw[-2] = tmp2_3 + ((tmp1_3 + tmp3_3) * c); + fw[-1] = tmp2_4 + ((tmp1_4 + tmp3_4) * c); + fl = fw; + fw += 8; + } + if(m < k){ + float c1; + float c2; + float c3; + float c4; + c += c; + c1 = fl[0] * c; + c2 = fl[1] * c; + c3 = fl[2] * c; + c4 = fl[3] * c; + for(; m < k; ++m){ + float tmp1 = fw[-4]; + float tmp2 = fw[-3]; + float tmp3 = fw[-2]; + float tmp4 = fw[-1]; + fw[-4] = tmp1 + c1; + fw[-3] = tmp2 + c2; + fw[-2] = tmp3 + c3; + fw[-1] = tmp4 + c4; + fw += 8; + } + } +} + +#endif + +/* */ +/* Inverse 9-7 wavelet transform in 1-D. */ +/* */ +static void v4dwt_decode(v4dwt_t* restrict dwt){ + int a, b; + if(dwt->cas == 0) { + if(!((dwt->dn > 0) || (dwt->sn > 1))){ + return; + } + a = 0; + b = 1; + }else{ + if(!((dwt->sn > 0) || (dwt->dn > 1))) { + return; + } + a = 1; + b = 0; + } +#ifdef __SSE__ + v4dwt_decode_step1_sse(dwt->wavelet+a, dwt->sn, _mm_set1_ps(K)); + v4dwt_decode_step1_sse(dwt->wavelet+b, dwt->dn, _mm_set1_ps(c13318)); + v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(dwt_delta)); + v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(dwt_gamma)); + v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(dwt_beta)); + v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(dwt_alpha)); +#else + v4dwt_decode_step1(dwt->wavelet+a, dwt->sn, K); + v4dwt_decode_step1(dwt->wavelet+b, dwt->dn, c13318); + v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), dwt_delta); + v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), dwt_gamma); + v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), dwt_beta); + v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), dwt_alpha); +#endif +} + +/* */ +/* Inverse 9-7 wavelet transform in 2-D. */ +/* */ +void dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, int numres){ + v4dwt_t h; + v4dwt_t v; + + opj_tcd_resolution_t* res = tilec->resolutions; + + int rw = res->x1 - res->x0; /* width of the resolution level computed */ + int rh = res->y1 - res->y0; /* height of the resolution level computed */ + + int w = tilec->x1 - tilec->x0; + + h.wavelet = (v4*) opj_aligned_malloc((dwt_decode_max_resolution(res, numres)+5) * sizeof(v4)); + v.wavelet = h.wavelet; + + while( --numres) { + float * restrict aj = (float*) tilec->data; + int bufsize = (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0); + int j; + + h.sn = rw; + v.sn = rh; + + ++res; + + rw = res->x1 - res->x0; /* width of the resolution level computed */ + rh = res->y1 - res->y0; /* height of the resolution level computed */ + + h.dn = rw - h.sn; + h.cas = res->x0 % 2; + + for(j = rh; j > 3; j -= 4){ + int k; + v4dwt_interleave_h(&h, aj, w, bufsize); + v4dwt_decode(&h); + for(k = rw; --k >= 0;){ + aj[k ] = h.wavelet[k].f[0]; + aj[k+w ] = h.wavelet[k].f[1]; + aj[k+w*2] = h.wavelet[k].f[2]; + aj[k+w*3] = h.wavelet[k].f[3]; + } + aj += w*4; + bufsize -= w*4; + } + if (rh & 0x03) { + int k; + j = rh & 0x03; + v4dwt_interleave_h(&h, aj, w, bufsize); + v4dwt_decode(&h); + for(k = rw; --k >= 0;){ + switch(j) { + case 3: aj[k+w*2] = h.wavelet[k].f[2]; + case 2: aj[k+w ] = h.wavelet[k].f[1]; + case 1: aj[k ] = h.wavelet[k].f[0]; + } + } + } + + v.dn = rh - v.sn; + v.cas = res->y0 % 2; + + aj = (float*) tilec->data; + for(j = rw; j > 3; j -= 4){ + int k; + v4dwt_interleave_v(&v, aj, w); + v4dwt_decode(&v); + for(k = 0; k < rh; ++k){ + memcpy(&aj[k*w], &v.wavelet[k], 4 * sizeof(float)); + } + aj += 4; + } + if (rw & 0x03){ + int k; + j = rw & 0x03; + v4dwt_interleave_v(&v, aj, w); + v4dwt_decode(&v); + for(k = 0; k < rh; ++k){ + memcpy(&aj[k*w], &v.wavelet[k], j * sizeof(float)); + } + } + } + + opj_aligned_free(h.wavelet); +} + diff --git a/openjpeg-dotnet/libopenjpeg/dwt.h b/openjpeg-dotnet/libopenjpeg/dwt.h index c67c4563..adf73e54 100644 --- a/openjpeg-dotnet/libopenjpeg/dwt.h +++ b/openjpeg-dotnet/libopenjpeg/dwt.h @@ -1,113 +1,113 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#ifndef __DWT_H -#define __DWT_H -/** -@file dwt.h -@brief Implementation of a discrete wavelet transform (DWT) - -The functions in DWT.C have for goal to realize forward and inverse discret wavelet -transform with filter 5-3 (reversible) and filter 9-7 (irreversible). The functions in -DWT.C are used by some function in TCD.C. -*/ - -/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */ -/*@{*/ - - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Forward 5-3 wavelet tranform in 2-D. -Apply a reversible DWT transform to a component of an image. -@param tilec Tile component information (current tile) -*/ -void dwt_encode(opj_tcd_tilecomp_t * tilec); -/** -Inverse 5-3 wavelet tranform in 2-D. -Apply a reversible inverse DWT transform to a component of an image. -@param tilec Tile component information (current tile) -@param numres Number of resolution levels to decode -*/ -void dwt_decode(opj_tcd_tilecomp_t* tilec, int numres); -/** -Get the gain of a subband for the reversible 5-3 DWT. -@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH) -@return Returns 0 if orient = 0, returns 1 if orient = 1 or 2, returns 2 otherwise -*/ -int dwt_getgain(int orient); -/** -Get the norm of a wavelet function of a subband at a specified level for the reversible 5-3 DWT. -@param level Level of the wavelet function -@param orient Band of the wavelet function -@return Returns the norm of the wavelet function -*/ -double dwt_getnorm(int level, int orient); -/** -Forward 9-7 wavelet transform in 2-D. -Apply an irreversible DWT transform to a component of an image. -@param tilec Tile component information (current tile) -*/ -void dwt_encode_real(opj_tcd_tilecomp_t * tilec); -/** -Inverse 9-7 wavelet transform in 2-D. -Apply an irreversible inverse DWT transform to a component of an image. -@param tilec Tile component information (current tile) -@param numres Number of resolution levels to decode -*/ -void dwt_decode_real(opj_tcd_tilecomp_t* tilec, int numres); -/** -Get the gain of a subband for the irreversible 9-7 DWT. -@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH) -@return Returns the gain of the 9-7 wavelet transform -*/ -int dwt_getgain_real(int orient); -/** -Get the norm of a wavelet function of a subband at a specified level for the irreversible 9-7 DWT -@param level Level of the wavelet function -@param orient Band of the wavelet function -@return Returns the norm of the 9-7 wavelet -*/ -double dwt_getnorm_real(int level, int orient); -/** -Explicit calculation of the Quantization Stepsizes -@param tccp Tile-component coding parameters -@param prec Precint analyzed -*/ -void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __DWT_H */ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#ifndef __DWT_H +#define __DWT_H +/** +@file dwt.h +@brief Implementation of a discrete wavelet transform (DWT) + +The functions in DWT.C have for goal to realize forward and inverse discret wavelet +transform with filter 5-3 (reversible) and filter 9-7 (irreversible). The functions in +DWT.C are used by some function in TCD.C. +*/ + +/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */ +/*@{*/ + + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Forward 5-3 wavelet tranform in 2-D. +Apply a reversible DWT transform to a component of an image. +@param tilec Tile component information (current tile) +*/ +void dwt_encode(opj_tcd_tilecomp_t * tilec); +/** +Inverse 5-3 wavelet tranform in 2-D. +Apply a reversible inverse DWT transform to a component of an image. +@param tilec Tile component information (current tile) +@param numres Number of resolution levels to decode +*/ +void dwt_decode(opj_tcd_tilecomp_t* tilec, int numres); +/** +Get the gain of a subband for the reversible 5-3 DWT. +@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH) +@return Returns 0 if orient = 0, returns 1 if orient = 1 or 2, returns 2 otherwise +*/ +int dwt_getgain(int orient); +/** +Get the norm of a wavelet function of a subband at a specified level for the reversible 5-3 DWT. +@param level Level of the wavelet function +@param orient Band of the wavelet function +@return Returns the norm of the wavelet function +*/ +double dwt_getnorm(int level, int orient); +/** +Forward 9-7 wavelet transform in 2-D. +Apply an irreversible DWT transform to a component of an image. +@param tilec Tile component information (current tile) +*/ +void dwt_encode_real(opj_tcd_tilecomp_t * tilec); +/** +Inverse 9-7 wavelet transform in 2-D. +Apply an irreversible inverse DWT transform to a component of an image. +@param tilec Tile component information (current tile) +@param numres Number of resolution levels to decode +*/ +void dwt_decode_real(opj_tcd_tilecomp_t* tilec, int numres); +/** +Get the gain of a subband for the irreversible 9-7 DWT. +@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH) +@return Returns the gain of the 9-7 wavelet transform +*/ +int dwt_getgain_real(int orient); +/** +Get the norm of a wavelet function of a subband at a specified level for the irreversible 9-7 DWT +@param level Level of the wavelet function +@param orient Band of the wavelet function +@return Returns the norm of the 9-7 wavelet +*/ +double dwt_getnorm_real(int level, int orient); +/** +Explicit calculation of the Quantization Stepsizes +@param tccp Tile-component coding parameters +@param prec Precint analyzed +*/ +void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __DWT_H */ diff --git a/openjpeg-dotnet/libopenjpeg/event.c b/openjpeg-dotnet/libopenjpeg/event.c index fbb81f65..0dc22f12 100644 --- a/openjpeg-dotnet/libopenjpeg/event.c +++ b/openjpeg-dotnet/libopenjpeg/event.c @@ -1,121 +1,122 @@ -/* - * Copyright (c) 2005, Hervé Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#include "opj_includes.h" - -/* ========================================================== - Utility functions - ==========================================================*/ - -#if !defined(_MSC_VER) && !defined(__MINGW32__) -static char* -i2a(unsigned i, char *a, unsigned r) { - if (i/r > 0) a = i2a(i/r,a,r); - *a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i%r]; - return a+1; -} - -/** - Transforms integer i into an ascii string and stores the result in a; - string is encoded in the base indicated by r. - @param i Number to be converted - @param a String result - @param r Base of value; must be in the range 2 - 36 - @return Returns a -*/ -static char * -_itoa(int i, char *a, int r) { - r = ((r < 2) || (r > 36)) ? 10 : r; - if(i < 0) { - *a = '-'; - *i2a(-i, a+1, r) = 0; - } - else *i2a(i, a, r) = 0; - return a; -} - -#endif /* !WIN32 */ - -/* ----------------------------------------------------------------------- */ - -opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context) { - if(cinfo) { - opj_event_mgr_t *previous = cinfo->event_mgr; - cinfo->event_mgr = event_mgr; - cinfo->client_data = context; - return previous; - } - - return NULL; -} - -bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...) { -#define MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */ - opj_msg_callback msg_handler = NULL; - - opj_event_mgr_t *event_mgr = cinfo->event_mgr; - if(event_mgr != NULL) { - switch(event_type) { - case EVT_ERROR: - msg_handler = event_mgr->error_handler; - break; - case EVT_WARNING: - msg_handler = event_mgr->warning_handler; - break; - case EVT_INFO: - msg_handler = event_mgr->info_handler; - break; - default: - break; - } - if(msg_handler == NULL) { - return false; - } - } else { - return false; - } - - if ((fmt != NULL) && (event_mgr != NULL)) { - va_list arg; - int str_length/*, i, j*/; /* UniPG */ - char message[MSG_SIZE]; - memset(message, 0, MSG_SIZE); - /* initialize the optional parameter list */ - va_start(arg, fmt); - /* check the length of the format string */ - str_length = (strlen(fmt) > MSG_SIZE) ? MSG_SIZE : strlen(fmt); - /* parse the format string and put the result in 'message' */ - vsprintf(message, fmt, arg); /* UniPG */ - /* deinitialize the optional parameter list */ - va_end(arg); - - /* output the message to the user program */ - msg_handler(message, cinfo->client_data); - } - - return true; -} - +/* + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#include "opj_includes.h" + +/* ========================================================== + Utility functions + ==========================================================*/ + +#ifdef OPJ_CODE_NOT_USED +#ifndef _WIN32 +static char* +i2a(unsigned i, char *a, unsigned r) { + if (i/r > 0) a = i2a(i/r,a,r); + *a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i%r]; + return a+1; +} + +/** + Transforms integer i into an ascii string and stores the result in a; + string is encoded in the base indicated by r. + @param i Number to be converted + @param a String result + @param r Base of value; must be in the range 2 - 36 + @return Returns a +*/ +static char * +_itoa(int i, char *a, int r) { + r = ((r < 2) || (r > 36)) ? 10 : r; + if(i < 0) { + *a = '-'; + *i2a(-i, a+1, r) = 0; + } + else *i2a(i, a, r) = 0; + return a; +} + +#endif /* !_WIN32 */ +#endif +/* ----------------------------------------------------------------------- */ + +opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context) { + if(cinfo) { + opj_event_mgr_t *previous = cinfo->event_mgr; + cinfo->event_mgr = event_mgr; + cinfo->client_data = context; + return previous; + } + + return NULL; +} + +opj_bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...) { +#define MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */ + opj_msg_callback msg_handler = NULL; + + opj_event_mgr_t *event_mgr = cinfo->event_mgr; + if(event_mgr != NULL) { + switch(event_type) { + case EVT_ERROR: + msg_handler = event_mgr->error_handler; + break; + case EVT_WARNING: + msg_handler = event_mgr->warning_handler; + break; + case EVT_INFO: + msg_handler = event_mgr->info_handler; + break; + default: + break; + } + if(msg_handler == NULL) { + return OPJ_FALSE; + } + } else { + return OPJ_FALSE; + } + + if ((fmt != NULL) && (event_mgr != NULL)) { + va_list arg; + int str_length/*, i, j*/; /* UniPG */ + char message[MSG_SIZE]; + memset(message, 0, MSG_SIZE); + /* initialize the optional parameter list */ + va_start(arg, fmt); + /* check the length of the format string */ + str_length = (strlen(fmt) > MSG_SIZE) ? MSG_SIZE : strlen(fmt); + /* parse the format string and put the result in 'message' */ + vsprintf(message, fmt, arg); /* UniPG */ + /* deinitialize the optional parameter list */ + va_end(arg); + + /* output the message to the user program */ + msg_handler(message, cinfo->client_data); + } + + return OPJ_TRUE; +} + diff --git a/openjpeg-dotnet/libopenjpeg/event.h b/openjpeg-dotnet/libopenjpeg/event.h index 06b17a4a..9c59787c 100644 --- a/openjpeg-dotnet/libopenjpeg/event.h +++ b/openjpeg-dotnet/libopenjpeg/event.h @@ -1,58 +1,58 @@ -/* - * Copyright (c) 2005, Hervé Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ -#ifndef __EVENT_H -#define __EVENT_H -/** -@file event.h -@brief Implementation of a event callback system - -The functions in EVENT.C have for goal to send output messages (errors, warnings, debug) to the user. -*/ - -#define EVT_ERROR 1 /**< Error event type */ -#define EVT_WARNING 2 /**< Warning event type */ -#define EVT_INFO 4 /**< Debug event type */ - -/** @defgroup EVENT EVENT - Implementation of a event callback system */ -/*@{*/ - -/** @name Exported functions (see also openjpeg.h) */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Write formatted data to a string and send the string to a user callback. -@param cinfo Codec context info -@param event_type Event type or callback to use to send the message -@param fmt Format-control string (plus optionnal arguments) -@return Returns true if successful, returns false otherwise -*/ -bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __EVENT_H */ +/* + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ +#ifndef __EVENT_H +#define __EVENT_H +/** +@file event.h +@brief Implementation of a event callback system + +The functions in EVENT.C have for goal to send output messages (errors, warnings, debug) to the user. +*/ + +#define EVT_ERROR 1 /**< Error event type */ +#define EVT_WARNING 2 /**< Warning event type */ +#define EVT_INFO 4 /**< Debug event type */ + +/** @defgroup EVENT EVENT - Implementation of a event callback system */ +/*@{*/ + +/** @name Exported functions (see also openjpeg.h) */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Write formatted data to a string and send the string to a user callback. +@param cinfo Codec context info +@param event_type Event type or callback to use to send the message +@param fmt Format-control string (plus optionnal arguments) +@return Returns true if successful, returns false otherwise +*/ +opj_bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __EVENT_H */ diff --git a/openjpeg-dotnet/libopenjpeg/fix.h b/openjpeg-dotnet/libopenjpeg/fix.h index 01716d42..bcb2acb5 100644 --- a/openjpeg-dotnet/libopenjpeg/fix.h +++ b/openjpeg-dotnet/libopenjpeg/fix.h @@ -1,64 +1,64 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ -#ifndef __FIX_H -#define __FIX_H - -#if defined(_MSC_VER) || defined(__BORLANDC__) -#define int64 __int64 -#else -#define int64 long long -#endif - -/** -@file fix.h -@brief Implementation of operations of specific multiplication (FIX) - -The functions in FIX.H have for goal to realize specific multiplication. -*/ - -/** @defgroup FIX FIX - Implementation of operations of specific multiplication */ -/*@{*/ - -/** -Multiply two fixed-precision rational numbers. -@param a -@param b -@return Returns a * b -*/ -static INLINE int fix_mul(int a, int b) { - int64 temp = (int64) a * (int64) b ; - temp += temp & 4096; - return (int) (temp >> 13) ; -} - -/*@}*/ - -#endif /* __FIX_H */ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ +#ifndef __FIX_H +#define __FIX_H + +#if defined(_MSC_VER) || defined(__BORLANDC__) +#define int64 __int64 +#else +#define int64 long long +#endif + +/** +@file fix.h +@brief Implementation of operations of specific multiplication (FIX) + +The functions in FIX.H have for goal to realize specific multiplication. +*/ + +/** @defgroup FIX FIX - Implementation of operations of specific multiplication */ +/*@{*/ + +/** +Multiply two fixed-precision rational numbers. +@param a +@param b +@return Returns a * b +*/ +static INLINE int fix_mul(int a, int b) { + int64 temp = (int64) a * (int64) b ; + temp += temp & 4096; + return (int) (temp >> 13) ; +} + +/*@}*/ + +#endif /* __FIX_H */ diff --git a/openjpeg-dotnet/libopenjpeg/image.c b/openjpeg-dotnet/libopenjpeg/image.c index 5a058597..a4d2c010 100644 --- a/openjpeg-dotnet/libopenjpeg/image.c +++ b/openjpeg-dotnet/libopenjpeg/image.c @@ -1,92 +1,89 @@ -/* - * Copyright (c) 2005, Hervé Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#include "opj_includes.h" - -opj_image_t* opj_image_create0(void) { - opj_image_t *image = (opj_image_t*)opj_calloc(1, sizeof(opj_image_t)); - return image; -} - -opj_image_t* OPJ_CALLCONV opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) { - int compno; - opj_image_t *image = NULL; - - image = (opj_image_t*) opj_calloc(1, sizeof(opj_image_t)); - /* NOTE: HACK: fixes occasional crash during decode. WHY? */ - image->comps = NULL; - - if(image) { - image->color_space = clrspc; - image->numcomps = numcmpts; - /* allocate memory for the per-component information */ - image->comps = (opj_image_comp_t*)opj_malloc(image->numcomps * sizeof(opj_image_comp_t)); - if(!image->comps) { - fprintf(stderr,"Unable to allocate memory for image.\n"); - opj_image_destroy(image); - return NULL; - } - /* create the individual image components */ - for(compno = 0; compno < numcmpts; compno++) { - opj_image_comp_t *comp = &image->comps[compno]; - comp->dx = cmptparms[compno].dx; - comp->dy = cmptparms[compno].dy; - comp->w = cmptparms[compno].w; - comp->h = cmptparms[compno].h; - comp->x0 = cmptparms[compno].x0; - comp->y0 = cmptparms[compno].y0; - comp->prec = cmptparms[compno].prec; - comp->bpp = cmptparms[compno].bpp; - comp->sgnd = cmptparms[compno].sgnd; - comp->data = (int*) opj_calloc(comp->w * comp->h, sizeof(int)); - if(!comp->data) { - fprintf(stderr,"Unable to allocate memory for image.\n"); - opj_image_destroy(image); - return NULL; - } - } - } - - return image; -} - -void OPJ_CALLCONV opj_image_destroy(opj_image_t *image) { - int i; - if(image) { - if(image->comps) { - /* image components */ - for(i = 0; i < image->numcomps; i++) { - opj_image_comp_t *image_comp = &image->comps[i]; - if(image_comp->data) { - opj_free(image_comp->data); - } - } - opj_free(image->comps); - } - opj_free(image); - } -} - +/* + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#include "opj_includes.h" + +opj_image_t* opj_image_create0(void) { + opj_image_t *image = (opj_image_t*)opj_calloc(1, sizeof(opj_image_t)); + return image; +} + +opj_image_t* OPJ_CALLCONV opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) { + int compno; + opj_image_t *image = NULL; + + image = (opj_image_t*) opj_calloc(1, sizeof(opj_image_t)); + if(image) { + image->color_space = clrspc; + image->numcomps = numcmpts; + /* allocate memory for the per-component information */ + image->comps = (opj_image_comp_t*)opj_malloc(image->numcomps * sizeof(opj_image_comp_t)); + if(!image->comps) { + fprintf(stderr,"Unable to allocate memory for image.\n"); + opj_image_destroy(image); + return NULL; + } + /* create the individual image components */ + for(compno = 0; compno < numcmpts; compno++) { + opj_image_comp_t *comp = &image->comps[compno]; + comp->dx = cmptparms[compno].dx; + comp->dy = cmptparms[compno].dy; + comp->w = cmptparms[compno].w; + comp->h = cmptparms[compno].h; + comp->x0 = cmptparms[compno].x0; + comp->y0 = cmptparms[compno].y0; + comp->prec = cmptparms[compno].prec; + comp->bpp = cmptparms[compno].bpp; + comp->sgnd = cmptparms[compno].sgnd; + comp->data = (int*) opj_calloc(comp->w * comp->h, sizeof(int)); + if(!comp->data) { + fprintf(stderr,"Unable to allocate memory for image.\n"); + opj_image_destroy(image); + return NULL; + } + } + } + + return image; +} + +void OPJ_CALLCONV opj_image_destroy(opj_image_t *image) { + int i; + if(image) { + if(image->comps) { + /* image components */ + for(i = 0; i < image->numcomps; i++) { + opj_image_comp_t *image_comp = &image->comps[i]; + if(image_comp->data) { + opj_free(image_comp->data); + } + } + opj_free(image->comps); + } + opj_free(image); + } +} + diff --git a/openjpeg-dotnet/libopenjpeg/image.h b/openjpeg-dotnet/libopenjpeg/image.h index e22c40b3..f828b5b7 100644 --- a/openjpeg-dotnet/libopenjpeg/image.h +++ b/openjpeg-dotnet/libopenjpeg/image.h @@ -1,48 +1,48 @@ -/* - * Copyright (c) 2005, Hervé Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ -#ifndef __IMAGE_H -#define __IMAGE_H -/** -@file image.h -@brief Implementation of operations on images (IMAGE) - -The functions in IMAGE.C have for goal to realize operations on images. -*/ - -/** @defgroup IMAGE IMAGE - Implementation of operations on images */ -/*@{*/ - -/** -Create an empty image -@todo this function should be removed -@return returns an empty image if successful, returns NULL otherwise -*/ -opj_image_t* opj_image_create0(void); - -/*@}*/ - -#endif /* __IMAGE_H */ - +/* + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ +#ifndef __IMAGE_H +#define __IMAGE_H +/** +@file image.h +@brief Implementation of operations on images (IMAGE) + +The functions in IMAGE.C have for goal to realize operations on images. +*/ + +/** @defgroup IMAGE IMAGE - Implementation of operations on images */ +/*@{*/ + +/** +Create an empty image +@todo this function should be removed +@return returns an empty image if successful, returns NULL otherwise +*/ +opj_image_t* opj_image_create0(void); + +/*@}*/ + +#endif /* __IMAGE_H */ + diff --git a/openjpeg-dotnet/libopenjpeg/int.h b/openjpeg-dotnet/libopenjpeg/int.h index b650075f..4e5fe08e 100644 --- a/openjpeg-dotnet/libopenjpeg/int.h +++ b/openjpeg-dotnet/libopenjpeg/int.h @@ -1,119 +1,119 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ -#ifndef __INT_H -#define __INT_H -/** -@file int.h -@brief Implementation of operations on integers (INT) - -The functions in INT.H have for goal to realize operations on integers. -*/ - -/** @defgroup INT INT - Implementation of operations on integers */ -/*@{*/ - -/** @name Exported functions (see also openjpeg.h) */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Get the minimum of two integers -@return Returns a if a < b else b -*/ -static INLINE int int_min(int a, int b) { - return a < b ? a : b; -} -/** -Get the maximum of two integers -@return Returns a if a > b else b -*/ -static INLINE int int_max(int a, int b) { - return (a > b) ? a : b; -} -/** -Clamp an integer inside an interval -@return -
    -
  • Returns a if (min < a < max) -
  • Returns max if (a > max) -
  • Returns min if (a < min) -
-*/ -static INLINE int int_clamp(int a, int min, int max) { - if (a < min) - return min; - if (a > max) - return max; - return a; -} -/** -@return Get absolute value of integer -*/ -static INLINE int int_abs(int a) { - return a < 0 ? -a : a; -} -/** -Divide an integer and round upwards -@return Returns a divided by b -*/ -static INLINE int int_ceildiv(int a, int b) { - return (a + b - 1) / b; -} -/** -Divide an integer by a power of 2 and round upwards -@return Returns a divided by 2^b -*/ -static INLINE int int_ceildivpow2(int a, int b) { - return (a + (1 << b) - 1) >> b; -} -/** -Divide an integer by a power of 2 and round downwards -@return Returns a divided by 2^b -*/ -static INLINE int int_floordivpow2(int a, int b) { - return a >> b; -} -/** -Get logarithm of an integer and round downwards -@return Returns log2(a) -*/ -static INLINE int int_floorlog2(int a) { - int l; - for (l = 0; a > 1; l++) { - a >>= 1; - } - return l; -} -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ +#ifndef __INT_H +#define __INT_H +/** +@file int.h +@brief Implementation of operations on integers (INT) + +The functions in INT.H have for goal to realize operations on integers. +*/ + +/** @defgroup INT INT - Implementation of operations on integers */ +/*@{*/ + +/** @name Exported functions (see also openjpeg.h) */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Get the minimum of two integers +@return Returns a if a < b else b +*/ +static INLINE int int_min(int a, int b) { + return a < b ? a : b; +} +/** +Get the maximum of two integers +@return Returns a if a > b else b +*/ +static INLINE int int_max(int a, int b) { + return (a > b) ? a : b; +} +/** +Clamp an integer inside an interval +@return +
    +
  • Returns a if (min < a < max) +
  • Returns max if (a > max) +
  • Returns min if (a < min) +
+*/ +static INLINE int int_clamp(int a, int min, int max) { + if (a < min) + return min; + if (a > max) + return max; + return a; +} +/** +@return Get absolute value of integer +*/ +static INLINE int int_abs(int a) { + return a < 0 ? -a : a; +} +/** +Divide an integer and round upwards +@return Returns a divided by b +*/ +static INLINE int int_ceildiv(int a, int b) { + return (a + b - 1) / b; +} +/** +Divide an integer by a power of 2 and round upwards +@return Returns a divided by 2^b +*/ +static INLINE int int_ceildivpow2(int a, int b) { + return (a + (1 << b) - 1) >> b; +} +/** +Divide an integer by a power of 2 and round downwards +@return Returns a divided by 2^b +*/ +static INLINE int int_floordivpow2(int a, int b) { + return a >> b; +} +/** +Get logarithm of an integer and round downwards +@return Returns log2(a) +*/ +static INLINE int int_floorlog2(int a) { + int l; + for (l = 0; a > 1; l++) { + a >>= 1; + } + return l; +} +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif diff --git a/openjpeg-dotnet/libopenjpeg/j2k.c b/openjpeg-dotnet/libopenjpeg/j2k.c index e9c28e0b..d34c75fa 100644 --- a/openjpeg-dotnet/libopenjpeg/j2k.c +++ b/openjpeg-dotnet/libopenjpeg/j2k.c @@ -1,2498 +1,2534 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2006-2007, Parvatha Elangovan - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#include "opj_includes.h" - -/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -/** -Write the SOC marker (Start Of Codestream) -@param j2k J2K handle -*/ -static void j2k_write_soc(opj_j2k_t *j2k); -/** -Read the SOC marker (Start of Codestream) -@param j2k J2K handle -*/ -static void j2k_read_soc(opj_j2k_t *j2k); -/** -Write the SIZ marker (image and tile size) -@param j2k J2K handle -*/ -static void j2k_write_siz(opj_j2k_t *j2k); -/** -Read the SIZ marker (image and tile size) -@param j2k J2K handle -*/ -static void j2k_read_siz(opj_j2k_t *j2k); -/** -Write the COM marker (comment) -@param j2k J2K handle -*/ -static void j2k_write_com(opj_j2k_t *j2k); -/** -Read the COM marker (comment) -@param j2k J2K handle -*/ -static void j2k_read_com(opj_j2k_t *j2k); -/** -Write the value concerning the specified component in the marker COD and COC -@param j2k J2K handle -@param compno Number of the component concerned by the information written -*/ -static void j2k_write_cox(opj_j2k_t *j2k, int compno); -/** -Read the value concerning the specified component in the marker COD and COC -@param j2k J2K handle -@param compno Number of the component concerned by the information read -*/ -static void j2k_read_cox(opj_j2k_t *j2k, int compno); -/** -Write the COD marker (coding style default) -@param j2k J2K handle -*/ -static void j2k_write_cod(opj_j2k_t *j2k); -/** -Read the COD marker (coding style default) -@param j2k J2K handle -*/ -static void j2k_read_cod(opj_j2k_t *j2k); -/** -Write the COC marker (coding style component) -@param j2k J2K handle -@param compno Number of the component concerned by the information written -*/ -static void j2k_write_coc(opj_j2k_t *j2k, int compno); -/** -Read the COC marker (coding style component) -@param j2k J2K handle -*/ -static void j2k_read_coc(opj_j2k_t *j2k); -/** -Write the value concerning the specified component in the marker QCD and QCC -@param j2k J2K handle -@param compno Number of the component concerned by the information written -*/ -static void j2k_write_qcx(opj_j2k_t *j2k, int compno); -/** -Read the value concerning the specified component in the marker QCD and QCC -@param j2k J2K handle -@param compno Number of the component concern by the information read -@param len Length of the information in the QCX part of the marker QCD/QCC -*/ -static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len); -/** -Write the QCD marker (quantization default) -@param j2k J2K handle -*/ -static void j2k_write_qcd(opj_j2k_t *j2k); -/** -Read the QCD marker (quantization default) -@param j2k J2K handle -*/ -static void j2k_read_qcd(opj_j2k_t *j2k); -/** -Write the QCC marker (quantization component) -@param j2k J2K handle -@param compno Number of the component concerned by the information written -*/ -static void j2k_write_qcc(opj_j2k_t *j2k, int compno); -/** -Read the QCC marker (quantization component) -@param j2k J2K handle -*/ -static void j2k_read_qcc(opj_j2k_t *j2k); -/** -Write the POC marker (progression order change) -@param j2k J2K handle -*/ -static void j2k_write_poc(opj_j2k_t *j2k); -/** -Read the POC marker (progression order change) -@param j2k J2K handle -*/ -static void j2k_read_poc(opj_j2k_t *j2k); -/** -Read the CRG marker (component registration) -@param j2k J2K handle -*/ -static void j2k_read_crg(opj_j2k_t *j2k); -/** -Read the TLM marker (tile-part lengths) -@param j2k J2K handle -*/ -static void j2k_read_tlm(opj_j2k_t *j2k); -/** -Read the PLM marker (packet length, main header) -@param j2k J2K handle -*/ -static void j2k_read_plm(opj_j2k_t *j2k); -/** -Read the PLT marker (packet length, tile-part header) -@param j2k J2K handle -*/ -static void j2k_read_plt(opj_j2k_t *j2k); -/** -Read the PPM marker (packet packet headers, main header) -@param j2k J2K handle -*/ -static void j2k_read_ppm(opj_j2k_t *j2k); -/** -Read the PPT marker (packet packet headers, tile-part header) -@param j2k J2K handle -*/ -static void j2k_read_ppt(opj_j2k_t *j2k); -/** -Write the TLM marker (Mainheader) -@param j2k J2K handle -*/ -static void j2k_write_tlm(opj_j2k_t *j2k); -/** -Write the SOT marker (start of tile-part) -@param j2k J2K handle -*/ -static void j2k_write_sot(opj_j2k_t *j2k); -/** -Read the SOT marker (start of tile-part) -@param j2k J2K handle -*/ -static void j2k_read_sot(opj_j2k_t *j2k); -/** -Write the SOD marker (start of data) -@param j2k J2K handle -@param tile_coder Pointer to a TCD handle -*/ -static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder); -/** -Read the SOD marker (start of data) -@param j2k J2K handle -*/ -static void j2k_read_sod(opj_j2k_t *j2k); -/** -Write the RGN marker (region-of-interest) -@param j2k J2K handle -@param compno Number of the component concerned by the information written -@param tileno Number of the tile concerned by the information written -*/ -static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno); -/** -Read the RGN marker (region-of-interest) -@param j2k J2K handle -*/ -static void j2k_read_rgn(opj_j2k_t *j2k); -/** -Write the EOC marker (end of codestream) -@param j2k J2K handle -*/ -static void j2k_write_eoc(opj_j2k_t *j2k); -/** -Read the EOC marker (end of codestream) -@param j2k J2K handle -*/ -static void j2k_read_eoc(opj_j2k_t *j2k); -/** -Read an unknown marker -@param j2k J2K handle -*/ -static void j2k_read_unk(opj_j2k_t *j2k); - -/*@}*/ - -/*@}*/ - -/* ----------------------------------------------------------------------- */ -typedef struct j2k_prog_order{ - OPJ_PROG_ORDER enum_prog; - char str_prog[4]; -}j2k_prog_order_t; - -j2k_prog_order_t j2k_prog_order_list[] = { - {CPRL, "CPRL"}, - {LRCP, "LRCP"}, - {PCRL, "PCRL"}, - {RLCP, "RLCP"}, - {RPCL, "RPCL"}, - {-1, ""} -}; - -char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order){ - j2k_prog_order_t *po; - for(po = j2k_prog_order_list; po->enum_prog != -1; po++ ){ - if(po->enum_prog == prg_order){ - break; - } - } - return po->str_prog; -} - -void j2k_dump_image(FILE *fd, opj_image_t * img) { - int compno; - fprintf(fd, "image {\n"); - fprintf(fd, " x0=%d, y0=%d, x1=%d, y1=%d\n", img->x0, img->y0, img->x1, img->y1); - fprintf(fd, " numcomps=%d\n", img->numcomps); - for (compno = 0; compno < img->numcomps; compno++) { - opj_image_comp_t *comp = &img->comps[compno]; - fprintf(fd, " comp %d {\n", compno); - fprintf(fd, " dx=%d, dy=%d\n", comp->dx, comp->dy); - fprintf(fd, " prec=%d\n", comp->prec); - fprintf(fd, " sgnd=%d\n", comp->sgnd); - fprintf(fd, " }\n"); - } - fprintf(fd, "}\n"); -} - -void j2k_dump_cp(FILE *fd, opj_image_t * img, opj_cp_t * cp) { - int tileno, compno, layno, bandno, resno, numbands; - fprintf(fd, "coding parameters {\n"); - fprintf(fd, " tx0=%d, ty0=%d\n", cp->tx0, cp->ty0); - fprintf(fd, " tdx=%d, tdy=%d\n", cp->tdx, cp->tdy); - fprintf(fd, " tw=%d, th=%d\n", cp->tw, cp->th); - for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { - opj_tcp_t *tcp = &cp->tcps[tileno]; - fprintf(fd, " tile %d {\n", tileno); - fprintf(fd, " csty=%x\n", tcp->csty); - fprintf(fd, " prg=%d\n", tcp->prg); - fprintf(fd, " numlayers=%d\n", tcp->numlayers); - fprintf(fd, " mct=%d\n", tcp->mct); - fprintf(fd, " rates="); - for (layno = 0; layno < tcp->numlayers; layno++) { - fprintf(fd, "%.1f ", tcp->rates[layno]); - } - fprintf(fd, "\n"); - for (compno = 0; compno < img->numcomps; compno++) { - opj_tccp_t *tccp = &tcp->tccps[compno]; - fprintf(fd, " comp %d {\n", compno); - fprintf(fd, " csty=%x\n", tccp->csty); - fprintf(fd, " numresolutions=%d\n", tccp->numresolutions); - fprintf(fd, " cblkw=%d\n", tccp->cblkw); - fprintf(fd, " cblkh=%d\n", tccp->cblkh); - fprintf(fd, " cblksty=%x\n", tccp->cblksty); - fprintf(fd, " qmfbid=%d\n", tccp->qmfbid); - fprintf(fd, " qntsty=%d\n", tccp->qntsty); - fprintf(fd, " numgbits=%d\n", tccp->numgbits); - fprintf(fd, " roishift=%d\n", tccp->roishift); - fprintf(fd, " stepsizes="); - numbands = tccp->qntsty == J2K_CCP_QNTSTY_SIQNT ? 1 : tccp->numresolutions * 3 - 2; - for (bandno = 0; bandno < numbands; bandno++) { - fprintf(fd, "(%d,%d) ", tccp->stepsizes[bandno].mant, - tccp->stepsizes[bandno].expn); - } - fprintf(fd, "\n"); - - if (tccp->csty & J2K_CCP_CSTY_PRT) { - fprintf(fd, " prcw="); - for (resno = 0; resno < tccp->numresolutions; resno++) { - fprintf(fd, "%d ", tccp->prcw[resno]); - } - fprintf(fd, "\n"); - fprintf(fd, " prch="); - for (resno = 0; resno < tccp->numresolutions; resno++) { - fprintf(fd, "%d ", tccp->prch[resno]); - } - fprintf(fd, "\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, "}\n"); -} - -/* ----------------------------------------------------------------------- */ -static int j2k_get_num_tp(opj_cp_t *cp,int pino,int tileno){ - char *prog; - int i; - int tpnum=1,tpend=0; - opj_tcp_t *tcp = &cp->tcps[tileno]; - prog = j2k_convert_progression_order(tcp->prg); - - if(cp->tp_on == 1){ - for(i=0;i<4;i++){ - if(tpend!=1){ - if( cp->tp_flag == prog[i] ){ - tpend=1;cp->tp_pos=i; - } - switch(prog[i]){ - case 'C': - tpnum= tpnum * tcp->pocs[pino].compE; - break; - case 'R': - tpnum= tpnum * tcp->pocs[pino].resE; - break; - case 'P': - tpnum= tpnum * tcp->pocs[pino].prcE; - break; - case 'L': - tpnum= tpnum * tcp->pocs[pino].layE; - break; - } - } - } - }else{ - tpnum=1; - } - return tpnum; -} - -/** mem allocation for TLM marker*/ -int j2k_calculate_tp(opj_cp_t *cp,int img_numcomp,opj_image_t *image,opj_j2k_t *j2k ){ - int pino,tileno,totnum_tp=0; - j2k->cur_totnum_tp = (int *) opj_malloc(cp->tw * cp->th * sizeof(int)); - for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { - int cur_totnum_tp = 0; - opj_tcp_t *tcp = &cp->tcps[tileno]; - for(pino = 0; pino <= tcp->numpocs; pino++) { - int tp_num=0; - opj_pi_iterator_t *pi = pi_initialise_encode(image, cp, tileno,FINAL_PASS); - if(!pi) { return -1;} - tp_num = j2k_get_num_tp(cp,pino,tileno); - totnum_tp = totnum_tp + tp_num; - cur_totnum_tp = cur_totnum_tp + tp_num; - pi_destroy(pi, cp, tileno); - } - j2k->cur_totnum_tp[tileno] = cur_totnum_tp; - /* INDEX >> */ - if (j2k->cstr_info) { - j2k->cstr_info->tile[tileno].num_tps = cur_totnum_tp; - j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(cur_totnum_tp * sizeof(opj_tp_info_t)); - } - /* << INDEX */ - } - return totnum_tp; -} - -static void j2k_write_soc(opj_j2k_t *j2k) { - opj_cio_t *cio = j2k->cio; - cio_write(cio, J2K_MS_SOC, 2); - -/* UniPG>> */ -#ifdef USE_JPWL - - /* update markers struct */ - j2k_add_marker(j2k->cstr_info, J2K_MS_SOC, cio_tell(cio) - 2, 2); - -#endif /* USE_JPWL */ -/* <state = J2K_STATE_MHSIZ; - /* Index */ - if (j2k->cstr_info) { - j2k->cstr_info->main_head_start = cio_tell(j2k->cio) - 2; - j2k->cstr_info->codestream_size = cio_numbytesleft(j2k->cio) + 2 - j2k->cstr_info->main_head_start; - } -} - -static void j2k_write_siz(opj_j2k_t *j2k) { - int i; - int lenp, len; - - opj_cio_t *cio = j2k->cio; - opj_image_t *image = j2k->image; - opj_cp_t *cp = j2k->cp; - - cio_write(cio, J2K_MS_SIZ, 2); /* SIZ */ - lenp = cio_tell(cio); - cio_skip(cio, 2); - cio_write(cio, cp->rsiz, 2); /* Rsiz (capabilities) */ - cio_write(cio, image->x1, 4); /* Xsiz */ - cio_write(cio, image->y1, 4); /* Ysiz */ - cio_write(cio, image->x0, 4); /* X0siz */ - cio_write(cio, image->y0, 4); /* Y0siz */ - cio_write(cio, cp->tdx, 4); /* XTsiz */ - cio_write(cio, cp->tdy, 4); /* YTsiz */ - cio_write(cio, cp->tx0, 4); /* XT0siz */ - cio_write(cio, cp->ty0, 4); /* YT0siz */ - cio_write(cio, image->numcomps, 2); /* Csiz */ - for (i = 0; i < image->numcomps; i++) { - cio_write(cio, image->comps[i].prec - 1 + (image->comps[i].sgnd << 7), 1); /* Ssiz_i */ - cio_write(cio, image->comps[i].dx, 1); /* XRsiz_i */ - cio_write(cio, image->comps[i].dy, 1); /* YRsiz_i */ - } - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lsiz */ - cio_seek(cio, lenp + len); -} - -static void j2k_read_siz(opj_j2k_t *j2k) { - int len, i; - - opj_cio_t *cio = j2k->cio; - opj_image_t *image = j2k->image; - opj_cp_t *cp = j2k->cp; - - len = cio_read(cio, 2); /* Lsiz */ - cio_read(cio, 2); /* Rsiz (capabilities) */ - image->x1 = cio_read(cio, 4); /* Xsiz */ - image->y1 = cio_read(cio, 4); /* Ysiz */ - image->x0 = cio_read(cio, 4); /* X0siz */ - image->y0 = cio_read(cio, 4); /* Y0siz */ - cp->tdx = cio_read(cio, 4); /* XTsiz */ - cp->tdy = cio_read(cio, 4); /* YTsiz */ - cp->tx0 = cio_read(cio, 4); /* XT0siz */ - cp->ty0 = cio_read(cio, 4); /* YT0siz */ - - image->numcomps = cio_read(cio, 2); /* Csiz */ - -#ifdef USE_JPWL - if (j2k->cp->correct) { - /* if JPWL is on, we check whether TX errors have damaged - too much the SIZ parameters */ - if (!(image->x1 * image->y1)) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL: bad image size (%d x %d)\n", - image->x1, image->y1); - if (!JPWL_ASSUME || JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - } - if (image->numcomps != ((len - 38) / 3)) { - opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, - "JPWL: Csiz is %d => space in SIZ only for %d comps.!!!\n", - image->numcomps, ((len - 38) / 3)); - if (!JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - /* we try to correct */ - opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n"); - if (image->numcomps < ((len - 38) / 3)) { - len = 38 + 3 * image->numcomps; - opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting Lsiz to %d => HYPOTHESIS!!!\n", - len); - } else { - image->numcomps = ((len - 38) / 3); - opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting Csiz to %d => HYPOTHESIS!!!\n", - image->numcomps); - } - } - - /* update components number in the jpwl_exp_comps filed */ - cp->exp_comps = image->numcomps; - } -#endif /* USE_JPWL */ - - image->comps = (opj_image_comp_t*) opj_calloc(image->numcomps, sizeof(opj_image_comp_t)); - for (i = 0; i < image->numcomps; i++) { - int tmp, w, h; - tmp = cio_read(cio, 1); /* Ssiz_i */ - image->comps[i].prec = (tmp & 0x7f) + 1; - image->comps[i].sgnd = tmp >> 7; - image->comps[i].dx = cio_read(cio, 1); /* XRsiz_i */ - image->comps[i].dy = cio_read(cio, 1); /* YRsiz_i */ - -#ifdef USE_JPWL - if (j2k->cp->correct) { - /* if JPWL is on, we check whether TX errors have damaged - too much the SIZ parameters, again */ - if (!(image->comps[i].dx * image->comps[i].dy)) { - opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, - "JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\n", - i, i, image->comps[i].dx, image->comps[i].dy); - if (!JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - /* we try to correct */ - opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n"); - if (!image->comps[i].dx) { - image->comps[i].dx = 1; - opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting XRsiz_%d to %d => HYPOTHESIS!!!\n", - i, image->comps[i].dx); - } - if (!image->comps[i].dy) { - image->comps[i].dy = 1; - opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting YRsiz_%d to %d => HYPOTHESIS!!!\n", - i, image->comps[i].dy); - } - } - - } -#endif /* USE_JPWL */ - - /* TODO: unused ? */ - w = int_ceildiv(image->x1 - image->x0, image->comps[i].dx); - h = int_ceildiv(image->y1 - image->y0, image->comps[i].dy); - - image->comps[i].resno_decoded = 0; /* number of resolution decoded */ - image->comps[i].factor = cp->reduce; /* reducing factor per component */ - } - - cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx); - cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy); - -#ifdef USE_JPWL - if (j2k->cp->correct) { - /* if JPWL is on, we check whether TX errors have damaged - too much the SIZ parameters */ - if ((cp->tw < 1) || (cp->th < 1) || (cp->tw > cp->max_tiles) || (cp->th > cp->max_tiles)) { - opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, - "JPWL: bad number of tiles (%d x %d)\n", - cp->tw, cp->th); - if (!JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - /* we try to correct */ - opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n"); - if (cp->tw < 1) { - cp->tw= 1; - opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting %d tiles in x => HYPOTHESIS!!!\n", - cp->tw); - } - if (cp->tw > cp->max_tiles) { - cp->tw= 1; - opj_event_msg(j2k->cinfo, EVT_WARNING, "- too large x, increase expectance of %d\n" - "- setting %d tiles in x => HYPOTHESIS!!!\n", - cp->max_tiles, cp->tw); - } - if (cp->th < 1) { - cp->th= 1; - opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting %d tiles in y => HYPOTHESIS!!!\n", - cp->th); - } - if (cp->th > cp->max_tiles) { - cp->th= 1; - opj_event_msg(j2k->cinfo, EVT_WARNING, "- too large y, increase expectance of %d to continue\n", - "- setting %d tiles in y => HYPOTHESIS!!!\n", - cp->max_tiles, cp->th); - } - } - } -#endif /* USE_JPWL */ - - cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t)); - cp->tileno = (int*) opj_malloc(cp->tw * cp->th * sizeof(int)); - cp->tileno_size = 0; - -#ifdef USE_JPWL - if (j2k->cp->correct) { - if (!cp->tcps) { - opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, - "JPWL: could not alloc tcps field of cp\n"); - if (!JPWL_ASSUME || JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - } - } -#endif /* USE_JPWL */ - - for (i = 0; i < cp->tw * cp->th; i++) { - cp->tcps[i].POC = 0; - cp->tcps[i].numpocs = 0; - cp->tcps[i].first = 1; - } - - /* Initialization for PPM marker */ - cp->ppm = 0; - cp->ppm_data = NULL; - cp->ppm_data_first = NULL; - cp->ppm_previous = 0; - cp->ppm_store = 0; - - j2k->default_tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t)); - for (i = 0; i < cp->tw * cp->th; i++) { - cp->tcps[i].tccps = (opj_tccp_t*) opj_malloc(image->numcomps * sizeof(opj_tccp_t)); - } - j2k->tile_data = (unsigned char**) opj_calloc(cp->tw * cp->th, sizeof(unsigned char*)); - j2k->tile_len = (int*) opj_calloc(cp->tw * cp->th, sizeof(int)); - j2k->state = J2K_STATE_MH; - - /* Index */ - if (j2k->cstr_info) { - opj_codestream_info_t *cstr_info = j2k->cstr_info; - cstr_info->image_w = image->x1 - image->x0; - cstr_info->image_h = image->y1 - image->y0; - cstr_info->numcomps = image->numcomps; - cstr_info->tw = cp->tw; - cstr_info->th = cp->th; - cstr_info->tile_x = cp->tdx; - cstr_info->tile_y = cp->tdy; - cstr_info->tile_Ox = cp->tx0; - cstr_info->tile_Oy = cp->ty0; - cstr_info->tile = (opj_tile_info_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tile_info_t)); - } -} - -static void j2k_write_com(opj_j2k_t *j2k) { - unsigned int i; - int lenp, len; - - if(j2k->cp->comment) { - opj_cio_t *cio = j2k->cio; - char *comment = j2k->cp->comment; - - cio_write(cio, J2K_MS_COM, 2); - lenp = cio_tell(cio); - cio_skip(cio, 2); - cio_write(cio, 1, 2); /* General use (IS 8859-15:1999 (Latin) values) */ - for (i = 0; i < strlen(comment); i++) { - cio_write(cio, comment[i], 1); - } - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); - cio_seek(cio, lenp + len); - } -} - -static void j2k_read_com(opj_j2k_t *j2k) { - int len; - - opj_cio_t *cio = j2k->cio; - - len = cio_read(cio, 2); - cio_skip(cio, len - 2); -} - -static void j2k_write_cox(opj_j2k_t *j2k, int compno) { - int i; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; - opj_tccp_t *tccp = &tcp->tccps[compno]; - opj_cio_t *cio = j2k->cio; - - cio_write(cio, tccp->numresolutions - 1, 1); /* SPcox (D) */ - cio_write(cio, tccp->cblkw - 2, 1); /* SPcox (E) */ - cio_write(cio, tccp->cblkh - 2, 1); /* SPcox (F) */ - cio_write(cio, tccp->cblksty, 1); /* SPcox (G) */ - cio_write(cio, tccp->qmfbid, 1); /* SPcox (H) */ - - if (tccp->csty & J2K_CCP_CSTY_PRT) { - for (i = 0; i < tccp->numresolutions; i++) { - cio_write(cio, tccp->prcw[i] + (tccp->prch[i] << 4), 1); /* SPcox (I_i) */ - } - } -} - -static void j2k_read_cox(opj_j2k_t *j2k, int compno) { - int i; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; - opj_tccp_t *tccp = &tcp->tccps[compno]; - opj_cio_t *cio = j2k->cio; - - tccp->numresolutions = cio_read(cio, 1) + 1; /* SPcox (D) */ - - // If user wants to remove more resolutions than the codestream contains, return error - if (cp->reduce >= tccp->numresolutions) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "Error decoding component %d.\nThe number of resolutions to remove is higher than the number " - "of resolutions of this component\nModify the cp_reduce parameter.\n\n", compno); - j2k->state |= J2K_STATE_ERR; - } - - tccp->cblkw = cio_read(cio, 1) + 2; /* SPcox (E) */ - tccp->cblkh = cio_read(cio, 1) + 2; /* SPcox (F) */ - tccp->cblksty = cio_read(cio, 1); /* SPcox (G) */ - tccp->qmfbid = cio_read(cio, 1); /* SPcox (H) */ - if (tccp->csty & J2K_CP_CSTY_PRT) { - for (i = 0; i < tccp->numresolutions; i++) { - int tmp = cio_read(cio, 1); /* SPcox (I_i) */ - tccp->prcw[i] = tmp & 0xf; - tccp->prch[i] = tmp >> 4; - } - } - - /* INDEX >> */ - if(j2k->cstr_info && compno == 0) { - for (i = 0; i < tccp->numresolutions; i++) { - if (tccp->csty & J2K_CP_CSTY_PRT) { - j2k->cstr_info->tile[j2k->curtileno].pdx[i] = tccp->prcw[i]; - j2k->cstr_info->tile[j2k->curtileno].pdy[i] = tccp->prch[i]; - } - else { - j2k->cstr_info->tile[j2k->curtileno].pdx[i] = 15; - j2k->cstr_info->tile[j2k->curtileno].pdx[i] = 15; - } - } - } - /* << INDEX */ -} - -static void j2k_write_cod(opj_j2k_t *j2k) { - opj_cp_t *cp = NULL; - opj_tcp_t *tcp = NULL; - int lenp, len; - - opj_cio_t *cio = j2k->cio; - - cio_write(cio, J2K_MS_COD, 2); /* COD */ - - lenp = cio_tell(cio); - cio_skip(cio, 2); - - cp = j2k->cp; - tcp = &cp->tcps[j2k->curtileno]; - - cio_write(cio, tcp->csty, 1); /* Scod */ - cio_write(cio, tcp->prg, 1); /* SGcod (A) */ - cio_write(cio, tcp->numlayers, 2); /* SGcod (B) */ - cio_write(cio, tcp->mct, 1); /* SGcod (C) */ - - j2k_write_cox(j2k, 0); - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lcod */ - cio_seek(cio, lenp + len); -} - -static void j2k_read_cod(opj_j2k_t *j2k) { - int len, i, pos; - - opj_cio_t *cio = j2k->cio; - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; - opj_image_t *image = j2k->image; - - len = cio_read(cio, 2); /* Lcod */ - tcp->csty = cio_read(cio, 1); /* Scod */ - tcp->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); /* SGcod (A) */ - tcp->numlayers = cio_read(cio, 2); /* SGcod (B) */ - tcp->mct = cio_read(cio, 1); /* SGcod (C) */ - - pos = cio_tell(cio); - for (i = 0; i < image->numcomps; i++) { - tcp->tccps[i].csty = tcp->csty & J2K_CP_CSTY_PRT; - cio_seek(cio, pos); - j2k_read_cox(j2k, i); - } - - /* Index */ - if (j2k->cstr_info) { - opj_codestream_info_t *cstr_info = j2k->cstr_info; - cstr_info->prog = tcp->prg; - cstr_info->numlayers = tcp->numlayers; - cstr_info->numdecompos = (int*) opj_malloc(image->numcomps * sizeof(int)); - for (i = 0; i < image->numcomps; i++) { - cstr_info->numdecompos[i] = tcp->tccps[i].numresolutions - 1; - } - } -} - -static void j2k_write_coc(opj_j2k_t *j2k, int compno) { - int lenp, len; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; - opj_image_t *image = j2k->image; - opj_cio_t *cio = j2k->cio; - - cio_write(cio, J2K_MS_COC, 2); /* COC */ - lenp = cio_tell(cio); - cio_skip(cio, 2); - cio_write(cio, compno, image->numcomps <= 256 ? 1 : 2); /* Ccoc */ - cio_write(cio, tcp->tccps[compno].csty, 1); /* Scoc */ - j2k_write_cox(j2k, compno); - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lcoc */ - cio_seek(cio, lenp + len); -} - -static void j2k_read_coc(opj_j2k_t *j2k) { - int len, compno; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; - opj_image_t *image = j2k->image; - opj_cio_t *cio = j2k->cio; - - len = cio_read(cio, 2); /* Lcoc */ - compno = cio_read(cio, image->numcomps <= 256 ? 1 : 2); /* Ccoc */ - tcp->tccps[compno].csty = cio_read(cio, 1); /* Scoc */ - j2k_read_cox(j2k, compno); -} - -static void j2k_write_qcx(opj_j2k_t *j2k, int compno) { - int bandno, numbands; - int expn, mant; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; - opj_tccp_t *tccp = &tcp->tccps[compno]; - opj_cio_t *cio = j2k->cio; - - cio_write(cio, tccp->qntsty + (tccp->numgbits << 5), 1); /* Sqcx */ - numbands = tccp->qntsty == J2K_CCP_QNTSTY_SIQNT ? 1 : tccp->numresolutions * 3 - 2; - - for (bandno = 0; bandno < numbands; bandno++) { - expn = tccp->stepsizes[bandno].expn; - mant = tccp->stepsizes[bandno].mant; - - if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { - cio_write(cio, expn << 3, 1); /* SPqcx_i */ - } else { - cio_write(cio, (expn << 11) + mant, 2); /* SPqcx_i */ - } - } -} - -static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len) { - int tmp; - int bandno, numbands; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; - opj_tccp_t *tccp = &tcp->tccps[compno]; - opj_cio_t *cio = j2k->cio; - - tmp = cio_read(cio, 1); /* Sqcx */ - tccp->qntsty = tmp & 0x1f; - tccp->numgbits = tmp >> 5; - numbands = (tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? - 1 : ((tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ? len - 1 : (len - 1) / 2); - -#ifdef USE_JPWL - if (j2k->cp->correct) { - - /* if JPWL is on, we check whether there are too many subbands */ - if ((numbands < 0) || (numbands >= J2K_MAXBANDS)) { - opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, - "JPWL: bad number of subbands in Sqcx (%d)\n", - numbands); - if (!JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - /* we try to correct */ - numbands = 1; - opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n" - "- setting number of bands to %d => HYPOTHESIS!!!\n", - numbands); - }; - - }; -#endif /* USE_JPWL */ - - for (bandno = 0; bandno < numbands; bandno++) { - int expn, mant; - if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { - expn = cio_read(cio, 1) >> 3; /* SPqcx_i */ - mant = 0; - } else { - tmp = cio_read(cio, 2); /* SPqcx_i */ - expn = tmp >> 11; - mant = tmp & 0x7ff; - } - tccp->stepsizes[bandno].expn = expn; - tccp->stepsizes[bandno].mant = mant; - } - - /* Add Antonin : if scalar_derived -> compute other stepsizes */ - if (tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) { - for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) { - tccp->stepsizes[bandno].expn = - ((tccp->stepsizes[0].expn) - ((bandno - 1) / 3) > 0) ? - (tccp->stepsizes[0].expn) - ((bandno - 1) / 3) : 0; - tccp->stepsizes[bandno].mant = tccp->stepsizes[0].mant; - } - } - /* ddA */ -} - -static void j2k_write_qcd(opj_j2k_t *j2k) { - int lenp, len; - - opj_cio_t *cio = j2k->cio; - - cio_write(cio, J2K_MS_QCD, 2); /* QCD */ - lenp = cio_tell(cio); - cio_skip(cio, 2); - j2k_write_qcx(j2k, 0); - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lqcd */ - cio_seek(cio, lenp + len); -} - -static void j2k_read_qcd(opj_j2k_t *j2k) { - int len, i, pos; - - opj_cio_t *cio = j2k->cio; - opj_image_t *image = j2k->image; - - len = cio_read(cio, 2); /* Lqcd */ - pos = cio_tell(cio); - for (i = 0; i < image->numcomps; i++) { - cio_seek(cio, pos); - j2k_read_qcx(j2k, i, len - 2); - } -} - -static void j2k_write_qcc(opj_j2k_t *j2k, int compno) { - int lenp, len; - - opj_cio_t *cio = j2k->cio; - - cio_write(cio, J2K_MS_QCC, 2); /* QCC */ - lenp = cio_tell(cio); - cio_skip(cio, 2); - cio_write(cio, compno, j2k->image->numcomps <= 256 ? 1 : 2); /* Cqcc */ - j2k_write_qcx(j2k, compno); - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lqcc */ - cio_seek(cio, lenp + len); -} - -static void j2k_read_qcc(opj_j2k_t *j2k) { - int len, compno; - int numcomp = j2k->image->numcomps; - opj_cio_t *cio = j2k->cio; - - len = cio_read(cio, 2); /* Lqcc */ - compno = cio_read(cio, numcomp <= 256 ? 1 : 2); /* Cqcc */ - -#ifdef USE_JPWL - if (j2k->cp->correct) { - - static int backup_compno = 0; - - /* compno is negative or larger than the number of components!!! */ - if ((compno < 0) || (compno >= numcomp)) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL: bad component number in QCC (%d out of a maximum of %d)\n", - compno, numcomp); - if (!JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - /* we try to correct */ - compno = backup_compno % numcomp; - opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n" - "- setting component number to %d\n", - compno); - } - - /* keep your private count of tiles */ - backup_compno++; - }; -#endif /* USE_JPWL */ - - j2k_read_qcx(j2k, compno, len - 2 - (numcomp <= 256 ? 1 : 2)); -} - -static void j2k_write_poc(opj_j2k_t *j2k) { - int len, numpchgs, i; - - int numcomps = j2k->image->numcomps; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; - opj_tccp_t *tccp = &tcp->tccps[0]; - opj_cio_t *cio = j2k->cio; - - numpchgs = 1 + tcp->numpocs; - cio_write(cio, J2K_MS_POC, 2); /* POC */ - len = 2 + (5 + 2 * (numcomps <= 256 ? 1 : 2)) * numpchgs; - cio_write(cio, len, 2); /* Lpoc */ - for (i = 0; i < numpchgs; i++) { - opj_poc_t *poc = &tcp->pocs[i]; - cio_write(cio, poc->resno0, 1); /* RSpoc_i */ - cio_write(cio, poc->compno0, (numcomps <= 256 ? 1 : 2)); /* CSpoc_i */ - cio_write(cio, poc->layno1, 2); /* LYEpoc_i */ - poc->layno1 = int_min(poc->layno1, tcp->numlayers); - cio_write(cio, poc->resno1, 1); /* REpoc_i */ - poc->resno1 = int_min(poc->resno1, tccp->numresolutions); - cio_write(cio, poc->compno1, (numcomps <= 256 ? 1 : 2)); /* CEpoc_i */ - poc->compno1 = int_min(poc->compno1, numcomps); - cio_write(cio, poc->prg, 1); /* Ppoc_i */ - } -} - -static void j2k_read_poc(opj_j2k_t *j2k) { - int len, numpchgs, i, old_poc; - - int numcomps = j2k->image->numcomps; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; - opj_cio_t *cio = j2k->cio; - - old_poc = tcp->POC ? tcp->numpocs + 1 : 0; - tcp->POC = 1; - len = cio_read(cio, 2); /* Lpoc */ - numpchgs = (len - 2) / (5 + 2 * (numcomps <= 256 ? 1 : 2)); - - for (i = old_poc; i < numpchgs + old_poc; i++) { - opj_poc_t *poc; - poc = &tcp->pocs[i]; - poc->resno0 = cio_read(cio, 1); /* RSpoc_i */ - poc->compno0 = cio_read(cio, numcomps <= 256 ? 1 : 2); /* CSpoc_i */ - poc->layno1 = cio_read(cio, 2); /* LYEpoc_i */ - poc->resno1 = cio_read(cio, 1); /* REpoc_i */ - poc->compno1 = int_min( - cio_read(cio, numcomps <= 256 ? 1 : 2), (unsigned int) numcomps); /* CEpoc_i */ - poc->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); /* Ppoc_i */ - } - - tcp->numpocs = numpchgs + old_poc - 1; -} - -static void j2k_read_crg(opj_j2k_t *j2k) { - int len, i, Xcrg_i, Ycrg_i; - - opj_cio_t *cio = j2k->cio; - int numcomps = j2k->image->numcomps; - - len = cio_read(cio, 2); /* Lcrg */ - for (i = 0; i < numcomps; i++) { - Xcrg_i = cio_read(cio, 2); /* Xcrg_i */ - Ycrg_i = cio_read(cio, 2); /* Ycrg_i */ - } -} - -static void j2k_read_tlm(opj_j2k_t *j2k) { - int len, Ztlm, Stlm, ST, SP, tile_tlm, i; - long int Ttlm_i, Ptlm_i; - - opj_cio_t *cio = j2k->cio; - - len = cio_read(cio, 2); /* Ltlm */ - Ztlm = cio_read(cio, 1); /* Ztlm */ - Stlm = cio_read(cio, 1); /* Stlm */ - ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02); - SP = (Stlm >> 6) & 0x01; - tile_tlm = (len - 4) / ((SP + 1) * 2 + ST); - for (i = 0; i < tile_tlm; i++) { - Ttlm_i = cio_read(cio, ST); /* Ttlm_i */ - Ptlm_i = cio_read(cio, SP ? 4 : 2); /* Ptlm_i */ - } -} - -static void j2k_read_plm(opj_j2k_t *j2k) { - int len, i, Zplm, Nplm, add, packet_len = 0; - - opj_cio_t *cio = j2k->cio; - - len = cio_read(cio, 2); /* Lplm */ - Zplm = cio_read(cio, 1); /* Zplm */ - len -= 3; - while (len > 0) { - Nplm = cio_read(cio, 4); /* Nplm */ - len -= 4; - for (i = Nplm; i > 0; i--) { - add = cio_read(cio, 1); - len--; - packet_len = (packet_len << 7) + add; /* Iplm_ij */ - if ((add & 0x80) == 0) { - /* New packet */ - packet_len = 0; - } - if (len <= 0) - break; - } - } -} - -static void j2k_read_plt(opj_j2k_t *j2k) { - int len, i, Zplt, packet_len = 0, add; - - opj_cio_t *cio = j2k->cio; - - len = cio_read(cio, 2); /* Lplt */ - Zplt = cio_read(cio, 1); /* Zplt */ - for (i = len - 3; i > 0; i--) { - add = cio_read(cio, 1); - packet_len = (packet_len << 7) + add; /* Iplt_i */ - if ((add & 0x80) == 0) { - /* New packet */ - packet_len = 0; - } - } -} - -static void j2k_read_ppm(opj_j2k_t *j2k) { - int len, Z_ppm, i, j; - int N_ppm; - - opj_cp_t *cp = j2k->cp; - opj_cio_t *cio = j2k->cio; - - len = cio_read(cio, 2); - cp->ppm = 1; - - Z_ppm = cio_read(cio, 1); /* Z_ppm */ - len -= 3; - while (len > 0) { - if (cp->ppm_previous == 0) { - N_ppm = cio_read(cio, 4); /* N_ppm */ - len -= 4; - } else { - N_ppm = cp->ppm_previous; - } - j = cp->ppm_store; - if (Z_ppm == 0) { /* First PPM marker */ - cp->ppm_data = (unsigned char *) opj_malloc(N_ppm * sizeof(unsigned char)); - cp->ppm_data_first = cp->ppm_data; - cp->ppm_len = N_ppm; - } else { /* NON-first PPM marker */ - cp->ppm_data = (unsigned char *) opj_realloc(cp->ppm_data, (N_ppm + cp->ppm_store) * sizeof(unsigned char)); - -#ifdef USE_JPWL - /* this memory allocation check could be done even in non-JPWL cases */ - if (cp->correct) { - if (!cp->ppm_data) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL: failed memory allocation during PPM marker parsing (pos. %x)\n", - cio_tell(cio)); - if (!JPWL_ASSUME || JPWL_ASSUME) { - opj_free(cp->ppm_data); - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - } - } -#endif - - cp->ppm_data_first = cp->ppm_data; - cp->ppm_len = N_ppm + cp->ppm_store; - } - for (i = N_ppm; i > 0; i--) { /* Read packet header */ - cp->ppm_data[j] = cio_read(cio, 1); - j++; - len--; - if (len == 0) - break; /* Case of non-finished packet header in present marker but finished in next one */ - } - cp->ppm_previous = i - 1; - cp->ppm_store = j; - } -} - -static void j2k_read_ppt(opj_j2k_t *j2k) { - int len, Z_ppt, i, j = 0; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = cp->tcps + j2k->curtileno; - opj_cio_t *cio = j2k->cio; - - len = cio_read(cio, 2); - Z_ppt = cio_read(cio, 1); - tcp->ppt = 1; - if (Z_ppt == 0) { /* First PPT marker */ - tcp->ppt_data = (unsigned char *) opj_malloc((len - 3) * sizeof(unsigned char)); - tcp->ppt_data_first = tcp->ppt_data; - tcp->ppt_store = 0; - tcp->ppt_len = len - 3; - } else { /* NON-first PPT marker */ - tcp->ppt_data = (unsigned char *) opj_realloc(tcp->ppt_data, (len - 3 + tcp->ppt_store) * sizeof(unsigned char)); - tcp->ppt_data_first = tcp->ppt_data; - tcp->ppt_len = len - 3 + tcp->ppt_store; - } - j = tcp->ppt_store; - for (i = len - 3; i > 0; i--) { - tcp->ppt_data[j] = cio_read(cio, 1); - j++; - } - tcp->ppt_store = j; -} - -static void j2k_write_tlm(opj_j2k_t *j2k){ - int lenp; - opj_cio_t *cio = j2k->cio; - j2k->tlm_start = cio_tell(cio); - cio_write(cio, J2K_MS_TLM, 2);/* TLM */ - lenp = 4 + (5*j2k->totnum_tp); - cio_write(cio,lenp,2); /* Ltlm */ - cio_write(cio, 0,1); /* Ztlm=0*/ - cio_write(cio,80,1); /* Stlm ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */ - cio_skip(cio,5*j2k->totnum_tp); -} - -static void j2k_write_sot(opj_j2k_t *j2k) { - int lenp, len; - - opj_cio_t *cio = j2k->cio; - - j2k->sot_start = cio_tell(cio); - cio_write(cio, J2K_MS_SOT, 2); /* SOT */ - lenp = cio_tell(cio); - cio_skip(cio, 2); /* Lsot (further) */ - cio_write(cio, j2k->curtileno, 2); /* Isot */ - cio_skip(cio, 4); /* Psot (further in j2k_write_sod) */ - cio_write(cio, j2k->cur_tp_num , 1); /* TPsot */ - cio_write(cio, j2k->cur_totnum_tp[j2k->curtileno], 1); /* TNsot */ - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lsot */ - cio_seek(cio, lenp + len); - - /* UniPG>> */ -#ifdef USE_JPWL - /* update markers struct */ - j2k_add_marker(j2k->cstr_info, J2K_MS_SOT, j2k->sot_start, len + 2); -#endif /* USE_JPWL */ - /* <cp; - opj_cio_t *cio = j2k->cio; - - len = cio_read(cio, 2); - tileno = cio_read(cio, 2); - -#ifdef USE_JPWL - if (j2k->cp->correct) { - - static int backup_tileno = 0; - - /* tileno is negative or larger than the number of tiles!!! */ - if ((tileno < 0) || (tileno > (cp->tw * cp->th))) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL: bad tile number (%d out of a maximum of %d)\n", - tileno, (cp->tw * cp->th)); - if (!JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - /* we try to correct */ - tileno = backup_tileno; - opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n" - "- setting tile number to %d\n", - tileno); - } - - /* keep your private count of tiles */ - backup_tileno++; - }; -#endif /* USE_JPWL */ - - if (cp->tileno_size == 0) { - cp->tileno[cp->tileno_size] = tileno; - cp->tileno_size++; - } else { - i = 0; - while (i < cp->tileno_size && status == 0) { - status = cp->tileno[i] == tileno ? 1 : 0; - i++; - } - if (status == 0) { - cp->tileno[cp->tileno_size] = tileno; - cp->tileno_size++; - } - } - - totlen = cio_read(cio, 4); - -#ifdef USE_JPWL - if (j2k->cp->correct) { - - /* totlen is negative or larger than the bytes left!!! */ - if ((totlen < 0) || (totlen > (cio_numbytesleft(cio) + 8))) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL: bad tile byte size (%d bytes against %d bytes left)\n", - totlen, cio_numbytesleft(cio) + 8); - if (!JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - /* we try to correct */ - totlen = 0; - opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n" - "- setting Psot to %d => assuming it is the last tile\n", - totlen); - } - - }; -#endif /* USE_JPWL */ - - if (!totlen) - totlen = cio_numbytesleft(cio) + 8; - - partno = cio_read(cio, 1); - numparts = cio_read(cio, 1); - - j2k->curtileno = tileno; - j2k->cur_tp_num = partno; - j2k->eot = cio_getbp(cio) - 12 + totlen; - j2k->state = J2K_STATE_TPH; - tcp = &cp->tcps[j2k->curtileno]; - - /* Index */ - if (j2k->cstr_info) { - if (tcp->first) { - if (tileno == 0) - j2k->cstr_info->main_head_end = cio_tell(cio) - 13; - j2k->cstr_info->tile[tileno].tileno = tileno; - j2k->cstr_info->tile[tileno].start_pos = cio_tell(cio) - 12; - j2k->cstr_info->tile[tileno].end_pos = j2k->cstr_info->tile[tileno].start_pos + totlen - 1; - j2k->cstr_info->tile[tileno].num_tps = numparts; - if (numparts) - j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(numparts * sizeof(opj_tp_info_t)); - else - j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(10 * sizeof(opj_tp_info_t)); // Fixme (10) - } - else { - j2k->cstr_info->tile[tileno].end_pos += totlen; - } - j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = cio_tell(cio) - 12; - j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos = - j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1; - } - - if (tcp->first == 1) { - /* Initialization PPT */ - opj_tccp_t *tmp = tcp->tccps; - memcpy(tcp, j2k->default_tcp, sizeof(opj_tcp_t)); - tcp->ppt = 0; - tcp->ppt_data = NULL; - tcp->ppt_data_first = NULL; - tcp->tccps = tmp; - - for (i = 0; i < j2k->image->numcomps; i++) { - tcp->tccps[i] = j2k->default_tcp->tccps[i]; - } - cp->tcps[j2k->curtileno].first = 0; - } -} - -static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder) { - int l, layno; - int totlen; - opj_tcp_t *tcp = NULL; - opj_codestream_info_t *cstr_info = NULL; - - opj_tcd_t *tcd = (opj_tcd_t*)tile_coder; /* cast is needed because of conflicts in header inclusions */ - opj_cp_t *cp = j2k->cp; - opj_cio_t *cio = j2k->cio; - - tcd->tp_num = j2k->tp_num ; - tcd->cur_tp_num = j2k->cur_tp_num; - - cio_write(cio, J2K_MS_SOD, 2); - if (j2k->curtileno == 0) { - j2k->sod_start = cio_tell(cio) + j2k->pos_correction; - } - - /* INDEX >> */ - cstr_info = j2k->cstr_info; - if (cstr_info) { - if (!j2k->cur_tp_num ) { - cstr_info->tile[j2k->curtileno].end_header = cio_tell(cio) + j2k->pos_correction - 1; - j2k->cstr_info->tile[j2k->curtileno].tileno = j2k->curtileno; - } - else{ - if(cstr_info->tile[j2k->curtileno].packet[cstr_info->packno - 1].end_pos < cio_tell(cio)) - cstr_info->tile[j2k->curtileno].packet[cstr_info->packno].start_pos = cio_tell(cio); - } - /* UniPG>> */ -#ifdef USE_JPWL - /* update markers struct */ - j2k_add_marker(j2k->cstr_info, J2K_MS_SOD, j2k->sod_start, 2); -#endif /* USE_JPWL */ - /* <tcps[j2k->curtileno]; - for (layno = 0; layno < tcp->numlayers; layno++) { - tcp->rates[layno] -= tcp->rates[layno] ? (j2k->sod_start / (cp->th * cp->tw)) : 0; - } - if(j2k->cur_tp_num == 0){ - tcd->tcd_image->tiles->packno = 0; - if(cstr_info) - cstr_info->packno = 0; - } - - l = tcd_encode_tile(tcd, j2k->curtileno, cio_getbp(cio), cio_numbytesleft(cio) - 2, cstr_info); - - /* Writing Psot in SOT marker */ - totlen = cio_tell(cio) + l - j2k->sot_start; - cio_seek(cio, j2k->sot_start + 6); - cio_write(cio, totlen, 4); - cio_seek(cio, j2k->sot_start + totlen); - /* Writing Ttlm and Ptlm in TLM marker */ - if(cp->cinema){ - cio_seek(cio, j2k->tlm_start + 6 + (5*j2k->cur_tp_num)); - cio_write(cio, j2k->curtileno, 1); - cio_write(cio, totlen, 4); - } - cio_seek(cio, j2k->sot_start + totlen); -} - -static void j2k_read_sod(opj_j2k_t *j2k) { - int len, truncate = 0, i; - unsigned char *data = NULL, *data_ptr = NULL; - - opj_cio_t *cio = j2k->cio; - int curtileno = j2k->curtileno; - - /* Index */ - if (j2k->cstr_info) { - j2k->cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_header = - cio_tell(cio) + j2k->pos_correction - 1; - if (j2k->cur_tp_num == 0) - j2k->cstr_info->tile[j2k->curtileno].end_header = cio_tell(cio) + j2k->pos_correction - 1; - j2k->cstr_info->packno = 0; - } - - len = int_min(j2k->eot - cio_getbp(cio), cio_numbytesleft(cio) + 1); - - if (len == cio_numbytesleft(cio) + 1) { - truncate = 1; /* Case of a truncate codestream */ - } - - data = j2k->tile_data[curtileno]; - data = (unsigned char*) opj_realloc(data, (j2k->tile_len[curtileno] + len) * sizeof(unsigned char)); - - data_ptr = data + j2k->tile_len[curtileno]; - for (i = 0; i < len; i++) { - data_ptr[i] = cio_read(cio, 1); - } - - j2k->tile_len[curtileno] += len; - j2k->tile_data[curtileno] = data; - - if (!truncate) { - j2k->state = J2K_STATE_TPHSOT; - } else { - j2k->state = J2K_STATE_NEOC; /* RAJOUTE !! */ - } - j2k->cur_tp_num++; -} - -static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno) { - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = &cp->tcps[tileno]; - opj_cio_t *cio = j2k->cio; - int numcomps = j2k->image->numcomps; - - cio_write(cio, J2K_MS_RGN, 2); /* RGN */ - cio_write(cio, numcomps <= 256 ? 5 : 6, 2); /* Lrgn */ - cio_write(cio, compno, numcomps <= 256 ? 1 : 2); /* Crgn */ - cio_write(cio, 0, 1); /* Srgn */ - cio_write(cio, tcp->tccps[compno].roishift, 1); /* SPrgn */ -} - -static void j2k_read_rgn(opj_j2k_t *j2k) { - int len, compno, roisty; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; - opj_cio_t *cio = j2k->cio; - int numcomps = j2k->image->numcomps; - - len = cio_read(cio, 2); /* Lrgn */ - compno = cio_read(cio, numcomps <= 256 ? 1 : 2); /* Crgn */ - roisty = cio_read(cio, 1); /* Srgn */ - -#ifdef USE_JPWL - if (j2k->cp->correct) { - /* totlen is negative or larger than the bytes left!!! */ - if (compno >= numcomps) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL: bad component number in RGN (%d when there are only %d)\n", - compno, numcomps); - if (!JPWL_ASSUME || JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - } - }; -#endif /* USE_JPWL */ - - tcp->tccps[compno].roishift = cio_read(cio, 1); /* SPrgn */ -} - -static void j2k_write_eoc(opj_j2k_t *j2k) { - opj_cio_t *cio = j2k->cio; - /* opj_event_msg(j2k->cinfo, "%.8x: EOC\n", cio_tell(cio) + j2k->pos_correction); */ - cio_write(cio, J2K_MS_EOC, 2); - -/* UniPG>> */ -#ifdef USE_JPWL - /* update markers struct */ - j2k_add_marker(j2k->cstr_info, J2K_MS_EOC, cio_tell(cio) - 2, 2); -#endif /* USE_JPWL */ -/* <cp->limit_decoding != DECODE_ALL_BUT_PACKETS) { - opj_tcd_t *tcd = tcd_create(j2k->cinfo); - tcd_malloc_decode(tcd, j2k->image, j2k->cp); - for (i = 0; i < j2k->cp->tileno_size; i++) { - tcd_malloc_decode_tile(tcd, j2k->image, j2k->cp, i, j2k->cstr_info); - tileno = j2k->cp->tileno[i]; - success = tcd_decode_tile(tcd, j2k->tile_data[tileno], j2k->tile_len[tileno], tileno, j2k->cstr_info); - opj_free(j2k->tile_data[tileno]); - j2k->tile_data[tileno] = NULL; - tcd_free_decode_tile(tcd, i); - if (success == false) { - j2k->state |= J2K_STATE_ERR; - break; - } - } - tcd_free_decode(tcd); - tcd_destroy(tcd); - } - /* if packets should not be decoded */ - else { - for (i = 0; i < j2k->cp->tileno_size; i++) { - tileno = j2k->cp->tileno[i]; - opj_free(j2k->tile_data[tileno]); - j2k->tile_data[tileno] = NULL; - } - } - if (j2k->state & J2K_STATE_ERR) - j2k->state = J2K_STATE_MT + J2K_STATE_ERR; - else - j2k->state = J2K_STATE_MT; -} - -typedef struct opj_dec_mstabent { - /** marker value */ - int id; - /** value of the state when the marker can appear */ - int states; - /** action linked to the marker */ - void (*handler) (opj_j2k_t *j2k); -} opj_dec_mstabent_t; - -opj_dec_mstabent_t j2k_dec_mstab[] = { - {J2K_MS_SOC, J2K_STATE_MHSOC, j2k_read_soc}, - {J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, j2k_read_sot}, - {J2K_MS_SOD, J2K_STATE_TPH, j2k_read_sod}, - {J2K_MS_EOC, J2K_STATE_TPHSOT, j2k_read_eoc}, - {J2K_MS_SIZ, J2K_STATE_MHSIZ, j2k_read_siz}, - {J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_cod}, - {J2K_MS_COC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_coc}, - {J2K_MS_RGN, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_rgn}, - {J2K_MS_QCD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_qcd}, - {J2K_MS_QCC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_qcc}, - {J2K_MS_POC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_poc}, - {J2K_MS_TLM, J2K_STATE_MH, j2k_read_tlm}, - {J2K_MS_PLM, J2K_STATE_MH, j2k_read_plm}, - {J2K_MS_PLT, J2K_STATE_TPH, j2k_read_plt}, - {J2K_MS_PPM, J2K_STATE_MH, j2k_read_ppm}, - {J2K_MS_PPT, J2K_STATE_TPH, j2k_read_ppt}, - {J2K_MS_SOP, 0, 0}, - {J2K_MS_CRG, J2K_STATE_MH, j2k_read_crg}, - {J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_com}, - -#ifdef USE_JPWL - {J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc}, - {J2K_MS_EPB, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epb}, - {J2K_MS_ESD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_esd}, - {J2K_MS_RED, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_red}, -#endif /* USE_JPWL */ -#ifdef USE_JPSEC - {J2K_MS_SEC, J2K_STATE_MH, j2k_read_sec}, - {J2K_MS_INSEC, 0, j2k_read_insec}, -#endif /* USE_JPSEC */ - - {0, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_unk} -}; - -static void j2k_read_unk(opj_j2k_t *j2k) { - opj_event_msg(j2k->cinfo, EVT_WARNING, "Unknown marker\n"); - -#ifdef USE_JPWL - if (j2k->cp->correct) { - int m = 0, id, i; - int min_id = 0, min_dist = 17, cur_dist = 0, tmp_id; - cio_seek(j2k->cio, cio_tell(j2k->cio) - 2); - id = cio_read(j2k->cio, 2); - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL: really don't know this marker %x\n", - id); - if (!JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "- possible synch loss due to uncorrectable codestream errors => giving up\n"); - return; - } - /* OK, activate this at your own risk!!! */ - /* we look for the marker at the minimum hamming distance from this */ - while (j2k_dec_mstab[m].id) { - - /* 1's where they differ */ - tmp_id = j2k_dec_mstab[m].id ^ id; - - /* compute the hamming distance between our id and the current */ - cur_dist = 0; - for (i = 0; i < 16; i++) { - if ((tmp_id >> i) & 0x0001) { - cur_dist++; - } - } - - /* if current distance is smaller, set the minimum */ - if (cur_dist < min_dist) { - min_dist = cur_dist; - min_id = j2k_dec_mstab[m].id; - } - - /* jump to the next marker */ - m++; - } - - /* do we substitute the marker? */ - if (min_dist < JPWL_MAXIMUM_HAMMING) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "- marker %x is at distance %d from the read %x\n", - min_id, min_dist, id); - opj_event_msg(j2k->cinfo, EVT_ERROR, - "- trying to substitute in place and crossing fingers!\n"); - cio_seek(j2k->cio, cio_tell(j2k->cio) - 2); - cio_write(j2k->cio, min_id, 2); - - /* rewind */ - cio_seek(j2k->cio, cio_tell(j2k->cio) - 2); - - } - - }; -#endif /* USE_JPWL */ - -} - -/** -Read the lookup table containing all the marker, status and action -@param id Marker value -*/ -static opj_dec_mstabent_t *j2k_dec_mstab_lookup(int id) { - opj_dec_mstabent_t *e; - for (e = j2k_dec_mstab; e->id != 0; e++) { - if (e->id == id) { - break; - } - } - return e; -} - -/* ----------------------------------------------------------------------- */ -/* J2K / JPT decoder interface */ -/* ----------------------------------------------------------------------- */ - -opj_j2k_t* j2k_create_decompress(opj_common_ptr cinfo) { - opj_j2k_t *j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t)); - if(!j2k) - return NULL; - - j2k->default_tcp = (opj_tcp_t*) opj_calloc(1, sizeof(opj_tcp_t)); - if(!j2k->default_tcp) { - opj_free(j2k); - return NULL; - } - - j2k->cinfo = cinfo; - j2k->tile_data = NULL; - - return j2k; -} - -void j2k_destroy_decompress(opj_j2k_t *j2k) { - int i = 0; - - if(j2k->tile_len != NULL) { - opj_free(j2k->tile_len); - } - if(j2k->tile_data != NULL) { - opj_free(j2k->tile_data); - } - if(j2k->default_tcp != NULL) { - opj_tcp_t *default_tcp = j2k->default_tcp; - if(default_tcp->ppt_data_first != NULL) { - opj_free(default_tcp->ppt_data_first); - } - if(j2k->default_tcp->tccps != NULL) { - opj_free(j2k->default_tcp->tccps); - } - opj_free(j2k->default_tcp); - } - if(j2k->cp != NULL) { - opj_cp_t *cp = j2k->cp; - if(cp->tcps != NULL) { - for(i = 0; i < cp->tw * cp->th; i++) { - if(cp->tcps[i].ppt_data_first != NULL) { - opj_free(cp->tcps[i].ppt_data_first); - } - if(cp->tcps[i].tccps != NULL) { - opj_free(cp->tcps[i].tccps); - } - } - opj_free(cp->tcps); - } - if(cp->ppm_data_first != NULL) { - opj_free(cp->ppm_data_first); - } - if(cp->tileno != NULL) { - opj_free(cp->tileno); - } - if(cp->comment != NULL) { - opj_free(cp->comment); - } - - opj_free(cp); - } - opj_free(j2k); -} - -void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters) { - if(j2k && parameters) { - /* create and initialize the coding parameters structure */ - opj_cp_t *cp = (opj_cp_t*) opj_calloc(1, sizeof(opj_cp_t)); - cp->reduce = parameters->cp_reduce; - cp->layer = parameters->cp_layer; - cp->limit_decoding = parameters->cp_limit_decoding; - -#ifdef USE_JPWL - cp->correct = parameters->jpwl_correct; - cp->exp_comps = parameters->jpwl_exp_comps; - cp->max_tiles = parameters->jpwl_max_tiles; -#endif /* USE_JPWL */ - - - /* keep a link to cp so that we can destroy it later in j2k_destroy_decompress */ - j2k->cp = cp; - } -} - -opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info) { - opj_image_t *image = NULL; - - opj_common_ptr cinfo = j2k->cinfo; - - j2k->cio = cio; - j2k->cstr_info = cstr_info; - if (cstr_info) - memset(cstr_info, 0, sizeof(opj_codestream_info_t)); - - /* create an empty image */ - image = opj_image_create0(); - j2k->image = image; - - j2k->state = J2K_STATE_MHSOC; - - for (;;) { - opj_dec_mstabent_t *e; - int id = cio_read(cio, 2); - -#ifdef USE_JPWL - /* we try to honor JPWL correction power */ - if (j2k->cp->correct) { - - int orig_pos = cio_tell(cio); - bool status; - - /* call the corrector */ - status = jpwl_correct(j2k); - - /* go back to where you were */ - cio_seek(cio, orig_pos - 2); - - /* re-read the marker */ - id = cio_read(cio, 2); - - /* check whether it begins with ff */ - if (id >> 8 != 0xff) { - opj_event_msg(cinfo, EVT_ERROR, - "JPWL: possible bad marker %x at %d\n", - id, cio_tell(cio) - 2); - if (!JPWL_ASSUME) { - opj_image_destroy(image); - opj_event_msg(cinfo, EVT_ERROR, "JPWL: giving up\n"); - return 0; - } - /* we try to correct */ - id = id | 0xff00; - cio_seek(cio, cio_tell(cio) - 2); - cio_write(cio, id, 2); - opj_event_msg(cinfo, EVT_WARNING, "- trying to adjust this\n" - "- setting marker to %x\n", - id); - } - - } -#endif /* USE_JPWL */ - - if (id >> 8 != 0xff) { - opj_image_destroy(image); - opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n", cio_tell(cio) - 2, id); - return 0; - } - e = j2k_dec_mstab_lookup(id); - // Check if the marker is known - if (!(j2k->state & e->states)) { - opj_image_destroy(image); - opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n", cio_tell(cio) - 2, id); - return 0; - } - // Check if the decoding is limited to the main header - if (e->id == J2K_MS_SOT && j2k->cp->limit_decoding == LIMIT_TO_MAIN_HEADER) { - opj_event_msg(cinfo, EVT_INFO, "Main Header decoded.\n"); - return image; - } - - if (e->handler) { - (*e->handler)(j2k); - } - if (j2k->state & J2K_STATE_ERR) - return NULL; - - if (j2k->state == J2K_STATE_MT) { - break; - } - if (j2k->state == J2K_STATE_NEOC) { - break; - } - } - if (j2k->state == J2K_STATE_NEOC) { - j2k_read_eoc(j2k); - } - - if (j2k->state != J2K_STATE_MT) { - opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n"); - } - - return image; -} - -/* -* Read a JPT-stream and decode file -* -*/ -opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info) { - opj_image_t *image = NULL; - opj_jpt_msg_header_t header; - int position; - - opj_common_ptr cinfo = j2k->cinfo; - - j2k->cio = cio; - - /* create an empty image */ - image = opj_image_create0(); - j2k->image = image; - - j2k->state = J2K_STATE_MHSOC; - - /* Initialize the header */ - jpt_init_msg_header(&header); - /* Read the first header of the message */ - jpt_read_msg_header(cinfo, cio, &header); - - position = cio_tell(cio); - if (header.Class_Id != 6) { /* 6 : Main header data-bin message */ - opj_image_destroy(image); - opj_event_msg(cinfo, EVT_ERROR, "[JPT-stream] : Expecting Main header first [class_Id %d] !\n", header.Class_Id); - return 0; - } - - for (;;) { - opj_dec_mstabent_t *e = NULL; - int id; - - if (!cio_numbytesleft(cio)) { - j2k_read_eoc(j2k); - return image; - } - /* data-bin read -> need to read a new header */ - if ((unsigned int) (cio_tell(cio) - position) == header.Msg_length) { - jpt_read_msg_header(cinfo, cio, &header); - position = cio_tell(cio); - if (header.Class_Id != 4) { /* 4 : Tile data-bin message */ - opj_image_destroy(image); - opj_event_msg(cinfo, EVT_ERROR, "[JPT-stream] : Expecting Tile info !\n"); - return 0; - } - } - - id = cio_read(cio, 2); - if (id >> 8 != 0xff) { - opj_image_destroy(image); - opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n", cio_tell(cio) - 2, id); - return 0; - } - e = j2k_dec_mstab_lookup(id); - if (!(j2k->state & e->states)) { - opj_image_destroy(image); - opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n", cio_tell(cio) - 2, id); - return 0; - } - if (e->handler) { - (*e->handler)(j2k); - } - if (j2k->state == J2K_STATE_MT) { - break; - } - if (j2k->state == J2K_STATE_NEOC) { - break; - } - } - if (j2k->state == J2K_STATE_NEOC) { - j2k_read_eoc(j2k); - } - - if (j2k->state != J2K_STATE_MT) { - opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n"); - } - - return image; -} - -/* ----------------------------------------------------------------------- */ -/* J2K encoder interface */ -/* ----------------------------------------------------------------------- */ - -opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo) { - opj_j2k_t *j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t)); - if(j2k) { - j2k->cinfo = cinfo; - } - return j2k; -} - -void j2k_destroy_compress(opj_j2k_t *j2k) { - int tileno; - - if(!j2k) return; - if(j2k->cp != NULL) { - opj_cp_t *cp = j2k->cp; - - if(cp->comment) { - opj_free(cp->comment); - } - if(cp->matrice) { - opj_free(cp->matrice); - } - for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { - opj_free(cp->tcps[tileno].tccps); - } - opj_free(cp->tcps); - opj_free(cp); - } - - opj_free(j2k); -} - -void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image) { - int i, j, tileno, numpocs_tile; - opj_cp_t *cp = NULL; - - if(!j2k || !parameters || ! image) { - return; - } - - /* create and initialize the coding parameters structure */ - cp = (opj_cp_t*) opj_calloc(1, sizeof(opj_cp_t)); - - /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */ - j2k->cp = cp; - - /* set default values for cp */ - cp->tw = 1; - cp->th = 1; - - /* - copy user encoding parameters - */ - cp->cinema = parameters->cp_cinema; - cp->max_comp_size = parameters->max_comp_size; - cp->rsiz = parameters->cp_rsiz; - cp->disto_alloc = parameters->cp_disto_alloc; - cp->fixed_alloc = parameters->cp_fixed_alloc; - cp->fixed_quality = parameters->cp_fixed_quality; - - /* mod fixed_quality */ - if(parameters->cp_matrice) { - size_t array_size = parameters->tcp_numlayers * parameters->numresolution * 3 * sizeof(int); - cp->matrice = (int *) opj_malloc(array_size); - memcpy(cp->matrice, parameters->cp_matrice, array_size); - } - - /* tiles */ - cp->tdx = parameters->cp_tdx; - cp->tdy = parameters->cp_tdy; - - /* tile offset */ - cp->tx0 = parameters->cp_tx0; - cp->ty0 = parameters->cp_ty0; - - /* comment string */ - if(parameters->cp_comment) { - cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1); - if(cp->comment) { - strcpy(cp->comment, parameters->cp_comment); - } - } - - /* - calculate other encoding parameters - */ - - if (parameters->tile_size_on) { - cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx); - cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy); - } else { - cp->tdx = image->x1 - cp->tx0; - cp->tdy = image->y1 - cp->ty0; - } - - if(parameters->tp_on){ - cp->tp_flag = parameters->tp_flag; - cp->tp_on = 1; - } - - cp->img_size = 0; - for(i=0;inumcomps ;i++){ - cp->img_size += (image->comps[i].w *image->comps[i].h * image->comps[i].prec); - } - - -#ifdef USE_JPWL - /* - calculate JPWL encoding parameters - */ - - if (parameters->jpwl_epc_on) { - int i; - - /* set JPWL on */ - cp->epc_on = true; - cp->info_on = false; /* no informative technique */ - - /* set EPB on */ - if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) { - cp->epb_on = true; - - cp->hprot_MH = parameters->jpwl_hprot_MH; - for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { - cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i]; - cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i]; - } - /* if tile specs are not specified, copy MH specs */ - if (cp->hprot_TPH[0] == -1) { - cp->hprot_TPH_tileno[0] = 0; - cp->hprot_TPH[0] = parameters->jpwl_hprot_MH; - } - for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) { - cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i]; - cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i]; - cp->pprot[i] = parameters->jpwl_pprot[i]; - } - } - - /* set ESD writing */ - if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) { - cp->esd_on = true; - - cp->sens_size = parameters->jpwl_sens_size; - cp->sens_addr = parameters->jpwl_sens_addr; - cp->sens_range = parameters->jpwl_sens_range; - - cp->sens_MH = parameters->jpwl_sens_MH; - for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { - cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i]; - cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i]; - } - } - - /* always set RED writing to false: we are at the encoder */ - cp->red_on = false; - - } else { - cp->epc_on = false; - } -#endif /* USE_JPWL */ - - - /* initialize the mutiple tiles */ - /* ---------------------------- */ - cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t)); - - for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { - opj_tcp_t *tcp = &cp->tcps[tileno]; - tcp->numlayers = parameters->tcp_numlayers; - for (j = 0; j < tcp->numlayers; j++) { - if(cp->cinema){ - if (cp->fixed_quality) { - tcp->distoratio[j] = parameters->tcp_distoratio[j]; - } - tcp->rates[j] = parameters->tcp_rates[j]; - }else{ - if (cp->fixed_quality) { /* add fixed_quality */ - tcp->distoratio[j] = parameters->tcp_distoratio[j]; - } else { - tcp->rates[j] = parameters->tcp_rates[j]; - } - } - } - tcp->csty = parameters->csty; - tcp->prg = parameters->prog_order; - tcp->mct = parameters->tcp_mct; - - numpocs_tile = 0; - tcp->POC = 0; - if (parameters->numpocs) { - /* initialisation of POC */ - tcp->POC = 1; - for (i = 0; i < parameters->numpocs; i++) { - if((tileno == parameters->POC[i].tile - 1) || (parameters->POC[i].tile == -1)) { - opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile]; - tcp_poc->resno0 = parameters->POC[numpocs_tile].resno0; - tcp_poc->compno0 = parameters->POC[numpocs_tile].compno0; - tcp_poc->layno1 = parameters->POC[numpocs_tile].layno1; - tcp_poc->resno1 = parameters->POC[numpocs_tile].resno1; - tcp_poc->compno1 = parameters->POC[numpocs_tile].compno1; - tcp_poc->prg1 = parameters->POC[numpocs_tile].prg1; - tcp_poc->tile = parameters->POC[numpocs_tile].tile; - numpocs_tile++; - } - } - tcp->numpocs = numpocs_tile -1 ; - }else{ - tcp->numpocs = 0; - } - - tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t)); - - for (i = 0; i < image->numcomps; i++) { - opj_tccp_t *tccp = &tcp->tccps[i]; - tccp->csty = parameters->csty & 0x01; /* 0 => one precinct || 1 => custom precinct */ - tccp->numresolutions = parameters->numresolution; - tccp->cblkw = int_floorlog2(parameters->cblockw_init); - tccp->cblkh = int_floorlog2(parameters->cblockh_init); - tccp->cblksty = parameters->mode; - tccp->qmfbid = parameters->irreversible ? 0 : 1; - tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT : J2K_CCP_QNTSTY_NOQNT; - tccp->numgbits = 2; - if (i == parameters->roi_compno) { - tccp->roishift = parameters->roi_shift; - } else { - tccp->roishift = 0; - } - - if(parameters->cp_cinema) - { - //Precinct size for lowest frequency subband=128 - tccp->prcw[0] = 7; - tccp->prch[0] = 7; - //Precinct size at all other resolutions = 256 - for (j = 1; j < tccp->numresolutions; j++) { - tccp->prcw[j] = 8; - tccp->prch[j] = 8; - } - }else{ - if (parameters->csty & J2K_CCP_CSTY_PRT) { - int p = 0; - for (j = tccp->numresolutions - 1; j >= 0; j--) { - if (p < parameters->res_spec) { - - if (parameters->prcw_init[p] < 1) { - tccp->prcw[j] = 1; - } else { - tccp->prcw[j] = int_floorlog2(parameters->prcw_init[p]); - } - - if (parameters->prch_init[p] < 1) { - tccp->prch[j] = 1; - }else { - tccp->prch[j] = int_floorlog2(parameters->prch_init[p]); - } - - } else { - int res_spec = parameters->res_spec; - int size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1)); - int size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1)); - - if (size_prcw < 1) { - tccp->prcw[j] = 1; - } else { - tccp->prcw[j] = int_floorlog2(size_prcw); - } - - if (size_prch < 1) { - tccp->prch[j] = 1; - } else { - tccp->prch[j] = int_floorlog2(size_prch); - } - } - p++; - /*printf("\nsize precinct for level %d : %d,%d\n", j,tccp->prcw[j], tccp->prch[j]); */ - } //end for - } else { - for (j = 0; j < tccp->numresolutions; j++) { - tccp->prcw[j] = 15; - tccp->prch[j] = 15; - } - } - } - - dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec); - } - } -} - -bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) { - int tileno, compno; - opj_cp_t *cp = NULL; - - opj_tcd_t *tcd = NULL; /* TCD component */ - - j2k->cio = cio; - j2k->image = image; - - cp = j2k->cp; - - /* j2k_dump_cp(stdout, image, cp); */ - - /* INDEX >> */ - j2k->cstr_info = cstr_info; - if (cstr_info) { - int compno; - cstr_info->tile = (opj_tile_info_t *) opj_malloc(cp->tw * cp->th * sizeof(opj_tile_info_t)); - cstr_info->image_w = image->x1 - image->x0; - cstr_info->image_h = image->y1 - image->y0; - cstr_info->prog = (&cp->tcps[0])->prg; - cstr_info->tw = cp->tw; - cstr_info->th = cp->th; - cstr_info->tile_x = cp->tdx; /* new version parser */ - cstr_info->tile_y = cp->tdy; /* new version parser */ - cstr_info->tile_Ox = cp->tx0; /* new version parser */ - cstr_info->tile_Oy = cp->ty0; /* new version parser */ - cstr_info->numcomps = image->numcomps; - cstr_info->numlayers = (&cp->tcps[0])->numlayers; - cstr_info->numdecompos = (int*) opj_malloc(image->numcomps * sizeof(int)); - for (compno=0; compno < image->numcomps; compno++) { - cstr_info->numdecompos[compno] = (&cp->tcps[0])->tccps->numresolutions - 1; - } - cstr_info->D_max = 0.0; /* ADD Marcela */ - cstr_info->main_head_start = cio_tell(cio); /* position of SOC */ - cstr_info->maxmarknum = 100; - cstr_info->marker = (opj_marker_info_t *) opj_malloc(cstr_info->maxmarknum * sizeof(opj_marker_info_t)); - cstr_info->marknum = 0; - } - /* << INDEX */ - - j2k_write_soc(j2k); - j2k_write_siz(j2k); - j2k_write_cod(j2k); - j2k_write_qcd(j2k); - - if(cp->cinema){ - for (compno = 1; compno < image->numcomps; compno++) { - j2k_write_coc(j2k, compno); - j2k_write_qcc(j2k, compno); - } - } - - for (compno = 0; compno < image->numcomps; compno++) { - opj_tcp_t *tcp = &cp->tcps[0]; - if (tcp->tccps[compno].roishift) - j2k_write_rgn(j2k, compno, 0); - } - if (cp->comment != NULL) { - j2k_write_com(j2k); - } - - j2k->totnum_tp = j2k_calculate_tp(cp,image->numcomps,image,j2k); - /* TLM Marker*/ - if(cp->cinema){ - j2k_write_tlm(j2k); - if (cp->cinema == CINEMA4K_24) { - j2k_write_poc(j2k); - } - } - - /* uncomment only for testing JPSEC marker writing */ - /* j2k_write_sec(j2k); */ - - /* INDEX >> */ - if(cstr_info) { - cstr_info->main_head_end = cio_tell(cio) - 1; - } - /* << INDEX */ - /**** Main Header ENDS here ***/ - - /* create the tile encoder */ - tcd = tcd_create(j2k->cinfo); - - /* encode each tile */ - for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { - int pino; - int tilepartno=0; - /* UniPG>> */ - int acc_pack_num = 0; - /* <tcps[tileno]; - opj_event_msg(j2k->cinfo, EVT_INFO, "tile number %d / %d\n", tileno + 1, cp->tw * cp->th); - - j2k->curtileno = tileno; - j2k->cur_tp_num = 0; - tcd->cur_totnum_tp = j2k->cur_totnum_tp[j2k->curtileno]; - /* initialisation before tile encoding */ - if (tileno == 0) { - tcd_malloc_encode(tcd, image, cp, j2k->curtileno); - } else { - tcd_init_encode(tcd, image, cp, j2k->curtileno); - } - - /* INDEX >> */ - if(cstr_info) { - cstr_info->tile[j2k->curtileno].start_pos = cio_tell(cio) + j2k->pos_correction; - } - /* << INDEX */ - - for(pino = 0; pino <= tcp->numpocs; pino++) { - int tot_num_tp; - tcd->cur_pino=pino; - - /*Get number of tile parts*/ - tot_num_tp = j2k_get_num_tp(cp,pino,tileno); - tcd->tp_pos = cp->tp_pos; - - for(tilepartno = 0; tilepartno < tot_num_tp ; tilepartno++){ - j2k->tp_num = tilepartno; - /* INDEX >> */ - if(cstr_info) - cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_start_pos = - cio_tell(cio) + j2k->pos_correction; - /* << INDEX */ - j2k_write_sot(j2k); - - if(j2k->cur_tp_num == 0 && cp->cinema == 0){ - for (compno = 1; compno < image->numcomps; compno++) { - j2k_write_coc(j2k, compno); - j2k_write_qcc(j2k, compno); - } - if (cp->tcps[tileno].numpocs) { - j2k_write_poc(j2k); - } - } - - /* INDEX >> */ - if(cstr_info) - cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_header = - cio_tell(cio) + j2k->pos_correction + 1; - /* << INDEX */ - - j2k_write_sod(j2k, tcd); - - /* INDEX >> */ - if(cstr_info) { - cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_pos = - cio_tell(cio) + j2k->pos_correction - 1; - cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_start_pack = - acc_pack_num; - cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_numpacks = - cstr_info->packno - acc_pack_num; - acc_pack_num = cstr_info->packno; - } - /* << INDEX */ - - j2k->cur_tp_num++; - } - } - if(cstr_info) { - cstr_info->tile[j2k->curtileno].end_pos = cio_tell(cio) + j2k->pos_correction - 1; - } - - - /* - if (tile->PPT) { // BAD PPT !!! - FILE *PPT_file; - int i; - PPT_file=fopen("PPT","rb"); - fprintf(stderr,"%c%c%c%c",255,97,tile->len_ppt/256,tile->len_ppt%256); - for (i=0;ilen_ppt;i++) { - unsigned char elmt; - fread(&elmt, 1, 1, PPT_file); - fwrite(&elmt,1,1,f); - } - fclose(PPT_file); - unlink("PPT"); - } - */ - - } - - /* destroy the tile encoder */ - tcd_free_encode(tcd); - tcd_destroy(tcd); - - opj_free(j2k->cur_totnum_tp); - - j2k_write_eoc(j2k); - - if(cstr_info) { - cstr_info->codestream_size = cio_tell(cio) + j2k->pos_correction; - /* UniPG>> */ - /* The following adjustment is done to adjust the codestream size */ - /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */ - /* the first bunch of bytes is not in the codestream */ - cstr_info->codestream_size -= cstr_info->main_head_start; - /* <epc_on) { - - /* encode according to JPWL */ - jpwl_encode(j2k, cio, image); - - } -#endif /* USE_JPWL */ - - return true; -} - - - - - - +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2006-2007, Parvatha Elangovan + * Copyright (c) 2010-2011, Kaori Hagihara + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#include "opj_includes.h" + +/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */ +/*@{*/ + +/** @name Local static functions */ +/*@{*/ + +/** +Write the SOC marker (Start Of Codestream) +@param j2k J2K handle +*/ +static void j2k_write_soc(opj_j2k_t *j2k); +/** +Read the SOC marker (Start of Codestream) +@param j2k J2K handle +*/ +static void j2k_read_soc(opj_j2k_t *j2k); +/** +Write the SIZ marker (image and tile size) +@param j2k J2K handle +*/ +static void j2k_write_siz(opj_j2k_t *j2k); +/** +Read the SIZ marker (image and tile size) +@param j2k J2K handle +*/ +static void j2k_read_siz(opj_j2k_t *j2k); +/** +Write the COM marker (comment) +@param j2k J2K handle +*/ +static void j2k_write_com(opj_j2k_t *j2k); +/** +Read the COM marker (comment) +@param j2k J2K handle +*/ +static void j2k_read_com(opj_j2k_t *j2k); +/** +Write the value concerning the specified component in the marker COD and COC +@param j2k J2K handle +@param compno Number of the component concerned by the information written +*/ +static void j2k_write_cox(opj_j2k_t *j2k, int compno); +/** +Read the value concerning the specified component in the marker COD and COC +@param j2k J2K handle +@param compno Number of the component concerned by the information read +*/ +static void j2k_read_cox(opj_j2k_t *j2k, int compno); +/** +Write the COD marker (coding style default) +@param j2k J2K handle +*/ +static void j2k_write_cod(opj_j2k_t *j2k); +/** +Read the COD marker (coding style default) +@param j2k J2K handle +*/ +static void j2k_read_cod(opj_j2k_t *j2k); +/** +Write the COC marker (coding style component) +@param j2k J2K handle +@param compno Number of the component concerned by the information written +*/ +static void j2k_write_coc(opj_j2k_t *j2k, int compno); +/** +Read the COC marker (coding style component) +@param j2k J2K handle +*/ +static void j2k_read_coc(opj_j2k_t *j2k); +/** +Write the value concerning the specified component in the marker QCD and QCC +@param j2k J2K handle +@param compno Number of the component concerned by the information written +*/ +static void j2k_write_qcx(opj_j2k_t *j2k, int compno); +/** +Read the value concerning the specified component in the marker QCD and QCC +@param j2k J2K handle +@param compno Number of the component concern by the information read +@param len Length of the information in the QCX part of the marker QCD/QCC +*/ +static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len); +/** +Write the QCD marker (quantization default) +@param j2k J2K handle +*/ +static void j2k_write_qcd(opj_j2k_t *j2k); +/** +Read the QCD marker (quantization default) +@param j2k J2K handle +*/ +static void j2k_read_qcd(opj_j2k_t *j2k); +/** +Write the QCC marker (quantization component) +@param j2k J2K handle +@param compno Number of the component concerned by the information written +*/ +static void j2k_write_qcc(opj_j2k_t *j2k, int compno); +/** +Read the QCC marker (quantization component) +@param j2k J2K handle +*/ +static void j2k_read_qcc(opj_j2k_t *j2k); +/** +Write the POC marker (progression order change) +@param j2k J2K handle +*/ +static void j2k_write_poc(opj_j2k_t *j2k); +/** +Read the POC marker (progression order change) +@param j2k J2K handle +*/ +static void j2k_read_poc(opj_j2k_t *j2k); +/** +Read the CRG marker (component registration) +@param j2k J2K handle +*/ +static void j2k_read_crg(opj_j2k_t *j2k); +/** +Read the TLM marker (tile-part lengths) +@param j2k J2K handle +*/ +static void j2k_read_tlm(opj_j2k_t *j2k); +/** +Read the PLM marker (packet length, main header) +@param j2k J2K handle +*/ +static void j2k_read_plm(opj_j2k_t *j2k); +/** +Read the PLT marker (packet length, tile-part header) +@param j2k J2K handle +*/ +static void j2k_read_plt(opj_j2k_t *j2k); +/** +Read the PPM marker (packet packet headers, main header) +@param j2k J2K handle +*/ +static void j2k_read_ppm(opj_j2k_t *j2k); +/** +Read the PPT marker (packet packet headers, tile-part header) +@param j2k J2K handle +*/ +static void j2k_read_ppt(opj_j2k_t *j2k); +/** +Write the TLM marker (Mainheader) +@param j2k J2K handle +*/ +static void j2k_write_tlm(opj_j2k_t *j2k); +/** +Write the SOT marker (start of tile-part) +@param j2k J2K handle +*/ +static void j2k_write_sot(opj_j2k_t *j2k); +/** +Read the SOT marker (start of tile-part) +@param j2k J2K handle +*/ +static void j2k_read_sot(opj_j2k_t *j2k); +/** +Write the SOD marker (start of data) +@param j2k J2K handle +@param tile_coder Pointer to a TCD handle +*/ +static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder); +/** +Read the SOD marker (start of data) +@param j2k J2K handle +*/ +static void j2k_read_sod(opj_j2k_t *j2k); +/** +Write the RGN marker (region-of-interest) +@param j2k J2K handle +@param compno Number of the component concerned by the information written +@param tileno Number of the tile concerned by the information written +*/ +static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno); +/** +Read the RGN marker (region-of-interest) +@param j2k J2K handle +*/ +static void j2k_read_rgn(opj_j2k_t *j2k); +/** +Write the EOC marker (end of codestream) +@param j2k J2K handle +*/ +static void j2k_write_eoc(opj_j2k_t *j2k); +/** +Read the EOC marker (end of codestream) +@param j2k J2K handle +*/ +static void j2k_read_eoc(opj_j2k_t *j2k); +/** +Read an unknown marker +@param j2k J2K handle +*/ +static void j2k_read_unk(opj_j2k_t *j2k); +/** +Add main header marker information +@param cstr_info Codestream information structure +@param type marker type +@param pos byte offset of marker segment +@param len length of marker segment + */ +static void j2k_add_mhmarker(opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len); +/** +Add tile header marker information +@param tileno tile index number +@param cstr_info Codestream information structure +@param type marker type +@param pos byte offset of marker segment +@param len length of marker segment + */ +static void j2k_add_tlmarker( int tileno, opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len); + +/*@}*/ + +/*@}*/ + +/* ----------------------------------------------------------------------- */ +typedef struct j2k_prog_order{ + OPJ_PROG_ORDER enum_prog; + char str_prog[5]; +}j2k_prog_order_t; + +j2k_prog_order_t j2k_prog_order_list[] = { + {CPRL, "CPRL"}, + {LRCP, "LRCP"}, + {PCRL, "PCRL"}, + {RLCP, "RLCP"}, + {RPCL, "RPCL"}, + {(OPJ_PROG_ORDER)-1, ""} +}; + +char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order){ + j2k_prog_order_t *po; + for(po = j2k_prog_order_list; po->enum_prog != -1; po++ ){ + if(po->enum_prog == prg_order){ + break; + } + } + return po->str_prog; +} + +/* ----------------------------------------------------------------------- */ +static int j2k_get_num_tp(opj_cp_t *cp,int pino,int tileno){ + char *prog; + int i; + int tpnum=1,tpend=0; + opj_tcp_t *tcp = &cp->tcps[tileno]; + prog = j2k_convert_progression_order(tcp->prg); + + if(cp->tp_on == 1){ + for(i=0;i<4;i++){ + if(tpend!=1){ + if( cp->tp_flag == prog[i] ){ + tpend=1;cp->tp_pos=i; + } + switch(prog[i]){ + case 'C': + tpnum= tpnum * tcp->pocs[pino].compE; + break; + case 'R': + tpnum= tpnum * tcp->pocs[pino].resE; + break; + case 'P': + tpnum= tpnum * tcp->pocs[pino].prcE; + break; + case 'L': + tpnum= tpnum * tcp->pocs[pino].layE; + break; + } + } + } + }else{ + tpnum=1; + } + return tpnum; +} + +/** mem allocation for TLM marker*/ +int j2k_calculate_tp(opj_cp_t *cp,int img_numcomp,opj_image_t *image,opj_j2k_t *j2k ){ + int pino,tileno,totnum_tp=0; + + OPJ_ARG_NOT_USED(img_numcomp); + + j2k->cur_totnum_tp = (int *) opj_malloc(cp->tw * cp->th * sizeof(int)); + for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { + int cur_totnum_tp = 0; + opj_tcp_t *tcp = &cp->tcps[tileno]; + for(pino = 0; pino <= tcp->numpocs; pino++) { + int tp_num=0; + opj_pi_iterator_t *pi = pi_initialise_encode(image, cp, tileno,FINAL_PASS); + if(!pi) { return -1;} + tp_num = j2k_get_num_tp(cp,pino,tileno); + totnum_tp = totnum_tp + tp_num; + cur_totnum_tp = cur_totnum_tp + tp_num; + pi_destroy(pi, cp, tileno); + } + j2k->cur_totnum_tp[tileno] = cur_totnum_tp; + /* INDEX >> */ + if (j2k->cstr_info) { + j2k->cstr_info->tile[tileno].num_tps = cur_totnum_tp; + j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(cur_totnum_tp * sizeof(opj_tp_info_t)); + } + /* << INDEX */ + } + return totnum_tp; +} + +static void j2k_write_soc(opj_j2k_t *j2k) { + opj_cio_t *cio = j2k->cio; + cio_write(cio, J2K_MS_SOC, 2); + + if(j2k->cstr_info) + j2k_add_mhmarker(j2k->cstr_info, J2K_MS_SOC, cio_tell(cio), 0); + +/* UniPG>> */ +#ifdef USE_JPWL + + /* update markers struct */ + j2k_add_marker(j2k->cstr_info, J2K_MS_SOC, cio_tell(cio) - 2, 2); +#endif /* USE_JPWL */ +/* <state = J2K_STATE_MHSIZ; + /* Index */ + if (j2k->cstr_info) { + j2k->cstr_info->main_head_start = cio_tell(j2k->cio) - 2; + j2k->cstr_info->codestream_size = cio_numbytesleft(j2k->cio) + 2 - j2k->cstr_info->main_head_start; + } +} + +static void j2k_write_siz(opj_j2k_t *j2k) { + int i; + int lenp, len; + + opj_cio_t *cio = j2k->cio; + opj_image_t *image = j2k->image; + opj_cp_t *cp = j2k->cp; + + cio_write(cio, J2K_MS_SIZ, 2); /* SIZ */ + lenp = cio_tell(cio); + cio_skip(cio, 2); + cio_write(cio, cp->rsiz, 2); /* Rsiz (capabilities) */ + cio_write(cio, image->x1, 4); /* Xsiz */ + cio_write(cio, image->y1, 4); /* Ysiz */ + cio_write(cio, image->x0, 4); /* X0siz */ + cio_write(cio, image->y0, 4); /* Y0siz */ + cio_write(cio, cp->tdx, 4); /* XTsiz */ + cio_write(cio, cp->tdy, 4); /* YTsiz */ + cio_write(cio, cp->tx0, 4); /* XT0siz */ + cio_write(cio, cp->ty0, 4); /* YT0siz */ + cio_write(cio, image->numcomps, 2); /* Csiz */ + for (i = 0; i < image->numcomps; i++) { + cio_write(cio, image->comps[i].prec - 1 + (image->comps[i].sgnd << 7), 1); /* Ssiz_i */ + cio_write(cio, image->comps[i].dx, 1); /* XRsiz_i */ + cio_write(cio, image->comps[i].dy, 1); /* YRsiz_i */ + } + len = cio_tell(cio) - lenp; + cio_seek(cio, lenp); + cio_write(cio, len, 2); /* Lsiz */ + cio_seek(cio, lenp + len); + + if(j2k->cstr_info) + j2k_add_mhmarker(j2k->cstr_info, J2K_MS_SIZ, lenp, len); +} + +static void j2k_read_siz(opj_j2k_t *j2k) { + int len, i; + + opj_cio_t *cio = j2k->cio; + opj_image_t *image = j2k->image; + opj_cp_t *cp = j2k->cp; + + len = cio_read(cio, 2); /* Lsiz */ + cio_read(cio, 2); /* Rsiz (capabilities) */ + image->x1 = cio_read(cio, 4); /* Xsiz */ + image->y1 = cio_read(cio, 4); /* Ysiz */ + image->x0 = cio_read(cio, 4); /* X0siz */ + image->y0 = cio_read(cio, 4); /* Y0siz */ + cp->tdx = cio_read(cio, 4); /* XTsiz */ + cp->tdy = cio_read(cio, 4); /* YTsiz */ + cp->tx0 = cio_read(cio, 4); /* XT0siz */ + cp->ty0 = cio_read(cio, 4); /* YT0siz */ + + if ((image->x0<0)||(image->x1<0)||(image->y0<0)||(image->y1<0)) { + opj_event_msg(j2k->cinfo, EVT_ERROR, + "%s: invalid image size (x0:%d, x1:%d, y0:%d, y1:%d)\n", + image->x0,image->x1,image->y0,image->y1); + return; + } + + image->numcomps = cio_read(cio, 2); /* Csiz */ + +#ifdef USE_JPWL + if (j2k->cp->correct) { + /* if JPWL is on, we check whether TX errors have damaged + too much the SIZ parameters */ + if (!(image->x1 * image->y1)) { + opj_event_msg(j2k->cinfo, EVT_ERROR, + "JPWL: bad image size (%d x %d)\n", + image->x1, image->y1); + if (!JPWL_ASSUME || JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + } + if (image->numcomps != ((len - 38) / 3)) { + opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, + "JPWL: Csiz is %d => space in SIZ only for %d comps.!!!\n", + image->numcomps, ((len - 38) / 3)); + if (!JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + /* we try to correct */ + opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n"); + if (image->numcomps < ((len - 38) / 3)) { + len = 38 + 3 * image->numcomps; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting Lsiz to %d => HYPOTHESIS!!!\n", + len); + } else { + image->numcomps = ((len - 38) / 3); + opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting Csiz to %d => HYPOTHESIS!!!\n", + image->numcomps); + } + } + + /* update components number in the jpwl_exp_comps filed */ + cp->exp_comps = image->numcomps; + } +#endif /* USE_JPWL */ + + image->comps = (opj_image_comp_t*) opj_calloc(image->numcomps, sizeof(opj_image_comp_t)); + for (i = 0; i < image->numcomps; i++) { + int tmp, w, h; + tmp = cio_read(cio, 1); /* Ssiz_i */ + image->comps[i].prec = (tmp & 0x7f) + 1; + image->comps[i].sgnd = tmp >> 7; + image->comps[i].dx = cio_read(cio, 1); /* XRsiz_i */ + image->comps[i].dy = cio_read(cio, 1); /* YRsiz_i */ + +#ifdef USE_JPWL + if (j2k->cp->correct) { + /* if JPWL is on, we check whether TX errors have damaged + too much the SIZ parameters, again */ + if (!(image->comps[i].dx * image->comps[i].dy)) { + opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, + "JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\n", + i, i, image->comps[i].dx, image->comps[i].dy); + if (!JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + /* we try to correct */ + opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n"); + if (!image->comps[i].dx) { + image->comps[i].dx = 1; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting XRsiz_%d to %d => HYPOTHESIS!!!\n", + i, image->comps[i].dx); + } + if (!image->comps[i].dy) { + image->comps[i].dy = 1; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting YRsiz_%d to %d => HYPOTHESIS!!!\n", + i, image->comps[i].dy); + } + } + + } +#endif /* USE_JPWL */ + + /* TODO: unused ? */ + w = int_ceildiv(image->x1 - image->x0, image->comps[i].dx); + h = int_ceildiv(image->y1 - image->y0, image->comps[i].dy); + + image->comps[i].resno_decoded = 0; /* number of resolution decoded */ + image->comps[i].factor = cp->reduce; /* reducing factor per component */ + } + + cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx); + cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy); + +#ifdef USE_JPWL + if (j2k->cp->correct) { + /* if JPWL is on, we check whether TX errors have damaged + too much the SIZ parameters */ + if ((cp->tw < 1) || (cp->th < 1) || (cp->tw > cp->max_tiles) || (cp->th > cp->max_tiles)) { + opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, + "JPWL: bad number of tiles (%d x %d)\n", + cp->tw, cp->th); + if (!JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + /* we try to correct */ + opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n"); + if (cp->tw < 1) { + cp->tw= 1; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting %d tiles in x => HYPOTHESIS!!!\n", + cp->tw); + } + if (cp->tw > cp->max_tiles) { + cp->tw= 1; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- too large x, increase expectance of %d\n" + "- setting %d tiles in x => HYPOTHESIS!!!\n", + cp->max_tiles, cp->tw); + } + if (cp->th < 1) { + cp->th= 1; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting %d tiles in y => HYPOTHESIS!!!\n", + cp->th); + } + if (cp->th > cp->max_tiles) { + cp->th= 1; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- too large y, increase expectance of %d to continue\n", + "- setting %d tiles in y => HYPOTHESIS!!!\n", + cp->max_tiles, cp->th); + } + } + } +#endif /* USE_JPWL */ + + cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t)); + cp->tileno = (int*) opj_malloc(cp->tw * cp->th * sizeof(int)); + cp->tileno_size = 0; + +#ifdef USE_JPWL + if (j2k->cp->correct) { + if (!cp->tcps) { + opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, + "JPWL: could not alloc tcps field of cp\n"); + if (!JPWL_ASSUME || JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + } + } +#endif /* USE_JPWL */ + + for (i = 0; i < cp->tw * cp->th; i++) { + cp->tcps[i].POC = 0; + cp->tcps[i].numpocs = 0; + cp->tcps[i].first = 1; + } + + /* Initialization for PPM marker */ + cp->ppm = 0; + cp->ppm_data = NULL; + cp->ppm_data_first = NULL; + cp->ppm_previous = 0; + cp->ppm_store = 0; + + j2k->default_tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t)); + for (i = 0; i < cp->tw * cp->th; i++) { + cp->tcps[i].tccps = (opj_tccp_t*) opj_malloc(image->numcomps * sizeof(opj_tccp_t)); + } + j2k->tile_data = (unsigned char**) opj_calloc(cp->tw * cp->th, sizeof(unsigned char*)); + j2k->tile_len = (int*) opj_calloc(cp->tw * cp->th, sizeof(int)); + j2k->state = J2K_STATE_MH; + + /* Index */ + if (j2k->cstr_info) { + opj_codestream_info_t *cstr_info = j2k->cstr_info; + cstr_info->image_w = image->x1 - image->x0; + cstr_info->image_h = image->y1 - image->y0; + cstr_info->numcomps = image->numcomps; + cstr_info->tw = cp->tw; + cstr_info->th = cp->th; + cstr_info->tile_x = cp->tdx; + cstr_info->tile_y = cp->tdy; + cstr_info->tile_Ox = cp->tx0; + cstr_info->tile_Oy = cp->ty0; + cstr_info->tile = (opj_tile_info_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tile_info_t)); + } +} + +static void j2k_write_com(opj_j2k_t *j2k) { + unsigned int i; + int lenp, len; + + if(j2k->cp->comment) { + opj_cio_t *cio = j2k->cio; + char *comment = j2k->cp->comment; + + cio_write(cio, J2K_MS_COM, 2); + lenp = cio_tell(cio); + cio_skip(cio, 2); + cio_write(cio, 1, 2); /* General use (IS 8859-15:1999 (Latin) values) */ + for (i = 0; i < strlen(comment); i++) { + cio_write(cio, comment[i], 1); + } + len = cio_tell(cio) - lenp; + cio_seek(cio, lenp); + cio_write(cio, len, 2); + cio_seek(cio, lenp + len); + + + if(j2k->cstr_info) + j2k_add_mhmarker(j2k->cstr_info, J2K_MS_COM, lenp, len); + + } +} + +static void j2k_read_com(opj_j2k_t *j2k) { + int len; + + opj_cio_t *cio = j2k->cio; + + len = cio_read(cio, 2); + cio_skip(cio, len - 2); +} + +static void j2k_write_cox(opj_j2k_t *j2k, int compno) { + int i; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; + opj_tccp_t *tccp = &tcp->tccps[compno]; + opj_cio_t *cio = j2k->cio; + + cio_write(cio, tccp->numresolutions - 1, 1); /* SPcox (D) */ + cio_write(cio, tccp->cblkw - 2, 1); /* SPcox (E) */ + cio_write(cio, tccp->cblkh - 2, 1); /* SPcox (F) */ + cio_write(cio, tccp->cblksty, 1); /* SPcox (G) */ + cio_write(cio, tccp->qmfbid, 1); /* SPcox (H) */ + + if (tccp->csty & J2K_CCP_CSTY_PRT) { + for (i = 0; i < tccp->numresolutions; i++) { + cio_write(cio, tccp->prcw[i] + (tccp->prch[i] << 4), 1); /* SPcox (I_i) */ + } + } +} + +static void j2k_read_cox(opj_j2k_t *j2k, int compno) { + int i; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; + opj_tccp_t *tccp = &tcp->tccps[compno]; + opj_cio_t *cio = j2k->cio; + + tccp->numresolutions = cio_read(cio, 1) + 1; /* SPcox (D) */ + + /* If user wants to remove more resolutions than the codestream contains, return error*/ + if (cp->reduce >= tccp->numresolutions) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "Error decoding component %d.\nThe number of resolutions to remove is higher than the number " + "of resolutions of this component\nModify the cp_reduce parameter.\n\n", compno); + j2k->state |= J2K_STATE_ERR; + } + + tccp->cblkw = cio_read(cio, 1) + 2; /* SPcox (E) */ + tccp->cblkh = cio_read(cio, 1) + 2; /* SPcox (F) */ + tccp->cblksty = cio_read(cio, 1); /* SPcox (G) */ + tccp->qmfbid = cio_read(cio, 1); /* SPcox (H) */ + if (tccp->csty & J2K_CP_CSTY_PRT) { + for (i = 0; i < tccp->numresolutions; i++) { + int tmp = cio_read(cio, 1); /* SPcox (I_i) */ + tccp->prcw[i] = tmp & 0xf; + tccp->prch[i] = tmp >> 4; + } + } + + /* INDEX >> */ + if(j2k->cstr_info && compno == 0) { + for (i = 0; i < tccp->numresolutions; i++) { + if (tccp->csty & J2K_CP_CSTY_PRT) { + j2k->cstr_info->tile[j2k->curtileno].pdx[i] = tccp->prcw[i]; + j2k->cstr_info->tile[j2k->curtileno].pdy[i] = tccp->prch[i]; + } + else { + j2k->cstr_info->tile[j2k->curtileno].pdx[i] = 15; + j2k->cstr_info->tile[j2k->curtileno].pdx[i] = 15; + } + } + } + /* << INDEX */ +} + +static void j2k_write_cod(opj_j2k_t *j2k) { + opj_cp_t *cp = NULL; + opj_tcp_t *tcp = NULL; + int lenp, len; + + opj_cio_t *cio = j2k->cio; + + cio_write(cio, J2K_MS_COD, 2); /* COD */ + + lenp = cio_tell(cio); + cio_skip(cio, 2); + + cp = j2k->cp; + tcp = &cp->tcps[j2k->curtileno]; + + cio_write(cio, tcp->csty, 1); /* Scod */ + cio_write(cio, tcp->prg, 1); /* SGcod (A) */ + cio_write(cio, tcp->numlayers, 2); /* SGcod (B) */ + cio_write(cio, tcp->mct, 1); /* SGcod (C) */ + + j2k_write_cox(j2k, 0); + len = cio_tell(cio) - lenp; + cio_seek(cio, lenp); + cio_write(cio, len, 2); /* Lcod */ + cio_seek(cio, lenp + len); + + if(j2k->cstr_info) + j2k_add_mhmarker(j2k->cstr_info, J2K_MS_COD, lenp, len); + +} + +static void j2k_read_cod(opj_j2k_t *j2k) { + int len, i, pos; + + opj_cio_t *cio = j2k->cio; + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; + opj_image_t *image = j2k->image; + + len = cio_read(cio, 2); /* Lcod */ + tcp->csty = cio_read(cio, 1); /* Scod */ + tcp->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); /* SGcod (A) */ + tcp->numlayers = cio_read(cio, 2); /* SGcod (B) */ + tcp->mct = cio_read(cio, 1); /* SGcod (C) */ + + pos = cio_tell(cio); + for (i = 0; i < image->numcomps; i++) { + tcp->tccps[i].csty = tcp->csty & J2K_CP_CSTY_PRT; + cio_seek(cio, pos); + j2k_read_cox(j2k, i); + } + + /* Index */ + if (j2k->cstr_info) { + opj_codestream_info_t *cstr_info = j2k->cstr_info; + cstr_info->prog = tcp->prg; + cstr_info->numlayers = tcp->numlayers; + cstr_info->numdecompos = (int*) opj_malloc(image->numcomps * sizeof(int)); + for (i = 0; i < image->numcomps; i++) { + cstr_info->numdecompos[i] = tcp->tccps[i].numresolutions - 1; + } + } +} + +static void j2k_write_coc(opj_j2k_t *j2k, int compno) { + int lenp, len; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; + opj_image_t *image = j2k->image; + opj_cio_t *cio = j2k->cio; + + cio_write(cio, J2K_MS_COC, 2); /* COC */ + lenp = cio_tell(cio); + cio_skip(cio, 2); + cio_write(cio, compno, image->numcomps <= 256 ? 1 : 2); /* Ccoc */ + cio_write(cio, tcp->tccps[compno].csty, 1); /* Scoc */ + j2k_write_cox(j2k, compno); + len = cio_tell(cio) - lenp; + cio_seek(cio, lenp); + cio_write(cio, len, 2); /* Lcoc */ + cio_seek(cio, lenp + len); +} + +static void j2k_read_coc(opj_j2k_t *j2k) { + int len, compno; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; + opj_image_t *image = j2k->image; + opj_cio_t *cio = j2k->cio; + + len = cio_read(cio, 2); /* Lcoc */ + compno = cio_read(cio, image->numcomps <= 256 ? 1 : 2); /* Ccoc */ + tcp->tccps[compno].csty = cio_read(cio, 1); /* Scoc */ + j2k_read_cox(j2k, compno); +} + +static void j2k_write_qcx(opj_j2k_t *j2k, int compno) { + int bandno, numbands; + int expn, mant; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; + opj_tccp_t *tccp = &tcp->tccps[compno]; + opj_cio_t *cio = j2k->cio; + + cio_write(cio, tccp->qntsty + (tccp->numgbits << 5), 1); /* Sqcx */ + numbands = tccp->qntsty == J2K_CCP_QNTSTY_SIQNT ? 1 : tccp->numresolutions * 3 - 2; + + for (bandno = 0; bandno < numbands; bandno++) { + expn = tccp->stepsizes[bandno].expn; + mant = tccp->stepsizes[bandno].mant; + + if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { + cio_write(cio, expn << 3, 1); /* SPqcx_i */ + } else { + cio_write(cio, (expn << 11) + mant, 2); /* SPqcx_i */ + } + } +} + +static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len) { + int tmp; + int bandno, numbands; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; + opj_tccp_t *tccp = &tcp->tccps[compno]; + opj_cio_t *cio = j2k->cio; + + tmp = cio_read(cio, 1); /* Sqcx */ + tccp->qntsty = tmp & 0x1f; + tccp->numgbits = tmp >> 5; + numbands = (tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? + 1 : ((tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ? len - 1 : (len - 1) / 2); + +#ifdef USE_JPWL + if (j2k->cp->correct) { + + /* if JPWL is on, we check whether there are too many subbands */ + if ((numbands < 0) || (numbands >= J2K_MAXBANDS)) { + opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, + "JPWL: bad number of subbands in Sqcx (%d)\n", + numbands); + if (!JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + /* we try to correct */ + numbands = 1; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n" + "- setting number of bands to %d => HYPOTHESIS!!!\n", + numbands); + }; + + }; + +#else + /* We check whether there are too many subbands */ + if ((numbands < 0) || (numbands >= J2K_MAXBANDS)) { + opj_event_msg(j2k->cinfo, EVT_WARNING , + "bad number of subbands in Sqcx (%d) regarding to J2K_MAXBANDS (%d) \n" + "- limiting number of bands to J2K_MAXBANDS and try to move to the next markers\n", numbands, J2K_MAXBANDS); + } + +#endif /* USE_JPWL */ + + for (bandno = 0; bandno < numbands; bandno++) { + int expn, mant; + if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { + expn = cio_read(cio, 1) >> 3; /* SPqcx_i */ + mant = 0; + } else { + tmp = cio_read(cio, 2); /* SPqcx_i */ + expn = tmp >> 11; + mant = tmp & 0x7ff; + } + if (bandno < J2K_MAXBANDS){ + tccp->stepsizes[bandno].expn = expn; + tccp->stepsizes[bandno].mant = mant; + } + } + + /* Add Antonin : if scalar_derived -> compute other stepsizes */ + if (tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) { + for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) { + tccp->stepsizes[bandno].expn = + ((tccp->stepsizes[0].expn) - ((bandno - 1) / 3) > 0) ? + (tccp->stepsizes[0].expn) - ((bandno - 1) / 3) : 0; + tccp->stepsizes[bandno].mant = tccp->stepsizes[0].mant; + } + } + /* ddA */ +} + +static void j2k_write_qcd(opj_j2k_t *j2k) { + int lenp, len; + + opj_cio_t *cio = j2k->cio; + + cio_write(cio, J2K_MS_QCD, 2); /* QCD */ + lenp = cio_tell(cio); + cio_skip(cio, 2); + j2k_write_qcx(j2k, 0); + len = cio_tell(cio) - lenp; + cio_seek(cio, lenp); + cio_write(cio, len, 2); /* Lqcd */ + cio_seek(cio, lenp + len); + + if(j2k->cstr_info) + j2k_add_mhmarker(j2k->cstr_info, J2K_MS_QCD, lenp, len); +} + +static void j2k_read_qcd(opj_j2k_t *j2k) { + int len, i, pos; + + opj_cio_t *cio = j2k->cio; + opj_image_t *image = j2k->image; + + len = cio_read(cio, 2); /* Lqcd */ + pos = cio_tell(cio); + for (i = 0; i < image->numcomps; i++) { + cio_seek(cio, pos); + j2k_read_qcx(j2k, i, len - 2); + } +} + +static void j2k_write_qcc(opj_j2k_t *j2k, int compno) { + int lenp, len; + + opj_cio_t *cio = j2k->cio; + + cio_write(cio, J2K_MS_QCC, 2); /* QCC */ + lenp = cio_tell(cio); + cio_skip(cio, 2); + cio_write(cio, compno, j2k->image->numcomps <= 256 ? 1 : 2); /* Cqcc */ + j2k_write_qcx(j2k, compno); + len = cio_tell(cio) - lenp; + cio_seek(cio, lenp); + cio_write(cio, len, 2); /* Lqcc */ + cio_seek(cio, lenp + len); +} + +static void j2k_read_qcc(opj_j2k_t *j2k) { + int len, compno; + int numcomp = j2k->image->numcomps; + opj_cio_t *cio = j2k->cio; + + len = cio_read(cio, 2); /* Lqcc */ + compno = cio_read(cio, numcomp <= 256 ? 1 : 2); /* Cqcc */ + +#ifdef USE_JPWL + if (j2k->cp->correct) { + + static int backup_compno = 0; + + /* compno is negative or larger than the number of components!!! */ + if ((compno < 0) || (compno >= numcomp)) { + opj_event_msg(j2k->cinfo, EVT_ERROR, + "JPWL: bad component number in QCC (%d out of a maximum of %d)\n", + compno, numcomp); + if (!JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + /* we try to correct */ + compno = backup_compno % numcomp; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n" + "- setting component number to %d\n", + compno); + } + + /* keep your private count of tiles */ + backup_compno++; + }; +#endif /* USE_JPWL */ + + j2k_read_qcx(j2k, compno, len - 2 - (numcomp <= 256 ? 1 : 2)); +} + +static void j2k_write_poc(opj_j2k_t *j2k) { + int len, numpchgs, i; + + int numcomps = j2k->image->numcomps; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; + opj_tccp_t *tccp = &tcp->tccps[0]; + opj_cio_t *cio = j2k->cio; + + numpchgs = 1 + tcp->numpocs; + cio_write(cio, J2K_MS_POC, 2); /* POC */ + len = 2 + (5 + 2 * (numcomps <= 256 ? 1 : 2)) * numpchgs; + cio_write(cio, len, 2); /* Lpoc */ + for (i = 0; i < numpchgs; i++) { + opj_poc_t *poc = &tcp->pocs[i]; + cio_write(cio, poc->resno0, 1); /* RSpoc_i */ + cio_write(cio, poc->compno0, (numcomps <= 256 ? 1 : 2)); /* CSpoc_i */ + cio_write(cio, poc->layno1, 2); /* LYEpoc_i */ + poc->layno1 = int_min(poc->layno1, tcp->numlayers); + cio_write(cio, poc->resno1, 1); /* REpoc_i */ + poc->resno1 = int_min(poc->resno1, tccp->numresolutions); + cio_write(cio, poc->compno1, (numcomps <= 256 ? 1 : 2)); /* CEpoc_i */ + poc->compno1 = int_min(poc->compno1, numcomps); + cio_write(cio, poc->prg, 1); /* Ppoc_i */ + } +} + +static void j2k_read_poc(opj_j2k_t *j2k) { + int len, numpchgs, i, old_poc; + + int numcomps = j2k->image->numcomps; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; + opj_cio_t *cio = j2k->cio; + + old_poc = tcp->POC ? tcp->numpocs + 1 : 0; + tcp->POC = 1; + len = cio_read(cio, 2); /* Lpoc */ + numpchgs = (len - 2) / (5 + 2 * (numcomps <= 256 ? 1 : 2)); + + for (i = old_poc; i < numpchgs + old_poc; i++) { + opj_poc_t *poc; + poc = &tcp->pocs[i]; + poc->resno0 = cio_read(cio, 1); /* RSpoc_i */ + poc->compno0 = cio_read(cio, numcomps <= 256 ? 1 : 2); /* CSpoc_i */ + poc->layno1 = cio_read(cio, 2); /* LYEpoc_i */ + poc->resno1 = cio_read(cio, 1); /* REpoc_i */ + poc->compno1 = int_min( + cio_read(cio, numcomps <= 256 ? 1 : 2), (unsigned int) numcomps); /* CEpoc_i */ + poc->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); /* Ppoc_i */ + } + + tcp->numpocs = numpchgs + old_poc - 1; +} + +static void j2k_read_crg(opj_j2k_t *j2k) { + int len, i, Xcrg_i, Ycrg_i; + + opj_cio_t *cio = j2k->cio; + int numcomps = j2k->image->numcomps; + + len = cio_read(cio, 2); /* Lcrg */ + for (i = 0; i < numcomps; i++) { + Xcrg_i = cio_read(cio, 2); /* Xcrg_i */ + Ycrg_i = cio_read(cio, 2); /* Ycrg_i */ + } +} + +static void j2k_read_tlm(opj_j2k_t *j2k) { + int len, Ztlm, Stlm, ST, SP, tile_tlm, i; + long int Ttlm_i, Ptlm_i; + + opj_cio_t *cio = j2k->cio; + + len = cio_read(cio, 2); /* Ltlm */ + Ztlm = cio_read(cio, 1); /* Ztlm */ + Stlm = cio_read(cio, 1); /* Stlm */ + ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02); + SP = (Stlm >> 6) & 0x01; + tile_tlm = (len - 4) / ((SP + 1) * 2 + ST); + for (i = 0; i < tile_tlm; i++) { + Ttlm_i = cio_read(cio, ST); /* Ttlm_i */ + Ptlm_i = cio_read(cio, SP ? 4 : 2); /* Ptlm_i */ + } +} + +static void j2k_read_plm(opj_j2k_t *j2k) { + int len, i, Zplm, Nplm, add, packet_len = 0; + + opj_cio_t *cio = j2k->cio; + + len = cio_read(cio, 2); /* Lplm */ + Zplm = cio_read(cio, 1); /* Zplm */ + len -= 3; + while (len > 0) { + Nplm = cio_read(cio, 4); /* Nplm */ + len -= 4; + for (i = Nplm; i > 0; i--) { + add = cio_read(cio, 1); + len--; + packet_len = (packet_len << 7) + add; /* Iplm_ij */ + if ((add & 0x80) == 0) { + /* New packet */ + packet_len = 0; + } + if (len <= 0) + break; + } + } +} + +static void j2k_read_plt(opj_j2k_t *j2k) { + int len, i, Zplt, packet_len = 0, add; + + opj_cio_t *cio = j2k->cio; + + len = cio_read(cio, 2); /* Lplt */ + Zplt = cio_read(cio, 1); /* Zplt */ + for (i = len - 3; i > 0; i--) { + add = cio_read(cio, 1); + packet_len = (packet_len << 7) + add; /* Iplt_i */ + if ((add & 0x80) == 0) { + /* New packet */ + packet_len = 0; + } + } +} + +static void j2k_read_ppm(opj_j2k_t *j2k) { + int len, Z_ppm, i, j; + int N_ppm; + + opj_cp_t *cp = j2k->cp; + opj_cio_t *cio = j2k->cio; + + len = cio_read(cio, 2); + cp->ppm = 1; + + Z_ppm = cio_read(cio, 1); /* Z_ppm */ + len -= 3; + while (len > 0) { + if (cp->ppm_previous == 0) { + N_ppm = cio_read(cio, 4); /* N_ppm */ + len -= 4; + } else { + N_ppm = cp->ppm_previous; + } + j = cp->ppm_store; + if (Z_ppm == 0) { /* First PPM marker */ + cp->ppm_data = (unsigned char *) opj_malloc(N_ppm * sizeof(unsigned char)); + cp->ppm_data_first = cp->ppm_data; + cp->ppm_len = N_ppm; + } else { /* NON-first PPM marker */ + cp->ppm_data = (unsigned char *) opj_realloc(cp->ppm_data, (N_ppm + cp->ppm_store) * sizeof(unsigned char)); + +#ifdef USE_JPWL + /* this memory allocation check could be done even in non-JPWL cases */ + if (cp->correct) { + if (!cp->ppm_data) { + opj_event_msg(j2k->cinfo, EVT_ERROR, + "JPWL: failed memory allocation during PPM marker parsing (pos. %x)\n", + cio_tell(cio)); + if (!JPWL_ASSUME || JPWL_ASSUME) { + opj_free(cp->ppm_data); + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + } + } +#endif + + cp->ppm_data_first = cp->ppm_data; + cp->ppm_len = N_ppm + cp->ppm_store; + } + for (i = N_ppm; i > 0; i--) { /* Read packet header */ + cp->ppm_data[j] = cio_read(cio, 1); + j++; + len--; + if (len == 0) + break; /* Case of non-finished packet header in present marker but finished in next one */ + } + cp->ppm_previous = i - 1; + cp->ppm_store = j; + } +} + +static void j2k_read_ppt(opj_j2k_t *j2k) { + int len, Z_ppt, i, j = 0; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = cp->tcps + j2k->curtileno; + opj_cio_t *cio = j2k->cio; + + len = cio_read(cio, 2); + Z_ppt = cio_read(cio, 1); + tcp->ppt = 1; + if (Z_ppt == 0) { /* First PPT marker */ + tcp->ppt_data = (unsigned char *) opj_malloc((len - 3) * sizeof(unsigned char)); + tcp->ppt_data_first = tcp->ppt_data; + tcp->ppt_store = 0; + tcp->ppt_len = len - 3; + } else { /* NON-first PPT marker */ + tcp->ppt_data = (unsigned char *) opj_realloc(tcp->ppt_data, (len - 3 + tcp->ppt_store) * sizeof(unsigned char)); + tcp->ppt_data_first = tcp->ppt_data; + tcp->ppt_len = len - 3 + tcp->ppt_store; + } + j = tcp->ppt_store; + for (i = len - 3; i > 0; i--) { + tcp->ppt_data[j] = cio_read(cio, 1); + j++; + } + tcp->ppt_store = j; +} + +static void j2k_write_tlm(opj_j2k_t *j2k){ + int lenp; + opj_cio_t *cio = j2k->cio; + j2k->tlm_start = cio_tell(cio); + cio_write(cio, J2K_MS_TLM, 2);/* TLM */ + lenp = 4 + (5*j2k->totnum_tp); + cio_write(cio,lenp,2); /* Ltlm */ + cio_write(cio, 0,1); /* Ztlm=0*/ + cio_write(cio,80,1); /* Stlm ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */ + cio_skip(cio,5*j2k->totnum_tp); +} + +static void j2k_write_sot(opj_j2k_t *j2k) { + int lenp, len; + + opj_cio_t *cio = j2k->cio; + + j2k->sot_start = cio_tell(cio); + cio_write(cio, J2K_MS_SOT, 2); /* SOT */ + lenp = cio_tell(cio); + cio_skip(cio, 2); /* Lsot (further) */ + cio_write(cio, j2k->curtileno, 2); /* Isot */ + cio_skip(cio, 4); /* Psot (further in j2k_write_sod) */ + cio_write(cio, j2k->cur_tp_num , 1); /* TPsot */ + cio_write(cio, j2k->cur_totnum_tp[j2k->curtileno], 1); /* TNsot */ + len = cio_tell(cio) - lenp; + cio_seek(cio, lenp); + cio_write(cio, len, 2); /* Lsot */ + cio_seek(cio, lenp + len); + + /* UniPG>> */ +#ifdef USE_JPWL + /* update markers struct */ + j2k_add_marker(j2k->cstr_info, J2K_MS_SOT, j2k->sot_start, len + 2); +#endif /* USE_JPWL */ + /* <cstr_info && j2k->cur_tp_num==0){ + j2k_add_tlmarker( j2k->curtileno, j2k->cstr_info, J2K_MS_SOT, lenp, len); + } +} + +static void j2k_read_sot(opj_j2k_t *j2k) { + int len, tileno, totlen, partno, numparts, i; + opj_tcp_t *tcp = NULL; + char status = 0; + + opj_cp_t *cp = j2k->cp; + opj_cio_t *cio = j2k->cio; + + len = cio_read(cio, 2); + tileno = cio_read(cio, 2); + +#ifdef USE_JPWL + if (j2k->cp->correct) { + + static int backup_tileno = 0; + + /* tileno is negative or larger than the number of tiles!!! */ + if ((tileno < 0) || (tileno > (cp->tw * cp->th))) { + opj_event_msg(j2k->cinfo, EVT_ERROR, + "JPWL: bad tile number (%d out of a maximum of %d)\n", + tileno, (cp->tw * cp->th)); + if (!JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + /* we try to correct */ + tileno = backup_tileno; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n" + "- setting tile number to %d\n", + tileno); + } + + /* keep your private count of tiles */ + backup_tileno++; + }; +#endif /* USE_JPWL */ + + if (cp->tileno_size == 0) { + cp->tileno[cp->tileno_size] = tileno; + cp->tileno_size++; + } else { + i = 0; + while (i < cp->tileno_size && status == 0) { + status = cp->tileno[i] == tileno ? 1 : 0; + i++; + } + if (status == 0) { + cp->tileno[cp->tileno_size] = tileno; + cp->tileno_size++; + } + } + + totlen = cio_read(cio, 4); + +#ifdef USE_JPWL + if (j2k->cp->correct) { + + /* totlen is negative or larger than the bytes left!!! */ + if ((totlen < 0) || (totlen > (cio_numbytesleft(cio) + 8))) { + opj_event_msg(j2k->cinfo, EVT_ERROR, + "JPWL: bad tile byte size (%d bytes against %d bytes left)\n", + totlen, cio_numbytesleft(cio) + 8); + if (!JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + /* we try to correct */ + totlen = 0; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n" + "- setting Psot to %d => assuming it is the last tile\n", + totlen); + } + + }; +#endif /* USE_JPWL */ + + if (!totlen) + totlen = cio_numbytesleft(cio) + 8; + + partno = cio_read(cio, 1); + numparts = cio_read(cio, 1); + + if (partno >= numparts) { + opj_event_msg(j2k->cinfo, EVT_WARNING, "SOT marker inconsistency in tile %d: tile-part index greater (%d) than number of tile-parts (%d)\n", tileno, partno, numparts); + numparts = partno+1; + } + + j2k->curtileno = tileno; + j2k->cur_tp_num = partno; + j2k->eot = cio_getbp(cio) - 12 + totlen; + j2k->state = J2K_STATE_TPH; + tcp = &cp->tcps[j2k->curtileno]; + + /* Index */ + if (j2k->cstr_info) { + if (tcp->first) { + if (tileno == 0) + j2k->cstr_info->main_head_end = cio_tell(cio) - 13; + j2k->cstr_info->tile[tileno].tileno = tileno; + j2k->cstr_info->tile[tileno].start_pos = cio_tell(cio) - 12; + j2k->cstr_info->tile[tileno].end_pos = j2k->cstr_info->tile[tileno].start_pos + totlen - 1; + } else { + j2k->cstr_info->tile[tileno].end_pos += totlen; + } + j2k->cstr_info->tile[tileno].num_tps = numparts; + if (numparts) + j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_realloc(j2k->cstr_info->tile[tileno].tp, numparts * sizeof(opj_tp_info_t)); + else + j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_realloc(j2k->cstr_info->tile[tileno].tp, 10 * sizeof(opj_tp_info_t)); /* Fixme (10)*/ + j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = cio_tell(cio) - 12; + j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos = + j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1; + } + + if (tcp->first == 1) { + /* Initialization PPT */ + opj_tccp_t *tmp = tcp->tccps; + memcpy(tcp, j2k->default_tcp, sizeof(opj_tcp_t)); + tcp->ppt = 0; + tcp->ppt_data = NULL; + tcp->ppt_data_first = NULL; + tcp->tccps = tmp; + + for (i = 0; i < j2k->image->numcomps; i++) { + tcp->tccps[i] = j2k->default_tcp->tccps[i]; + } + cp->tcps[j2k->curtileno].first = 0; + } +} + +static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder) { + int l, layno; + int totlen; + opj_tcp_t *tcp = NULL; + opj_codestream_info_t *cstr_info = NULL; + + opj_tcd_t *tcd = (opj_tcd_t*)tile_coder; /* cast is needed because of conflicts in header inclusions */ + opj_cp_t *cp = j2k->cp; + opj_cio_t *cio = j2k->cio; + + tcd->tp_num = j2k->tp_num ; + tcd->cur_tp_num = j2k->cur_tp_num; + + cio_write(cio, J2K_MS_SOD, 2); + + if( j2k->cstr_info && j2k->cur_tp_num==0){ + j2k_add_tlmarker( j2k->curtileno, j2k->cstr_info, J2K_MS_SOD, cio_tell(cio), 0); + } + + if (j2k->curtileno == 0) { + j2k->sod_start = cio_tell(cio) + j2k->pos_correction; + } + + /* INDEX >> */ + cstr_info = j2k->cstr_info; + if (cstr_info) { + if (!j2k->cur_tp_num ) { + cstr_info->tile[j2k->curtileno].end_header = cio_tell(cio) + j2k->pos_correction - 1; + j2k->cstr_info->tile[j2k->curtileno].tileno = j2k->curtileno; + } + else{ + if(cstr_info->tile[j2k->curtileno].packet[cstr_info->packno - 1].end_pos < cio_tell(cio)) + cstr_info->tile[j2k->curtileno].packet[cstr_info->packno].start_pos = cio_tell(cio); + } + /* UniPG>> */ +#ifdef USE_JPWL + /* update markers struct */ + j2k_add_marker(j2k->cstr_info, J2K_MS_SOD, j2k->sod_start, 2); +#endif /* USE_JPWL */ + /* <tcps[j2k->curtileno]; + for (layno = 0; layno < tcp->numlayers; layno++) { + if (tcp->rates[layno]>(j2k->sod_start / (cp->th * cp->tw))) { + tcp->rates[layno]-=(j2k->sod_start / (cp->th * cp->tw)); + } else if (tcp->rates[layno]) { + tcp->rates[layno]=1; + } + } + if(j2k->cur_tp_num == 0){ + tcd->tcd_image->tiles->packno = 0; + if(cstr_info) + cstr_info->packno = 0; + } + + l = tcd_encode_tile(tcd, j2k->curtileno, cio_getbp(cio), cio_numbytesleft(cio) - 2, cstr_info); + + /* Writing Psot in SOT marker */ + totlen = cio_tell(cio) + l - j2k->sot_start; + cio_seek(cio, j2k->sot_start + 6); + cio_write(cio, totlen, 4); + cio_seek(cio, j2k->sot_start + totlen); + /* Writing Ttlm and Ptlm in TLM marker */ + if(cp->cinema){ + cio_seek(cio, j2k->tlm_start + 6 + (5*j2k->cur_tp_num)); + cio_write(cio, j2k->curtileno, 1); + cio_write(cio, totlen, 4); + } + cio_seek(cio, j2k->sot_start + totlen); +} + +static void j2k_read_sod(opj_j2k_t *j2k) { + int len, truncate = 0, i; + unsigned char *data = NULL, *data_ptr = NULL; + + opj_cio_t *cio = j2k->cio; + int curtileno = j2k->curtileno; + + /* Index */ + if (j2k->cstr_info) { + j2k->cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_header = + cio_tell(cio) + j2k->pos_correction - 1; + if (j2k->cur_tp_num == 0) + j2k->cstr_info->tile[j2k->curtileno].end_header = cio_tell(cio) + j2k->pos_correction - 1; + j2k->cstr_info->packno = 0; + } + + len = int_min(j2k->eot - cio_getbp(cio), cio_numbytesleft(cio) + 1); + + if (len == cio_numbytesleft(cio) + 1) { + truncate = 1; /* Case of a truncate codestream */ + } + + data = j2k->tile_data[curtileno]; + data = (unsigned char*) opj_realloc(data, (j2k->tile_len[curtileno] + len) * sizeof(unsigned char)); + + data_ptr = data + j2k->tile_len[curtileno]; + for (i = 0; i < len; i++) { + data_ptr[i] = cio_read(cio, 1); + } + + j2k->tile_len[curtileno] += len; + j2k->tile_data[curtileno] = data; + + if (!truncate) { + j2k->state = J2K_STATE_TPHSOT; + } else { + j2k->state = J2K_STATE_NEOC; /* RAJOUTE !! */ + } + j2k->cur_tp_num++; +} + +static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno) { + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = &cp->tcps[tileno]; + opj_cio_t *cio = j2k->cio; + int numcomps = j2k->image->numcomps; + + cio_write(cio, J2K_MS_RGN, 2); /* RGN */ + cio_write(cio, numcomps <= 256 ? 5 : 6, 2); /* Lrgn */ + cio_write(cio, compno, numcomps <= 256 ? 1 : 2); /* Crgn */ + cio_write(cio, 0, 1); /* Srgn */ + cio_write(cio, tcp->tccps[compno].roishift, 1); /* SPrgn */ +} + +static void j2k_read_rgn(opj_j2k_t *j2k) { + int len, compno, roisty; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; + opj_cio_t *cio = j2k->cio; + int numcomps = j2k->image->numcomps; + + len = cio_read(cio, 2); /* Lrgn */ + compno = cio_read(cio, numcomps <= 256 ? 1 : 2); /* Crgn */ + roisty = cio_read(cio, 1); /* Srgn */ + +#ifdef USE_JPWL + if (j2k->cp->correct) { + /* totlen is negative or larger than the bytes left!!! */ + if (compno >= numcomps) { + opj_event_msg(j2k->cinfo, EVT_ERROR, + "JPWL: bad component number in RGN (%d when there are only %d)\n", + compno, numcomps); + if (!JPWL_ASSUME || JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + } + }; +#endif /* USE_JPWL */ + + tcp->tccps[compno].roishift = cio_read(cio, 1); /* SPrgn */ +} + +static void j2k_write_eoc(opj_j2k_t *j2k) { + opj_cio_t *cio = j2k->cio; + /* opj_event_msg(j2k->cinfo, "%.8x: EOC\n", cio_tell(cio) + j2k->pos_correction); */ + cio_write(cio, J2K_MS_EOC, 2); + +/* UniPG>> */ +#ifdef USE_JPWL + /* update markers struct */ + j2k_add_marker(j2k->cstr_info, J2K_MS_EOC, cio_tell(cio) - 2, 2); +#endif /* USE_JPWL */ +/* <cp->limit_decoding != DECODE_ALL_BUT_PACKETS) { + opj_tcd_t *tcd = tcd_create(j2k->cinfo); + tcd_malloc_decode(tcd, j2k->image, j2k->cp); + for (i = 0; i < j2k->cp->tileno_size; i++) { + tcd_malloc_decode_tile(tcd, j2k->image, j2k->cp, i, j2k->cstr_info); + tileno = j2k->cp->tileno[i]; + success = tcd_decode_tile(tcd, j2k->tile_data[tileno], j2k->tile_len[tileno], tileno, j2k->cstr_info); + opj_free(j2k->tile_data[tileno]); + j2k->tile_data[tileno] = NULL; + tcd_free_decode_tile(tcd, i); + if (success == OPJ_FALSE) { + j2k->state |= J2K_STATE_ERR; + break; + } + } + tcd_free_decode(tcd); + tcd_destroy(tcd); + } + /* if packets should not be decoded */ + else { + for (i = 0; i < j2k->cp->tileno_size; i++) { + tileno = j2k->cp->tileno[i]; + opj_free(j2k->tile_data[tileno]); + j2k->tile_data[tileno] = NULL; + } + } + if (j2k->state & J2K_STATE_ERR) + j2k->state = J2K_STATE_MT + J2K_STATE_ERR; + else + j2k->state = J2K_STATE_MT; +} + +typedef struct opj_dec_mstabent { + /** marker value */ + int id; + /** value of the state when the marker can appear */ + int states; + /** action linked to the marker */ + void (*handler) (opj_j2k_t *j2k); +} opj_dec_mstabent_t; + +opj_dec_mstabent_t j2k_dec_mstab[] = { + {J2K_MS_SOC, J2K_STATE_MHSOC, j2k_read_soc}, + {J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, j2k_read_sot}, + {J2K_MS_SOD, J2K_STATE_TPH, j2k_read_sod}, + {J2K_MS_EOC, J2K_STATE_TPHSOT, j2k_read_eoc}, + {J2K_MS_SIZ, J2K_STATE_MHSIZ, j2k_read_siz}, + {J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_cod}, + {J2K_MS_COC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_coc}, + {J2K_MS_RGN, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_rgn}, + {J2K_MS_QCD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_qcd}, + {J2K_MS_QCC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_qcc}, + {J2K_MS_POC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_poc}, + {J2K_MS_TLM, J2K_STATE_MH, j2k_read_tlm}, + {J2K_MS_PLM, J2K_STATE_MH, j2k_read_plm}, + {J2K_MS_PLT, J2K_STATE_TPH, j2k_read_plt}, + {J2K_MS_PPM, J2K_STATE_MH, j2k_read_ppm}, + {J2K_MS_PPT, J2K_STATE_TPH, j2k_read_ppt}, + {J2K_MS_SOP, 0, 0}, + {J2K_MS_CRG, J2K_STATE_MH, j2k_read_crg}, + {J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_com}, + +#ifdef USE_JPWL + {J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc}, + {J2K_MS_EPB, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epb}, + {J2K_MS_ESD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_esd}, + {J2K_MS_RED, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_red}, +#endif /* USE_JPWL */ +#ifdef USE_JPSEC + {J2K_MS_SEC, J2K_STATE_MH, j2k_read_sec}, + {J2K_MS_INSEC, 0, j2k_read_insec}, +#endif /* USE_JPSEC */ + + {0, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_unk} +}; + +static void j2k_read_unk(opj_j2k_t *j2k) { + opj_event_msg(j2k->cinfo, EVT_WARNING, "Unknown marker\n"); + +#ifdef USE_JPWL + if (j2k->cp->correct) { + int m = 0, id, i; + int min_id = 0, min_dist = 17, cur_dist = 0, tmp_id; + cio_seek(j2k->cio, cio_tell(j2k->cio) - 2); + id = cio_read(j2k->cio, 2); + opj_event_msg(j2k->cinfo, EVT_ERROR, + "JPWL: really don't know this marker %x\n", + id); + if (!JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, + "- possible synch loss due to uncorrectable codestream errors => giving up\n"); + return; + } + /* OK, activate this at your own risk!!! */ + /* we look for the marker at the minimum hamming distance from this */ + while (j2k_dec_mstab[m].id) { + + /* 1's where they differ */ + tmp_id = j2k_dec_mstab[m].id ^ id; + + /* compute the hamming distance between our id and the current */ + cur_dist = 0; + for (i = 0; i < 16; i++) { + if ((tmp_id >> i) & 0x0001) { + cur_dist++; + } + } + + /* if current distance is smaller, set the minimum */ + if (cur_dist < min_dist) { + min_dist = cur_dist; + min_id = j2k_dec_mstab[m].id; + } + + /* jump to the next marker */ + m++; + } + + /* do we substitute the marker? */ + if (min_dist < JPWL_MAXIMUM_HAMMING) { + opj_event_msg(j2k->cinfo, EVT_ERROR, + "- marker %x is at distance %d from the read %x\n", + min_id, min_dist, id); + opj_event_msg(j2k->cinfo, EVT_ERROR, + "- trying to substitute in place and crossing fingers!\n"); + cio_seek(j2k->cio, cio_tell(j2k->cio) - 2); + cio_write(j2k->cio, min_id, 2); + + /* rewind */ + cio_seek(j2k->cio, cio_tell(j2k->cio) - 2); + + } + + }; +#endif /* USE_JPWL */ + +} + +/** +Read the lookup table containing all the marker, status and action +@param id Marker value +*/ +static opj_dec_mstabent_t *j2k_dec_mstab_lookup(int id) { + opj_dec_mstabent_t *e; + for (e = j2k_dec_mstab; e->id != 0; e++) { + if (e->id == id) { + break; + } + } + return e; +} + +/* ----------------------------------------------------------------------- */ +/* J2K / JPT decoder interface */ +/* ----------------------------------------------------------------------- */ + +opj_j2k_t* j2k_create_decompress(opj_common_ptr cinfo) { + opj_j2k_t *j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t)); + if(!j2k) + return NULL; + + j2k->default_tcp = (opj_tcp_t*) opj_calloc(1, sizeof(opj_tcp_t)); + if(!j2k->default_tcp) { + opj_free(j2k); + return NULL; + } + + j2k->cinfo = cinfo; + j2k->tile_data = NULL; + + return j2k; +} + +void j2k_destroy_decompress(opj_j2k_t *j2k) { + int i = 0; + + if(j2k->tile_len != NULL) { + opj_free(j2k->tile_len); + } + if(j2k->tile_data != NULL) { + opj_free(j2k->tile_data); + } + if(j2k->default_tcp != NULL) { + opj_tcp_t *default_tcp = j2k->default_tcp; + if(default_tcp->ppt_data_first != NULL) { + opj_free(default_tcp->ppt_data_first); + } + if(j2k->default_tcp->tccps != NULL) { + opj_free(j2k->default_tcp->tccps); + } + opj_free(j2k->default_tcp); + } + if(j2k->cp != NULL) { + opj_cp_t *cp = j2k->cp; + if(cp->tcps != NULL) { + for(i = 0; i < cp->tw * cp->th; i++) { + if(cp->tcps[i].ppt_data_first != NULL) { + opj_free(cp->tcps[i].ppt_data_first); + } + if(cp->tcps[i].tccps != NULL) { + opj_free(cp->tcps[i].tccps); + } + } + opj_free(cp->tcps); + } + if(cp->ppm_data_first != NULL) { + opj_free(cp->ppm_data_first); + } + if(cp->tileno != NULL) { + opj_free(cp->tileno); + } + if(cp->comment != NULL) { + opj_free(cp->comment); + } + + opj_free(cp); + } + opj_free(j2k); +} + +void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters) { + if(j2k && parameters) { + /* create and initialize the coding parameters structure */ + opj_cp_t *cp = (opj_cp_t*) opj_calloc(1, sizeof(opj_cp_t)); + cp->reduce = parameters->cp_reduce; + cp->layer = parameters->cp_layer; + cp->limit_decoding = parameters->cp_limit_decoding; + +#ifdef USE_JPWL + cp->correct = parameters->jpwl_correct; + cp->exp_comps = parameters->jpwl_exp_comps; + cp->max_tiles = parameters->jpwl_max_tiles; +#endif /* USE_JPWL */ + + + /* keep a link to cp so that we can destroy it later in j2k_destroy_decompress */ + j2k->cp = cp; + } +} + +opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info) { + opj_image_t *image = NULL; + + opj_common_ptr cinfo = j2k->cinfo; + + j2k->cio = cio; + j2k->cstr_info = cstr_info; + if (cstr_info) + memset(cstr_info, 0, sizeof(opj_codestream_info_t)); + + /* create an empty image */ + image = opj_image_create0(); + j2k->image = image; + + j2k->state = J2K_STATE_MHSOC; + + for (;;) { + opj_dec_mstabent_t *e; + int id = cio_read(cio, 2); + +#ifdef USE_JPWL + /* we try to honor JPWL correction power */ + if (j2k->cp->correct) { + + int orig_pos = cio_tell(cio); + opj_bool status; + + /* call the corrector */ + status = jpwl_correct(j2k); + + /* go back to where you were */ + cio_seek(cio, orig_pos - 2); + + /* re-read the marker */ + id = cio_read(cio, 2); + + /* check whether it begins with ff */ + if (id >> 8 != 0xff) { + opj_event_msg(cinfo, EVT_ERROR, + "JPWL: possible bad marker %x at %d\n", + id, cio_tell(cio) - 2); + if (!JPWL_ASSUME) { + opj_image_destroy(image); + opj_event_msg(cinfo, EVT_ERROR, "JPWL: giving up\n"); + return 0; + } + /* we try to correct */ + id = id | 0xff00; + cio_seek(cio, cio_tell(cio) - 2); + cio_write(cio, id, 2); + opj_event_msg(cinfo, EVT_WARNING, "- trying to adjust this\n" + "- setting marker to %x\n", + id); + } + + } +#endif /* USE_JPWL */ + + if (id >> 8 != 0xff) { + opj_image_destroy(image); + opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n", cio_tell(cio) - 2, id); + return 0; + } + e = j2k_dec_mstab_lookup(id); + /* Check if the marker is known*/ + if (!(j2k->state & e->states)) { + opj_image_destroy(image); + opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n", cio_tell(cio) - 2, id); + return 0; + } + /* Check if the decoding is limited to the main header*/ + if (e->id == J2K_MS_SOT && j2k->cp->limit_decoding == LIMIT_TO_MAIN_HEADER) { + opj_event_msg(cinfo, EVT_INFO, "Main Header decoded.\n"); + return image; + } + + if (e->handler) { + (*e->handler)(j2k); + } + if (j2k->state & J2K_STATE_ERR) + return NULL; + + if (j2k->state == J2K_STATE_MT) { + break; + } + if (j2k->state == J2K_STATE_NEOC) { + break; + } + } + if (j2k->state == J2K_STATE_NEOC) { + j2k_read_eoc(j2k); + } + + if (j2k->state != J2K_STATE_MT) { + opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n"); + } + return image; +} + +/* +* Read a JPT-stream and decode file +* +*/ +opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info) { + opj_image_t *image = NULL; + opj_jpt_msg_header_t header; + int position; + opj_common_ptr cinfo = j2k->cinfo; + + OPJ_ARG_NOT_USED(cstr_info); + + j2k->cio = cio; + + /* create an empty image */ + image = opj_image_create0(); + j2k->image = image; + + j2k->state = J2K_STATE_MHSOC; + + /* Initialize the header */ + jpt_init_msg_header(&header); + /* Read the first header of the message */ + jpt_read_msg_header(cinfo, cio, &header); + + position = cio_tell(cio); + if (header.Class_Id != 6) { /* 6 : Main header data-bin message */ + opj_image_destroy(image); + opj_event_msg(cinfo, EVT_ERROR, "[JPT-stream] : Expecting Main header first [class_Id %d] !\n", header.Class_Id); + return 0; + } + + for (;;) { + opj_dec_mstabent_t *e = NULL; + int id; + + if (!cio_numbytesleft(cio)) { + j2k_read_eoc(j2k); + return image; + } + /* data-bin read -> need to read a new header */ + if ((unsigned int) (cio_tell(cio) - position) == header.Msg_length) { + jpt_read_msg_header(cinfo, cio, &header); + position = cio_tell(cio); + if (header.Class_Id != 4) { /* 4 : Tile data-bin message */ + opj_image_destroy(image); + opj_event_msg(cinfo, EVT_ERROR, "[JPT-stream] : Expecting Tile info !\n"); + return 0; + } + } + + id = cio_read(cio, 2); + if (id >> 8 != 0xff) { + opj_image_destroy(image); + opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n", cio_tell(cio) - 2, id); + return 0; + } + e = j2k_dec_mstab_lookup(id); + if (!(j2k->state & e->states)) { + opj_image_destroy(image); + opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n", cio_tell(cio) - 2, id); + return 0; + } + if (e->handler) { + (*e->handler)(j2k); + } + if (j2k->state == J2K_STATE_MT) { + break; + } + if (j2k->state == J2K_STATE_NEOC) { + break; + } + } + if (j2k->state == J2K_STATE_NEOC) { + j2k_read_eoc(j2k); + } + + if (j2k->state != J2K_STATE_MT) { + opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n"); + } + + return image; +} + +/* ----------------------------------------------------------------------- */ +/* J2K encoder interface */ +/* ----------------------------------------------------------------------- */ + +opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo) { + opj_j2k_t *j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t)); + if(j2k) { + j2k->cinfo = cinfo; + } + return j2k; +} + +void j2k_destroy_compress(opj_j2k_t *j2k) { + int tileno; + + if(!j2k) return; + if(j2k->cp != NULL) { + opj_cp_t *cp = j2k->cp; + + if(cp->comment) { + opj_free(cp->comment); + } + if(cp->matrice) { + opj_free(cp->matrice); + } + for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { + opj_free(cp->tcps[tileno].tccps); + } + opj_free(cp->tcps); + opj_free(cp); + } + + opj_free(j2k); +} + +void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image) { + int i, j, tileno, numpocs_tile; + opj_cp_t *cp = NULL; + + if(!j2k || !parameters || ! image) { + return; + } + + /* create and initialize the coding parameters structure */ + cp = (opj_cp_t*) opj_calloc(1, sizeof(opj_cp_t)); + + /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */ + j2k->cp = cp; + + /* set default values for cp */ + cp->tw = 1; + cp->th = 1; + + /* + copy user encoding parameters + */ + cp->cinema = parameters->cp_cinema; + cp->max_comp_size = parameters->max_comp_size; + cp->rsiz = parameters->cp_rsiz; + cp->disto_alloc = parameters->cp_disto_alloc; + cp->fixed_alloc = parameters->cp_fixed_alloc; + cp->fixed_quality = parameters->cp_fixed_quality; + + /* mod fixed_quality */ + if(parameters->cp_matrice) { + size_t array_size = parameters->tcp_numlayers * parameters->numresolution * 3 * sizeof(int); + cp->matrice = (int *) opj_malloc(array_size); + memcpy(cp->matrice, parameters->cp_matrice, array_size); + } + + /* tiles */ + cp->tdx = parameters->cp_tdx; + cp->tdy = parameters->cp_tdy; + + /* tile offset */ + cp->tx0 = parameters->cp_tx0; + cp->ty0 = parameters->cp_ty0; + + /* comment string */ + if(parameters->cp_comment) { + cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1); + if(cp->comment) { + strcpy(cp->comment, parameters->cp_comment); + } + } + + /* + calculate other encoding parameters + */ + + if (parameters->tile_size_on) { + cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx); + cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy); + } else { + cp->tdx = image->x1 - cp->tx0; + cp->tdy = image->y1 - cp->ty0; + } + + if(parameters->tp_on){ + cp->tp_flag = parameters->tp_flag; + cp->tp_on = 1; + } + + cp->img_size = 0; + for(i=0;inumcomps ;i++){ + cp->img_size += (image->comps[i].w *image->comps[i].h * image->comps[i].prec); + } + + +#ifdef USE_JPWL + /* + calculate JPWL encoding parameters + */ + + if (parameters->jpwl_epc_on) { + int i; + + /* set JPWL on */ + cp->epc_on = OPJ_TRUE; + cp->info_on = OPJ_FALSE; /* no informative technique */ + + /* set EPB on */ + if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) { + cp->epb_on = OPJ_TRUE; + + cp->hprot_MH = parameters->jpwl_hprot_MH; + for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { + cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i]; + cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i]; + } + /* if tile specs are not specified, copy MH specs */ + if (cp->hprot_TPH[0] == -1) { + cp->hprot_TPH_tileno[0] = 0; + cp->hprot_TPH[0] = parameters->jpwl_hprot_MH; + } + for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) { + cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i]; + cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i]; + cp->pprot[i] = parameters->jpwl_pprot[i]; + } + } + + /* set ESD writing */ + if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) { + cp->esd_on = OPJ_TRUE; + + cp->sens_size = parameters->jpwl_sens_size; + cp->sens_addr = parameters->jpwl_sens_addr; + cp->sens_range = parameters->jpwl_sens_range; + + cp->sens_MH = parameters->jpwl_sens_MH; + for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { + cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i]; + cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i]; + } + } + + /* always set RED writing to false: we are at the encoder */ + cp->red_on = OPJ_FALSE; + + } else { + cp->epc_on = OPJ_FALSE; + } +#endif /* USE_JPWL */ + + + /* initialize the mutiple tiles */ + /* ---------------------------- */ + cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t)); + + for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { + opj_tcp_t *tcp = &cp->tcps[tileno]; + tcp->numlayers = parameters->tcp_numlayers; + for (j = 0; j < tcp->numlayers; j++) { + if(cp->cinema){ + if (cp->fixed_quality) { + tcp->distoratio[j] = parameters->tcp_distoratio[j]; + } + tcp->rates[j] = parameters->tcp_rates[j]; + }else{ + if (cp->fixed_quality) { /* add fixed_quality */ + tcp->distoratio[j] = parameters->tcp_distoratio[j]; + } else { + tcp->rates[j] = parameters->tcp_rates[j]; + } + } + } + tcp->csty = parameters->csty; + tcp->prg = parameters->prog_order; + tcp->mct = parameters->tcp_mct; + + numpocs_tile = 0; + tcp->POC = 0; + if (parameters->numpocs) { + /* initialisation of POC */ + tcp->POC = 1; + for (i = 0; i < parameters->numpocs; i++) { + if((tileno == parameters->POC[i].tile - 1) || (parameters->POC[i].tile == -1)) { + opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile]; + tcp_poc->resno0 = parameters->POC[numpocs_tile].resno0; + tcp_poc->compno0 = parameters->POC[numpocs_tile].compno0; + tcp_poc->layno1 = parameters->POC[numpocs_tile].layno1; + tcp_poc->resno1 = parameters->POC[numpocs_tile].resno1; + tcp_poc->compno1 = parameters->POC[numpocs_tile].compno1; + tcp_poc->prg1 = parameters->POC[numpocs_tile].prg1; + tcp_poc->tile = parameters->POC[numpocs_tile].tile; + numpocs_tile++; + } + } + tcp->numpocs = numpocs_tile -1 ; + }else{ + tcp->numpocs = 0; + } + + tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t)); + + for (i = 0; i < image->numcomps; i++) { + opj_tccp_t *tccp = &tcp->tccps[i]; + tccp->csty = parameters->csty & 0x01; /* 0 => one precinct || 1 => custom precinct */ + tccp->numresolutions = parameters->numresolution; + tccp->cblkw = int_floorlog2(parameters->cblockw_init); + tccp->cblkh = int_floorlog2(parameters->cblockh_init); + tccp->cblksty = parameters->mode; + tccp->qmfbid = parameters->irreversible ? 0 : 1; + tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT : J2K_CCP_QNTSTY_NOQNT; + tccp->numgbits = 2; + if (i == parameters->roi_compno) { + tccp->roishift = parameters->roi_shift; + } else { + tccp->roishift = 0; + } + + if(parameters->cp_cinema) + { + /*Precinct size for lowest frequency subband=128*/ + tccp->prcw[0] = 7; + tccp->prch[0] = 7; + /*Precinct size at all other resolutions = 256*/ + for (j = 1; j < tccp->numresolutions; j++) { + tccp->prcw[j] = 8; + tccp->prch[j] = 8; + } + }else{ + if (parameters->csty & J2K_CCP_CSTY_PRT) { + int p = 0; + for (j = tccp->numresolutions - 1; j >= 0; j--) { + if (p < parameters->res_spec) { + + if (parameters->prcw_init[p] < 1) { + tccp->prcw[j] = 1; + } else { + tccp->prcw[j] = int_floorlog2(parameters->prcw_init[p]); + } + + if (parameters->prch_init[p] < 1) { + tccp->prch[j] = 1; + }else { + tccp->prch[j] = int_floorlog2(parameters->prch_init[p]); + } + + } else { + int res_spec = parameters->res_spec; + int size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1)); + int size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1)); + + if (size_prcw < 1) { + tccp->prcw[j] = 1; + } else { + tccp->prcw[j] = int_floorlog2(size_prcw); + } + + if (size_prch < 1) { + tccp->prch[j] = 1; + } else { + tccp->prch[j] = int_floorlog2(size_prch); + } + } + p++; + /*printf("\nsize precinct for level %d : %d,%d\n", j,tccp->prcw[j], tccp->prch[j]); */ + } /*end for*/ + } else { + for (j = 0; j < tccp->numresolutions; j++) { + tccp->prcw[j] = 15; + tccp->prch[j] = 15; + } + } + } + + dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec); + } + } +} + +opj_bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) { + int tileno, compno; + opj_cp_t *cp = NULL; + + opj_tcd_t *tcd = NULL; /* TCD component */ + + j2k->cio = cio; + j2k->image = image; + + cp = j2k->cp; + + /* INDEX >> */ + j2k->cstr_info = cstr_info; + if (cstr_info) { + int compno; + cstr_info->tile = (opj_tile_info_t *) opj_malloc(cp->tw * cp->th * sizeof(opj_tile_info_t)); + cstr_info->image_w = image->x1 - image->x0; + cstr_info->image_h = image->y1 - image->y0; + cstr_info->prog = (&cp->tcps[0])->prg; + cstr_info->tw = cp->tw; + cstr_info->th = cp->th; + cstr_info->tile_x = cp->tdx; /* new version parser */ + cstr_info->tile_y = cp->tdy; /* new version parser */ + cstr_info->tile_Ox = cp->tx0; /* new version parser */ + cstr_info->tile_Oy = cp->ty0; /* new version parser */ + cstr_info->numcomps = image->numcomps; + cstr_info->numlayers = (&cp->tcps[0])->numlayers; + cstr_info->numdecompos = (int*) opj_malloc(image->numcomps * sizeof(int)); + for (compno=0; compno < image->numcomps; compno++) { + cstr_info->numdecompos[compno] = (&cp->tcps[0])->tccps->numresolutions - 1; + } + cstr_info->D_max = 0.0; /* ADD Marcela */ + cstr_info->main_head_start = cio_tell(cio); /* position of SOC */ + cstr_info->maxmarknum = 100; + cstr_info->marker = (opj_marker_info_t *) opj_malloc(cstr_info->maxmarknum * sizeof(opj_marker_info_t)); + cstr_info->marknum = 0; + } + /* << INDEX */ + + j2k_write_soc(j2k); + j2k_write_siz(j2k); + j2k_write_cod(j2k); + j2k_write_qcd(j2k); + + if(cp->cinema){ + for (compno = 1; compno < image->numcomps; compno++) { + j2k_write_coc(j2k, compno); + j2k_write_qcc(j2k, compno); + } + } + + for (compno = 0; compno < image->numcomps; compno++) { + opj_tcp_t *tcp = &cp->tcps[0]; + if (tcp->tccps[compno].roishift) + j2k_write_rgn(j2k, compno, 0); + } + if (cp->comment != NULL) { + j2k_write_com(j2k); + } + + j2k->totnum_tp = j2k_calculate_tp(cp,image->numcomps,image,j2k); + /* TLM Marker*/ + if(cp->cinema){ + j2k_write_tlm(j2k); + if (cp->cinema == CINEMA4K_24) { + j2k_write_poc(j2k); + } + } + + /* uncomment only for testing JPSEC marker writing */ + /* j2k_write_sec(j2k); */ + + /* INDEX >> */ + if(cstr_info) { + cstr_info->main_head_end = cio_tell(cio) - 1; + } + /* << INDEX */ + /**** Main Header ENDS here ***/ + + /* create the tile encoder */ + tcd = tcd_create(j2k->cinfo); + + /* encode each tile */ + for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { + int pino; + int tilepartno=0; + /* UniPG>> */ + int acc_pack_num = 0; + /* <tcps[tileno]; + opj_event_msg(j2k->cinfo, EVT_INFO, "tile number %d / %d\n", tileno + 1, cp->tw * cp->th); + + j2k->curtileno = tileno; + j2k->cur_tp_num = 0; + tcd->cur_totnum_tp = j2k->cur_totnum_tp[j2k->curtileno]; + /* initialisation before tile encoding */ + if (tileno == 0) { + tcd_malloc_encode(tcd, image, cp, j2k->curtileno); + } else { + tcd_init_encode(tcd, image, cp, j2k->curtileno); + } + + /* INDEX >> */ + if(cstr_info) { + cstr_info->tile[j2k->curtileno].start_pos = cio_tell(cio) + j2k->pos_correction; + cstr_info->tile[j2k->curtileno].maxmarknum = 10; + cstr_info->tile[j2k->curtileno].marker = (opj_marker_info_t *) opj_malloc(cstr_info->tile[j2k->curtileno].maxmarknum * sizeof(opj_marker_info_t)); + cstr_info->tile[j2k->curtileno].marknum = 0; + } + /* << INDEX */ + + for(pino = 0; pino <= tcp->numpocs; pino++) { + int tot_num_tp; + tcd->cur_pino=pino; + + /*Get number of tile parts*/ + tot_num_tp = j2k_get_num_tp(cp,pino,tileno); + tcd->tp_pos = cp->tp_pos; + + for(tilepartno = 0; tilepartno < tot_num_tp ; tilepartno++){ + j2k->tp_num = tilepartno; + /* INDEX >> */ + if(cstr_info) + cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_start_pos = + cio_tell(cio) + j2k->pos_correction; + /* << INDEX */ + j2k_write_sot(j2k); + + if(j2k->cur_tp_num == 0 && cp->cinema == 0){ + for (compno = 1; compno < image->numcomps; compno++) { + j2k_write_coc(j2k, compno); + j2k_write_qcc(j2k, compno); + } + if (cp->tcps[tileno].numpocs) { + j2k_write_poc(j2k); + } + } + + /* INDEX >> */ + if(cstr_info) + cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_header = + cio_tell(cio) + j2k->pos_correction + 1; + /* << INDEX */ + + j2k_write_sod(j2k, tcd); + + /* INDEX >> */ + if(cstr_info) { + cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_pos = + cio_tell(cio) + j2k->pos_correction - 1; + cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_start_pack = + acc_pack_num; + cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_numpacks = + cstr_info->packno - acc_pack_num; + acc_pack_num = cstr_info->packno; + } + /* << INDEX */ + + j2k->cur_tp_num++; + } + } + if(cstr_info) { + cstr_info->tile[j2k->curtileno].end_pos = cio_tell(cio) + j2k->pos_correction - 1; + } + + + /* + if (tile->PPT) { // BAD PPT !!! + FILE *PPT_file; + int i; + PPT_file=fopen("PPT","rb"); + fprintf(stderr,"%c%c%c%c",255,97,tile->len_ppt/256,tile->len_ppt%256); + for (i=0;ilen_ppt;i++) { + unsigned char elmt; + fread(&elmt, 1, 1, PPT_file); + fwrite(&elmt,1,1,f); + } + fclose(PPT_file); + unlink("PPT"); + } + */ + + } + + /* destroy the tile encoder */ + tcd_free_encode(tcd); + tcd_destroy(tcd); + + opj_free(j2k->cur_totnum_tp); + + j2k_write_eoc(j2k); + + if(cstr_info) { + cstr_info->codestream_size = cio_tell(cio) + j2k->pos_correction; + /* UniPG>> */ + /* The following adjustment is done to adjust the codestream size */ + /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */ + /* the first bunch of bytes is not in the codestream */ + cstr_info->codestream_size -= cstr_info->main_head_start; + /* <epc_on) { + + /* encode according to JPWL */ + jpwl_encode(j2k, cio, image); + + } +#endif /* USE_JPWL */ + + return OPJ_TRUE; +} + +static void j2k_add_mhmarker(opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len) { + + if (!cstr_info) + return; + + /* expand the list? */ + if ((cstr_info->marknum + 1) > cstr_info->maxmarknum) { + cstr_info->maxmarknum = 100 + (int) ((float) cstr_info->maxmarknum * 1.0F); + cstr_info->marker = (opj_marker_info_t*)opj_realloc(cstr_info->marker, cstr_info->maxmarknum); + } + + /* add the marker */ + cstr_info->marker[cstr_info->marknum].type = type; + cstr_info->marker[cstr_info->marknum].pos = pos; + cstr_info->marker[cstr_info->marknum].len = len; + cstr_info->marknum++; + +} + +static void j2k_add_tlmarker( int tileno, opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len) { + + opj_marker_info_t *marker; + + if (!cstr_info) + return; + + /* expand the list? */ + if ((cstr_info->tile[tileno].marknum + 1) > cstr_info->tile[tileno].maxmarknum) { + cstr_info->tile[tileno].maxmarknum = 100 + (int) ((float) cstr_info->tile[tileno].maxmarknum * 1.0F); + cstr_info->tile[tileno].marker = (opj_marker_info_t*)opj_realloc(cstr_info->tile[tileno].marker, cstr_info->maxmarknum); + } + + marker = &(cstr_info->tile[tileno].marker[cstr_info->tile[tileno].marknum]); + + /* add the marker */ + marker->type = type; + marker->pos = pos; + marker->len = len; + cstr_info->tile[tileno].marknum++; +} diff --git a/openjpeg-dotnet/libopenjpeg/j2k.h b/openjpeg-dotnet/libopenjpeg/j2k.h index 0cc026b9..6338c290 100644 --- a/openjpeg-dotnet/libopenjpeg/j2k.h +++ b/openjpeg-dotnet/libopenjpeg/j2k.h @@ -1,446 +1,446 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2006-2007, Parvatha Elangovan - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ -#ifndef __J2K_H -#define __J2K_H -/** -@file j2k.h -@brief The JPEG-2000 Codestream Reader/Writer (J2K) - -The functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data. -*/ - -/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */ -/*@{*/ - -#define J2K_CP_CSTY_PRT 0x01 -#define J2K_CP_CSTY_SOP 0x02 -#define J2K_CP_CSTY_EPH 0x04 -#define J2K_CCP_CSTY_PRT 0x01 -#define J2K_CCP_CBLKSTY_LAZY 0x01 -#define J2K_CCP_CBLKSTY_RESET 0x02 -#define J2K_CCP_CBLKSTY_TERMALL 0x04 -#define J2K_CCP_CBLKSTY_VSC 0x08 -#define J2K_CCP_CBLKSTY_PTERM 0x10 -#define J2K_CCP_CBLKSTY_SEGSYM 0x20 -#define J2K_CCP_QNTSTY_NOQNT 0 -#define J2K_CCP_QNTSTY_SIQNT 1 -#define J2K_CCP_QNTSTY_SEQNT 2 - -/* ----------------------------------------------------------------------- */ - -#define J2K_MS_SOC 0xff4f /**< SOC marker value */ -#define J2K_MS_SOT 0xff90 /**< SOT marker value */ -#define J2K_MS_SOD 0xff93 /**< SOD marker value */ -#define J2K_MS_EOC 0xffd9 /**< EOC marker value */ -#define J2K_MS_SIZ 0xff51 /**< SIZ marker value */ -#define J2K_MS_COD 0xff52 /**< COD marker value */ -#define J2K_MS_COC 0xff53 /**< COC marker value */ -#define J2K_MS_RGN 0xff5e /**< RGN marker value */ -#define J2K_MS_QCD 0xff5c /**< QCD marker value */ -#define J2K_MS_QCC 0xff5d /**< QCC marker value */ -#define J2K_MS_POC 0xff5f /**< POC marker value */ -#define J2K_MS_TLM 0xff55 /**< TLM marker value */ -#define J2K_MS_PLM 0xff57 /**< PLM marker value */ -#define J2K_MS_PLT 0xff58 /**< PLT marker value */ -#define J2K_MS_PPM 0xff60 /**< PPM marker value */ -#define J2K_MS_PPT 0xff61 /**< PPT marker value */ -#define J2K_MS_SOP 0xff91 /**< SOP marker value */ -#define J2K_MS_EPH 0xff92 /**< EPH marker value */ -#define J2K_MS_CRG 0xff63 /**< CRG marker value */ -#define J2K_MS_COM 0xff64 /**< COM marker value */ -/* UniPG>> */ -#ifdef USE_JPWL -#define J2K_MS_EPC 0xff68 /**< EPC marker value (Part 11: JPEG 2000 for Wireless) */ -#define J2K_MS_EPB 0xff66 /**< EPB marker value (Part 11: JPEG 2000 for Wireless) */ -#define J2K_MS_ESD 0xff67 /**< ESD marker value (Part 11: JPEG 2000 for Wireless) */ -#define J2K_MS_RED 0xff69 /**< RED marker value (Part 11: JPEG 2000 for Wireless) */ -#endif /* USE_JPWL */ -#ifdef USE_JPSEC -#define J2K_MS_SEC 0xff65 /**< SEC marker value (Part 8: Secure JPEG 2000) */ -#define J2K_MS_INSEC 0xff94 /**< INSEC marker value (Part 8: Secure JPEG 2000) */ -#endif /* USE_JPSEC */ -/* < there was a PPT marker for the present tile */ - int ppt; - /** used in case of multiple marker PPT (number of info already stored) */ - int ppt_store; - /** ppmbug1 */ - int ppt_len; - /** add fixed_quality */ - float distoratio[100]; - /** tile-component coding parameters */ - opj_tccp_t *tccps; -} opj_tcp_t; - -/** -Coding parameters -*/ -typedef struct opj_cp { - /** Digital cinema profile*/ - OPJ_CINEMA_MODE cinema; - /** Maximum rate for each component. If == 0, component size limitation is not considered */ - int max_comp_size; - /** Size of the image in bits*/ - int img_size; - /** Rsiz*/ - OPJ_RSIZ_CAPABILITIES rsiz; - /** Enabling Tile part generation*/ - char tp_on; - /** Flag determining tile part generation*/ - char tp_flag; - /** Position of tile part flag in progression order*/ - int tp_pos; - /** allocation by rate/distortion */ - int disto_alloc; - /** allocation by fixed layer */ - int fixed_alloc; - /** add fixed_quality */ - int fixed_quality; - /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */ - int reduce; - /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */ - int layer; - /** if == NO_LIMITATION, decode entire codestream; if == LIMIT_TO_MAIN_HEADER then only decode the main header */ - OPJ_LIMIT_DECODING limit_decoding; - /** XTOsiz */ - int tx0; - /** YTOsiz */ - int ty0; - /** XTsiz */ - int tdx; - /** YTsiz */ - int tdy; - /** comment for coding */ - char *comment; - /** number of tiles in width */ - int tw; - /** number of tiles in heigth */ - int th; - /** ID number of the tiles present in the codestream */ - int *tileno; - /** size of the vector tileno */ - int tileno_size; - /** packet header store there for futur use in t2_decode_packet */ - unsigned char *ppm_data; - /** pointer remaining on the first byte of the first header if ppm is used */ - unsigned char *ppm_data_first; - /** if ppm == 1 --> there was a PPM marker for the present tile */ - int ppm; - /** use in case of multiple marker PPM (number of info already store) */ - int ppm_store; - /** use in case of multiple marker PPM (case on non-finished previous info) */ - int ppm_previous; - /** ppmbug1 */ - int ppm_len; - /** tile coding parameters */ - opj_tcp_t *tcps; - /** fixed layer */ - int *matrice; -/* UniPG>> */ -#ifdef USE_JPWL - /** enables writing of EPC in MH, thus activating JPWL */ - bool epc_on; - /** enables writing of EPB, in case of activated JPWL */ - bool epb_on; - /** enables writing of ESD, in case of activated JPWL */ - bool esd_on; - /** enables writing of informative techniques of ESD, in case of activated JPWL */ - bool info_on; - /** enables writing of RED, in case of activated JPWL */ - bool red_on; - /** error protection method for MH (0,1,16,32,37-128) */ - int hprot_MH; - /** tile number of header protection specification (>=0) */ - int hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS]; - /** error protection methods for TPHs (0,1,16,32,37-128) */ - int hprot_TPH[JPWL_MAX_NO_TILESPECS]; - /** tile number of packet protection specification (>=0) */ - int pprot_tileno[JPWL_MAX_NO_PACKSPECS]; - /** packet number of packet protection specification (>=0) */ - int pprot_packno[JPWL_MAX_NO_PACKSPECS]; - /** error protection methods for packets (0,1,16,32,37-128) */ - int pprot[JPWL_MAX_NO_PACKSPECS]; - /** enables writing of ESD, (0/2/4 bytes) */ - int sens_size; - /** sensitivity addressing size (0=auto/2/4 bytes) */ - int sens_addr; - /** sensitivity range (0-3) */ - int sens_range; - /** sensitivity method for MH (-1,0-7) */ - int sens_MH; - /** tile number of sensitivity specification (>=0) */ - int sens_TPH_tileno[JPWL_MAX_NO_TILESPECS]; - /** sensitivity methods for TPHs (-1,0-7) */ - int sens_TPH[JPWL_MAX_NO_TILESPECS]; - /** enables JPWL correction at the decoder */ - bool correct; - /** expected number of components at the decoder */ - int exp_comps; - /** maximum number of tiles at the decoder */ - int max_tiles; -#endif /* USE_JPWL */ -/* <cp. -@param j2k J2K decompressor handle -@param parameters decompression parameters -*/ -void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters); -/** -Decode an image from a JPEG-2000 codestream -@param j2k J2K decompressor handle -@param cio Input buffer stream -@param cstr_info Codestream information structure if required, NULL otherwise -@return Returns a decoded image if successful, returns NULL otherwise -*/ -opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info); -/** -Decode an image form a JPT-stream (JPEG 2000, JPIP) -@param j2k J2K decompressor handle -@param cio Input buffer stream -@param cstr_info Codestream information structure if required, NULL otherwise -@return Returns a decoded image if successful, returns NULL otherwise -*/ -opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info); -/** -Creates a J2K compression structure -@param cinfo Codec context info -@return Returns a handle to a J2K compressor if successful, returns NULL otherwise -*/ -opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo); -/** -Destroy a J2K compressor handle -@param j2k J2K compressor handle to destroy -*/ -void j2k_destroy_compress(opj_j2k_t *j2k); -/** -Setup the encoder parameters using the current image and using user parameters. -Coding parameters are returned in j2k->cp. -@param j2k J2K compressor handle -@param parameters compression parameters -@param image input filled image -*/ -void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image); -/** -Converts an enum type progression order to string type -*/ -char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order); -/** -Encode an image into a JPEG-2000 codestream -@param j2k J2K compressor handle -@param cio Output buffer stream -@param image Image to encode -@param cstr_info Codestream information structure if required, NULL otherwise -@return Returns true if successful, returns false otherwise -*/ -bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); - -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __J2K_H */ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2006-2007, Parvatha Elangovan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ +#ifndef __J2K_H +#define __J2K_H +/** +@file j2k.h +@brief The JPEG-2000 Codestream Reader/Writer (J2K) + +The functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data. +*/ + +/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */ +/*@{*/ + +#define J2K_CP_CSTY_PRT 0x01 +#define J2K_CP_CSTY_SOP 0x02 +#define J2K_CP_CSTY_EPH 0x04 +#define J2K_CCP_CSTY_PRT 0x01 +#define J2K_CCP_CBLKSTY_LAZY 0x01 /**< Selective arithmetic coding bypass */ +#define J2K_CCP_CBLKSTY_RESET 0x02 /**< Reset context probabilities on coding pass boundaries */ +#define J2K_CCP_CBLKSTY_TERMALL 0x04 /**< Termination on each coding pass */ +#define J2K_CCP_CBLKSTY_VSC 0x08 /**< Vertically stripe causal context */ +#define J2K_CCP_CBLKSTY_PTERM 0x10 /**< Predictable termination */ +#define J2K_CCP_CBLKSTY_SEGSYM 0x20 /**< Segmentation symbols are used */ +#define J2K_CCP_QNTSTY_NOQNT 0 +#define J2K_CCP_QNTSTY_SIQNT 1 +#define J2K_CCP_QNTSTY_SEQNT 2 + +/* ----------------------------------------------------------------------- */ + +#define J2K_MS_SOC 0xff4f /**< SOC marker value */ +#define J2K_MS_SOT 0xff90 /**< SOT marker value */ +#define J2K_MS_SOD 0xff93 /**< SOD marker value */ +#define J2K_MS_EOC 0xffd9 /**< EOC marker value */ +#define J2K_MS_SIZ 0xff51 /**< SIZ marker value */ +#define J2K_MS_COD 0xff52 /**< COD marker value */ +#define J2K_MS_COC 0xff53 /**< COC marker value */ +#define J2K_MS_RGN 0xff5e /**< RGN marker value */ +#define J2K_MS_QCD 0xff5c /**< QCD marker value */ +#define J2K_MS_QCC 0xff5d /**< QCC marker value */ +#define J2K_MS_POC 0xff5f /**< POC marker value */ +#define J2K_MS_TLM 0xff55 /**< TLM marker value */ +#define J2K_MS_PLM 0xff57 /**< PLM marker value */ +#define J2K_MS_PLT 0xff58 /**< PLT marker value */ +#define J2K_MS_PPM 0xff60 /**< PPM marker value */ +#define J2K_MS_PPT 0xff61 /**< PPT marker value */ +#define J2K_MS_SOP 0xff91 /**< SOP marker value */ +#define J2K_MS_EPH 0xff92 /**< EPH marker value */ +#define J2K_MS_CRG 0xff63 /**< CRG marker value */ +#define J2K_MS_COM 0xff64 /**< COM marker value */ +/* UniPG>> */ +#ifdef USE_JPWL +#define J2K_MS_EPC 0xff68 /**< EPC marker value (Part 11: JPEG 2000 for Wireless) */ +#define J2K_MS_EPB 0xff66 /**< EPB marker value (Part 11: JPEG 2000 for Wireless) */ +#define J2K_MS_ESD 0xff67 /**< ESD marker value (Part 11: JPEG 2000 for Wireless) */ +#define J2K_MS_RED 0xff69 /**< RED marker value (Part 11: JPEG 2000 for Wireless) */ +#endif /* USE_JPWL */ +#ifdef USE_JPSEC +#define J2K_MS_SEC 0xff65 /**< SEC marker value (Part 8: Secure JPEG 2000) */ +#define J2K_MS_INSEC 0xff94 /**< INSEC marker value (Part 8: Secure JPEG 2000) */ +#endif /* USE_JPSEC */ +/* < there was a PPT marker for the present tile */ + int ppt; + /** used in case of multiple marker PPT (number of info already stored) */ + int ppt_store; + /** ppmbug1 */ + int ppt_len; + /** add fixed_quality */ + float distoratio[100]; + /** tile-component coding parameters */ + opj_tccp_t *tccps; +} opj_tcp_t; + +/** +Coding parameters +*/ +typedef struct opj_cp { + /** Digital cinema profile*/ + OPJ_CINEMA_MODE cinema; + /** Maximum rate for each component. If == 0, component size limitation is not considered */ + int max_comp_size; + /** Size of the image in bits*/ + int img_size; + /** Rsiz*/ + OPJ_RSIZ_CAPABILITIES rsiz; + /** Enabling Tile part generation*/ + char tp_on; + /** Flag determining tile part generation*/ + char tp_flag; + /** Position of tile part flag in progression order*/ + int tp_pos; + /** allocation by rate/distortion */ + int disto_alloc; + /** allocation by fixed layer */ + int fixed_alloc; + /** add fixed_quality */ + int fixed_quality; + /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */ + int reduce; + /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */ + int layer; + /** if == NO_LIMITATION, decode entire codestream; if == LIMIT_TO_MAIN_HEADER then only decode the main header */ + OPJ_LIMIT_DECODING limit_decoding; + /** XTOsiz */ + int tx0; + /** YTOsiz */ + int ty0; + /** XTsiz */ + int tdx; + /** YTsiz */ + int tdy; + /** comment for coding */ + char *comment; + /** number of tiles in width */ + int tw; + /** number of tiles in heigth */ + int th; + /** ID number of the tiles present in the codestream */ + int *tileno; + /** size of the vector tileno */ + int tileno_size; + /** packet header store there for futur use in t2_decode_packet */ + unsigned char *ppm_data; + /** pointer remaining on the first byte of the first header if ppm is used */ + unsigned char *ppm_data_first; + /** if ppm == 1 --> there was a PPM marker for the present tile */ + int ppm; + /** use in case of multiple marker PPM (number of info already store) */ + int ppm_store; + /** use in case of multiple marker PPM (case on non-finished previous info) */ + int ppm_previous; + /** ppmbug1 */ + int ppm_len; + /** tile coding parameters */ + opj_tcp_t *tcps; + /** fixed layer */ + int *matrice; +/* UniPG>> */ +#ifdef USE_JPWL + /** enables writing of EPC in MH, thus activating JPWL */ + opj_bool epc_on; + /** enables writing of EPB, in case of activated JPWL */ + opj_bool epb_on; + /** enables writing of ESD, in case of activated JPWL */ + opj_bool esd_on; + /** enables writing of informative techniques of ESD, in case of activated JPWL */ + opj_bool info_on; + /** enables writing of RED, in case of activated JPWL */ + opj_bool red_on; + /** error protection method for MH (0,1,16,32,37-128) */ + int hprot_MH; + /** tile number of header protection specification (>=0) */ + int hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS]; + /** error protection methods for TPHs (0,1,16,32,37-128) */ + int hprot_TPH[JPWL_MAX_NO_TILESPECS]; + /** tile number of packet protection specification (>=0) */ + int pprot_tileno[JPWL_MAX_NO_PACKSPECS]; + /** packet number of packet protection specification (>=0) */ + int pprot_packno[JPWL_MAX_NO_PACKSPECS]; + /** error protection methods for packets (0,1,16,32,37-128) */ + int pprot[JPWL_MAX_NO_PACKSPECS]; + /** enables writing of ESD, (0/2/4 bytes) */ + int sens_size; + /** sensitivity addressing size (0=auto/2/4 bytes) */ + int sens_addr; + /** sensitivity range (0-3) */ + int sens_range; + /** sensitivity method for MH (-1,0-7) */ + int sens_MH; + /** tile number of sensitivity specification (>=0) */ + int sens_TPH_tileno[JPWL_MAX_NO_TILESPECS]; + /** sensitivity methods for TPHs (-1,0-7) */ + int sens_TPH[JPWL_MAX_NO_TILESPECS]; + /** enables JPWL correction at the decoder */ + opj_bool correct; + /** expected number of components at the decoder */ + int exp_comps; + /** maximum number of tiles at the decoder */ + int max_tiles; +#endif /* USE_JPWL */ +/* <cp. +@param j2k J2K decompressor handle +@param parameters decompression parameters +*/ +void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters); +/** +Decode an image from a JPEG-2000 codestream +@param j2k J2K decompressor handle +@param cio Input buffer stream +@param cstr_info Codestream information structure if required, NULL otherwise +@return Returns a decoded image if successful, returns NULL otherwise +*/ +opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info); +/** +Decode an image form a JPT-stream (JPEG 2000, JPIP) +@param j2k J2K decompressor handle +@param cio Input buffer stream +@param cstr_info Codestream information structure if required, NULL otherwise +@return Returns a decoded image if successful, returns NULL otherwise +*/ +opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info); +/** +Creates a J2K compression structure +@param cinfo Codec context info +@return Returns a handle to a J2K compressor if successful, returns NULL otherwise +*/ +opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo); +/** +Destroy a J2K compressor handle +@param j2k J2K compressor handle to destroy +*/ +void j2k_destroy_compress(opj_j2k_t *j2k); +/** +Setup the encoder parameters using the current image and using user parameters. +Coding parameters are returned in j2k->cp. +@param j2k J2K compressor handle +@param parameters compression parameters +@param image input filled image +*/ +void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image); +/** +Converts an enum type progression order to string type +*/ +char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order); +/** +Encode an image into a JPEG-2000 codestream +@param j2k J2K compressor handle +@param cio Output buffer stream +@param image Image to encode +@param cstr_info Codestream information structure if required, NULL otherwise +@return Returns true if successful, returns false otherwise +*/ +opj_bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); + +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __J2K_H */ diff --git a/openjpeg-dotnet/libopenjpeg/j2k_lib.c b/openjpeg-dotnet/libopenjpeg/j2k_lib.c index 820dd249..a66e31e9 100644 --- a/openjpeg-dotnet/libopenjpeg/j2k_lib.c +++ b/openjpeg-dotnet/libopenjpeg/j2k_lib.c @@ -1,59 +1,59 @@ -/* - * Copyright (c) 2005, Hervé Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#ifdef WIN32 -#include -#else -#include -#include -#include -#endif /* WIN32 */ -#include "opj_includes.h" - -double opj_clock(void) { -#ifdef WIN32 - /* WIN32: use QueryPerformance (very accurate) */ - LARGE_INTEGER freq , t ; - /* freq is the clock speed of the CPU */ - QueryPerformanceFrequency(&freq) ; - /* cout << "freq = " << ((double) freq.QuadPart) << endl; */ - /* t is the high resolution performance counter (see MSDN) */ - QueryPerformanceCounter ( & t ) ; - return ( t.QuadPart /(double) freq.QuadPart ) ; -#else - /* Unix or Linux: use resource usage */ - struct rusage t; - double procTime; - /* (1) Get the rusage data structure at this moment (man getrusage) */ - getrusage(0,&t); - /* (2) What is the elapsed time ? - CPU time = User time + System time */ - /* (2a) Get the seconds */ - procTime = t.ru_utime.tv_sec + t.ru_stime.tv_sec; - /* (2b) More precisely! Get the microseconds part ! */ - return ( procTime + (t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ; -#endif -} - +/* + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#ifdef _WIN32 +#include +#else +#include +#include +#include +#endif /* _WIN32 */ +#include "opj_includes.h" + +double opj_clock(void) { +#ifdef _WIN32 + /* _WIN32: use QueryPerformance (very accurate) */ + LARGE_INTEGER freq , t ; + /* freq is the clock speed of the CPU */ + QueryPerformanceFrequency(&freq) ; + /* cout << "freq = " << ((double) freq.QuadPart) << endl; */ + /* t is the high resolution performance counter (see MSDN) */ + QueryPerformanceCounter ( & t ) ; + return ( t.QuadPart /(double) freq.QuadPart ) ; +#else + /* Unix or Linux: use resource usage */ + struct rusage t; + double procTime; + /* (1) Get the rusage data structure at this moment (man getrusage) */ + getrusage(0,&t); + /* (2) What is the elapsed time ? - CPU time = User time + System time */ + /* (2a) Get the seconds */ + procTime = t.ru_utime.tv_sec + t.ru_stime.tv_sec; + /* (2b) More precisely! Get the microseconds part ! */ + return ( procTime + (t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ; +#endif +} + diff --git a/openjpeg-dotnet/libopenjpeg/j2k_lib.h b/openjpeg-dotnet/libopenjpeg/j2k_lib.h index c8383dd2..5f3406e5 100644 --- a/openjpeg-dotnet/libopenjpeg/j2k_lib.h +++ b/openjpeg-dotnet/libopenjpeg/j2k_lib.h @@ -1,54 +1,54 @@ -/* - * Copyright (c) 2005, Hervé Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ -#ifndef __J2K_LIB_H -#define __J2K_LIB_H -/** -@file j2k_lib.h -@brief Internal functions - -The functions in J2K_LIB.C are internal utilities mainly used for timing. -*/ - -/** @defgroup MISC MISC - Miscellaneous internal functions */ -/*@{*/ - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ - -/** -Difference in successive opj_clock() calls tells you the elapsed time -@return Returns time in seconds -*/ -double opj_clock(void); - -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __J2K_LIB_H */ - +/* + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ +#ifndef __J2K_LIB_H +#define __J2K_LIB_H +/** +@file j2k_lib.h +@brief Internal functions + +The functions in J2K_LIB.C are internal utilities mainly used for timing. +*/ + +/** @defgroup MISC MISC - Miscellaneous internal functions */ +/*@{*/ + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ + +/** +Difference in successive opj_clock() calls tells you the elapsed time +@return Returns time in seconds +*/ +double opj_clock(void); + +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __J2K_LIB_H */ + diff --git a/openjpeg-dotnet/libopenjpeg/jp2.c b/openjpeg-dotnet/libopenjpeg/jp2.c index 24babb62..5ae114c3 100644 --- a/openjpeg-dotnet/libopenjpeg/jp2.c +++ b/openjpeg-dotnet/libopenjpeg/jp2.c @@ -1,711 +1,1210 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#include "opj_includes.h" - -/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -/** -Read box headers -@param cinfo Codec context info -@param cio Input stream -@param box -@return Returns true if successful, returns false otherwise -*/ -static bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box); -/*static void jp2_write_url(opj_cio_t *cio, char *Idx_file);*/ -/** -Read the IHDR box - Image Header box -@param jp2 JP2 handle -@param cio Input buffer stream -@return Returns true if successful, returns false otherwise -*/ -static bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio); -static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio); -static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio); -static bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio); -static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio); -static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio); -/** -Write the FTYP box - File type box -@param jp2 JP2 handle -@param cio Output buffer stream -*/ -static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio); -/** -Read the FTYP box - File type box -@param jp2 JP2 handle -@param cio Input buffer stream -@return Returns true if successful, returns false otherwise -*/ -static bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio); -static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); -static bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset); -static void jp2_write_jp(opj_cio_t *cio); -/** -Read the JP box - JPEG 2000 signature -@param jp2 JP2 handle -@param cio Input buffer stream -@return Returns true if successful, returns false otherwise -*/ -static bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio); -/** -Decode the structure of a JP2 file -@param jp2 JP2 handle -@param cio Input buffer stream -@return Returns true if successful, returns false otherwise -*/ -static bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio); - -/*@}*/ - -/*@}*/ - -/* ----------------------------------------------------------------------- */ - -static bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box) { - box->init_pos = cio_tell(cio); - box->length = cio_read(cio, 4); - box->type = cio_read(cio, 4); - if (box->length == 1) { - if (cio_read(cio, 4) != 0) { - opj_event_msg(cinfo, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n"); - return false; - } - box->length = cio_read(cio, 4); - if (box->length == 0) - box->length = cio_numbytesleft(cio) + 12; - } - else if (box->length == 0) { - box->length = cio_numbytesleft(cio) + 8; - } - - return true; -} - -#if 0 -static void jp2_write_url(opj_cio_t *cio, char *Idx_file) { - unsigned int i; - opj_jp2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, JP2_URL, 4); /* DBTL */ - cio_write(cio, 0, 1); /* VERS */ - cio_write(cio, 0, 3); /* FLAG */ - - if(Idx_file) { - for (i = 0; i < strlen(Idx_file); i++) { - cio_write(cio, Idx_file[i], 1); - } - } - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} -#endif - -static bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) { - opj_jp2_box_t box; - - opj_common_ptr cinfo = jp2->cinfo; - - jp2_read_boxhdr(cinfo, cio, &box); - if (JP2_IHDR != box.type) { - opj_event_msg(cinfo, EVT_ERROR, "Expected IHDR Marker\n"); - return false; - } - - jp2->h = cio_read(cio, 4); /* HEIGHT */ - jp2->w = cio_read(cio, 4); /* WIDTH */ - jp2->numcomps = cio_read(cio, 2); /* NC */ - jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t)); - - jp2->bpc = cio_read(cio, 1); /* BPC */ - - jp2->C = cio_read(cio, 1); /* C */ - jp2->UnkC = cio_read(cio, 1); /* UnkC */ - jp2->IPR = cio_read(cio, 1); /* IPR */ - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cinfo, EVT_ERROR, "Error with IHDR Box\n"); - return false; - } - - return true; -} - -static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) { - opj_jp2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, JP2_IHDR, 4); /* IHDR */ - - cio_write(cio, jp2->h, 4); /* HEIGHT */ - cio_write(cio, jp2->w, 4); /* WIDTH */ - cio_write(cio, jp2->numcomps, 2); /* NC */ - - cio_write(cio, jp2->bpc, 1); /* BPC */ - - cio_write(cio, jp2->C, 1); /* C : Always 7 */ - cio_write(cio, jp2->UnkC, 1); /* UnkC, colorspace unknown */ - cio_write(cio, jp2->IPR, 1); /* IPR, no intellectual property */ - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) { - unsigned int i; - opj_jp2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, JP2_BPCC, 4); /* BPCC */ - - for (i = 0; i < jp2->numcomps; i++) { - cio_write(cio, jp2->comps[i].bpcc, 1); - } - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - - -static bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) { - unsigned int i; - opj_jp2_box_t box; - - opj_common_ptr cinfo = jp2->cinfo; - - jp2_read_boxhdr(cinfo, cio, &box); - if (JP2_BPCC != box.type) { - opj_event_msg(cinfo, EVT_ERROR, "Expected BPCC Marker\n"); - return false; - } - - for (i = 0; i < jp2->numcomps; i++) { - jp2->comps[i].bpcc = cio_read(cio, 1); - } - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cinfo, EVT_ERROR, "Error with BPCC Box\n"); - return false; - } - - return true; -} - -static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio) { - opj_jp2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, JP2_COLR, 4); /* COLR */ - - cio_write(cio, jp2->meth, 1); /* METH */ - cio_write(cio, jp2->precedence, 1); /* PRECEDENCE */ - cio_write(cio, jp2->approx, 1); /* APPROX */ - - if (jp2->meth == 1) { - cio_write(cio, jp2->enumcs, 4); /* EnumCS */ - } else { - cio_write(cio, 0, 1); /* PROFILE (??) */ - } - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio) { - opj_jp2_box_t box; - int skip_len; - - opj_common_ptr cinfo = jp2->cinfo; - - jp2_read_boxhdr(cinfo, cio, &box); - do { - if (JP2_COLR != box.type) { - cio_skip(cio, box.length - 8); - jp2_read_boxhdr(cinfo, cio, &box); - } - } while(JP2_COLR != box.type); - - jp2->meth = cio_read(cio, 1); /* METH */ - jp2->precedence = cio_read(cio, 1); /* PRECEDENCE */ - jp2->approx = cio_read(cio, 1); /* APPROX */ - - if (jp2->meth == 1) { - jp2->enumcs = cio_read(cio, 4); /* EnumCS */ - } else { - /* skip PROFILE */ - skip_len = box.init_pos + box.length - cio_tell(cio); - if (skip_len < 0) { - opj_event_msg(cinfo, EVT_ERROR, "Error with JP2H box size\n"); - return false; - } - cio_skip(cio, box.init_pos + box.length - cio_tell(cio)); - } - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cinfo, EVT_ERROR, "Error with BPCC Box\n"); - return false; - } - return true; -} - -void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio) { - opj_jp2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, JP2_JP2H, 4); /* JP2H */ - - jp2_write_ihdr(jp2, cio); - - if (jp2->bpc == 255) { - jp2_write_bpcc(jp2, cio); - } - jp2_write_colr(jp2, cio); - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio) { - opj_jp2_box_t box; - int skip_len; - - opj_common_ptr cinfo = jp2->cinfo; - - jp2_read_boxhdr(cinfo, cio, &box); - do { - if (JP2_JP2H != box.type) { - if (box.type == JP2_JP2C) { - opj_event_msg(cinfo, EVT_ERROR, "Expected JP2H Marker\n"); - return false; - } - cio_skip(cio, box.length - 8); - jp2_read_boxhdr(cinfo, cio, &box); - } - } while(JP2_JP2H != box.type); - - if (!jp2_read_ihdr(jp2, cio)) - return false; - - if (jp2->bpc == 255) { - if (!jp2_read_bpcc(jp2, cio)) - return false; - } - if (!jp2_read_colr(jp2, cio)) - return false; - - skip_len = box.init_pos + box.length - cio_tell(cio); - if (skip_len < 0) { - opj_event_msg(cinfo, EVT_ERROR, "Error with JP2H Box\n"); - return false; - } - cio_skip(cio, box.init_pos + box.length - cio_tell(cio)); - - return true; -} - -static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) { - unsigned int i; - opj_jp2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, JP2_FTYP, 4); /* FTYP */ - - cio_write(cio, jp2->brand, 4); /* BR */ - cio_write(cio, jp2->minversion, 4); /* MinV */ - - for (i = 0; i < jp2->numcl; i++) { - cio_write(cio, jp2->cl[i], 4); /* CL */ - } - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -static bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) { - int i; - opj_jp2_box_t box; - - opj_common_ptr cinfo = jp2->cinfo; - - jp2_read_boxhdr(cinfo, cio, &box); - - if (JP2_FTYP != box.type) { - opj_event_msg(cinfo, EVT_ERROR, "Expected FTYP Marker\n"); - return false; - } - - jp2->brand = cio_read(cio, 4); /* BR */ - jp2->minversion = cio_read(cio, 4); /* MinV */ - jp2->numcl = (box.length - 16) / 4; - jp2->cl = (unsigned int *) opj_malloc(jp2->numcl * sizeof(unsigned int)); - - for (i = 0; i < (int)jp2->numcl; i++) { - jp2->cl[i] = cio_read(cio, 4); /* CLi */ - } - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cinfo, EVT_ERROR, "Error with FTYP Box\n"); - return false; - } - - return true; -} - -static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) { - unsigned int j2k_codestream_offset, j2k_codestream_length; - opj_jp2_box_t box; - - opj_j2k_t *j2k = jp2->j2k; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, JP2_JP2C, 4); /* JP2C */ - - /* J2K encoding */ - j2k_codestream_offset = cio_tell(cio); - if(!j2k_encode(j2k, cio, image, cstr_info)) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "Failed to encode image\n"); - return 0; - } - j2k_codestream_length = cio_tell(cio) - j2k_codestream_offset; - - jp2->j2k_codestream_offset = j2k_codestream_offset; - jp2->j2k_codestream_length = j2k_codestream_length; - - box.length = 8 + jp2->j2k_codestream_length; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); - - return box.length; -} - -static bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset) { - opj_jp2_box_t box; - - opj_common_ptr cinfo = jp2->cinfo; - - jp2_read_boxhdr(cinfo, cio, &box); - do { - if(JP2_JP2C != box.type) { - cio_skip(cio, box.length - 8); - jp2_read_boxhdr(cinfo, cio, &box); - } - } while(JP2_JP2C != box.type); - - *j2k_codestream_offset = cio_tell(cio); - *j2k_codestream_length = box.length - 8; - - return true; -} - -static void jp2_write_jp(opj_cio_t *cio) { - opj_jp2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, JP2_JP, 4); /* JP2 signature */ - cio_write(cio, 0x0d0a870a, 4); - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -static bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio) { - opj_jp2_box_t box; - - opj_common_ptr cinfo = jp2->cinfo; - - jp2_read_boxhdr(cinfo, cio, &box); - if (JP2_JP != box.type) { - opj_event_msg(cinfo, EVT_ERROR, "Expected JP Marker\n"); - return false; - } - if (0x0d0a870a != cio_read(cio, 4)) { - opj_event_msg(cinfo, EVT_ERROR, "Error with JP Marker\n"); - return false; - } - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cinfo, EVT_ERROR, "Error with JP Box size\n"); - return false; - } - - return true; -} - - -static bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio) { - if (!jp2_read_jp(jp2, cio)) - return false; - if (!jp2_read_ftyp(jp2, cio)) - return false; - if (!jp2_read_jp2h(jp2, cio)) - return false; - if (!jp2_read_jp2c(jp2, cio, &jp2->j2k_codestream_length, &jp2->j2k_codestream_offset)) - return false; - - return true; -} - -/* ----------------------------------------------------------------------- */ -/* JP2 decoder interface */ -/* ----------------------------------------------------------------------- */ - -opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo) { - opj_jp2_t *jp2 = (opj_jp2_t*) opj_calloc(1, sizeof(opj_jp2_t)); - if(jp2) { - jp2->cinfo = cinfo; - /* create the J2K codec */ - jp2->j2k = j2k_create_decompress(cinfo); - if(jp2->j2k == NULL) { - jp2_destroy_decompress(jp2); - return NULL; - } - } - return jp2; -} - -void jp2_destroy_decompress(opj_jp2_t *jp2) { - if(jp2) { - /* destroy the J2K codec */ - j2k_destroy_decompress(jp2->j2k); - - if(jp2->comps) { - opj_free(jp2->comps); - } - if(jp2->cl) { - opj_free(jp2->cl); - } - opj_free(jp2); - } -} - -void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters) { - /* setup the J2K codec */ - j2k_setup_decoder(jp2->j2k, parameters); - /* further JP2 initializations go here */ -} - -opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, opj_codestream_info_t *cstr_info) { - opj_common_ptr cinfo; - opj_image_t *image = NULL; - - if(!jp2 || !cio) { - return NULL; - } - - cinfo = jp2->cinfo; - - /* JP2 decoding */ - if(!jp2_read_struct(jp2, cio)) { - opj_event_msg(cinfo, EVT_ERROR, "Failed to decode jp2 structure\n"); - return NULL; - } - - /* J2K decoding */ - image = j2k_decode(jp2->j2k, cio, cstr_info); - if(!image) { - opj_event_msg(cinfo, EVT_ERROR, "Failed to decode J2K image\n"); - return NULL; - } - - /* Set Image Color Space */ - if (jp2->enumcs == 16) - image->color_space = CLRSPC_SRGB; - else if (jp2->enumcs == 17) - image->color_space = CLRSPC_GRAY; - else if (jp2->enumcs == 18) - image->color_space = CLRSPC_SYCC; - else - image->color_space = CLRSPC_UNKNOWN; - - return image; -} - -/* ----------------------------------------------------------------------- */ -/* JP2 encoder interface */ -/* ----------------------------------------------------------------------- */ - -opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo) { - opj_jp2_t *jp2 = (opj_jp2_t*)opj_malloc(sizeof(opj_jp2_t)); - if(jp2) { - jp2->cinfo = cinfo; - /* create the J2K codec */ - jp2->j2k = j2k_create_compress(cinfo); - if(jp2->j2k == NULL) { - jp2_destroy_compress(jp2); - return NULL; - } - } - return jp2; -} - -void jp2_destroy_compress(opj_jp2_t *jp2) { - if(jp2) { - /* destroy the J2K codec */ - j2k_destroy_compress(jp2->j2k); - - if(jp2->comps) { - opj_free(jp2->comps); - } - if(jp2->cl) { - opj_free(jp2->cl); - } - opj_free(jp2); - } -} - -void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_t *image) { - int i; - int depth_0, sign; - - if(!jp2 || !parameters || !image) - return; - - /* setup the J2K codec */ - /* ------------------- */ - - /* Check if number of components respects standard */ - if (image->numcomps < 1 || image->numcomps > 16384) { - opj_event_msg(jp2->cinfo, EVT_ERROR, "Invalid number of components specified while setting up JP2 encoder\n"); - return; - } - - j2k_setup_encoder(jp2->j2k, parameters, image); - - /* setup the JP2 codec */ - /* ------------------- */ - - /* Profile box */ - - jp2->brand = JP2_JP2; /* BR */ - jp2->minversion = 0; /* MinV */ - jp2->numcl = 1; - jp2->cl = (unsigned int*) opj_malloc(jp2->numcl * sizeof(unsigned int)); - jp2->cl[0] = JP2_JP2; /* CL0 : JP2 */ - - /* Image Header box */ - - jp2->numcomps = image->numcomps; /* NC */ - jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t)); - jp2->h = image->y1 - image->y0; /* HEIGHT */ - jp2->w = image->x1 - image->x0; /* WIDTH */ - /* BPC */ - depth_0 = image->comps[0].prec - 1; - sign = image->comps[0].sgnd; - jp2->bpc = depth_0 + (sign << 7); - for (i = 1; i < image->numcomps; i++) { - int depth = image->comps[i].prec - 1; - sign = image->comps[i].sgnd; - if (depth_0 != depth) - jp2->bpc = 255; - } - jp2->C = 7; /* C : Always 7 */ - jp2->UnkC = 0; /* UnkC, colorspace specified in colr box */ - jp2->IPR = 0; /* IPR, no intellectual property */ - - /* BitsPerComponent box */ - - for (i = 0; i < image->numcomps; i++) { - jp2->comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7); - } - - /* Colour Specification box */ - - if ((image->numcomps == 1 || image->numcomps == 3) && (jp2->bpc != 255)) { - jp2->meth = 1; /* METH: Enumerated colourspace */ - } else { - jp2->meth = 2; /* METH: Restricted ICC profile */ - } - if (jp2->meth == 1) { - if (image->color_space == 1) - jp2->enumcs = 16; /* sRGB as defined by IEC 61966–2–1 */ - else if (image->color_space == 2) - jp2->enumcs = 17; /* greyscale */ - else if (image->color_space == 3) - jp2->enumcs = 18; /* YUV */ - } else { - jp2->enumcs = 0; /* PROFILE (??) */ - } - jp2->precedence = 0; /* PRECEDENCE */ - jp2->approx = 0; /* APPROX */ - -} - -bool jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) { - - /* JP2 encoding */ - - /* JPEG 2000 Signature box */ - jp2_write_jp(cio); - /* File Type box */ - jp2_write_ftyp(jp2, cio); - /* JP2 Header box */ - jp2_write_jp2h(jp2, cio); - - /* J2K encoding */ - - if(!jp2_write_jp2c(jp2, cio, image, cstr_info)) { - opj_event_msg(jp2->cinfo, EVT_ERROR, "Failed to encode image\n"); - return false; - } - - return true; -} - - +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2010-2011, Kaori Hagihara + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ +#include "opj_includes.h" + +/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */ +/*@{*/ + +/** @name Local static functions */ +/*@{*/ + +/** +Read box headers +@param cinfo Codec context info +@param cio Input stream +@param box +@return Returns true if successful, returns false otherwise +*/ +static opj_bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box); +/*static void jp2_write_url(opj_cio_t *cio, char *Idx_file);*/ +/** +Read the IHDR box - Image Header box +@param jp2 JP2 handle +@param cio Input buffer stream +@return Returns true if successful, returns false otherwise +*/ +static opj_bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio); +static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio); +static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio); +static opj_bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio); +static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio); +/** +Write the FTYP box - File type box +@param jp2 JP2 handle +@param cio Output buffer stream +*/ +static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio); +/** +Read the FTYP box - File type box +@param jp2 JP2 handle +@param cio Input buffer stream +@return Returns true if successful, returns false otherwise +*/ +static opj_bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio); +static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); +static opj_bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset); +static void jp2_write_jp(opj_cio_t *cio); +/** +Read the JP box - JPEG 2000 signature +@param jp2 JP2 handle +@param cio Input buffer stream +@return Returns true if successful, returns false otherwise +*/ +static opj_bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio); +/** +Decode the structure of a JP2 file +@param jp2 JP2 handle +@param cio Input buffer stream +@param color Collector for profile, cdef and pclr data +@return Returns true if successful, returns false otherwise +*/ +static opj_bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio, + opj_jp2_color_t *color); +/** +Apply collected palette data +@param color Collector for profile, cdef and pclr data +@param image +*/ +static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image, opj_common_ptr cinfo); +/** +Collect palette data +@param jp2 JP2 handle +@param cio Input buffer stream +@param box +@param color Collector for profile, cdef and pclr data +@return Returns true if successful, returns false otherwise +*/ +static opj_bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio, + opj_jp2_box_t *box, opj_jp2_color_t *color); +/** +Collect component mapping data +@param jp2 JP2 handle +@param cio Input buffer stream +@param box +@param color Collector for profile, cdef and pclr data +@return Returns true if successful, returns false otherwise +*/ +static opj_bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio, + opj_jp2_box_t *box, opj_jp2_color_t *color); +/** +Collect colour specification data +@param jp2 JP2 handle +@param cio Input buffer stream +@param box +@param color Collector for profile, cdef and pclr data +@return Returns true if successful, returns false otherwise +*/ +static opj_bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio, + opj_jp2_box_t *box, opj_jp2_color_t *color); +/** +Write file Index (superbox) +@param[in] offset_jp2c offset of jp2c box +@param[in] length_jp2c length of jp2c box +@param[in] offset_idx offset of cidx box +@param[in] length_idx length of cidx box +@param[in] cio file output handle +@return length of fidx box +*/ +static int write_fidx( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_cio_t *cio); +/** +Write index Finder box +@param[in] offset offset of fidx box +@param[in] length length of fidx box +@param[in] cio file output handle +*/ +static void write_iptr( int offset, int length, opj_cio_t *cio); +/** +Write proxy box +@param[in] offset_jp2c offset of jp2c box +@param[in] length_jp2c length of jp2c box +@param[in] offset_idx offset of cidx box +@param[in] length_idx length of cidx box +@param[in] cio file output handle +*/ +static void write_prxy( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_cio_t *cio); +/*@}*/ + +/*@}*/ + +/* ----------------------------------------------------------------------- */ + +static opj_bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box) { + box->init_pos = cio_tell(cio); + box->length = cio_read(cio, 4); + box->type = cio_read(cio, 4); + if (box->length == 1) { + if (cio_read(cio, 4) != 0) { + opj_event_msg(cinfo, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n"); + return OPJ_FALSE; + } + box->length = cio_read(cio, 4); + if (box->length == 0) + box->length = cio_numbytesleft(cio) + 12; + } + else if (box->length == 0) { + box->length = cio_numbytesleft(cio) + 8; + } + + return OPJ_TRUE; +} + +#if 0 +static void jp2_write_url(opj_cio_t *cio, char *Idx_file) { + unsigned int i; + opj_jp2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio, JP2_URL, 4); /* DBTL */ + cio_write(cio, 0, 1); /* VERS */ + cio_write(cio, 0, 3); /* FLAG */ + + if(Idx_file) { + for (i = 0; i < strlen(Idx_file); i++) { + cio_write(cio, Idx_file[i], 1); + } + } + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} +#endif + +static opj_bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) { + opj_jp2_box_t box; + + opj_common_ptr cinfo = jp2->cinfo; + + jp2_read_boxhdr(cinfo, cio, &box); + if (JP2_IHDR != box.type) { + opj_event_msg(cinfo, EVT_ERROR, "Expected IHDR Marker\n"); + return OPJ_FALSE; + } + + jp2->h = cio_read(cio, 4); /* HEIGHT */ + jp2->w = cio_read(cio, 4); /* WIDTH */ + jp2->numcomps = cio_read(cio, 2); /* NC */ + jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t)); + + jp2->bpc = cio_read(cio, 1); /* BPC */ + + jp2->C = cio_read(cio, 1); /* C */ + jp2->UnkC = cio_read(cio, 1); /* UnkC */ + jp2->IPR = cio_read(cio, 1); /* IPR */ + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cinfo, EVT_ERROR, "Error with IHDR Box\n"); + return OPJ_FALSE; + } + + return OPJ_TRUE; +} + +static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) { + opj_jp2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio, JP2_IHDR, 4); /* IHDR */ + + cio_write(cio, jp2->h, 4); /* HEIGHT */ + cio_write(cio, jp2->w, 4); /* WIDTH */ + cio_write(cio, jp2->numcomps, 2); /* NC */ + + cio_write(cio, jp2->bpc, 1); /* BPC */ + + cio_write(cio, jp2->C, 1); /* C : Always 7 */ + cio_write(cio, jp2->UnkC, 1); /* UnkC, colorspace unknown */ + cio_write(cio, jp2->IPR, 1); /* IPR, no intellectual property */ + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) { + unsigned int i; + opj_jp2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio, JP2_BPCC, 4); /* BPCC */ + + for (i = 0; i < jp2->numcomps; i++) { + cio_write(cio, jp2->comps[i].bpcc, 1); + } + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + + +static opj_bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) { + unsigned int i; + opj_jp2_box_t box; + + opj_common_ptr cinfo = jp2->cinfo; + + jp2_read_boxhdr(cinfo, cio, &box); + if (JP2_BPCC != box.type) { + opj_event_msg(cinfo, EVT_ERROR, "Expected BPCC Marker\n"); + return OPJ_FALSE; + } + + for (i = 0; i < jp2->numcomps; i++) { + jp2->comps[i].bpcc = cio_read(cio, 1); + } + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cinfo, EVT_ERROR, "Error with BPCC Box\n"); + return OPJ_FALSE; + } + + return OPJ_TRUE; +} + +static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio) { + opj_jp2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio, JP2_COLR, 4); /* COLR */ + + cio_write(cio, jp2->meth, 1); /* METH */ + cio_write(cio, jp2->precedence, 1); /* PRECEDENCE */ + cio_write(cio, jp2->approx, 1); /* APPROX */ + + if(jp2->meth == 2) + jp2->enumcs = 0; + + cio_write(cio, jp2->enumcs, 4); /* EnumCS */ + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +static void jp2_free_pclr(opj_jp2_color_t *color) +{ + opj_free(color->jp2_pclr->channel_sign); + opj_free(color->jp2_pclr->channel_size); + opj_free(color->jp2_pclr->entries); + + if(color->jp2_pclr->cmap) opj_free(color->jp2_pclr->cmap); + + opj_free(color->jp2_pclr); color->jp2_pclr = NULL; +} + +static void free_color_data(opj_jp2_color_t *color) +{ + if(color->jp2_pclr) + { + jp2_free_pclr(color); + } + if(color->jp2_cdef) + { + if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info); + opj_free(color->jp2_cdef); + } + if(color->icc_profile_buf) opj_free(color->icc_profile_buf); +} + +static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image, opj_common_ptr cinfo) +{ + opj_image_comp_t *old_comps, *new_comps; + unsigned char *channel_size, *channel_sign; + unsigned int *entries; + opj_jp2_cmap_comp_t *cmap; + int *src, *dst; + unsigned int j, max; + unsigned short i, nr_channels, cmp, pcol; + int k, top_k; + + channel_size = color->jp2_pclr->channel_size; + channel_sign = color->jp2_pclr->channel_sign; + entries = color->jp2_pclr->entries; + cmap = color->jp2_pclr->cmap; + nr_channels = color->jp2_pclr->nr_channels; + + old_comps = image->comps; + new_comps = (opj_image_comp_t*) + opj_malloc(nr_channels * sizeof(opj_image_comp_t)); + + for(i = 0; i < nr_channels; ++i) + { + pcol = cmap[i].pcol; cmp = cmap[i].cmp; + + if( pcol < nr_channels ) + new_comps[pcol] = old_comps[cmp]; + else + { + opj_event_msg(cinfo, EVT_ERROR, "Error with pcol value %d (max: %d). skipping\n", pcol, nr_channels); + continue; + } + + if(cmap[i].mtyp == 0) /* Direct use */ + { + old_comps[cmp].data = NULL; continue; + } +/* Palette mapping: */ + new_comps[pcol].data = (int*) + opj_malloc(old_comps[cmp].w * old_comps[cmp].h * sizeof(int)); + new_comps[pcol].prec = channel_size[i]; + new_comps[pcol].sgnd = channel_sign[i]; + } + top_k = color->jp2_pclr->nr_entries - 1; + + for(i = 0; i < nr_channels; ++i) + { +/* Direct use: */ + if(cmap[i].mtyp == 0) continue; + +/* Palette mapping: */ + cmp = cmap[i].cmp; pcol = cmap[i].pcol; + src = old_comps[cmp].data; + dst = new_comps[pcol].data; + max = new_comps[pcol].w * new_comps[pcol].h; + + for(j = 0; j < max; ++j) + { +/* The index */ + if((k = src[j]) < 0) k = 0; else if(k > top_k) k = top_k; +/* The colour */ + dst[j] = entries[k * nr_channels + pcol]; + } + } + max = image->numcomps; + for(i = 0; i < max; ++i) + { + if(old_comps[i].data) opj_free(old_comps[i].data); + } + opj_free(old_comps); + image->comps = new_comps; + image->numcomps = nr_channels; + + jp2_free_pclr(color); + +}/* apply_pclr() */ + +static opj_bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio, + opj_jp2_box_t *box, opj_jp2_color_t *color) +{ + opj_jp2_pclr_t *jp2_pclr; + unsigned char *channel_size, *channel_sign; + unsigned int *entries; + unsigned short nr_entries, nr_channels; + unsigned short i, j; + unsigned char uc; + + OPJ_ARG_NOT_USED(box); + OPJ_ARG_NOT_USED(jp2); + +/* Part 1, I.5.3.4: 'There shall be at most one Palette box inside + * a JP2 Header box' : +*/ + if(color->jp2_pclr) return OPJ_FALSE; + + nr_entries = (unsigned short)cio_read(cio, 2); /* NE */ + nr_channels = (unsigned short)cio_read(cio, 1);/* NPC */ + + entries = (unsigned int*) + opj_malloc(nr_channels * nr_entries * sizeof(unsigned int)); + channel_size = (unsigned char*)opj_malloc(nr_channels); + channel_sign = (unsigned char*)opj_malloc(nr_channels); + + jp2_pclr = (opj_jp2_pclr_t*)opj_malloc(sizeof(opj_jp2_pclr_t)); + jp2_pclr->channel_sign = channel_sign; + jp2_pclr->channel_size = channel_size; + jp2_pclr->entries = entries; + jp2_pclr->nr_entries = nr_entries; + jp2_pclr->nr_channels = nr_channels; + jp2_pclr->cmap = NULL; + + color->jp2_pclr = jp2_pclr; + + for(i = 0; i < nr_channels; ++i) + { + uc = cio_read(cio, 1); /* Bi */ + channel_size[i] = (uc & 0x7f) + 1; + channel_sign[i] = (uc & 0x80)?1:0; + } + + for(j = 0; j < nr_entries; ++j) + { + for(i = 0; i < nr_channels; ++i) + { +/* Cji */ + *entries++ = cio_read(cio, channel_size[i]>>3); + } + } + + return OPJ_TRUE; +}/* jp2_read_pclr() */ + +static opj_bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio, + opj_jp2_box_t *box, opj_jp2_color_t *color) +{ + opj_jp2_cmap_comp_t *cmap; + unsigned short i, nr_channels; + + OPJ_ARG_NOT_USED(box); + OPJ_ARG_NOT_USED(jp2); + +/* Need nr_channels: */ + if(color->jp2_pclr == NULL) return OPJ_FALSE; + +/* Part 1, I.5.3.5: 'There shall be at most one Component Mapping box + * inside a JP2 Header box' : +*/ + if(color->jp2_pclr->cmap) return OPJ_FALSE; + + nr_channels = color->jp2_pclr->nr_channels; + cmap = (opj_jp2_cmap_comp_t*) + opj_malloc(nr_channels * sizeof(opj_jp2_cmap_comp_t)); + + for(i = 0; i < nr_channels; ++i) + { + cmap[i].cmp = (unsigned short)cio_read(cio, 2); + cmap[i].mtyp = cio_read(cio, 1); + cmap[i].pcol = cio_read(cio, 1); + + } + color->jp2_pclr->cmap = cmap; + + return OPJ_TRUE; +}/* jp2_read_cmap() */ + +static void jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color) +{ + opj_jp2_cdef_info_t *info; + int color_space; + unsigned short i, n, cn, typ, asoc, acn; + + color_space = image->color_space; + info = color->jp2_cdef->info; + n = color->jp2_cdef->n; + + for(i = 0; i < n; ++i) + { +/* WATCH: acn = asoc - 1 ! */ + if((asoc = info[i].asoc) == 0) continue; + + cn = info[i].cn; typ = info[i].typ; acn = asoc - 1; + + if(cn != acn) + { + opj_image_comp_t saved; + + memcpy(&saved, &image->comps[cn], sizeof(opj_image_comp_t)); + memcpy(&image->comps[cn], &image->comps[acn], sizeof(opj_image_comp_t)); + memcpy(&image->comps[acn], &saved, sizeof(opj_image_comp_t)); + + info[i].asoc = cn + 1; + info[acn].asoc = info[acn].cn + 1; + } + } + if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info); + + opj_free(color->jp2_cdef); color->jp2_cdef = NULL; + +}/* jp2_apply_cdef() */ + +static opj_bool jp2_read_cdef(opj_jp2_t *jp2, opj_cio_t *cio, + opj_jp2_box_t *box, opj_jp2_color_t *color) +{ + opj_jp2_cdef_info_t *info; + unsigned short i, n; + + OPJ_ARG_NOT_USED(box); + OPJ_ARG_NOT_USED(jp2); + +/* Part 1, I.5.3.6: 'The shall be at most one Channel Definition box + * inside a JP2 Header box.' +*/ + if(color->jp2_cdef) return OPJ_FALSE; + + if((n = (unsigned short)cio_read(cio, 2)) == 0) return OPJ_FALSE; /* szukw000: FIXME */ + + info = (opj_jp2_cdef_info_t*) + opj_malloc(n * sizeof(opj_jp2_cdef_info_t)); + + color->jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t)); + color->jp2_cdef->info = info; + color->jp2_cdef->n = n; + + for(i = 0; i < n; ++i) + { + info[i].cn = (unsigned short)cio_read(cio, 2); + info[i].typ = (unsigned short)cio_read(cio, 2); + info[i].asoc = (unsigned short)cio_read(cio, 2); + + } + return OPJ_TRUE; +}/* jp2_read_cdef() */ + +static opj_bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio, + opj_jp2_box_t *box, opj_jp2_color_t *color) +{ + int skip_len; + opj_common_ptr cinfo; + +/* Part 1, I.5.3.3 : 'A conforming JP2 reader shall ignore all Colour + * Specification boxes after the first.' +*/ + if(color->jp2_has_colr) return OPJ_FALSE; + + cinfo = jp2->cinfo; + + jp2->meth = cio_read(cio, 1); /* METH */ + jp2->precedence = cio_read(cio, 1); /* PRECEDENCE */ + jp2->approx = cio_read(cio, 1); /* APPROX */ + + if (jp2->meth == 1) + { + jp2->enumcs = cio_read(cio, 4); /* EnumCS */ + } + else + if (jp2->meth == 2) + { +/* skip PROFILE */ + skip_len = box->init_pos + box->length - cio_tell(cio); + if (skip_len < 0) + { + opj_event_msg(cinfo, EVT_ERROR, "Error with COLR box size\n"); + return OPJ_FALSE; + } + if(skip_len > 0) + { + unsigned char *start; + + start = cio_getbp(cio); + color->icc_profile_buf = (unsigned char*)opj_malloc(skip_len); + color->icc_profile_len = skip_len; + + cio_skip(cio, box->init_pos + box->length - cio_tell(cio)); + + memcpy(color->icc_profile_buf, start, skip_len); + } + } + + if (cio_tell(cio) - box->init_pos != box->length) + { + opj_event_msg(cinfo, EVT_ERROR, "Error with COLR Box\n"); + return OPJ_FALSE; + } + color->jp2_has_colr = 1; + + return OPJ_TRUE; +}/* jp2_read_colr() */ + +opj_bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color) +{ + opj_jp2_box_t box; + int jp2h_end; + + opj_common_ptr cinfo = jp2->cinfo; + + jp2_read_boxhdr(cinfo, cio, &box); + do + { + if (JP2_JP2H != box.type) + { + if (box.type == JP2_JP2C) + { + opj_event_msg(cinfo, EVT_ERROR, "Expected JP2H Marker\n"); + return OPJ_FALSE; + } + cio_skip(cio, box.length - 8); + + if(cio->bp >= cio->end) return OPJ_FALSE; + + jp2_read_boxhdr(cinfo, cio, &box); + } + } while(JP2_JP2H != box.type); + + if (!jp2_read_ihdr(jp2, cio)) + return OPJ_FALSE; + jp2h_end = box.init_pos + box.length; + + if (jp2->bpc == 255) + { + if (!jp2_read_bpcc(jp2, cio)) + return OPJ_FALSE; + } + jp2_read_boxhdr(cinfo, cio, &box); + + while(cio_tell(cio) < jp2h_end) + { + if(box.type == JP2_COLR) + { + if( !jp2_read_colr(jp2, cio, &box, color)) + { + cio_seek(cio, box.init_pos + 8); + cio_skip(cio, box.length - 8); + } + jp2_read_boxhdr(cinfo, cio, &box); + continue; + } + if(box.type == JP2_CDEF && !jp2->ignore_pclr_cmap_cdef) + { + if( !jp2_read_cdef(jp2, cio, &box, color)) + { + cio_seek(cio, box.init_pos + 8); + cio_skip(cio, box.length - 8); + } + jp2_read_boxhdr(cinfo, cio, &box); + continue; + } + if(box.type == JP2_PCLR && !jp2->ignore_pclr_cmap_cdef) + { + if( !jp2_read_pclr(jp2, cio, &box, color)) + { + cio_seek(cio, box.init_pos + 8); + cio_skip(cio, box.length - 8); + } + jp2_read_boxhdr(cinfo, cio, &box); + continue; + } + if(box.type == JP2_CMAP && !jp2->ignore_pclr_cmap_cdef) + { + if( !jp2_read_cmap(jp2, cio, &box, color)) + { + cio_seek(cio, box.init_pos + 8); + cio_skip(cio, box.length - 8); + } + jp2_read_boxhdr(cinfo, cio, &box); + continue; + } + cio_seek(cio, box.init_pos + 8); + cio_skip(cio, box.length - 8); + jp2_read_boxhdr(cinfo, cio, &box); + + }/* while(cio_tell(cio) < box_end) */ + + cio_seek(cio, jp2h_end); + +/* Part 1, I.5.3.3 : 'must contain at least one' */ + return (color->jp2_has_colr == 1); + +}/* jp2_read_jp2h() */ + +opj_image_t* opj_jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, + opj_codestream_info_t *cstr_info) +{ + opj_common_ptr cinfo; + opj_image_t *image = NULL; + opj_jp2_color_t color; + + if(!jp2 || !cio) + { + return NULL; + } + memset(&color, 0, sizeof(opj_jp2_color_t)); + cinfo = jp2->cinfo; + +/* JP2 decoding */ + if(!jp2_read_struct(jp2, cio, &color)) + { + free_color_data(&color); + opj_event_msg(cinfo, EVT_ERROR, "Failed to decode jp2 structure\n"); + return NULL; + } + +/* J2K decoding */ + image = j2k_decode(jp2->j2k, cio, cstr_info); + + if(!image) + { + free_color_data(&color); + opj_event_msg(cinfo, EVT_ERROR, "Failed to decode J2K image\n"); + return NULL; + } + + if (!jp2->ignore_pclr_cmap_cdef){ + + /* Set Image Color Space */ + if (jp2->enumcs == 16) + image->color_space = CLRSPC_SRGB; + else if (jp2->enumcs == 17) + image->color_space = CLRSPC_GRAY; + else if (jp2->enumcs == 18) + image->color_space = CLRSPC_SYCC; + else + image->color_space = CLRSPC_UNKNOWN; + + if(color.jp2_cdef) + { + jp2_apply_cdef(image, &color); + } + if(color.jp2_pclr) + { +/* Part 1, I.5.3.4: Either both or none : */ + if( !color.jp2_pclr->cmap) + jp2_free_pclr(&color); + else + jp2_apply_pclr(&color, image, cinfo); + } + if(color.icc_profile_buf) + { + image->icc_profile_buf = color.icc_profile_buf; + color.icc_profile_buf = NULL; + image->icc_profile_len = color.icc_profile_len; + } + } + + return image; + +}/* opj_jp2_decode() */ + + +void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio) { + opj_jp2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio, JP2_JP2H, 4); /* JP2H */ + + jp2_write_ihdr(jp2, cio); + + if (jp2->bpc == 255) { + jp2_write_bpcc(jp2, cio); + } + jp2_write_colr(jp2, cio); + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) { + unsigned int i; + opj_jp2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio, JP2_FTYP, 4); /* FTYP */ + + cio_write(cio, jp2->brand, 4); /* BR */ + cio_write(cio, jp2->minversion, 4); /* MinV */ + + for (i = 0; i < jp2->numcl; i++) { + cio_write(cio, jp2->cl[i], 4); /* CL */ + } + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +static opj_bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) { + int i; + opj_jp2_box_t box; + + opj_common_ptr cinfo = jp2->cinfo; + + jp2_read_boxhdr(cinfo, cio, &box); + + if (JP2_FTYP != box.type) { + opj_event_msg(cinfo, EVT_ERROR, "Expected FTYP Marker\n"); + return OPJ_FALSE; + } + + jp2->brand = cio_read(cio, 4); /* BR */ + jp2->minversion = cio_read(cio, 4); /* MinV */ + jp2->numcl = (box.length - 16) / 4; + jp2->cl = (unsigned int *) opj_malloc(jp2->numcl * sizeof(unsigned int)); + + for (i = 0; i < (int)jp2->numcl; i++) { + jp2->cl[i] = cio_read(cio, 4); /* CLi */ + } + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cinfo, EVT_ERROR, "Error with FTYP Box\n"); + return OPJ_FALSE; + } + + return OPJ_TRUE; +} + +static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) { + unsigned int j2k_codestream_offset, j2k_codestream_length; + opj_jp2_box_t box; + + opj_j2k_t *j2k = jp2->j2k; + + box.init_pos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio, JP2_JP2C, 4); /* JP2C */ + + /* J2K encoding */ + j2k_codestream_offset = cio_tell(cio); + if(!j2k_encode(j2k, cio, image, cstr_info)) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "Failed to encode image\n"); + return 0; + } + j2k_codestream_length = cio_tell(cio) - j2k_codestream_offset; + + jp2->j2k_codestream_offset = j2k_codestream_offset; + jp2->j2k_codestream_length = j2k_codestream_length; + + box.length = 8 + jp2->j2k_codestream_length; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); + + return box.length; +} + +static opj_bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset) { + opj_jp2_box_t box; + + opj_common_ptr cinfo = jp2->cinfo; + + jp2_read_boxhdr(cinfo, cio, &box); + do { + if(JP2_JP2C != box.type) { + cio_skip(cio, box.length - 8); + jp2_read_boxhdr(cinfo, cio, &box); + } + } while(JP2_JP2C != box.type); + + *j2k_codestream_offset = cio_tell(cio); + *j2k_codestream_length = box.length - 8; + + return OPJ_TRUE; +} + +static void jp2_write_jp(opj_cio_t *cio) { + opj_jp2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio, JP2_JP, 4); /* JP2 signature */ + cio_write(cio, 0x0d0a870a, 4); + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +static opj_bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio) { + opj_jp2_box_t box; + + opj_common_ptr cinfo = jp2->cinfo; + + jp2_read_boxhdr(cinfo, cio, &box); + if (JP2_JP != box.type) { + opj_event_msg(cinfo, EVT_ERROR, "Expected JP Marker\n"); + return OPJ_FALSE; + } + if (0x0d0a870a != cio_read(cio, 4)) { + opj_event_msg(cinfo, EVT_ERROR, "Error with JP Marker\n"); + return OPJ_FALSE; + } + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cinfo, EVT_ERROR, "Error with JP Box size\n"); + return OPJ_FALSE; + } + + return OPJ_TRUE; +} + + +static opj_bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio, + opj_jp2_color_t *color) { + if (!jp2_read_jp(jp2, cio)) + return OPJ_FALSE; + if (!jp2_read_ftyp(jp2, cio)) + return OPJ_FALSE; + if (!jp2_read_jp2h(jp2, cio, color)) + return OPJ_FALSE; + if (!jp2_read_jp2c(jp2, cio, &jp2->j2k_codestream_length, &jp2->j2k_codestream_offset)) + return OPJ_FALSE; + + return OPJ_TRUE; +} + + +static int write_fidx( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_cio_t *cio) +{ + int len, lenp; + + lenp = cio_tell( cio); + cio_skip( cio, 4); /* L [at the end] */ + cio_write( cio, JPIP_FIDX, 4); /* IPTR */ + + write_prxy( offset_jp2c, length_jp2c, offset_idx, length_idx, cio); + + len = cio_tell( cio)-lenp; + cio_seek( cio, lenp); + cio_write( cio, len, 4); /* L */ + cio_seek( cio, lenp+len); + + return len; +} + +static void write_prxy( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_cio_t *cio) +{ + int len, lenp; + + lenp = cio_tell( cio); + cio_skip( cio, 4); /* L [at the end] */ + cio_write( cio, JPIP_PRXY, 4); /* IPTR */ + + cio_write( cio, offset_jp2c, 8); /* OOFF */ + cio_write( cio, length_jp2c, 4); /* OBH part 1 */ + cio_write( cio, JP2_JP2C, 4); /* OBH part 2 */ + + cio_write( cio, 1,1); /* NI */ + + cio_write( cio, offset_idx, 8); /* IOFF */ + cio_write( cio, length_idx, 4); /* IBH part 1 */ + cio_write( cio, JPIP_CIDX, 4); /* IBH part 2 */ + + len = cio_tell( cio)-lenp; + cio_seek( cio, lenp); + cio_write( cio, len, 4); /* L */ + cio_seek( cio, lenp+len); +} + +static void write_iptr( int offset, int length, opj_cio_t *cio) +{ + int len, lenp; + + lenp = cio_tell( cio); + cio_skip( cio, 4); /* L [at the end] */ + cio_write( cio, JPIP_IPTR, 4); /* IPTR */ + + cio_write( cio, offset, 8); + cio_write( cio, length, 8); + + len = cio_tell( cio)-lenp; + cio_seek( cio, lenp); + cio_write( cio, len, 4); /* L */ + cio_seek( cio, lenp+len); +} + + +/* ----------------------------------------------------------------------- */ +/* JP2 decoder interface */ +/* ----------------------------------------------------------------------- */ + +opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo) { + opj_jp2_t *jp2 = (opj_jp2_t*) opj_calloc(1, sizeof(opj_jp2_t)); + if(jp2) { + jp2->cinfo = cinfo; + /* create the J2K codec */ + jp2->j2k = j2k_create_decompress(cinfo); + if(jp2->j2k == NULL) { + jp2_destroy_decompress(jp2); + return NULL; + } + } + return jp2; +} + +void jp2_destroy_decompress(opj_jp2_t *jp2) { + if(jp2) { + /* destroy the J2K codec */ + j2k_destroy_decompress(jp2->j2k); + + if(jp2->comps) { + opj_free(jp2->comps); + } + if(jp2->cl) { + opj_free(jp2->cl); + } + opj_free(jp2); + } +} + +void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters) { + /* setup the J2K codec */ + j2k_setup_decoder(jp2->j2k, parameters); + /* further JP2 initializations go here */ + jp2->ignore_pclr_cmap_cdef = parameters->flags & OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG; +} + +/* ----------------------------------------------------------------------- */ +/* JP2 encoder interface */ +/* ----------------------------------------------------------------------- */ + +opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo) { + opj_jp2_t *jp2 = (opj_jp2_t*)opj_malloc(sizeof(opj_jp2_t)); + if(jp2) { + jp2->cinfo = cinfo; + /* create the J2K codec */ + jp2->j2k = j2k_create_compress(cinfo); + if(jp2->j2k == NULL) { + jp2_destroy_compress(jp2); + return NULL; + } + } + return jp2; +} + +void jp2_destroy_compress(opj_jp2_t *jp2) { + if(jp2) { + /* destroy the J2K codec */ + j2k_destroy_compress(jp2->j2k); + + if(jp2->comps) { + opj_free(jp2->comps); + } + if(jp2->cl) { + opj_free(jp2->cl); + } + opj_free(jp2); + } +} + +void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_t *image) { + int i; + int depth_0, sign; + + if(!jp2 || !parameters || !image) + return; + + /* setup the J2K codec */ + /* ------------------- */ + + /* Check if number of components respects standard */ + if (image->numcomps < 1 || image->numcomps > 16384) { + opj_event_msg(jp2->cinfo, EVT_ERROR, "Invalid number of components specified while setting up JP2 encoder\n"); + return; + } + + j2k_setup_encoder(jp2->j2k, parameters, image); + + /* setup the JP2 codec */ + /* ------------------- */ + + /* Profile box */ + + jp2->brand = JP2_JP2; /* BR */ + jp2->minversion = 0; /* MinV */ + jp2->numcl = 1; + jp2->cl = (unsigned int*) opj_malloc(jp2->numcl * sizeof(unsigned int)); + jp2->cl[0] = JP2_JP2; /* CL0 : JP2 */ + + /* Image Header box */ + + jp2->numcomps = image->numcomps; /* NC */ + jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t)); + jp2->h = image->y1 - image->y0; /* HEIGHT */ + jp2->w = image->x1 - image->x0; /* WIDTH */ + /* BPC */ + depth_0 = image->comps[0].prec - 1; + sign = image->comps[0].sgnd; + jp2->bpc = depth_0 + (sign << 7); + for (i = 1; i < image->numcomps; i++) { + int depth = image->comps[i].prec - 1; + sign = image->comps[i].sgnd; + if (depth_0 != depth) + jp2->bpc = 255; + } + jp2->C = 7; /* C : Always 7 */ + jp2->UnkC = 0; /* UnkC, colorspace specified in colr box */ + jp2->IPR = 0; /* IPR, no intellectual property */ + + /* BitsPerComponent box */ + + for (i = 0; i < image->numcomps; i++) { + jp2->comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7); + } + jp2->meth = 1; + if (image->color_space == 1) + jp2->enumcs = 16; /* sRGB as defined by IEC 61966-2.1 */ + else if (image->color_space == 2) + jp2->enumcs = 17; /* greyscale */ + else if (image->color_space == 3) + jp2->enumcs = 18; /* YUV */ + jp2->precedence = 0; /* PRECEDENCE */ + jp2->approx = 0; /* APPROX */ + + jp2->jpip_on = parameters->jpip_on; +} + +opj_bool opj_jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) { + + int pos_iptr, pos_cidx, pos_jp2c, len_jp2c, len_cidx, end_pos, pos_fidx, len_fidx; + pos_jp2c = pos_iptr = -1; /* remove a warning */ + + /* JP2 encoding */ + + /* JPEG 2000 Signature box */ + jp2_write_jp(cio); + /* File Type box */ + jp2_write_ftyp(jp2, cio); + /* JP2 Header box */ + jp2_write_jp2h(jp2, cio); + + if( jp2->jpip_on){ + pos_iptr = cio_tell( cio); + cio_skip( cio, 24); /* IPTR further ! */ + + pos_jp2c = cio_tell( cio); + } + + /* J2K encoding */ + if(!(len_jp2c = jp2_write_jp2c( jp2, cio, image, cstr_info))){ + opj_event_msg(jp2->cinfo, EVT_ERROR, "Failed to encode image\n"); + return OPJ_FALSE; + } + + if( jp2->jpip_on){ + pos_cidx = cio_tell( cio); + + len_cidx = write_cidx( pos_jp2c+8, cio, image, *cstr_info, len_jp2c-8); + + pos_fidx = cio_tell( cio); + len_fidx = write_fidx( pos_jp2c, len_jp2c, pos_cidx, len_cidx, cio); + + end_pos = cio_tell( cio); + + cio_seek( cio, pos_iptr); + write_iptr( pos_fidx, len_fidx, cio); + + cio_seek( cio, end_pos); + } + + return OPJ_TRUE; +} diff --git a/openjpeg-dotnet/libopenjpeg/jp2.h b/openjpeg-dotnet/libopenjpeg/jp2.h index cf492c2f..acb643ca 100644 --- a/openjpeg-dotnet/libopenjpeg/jp2.h +++ b/openjpeg-dotnet/libopenjpeg/jp2.h @@ -1,177 +1,234 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ -#ifndef __JP2_H -#define __JP2_H -/** -@file jp2.h -@brief The JPEG-2000 file format Reader/Writer (JP2) - -*/ - -/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */ -/*@{*/ - -#define JPIP_JPIP 0x6a706970 - -#define JP2_JP 0x6a502020 /**< JPEG 2000 signature box */ -#define JP2_FTYP 0x66747970 /**< File type box */ -#define JP2_JP2H 0x6a703268 /**< JP2 header box */ -#define JP2_IHDR 0x69686472 /**< Image header box */ -#define JP2_COLR 0x636f6c72 /**< Colour specification box */ -#define JP2_JP2C 0x6a703263 /**< Contiguous codestream box */ -#define JP2_URL 0x75726c20 /**< URL box */ -#define JP2_DBTL 0x6474626c /**< ??? */ -#define JP2_BPCC 0x62706363 /**< Bits per component box */ -#define JP2_JP2 0x6a703220 /**< File type fields */ - -/* ----------------------------------------------------------------------- */ - -/** -JP2 component -*/ -typedef struct opj_jp2_comps { - int depth; - int sgnd; - int bpcc; -} opj_jp2_comps_t; - -/** -JPEG-2000 file format reader/writer -*/ -typedef struct opj_jp2 { - /** codec context */ - opj_common_ptr cinfo; - /** handle to the J2K codec */ - opj_j2k_t *j2k; - unsigned int w; - unsigned int h; - unsigned int numcomps; - unsigned int bpc; - unsigned int C; - unsigned int UnkC; - unsigned int IPR; - unsigned int meth; - unsigned int approx; - unsigned int enumcs; - unsigned int precedence; - unsigned int brand; - unsigned int minversion; - unsigned int numcl; - unsigned int *cl; - opj_jp2_comps_t *comps; - unsigned int j2k_codestream_offset; - unsigned int j2k_codestream_length; -} opj_jp2_t; - -/** -JP2 Box -*/ -typedef struct opj_jp2_box { - int length; - int type; - int init_pos; -} opj_jp2_box_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Write the JP2H box - JP2 Header box (used in MJ2) -@param jp2 JP2 handle -@param cio Output buffer stream -*/ -void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio); -/** -Read the JP2H box - JP2 Header box (used in MJ2) -@param jp2 JP2 handle -@param cio Input buffer stream -@return Returns true if successful, returns false otherwise -*/ -bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio); -/** -Creates a JP2 decompression structure -@param cinfo Codec context info -@return Returns a handle to a JP2 decompressor if successful, returns NULL otherwise -*/ -opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo); -/** -Destroy a JP2 decompressor handle -@param jp2 JP2 decompressor handle to destroy -*/ -void jp2_destroy_decompress(opj_jp2_t *jp2); -/** -Setup the decoder decoding parameters using user parameters. -Decoding parameters are returned in jp2->j2k->cp. -@param jp2 JP2 decompressor handle -@param parameters decompression parameters -*/ -void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters); -/** -Decode an image from a JPEG-2000 file stream -@param jp2 JP2 decompressor handle -@param cio Input buffer stream -@param cstr_info Codestream information structure if required, NULL otherwise -@return Returns a decoded image if successful, returns NULL otherwise -*/ -opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, opj_codestream_info_t *cstr_info); -/** -Creates a JP2 compression structure -@param cinfo Codec context info -@return Returns a handle to a JP2 compressor if successful, returns NULL otherwise -*/ -opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo); -/** -Destroy a JP2 compressor handle -@param jp2 JP2 compressor handle to destroy -*/ -void jp2_destroy_compress(opj_jp2_t *jp2); -/** -Setup the encoder parameters using the current image and using user parameters. -Coding parameters are returned in jp2->j2k->cp. -@param jp2 JP2 compressor handle -@param parameters compression parameters -@param image input filled image -*/ -void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_t *image); -/** -Encode an image into a JPEG-2000 file stream -@param jp2 JP2 compressor handle -@param cio Output buffer stream -@param image Image to encode -@param cstr_info Codestream information structure if required, NULL otherwise -@return Returns true if successful, returns false otherwise -*/ -bool jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __JP2_H */ - +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ +#ifndef __JP2_H +#define __JP2_H +/** +@file jp2.h +@brief The JPEG-2000 file format Reader/Writer (JP2) + +*/ + +/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */ +/*@{*/ + +#define JPIP_JPIP 0x6a706970 + +#define JP2_JP 0x6a502020 /**< JPEG 2000 signature box */ +#define JP2_FTYP 0x66747970 /**< File type box */ +#define JP2_JP2H 0x6a703268 /**< JP2 header box */ +#define JP2_IHDR 0x69686472 /**< Image header box */ +#define JP2_COLR 0x636f6c72 /**< Colour specification box */ +#define JP2_JP2C 0x6a703263 /**< Contiguous codestream box */ +#define JP2_URL 0x75726c20 /**< URL box */ +#define JP2_DTBL 0x6474626c /**< Data Reference box */ +#define JP2_BPCC 0x62706363 /**< Bits per component box */ +#define JP2_JP2 0x6a703220 /**< File type fields */ +#define JP2_PCLR 0x70636c72 /**< Palette box */ +#define JP2_CMAP 0x636d6170 /**< Component Mapping box */ +#define JP2_CDEF 0x63646566 /**< Channel Definition box */ + +/* ----------------------------------------------------------------------- */ +/** +Channel description: channel index, type, assocation +*/ +typedef struct opj_jp2_cdef_info +{ + unsigned short cn, typ, asoc; +} opj_jp2_cdef_info_t; + +/** +Channel descriptions and number of descriptions +*/ +typedef struct opj_jp2_cdef +{ + opj_jp2_cdef_info_t *info; + unsigned short n; +} opj_jp2_cdef_t; + +/** +Component mappings: channel index, mapping type, palette index +*/ +typedef struct opj_jp2_cmap_comp +{ + unsigned short cmp; + unsigned char mtyp, pcol; +} opj_jp2_cmap_comp_t; + +/** +Palette data: table entries, palette columns +*/ +typedef struct opj_jp2_pclr +{ + unsigned int *entries; + unsigned char *channel_sign; + unsigned char *channel_size; + opj_jp2_cmap_comp_t *cmap; + unsigned short nr_entries, nr_channels; +} opj_jp2_pclr_t; + +/** +Collector for ICC profile, palette, component mapping, channel description +*/ +typedef struct opj_jp2_color +{ + unsigned char *icc_profile_buf; + int icc_profile_len; + + opj_jp2_cdef_t *jp2_cdef; + opj_jp2_pclr_t *jp2_pclr; + unsigned char jp2_has_colr; +} opj_jp2_color_t; + +/** +JP2 component +*/ +typedef struct opj_jp2_comps { + int depth; + int sgnd; + int bpcc; +} opj_jp2_comps_t; + +/** +JPEG-2000 file format reader/writer +*/ +typedef struct opj_jp2 { + /** codec context */ + opj_common_ptr cinfo; + /** handle to the J2K codec */ + opj_j2k_t *j2k; + unsigned int w; + unsigned int h; + unsigned int numcomps; + unsigned int bpc; + unsigned int C; + unsigned int UnkC; + unsigned int IPR; + unsigned int meth; + unsigned int approx; + unsigned int enumcs; + unsigned int precedence; + unsigned int brand; + unsigned int minversion; + unsigned int numcl; + unsigned int *cl; + opj_jp2_comps_t *comps; + unsigned int j2k_codestream_offset; + unsigned int j2k_codestream_length; + opj_bool jpip_on; + opj_bool ignore_pclr_cmap_cdef; +} opj_jp2_t; + +/** +JP2 Box +*/ +typedef struct opj_jp2_box { + int length; + int type; + int init_pos; +} opj_jp2_box_t; + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Write the JP2H box - JP2 Header box (used in MJ2) +@param jp2 JP2 handle +@param cio Output buffer stream +*/ +void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio); +/** +Read the JP2H box - JP2 Header box (used in MJ2) +@param jp2 JP2 handle +@param cio Input buffer stream +@param ext Collector for profile, cdef and pclr data +@return Returns true if successful, returns false otherwise +*/ +opj_bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color); +/** +Creates a JP2 decompression structure +@param cinfo Codec context info +@return Returns a handle to a JP2 decompressor if successful, returns NULL otherwise +*/ +opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo); +/** +Destroy a JP2 decompressor handle +@param jp2 JP2 decompressor handle to destroy +*/ +void jp2_destroy_decompress(opj_jp2_t *jp2); +/** +Setup the decoder decoding parameters using user parameters. +Decoding parameters are returned in jp2->j2k->cp. +@param jp2 JP2 decompressor handle +@param parameters decompression parameters +*/ +void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters); +/** +Decode an image from a JPEG-2000 file stream +@param jp2 JP2 decompressor handle +@param cio Input buffer stream +@param cstr_info Codestream information structure if required, NULL otherwise +@return Returns a decoded image if successful, returns NULL otherwise +*/ +opj_image_t* opj_jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, opj_codestream_info_t *cstr_info); +/** +Creates a JP2 compression structure +@param cinfo Codec context info +@return Returns a handle to a JP2 compressor if successful, returns NULL otherwise +*/ +opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo); +/** +Destroy a JP2 compressor handle +@param jp2 JP2 compressor handle to destroy +*/ +void jp2_destroy_compress(opj_jp2_t *jp2); +/** +Setup the encoder parameters using the current image and using user parameters. +Coding parameters are returned in jp2->j2k->cp. +@param jp2 JP2 compressor handle +@param parameters compression parameters +@param image input filled image +*/ +void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_t *image); +/** +Encode an image into a JPEG-2000 file stream +@param jp2 JP2 compressor handle +@param cio Output buffer stream +@param image Image to encode +@param cstr_info Codestream information structure if required, NULL otherwise +@return Returns true if successful, returns false otherwise +*/ +opj_bool opj_jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); + +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __JP2_H */ + diff --git a/openjpeg-dotnet/libopenjpeg/jpt.c b/openjpeg-dotnet/libopenjpeg/jpt.c index 54898ec0..a2566ea8 100644 --- a/openjpeg-dotnet/libopenjpeg/jpt.c +++ b/openjpeg-dotnet/libopenjpeg/jpt.c @@ -1,155 +1,155 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#include "opj_includes.h" - -/* - * Read the information contains in VBAS [JPP/JPT stream message header] - * Store information (7 bits) in value - * - */ -unsigned int jpt_read_VBAS_info(opj_cio_t *cio, unsigned int value) { - unsigned char elmt; - - elmt = cio_read(cio, 1); - while ((elmt >> 7) == 1) { - value = (value << 7); - value |= (elmt & 0x7f); - elmt = cio_read(cio, 1); - } - value = (value << 7); - value |= (elmt & 0x7f); - - return value; -} - -/* - * Initialize the value of the message header structure - * - */ -void jpt_init_msg_header(opj_jpt_msg_header_t * header) { - header->Id = 0; /* In-class Identifier */ - header->last_byte = 0; /* Last byte information */ - header->Class_Id = 0; /* Class Identifier */ - header->CSn_Id = 0; /* CSn : index identifier */ - header->Msg_offset = 0; /* Message offset */ - header->Msg_length = 0; /* Message length */ - header->Layer_nb = 0; /* Auxiliary for JPP case */ -} - -/* - * Re-initialize the value of the message header structure - * - * Only parameters always present in message header - * - */ -void jpt_reinit_msg_header(opj_jpt_msg_header_t * header) { - header->Id = 0; /* In-class Identifier */ - header->last_byte = 0; /* Last byte information */ - header->Msg_offset = 0; /* Message offset */ - header->Msg_length = 0; /* Message length */ -} - -/* - * Read the message header for a JPP/JPT - stream - * - */ -void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header) { - unsigned char elmt, Class = 0, CSn = 0; - jpt_reinit_msg_header(header); - - /* ------------- */ - /* VBAS : Bin-ID */ - /* ------------- */ - elmt = cio_read(cio, 1); - - /* See for Class and CSn */ - switch ((elmt >> 5) & 0x03) { - case 0: - opj_event_msg(cinfo, EVT_ERROR, "Forbidden value encounter in message header !!\n"); - break; - case 1: - Class = 0; - CSn = 0; - break; - case 2: - Class = 1; - CSn = 0; - break; - case 3: - Class = 1; - CSn = 1; - break; - default: - break; - } - - /* see information on bits 'c' [p 10 : A.2.1 general, ISO/IEC FCD 15444-9] */ - if (((elmt >> 4) & 0x01) == 1) - header->last_byte = 1; - - /* In-class identifier */ - header->Id |= (elmt & 0x0f); - if ((elmt >> 7) == 1) - header->Id = jpt_read_VBAS_info(cio, header->Id); - - /* ------------ */ - /* VBAS : Class */ - /* ------------ */ - if (Class == 1) { - header->Class_Id = 0; - header->Class_Id = jpt_read_VBAS_info(cio, header->Class_Id); - } - - /* ---------- */ - /* VBAS : CSn */ - /* ---------- */ - if (CSn == 1) { - header->CSn_Id = 0; - header->CSn_Id = jpt_read_VBAS_info(cio, header->CSn_Id); - } - - /* ----------------- */ - /* VBAS : Msg_offset */ - /* ----------------- */ - header->Msg_offset = jpt_read_VBAS_info(cio, header->Msg_offset); - - /* ----------------- */ - /* VBAS : Msg_length */ - /* ----------------- */ - header->Msg_length = jpt_read_VBAS_info(cio, header->Msg_length); - - /* ---------- */ - /* VBAS : Aux */ - /* ---------- */ - if ((header->Class_Id & 0x01) == 1) { - header->Layer_nb = 0; - header->Layer_nb = jpt_read_VBAS_info(cio, header->Layer_nb); - } -} +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#include "opj_includes.h" + +/* + * Read the information contains in VBAS [JPP/JPT stream message header] + * Store information (7 bits) in value + * + */ +unsigned int jpt_read_VBAS_info(opj_cio_t *cio, unsigned int value) { + unsigned char elmt; + + elmt = cio_read(cio, 1); + while ((elmt >> 7) == 1) { + value = (value << 7); + value |= (elmt & 0x7f); + elmt = cio_read(cio, 1); + } + value = (value << 7); + value |= (elmt & 0x7f); + + return value; +} + +/* + * Initialize the value of the message header structure + * + */ +void jpt_init_msg_header(opj_jpt_msg_header_t * header) { + header->Id = 0; /* In-class Identifier */ + header->last_byte = 0; /* Last byte information */ + header->Class_Id = 0; /* Class Identifier */ + header->CSn_Id = 0; /* CSn : index identifier */ + header->Msg_offset = 0; /* Message offset */ + header->Msg_length = 0; /* Message length */ + header->Layer_nb = 0; /* Auxiliary for JPP case */ +} + +/* + * Re-initialize the value of the message header structure + * + * Only parameters always present in message header + * + */ +void jpt_reinit_msg_header(opj_jpt_msg_header_t * header) { + header->Id = 0; /* In-class Identifier */ + header->last_byte = 0; /* Last byte information */ + header->Msg_offset = 0; /* Message offset */ + header->Msg_length = 0; /* Message length */ +} + +/* + * Read the message header for a JPP/JPT - stream + * + */ +void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header) { + unsigned char elmt, Class = 0, CSn = 0; + jpt_reinit_msg_header(header); + + /* ------------- */ + /* VBAS : Bin-ID */ + /* ------------- */ + elmt = cio_read(cio, 1); + + /* See for Class and CSn */ + switch ((elmt >> 5) & 0x03) { + case 0: + opj_event_msg(cinfo, EVT_ERROR, "Forbidden value encounter in message header !!\n"); + break; + case 1: + Class = 0; + CSn = 0; + break; + case 2: + Class = 1; + CSn = 0; + break; + case 3: + Class = 1; + CSn = 1; + break; + default: + break; + } + + /* see information on bits 'c' [p 10 : A.2.1 general, ISO/IEC FCD 15444-9] */ + if (((elmt >> 4) & 0x01) == 1) + header->last_byte = 1; + + /* In-class identifier */ + header->Id |= (elmt & 0x0f); + if ((elmt >> 7) == 1) + header->Id = jpt_read_VBAS_info(cio, header->Id); + + /* ------------ */ + /* VBAS : Class */ + /* ------------ */ + if (Class == 1) { + header->Class_Id = 0; + header->Class_Id = jpt_read_VBAS_info(cio, header->Class_Id); + } + + /* ---------- */ + /* VBAS : CSn */ + /* ---------- */ + if (CSn == 1) { + header->CSn_Id = 0; + header->CSn_Id = jpt_read_VBAS_info(cio, header->CSn_Id); + } + + /* ----------------- */ + /* VBAS : Msg_offset */ + /* ----------------- */ + header->Msg_offset = jpt_read_VBAS_info(cio, header->Msg_offset); + + /* ----------------- */ + /* VBAS : Msg_length */ + /* ----------------- */ + header->Msg_length = jpt_read_VBAS_info(cio, header->Msg_length); + + /* ---------- */ + /* VBAS : Aux */ + /* ---------- */ + if ((header->Class_Id & 0x01) == 1) { + header->Layer_nb = 0; + header->Layer_nb = jpt_read_VBAS_info(cio, header->Layer_nb); + } +} diff --git a/openjpeg-dotnet/libopenjpeg/jpt.h b/openjpeg-dotnet/libopenjpeg/jpt.h index eeac7009..eb01f98e 100644 --- a/openjpeg-dotnet/libopenjpeg/jpt.h +++ b/openjpeg-dotnet/libopenjpeg/jpt.h @@ -1,75 +1,75 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#ifndef __JPT_H -#define __JPT_H -/** -@file jpt.h -@brief JPT-stream reader (JPEG 2000, JPIP) - -JPT-stream functions are implemented in J2K.C. -*/ - -/** -Message Header JPT stream structure -*/ -typedef struct opj_jpt_msg_header { - /** In-class Identifier */ - unsigned int Id; - /** Last byte information */ - unsigned int last_byte; - /** Class Identifier */ - unsigned int Class_Id; - /** CSn : index identifier */ - unsigned int CSn_Id; - /** Message offset */ - unsigned int Msg_offset; - /** Message length */ - unsigned int Msg_length; - /** Auxiliary for JPP case */ - unsigned int Layer_nb; -} opj_jpt_msg_header_t; - -/* ----------------------------------------------------------------------- */ - -/** -Initialize the value of the message header structure -@param header Message header structure -*/ -void jpt_init_msg_header(opj_jpt_msg_header_t * header); - -/** -Read the message header for a JPP/JPT - stream -@param cinfo Codec context info -@param cio CIO handle -@param header Message header structure -*/ -void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header); - -#endif +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#ifndef __JPT_H +#define __JPT_H +/** +@file jpt.h +@brief JPT-stream reader (JPEG 2000, JPIP) + +JPT-stream functions are implemented in J2K.C. +*/ + +/** +Message Header JPT stream structure +*/ +typedef struct opj_jpt_msg_header { + /** In-class Identifier */ + unsigned int Id; + /** Last byte information */ + unsigned int last_byte; + /** Class Identifier */ + unsigned int Class_Id; + /** CSn : index identifier */ + unsigned int CSn_Id; + /** Message offset */ + unsigned int Msg_offset; + /** Message length */ + unsigned int Msg_length; + /** Auxiliary for JPP case */ + unsigned int Layer_nb; +} opj_jpt_msg_header_t; + +/* ----------------------------------------------------------------------- */ + +/** +Initialize the value of the message header structure +@param header Message header structure +*/ +void jpt_init_msg_header(opj_jpt_msg_header_t * header); + +/** +Read the message header for a JPP/JPT - stream +@param cinfo Codec context info +@param cio CIO handle +@param header Message header structure +*/ +void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header); + +#endif diff --git a/openjpeg-dotnet/libopenjpeg/mct.c b/openjpeg-dotnet/libopenjpeg/mct.c index 9e1eeb2c..870993b0 100644 --- a/openjpeg-dotnet/libopenjpeg/mct.c +++ b/openjpeg-dotnet/libopenjpeg/mct.c @@ -1,148 +1,190 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#include "opj_includes.h" - -/* */ -/* This table contains the norms of the basis function of the reversible MCT. */ -/* */ -static const double mct_norms[3] = { 1.732, .8292, .8292 }; - -/* */ -/* This table contains the norms of the basis function of the irreversible MCT. */ -/* */ -static const double mct_norms_real[3] = { 1.732, 1.805, 1.573 }; - -/* */ -/* Foward reversible MCT. */ -/* */ -void mct_encode( - int* restrict c0, - int* restrict c1, - int* restrict c2, - int n) -{ - int i; - for(i = 0; i < n; ++i) { - int r = c0[i]; - int g = c1[i]; - int b = c2[i]; - int y = (r + (g * 2) + b) >> 2; - int u = b - g; - int v = r - g; - c0[i] = y; - c1[i] = u; - c2[i] = v; - } -} - -/* */ -/* Inverse reversible MCT. */ -/* */ -void mct_decode( - int* restrict c0, - int* restrict c1, - int* restrict c2, - int n) -{ - int i; - for (i = 0; i < n; ++i) { - int y = c0[i]; - int u = c1[i]; - int v = c2[i]; - int g = y - ((u + v) >> 2); - int r = v + g; - int b = u + g; - c0[i] = r; - c1[i] = g; - c2[i] = b; - } -} - -/* */ -/* Get norm of basis function of reversible MCT. */ -/* */ -double mct_getnorm(int compno) { - return mct_norms[compno]; -} - -/* */ -/* Foward irreversible MCT. */ -/* */ -void mct_encode_real( - int* restrict c0, - int* restrict c1, - int* restrict c2, - int n) -{ - int i; - for(i = 0; i < n; ++i) { - int r = c0[i]; - int g = c1[i]; - int b = c2[i]; - int y = fix_mul(r, 2449) + fix_mul(g, 4809) + fix_mul(b, 934); - int u = -fix_mul(r, 1382) - fix_mul(g, 2714) + fix_mul(b, 4096); - int v = fix_mul(r, 4096) - fix_mul(g, 3430) - fix_mul(b, 666); - c0[i] = y; - c1[i] = u; - c2[i] = v; - } -} - -/* */ -/* Inverse irreversible MCT. */ -/* */ -void mct_decode_real( - float* restrict c0, - float* restrict c1, - float* restrict c2, - int n) -{ - int i; - for(i = 0; i < n; ++i) { - float y = c0[i]; - float u = c1[i]; - float v = c2[i]; - float r = y + (v * 1.402f); - float g = y - (u * 0.34413f) - (v * (0.71414f)); - float b = y + (u * 1.772f); - c0[i] = r; - c1[i] = g; - c2[i] = b; - } -} - -/* */ -/* Get norm of basis function of irreversible MCT. */ -/* */ -double mct_getnorm_real(int compno) { - return mct_norms_real[compno]; -} +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#ifdef __SSE__ +#include +#endif + +#include "opj_includes.h" + +/* */ +/* This table contains the norms of the basis function of the reversible MCT. */ +/* */ +static const double mct_norms[3] = { 1.732, .8292, .8292 }; + +/* */ +/* This table contains the norms of the basis function of the irreversible MCT. */ +/* */ +static const double mct_norms_real[3] = { 1.732, 1.805, 1.573 }; + +/* */ +/* Foward reversible MCT. */ +/* */ +void mct_encode( + int* restrict c0, + int* restrict c1, + int* restrict c2, + int n) +{ + int i; + for(i = 0; i < n; ++i) { + int r = c0[i]; + int g = c1[i]; + int b = c2[i]; + int y = (r + (g * 2) + b) >> 2; + int u = b - g; + int v = r - g; + c0[i] = y; + c1[i] = u; + c2[i] = v; + } +} + +/* */ +/* Inverse reversible MCT. */ +/* */ +void mct_decode( + int* restrict c0, + int* restrict c1, + int* restrict c2, + int n) +{ + int i; + for (i = 0; i < n; ++i) { + int y = c0[i]; + int u = c1[i]; + int v = c2[i]; + int g = y - ((u + v) >> 2); + int r = v + g; + int b = u + g; + c0[i] = r; + c1[i] = g; + c2[i] = b; + } +} + +/* */ +/* Get norm of basis function of reversible MCT. */ +/* */ +double mct_getnorm(int compno) { + return mct_norms[compno]; +} + +/* */ +/* Foward irreversible MCT. */ +/* */ +void mct_encode_real( + int* restrict c0, + int* restrict c1, + int* restrict c2, + int n) +{ + int i; + for(i = 0; i < n; ++i) { + int r = c0[i]; + int g = c1[i]; + int b = c2[i]; + int y = fix_mul(r, 2449) + fix_mul(g, 4809) + fix_mul(b, 934); + int u = -fix_mul(r, 1382) - fix_mul(g, 2714) + fix_mul(b, 4096); + int v = fix_mul(r, 4096) - fix_mul(g, 3430) - fix_mul(b, 666); + c0[i] = y; + c1[i] = u; + c2[i] = v; + } +} + +/* */ +/* Inverse irreversible MCT. */ +/* */ +void mct_decode_real( + float* restrict c0, + float* restrict c1, + float* restrict c2, + int n) +{ + int i; +#ifdef __SSE__ + __m128 vrv, vgu, vgv, vbu; + vrv = _mm_set1_ps(1.402f); + vgu = _mm_set1_ps(0.34413f); + vgv = _mm_set1_ps(0.71414f); + vbu = _mm_set1_ps(1.772f); + for (i = 0; i < (n >> 3); ++i) { + __m128 vy, vu, vv; + __m128 vr, vg, vb; + + vy = _mm_load_ps(c0); + vu = _mm_load_ps(c1); + vv = _mm_load_ps(c2); + vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv)); + vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv)); + vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu)); + _mm_store_ps(c0, vr); + _mm_store_ps(c1, vg); + _mm_store_ps(c2, vb); + c0 += 4; + c1 += 4; + c2 += 4; + + vy = _mm_load_ps(c0); + vu = _mm_load_ps(c1); + vv = _mm_load_ps(c2); + vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv)); + vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv)); + vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu)); + _mm_store_ps(c0, vr); + _mm_store_ps(c1, vg); + _mm_store_ps(c2, vb); + c0 += 4; + c1 += 4; + c2 += 4; + } + n &= 7; +#endif + for(i = 0; i < n; ++i) { + float y = c0[i]; + float u = c1[i]; + float v = c2[i]; + float r = y + (v * 1.402f); + float g = y - (u * 0.34413f) - (v * (0.71414f)); + float b = y + (u * 1.772f); + c0[i] = r; + c1[i] = g; + c2[i] = b; + } +} + +/* */ +/* Get norm of basis function of irreversible MCT. */ +/* */ +double mct_getnorm_real(int compno) { + return mct_norms_real[compno]; +} diff --git a/openjpeg-dotnet/libopenjpeg/mct.h b/openjpeg-dotnet/libopenjpeg/mct.h index 361388ed..84e3f8ad 100644 --- a/openjpeg-dotnet/libopenjpeg/mct.h +++ b/openjpeg-dotnet/libopenjpeg/mct.h @@ -1,98 +1,98 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#ifndef __MCT_H -#define __MCT_H -/** -@file mct.h -@brief Implementation of a multi-component transforms (MCT) - -The functions in MCT.C have for goal to realize reversible and irreversible multicomponent -transform. The functions in MCT.C are used by some function in TCD.C. -*/ - -/** @defgroup MCT MCT - Implementation of a multi-component transform */ -/*@{*/ - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Apply a reversible multi-component transform to an image -@param c0 Samples for red component -@param c1 Samples for green component -@param c2 Samples blue component -@param n Number of samples for each component -*/ -void mct_encode(int *c0, int *c1, int *c2, int n); -/** -Apply a reversible multi-component inverse transform to an image -@param c0 Samples for luminance component -@param c1 Samples for red chrominance component -@param c2 Samples for blue chrominance component -@param n Number of samples for each component -*/ -void mct_decode(int *c0, int *c1, int *c2, int n); -/** -Get norm of the basis function used for the reversible multi-component transform -@param compno Number of the component (0->Y, 1->U, 2->V) -@return -*/ -double mct_getnorm(int compno); - -/** -Apply an irreversible multi-component transform to an image -@param c0 Samples for red component -@param c1 Samples for green component -@param c2 Samples blue component -@param n Number of samples for each component -*/ -void mct_encode_real(int *c0, int *c1, int *c2, int n); -/** -Apply an irreversible multi-component inverse transform to an image -@param c0 Samples for luminance component -@param c1 Samples for red chrominance component -@param c2 Samples for blue chrominance component -@param n Number of samples for each component -*/ -void mct_decode_real(float* c0, float* c1, float* c2, int n); -/** -Get norm of the basis function used for the irreversible multi-component transform -@param compno Number of the component (0->Y, 1->U, 2->V) -@return -*/ -double mct_getnorm_real(int compno); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __MCT_H */ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#ifndef __MCT_H +#define __MCT_H +/** +@file mct.h +@brief Implementation of a multi-component transforms (MCT) + +The functions in MCT.C have for goal to realize reversible and irreversible multicomponent +transform. The functions in MCT.C are used by some function in TCD.C. +*/ + +/** @defgroup MCT MCT - Implementation of a multi-component transform */ +/*@{*/ + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Apply a reversible multi-component transform to an image +@param c0 Samples for red component +@param c1 Samples for green component +@param c2 Samples blue component +@param n Number of samples for each component +*/ +void mct_encode(int *c0, int *c1, int *c2, int n); +/** +Apply a reversible multi-component inverse transform to an image +@param c0 Samples for luminance component +@param c1 Samples for red chrominance component +@param c2 Samples for blue chrominance component +@param n Number of samples for each component +*/ +void mct_decode(int *c0, int *c1, int *c2, int n); +/** +Get norm of the basis function used for the reversible multi-component transform +@param compno Number of the component (0->Y, 1->U, 2->V) +@return +*/ +double mct_getnorm(int compno); + +/** +Apply an irreversible multi-component transform to an image +@param c0 Samples for red component +@param c1 Samples for green component +@param c2 Samples blue component +@param n Number of samples for each component +*/ +void mct_encode_real(int *c0, int *c1, int *c2, int n); +/** +Apply an irreversible multi-component inverse transform to an image +@param c0 Samples for luminance component +@param c1 Samples for red chrominance component +@param c2 Samples for blue chrominance component +@param n Number of samples for each component +*/ +void mct_decode_real(float* c0, float* c1, float* c2, int n); +/** +Get norm of the basis function used for the irreversible multi-component transform +@param compno Number of the component (0->Y, 1->U, 2->V) +@return +*/ +double mct_getnorm_real(int compno); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __MCT_H */ diff --git a/openjpeg-dotnet/libopenjpeg/mqc.c b/openjpeg-dotnet/libopenjpeg/mqc.c index b63c8b55..14129fbf 100644 --- a/openjpeg-dotnet/libopenjpeg/mqc.c +++ b/openjpeg-dotnet/libopenjpeg/mqc.c @@ -1,538 +1,592 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#include "opj_includes.h" - -/** @defgroup MQC MQC - Implementation of an MQ-Coder */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -/** -Output a byte, doing bit-stuffing if necessary. -After a 0xff byte, the next byte must be smaller than 0x90. -@param mqc MQC handle -*/ -static void mqc_byteout(opj_mqc_t *mqc); -/** -Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000 -@param mqc MQC handle -*/ -static void mqc_renorme(opj_mqc_t *mqc); -/** -Encode the most probable symbol -@param mqc MQC handle -*/ -static void mqc_codemps(opj_mqc_t *mqc); -/** -Encode the most least symbol -@param mqc MQC handle -*/ -static void mqc_codelps(opj_mqc_t *mqc); -/** -Fill mqc->c with 1's for flushing -@param mqc MQC handle -*/ -static void mqc_setbits(opj_mqc_t *mqc); -/** -FIXME: documentation ??? -@param mqc MQC handle -@return -*/ -static int mqc_mpsexchange(opj_mqc_t *mqc); -/** -FIXME: documentation ??? -@param mqc MQC handle -@return -*/ -static int mqc_lpsexchange(opj_mqc_t *mqc); -/** -Input a byte -@param mqc MQC handle -*/ -static void mqc_bytein(opj_mqc_t *mqc); -/** -Renormalize mqc->a and mqc->c while decoding -@param mqc MQC handle -*/ -static void mqc_renormd(opj_mqc_t *mqc); - -/*@}*/ - -/*@}*/ - -/* */ -/* This array defines all the possible states for a context. */ -/* */ -static opj_mqc_state_t mqc_states[47 * 2] = { - {0x5601, 0, &mqc_states[2], &mqc_states[3]}, - {0x5601, 1, &mqc_states[3], &mqc_states[2]}, - {0x3401, 0, &mqc_states[4], &mqc_states[12]}, - {0x3401, 1, &mqc_states[5], &mqc_states[13]}, - {0x1801, 0, &mqc_states[6], &mqc_states[18]}, - {0x1801, 1, &mqc_states[7], &mqc_states[19]}, - {0x0ac1, 0, &mqc_states[8], &mqc_states[24]}, - {0x0ac1, 1, &mqc_states[9], &mqc_states[25]}, - {0x0521, 0, &mqc_states[10], &mqc_states[58]}, - {0x0521, 1, &mqc_states[11], &mqc_states[59]}, - {0x0221, 0, &mqc_states[76], &mqc_states[66]}, - {0x0221, 1, &mqc_states[77], &mqc_states[67]}, - {0x5601, 0, &mqc_states[14], &mqc_states[13]}, - {0x5601, 1, &mqc_states[15], &mqc_states[12]}, - {0x5401, 0, &mqc_states[16], &mqc_states[28]}, - {0x5401, 1, &mqc_states[17], &mqc_states[29]}, - {0x4801, 0, &mqc_states[18], &mqc_states[28]}, - {0x4801, 1, &mqc_states[19], &mqc_states[29]}, - {0x3801, 0, &mqc_states[20], &mqc_states[28]}, - {0x3801, 1, &mqc_states[21], &mqc_states[29]}, - {0x3001, 0, &mqc_states[22], &mqc_states[34]}, - {0x3001, 1, &mqc_states[23], &mqc_states[35]}, - {0x2401, 0, &mqc_states[24], &mqc_states[36]}, - {0x2401, 1, &mqc_states[25], &mqc_states[37]}, - {0x1c01, 0, &mqc_states[26], &mqc_states[40]}, - {0x1c01, 1, &mqc_states[27], &mqc_states[41]}, - {0x1601, 0, &mqc_states[58], &mqc_states[42]}, - {0x1601, 1, &mqc_states[59], &mqc_states[43]}, - {0x5601, 0, &mqc_states[30], &mqc_states[29]}, - {0x5601, 1, &mqc_states[31], &mqc_states[28]}, - {0x5401, 0, &mqc_states[32], &mqc_states[28]}, - {0x5401, 1, &mqc_states[33], &mqc_states[29]}, - {0x5101, 0, &mqc_states[34], &mqc_states[30]}, - {0x5101, 1, &mqc_states[35], &mqc_states[31]}, - {0x4801, 0, &mqc_states[36], &mqc_states[32]}, - {0x4801, 1, &mqc_states[37], &mqc_states[33]}, - {0x3801, 0, &mqc_states[38], &mqc_states[34]}, - {0x3801, 1, &mqc_states[39], &mqc_states[35]}, - {0x3401, 0, &mqc_states[40], &mqc_states[36]}, - {0x3401, 1, &mqc_states[41], &mqc_states[37]}, - {0x3001, 0, &mqc_states[42], &mqc_states[38]}, - {0x3001, 1, &mqc_states[43], &mqc_states[39]}, - {0x2801, 0, &mqc_states[44], &mqc_states[38]}, - {0x2801, 1, &mqc_states[45], &mqc_states[39]}, - {0x2401, 0, &mqc_states[46], &mqc_states[40]}, - {0x2401, 1, &mqc_states[47], &mqc_states[41]}, - {0x2201, 0, &mqc_states[48], &mqc_states[42]}, - {0x2201, 1, &mqc_states[49], &mqc_states[43]}, - {0x1c01, 0, &mqc_states[50], &mqc_states[44]}, - {0x1c01, 1, &mqc_states[51], &mqc_states[45]}, - {0x1801, 0, &mqc_states[52], &mqc_states[46]}, - {0x1801, 1, &mqc_states[53], &mqc_states[47]}, - {0x1601, 0, &mqc_states[54], &mqc_states[48]}, - {0x1601, 1, &mqc_states[55], &mqc_states[49]}, - {0x1401, 0, &mqc_states[56], &mqc_states[50]}, - {0x1401, 1, &mqc_states[57], &mqc_states[51]}, - {0x1201, 0, &mqc_states[58], &mqc_states[52]}, - {0x1201, 1, &mqc_states[59], &mqc_states[53]}, - {0x1101, 0, &mqc_states[60], &mqc_states[54]}, - {0x1101, 1, &mqc_states[61], &mqc_states[55]}, - {0x0ac1, 0, &mqc_states[62], &mqc_states[56]}, - {0x0ac1, 1, &mqc_states[63], &mqc_states[57]}, - {0x09c1, 0, &mqc_states[64], &mqc_states[58]}, - {0x09c1, 1, &mqc_states[65], &mqc_states[59]}, - {0x08a1, 0, &mqc_states[66], &mqc_states[60]}, - {0x08a1, 1, &mqc_states[67], &mqc_states[61]}, - {0x0521, 0, &mqc_states[68], &mqc_states[62]}, - {0x0521, 1, &mqc_states[69], &mqc_states[63]}, - {0x0441, 0, &mqc_states[70], &mqc_states[64]}, - {0x0441, 1, &mqc_states[71], &mqc_states[65]}, - {0x02a1, 0, &mqc_states[72], &mqc_states[66]}, - {0x02a1, 1, &mqc_states[73], &mqc_states[67]}, - {0x0221, 0, &mqc_states[74], &mqc_states[68]}, - {0x0221, 1, &mqc_states[75], &mqc_states[69]}, - {0x0141, 0, &mqc_states[76], &mqc_states[70]}, - {0x0141, 1, &mqc_states[77], &mqc_states[71]}, - {0x0111, 0, &mqc_states[78], &mqc_states[72]}, - {0x0111, 1, &mqc_states[79], &mqc_states[73]}, - {0x0085, 0, &mqc_states[80], &mqc_states[74]}, - {0x0085, 1, &mqc_states[81], &mqc_states[75]}, - {0x0049, 0, &mqc_states[82], &mqc_states[76]}, - {0x0049, 1, &mqc_states[83], &mqc_states[77]}, - {0x0025, 0, &mqc_states[84], &mqc_states[78]}, - {0x0025, 1, &mqc_states[85], &mqc_states[79]}, - {0x0015, 0, &mqc_states[86], &mqc_states[80]}, - {0x0015, 1, &mqc_states[87], &mqc_states[81]}, - {0x0009, 0, &mqc_states[88], &mqc_states[82]}, - {0x0009, 1, &mqc_states[89], &mqc_states[83]}, - {0x0005, 0, &mqc_states[90], &mqc_states[84]}, - {0x0005, 1, &mqc_states[91], &mqc_states[85]}, - {0x0001, 0, &mqc_states[90], &mqc_states[86]}, - {0x0001, 1, &mqc_states[91], &mqc_states[87]}, - {0x5601, 0, &mqc_states[92], &mqc_states[92]}, - {0x5601, 1, &mqc_states[93], &mqc_states[93]}, -}; - -/* -========================================================== - local functions -========================================================== -*/ - -static void mqc_byteout(opj_mqc_t *mqc) { - if (*mqc->bp == 0xff) { - mqc->bp++; - *mqc->bp = mqc->c >> 20; - mqc->c &= 0xfffff; - mqc->ct = 7; - } else { - if ((mqc->c & 0x8000000) == 0) { /* ((mqc->c&0x8000000)==0) CHANGE */ - mqc->bp++; - *mqc->bp = mqc->c >> 19; - mqc->c &= 0x7ffff; - mqc->ct = 8; - } else { - (*mqc->bp)++; - if (*mqc->bp == 0xff) { - mqc->c &= 0x7ffffff; - mqc->bp++; - *mqc->bp = mqc->c >> 20; - mqc->c &= 0xfffff; - mqc->ct = 7; - } else { - mqc->bp++; - *mqc->bp = mqc->c >> 19; - mqc->c &= 0x7ffff; - mqc->ct = 8; - } - } - } -} - -static void mqc_renorme(opj_mqc_t *mqc) { - do { - mqc->a <<= 1; - mqc->c <<= 1; - mqc->ct--; - if (mqc->ct == 0) { - mqc_byteout(mqc); - } - } while ((mqc->a & 0x8000) == 0); -} - -static void mqc_codemps(opj_mqc_t *mqc) { - mqc->a -= (*mqc->curctx)->qeval; - if ((mqc->a & 0x8000) == 0) { - if (mqc->a < (*mqc->curctx)->qeval) { - mqc->a = (*mqc->curctx)->qeval; - } else { - mqc->c += (*mqc->curctx)->qeval; - } - *mqc->curctx = (*mqc->curctx)->nmps; - mqc_renorme(mqc); - } else { - mqc->c += (*mqc->curctx)->qeval; - } -} - -static void mqc_codelps(opj_mqc_t *mqc) { - mqc->a -= (*mqc->curctx)->qeval; - if (mqc->a < (*mqc->curctx)->qeval) { - mqc->c += (*mqc->curctx)->qeval; - } else { - mqc->a = (*mqc->curctx)->qeval; - } - *mqc->curctx = (*mqc->curctx)->nlps; - mqc_renorme(mqc); -} - -static void mqc_setbits(opj_mqc_t *mqc) { - unsigned int tempc = mqc->c + mqc->a; - mqc->c |= 0xffff; - if (mqc->c >= tempc) { - mqc->c -= 0x8000; - } -} - -static int mqc_mpsexchange(opj_mqc_t *mqc) { - int d; - if (mqc->a < (*mqc->curctx)->qeval) { - d = 1 - (*mqc->curctx)->mps; - *mqc->curctx = (*mqc->curctx)->nlps; - } else { - d = (*mqc->curctx)->mps; - *mqc->curctx = (*mqc->curctx)->nmps; - } - - return d; -} - -static int mqc_lpsexchange(opj_mqc_t *mqc) { - int d; - if (mqc->a < (*mqc->curctx)->qeval) { - mqc->a = (*mqc->curctx)->qeval; - d = (*mqc->curctx)->mps; - *mqc->curctx = (*mqc->curctx)->nmps; - } else { - mqc->a = (*mqc->curctx)->qeval; - d = 1 - (*mqc->curctx)->mps; - *mqc->curctx = (*mqc->curctx)->nlps; - } - - return d; -} - -static void mqc_bytein(opj_mqc_t *mqc) { - if (mqc->bp != mqc->end) { - unsigned int c; - if (mqc->bp + 1 != mqc->end) { - c = *(mqc->bp + 1); - } else { - c = 0xff; - } - if (*mqc->bp == 0xff) { - if (c > 0x8f) { - mqc->c += 0xff00; - mqc->ct = 8; - } else { - mqc->bp++; - mqc->c += c << 9; - mqc->ct = 7; - } - } else { - mqc->bp++; - mqc->c += c << 8; - mqc->ct = 8; - } - } else { - mqc->c += 0xff00; - mqc->ct = 8; - } -} - -static void mqc_renormd(opj_mqc_t *mqc) { - do { - if (mqc->ct == 0) { - mqc_bytein(mqc); - } - mqc->a <<= 1; - mqc->c <<= 1; - mqc->ct--; - } while (mqc->a < 0x8000); -} - -/* -========================================================== - MQ-Coder interface -========================================================== -*/ - -opj_mqc_t* mqc_create(void) { - opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t)); - return mqc; -} - -void mqc_destroy(opj_mqc_t *mqc) { - if(mqc) { - opj_free(mqc); - } -} - -int mqc_numbytes(opj_mqc_t *mqc) { - return mqc->bp - mqc->start; -} - -void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp) { - mqc_setcurctx(mqc, 0); - mqc->a = 0x8000; - mqc->c = 0; - mqc->bp = bp - 1; - mqc->ct = 12; - if (*mqc->bp == 0xff) { - mqc->ct = 13; - } - mqc->start = bp; -} - -void mqc_encode(opj_mqc_t *mqc, int d) { - if ((*mqc->curctx)->mps == d) { - mqc_codemps(mqc); - } else { - mqc_codelps(mqc); - } -} - -void mqc_flush(opj_mqc_t *mqc) { - mqc_setbits(mqc); - mqc->c <<= mqc->ct; - mqc_byteout(mqc); - mqc->c <<= mqc->ct; - mqc_byteout(mqc); - - if (*mqc->bp != 0xff) { - mqc->bp++; - } -} - -void mqc_bypass_init_enc(opj_mqc_t *mqc) { - mqc->c = 0; - mqc->ct = 8; - /*if (*mqc->bp == 0xff) { - mqc->ct = 7; - } */ -} - -void mqc_bypass_enc(opj_mqc_t *mqc, int d) { - mqc->ct--; - mqc->c = mqc->c + (d << mqc->ct); - if (mqc->ct == 0) { - mqc->bp++; - *mqc->bp = mqc->c; - mqc->ct = 8; - if (*mqc->bp == 0xff) { - mqc->ct = 7; - } - mqc->c = 0; - } -} - -int mqc_bypass_flush_enc(opj_mqc_t *mqc) { - unsigned char bit_padding; - - bit_padding = 0; - - if (mqc->ct != 0) { - while (mqc->ct > 0) { - mqc->ct--; - mqc->c += bit_padding << mqc->ct; - bit_padding = (bit_padding + 1) & 0x01; - } - mqc->bp++; - *mqc->bp = mqc->c; - mqc->ct = 8; - mqc->c = 0; - } - - return 1; -} - -void mqc_reset_enc(opj_mqc_t *mqc) { - mqc_resetstates(mqc); - mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); - mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); - mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); -} - -int mqc_restart_enc(opj_mqc_t *mqc) { - int correction = 1; - - /* */ - int n = 27 - 15 - mqc->ct; - mqc->c <<= mqc->ct; - while (n > 0) { - mqc_byteout(mqc); - n -= mqc->ct; - mqc->c <<= mqc->ct; - } - mqc_byteout(mqc); - - return correction; -} - -void mqc_restart_init_enc(opj_mqc_t *mqc) { - /* */ - mqc_setcurctx(mqc, 0); - mqc->a = 0x8000; - mqc->c = 0; - mqc->ct = 12; - mqc->bp--; - if (*mqc->bp == 0xff) { - mqc->ct = 13; - } -} - -void mqc_erterm_enc(opj_mqc_t *mqc) { - int k = 11 - mqc->ct + 1; - - while (k > 0) { - mqc->c <<= mqc->ct; - mqc->ct = 0; - mqc_byteout(mqc); - k -= mqc->ct; - } - - if (*mqc->bp != 0xff) { - mqc_byteout(mqc); - } -} - -void mqc_segmark_enc(opj_mqc_t *mqc) { - int i; - mqc_setcurctx(mqc, 18); - - for (i = 1; i < 5; i++) { - mqc_encode(mqc, i % 2); - } -} - -void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len) { - mqc_setcurctx(mqc, 0); - mqc->start = bp; - mqc->end = bp + len; - mqc->bp = bp; - if (len==0) mqc->c = 0xff << 16; - else mqc->c = *mqc->bp << 16; - mqc_bytein(mqc); - mqc->c <<= 7; - mqc->ct -= 7; - mqc->a = 0x8000; -} - -int mqc_decode(opj_mqc_t *mqc) { - int d; - mqc->a -= (*mqc->curctx)->qeval; - if ((mqc->c >> 16) < (*mqc->curctx)->qeval) { - d = mqc_lpsexchange(mqc); - mqc_renormd(mqc); - } else { - mqc->c -= (*mqc->curctx)->qeval << 16; - if ((mqc->a & 0x8000) == 0) { - d = mqc_mpsexchange(mqc); - mqc_renormd(mqc); - } else { - d = (*mqc->curctx)->mps; - } - } - - return d; -} - -void mqc_resetstates(opj_mqc_t *mqc) { - int i; - for (i = 0; i < MQC_NUMCTXS; i++) { - mqc->ctxs[i] = mqc_states; - } -} - -void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob) { - mqc->ctxs[ctxno] = &mqc_states[msb + (prob << 1)]; -} - - +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#include "opj_includes.h" + +/** @defgroup MQC MQC - Implementation of an MQ-Coder */ +/*@{*/ + +/** @name Local static functions */ +/*@{*/ + +/** +Output a byte, doing bit-stuffing if necessary. +After a 0xff byte, the next byte must be smaller than 0x90. +@param mqc MQC handle +*/ +static void mqc_byteout(opj_mqc_t *mqc); +/** +Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000 +@param mqc MQC handle +*/ +static void mqc_renorme(opj_mqc_t *mqc); +/** +Encode the most probable symbol +@param mqc MQC handle +*/ +static void mqc_codemps(opj_mqc_t *mqc); +/** +Encode the most least symbol +@param mqc MQC handle +*/ +static void mqc_codelps(opj_mqc_t *mqc); +/** +Fill mqc->c with 1's for flushing +@param mqc MQC handle +*/ +static void mqc_setbits(opj_mqc_t *mqc); +/** +FIXME: documentation ??? +@param mqc MQC handle +@return +*/ +static INLINE int mqc_mpsexchange(opj_mqc_t *const mqc); +/** +FIXME: documentation ??? +@param mqc MQC handle +@return +*/ +static INLINE int mqc_lpsexchange(opj_mqc_t *const mqc); +/** +Input a byte +@param mqc MQC handle +*/ +static INLINE void mqc_bytein(opj_mqc_t *const mqc); +/** +Renormalize mqc->a and mqc->c while decoding +@param mqc MQC handle +*/ +static INLINE void mqc_renormd(opj_mqc_t *const mqc); +/*@}*/ + +/*@}*/ + +/* */ +/* This array defines all the possible states for a context. */ +/* */ +static opj_mqc_state_t mqc_states[47 * 2] = { + {0x5601, 0, &mqc_states[2], &mqc_states[3]}, + {0x5601, 1, &mqc_states[3], &mqc_states[2]}, + {0x3401, 0, &mqc_states[4], &mqc_states[12]}, + {0x3401, 1, &mqc_states[5], &mqc_states[13]}, + {0x1801, 0, &mqc_states[6], &mqc_states[18]}, + {0x1801, 1, &mqc_states[7], &mqc_states[19]}, + {0x0ac1, 0, &mqc_states[8], &mqc_states[24]}, + {0x0ac1, 1, &mqc_states[9], &mqc_states[25]}, + {0x0521, 0, &mqc_states[10], &mqc_states[58]}, + {0x0521, 1, &mqc_states[11], &mqc_states[59]}, + {0x0221, 0, &mqc_states[76], &mqc_states[66]}, + {0x0221, 1, &mqc_states[77], &mqc_states[67]}, + {0x5601, 0, &mqc_states[14], &mqc_states[13]}, + {0x5601, 1, &mqc_states[15], &mqc_states[12]}, + {0x5401, 0, &mqc_states[16], &mqc_states[28]}, + {0x5401, 1, &mqc_states[17], &mqc_states[29]}, + {0x4801, 0, &mqc_states[18], &mqc_states[28]}, + {0x4801, 1, &mqc_states[19], &mqc_states[29]}, + {0x3801, 0, &mqc_states[20], &mqc_states[28]}, + {0x3801, 1, &mqc_states[21], &mqc_states[29]}, + {0x3001, 0, &mqc_states[22], &mqc_states[34]}, + {0x3001, 1, &mqc_states[23], &mqc_states[35]}, + {0x2401, 0, &mqc_states[24], &mqc_states[36]}, + {0x2401, 1, &mqc_states[25], &mqc_states[37]}, + {0x1c01, 0, &mqc_states[26], &mqc_states[40]}, + {0x1c01, 1, &mqc_states[27], &mqc_states[41]}, + {0x1601, 0, &mqc_states[58], &mqc_states[42]}, + {0x1601, 1, &mqc_states[59], &mqc_states[43]}, + {0x5601, 0, &mqc_states[30], &mqc_states[29]}, + {0x5601, 1, &mqc_states[31], &mqc_states[28]}, + {0x5401, 0, &mqc_states[32], &mqc_states[28]}, + {0x5401, 1, &mqc_states[33], &mqc_states[29]}, + {0x5101, 0, &mqc_states[34], &mqc_states[30]}, + {0x5101, 1, &mqc_states[35], &mqc_states[31]}, + {0x4801, 0, &mqc_states[36], &mqc_states[32]}, + {0x4801, 1, &mqc_states[37], &mqc_states[33]}, + {0x3801, 0, &mqc_states[38], &mqc_states[34]}, + {0x3801, 1, &mqc_states[39], &mqc_states[35]}, + {0x3401, 0, &mqc_states[40], &mqc_states[36]}, + {0x3401, 1, &mqc_states[41], &mqc_states[37]}, + {0x3001, 0, &mqc_states[42], &mqc_states[38]}, + {0x3001, 1, &mqc_states[43], &mqc_states[39]}, + {0x2801, 0, &mqc_states[44], &mqc_states[38]}, + {0x2801, 1, &mqc_states[45], &mqc_states[39]}, + {0x2401, 0, &mqc_states[46], &mqc_states[40]}, + {0x2401, 1, &mqc_states[47], &mqc_states[41]}, + {0x2201, 0, &mqc_states[48], &mqc_states[42]}, + {0x2201, 1, &mqc_states[49], &mqc_states[43]}, + {0x1c01, 0, &mqc_states[50], &mqc_states[44]}, + {0x1c01, 1, &mqc_states[51], &mqc_states[45]}, + {0x1801, 0, &mqc_states[52], &mqc_states[46]}, + {0x1801, 1, &mqc_states[53], &mqc_states[47]}, + {0x1601, 0, &mqc_states[54], &mqc_states[48]}, + {0x1601, 1, &mqc_states[55], &mqc_states[49]}, + {0x1401, 0, &mqc_states[56], &mqc_states[50]}, + {0x1401, 1, &mqc_states[57], &mqc_states[51]}, + {0x1201, 0, &mqc_states[58], &mqc_states[52]}, + {0x1201, 1, &mqc_states[59], &mqc_states[53]}, + {0x1101, 0, &mqc_states[60], &mqc_states[54]}, + {0x1101, 1, &mqc_states[61], &mqc_states[55]}, + {0x0ac1, 0, &mqc_states[62], &mqc_states[56]}, + {0x0ac1, 1, &mqc_states[63], &mqc_states[57]}, + {0x09c1, 0, &mqc_states[64], &mqc_states[58]}, + {0x09c1, 1, &mqc_states[65], &mqc_states[59]}, + {0x08a1, 0, &mqc_states[66], &mqc_states[60]}, + {0x08a1, 1, &mqc_states[67], &mqc_states[61]}, + {0x0521, 0, &mqc_states[68], &mqc_states[62]}, + {0x0521, 1, &mqc_states[69], &mqc_states[63]}, + {0x0441, 0, &mqc_states[70], &mqc_states[64]}, + {0x0441, 1, &mqc_states[71], &mqc_states[65]}, + {0x02a1, 0, &mqc_states[72], &mqc_states[66]}, + {0x02a1, 1, &mqc_states[73], &mqc_states[67]}, + {0x0221, 0, &mqc_states[74], &mqc_states[68]}, + {0x0221, 1, &mqc_states[75], &mqc_states[69]}, + {0x0141, 0, &mqc_states[76], &mqc_states[70]}, + {0x0141, 1, &mqc_states[77], &mqc_states[71]}, + {0x0111, 0, &mqc_states[78], &mqc_states[72]}, + {0x0111, 1, &mqc_states[79], &mqc_states[73]}, + {0x0085, 0, &mqc_states[80], &mqc_states[74]}, + {0x0085, 1, &mqc_states[81], &mqc_states[75]}, + {0x0049, 0, &mqc_states[82], &mqc_states[76]}, + {0x0049, 1, &mqc_states[83], &mqc_states[77]}, + {0x0025, 0, &mqc_states[84], &mqc_states[78]}, + {0x0025, 1, &mqc_states[85], &mqc_states[79]}, + {0x0015, 0, &mqc_states[86], &mqc_states[80]}, + {0x0015, 1, &mqc_states[87], &mqc_states[81]}, + {0x0009, 0, &mqc_states[88], &mqc_states[82]}, + {0x0009, 1, &mqc_states[89], &mqc_states[83]}, + {0x0005, 0, &mqc_states[90], &mqc_states[84]}, + {0x0005, 1, &mqc_states[91], &mqc_states[85]}, + {0x0001, 0, &mqc_states[90], &mqc_states[86]}, + {0x0001, 1, &mqc_states[91], &mqc_states[87]}, + {0x5601, 0, &mqc_states[92], &mqc_states[92]}, + {0x5601, 1, &mqc_states[93], &mqc_states[93]}, +}; + +/* +========================================================== + local functions +========================================================== +*/ + +static void mqc_byteout(opj_mqc_t *mqc) { + if (*mqc->bp == 0xff) { + mqc->bp++; + *mqc->bp = mqc->c >> 20; + mqc->c &= 0xfffff; + mqc->ct = 7; + } else { + if ((mqc->c & 0x8000000) == 0) { /* ((mqc->c&0x8000000)==0) CHANGE */ + mqc->bp++; + *mqc->bp = mqc->c >> 19; + mqc->c &= 0x7ffff; + mqc->ct = 8; + } else { + (*mqc->bp)++; + if (*mqc->bp == 0xff) { + mqc->c &= 0x7ffffff; + mqc->bp++; + *mqc->bp = mqc->c >> 20; + mqc->c &= 0xfffff; + mqc->ct = 7; + } else { + mqc->bp++; + *mqc->bp = mqc->c >> 19; + mqc->c &= 0x7ffff; + mqc->ct = 8; + } + } + } +} + +static void mqc_renorme(opj_mqc_t *mqc) { + do { + mqc->a <<= 1; + mqc->c <<= 1; + mqc->ct--; + if (mqc->ct == 0) { + mqc_byteout(mqc); + } + } while ((mqc->a & 0x8000) == 0); +} + +static void mqc_codemps(opj_mqc_t *mqc) { + mqc->a -= (*mqc->curctx)->qeval; + if ((mqc->a & 0x8000) == 0) { + if (mqc->a < (*mqc->curctx)->qeval) { + mqc->a = (*mqc->curctx)->qeval; + } else { + mqc->c += (*mqc->curctx)->qeval; + } + *mqc->curctx = (*mqc->curctx)->nmps; + mqc_renorme(mqc); + } else { + mqc->c += (*mqc->curctx)->qeval; + } +} + +static void mqc_codelps(opj_mqc_t *mqc) { + mqc->a -= (*mqc->curctx)->qeval; + if (mqc->a < (*mqc->curctx)->qeval) { + mqc->c += (*mqc->curctx)->qeval; + } else { + mqc->a = (*mqc->curctx)->qeval; + } + *mqc->curctx = (*mqc->curctx)->nlps; + mqc_renorme(mqc); +} + +static void mqc_setbits(opj_mqc_t *mqc) { + unsigned int tempc = mqc->c + mqc->a; + mqc->c |= 0xffff; + if (mqc->c >= tempc) { + mqc->c -= 0x8000; + } +} + +static INLINE int mqc_mpsexchange(opj_mqc_t *const mqc) { + int d; + if (mqc->a < (*mqc->curctx)->qeval) { + d = 1 - (*mqc->curctx)->mps; + *mqc->curctx = (*mqc->curctx)->nlps; + } else { + d = (*mqc->curctx)->mps; + *mqc->curctx = (*mqc->curctx)->nmps; + } + + return d; +} + +static INLINE int mqc_lpsexchange(opj_mqc_t *const mqc) { + int d; + if (mqc->a < (*mqc->curctx)->qeval) { + mqc->a = (*mqc->curctx)->qeval; + d = (*mqc->curctx)->mps; + *mqc->curctx = (*mqc->curctx)->nmps; + } else { + mqc->a = (*mqc->curctx)->qeval; + d = 1 - (*mqc->curctx)->mps; + *mqc->curctx = (*mqc->curctx)->nlps; + } + + return d; +} + +#ifdef MQC_PERF_OPT +static INLINE void mqc_bytein(opj_mqc_t *const mqc) { + unsigned int i = *((unsigned int *) mqc->bp); + mqc->c += i & 0xffff00; + mqc->ct = i & 0x0f; + mqc->bp += (i >> 2) & 0x04; +} +#else +static void mqc_bytein(opj_mqc_t *const mqc) { + if (mqc->bp != mqc->end) { + unsigned int c; + if (mqc->bp + 1 != mqc->end) { + c = *(mqc->bp + 1); + } else { + c = 0xff; + } + if (*mqc->bp == 0xff) { + if (c > 0x8f) { + mqc->c += 0xff00; + mqc->ct = 8; + } else { + mqc->bp++; + mqc->c += c << 9; + mqc->ct = 7; + } + } else { + mqc->bp++; + mqc->c += c << 8; + mqc->ct = 8; + } + } else { + mqc->c += 0xff00; + mqc->ct = 8; + } +} +#endif + +static INLINE void mqc_renormd(opj_mqc_t *const mqc) { + do { + if (mqc->ct == 0) { + mqc_bytein(mqc); + } + mqc->a <<= 1; + mqc->c <<= 1; + mqc->ct--; + } while (mqc->a < 0x8000); +} + +/* +========================================================== + MQ-Coder interface +========================================================== +*/ + +opj_mqc_t* mqc_create(void) { + opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t)); +#ifdef MQC_PERF_OPT + mqc->buffer = NULL; +#endif + return mqc; +} + +void mqc_destroy(opj_mqc_t *mqc) { + if(mqc) { +#ifdef MQC_PERF_OPT + if (mqc->buffer) { + opj_free(mqc->buffer); + } +#endif + opj_free(mqc); + } +} + +int mqc_numbytes(opj_mqc_t *mqc) { + return mqc->bp - mqc->start; +} + +void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp) { + mqc_setcurctx(mqc, 0); + mqc->a = 0x8000; + mqc->c = 0; + mqc->bp = bp - 1; + mqc->ct = 12; + if (*mqc->bp == 0xff) { + mqc->ct = 13; + } + mqc->start = bp; +} + +void mqc_encode(opj_mqc_t *mqc, int d) { + if ((*mqc->curctx)->mps == d) { + mqc_codemps(mqc); + } else { + mqc_codelps(mqc); + } +} + +void mqc_flush(opj_mqc_t *mqc) { + mqc_setbits(mqc); + mqc->c <<= mqc->ct; + mqc_byteout(mqc); + mqc->c <<= mqc->ct; + mqc_byteout(mqc); + + if (*mqc->bp != 0xff) { + mqc->bp++; + } +} + +void mqc_bypass_init_enc(opj_mqc_t *mqc) { + mqc->c = 0; + mqc->ct = 8; + /*if (*mqc->bp == 0xff) { + mqc->ct = 7; + } */ +} + +void mqc_bypass_enc(opj_mqc_t *mqc, int d) { + mqc->ct--; + mqc->c = mqc->c + (d << mqc->ct); + if (mqc->ct == 0) { + mqc->bp++; + *mqc->bp = mqc->c; + mqc->ct = 8; + if (*mqc->bp == 0xff) { + mqc->ct = 7; + } + mqc->c = 0; + } +} + +int mqc_bypass_flush_enc(opj_mqc_t *mqc) { + unsigned char bit_padding; + + bit_padding = 0; + + if (mqc->ct != 0) { + while (mqc->ct > 0) { + mqc->ct--; + mqc->c += bit_padding << mqc->ct; + bit_padding = (bit_padding + 1) & 0x01; + } + mqc->bp++; + *mqc->bp = mqc->c; + mqc->ct = 8; + mqc->c = 0; + } + + return 1; +} + +void mqc_reset_enc(opj_mqc_t *mqc) { + mqc_resetstates(mqc); + mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); + mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); + mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); +} + +int mqc_restart_enc(opj_mqc_t *mqc) { + int correction = 1; + + /* */ + int n = 27 - 15 - mqc->ct; + mqc->c <<= mqc->ct; + while (n > 0) { + mqc_byteout(mqc); + n -= mqc->ct; + mqc->c <<= mqc->ct; + } + mqc_byteout(mqc); + + return correction; +} + +void mqc_restart_init_enc(opj_mqc_t *mqc) { + /* */ + mqc_setcurctx(mqc, 0); + mqc->a = 0x8000; + mqc->c = 0; + mqc->ct = 12; + mqc->bp--; + if (*mqc->bp == 0xff) { + mqc->ct = 13; + } +} + +void mqc_erterm_enc(opj_mqc_t *mqc) { + int k = 11 - mqc->ct + 1; + + while (k > 0) { + mqc->c <<= mqc->ct; + mqc->ct = 0; + mqc_byteout(mqc); + k -= mqc->ct; + } + + if (*mqc->bp != 0xff) { + mqc_byteout(mqc); + } +} + +void mqc_segmark_enc(opj_mqc_t *mqc) { + int i; + mqc_setcurctx(mqc, 18); + + for (i = 1; i < 5; i++) { + mqc_encode(mqc, i % 2); + } +} + +void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len) { + mqc_setcurctx(mqc, 0); + mqc->start = bp; + mqc->end = bp + len; + mqc->bp = bp; + if (len==0) mqc->c = 0xff << 16; + else mqc->c = *mqc->bp << 16; + +#ifdef MQC_PERF_OPT + { + unsigned int c; + unsigned int *ip; + unsigned char *end = mqc->end - 1; + mqc->buffer = opj_realloc(mqc->buffer, (len + 1) * sizeof(unsigned int)); + ip = (unsigned int *) mqc->buffer; + + while (bp < end) { + c = *(bp + 1); + if (*bp == 0xff) { + if (c > 0x8f) { + break; + } else { + *ip = 0x00000017 | (c << 9); + } + } else { + *ip = 0x00000018 | (c << 8); + } + bp++; + ip++; + } + + /* Handle last byte of data */ + c = 0xff; + if (*bp == 0xff) { + *ip = 0x0000ff18; + } else { + bp++; + *ip = 0x00000018 | (c << 8); + } + ip++; + + *ip = 0x0000ff08; + mqc->bp = mqc->buffer; + } +#endif + mqc_bytein(mqc); + mqc->c <<= 7; + mqc->ct -= 7; + mqc->a = 0x8000; +} + +int mqc_decode(opj_mqc_t *const mqc) { + int d; + mqc->a -= (*mqc->curctx)->qeval; + if ((mqc->c >> 16) < (*mqc->curctx)->qeval) { + d = mqc_lpsexchange(mqc); + mqc_renormd(mqc); + } else { + mqc->c -= (*mqc->curctx)->qeval << 16; + if ((mqc->a & 0x8000) == 0) { + d = mqc_mpsexchange(mqc); + mqc_renormd(mqc); + } else { + d = (*mqc->curctx)->mps; + } + } + + return d; +} + +void mqc_resetstates(opj_mqc_t *mqc) { + int i; + for (i = 0; i < MQC_NUMCTXS; i++) { + mqc->ctxs[i] = mqc_states; + } +} + +void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob) { + mqc->ctxs[ctxno] = &mqc_states[msb + (prob << 1)]; +} + + diff --git a/openjpeg-dotnet/libopenjpeg/mqc.h b/openjpeg-dotnet/libopenjpeg/mqc.h index 36fedace..d00cd106 100644 --- a/openjpeg-dotnet/libopenjpeg/mqc.h +++ b/openjpeg-dotnet/libopenjpeg/mqc.h @@ -1,197 +1,200 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#ifndef __MQC_H -#define __MQC_H -/** -@file mqc.h -@brief Implementation of an MQ-Coder (MQC) - -The functions in MQC.C have for goal to realize the MQ-coder operations. The functions -in MQC.C are used by some function in T1.C. -*/ - -/** @defgroup MQC MQC - Implementation of an MQ-Coder */ -/*@{*/ - -/** -This struct defines the state of a context. -*/ -typedef struct opj_mqc_state { - /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */ - unsigned int qeval; - /** the Most Probable Symbol (0 or 1) */ - int mps; - /** next state if the next encoded symbol is the MPS */ - struct opj_mqc_state *nmps; - /** next state if the next encoded symbol is the LPS */ - struct opj_mqc_state *nlps; -} opj_mqc_state_t; - -#define MQC_NUMCTXS 19 - -/** -MQ coder -*/ -typedef struct opj_mqc { - unsigned int c; - unsigned int a; - unsigned int ct; - unsigned char *bp; - unsigned char *start; - unsigned char *end; - opj_mqc_state_t *ctxs[MQC_NUMCTXS]; - opj_mqc_state_t **curctx; -} opj_mqc_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a new MQC handle -@return Returns a new MQC handle if successful, returns NULL otherwise -*/ -opj_mqc_t* mqc_create(void); -/** -Destroy a previously created MQC handle -@param mqc MQC handle to destroy -*/ -void mqc_destroy(opj_mqc_t *mqc); -/** -Return the number of bytes written/read since initialisation -@param mqc MQC handle -@return Returns the number of bytes already encoded -*/ -int mqc_numbytes(opj_mqc_t *mqc); -/** -Reset the states of all the context of the coder/decoder -(each context is set to a state where 0 and 1 are more or less equiprobable) -@param mqc MQC handle -*/ -void mqc_resetstates(opj_mqc_t *mqc); -/** -Set the state of a particular context -@param mqc MQC handle -@param ctxno Number that identifies the context -@param msb The MSB of the new state of the context -@param prob Number that identifies the probability of the symbols for the new state of the context -*/ -void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob); -/** -Initialize the encoder -@param mqc MQC handle -@param bp Pointer to the start of the buffer where the bytes will be written -*/ -void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp); -/** -Set the current context used for coding/decoding -@param mqc MQC handle -@param ctxno Number that identifies the context -*/ -#define mqc_setcurctx(mqc, ctxno) (mqc)->curctx = &(mqc)->ctxs[(int)(ctxno)] -/** -Encode a symbol using the MQ-coder -@param mqc MQC handle -@param d The symbol to be encoded (0 or 1) -*/ -void mqc_encode(opj_mqc_t *mqc, int d); -/** -Flush the encoder, so that all remaining data is written -@param mqc MQC handle -*/ -void mqc_flush(opj_mqc_t *mqc); -/** -BYPASS mode switch, initialization operation. -JPEG 2000 p 505. -

Not fully implemented and tested !!

-@param mqc MQC handle -*/ -void mqc_bypass_init_enc(opj_mqc_t *mqc); -/** -BYPASS mode switch, coding operation. -JPEG 2000 p 505. -

Not fully implemented and tested !!

-@param mqc MQC handle -@param d The symbol to be encoded (0 or 1) -*/ -void mqc_bypass_enc(opj_mqc_t *mqc, int d); -/** -BYPASS mode switch, flush operation -

Not fully implemented and tested !!

-@param mqc MQC handle -@return Returns 1 (always) -*/ -int mqc_bypass_flush_enc(opj_mqc_t *mqc); -/** -RESET mode switch -@param mqc MQC handle -*/ -void mqc_reset_enc(opj_mqc_t *mqc); -/** -RESTART mode switch (TERMALL) -@param mqc MQC handle -@return Returns 1 (always) -*/ -int mqc_restart_enc(opj_mqc_t *mqc); -/** -RESTART mode switch (TERMALL) reinitialisation -@param mqc MQC handle -*/ -void mqc_restart_init_enc(opj_mqc_t *mqc); -/** -ERTERM mode switch (PTERM) -@param mqc MQC handle -*/ -void mqc_erterm_enc(opj_mqc_t *mqc); -/** -SEGMARK mode switch (SEGSYM) -@param mqc MQC handle -*/ -void mqc_segmark_enc(opj_mqc_t *mqc); -/** -Initialize the decoder -@param mqc MQC handle -@param bp Pointer to the start of the buffer from which the bytes will be read -@param len Length of the input buffer -*/ -void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len); -/** -Decode a symbol -@param mqc MQC handle -@return Returns the decoded symbol (0 or 1) -*/ -int mqc_decode(opj_mqc_t *mqc); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __MQC_H */ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#ifndef __MQC_H +#define __MQC_H +/** +@file mqc.h +@brief Implementation of an MQ-Coder (MQC) + +The functions in MQC.C have for goal to realize the MQ-coder operations. The functions +in MQC.C are used by some function in T1.C. +*/ + +/** @defgroup MQC MQC - Implementation of an MQ-Coder */ +/*@{*/ + +/** +This struct defines the state of a context. +*/ +typedef struct opj_mqc_state { + /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */ + unsigned int qeval; + /** the Most Probable Symbol (0 or 1) */ + int mps; + /** next state if the next encoded symbol is the MPS */ + struct opj_mqc_state *nmps; + /** next state if the next encoded symbol is the LPS */ + struct opj_mqc_state *nlps; +} opj_mqc_state_t; + +#define MQC_NUMCTXS 19 + +/** +MQ coder +*/ +typedef struct opj_mqc { + unsigned int c; + unsigned int a; + unsigned int ct; + unsigned char *bp; + unsigned char *start; + unsigned char *end; + opj_mqc_state_t *ctxs[MQC_NUMCTXS]; + opj_mqc_state_t **curctx; +#ifdef MQC_PERF_OPT + unsigned char *buffer; +#endif +} opj_mqc_t; + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Create a new MQC handle +@return Returns a new MQC handle if successful, returns NULL otherwise +*/ +opj_mqc_t* mqc_create(void); +/** +Destroy a previously created MQC handle +@param mqc MQC handle to destroy +*/ +void mqc_destroy(opj_mqc_t *mqc); +/** +Return the number of bytes written/read since initialisation +@param mqc MQC handle +@return Returns the number of bytes already encoded +*/ +int mqc_numbytes(opj_mqc_t *mqc); +/** +Reset the states of all the context of the coder/decoder +(each context is set to a state where 0 and 1 are more or less equiprobable) +@param mqc MQC handle +*/ +void mqc_resetstates(opj_mqc_t *mqc); +/** +Set the state of a particular context +@param mqc MQC handle +@param ctxno Number that identifies the context +@param msb The MSB of the new state of the context +@param prob Number that identifies the probability of the symbols for the new state of the context +*/ +void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob); +/** +Initialize the encoder +@param mqc MQC handle +@param bp Pointer to the start of the buffer where the bytes will be written +*/ +void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp); +/** +Set the current context used for coding/decoding +@param mqc MQC handle +@param ctxno Number that identifies the context +*/ +#define mqc_setcurctx(mqc, ctxno) (mqc)->curctx = &(mqc)->ctxs[(int)(ctxno)] +/** +Encode a symbol using the MQ-coder +@param mqc MQC handle +@param d The symbol to be encoded (0 or 1) +*/ +void mqc_encode(opj_mqc_t *mqc, int d); +/** +Flush the encoder, so that all remaining data is written +@param mqc MQC handle +*/ +void mqc_flush(opj_mqc_t *mqc); +/** +BYPASS mode switch, initialization operation. +JPEG 2000 p 505. +

Not fully implemented and tested !!

+@param mqc MQC handle +*/ +void mqc_bypass_init_enc(opj_mqc_t *mqc); +/** +BYPASS mode switch, coding operation. +JPEG 2000 p 505. +

Not fully implemented and tested !!

+@param mqc MQC handle +@param d The symbol to be encoded (0 or 1) +*/ +void mqc_bypass_enc(opj_mqc_t *mqc, int d); +/** +BYPASS mode switch, flush operation +

Not fully implemented and tested !!

+@param mqc MQC handle +@return Returns 1 (always) +*/ +int mqc_bypass_flush_enc(opj_mqc_t *mqc); +/** +RESET mode switch +@param mqc MQC handle +*/ +void mqc_reset_enc(opj_mqc_t *mqc); +/** +RESTART mode switch (TERMALL) +@param mqc MQC handle +@return Returns 1 (always) +*/ +int mqc_restart_enc(opj_mqc_t *mqc); +/** +RESTART mode switch (TERMALL) reinitialisation +@param mqc MQC handle +*/ +void mqc_restart_init_enc(opj_mqc_t *mqc); +/** +ERTERM mode switch (PTERM) +@param mqc MQC handle +*/ +void mqc_erterm_enc(opj_mqc_t *mqc); +/** +SEGMARK mode switch (SEGSYM) +@param mqc MQC handle +*/ +void mqc_segmark_enc(opj_mqc_t *mqc); +/** +Initialize the decoder +@param mqc MQC handle +@param bp Pointer to the start of the buffer from which the bytes will be read +@param len Length of the input buffer +*/ +void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len); +/** +Decode a symbol +@param mqc MQC handle +@return Returns the decoded symbol (0 or 1) +*/ +int mqc_decode(opj_mqc_t *const mqc); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __MQC_H */ diff --git a/openjpeg-dotnet/libopenjpeg/openjpeg.c b/openjpeg-dotnet/libopenjpeg/openjpeg.c index fdc781d5..180cc844 100644 --- a/openjpeg-dotnet/libopenjpeg/openjpeg.c +++ b/openjpeg-dotnet/libopenjpeg/openjpeg.c @@ -1,329 +1,343 @@ -/* - * Copyright (c) 2005, Hervé Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#ifdef WIN32 -#include -#endif /* WIN32 */ - -#include "opj_includes.h" - -/* ---------------------------------------------------------------------- */ -#ifdef WIN32 -#ifndef OPJ_STATIC -BOOL APIENTRY -DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { - switch (ul_reason_for_call) { - case DLL_PROCESS_ATTACH : - break; - case DLL_PROCESS_DETACH : - break; - case DLL_THREAD_ATTACH : - case DLL_THREAD_DETACH : - break; - } - - return TRUE; -} -#endif /* OPJ_STATIC */ -#endif /* WIN32 */ - -/* ---------------------------------------------------------------------- */ - - -const char* OPJ_CALLCONV opj_version(void) { - return OPENJPEG_VERSION; -} - -opj_dinfo_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format) { - opj_dinfo_t *dinfo = (opj_dinfo_t*)opj_calloc(1, sizeof(opj_dinfo_t)); - if(!dinfo) return NULL; - dinfo->is_decompressor = true; - switch(format) { - case CODEC_J2K: - case CODEC_JPT: - /* get a J2K decoder handle */ - dinfo->j2k_handle = (void*)j2k_create_decompress((opj_common_ptr)dinfo); - if(!dinfo->j2k_handle) { - opj_free(dinfo); - return NULL; - } - break; - case CODEC_JP2: - /* get a JP2 decoder handle */ - dinfo->jp2_handle = (void*)jp2_create_decompress((opj_common_ptr)dinfo); - if(!dinfo->jp2_handle) { - opj_free(dinfo); - return NULL; - } - break; - case CODEC_UNKNOWN: - default: - opj_free(dinfo); - return NULL; - } - - dinfo->codec_format = format; - - return dinfo; -} - -void OPJ_CALLCONV opj_destroy_decompress(opj_dinfo_t *dinfo) { - if(dinfo) { - /* destroy the codec */ - switch(dinfo->codec_format) { - case CODEC_J2K: - case CODEC_JPT: - j2k_destroy_decompress((opj_j2k_t*)dinfo->j2k_handle); - break; - case CODEC_JP2: - jp2_destroy_decompress((opj_jp2_t*)dinfo->jp2_handle); - break; - case CODEC_UNKNOWN: - default: - break; - } - /* destroy the decompressor */ - opj_free(dinfo); - } -} - -void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters) { - if(parameters) { - memset(parameters, 0, sizeof(opj_dparameters_t)); - /* default decoding parameters */ - parameters->cp_layer = 0; - parameters->cp_reduce = 0; - parameters->cp_limit_decoding = NO_LIMITATION; - - parameters->decod_format = -1; - parameters->cod_format = -1; -/* UniPG>> */ -#ifdef USE_JPWL - parameters->jpwl_correct = false; - parameters->jpwl_exp_comps = JPWL_EXPECTED_COMPONENTS; - parameters->jpwl_max_tiles = JPWL_MAXIMUM_TILES; -#endif /* USE_JPWL */ -/* <codec_format) { - case CODEC_J2K: - case CODEC_JPT: - j2k_setup_decoder((opj_j2k_t*)dinfo->j2k_handle, parameters); - break; - case CODEC_JP2: - jp2_setup_decoder((opj_jp2_t*)dinfo->jp2_handle, parameters); - break; - case CODEC_UNKNOWN: - default: - break; - } - } -} - -opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio) { - return opj_decode_with_info(dinfo, cio, NULL); -} - -opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, opj_cio_t *cio, opj_codestream_info_t *cstr_info) { - if(dinfo && cio) { - switch(dinfo->codec_format) { - case CODEC_J2K: - return j2k_decode((opj_j2k_t*)dinfo->j2k_handle, cio, cstr_info); - case CODEC_JPT: - return j2k_decode_jpt_stream((opj_j2k_t*)dinfo->j2k_handle, cio, cstr_info); - case CODEC_JP2: - return jp2_decode((opj_jp2_t*)dinfo->jp2_handle, cio, cstr_info); - case CODEC_UNKNOWN: - default: - break; - } - } - return NULL; -} - -opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format) { - opj_cinfo_t *cinfo = (opj_cinfo_t*)opj_calloc(1, sizeof(opj_cinfo_t)); - if(!cinfo) return NULL; - cinfo->is_decompressor = false; - switch(format) { - case CODEC_J2K: - /* get a J2K coder handle */ - cinfo->j2k_handle = (void*)j2k_create_compress((opj_common_ptr)cinfo); - if(!cinfo->j2k_handle) { - opj_free(cinfo); - return NULL; - } - break; - case CODEC_JP2: - /* get a JP2 coder handle */ - cinfo->jp2_handle = (void*)jp2_create_compress((opj_common_ptr)cinfo); - if(!cinfo->jp2_handle) { - opj_free(cinfo); - return NULL; - } - break; - case CODEC_JPT: - case CODEC_UNKNOWN: - default: - opj_free(cinfo); - return NULL; - } - - cinfo->codec_format = format; - - return cinfo; -} - -void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo) { - if(cinfo) { - /* destroy the codec */ - switch(cinfo->codec_format) { - case CODEC_J2K: - j2k_destroy_compress((opj_j2k_t*)cinfo->j2k_handle); - break; - case CODEC_JP2: - jp2_destroy_compress((opj_jp2_t*)cinfo->jp2_handle); - break; - case CODEC_JPT: - case CODEC_UNKNOWN: - default: - break; - } - /* destroy the decompressor */ - opj_free(cinfo); - } -} - -void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters) { - if(parameters) { - memset(parameters, 0, sizeof(opj_cparameters_t)); - /* default coding parameters */ - parameters->cp_cinema = OFF; - parameters->max_comp_size = 0; - parameters->numresolution = 6; - parameters->cp_rsiz = STD_RSIZ; - parameters->cblockw_init = 64; - parameters->cblockh_init = 64; - parameters->prog_order = LRCP; - parameters->roi_compno = -1; /* no ROI */ - parameters->subsampling_dx = 1; - parameters->subsampling_dy = 1; - parameters->tp_on = 0; - parameters->decod_format = -1; - parameters->cod_format = -1; -/* UniPG>> */ -#ifdef USE_JPWL - parameters->jpwl_epc_on = false; - parameters->jpwl_hprot_MH = -1; /* -1 means unassigned */ - { - int i; - for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { - parameters->jpwl_hprot_TPH_tileno[i] = -1; /* unassigned */ - parameters->jpwl_hprot_TPH[i] = 0; /* absent */ - } - }; - { - int i; - for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) { - parameters->jpwl_pprot_tileno[i] = -1; /* unassigned */ - parameters->jpwl_pprot_packno[i] = -1; /* unassigned */ - parameters->jpwl_pprot[i] = 0; /* absent */ - } - }; - parameters->jpwl_sens_size = 0; /* 0 means no ESD */ - parameters->jpwl_sens_addr = 0; /* 0 means auto */ - parameters->jpwl_sens_range = 0; /* 0 means packet */ - parameters->jpwl_sens_MH = -1; /* -1 means unassigned */ - { - int i; - for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { - parameters->jpwl_sens_TPH_tileno[i] = -1; /* unassigned */ - parameters->jpwl_sens_TPH[i] = -1; /* absent */ - } - }; -#endif /* USE_JPWL */ -/* <codec_format) { - case CODEC_J2K: - j2k_setup_encoder((opj_j2k_t*)cinfo->j2k_handle, parameters, image); - break; - case CODEC_JP2: - jp2_setup_encoder((opj_jp2_t*)cinfo->jp2_handle, parameters, image); - break; - case CODEC_JPT: - case CODEC_UNKNOWN: - default: - break; - } - } -} - -bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index) { - if (index != NULL) - opj_event_msg((opj_common_ptr)cinfo, EVT_WARNING, "Set index to NULL when calling the opj_encode function.\n" - "To extract the index, use the opj_encode_with_info() function.\n" - "No index will be generated during this encoding\n"); - return opj_encode_with_info(cinfo, cio, image, NULL); -} - -bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) { - if(cinfo && cio && image) { - switch(cinfo->codec_format) { - case CODEC_J2K: - return j2k_encode((opj_j2k_t*)cinfo->j2k_handle, cio, image, cstr_info); - case CODEC_JP2: - return jp2_encode((opj_jp2_t*)cinfo->jp2_handle, cio, image, cstr_info); - case CODEC_JPT: - case CODEC_UNKNOWN: - default: - break; - } - } - return false; -} - -void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info) { - if (cstr_info) { - int tileno; - for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { - opj_tile_info_t *tile_info = &cstr_info->tile[tileno]; - opj_free(tile_info->thresh); - opj_free(tile_info->packet); - opj_free(tile_info->tp); - } - opj_free(cstr_info->tile); - opj_free(cstr_info->marker); - } -} +/* + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#ifdef _WIN32 +#include +#endif /* _WIN32 */ + +#include "opj_config.h" +#include "opj_includes.h" + +/* ---------------------------------------------------------------------- */ +#ifdef _WIN32 +#ifndef OPJ_STATIC +BOOL APIENTRY +DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { + + OPJ_ARG_NOT_USED(lpReserved); + OPJ_ARG_NOT_USED(hModule); + + switch (ul_reason_for_call) { + case DLL_PROCESS_ATTACH : + break; + case DLL_PROCESS_DETACH : + break; + case DLL_THREAD_ATTACH : + case DLL_THREAD_DETACH : + break; + } + + return TRUE; +} +#endif /* OPJ_STATIC */ +#endif /* _WIN32 */ + +/* ---------------------------------------------------------------------- */ + + +const char* OPJ_CALLCONV opj_version(void) { + return PACKAGE_VERSION; +} + +opj_dinfo_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format) { + opj_dinfo_t *dinfo = (opj_dinfo_t*)opj_calloc(1, sizeof(opj_dinfo_t)); + if(!dinfo) return NULL; + dinfo->is_decompressor = OPJ_TRUE; + switch(format) { + case CODEC_J2K: + case CODEC_JPT: + /* get a J2K decoder handle */ + dinfo->j2k_handle = (void*)j2k_create_decompress((opj_common_ptr)dinfo); + if(!dinfo->j2k_handle) { + opj_free(dinfo); + return NULL; + } + break; + case CODEC_JP2: + /* get a JP2 decoder handle */ + dinfo->jp2_handle = (void*)jp2_create_decompress((opj_common_ptr)dinfo); + if(!dinfo->jp2_handle) { + opj_free(dinfo); + return NULL; + } + break; + case CODEC_UNKNOWN: + default: + opj_free(dinfo); + return NULL; + } + + dinfo->codec_format = format; + + return dinfo; +} + +void OPJ_CALLCONV opj_destroy_decompress(opj_dinfo_t *dinfo) { + if(dinfo) { + /* destroy the codec */ + switch(dinfo->codec_format) { + case CODEC_J2K: + case CODEC_JPT: + j2k_destroy_decompress((opj_j2k_t*)dinfo->j2k_handle); + break; + case CODEC_JP2: + jp2_destroy_decompress((opj_jp2_t*)dinfo->jp2_handle); + break; + case CODEC_UNKNOWN: + default: + break; + } + /* destroy the decompressor */ + opj_free(dinfo); + } +} + +void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters) { + if(parameters) { + memset(parameters, 0, sizeof(opj_dparameters_t)); + /* default decoding parameters */ + parameters->cp_layer = 0; + parameters->cp_reduce = 0; + parameters->cp_limit_decoding = NO_LIMITATION; + + parameters->decod_format = -1; + parameters->cod_format = -1; + parameters->flags = 0; +/* UniPG>> */ +#ifdef USE_JPWL + parameters->jpwl_correct = OPJ_FALSE; + parameters->jpwl_exp_comps = JPWL_EXPECTED_COMPONENTS; + parameters->jpwl_max_tiles = JPWL_MAXIMUM_TILES; +#endif /* USE_JPWL */ +/* <codec_format) { + case CODEC_J2K: + case CODEC_JPT: + j2k_setup_decoder((opj_j2k_t*)dinfo->j2k_handle, parameters); + break; + case CODEC_JP2: + jp2_setup_decoder((opj_jp2_t*)dinfo->jp2_handle, parameters); + break; + case CODEC_UNKNOWN: + default: + break; + } + } +} + +opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio) { + return opj_decode_with_info(dinfo, cio, NULL); +} + +opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, opj_cio_t *cio, opj_codestream_info_t *cstr_info) { + if(dinfo && cio) { + switch(dinfo->codec_format) { + case CODEC_J2K: + return j2k_decode((opj_j2k_t*)dinfo->j2k_handle, cio, cstr_info); + case CODEC_JPT: + return j2k_decode_jpt_stream((opj_j2k_t*)dinfo->j2k_handle, cio, cstr_info); + case CODEC_JP2: + return opj_jp2_decode((opj_jp2_t*)dinfo->jp2_handle, cio, cstr_info); + case CODEC_UNKNOWN: + default: + break; + } + } + return NULL; +} + +opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format) { + opj_cinfo_t *cinfo = (opj_cinfo_t*)opj_calloc(1, sizeof(opj_cinfo_t)); + if(!cinfo) return NULL; + cinfo->is_decompressor = OPJ_FALSE; + switch(format) { + case CODEC_J2K: + /* get a J2K coder handle */ + cinfo->j2k_handle = (void*)j2k_create_compress((opj_common_ptr)cinfo); + if(!cinfo->j2k_handle) { + opj_free(cinfo); + return NULL; + } + break; + case CODEC_JP2: + /* get a JP2 coder handle */ + cinfo->jp2_handle = (void*)jp2_create_compress((opj_common_ptr)cinfo); + if(!cinfo->jp2_handle) { + opj_free(cinfo); + return NULL; + } + break; + case CODEC_JPT: + case CODEC_UNKNOWN: + default: + opj_free(cinfo); + return NULL; + } + + cinfo->codec_format = format; + + return cinfo; +} + +void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo) { + if(cinfo) { + /* destroy the codec */ + switch(cinfo->codec_format) { + case CODEC_J2K: + j2k_destroy_compress((opj_j2k_t*)cinfo->j2k_handle); + break; + case CODEC_JP2: + jp2_destroy_compress((opj_jp2_t*)cinfo->jp2_handle); + break; + case CODEC_JPT: + case CODEC_UNKNOWN: + default: + break; + } + /* destroy the decompressor */ + opj_free(cinfo); + } +} + +void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters) { + if(parameters) { + memset(parameters, 0, sizeof(opj_cparameters_t)); + /* default coding parameters */ + parameters->cp_cinema = OFF; + parameters->max_comp_size = 0; + parameters->numresolution = 6; + parameters->cp_rsiz = STD_RSIZ; + parameters->cblockw_init = 64; + parameters->cblockh_init = 64; + parameters->prog_order = LRCP; + parameters->roi_compno = -1; /* no ROI */ + parameters->subsampling_dx = 1; + parameters->subsampling_dy = 1; + parameters->tp_on = 0; + parameters->decod_format = -1; + parameters->cod_format = -1; + parameters->tcp_rates[0] = 0; + parameters->tcp_numlayers = 0; + parameters->cp_disto_alloc = 0; + parameters->cp_fixed_alloc = 0; + parameters->cp_fixed_quality = 0; + parameters->jpip_on = OPJ_FALSE; +/* UniPG>> */ +#ifdef USE_JPWL + parameters->jpwl_epc_on = OPJ_FALSE; + parameters->jpwl_hprot_MH = -1; /* -1 means unassigned */ + { + int i; + for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { + parameters->jpwl_hprot_TPH_tileno[i] = -1; /* unassigned */ + parameters->jpwl_hprot_TPH[i] = 0; /* absent */ + } + }; + { + int i; + for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) { + parameters->jpwl_pprot_tileno[i] = -1; /* unassigned */ + parameters->jpwl_pprot_packno[i] = -1; /* unassigned */ + parameters->jpwl_pprot[i] = 0; /* absent */ + } + }; + parameters->jpwl_sens_size = 0; /* 0 means no ESD */ + parameters->jpwl_sens_addr = 0; /* 0 means auto */ + parameters->jpwl_sens_range = 0; /* 0 means packet */ + parameters->jpwl_sens_MH = -1; /* -1 means unassigned */ + { + int i; + for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { + parameters->jpwl_sens_TPH_tileno[i] = -1; /* unassigned */ + parameters->jpwl_sens_TPH[i] = -1; /* absent */ + } + }; +#endif /* USE_JPWL */ +/* <codec_format) { + case CODEC_J2K: + j2k_setup_encoder((opj_j2k_t*)cinfo->j2k_handle, parameters, image); + break; + case CODEC_JP2: + jp2_setup_encoder((opj_jp2_t*)cinfo->jp2_handle, parameters, image); + break; + case CODEC_JPT: + case CODEC_UNKNOWN: + default: + break; + } + } +} + +opj_bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index) { + if (index != NULL) + opj_event_msg((opj_common_ptr)cinfo, EVT_WARNING, "Set index to NULL when calling the opj_encode function.\n" + "To extract the index, use the opj_encode_with_info() function.\n" + "No index will be generated during this encoding\n"); + return opj_encode_with_info(cinfo, cio, image, NULL); +} + +opj_bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) { + if(cinfo && cio && image) { + switch(cinfo->codec_format) { + case CODEC_J2K: + return j2k_encode((opj_j2k_t*)cinfo->j2k_handle, cio, image, cstr_info); + case CODEC_JP2: + return opj_jp2_encode((opj_jp2_t*)cinfo->jp2_handle, cio, image, cstr_info); + case CODEC_JPT: + case CODEC_UNKNOWN: + default: + break; + } + } + return OPJ_FALSE; +} + +void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info) { + if (cstr_info) { + int tileno; + for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { + opj_tile_info_t *tile_info = &cstr_info->tile[tileno]; + opj_free(tile_info->thresh); + opj_free(tile_info->packet); + opj_free(tile_info->tp); + opj_free(tile_info->marker); + } + opj_free(cstr_info->tile); + opj_free(cstr_info->marker); + opj_free(cstr_info->numdecompos); + } +} diff --git a/openjpeg-dotnet/libopenjpeg/openjpeg.h b/openjpeg-dotnet/libopenjpeg/openjpeg.h index 940a9033..53e9fac0 100644 --- a/openjpeg-dotnet/libopenjpeg/openjpeg.h +++ b/openjpeg-dotnet/libopenjpeg/openjpeg.h @@ -1,911 +1,910 @@ - /* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2006-2007, Parvatha Elangovan - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ -#ifndef OPENJPEG_H -#define OPENJPEG_H - -#define OPENJPEG_VERSION "1.3.0" - -/* -========================================================== - Compiler directives -========================================================== -*/ - -#if defined(OPJ_STATIC) || !(defined(WIN32) || defined(__WIN32__)) -#define OPJ_API -#define OPJ_CALLCONV -#else -#define OPJ_CALLCONV __stdcall -/* -The following ifdef block is the standard way of creating macros which make exporting -from a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS -symbol defined on the command line. this symbol should not be defined on any project -that uses this DLL. This way any other project whose source files include this file see -OPJ_API functions as being imported from a DLL, wheras this DLL sees symbols -defined with this macro as being exported. -*/ -#ifdef OPJ_EXPORTS -#define OPJ_API __declspec(dllexport) -#else -#define OPJ_API __declspec(dllimport) -#endif /* OPJ_EXPORTS */ -#endif /* !OPJ_STATIC || !WIN32 */ - -#ifndef __cplusplus -#if defined(HAVE_STDBOOL_H) -/* -The C language implementation does correctly provide the standard header -file "stdbool.h". - */ -#include -#else -/* -The C language implementation does not provide the standard header file -"stdbool.h" as required by ISO/IEC 9899:1999. Try to compensate for this -braindamage below. -*/ -#if !defined(bool) -#define bool int -#endif -#if !defined(true) -#define true 1 -#endif -#if !defined(false) -#define false 0 -#endif -#endif -#endif /* __cplusplus */ - -/* -========================================================== - Useful constant definitions -========================================================== -*/ - -#define OPJ_PATH_LEN 4096 /**< Maximum allowed size for filenames */ - -#define J2K_MAXRLVLS 33 /**< Number of maximum resolution level authorized */ -#define J2K_MAXBANDS (3*J2K_MAXRLVLS-2) /**< Number of maximum sub-band linked to number of resolution level */ - -/* UniPG>> */ -#define JPWL_MAX_NO_TILESPECS 16 /**< Maximum number of tile parts expected by JPWL: increase at your will */ -#define JPWL_MAX_NO_PACKSPECS 16 /**< Maximum number of packet parts expected by JPWL: increase at your will */ -#define JPWL_MAX_NO_MARKERS 512 /**< Maximum number of JPWL markers: increase at your will */ -#define JPWL_PRIVATEINDEX_NAME "jpwl_index_privatefilename" /**< index file name used when JPWL is on */ -#define JPWL_EXPECTED_COMPONENTS 3 /**< Expect this number of components, so you'll find better the first EPB */ -#define JPWL_MAXIMUM_TILES 8192 /**< Expect this maximum number of tiles, to avoid some crashes */ -#define JPWL_MAXIMUM_HAMMING 2 /**< Expect this maximum number of bit errors in marker id's */ -#define JPWL_MAXIMUM_EPB_ROOM 65450 /**< Expect this maximum number of bytes for composition of EPBs */ -/* < -
  • Error messages -
  • Warning messages -
  • Debugging messages - -*/ -typedef struct opj_event_mgr { - /** Error message callback if available, NULL otherwise */ - opj_msg_callback error_handler; - /** Warning message callback if available, NULL otherwise */ - opj_msg_callback warning_handler; - /** Debug message callback if available, NULL otherwise */ - opj_msg_callback info_handler; -} opj_event_mgr_t; - - -/* -========================================================== - codec typedef definitions -========================================================== -*/ - -/** -Progression order changes -*/ -typedef struct opj_poc { - /** Resolution num start, Component num start, given by POC */ - int resno0, compno0; - /** Layer num end,Resolution num end, Component num end, given by POC */ - int layno1, resno1, compno1; - /** Layer num start,Precinct num start, Precinct num end */ - int layno0, precno0, precno1; - /** Progression order enum*/ - OPJ_PROG_ORDER prg1,prg; - /** Progression order string*/ - char progorder[5]; - /** Tile number */ - int tile; - /** Start and end values for Tile width and height*/ - int tx0,tx1,ty0,ty1; - /** Start value, initialised in pi_initialise_encode*/ - int layS, resS, compS, prcS; - /** End value, initialised in pi_initialise_encode */ - int layE, resE, compE, prcE; - /** Start and end values of Tile width and height, initialised in pi_initialise_encode*/ - int txS,txE,tyS,tyE,dx,dy; - /** Temporary values for Tile parts, initialised in pi_create_encode */ - int lay_t, res_t, comp_t, prc_t,tx0_t,ty0_t; -} opj_poc_t; - -/** -Compression parameters -*/ -typedef struct opj_cparameters { - /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */ - bool tile_size_on; - /** XTOsiz */ - int cp_tx0; - /** YTOsiz */ - int cp_ty0; - /** XTsiz */ - int cp_tdx; - /** YTsiz */ - int cp_tdy; - /** allocation by rate/distortion */ - int cp_disto_alloc; - /** allocation by fixed layer */ - int cp_fixed_alloc; - /** add fixed_quality */ - int cp_fixed_quality; - /** fixed layer */ - int *cp_matrice; - /** comment for coding */ - char *cp_comment; - /** csty : coding style */ - int csty; - /** progression order (default LRCP) */ - OPJ_PROG_ORDER prog_order; - /** progression order changes */ - opj_poc_t POC[32]; - /** number of progression order changes (POC), default to 0 */ - int numpocs; - /** number of layers */ - int tcp_numlayers; - /** rates of layers */ - float tcp_rates[100]; - /** different psnr for successive layers */ - float tcp_distoratio[100]; - /** number of resolutions */ - int numresolution; - /** initial code block width, default to 64 */ - int cblockw_init; - /** initial code block height, default to 64 */ - int cblockh_init; - /** mode switch (cblk_style) */ - int mode; - /** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */ - int irreversible; - /** region of interest: affected component in [0..3], -1 means no ROI */ - int roi_compno; - /** region of interest: upshift value */ - int roi_shift; - /* number of precinct size specifications */ - int res_spec; - /** initial precinct width */ - int prcw_init[J2K_MAXRLVLS]; - /** initial precinct height */ - int prch_init[J2K_MAXRLVLS]; - - /**@name command line encoder parameters (not used inside the library) */ - /*@{*/ - /** input file name */ - char infile[OPJ_PATH_LEN]; - /** output file name */ - char outfile[OPJ_PATH_LEN]; - /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */ - int index_on; - /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */ - char index[OPJ_PATH_LEN]; - /** subimage encoding: origin image offset in x direction */ - int image_offset_x0; - /** subimage encoding: origin image offset in y direction */ - int image_offset_y0; - /** subsampling value for dx */ - int subsampling_dx; - /** subsampling value for dy */ - int subsampling_dy; - /** input file format 0: PGX, 1: PxM, 2: BMP 3:TIF*/ - int decod_format; - /** output file format 0: J2K, 1: JP2, 2: JPT */ - int cod_format; - /*@}*/ - -/* UniPG>> */ - /**@name JPWL encoding parameters */ - /*@{*/ - /** enables writing of EPC in MH, thus activating JPWL */ - bool jpwl_epc_on; - /** error protection method for MH (0,1,16,32,37-128) */ - int jpwl_hprot_MH; - /** tile number of header protection specification (>=0) */ - int jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS]; - /** error protection methods for TPHs (0,1,16,32,37-128) */ - int jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS]; - /** tile number of packet protection specification (>=0) */ - int jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS]; - /** packet number of packet protection specification (>=0) */ - int jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS]; - /** error protection methods for packets (0,1,16,32,37-128) */ - int jpwl_pprot[JPWL_MAX_NO_PACKSPECS]; - /** enables writing of ESD, (0=no/1/2 bytes) */ - int jpwl_sens_size; - /** sensitivity addressing size (0=auto/2/4 bytes) */ - int jpwl_sens_addr; - /** sensitivity range (0-3) */ - int jpwl_sens_range; - /** sensitivity method for MH (-1=no,0-7) */ - int jpwl_sens_MH; - /** tile number of sensitivity specification (>=0) */ - int jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS]; - /** sensitivity methods for TPHs (-1=no,0-7) */ - int jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS]; - /*@}*/ -/* <> */ - /**@name JPWL decoding parameters */ - /*@{*/ - /** activates the JPWL correction capabilities */ - bool jpwl_correct; - /** expected number of components */ - int jpwl_exp_comps; - /** maximum number of tiles */ - int jpwl_max_tiles; - /*@}*/ -/* <> */ -/** -Marker structure -*/ -typedef struct opj_marker_info_t { - /** marker type */ - unsigned short int type; - /** position in codestream */ - int pos; - /** length, marker val included */ - int len; -} opj_marker_info_t; -/* <> */ - /** number of markers */ - int marknum; - /** list of markers */ - opj_marker_info_t *marker; - /** actual size of markers array */ - int maxmarknum; -/* <cp. -@param dinfo decompressor handle -@param parameters decompression parameters -*/ -OPJ_API void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters); -/** -Decode an image from a JPEG-2000 codestream -@param dinfo decompressor handle -@param cio Input buffer stream -@return Returns a decoded image if successful, returns NULL otherwise -*/ -OPJ_API opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio); - -/** -Decode an image from a JPEG-2000 codestream and extract the codestream information -@param dinfo decompressor handle -@param cio Input buffer stream -@param cstr_info Codestream information structure if needed afterwards, NULL otherwise -@return Returns a decoded image if successful, returns NULL otherwise -*/ -OPJ_API opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, opj_cio_t *cio, opj_codestream_info_t *cstr_info); -/** -Creates a J2K/JP2 compression structure -@param format Coder to select -@return Returns a handle to a compressor if successful, returns NULL otherwise -*/ -OPJ_API opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format); -/** -Destroy a compressor handle -@param cinfo compressor handle to destroy -*/ -OPJ_API void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo); -/** -Set encoding parameters to default values, that means : -
      -
    • Lossless -
    • 1 tile -
    • Size of precinct : 2^15 x 2^15 (means 1 precinct) -
    • Size of code-block : 64 x 64 -
    • Number of resolutions: 6 -
    • No SOP marker in the codestream -
    • No EPH marker in the codestream -
    • No sub-sampling in x or y direction -
    • No mode switch activated -
    • Progression order: LRCP -
    • No index file -
    • No ROI upshifted -
    • No offset of the origin of the image -
    • No offset of the origin of the tiles -
    • Reversible DWT 5-3 -
    -@param parameters Compression parameters -*/ -OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters); -/** -Setup the encoder parameters using the current image and using user parameters. -@param cinfo Compressor handle -@param parameters Compression parameters -@param image Input filled image -*/ -OPJ_API void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image); -/** -Encode an image into a JPEG-2000 codestream -@param cinfo compressor handle -@param cio Output buffer stream -@param image Image to encode -@param index Depreacted -> Set to NULL. To extract index, used opj_encode_wci() -@return Returns true if successful, returns false otherwise -*/ -OPJ_API bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index); -/** -Encode an image into a JPEG-2000 codestream and extract the codestream information -@param cinfo compressor handle -@param cio Output buffer stream -@param image Image to encode -@param cstr_info Codestream information structure if needed afterwards, NULL otherwise -@return Returns true if successful, returns false otherwise -*/ -OPJ_API bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); -/** -Destroy Codestream information after compression or decompression -@param cstr_info Codestream information structure -*/ -OPJ_API void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info); - -#ifdef __cplusplus -} -#endif - -#endif /* OPENJPEG_H */ + /* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2006-2007, Parvatha Elangovan + * Copyright (c) 2010-2011, Kaori Hagihara + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ +#ifndef OPENJPEG_H +#define OPENJPEG_H + + +/* +========================================================== + Compiler directives +========================================================== +*/ + +#if defined(OPJ_STATIC) || !defined(_WIN32) +#define OPJ_API +#define OPJ_CALLCONV +#else +#define OPJ_CALLCONV __stdcall +/* +The following ifdef block is the standard way of creating macros which make exporting +from a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS +symbol defined on the command line. this symbol should not be defined on any project +that uses this DLL. This way any other project whose source files include this file see +OPJ_API functions as being imported from a DLL, wheras this DLL sees symbols +defined with this macro as being exported. +*/ +#if defined(OPJ_EXPORTS) || defined(DLL_EXPORT) +#define OPJ_API __declspec(dllexport) +#else +#define OPJ_API __declspec(dllimport) +#endif /* OPJ_EXPORTS */ +#endif /* !OPJ_STATIC || !_WIN32 */ + +typedef int opj_bool; +#define OPJ_TRUE 1 +#define OPJ_FALSE 0 + +/* Avoid compile-time warning because parameter is not used */ +#define OPJ_ARG_NOT_USED(x) (void)(x) +/* +========================================================== + Useful constant definitions +========================================================== +*/ + +#define OPJ_PATH_LEN 4096 /**< Maximum allowed size for filenames */ + +#define J2K_MAXRLVLS 33 /**< Number of maximum resolution level authorized */ +#define J2K_MAXBANDS (3*J2K_MAXRLVLS-2) /**< Number of maximum sub-band linked to number of resolution level */ + +/* UniPG>> */ +#define JPWL_MAX_NO_TILESPECS 16 /**< Maximum number of tile parts expected by JPWL: increase at your will */ +#define JPWL_MAX_NO_PACKSPECS 16 /**< Maximum number of packet parts expected by JPWL: increase at your will */ +#define JPWL_MAX_NO_MARKERS 512 /**< Maximum number of JPWL markers: increase at your will */ +#define JPWL_PRIVATEINDEX_NAME "jpwl_index_privatefilename" /**< index file name used when JPWL is on */ +#define JPWL_EXPECTED_COMPONENTS 3 /**< Expect this number of components, so you'll find better the first EPB */ +#define JPWL_MAXIMUM_TILES 8192 /**< Expect this maximum number of tiles, to avoid some crashes */ +#define JPWL_MAXIMUM_HAMMING 2 /**< Expect this maximum number of bit errors in marker id's */ +#define JPWL_MAXIMUM_EPB_ROOM 65450 /**< Expect this maximum number of bytes for composition of EPBs */ +/* < +
  • Error messages +
  • Warning messages +
  • Debugging messages + +*/ +typedef struct opj_event_mgr { + /** Error message callback if available, NULL otherwise */ + opj_msg_callback error_handler; + /** Warning message callback if available, NULL otherwise */ + opj_msg_callback warning_handler; + /** Debug message callback if available, NULL otherwise */ + opj_msg_callback info_handler; +} opj_event_mgr_t; + + +/* +========================================================== + codec typedef definitions +========================================================== +*/ + +/** +Progression order changes +*/ +typedef struct opj_poc { + /** Resolution num start, Component num start, given by POC */ + int resno0, compno0; + /** Layer num end,Resolution num end, Component num end, given by POC */ + int layno1, resno1, compno1; + /** Layer num start,Precinct num start, Precinct num end */ + int layno0, precno0, precno1; + /** Progression order enum*/ + OPJ_PROG_ORDER prg1,prg; + /** Progression order string*/ + char progorder[5]; + /** Tile number */ + int tile; + /** Start and end values for Tile width and height*/ + int tx0,tx1,ty0,ty1; + /** Start value, initialised in pi_initialise_encode*/ + int layS, resS, compS, prcS; + /** End value, initialised in pi_initialise_encode */ + int layE, resE, compE, prcE; + /** Start and end values of Tile width and height, initialised in pi_initialise_encode*/ + int txS,txE,tyS,tyE,dx,dy; + /** Temporary values for Tile parts, initialised in pi_create_encode */ + int lay_t, res_t, comp_t, prc_t,tx0_t,ty0_t; +} opj_poc_t; + +/** +Compression parameters +*/ +typedef struct opj_cparameters { + /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */ + opj_bool tile_size_on; + /** XTOsiz */ + int cp_tx0; + /** YTOsiz */ + int cp_ty0; + /** XTsiz */ + int cp_tdx; + /** YTsiz */ + int cp_tdy; + /** allocation by rate/distortion */ + int cp_disto_alloc; + /** allocation by fixed layer */ + int cp_fixed_alloc; + /** add fixed_quality */ + int cp_fixed_quality; + /** fixed layer */ + int *cp_matrice; + /** comment for coding */ + char *cp_comment; + /** csty : coding style */ + int csty; + /** progression order (default LRCP) */ + OPJ_PROG_ORDER prog_order; + /** progression order changes */ + opj_poc_t POC[32]; + /** number of progression order changes (POC), default to 0 */ + int numpocs; + /** number of layers */ + int tcp_numlayers; + /** rates of layers */ + float tcp_rates[100]; + /** different psnr for successive layers */ + float tcp_distoratio[100]; + /** number of resolutions */ + int numresolution; + /** initial code block width, default to 64 */ + int cblockw_init; + /** initial code block height, default to 64 */ + int cblockh_init; + /** mode switch (cblk_style) */ + int mode; + /** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */ + int irreversible; + /** region of interest: affected component in [0..3], -1 means no ROI */ + int roi_compno; + /** region of interest: upshift value */ + int roi_shift; + /* number of precinct size specifications */ + int res_spec; + /** initial precinct width */ + int prcw_init[J2K_MAXRLVLS]; + /** initial precinct height */ + int prch_init[J2K_MAXRLVLS]; + + /**@name command line encoder parameters (not used inside the library) */ + /*@{*/ + /** input file name */ + char infile[OPJ_PATH_LEN]; + /** output file name */ + char outfile[OPJ_PATH_LEN]; + /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */ + int index_on; + /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */ + char index[OPJ_PATH_LEN]; + /** subimage encoding: origin image offset in x direction */ + int image_offset_x0; + /** subimage encoding: origin image offset in y direction */ + int image_offset_y0; + /** subsampling value for dx */ + int subsampling_dx; + /** subsampling value for dy */ + int subsampling_dy; + /** input file format 0: PGX, 1: PxM, 2: BMP 3:TIF*/ + int decod_format; + /** output file format 0: J2K, 1: JP2, 2: JPT */ + int cod_format; + /*@}*/ + +/* UniPG>> */ + /**@name JPWL encoding parameters */ + /*@{*/ + /** enables writing of EPC in MH, thus activating JPWL */ + opj_bool jpwl_epc_on; + /** error protection method for MH (0,1,16,32,37-128) */ + int jpwl_hprot_MH; + /** tile number of header protection specification (>=0) */ + int jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS]; + /** error protection methods for TPHs (0,1,16,32,37-128) */ + int jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS]; + /** tile number of packet protection specification (>=0) */ + int jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS]; + /** packet number of packet protection specification (>=0) */ + int jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS]; + /** error protection methods for packets (0,1,16,32,37-128) */ + int jpwl_pprot[JPWL_MAX_NO_PACKSPECS]; + /** enables writing of ESD, (0=no/1/2 bytes) */ + int jpwl_sens_size; + /** sensitivity addressing size (0=auto/2/4 bytes) */ + int jpwl_sens_addr; + /** sensitivity range (0-3) */ + int jpwl_sens_range; + /** sensitivity method for MH (-1=no,0-7) */ + int jpwl_sens_MH; + /** tile number of sensitivity specification (>=0) */ + int jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS]; + /** sensitivity methods for TPHs (-1=no,0-7) */ + int jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS]; + /*@}*/ +/* <> */ + /**@name JPWL decoding parameters */ + /*@{*/ + /** activates the JPWL correction capabilities */ + opj_bool jpwl_correct; + /** expected number of components */ + int jpwl_exp_comps; + /** maximum number of tiles */ + int jpwl_max_tiles; + /*@}*/ +/* <> */ +/** +Marker structure +*/ +typedef struct opj_marker_info_t { + /** marker type */ + unsigned short int type; + /** position in codestream */ + int pos; + /** length, marker val included */ + int len; +} opj_marker_info_t; +/* <> */ + /** number of markers */ + int marknum; + /** list of markers */ + opj_marker_info_t *marker; + /** actual size of markers array */ + int maxmarknum; +/* <cp. +@param dinfo decompressor handle +@param parameters decompression parameters +*/ +OPJ_API void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters); +/** +Decode an image from a JPEG-2000 codestream +@param dinfo decompressor handle +@param cio Input buffer stream +@return Returns a decoded image if successful, returns NULL otherwise +*/ +OPJ_API opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio); + +/** +Decode an image from a JPEG-2000 codestream and extract the codestream information +@param dinfo decompressor handle +@param cio Input buffer stream +@param cstr_info Codestream information structure if needed afterwards, NULL otherwise +@return Returns a decoded image if successful, returns NULL otherwise +*/ +OPJ_API opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, opj_cio_t *cio, opj_codestream_info_t *cstr_info); +/** +Creates a J2K/JP2 compression structure +@param format Coder to select +@return Returns a handle to a compressor if successful, returns NULL otherwise +*/ +OPJ_API opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format); +/** +Destroy a compressor handle +@param cinfo compressor handle to destroy +*/ +OPJ_API void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo); +/** +Set encoding parameters to default values, that means : +
      +
    • Lossless +
    • 1 tile +
    • Size of precinct : 2^15 x 2^15 (means 1 precinct) +
    • Size of code-block : 64 x 64 +
    • Number of resolutions: 6 +
    • No SOP marker in the codestream +
    • No EPH marker in the codestream +
    • No sub-sampling in x or y direction +
    • No mode switch activated +
    • Progression order: LRCP +
    • No index file +
    • No ROI upshifted +
    • No offset of the origin of the image +
    • No offset of the origin of the tiles +
    • Reversible DWT 5-3 +
    +@param parameters Compression parameters +*/ +OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters); +/** +Setup the encoder parameters using the current image and using user parameters. +@param cinfo Compressor handle +@param parameters Compression parameters +@param image Input filled image +*/ +OPJ_API void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image); +/** +Encode an image into a JPEG-2000 codestream +3@param cinfo compressor handle +@param cio Output buffer stream +@param image Image to encode +@param index Depreacted -> Set to NULL. To extract index, used opj_encode_wci() +@return Returns true if successful, returns false otherwise +*/ +OPJ_API opj_bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index); +/** +Encode an image into a JPEG-2000 codestream and extract the codestream information +@param cinfo compressor handle +@param cio Output buffer stream +@param image Image to encode +@param cstr_info Codestream information structure if needed afterwards, NULL otherwise +@return Returns true if successful, returns false otherwise +*/ +OPJ_API opj_bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); +/** +Destroy Codestream information after compression or decompression +@param cstr_info Codestream information structure +*/ +OPJ_API void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info); + + +#ifdef __cplusplus +} +#endif + +#endif /* OPENJPEG_H */ diff --git a/openjpeg-dotnet/libopenjpeg/opj_includes.h b/openjpeg-dotnet/libopenjpeg/opj_includes.h index 7d89fc63..2b5866a9 100644 --- a/openjpeg-dotnet/libopenjpeg/opj_includes.h +++ b/openjpeg-dotnet/libopenjpeg/opj_includes.h @@ -1,125 +1,140 @@ -/* - * Copyright (c) 2005, Hervé Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ -#ifndef OPJ_INCLUDES_H -#define OPJ_INCLUDES_H - -/* - ========================================================== - Standard includes used by the library - ========================================================== -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* - ========================================================== - OpenJPEG interface - ========================================================== - */ -#include "openjpeg.h" - -/* - ========================================================== - OpenJPEG modules - ========================================================== -*/ - -/* Ignore GCC attributes if this is not GCC */ -#ifndef __GNUC__ - #define __attribute__(x) /* __attribute__(x) */ -#endif - -/* -The inline keyword is supported by C99 but not by C90. -Most compilers implement their own version of this keyword ... -*/ -#ifndef INLINE - #if defined(_MSC_VER) - #define INLINE __inline - #elif defined(__GNUC__) - #define INLINE __inline__ - #elif defined(__MWERKS__) - #define INLINE inline - #else - /* add other compilers here ... */ - #define INLINE - #endif /* defined() */ -#endif /* INLINE */ - -/* Are restricted pointers available? (C99) */ -#if (__STDC_VERSION__ != 199901L) - /* Not a C99 compiler */ - #ifdef __GNUC__ - #define restrict __restrict__ - #else - #define restrict /* restrict */ - #endif -#endif - -/* MSVC does not have lrintf */ -#ifdef _MSC_VER -static INLINE long lrintf(float f){ - return (long)(f + (f > 0.0 ? + 0.5 : -0.5) ); -} -#endif - -#include "j2k_lib.h" -#include "opj_malloc.h" -#include "event.h" -#include "cio.h" - -#include "image.h" -#include "j2k.h" -#include "jp2.h" -#include "jpt.h" - -#include "mqc.h" -#include "raw.h" -#include "bio.h" -#include "tgt.h" -#include "pi.h" -#include "tcd.h" -#include "t1.h" -#include "dwt.h" -#include "t2.h" -#include "mct.h" -#include "int.h" -#include "fix.h" - -/* JPWL>> */ -#ifdef USE_JPWL -#include "../jpwl/jpwl.h" -#endif /* USE_JPWL */ -/* < +#include +#include +#include +#include +#include +#include +#include +#include + +/* + ========================================================== + OpenJPEG interface + ========================================================== + */ +#include "openjpeg.h" + +/* + ========================================================== + OpenJPEG modules + ========================================================== +*/ + +/* Ignore GCC attributes if this is not GCC */ +#ifndef __GNUC__ + #define __attribute__(x) /* __attribute__(x) */ +#endif + +/* +The inline keyword is supported by C99 but not by C90. +Most compilers implement their own version of this keyword ... +*/ +#ifndef INLINE + #if defined(_MSC_VER) + #define INLINE __forceinline + #elif defined(__GNUC__) + #define INLINE __inline__ + #elif defined(__MWERKS__) + #define INLINE inline + #else + /* add other compilers here ... */ + #define INLINE + #endif /* defined() */ +#endif /* INLINE */ + +/* Are restricted pointers available? (C99) */ +#if (__STDC_VERSION__ != 199901L) + /* Not a C99 compiler */ + #ifdef __GNUC__ + #define restrict __restrict__ + #else + #define restrict /* restrict */ + #endif +#endif + +/* MSVC and Borland C do not have lrintf */ +#if defined(_MSC_VER) || defined(__BORLANDC__) +static INLINE long lrintf(float f){ +#ifdef _M_X64 + return (long)((f>0.0f) ? (f + 0.5f):(f -0.5f)); +#else + int i; + + _asm{ + fld f + fistp i + }; + + return i; +#endif +} +#endif + +#include "j2k_lib.h" +#include "opj_malloc.h" +#include "event.h" +#include "bio.h" +#include "cio.h" + +#include "image.h" +#include "j2k.h" +#include "jp2.h" +#include "jpt.h" + +#include "mqc.h" +#include "raw.h" +#include "bio.h" +#include "tgt.h" +#include "pi.h" +#include "tcd.h" +#include "t1.h" +#include "dwt.h" +#include "t2.h" +#include "mct.h" +#include "int.h" +#include "fix.h" + +#include "cidx_manager.h" +#include "indexbox_manager.h" + +/* JPWL>> */ +#ifdef USE_JPWL +#include "./jpwl/jpwl.h" +#endif /* USE_JPWL */ +/* < * All rights reserved. * @@ -45,7 +45,11 @@ Allocate an uninitialized memory block @param size Bytes to allocate @return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available */ +#ifdef ALLOC_PERF_OPT +void * OPJ_CALLCONV opj_malloc(size_t size); +#else #define opj_malloc(size) malloc(size) +#endif /** Allocate a memory block with elements initialized to 0 @@ -53,7 +57,11 @@ Allocate a memory block with elements initialized to 0 @param size Bytes per block to allocate @return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available */ +#ifdef ALLOC_PERF_OPT +void * OPJ_CALLCONV opj_calloc(size_t _NumOfElements, size_t _SizeOfElements); +#else #define opj_calloc(num, size) calloc(num, size) +#endif /** Allocate memory aligned to a 16 byte boundry @@ -61,7 +69,7 @@ Allocate memory aligned to a 16 byte boundry @return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available */ /* FIXME: These should be set with cmake tests, but we're currently not requiring use of cmake */ -#ifdef WIN32 +#ifdef _WIN32 /* Someone should tell the mingw people that their malloc.h ought to provide _mm_malloc() */ #ifdef __GNUC__ #include @@ -72,7 +80,7 @@ Allocate memory aligned to a 16 byte boundry #define HAVE_MM_MALLOC #endif #endif -#else /* Not WIN32 */ +#else /* Not _WIN32 */ #if defined(__sun) #define HAVE_MEMALIGN /* Linux x86_64 and OSX always align allocations to 16 bytes */ @@ -113,19 +121,34 @@ Allocate memory aligned to a 16 byte boundry #define opj_aligned_free(m) free(m) #endif +#ifdef ALLOC_PERF_OPT + #undef opj_aligned_malloc + #define opj_aligned_malloc(size) opj_malloc(size) + #undef opj_aligned_free + #define opj_aligned_free(m) opj_free(m) +#endif + /** Reallocate memory blocks. -@param memblock Pointer to previously allocated memory block -@param size New size in bytes +@param m Pointer to previously allocated memory block +@param s New size in bytes @return Returns a void pointer to the reallocated (and possibly moved) memory block */ +#ifdef ALLOC_PERF_OPT +void * OPJ_CALLCONV opj_realloc(void * m, size_t s); +#else #define opj_realloc(m, s) realloc(m, s) +#endif /** Deallocates or frees a memory block. -@param memblock Previously allocated memory block to be freed +@param m Previously allocated memory block to be freed */ +#ifdef ALLOC_PERF_OPT +void OPJ_CALLCONV opj_free(void * m); +#else #define opj_free(m) free(m) +#endif #ifdef __GNUC__ #pragma GCC poison malloc calloc realloc free diff --git a/openjpeg-dotnet/libopenjpeg/pi.c b/openjpeg-dotnet/libopenjpeg/pi.c index 0c1a5c76..e8e33bfe 100644 --- a/openjpeg-dotnet/libopenjpeg/pi.c +++ b/openjpeg-dotnet/libopenjpeg/pi.c @@ -1,963 +1,963 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2006-2007, Parvatha Elangovan - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#include "opj_includes.h" - -/** @defgroup PI PI - Implementation of a packet iterator */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -/** -Get next packet in layer-resolution-component-precinct order. -@param pi packet iterator to modify -@return returns false if pi pointed to the last packet or else returns true -*/ -static bool pi_next_lrcp(opj_pi_iterator_t * pi); -/** -Get next packet in resolution-layer-component-precinct order. -@param pi packet iterator to modify -@return returns false if pi pointed to the last packet or else returns true -*/ -static bool pi_next_rlcp(opj_pi_iterator_t * pi); -/** -Get next packet in resolution-precinct-component-layer order. -@param pi packet iterator to modify -@return returns false if pi pointed to the last packet or else returns true -*/ -static bool pi_next_rpcl(opj_pi_iterator_t * pi); -/** -Get next packet in precinct-component-resolution-layer order. -@param pi packet iterator to modify -@return returns false if pi pointed to the last packet or else returns true -*/ -static bool pi_next_pcrl(opj_pi_iterator_t * pi); -/** -Get next packet in component-precinct-resolution-layer order. -@param pi packet iterator to modify -@return returns false if pi pointed to the last packet or else returns true -*/ -static bool pi_next_cprl(opj_pi_iterator_t * pi); - -/*@}*/ - -/*@}*/ - -/* -========================================================== - local functions -========================================================== -*/ - -static bool pi_next_lrcp(opj_pi_iterator_t * pi) { - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - comp = &pi->comps[pi->compno]; - res = &comp->resolutions[pi->resno]; - goto LABEL_SKIP; - } else { - pi->first = 0; - } - - for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { - for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; - pi->resno++) { - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - comp = &pi->comps[pi->compno]; - if (pi->resno >= comp->numresolutions) { - continue; - } - res = &comp->resolutions[pi->resno]; - if (!pi->tp_on){ - pi->poc.precno1 = res->pw * res->ph; - } - for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return true; - } -LABEL_SKIP:; - } - } - } - } - - return false; -} - -static bool pi_next_rlcp(opj_pi_iterator_t * pi) { - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - comp = &pi->comps[pi->compno]; - res = &comp->resolutions[pi->resno]; - goto LABEL_SKIP; - } else { - pi->first = 0; - } - - for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { - for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - comp = &pi->comps[pi->compno]; - if (pi->resno >= comp->numresolutions) { - continue; - } - res = &comp->resolutions[pi->resno]; - if(!pi->tp_on){ - pi->poc.precno1 = res->pw * res->ph; - } - for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return true; - } -LABEL_SKIP:; - } - } - } - } - - return false; -} - -static bool pi_next_rpcl(opj_pi_iterator_t * pi) { - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - goto LABEL_SKIP; - } else { - int compno, resno; - pi->first = 0; - pi->dx = 0; - pi->dy = 0; - for (compno = 0; compno < pi->numcomps; compno++) { - comp = &pi->comps[compno]; - for (resno = 0; resno < comp->numresolutions; resno++) { - int dx, dy; - res = &comp->resolutions[resno]; - dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); - dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); - pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); - pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); - } - } - } -if (!pi->tp_on){ - pi->poc.ty0 = pi->ty0; - pi->poc.tx0 = pi->tx0; - pi->poc.ty1 = pi->ty1; - pi->poc.tx1 = pi->tx1; - } - for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { - for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) { - for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) { - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - int levelno; - int trx0, try0; - int trx1, try1; - int rpx, rpy; - int prci, prcj; - comp = &pi->comps[pi->compno]; - if (pi->resno >= comp->numresolutions) { - continue; - } - res = &comp->resolutions[pi->resno]; - levelno = comp->numresolutions - 1 - pi->resno; - trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); - try0 = int_ceildiv(pi->ty0, comp->dy << levelno); - trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); - try1 = int_ceildiv(pi->ty1, comp->dy << levelno); - rpx = res->pdx + levelno; - rpy = res->pdy + levelno; - if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpx))))){ - continue; - } - if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){ - continue; - } - - if ((res->pw==0)||(res->pw==0)) continue; - - if ((trx0==trx1)||(try0==try1)) continue; - - prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) - - int_floordivpow2(trx0, res->pdx); - prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) - - int_floordivpow2(try0, res->pdy); - pi->precno = prci + prcj * res->pw; - for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return true; - } -LABEL_SKIP:; - } - } - } - } - } - - return false; -} - -static bool pi_next_pcrl(opj_pi_iterator_t * pi) { - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - comp = &pi->comps[pi->compno]; - goto LABEL_SKIP; - } else { - int compno, resno; - pi->first = 0; - pi->dx = 0; - pi->dy = 0; - for (compno = 0; compno < pi->numcomps; compno++) { - comp = &pi->comps[compno]; - for (resno = 0; resno < comp->numresolutions; resno++) { - int dx, dy; - res = &comp->resolutions[resno]; - dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); - dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); - pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); - pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); - } - } - } - if (!pi->tp_on){ - pi->poc.ty0 = pi->ty0; - pi->poc.tx0 = pi->tx0; - pi->poc.ty1 = pi->ty1; - pi->poc.tx1 = pi->tx1; - } - for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) { - for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) { - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - comp = &pi->comps[pi->compno]; - for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) { - int levelno; - int trx0, try0; - int trx1, try1; - int rpx, rpy; - int prci, prcj; - res = &comp->resolutions[pi->resno]; - levelno = comp->numresolutions - 1 - pi->resno; - trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); - try0 = int_ceildiv(pi->ty0, comp->dy << levelno); - trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); - try1 = int_ceildiv(pi->ty1, comp->dy << levelno); - rpx = res->pdx + levelno; - rpy = res->pdy + levelno; - if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpx))))){ - continue; - } - if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){ - continue; - } - - if ((res->pw==0)||(res->pw==0)) continue; - - if ((trx0==trx1)||(try0==try1)) continue; - - prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) - - int_floordivpow2(trx0, res->pdx); - prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) - - int_floordivpow2(try0, res->pdy); - pi->precno = prci + prcj * res->pw; - for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return true; - } -LABEL_SKIP:; - } - } - } - } - } - - return false; -} - -static bool pi_next_cprl(opj_pi_iterator_t * pi) { - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - comp = &pi->comps[pi->compno]; - goto LABEL_SKIP; - } else { - pi->first = 0; - } - - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - int resno; - comp = &pi->comps[pi->compno]; - pi->dx = 0; - pi->dy = 0; - for (resno = 0; resno < comp->numresolutions; resno++) { - int dx, dy; - res = &comp->resolutions[resno]; - dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); - dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); - pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); - pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); - } - if (!pi->tp_on){ - pi->poc.ty0 = pi->ty0; - pi->poc.tx0 = pi->tx0; - pi->poc.ty1 = pi->ty1; - pi->poc.tx1 = pi->tx1; - } - for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) { - for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) { - for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) { - int levelno; - int trx0, try0; - int trx1, try1; - int rpx, rpy; - int prci, prcj; - res = &comp->resolutions[pi->resno]; - levelno = comp->numresolutions - 1 - pi->resno; - trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); - try0 = int_ceildiv(pi->ty0, comp->dy << levelno); - trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); - try1 = int_ceildiv(pi->ty1, comp->dy << levelno); - rpx = res->pdx + levelno; - rpy = res->pdy + levelno; - if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpx))))){ - continue; - } - if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){ - continue; - } - - if ((res->pw==0)||(res->pw==0)) continue; - - if ((trx0==trx1)||(try0==try1)) continue; - - prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) - - int_floordivpow2(trx0, res->pdx); - prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) - - int_floordivpow2(try0, res->pdy); - pi->precno = prci + prcj * res->pw; - for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return true; - } -LABEL_SKIP:; - } - } - } - } - } - - return false; -} - -/* -========================================================== - Packet iterator interface -========================================================== -*/ - -opj_pi_iterator_t *pi_create_decode(opj_image_t *image, opj_cp_t *cp, int tileno) { - int p, q; - int compno, resno, pino; - opj_pi_iterator_t *pi = NULL; - opj_tcp_t *tcp = NULL; - opj_tccp_t *tccp = NULL; - - tcp = &cp->tcps[tileno]; - - pi = (opj_pi_iterator_t*) opj_calloc((tcp->numpocs + 1), sizeof(opj_pi_iterator_t)); - if(!pi) { - /* TODO: throw an error */ - return NULL; - } - - for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */ - int maxres = 0; - int maxprec = 0; - p = tileno % cp->tw; - q = tileno / cp->tw; - - pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0); - pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0); - pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); - pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); - pi[pino].numcomps = image->numcomps; - - pi[pino].comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t)); - if(!pi[pino].comps) { - /* TODO: throw an error */ - pi_destroy(pi, cp, tileno); - return NULL; - } - - for (compno = 0; compno < pi->numcomps; compno++) { - int tcx0, tcy0, tcx1, tcy1; - opj_pi_comp_t *comp = &pi[pino].comps[compno]; - tccp = &tcp->tccps[compno]; - comp->dx = image->comps[compno].dx; - comp->dy = image->comps[compno].dy; - comp->numresolutions = tccp->numresolutions; - - comp->resolutions = (opj_pi_resolution_t*) opj_calloc(comp->numresolutions, sizeof(opj_pi_resolution_t)); - if(!comp->resolutions) { - /* TODO: throw an error */ - pi_destroy(pi, cp, tileno); - return NULL; - } - - tcx0 = int_ceildiv(pi->tx0, comp->dx); - tcy0 = int_ceildiv(pi->ty0, comp->dy); - tcx1 = int_ceildiv(pi->tx1, comp->dx); - tcy1 = int_ceildiv(pi->ty1, comp->dy); - if (comp->numresolutions > maxres) { - maxres = comp->numresolutions; - } - - for (resno = 0; resno < comp->numresolutions; resno++) { - int levelno; - int rx0, ry0, rx1, ry1; - int px0, py0, px1, py1; - opj_pi_resolution_t *res = &comp->resolutions[resno]; - if (tccp->csty & J2K_CCP_CSTY_PRT) { - res->pdx = tccp->prcw[resno]; - res->pdy = tccp->prch[resno]; - } else { - res->pdx = 15; - res->pdy = 15; - } - levelno = comp->numresolutions - 1 - resno; - rx0 = int_ceildivpow2(tcx0, levelno); - ry0 = int_ceildivpow2(tcy0, levelno); - rx1 = int_ceildivpow2(tcx1, levelno); - ry1 = int_ceildivpow2(tcy1, levelno); - px0 = int_floordivpow2(rx0, res->pdx) << res->pdx; - py0 = int_floordivpow2(ry0, res->pdy) << res->pdy; - px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx; - py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy; - res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx); - res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy); - - if (res->pw*res->ph > maxprec) { - maxprec = res->pw*res->ph; - } - - } - } - - tccp = &tcp->tccps[0]; - pi[pino].step_p = 1; - pi[pino].step_c = maxprec * pi[pino].step_p; - pi[pino].step_r = image->numcomps * pi[pino].step_c; - pi[pino].step_l = maxres * pi[pino].step_r; - - if (pino == 0) { - pi[pino].include = (short int*) opj_calloc(image->numcomps * maxres * tcp->numlayers * maxprec, sizeof(short int)); - if(!pi[pino].include) { - /* TODO: throw an error */ - pi_destroy(pi, cp, tileno); - return NULL; - } - } - else { - pi[pino].include = pi[pino - 1].include; - } - - if (tcp->POC == 0) { - pi[pino].first = 1; - pi[pino].poc.resno0 = 0; - pi[pino].poc.compno0 = 0; - pi[pino].poc.layno1 = tcp->numlayers; - pi[pino].poc.resno1 = maxres; - pi[pino].poc.compno1 = image->numcomps; - pi[pino].poc.prg = tcp->prg; - } else { - pi[pino].first = 1; - pi[pino].poc.resno0 = tcp->pocs[pino].resno0; - pi[pino].poc.compno0 = tcp->pocs[pino].compno0; - pi[pino].poc.layno1 = tcp->pocs[pino].layno1; - pi[pino].poc.resno1 = tcp->pocs[pino].resno1; - pi[pino].poc.compno1 = tcp->pocs[pino].compno1; - pi[pino].poc.prg = tcp->pocs[pino].prg; - } - pi[pino].poc.layno0 = 0; - pi[pino].poc.precno0 = 0; - pi[pino].poc.precno1 = maxprec; - - } - - return pi; -} - - -opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp, int tileno, J2K_T2_MODE t2_mode){ - int p, q, pino; - int compno, resno; - int maxres = 0; - int maxprec = 0; - opj_pi_iterator_t *pi = NULL; - opj_tcp_t *tcp = NULL; - opj_tccp_t *tccp = NULL; - - tcp = &cp->tcps[tileno]; - - pi = (opj_pi_iterator_t*) opj_calloc((tcp->numpocs + 1), sizeof(opj_pi_iterator_t)); - if(!pi) { return NULL;} - pi->tp_on = cp->tp_on; - - for(pino = 0;pino < tcp->numpocs+1 ; pino ++){ - p = tileno % cp->tw; - q = tileno / cp->tw; - - pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0); - pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0); - pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); - pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); - pi[pino].numcomps = image->numcomps; - - pi[pino].comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t)); - if(!pi[pino].comps) { - pi_destroy(pi, cp, tileno); - return NULL; - } - - for (compno = 0; compno < pi[pino].numcomps; compno++) { - int tcx0, tcy0, tcx1, tcy1; - opj_pi_comp_t *comp = &pi[pino].comps[compno]; - tccp = &tcp->tccps[compno]; - comp->dx = image->comps[compno].dx; - comp->dy = image->comps[compno].dy; - comp->numresolutions = tccp->numresolutions; - - comp->resolutions = (opj_pi_resolution_t*) opj_malloc(comp->numresolutions * sizeof(opj_pi_resolution_t)); - if(!comp->resolutions) { - pi_destroy(pi, cp, tileno); - return NULL; - } - - tcx0 = int_ceildiv(pi[pino].tx0, comp->dx); - tcy0 = int_ceildiv(pi[pino].ty0, comp->dy); - tcx1 = int_ceildiv(pi[pino].tx1, comp->dx); - tcy1 = int_ceildiv(pi[pino].ty1, comp->dy); - if (comp->numresolutions > maxres) { - maxres = comp->numresolutions; - } - - for (resno = 0; resno < comp->numresolutions; resno++) { - int levelno; - int rx0, ry0, rx1, ry1; - int px0, py0, px1, py1; - opj_pi_resolution_t *res = &comp->resolutions[resno]; - if (tccp->csty & J2K_CCP_CSTY_PRT) { - res->pdx = tccp->prcw[resno]; - res->pdy = tccp->prch[resno]; - } else { - res->pdx = 15; - res->pdy = 15; - } - levelno = comp->numresolutions - 1 - resno; - rx0 = int_ceildivpow2(tcx0, levelno); - ry0 = int_ceildivpow2(tcy0, levelno); - rx1 = int_ceildivpow2(tcx1, levelno); - ry1 = int_ceildivpow2(tcy1, levelno); - px0 = int_floordivpow2(rx0, res->pdx) << res->pdx; - py0 = int_floordivpow2(ry0, res->pdy) << res->pdy; - px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx; - py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy; - res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx); - res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy); - - if (res->pw*res->ph > maxprec) { - maxprec = res->pw * res->ph; - } - } - } - - tccp = &tcp->tccps[0]; - pi[pino].step_p = 1; - pi[pino].step_c = maxprec * pi[pino].step_p; - pi[pino].step_r = image->numcomps * pi[pino].step_c; - pi[pino].step_l = maxres * pi[pino].step_r; - - for (compno = 0; compno < pi->numcomps; compno++) { - opj_pi_comp_t *comp = &pi->comps[compno]; - for (resno = 0; resno < comp->numresolutions; resno++) { - int dx, dy; - opj_pi_resolution_t *res = &comp->resolutions[resno]; - dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); - dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); - pi[pino].dx = !pi->dx ? dx : int_min(pi->dx, dx); - pi[pino].dy = !pi->dy ? dy : int_min(pi->dy, dy); - } - } - - if (pino == 0) { - pi[pino].include = (short int*) opj_calloc(tcp->numlayers * pi[pino].step_l, sizeof(short int)); - if(!pi[pino].include) { - pi_destroy(pi, cp, tileno); - return NULL; - } - } - else { - pi[pino].include = pi[pino - 1].include; - } - - /* Generation of boundaries for each prog flag*/ - if(tcp->POC && ( cp->cinema || ((!cp->cinema) && (t2_mode == FINAL_PASS)))){ - tcp->pocs[pino].compS= tcp->pocs[pino].compno0; - tcp->pocs[pino].compE= tcp->pocs[pino].compno1; - tcp->pocs[pino].resS = tcp->pocs[pino].resno0; - tcp->pocs[pino].resE = tcp->pocs[pino].resno1; - tcp->pocs[pino].layE = tcp->pocs[pino].layno1; - tcp->pocs[pino].prg = tcp->pocs[pino].prg1; - if (pino > 0) - tcp->pocs[pino].layS = (tcp->pocs[pino].layE > tcp->pocs[pino - 1].layE) ? tcp->pocs[pino - 1].layE : 0; - }else { - tcp->pocs[pino].compS= 0; - tcp->pocs[pino].compE= image->numcomps; - tcp->pocs[pino].resS = 0; - tcp->pocs[pino].resE = maxres; - tcp->pocs[pino].layS = 0; - tcp->pocs[pino].layE = tcp->numlayers; - tcp->pocs[pino].prg = tcp->prg; - } - tcp->pocs[pino].prcS = 0; - tcp->pocs[pino].prcE = maxprec;; - tcp->pocs[pino].txS = pi[pino].tx0; - tcp->pocs[pino].txE = pi[pino].tx1; - tcp->pocs[pino].tyS = pi[pino].ty0; - tcp->pocs[pino].tyE = pi[pino].ty1; - tcp->pocs[pino].dx = pi[pino].dx; - tcp->pocs[pino].dy = pi[pino].dy; - } - return pi; - } - - - -void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno) { - int compno, pino; - opj_tcp_t *tcp = &cp->tcps[tileno]; - if(pi) { - for (pino = 0; pino < tcp->numpocs + 1; pino++) { - if(pi[pino].comps) { - for (compno = 0; compno < pi->numcomps; compno++) { - opj_pi_comp_t *comp = &pi[pino].comps[compno]; - if(comp->resolutions) { - opj_free(comp->resolutions); - } - } - opj_free(pi[pino].comps); - } - } - if(pi->include) { - opj_free(pi->include); - } - opj_free(pi); - } -} - -bool pi_next(opj_pi_iterator_t * pi) { - switch (pi->poc.prg) { - case LRCP: - return pi_next_lrcp(pi); - case RLCP: - return pi_next_rlcp(pi); - case RPCL: - return pi_next_rpcl(pi); - case PCRL: - return pi_next_pcrl(pi); - case CPRL: - return pi_next_cprl(pi); - case PROG_UNKNOWN: - return false; - } - - return false; -} - -bool pi_create_encode( opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp){ - char prog[4]; - int i; - int incr_top=1,resetX=0; - opj_tcp_t *tcps =&cp->tcps[tileno]; - opj_poc_t *tcp= &tcps->pocs[pino]; - - pi[pino].first = 1; - pi[pino].poc.prg = tcp->prg; - - switch(tcp->prg){ - case CPRL: strncpy(prog, "CPRL",4); - break; - case LRCP: strncpy(prog, "LRCP",4); - break; - case PCRL: strncpy(prog, "PCRL",4); - break; - case RLCP: strncpy(prog, "RLCP",4); - break; - case RPCL: strncpy(prog, "RPCL",4); - break; - case PROG_UNKNOWN: - return true; - } - - if(!(cp->tp_on && ((!cp->cinema && (t2_mode == FINAL_PASS)) || cp->cinema))){ - pi[pino].poc.resno0 = tcp->resS; - pi[pino].poc.resno1 = tcp->resE; - pi[pino].poc.compno0 = tcp->compS; - pi[pino].poc.compno1 = tcp->compE; - pi[pino].poc.layno0 = tcp->layS; - pi[pino].poc.layno1 = tcp->layE; - pi[pino].poc.precno0 = tcp->prcS; - pi[pino].poc.precno1 = tcp->prcE; - pi[pino].poc.tx0 = tcp->txS; - pi[pino].poc.ty0 = tcp->tyS; - pi[pino].poc.tx1 = tcp->txE; - pi[pino].poc.ty1 = tcp->tyE; - }else { - if( tpnum < cur_totnum_tp){ - for(i=3;i>=0;i--){ - switch(prog[i]){ - case 'C': - if (i > tppos){ - pi[pino].poc.compno0 = tcp->compS; - pi[pino].poc.compno1 = tcp->compE; - }else{ - if (tpnum == 0){ - tcp->comp_t = tcp->compS; - pi[pino].poc.compno0 = tcp->comp_t; - pi[pino].poc.compno1 = tcp->comp_t+1; - tcp->comp_t+=1; - }else{ - if (incr_top == 1){ - if(tcp->comp_t ==tcp->compE){ - tcp->comp_t = tcp->compS; - pi[pino].poc.compno0 = tcp->comp_t; - pi[pino].poc.compno1 = tcp->comp_t+1; - tcp->comp_t+=1; - incr_top=1; - }else{ - pi[pino].poc.compno0 = tcp->comp_t; - pi[pino].poc.compno1 = tcp->comp_t+1; - tcp->comp_t+=1; - incr_top=0; - } - }else{ - pi[pino].poc.compno0 = tcp->comp_t-1; - pi[pino].poc.compno1 = tcp->comp_t; - } - } - } - break; - - case 'R': - if (i > tppos){ - pi[pino].poc.resno0 = tcp->resS; - pi[pino].poc.resno1 = tcp->resE; - }else{ - if (tpnum == 0){ - tcp->res_t = tcp->resS; - pi[pino].poc.resno0 = tcp->res_t; - pi[pino].poc.resno1 = tcp->res_t+1; - tcp->res_t+=1; - }else{ - if (incr_top == 1){ - if(tcp->res_t==tcp->resE){ - tcp->res_t = tcp->resS; - pi[pino].poc.resno0 = tcp->res_t; - pi[pino].poc.resno1 = tcp->res_t+1; - tcp->res_t+=1; - incr_top=1; - }else{ - pi[pino].poc.resno0 = tcp->res_t; - pi[pino].poc.resno1 = tcp->res_t+1; - tcp->res_t+=1; - incr_top=0; - } - }else{ - pi[pino].poc.resno0 = tcp->res_t - 1; - pi[pino].poc.resno1 = tcp->res_t; - } - } - } - break; - - case 'L': - if (i > tppos){ - pi[pino].poc.layno0 = tcp->layS; - pi[pino].poc.layno1 = tcp->layE; - }else{ - if (tpnum == 0){ - tcp->lay_t = tcp->layS; - pi[pino].poc.layno0 = tcp->lay_t; - pi[pino].poc.layno1 = tcp->lay_t+1; - tcp->lay_t+=1; - }else{ - if (incr_top == 1){ - if(tcp->lay_t == tcp->layE){ - tcp->lay_t = tcp->layS; - pi[pino].poc.layno0 = tcp->lay_t; - pi[pino].poc.layno1 = tcp->lay_t+1; - tcp->lay_t+=1; - incr_top=1; - }else{ - pi[pino].poc.layno0 = tcp->lay_t; - pi[pino].poc.layno1 = tcp->lay_t+1; - tcp->lay_t+=1; - incr_top=0; - } - }else{ - pi[pino].poc.layno0 = tcp->lay_t - 1; - pi[pino].poc.layno1 = tcp->lay_t; - } - } - } - break; - - case 'P': - switch(tcp->prg){ - case LRCP: - case RLCP: - if (i > tppos){ - pi[pino].poc.precno0 = tcp->prcS; - pi[pino].poc.precno1 = tcp->prcE; - }else{ - if (tpnum == 0){ - tcp->prc_t = tcp->prcS; - pi[pino].poc.precno0 = tcp->prc_t; - pi[pino].poc.precno1 = tcp->prc_t+1; - tcp->prc_t+=1; - }else{ - if (incr_top == 1){ - if(tcp->prc_t == tcp->prcE){ - tcp->prc_t = tcp->prcS; - pi[pino].poc.precno0 = tcp->prc_t; - pi[pino].poc.precno1 = tcp->prc_t+1; - tcp->prc_t+=1; - incr_top=1; - }else{ - pi[pino].poc.precno0 = tcp->prc_t; - pi[pino].poc.precno1 = tcp->prc_t+1; - tcp->prc_t+=1; - incr_top=0; - } - }else{ - pi[pino].poc.precno0 = tcp->prc_t - 1; - pi[pino].poc.precno1 = tcp->prc_t; - } - } - } - break; - default: - if (i > tppos){ - pi[pino].poc.tx0 = tcp->txS; - pi[pino].poc.ty0 = tcp->tyS; - pi[pino].poc.tx1 = tcp->txE; - pi[pino].poc.ty1 = tcp->tyE; - }else{ - if (tpnum == 0){ - tcp->tx0_t = tcp->txS; - tcp->ty0_t = tcp->tyS; - pi[pino].poc.tx0 = tcp->tx0_t; - pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx); - pi[pino].poc.ty0 = tcp->ty0_t; - pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); - tcp->tx0_t = pi[pino].poc.tx1; - tcp->ty0_t = pi[pino].poc.ty1; - }else{ - if (incr_top == 1){ - if(tcp->tx0_t >= tcp->txE){ - if(tcp->ty0_t >= tcp->tyE){ - tcp->ty0_t = tcp->tyS; - pi[pino].poc.ty0 = tcp->ty0_t; - pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); - tcp->ty0_t = pi[pino].poc.ty1; - incr_top=1;resetX=1; - }else{ - pi[pino].poc.ty0 = tcp->ty0_t; - pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); - tcp->ty0_t = pi[pino].poc.ty1; - incr_top=0;resetX=1; - } - if(resetX==1){ - tcp->tx0_t = tcp->txS; - pi[pino].poc.tx0 = tcp->tx0_t; - pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx); - tcp->tx0_t = pi[pino].poc.tx1; - } - }else{ - pi[pino].poc.tx0 = tcp->tx0_t; - pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx); - tcp->tx0_t = pi[pino].poc.tx1; - pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy); - pi[pino].poc.ty1 = tcp->ty0_t ; - incr_top=0; - } - }else{ - pi[pino].poc.tx0 = tcp->tx0_t - tcp->dx - (tcp->tx0_t % tcp->dx); - pi[pino].poc.tx1 = tcp->tx0_t ; - pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy); - pi[pino].poc.ty1 = tcp->ty0_t ; - } - } - } - break; - } - break; - } - } - } - } - return false; -} - +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2006-2007, Parvatha Elangovan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#include "opj_includes.h" + +/** @defgroup PI PI - Implementation of a packet iterator */ +/*@{*/ + +/** @name Local static functions */ +/*@{*/ + +/** +Get next packet in layer-resolution-component-precinct order. +@param pi packet iterator to modify +@return returns false if pi pointed to the last packet or else returns true +*/ +static opj_bool pi_next_lrcp(opj_pi_iterator_t * pi); +/** +Get next packet in resolution-layer-component-precinct order. +@param pi packet iterator to modify +@return returns false if pi pointed to the last packet or else returns true +*/ +static opj_bool pi_next_rlcp(opj_pi_iterator_t * pi); +/** +Get next packet in resolution-precinct-component-layer order. +@param pi packet iterator to modify +@return returns false if pi pointed to the last packet or else returns true +*/ +static opj_bool pi_next_rpcl(opj_pi_iterator_t * pi); +/** +Get next packet in precinct-component-resolution-layer order. +@param pi packet iterator to modify +@return returns false if pi pointed to the last packet or else returns true +*/ +static opj_bool pi_next_pcrl(opj_pi_iterator_t * pi); +/** +Get next packet in component-precinct-resolution-layer order. +@param pi packet iterator to modify +@return returns false if pi pointed to the last packet or else returns true +*/ +static opj_bool pi_next_cprl(opj_pi_iterator_t * pi); + +/*@}*/ + +/*@}*/ + +/* +========================================================== + local functions +========================================================== +*/ + +static opj_bool pi_next_lrcp(opj_pi_iterator_t * pi) { + opj_pi_comp_t *comp = NULL; + opj_pi_resolution_t *res = NULL; + long index = 0; + + if (!pi->first) { + comp = &pi->comps[pi->compno]; + res = &comp->resolutions[pi->resno]; + goto LABEL_SKIP; + } else { + pi->first = 0; + } + + for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { + for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; + pi->resno++) { + for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { + comp = &pi->comps[pi->compno]; + if (pi->resno >= comp->numresolutions) { + continue; + } + res = &comp->resolutions[pi->resno]; + if (!pi->tp_on){ + pi->poc.precno1 = res->pw * res->ph; + } + for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) { + index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; + if (!pi->include[index]) { + pi->include[index] = 1; + return OPJ_TRUE; + } +LABEL_SKIP:; + } + } + } + } + + return OPJ_FALSE; +} + +static opj_bool pi_next_rlcp(opj_pi_iterator_t * pi) { + opj_pi_comp_t *comp = NULL; + opj_pi_resolution_t *res = NULL; + long index = 0; + + if (!pi->first) { + comp = &pi->comps[pi->compno]; + res = &comp->resolutions[pi->resno]; + goto LABEL_SKIP; + } else { + pi->first = 0; + } + + for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { + for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { + for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { + comp = &pi->comps[pi->compno]; + if (pi->resno >= comp->numresolutions) { + continue; + } + res = &comp->resolutions[pi->resno]; + if(!pi->tp_on){ + pi->poc.precno1 = res->pw * res->ph; + } + for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) { + index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; + if (!pi->include[index]) { + pi->include[index] = 1; + return OPJ_TRUE; + } +LABEL_SKIP:; + } + } + } + } + + return OPJ_FALSE; +} + +static opj_bool pi_next_rpcl(opj_pi_iterator_t * pi) { + opj_pi_comp_t *comp = NULL; + opj_pi_resolution_t *res = NULL; + long index = 0; + + if (!pi->first) { + goto LABEL_SKIP; + } else { + int compno, resno; + pi->first = 0; + pi->dx = 0; + pi->dy = 0; + for (compno = 0; compno < pi->numcomps; compno++) { + comp = &pi->comps[compno]; + for (resno = 0; resno < comp->numresolutions; resno++) { + int dx, dy; + res = &comp->resolutions[resno]; + dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); + dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); + pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); + pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); + } + } + } +if (!pi->tp_on){ + pi->poc.ty0 = pi->ty0; + pi->poc.tx0 = pi->tx0; + pi->poc.ty1 = pi->ty1; + pi->poc.tx1 = pi->tx1; + } + for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { + for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) { + for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) { + for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { + int levelno; + int trx0, try0; + int trx1, try1; + int rpx, rpy; + int prci, prcj; + comp = &pi->comps[pi->compno]; + if (pi->resno >= comp->numresolutions) { + continue; + } + res = &comp->resolutions[pi->resno]; + levelno = comp->numresolutions - 1 - pi->resno; + trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); + try0 = int_ceildiv(pi->ty0, comp->dy << levelno); + trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); + try1 = int_ceildiv(pi->ty1, comp->dy << levelno); + rpx = res->pdx + levelno; + rpy = res->pdy + levelno; + if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){ + continue; + } + if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){ + continue; + } + + if ((res->pw==0)||(res->ph==0)) continue; + + if ((trx0==trx1)||(try0==try1)) continue; + + prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) + - int_floordivpow2(trx0, res->pdx); + prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) + - int_floordivpow2(try0, res->pdy); + pi->precno = prci + prcj * res->pw; + for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { + index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; + if (!pi->include[index]) { + pi->include[index] = 1; + return OPJ_TRUE; + } +LABEL_SKIP:; + } + } + } + } + } + + return OPJ_FALSE; +} + +static opj_bool pi_next_pcrl(opj_pi_iterator_t * pi) { + opj_pi_comp_t *comp = NULL; + opj_pi_resolution_t *res = NULL; + long index = 0; + + if (!pi->first) { + comp = &pi->comps[pi->compno]; + goto LABEL_SKIP; + } else { + int compno, resno; + pi->first = 0; + pi->dx = 0; + pi->dy = 0; + for (compno = 0; compno < pi->numcomps; compno++) { + comp = &pi->comps[compno]; + for (resno = 0; resno < comp->numresolutions; resno++) { + int dx, dy; + res = &comp->resolutions[resno]; + dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); + dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); + pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); + pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); + } + } + } + if (!pi->tp_on){ + pi->poc.ty0 = pi->ty0; + pi->poc.tx0 = pi->tx0; + pi->poc.ty1 = pi->ty1; + pi->poc.tx1 = pi->tx1; + } + for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) { + for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) { + for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { + comp = &pi->comps[pi->compno]; + for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) { + int levelno; + int trx0, try0; + int trx1, try1; + int rpx, rpy; + int prci, prcj; + res = &comp->resolutions[pi->resno]; + levelno = comp->numresolutions - 1 - pi->resno; + trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); + try0 = int_ceildiv(pi->ty0, comp->dy << levelno); + trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); + try1 = int_ceildiv(pi->ty1, comp->dy << levelno); + rpx = res->pdx + levelno; + rpy = res->pdy + levelno; + if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){ + continue; + } + if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){ + continue; + } + + if ((res->pw==0)||(res->ph==0)) continue; + + if ((trx0==trx1)||(try0==try1)) continue; + + prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) + - int_floordivpow2(trx0, res->pdx); + prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) + - int_floordivpow2(try0, res->pdy); + pi->precno = prci + prcj * res->pw; + for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { + index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; + if (!pi->include[index]) { + pi->include[index] = 1; + return OPJ_TRUE; + } +LABEL_SKIP:; + } + } + } + } + } + + return OPJ_FALSE; +} + +static opj_bool pi_next_cprl(opj_pi_iterator_t * pi) { + opj_pi_comp_t *comp = NULL; + opj_pi_resolution_t *res = NULL; + long index = 0; + + if (!pi->first) { + comp = &pi->comps[pi->compno]; + goto LABEL_SKIP; + } else { + pi->first = 0; + } + + for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { + int resno; + comp = &pi->comps[pi->compno]; + pi->dx = 0; + pi->dy = 0; + for (resno = 0; resno < comp->numresolutions; resno++) { + int dx, dy; + res = &comp->resolutions[resno]; + dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); + dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); + pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); + pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); + } + if (!pi->tp_on){ + pi->poc.ty0 = pi->ty0; + pi->poc.tx0 = pi->tx0; + pi->poc.ty1 = pi->ty1; + pi->poc.tx1 = pi->tx1; + } + for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) { + for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) { + for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) { + int levelno; + int trx0, try0; + int trx1, try1; + int rpx, rpy; + int prci, prcj; + res = &comp->resolutions[pi->resno]; + levelno = comp->numresolutions - 1 - pi->resno; + trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); + try0 = int_ceildiv(pi->ty0, comp->dy << levelno); + trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); + try1 = int_ceildiv(pi->ty1, comp->dy << levelno); + rpx = res->pdx + levelno; + rpy = res->pdy + levelno; + if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){ + continue; + } + if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){ + continue; + } + + if ((res->pw==0)||(res->ph==0)) continue; + + if ((trx0==trx1)||(try0==try1)) continue; + + prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) + - int_floordivpow2(trx0, res->pdx); + prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) + - int_floordivpow2(try0, res->pdy); + pi->precno = prci + prcj * res->pw; + for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { + index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; + if (!pi->include[index]) { + pi->include[index] = 1; + return OPJ_TRUE; + } +LABEL_SKIP:; + } + } + } + } + } + + return OPJ_FALSE; +} + +/* +========================================================== + Packet iterator interface +========================================================== +*/ + +opj_pi_iterator_t *pi_create_decode(opj_image_t *image, opj_cp_t *cp, int tileno) { + int p, q; + int compno, resno, pino; + opj_pi_iterator_t *pi = NULL; + opj_tcp_t *tcp = NULL; + opj_tccp_t *tccp = NULL; + + tcp = &cp->tcps[tileno]; + + pi = (opj_pi_iterator_t*) opj_calloc((tcp->numpocs + 1), sizeof(opj_pi_iterator_t)); + if(!pi) { + /* TODO: throw an error */ + return NULL; + } + + for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */ + int maxres = 0; + int maxprec = 0; + p = tileno % cp->tw; + q = tileno / cp->tw; + + pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0); + pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0); + pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); + pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); + pi[pino].numcomps = image->numcomps; + + pi[pino].comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t)); + if(!pi[pino].comps) { + /* TODO: throw an error */ + pi_destroy(pi, cp, tileno); + return NULL; + } + + for (compno = 0; compno < pi->numcomps; compno++) { + int tcx0, tcy0, tcx1, tcy1; + opj_pi_comp_t *comp = &pi[pino].comps[compno]; + tccp = &tcp->tccps[compno]; + comp->dx = image->comps[compno].dx; + comp->dy = image->comps[compno].dy; + comp->numresolutions = tccp->numresolutions; + + comp->resolutions = (opj_pi_resolution_t*) opj_calloc(comp->numresolutions, sizeof(opj_pi_resolution_t)); + if(!comp->resolutions) { + /* TODO: throw an error */ + pi_destroy(pi, cp, tileno); + return NULL; + } + + tcx0 = int_ceildiv(pi->tx0, comp->dx); + tcy0 = int_ceildiv(pi->ty0, comp->dy); + tcx1 = int_ceildiv(pi->tx1, comp->dx); + tcy1 = int_ceildiv(pi->ty1, comp->dy); + if (comp->numresolutions > maxres) { + maxres = comp->numresolutions; + } + + for (resno = 0; resno < comp->numresolutions; resno++) { + int levelno; + int rx0, ry0, rx1, ry1; + int px0, py0, px1, py1; + opj_pi_resolution_t *res = &comp->resolutions[resno]; + if (tccp->csty & J2K_CCP_CSTY_PRT) { + res->pdx = tccp->prcw[resno]; + res->pdy = tccp->prch[resno]; + } else { + res->pdx = 15; + res->pdy = 15; + } + levelno = comp->numresolutions - 1 - resno; + rx0 = int_ceildivpow2(tcx0, levelno); + ry0 = int_ceildivpow2(tcy0, levelno); + rx1 = int_ceildivpow2(tcx1, levelno); + ry1 = int_ceildivpow2(tcy1, levelno); + px0 = int_floordivpow2(rx0, res->pdx) << res->pdx; + py0 = int_floordivpow2(ry0, res->pdy) << res->pdy; + px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx; + py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy; + res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx); + res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy); + + if (res->pw*res->ph > maxprec) { + maxprec = res->pw*res->ph; + } + + } + } + + tccp = &tcp->tccps[0]; + pi[pino].step_p = 1; + pi[pino].step_c = maxprec * pi[pino].step_p; + pi[pino].step_r = image->numcomps * pi[pino].step_c; + pi[pino].step_l = maxres * pi[pino].step_r; + + if (pino == 0) { + pi[pino].include = (short int*) opj_calloc(image->numcomps * maxres * tcp->numlayers * maxprec, sizeof(short int)); + if(!pi[pino].include) { + /* TODO: throw an error */ + pi_destroy(pi, cp, tileno); + return NULL; + } + } + else { + pi[pino].include = pi[pino - 1].include; + } + + if (tcp->POC == 0) { + pi[pino].first = 1; + pi[pino].poc.resno0 = 0; + pi[pino].poc.compno0 = 0; + pi[pino].poc.layno1 = tcp->numlayers; + pi[pino].poc.resno1 = maxres; + pi[pino].poc.compno1 = image->numcomps; + pi[pino].poc.prg = tcp->prg; + } else { + pi[pino].first = 1; + pi[pino].poc.resno0 = tcp->pocs[pino].resno0; + pi[pino].poc.compno0 = tcp->pocs[pino].compno0; + pi[pino].poc.layno1 = tcp->pocs[pino].layno1; + pi[pino].poc.resno1 = tcp->pocs[pino].resno1; + pi[pino].poc.compno1 = tcp->pocs[pino].compno1; + pi[pino].poc.prg = tcp->pocs[pino].prg; + } + pi[pino].poc.layno0 = 0; + pi[pino].poc.precno0 = 0; + pi[pino].poc.precno1 = maxprec; + + } + + return pi; +} + + +opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp, int tileno, J2K_T2_MODE t2_mode){ + int p, q, pino; + int compno, resno; + int maxres = 0; + int maxprec = 0; + opj_pi_iterator_t *pi = NULL; + opj_tcp_t *tcp = NULL; + opj_tccp_t *tccp = NULL; + + tcp = &cp->tcps[tileno]; + + pi = (opj_pi_iterator_t*) opj_calloc((tcp->numpocs + 1), sizeof(opj_pi_iterator_t)); + if(!pi) { return NULL;} + pi->tp_on = cp->tp_on; + + for(pino = 0;pino < tcp->numpocs+1 ; pino ++){ + p = tileno % cp->tw; + q = tileno / cp->tw; + + pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0); + pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0); + pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); + pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); + pi[pino].numcomps = image->numcomps; + + pi[pino].comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t)); + if(!pi[pino].comps) { + pi_destroy(pi, cp, tileno); + return NULL; + } + + for (compno = 0; compno < pi[pino].numcomps; compno++) { + int tcx0, tcy0, tcx1, tcy1; + opj_pi_comp_t *comp = &pi[pino].comps[compno]; + tccp = &tcp->tccps[compno]; + comp->dx = image->comps[compno].dx; + comp->dy = image->comps[compno].dy; + comp->numresolutions = tccp->numresolutions; + + comp->resolutions = (opj_pi_resolution_t*) opj_malloc(comp->numresolutions * sizeof(opj_pi_resolution_t)); + if(!comp->resolutions) { + pi_destroy(pi, cp, tileno); + return NULL; + } + + tcx0 = int_ceildiv(pi[pino].tx0, comp->dx); + tcy0 = int_ceildiv(pi[pino].ty0, comp->dy); + tcx1 = int_ceildiv(pi[pino].tx1, comp->dx); + tcy1 = int_ceildiv(pi[pino].ty1, comp->dy); + if (comp->numresolutions > maxres) { + maxres = comp->numresolutions; + } + + for (resno = 0; resno < comp->numresolutions; resno++) { + int levelno; + int rx0, ry0, rx1, ry1; + int px0, py0, px1, py1; + opj_pi_resolution_t *res = &comp->resolutions[resno]; + if (tccp->csty & J2K_CCP_CSTY_PRT) { + res->pdx = tccp->prcw[resno]; + res->pdy = tccp->prch[resno]; + } else { + res->pdx = 15; + res->pdy = 15; + } + levelno = comp->numresolutions - 1 - resno; + rx0 = int_ceildivpow2(tcx0, levelno); + ry0 = int_ceildivpow2(tcy0, levelno); + rx1 = int_ceildivpow2(tcx1, levelno); + ry1 = int_ceildivpow2(tcy1, levelno); + px0 = int_floordivpow2(rx0, res->pdx) << res->pdx; + py0 = int_floordivpow2(ry0, res->pdy) << res->pdy; + px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx; + py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy; + res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx); + res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy); + + if (res->pw*res->ph > maxprec) { + maxprec = res->pw * res->ph; + } + } + } + + tccp = &tcp->tccps[0]; + pi[pino].step_p = 1; + pi[pino].step_c = maxprec * pi[pino].step_p; + pi[pino].step_r = image->numcomps * pi[pino].step_c; + pi[pino].step_l = maxres * pi[pino].step_r; + + for (compno = 0; compno < pi->numcomps; compno++) { + opj_pi_comp_t *comp = &pi->comps[compno]; + for (resno = 0; resno < comp->numresolutions; resno++) { + int dx, dy; + opj_pi_resolution_t *res = &comp->resolutions[resno]; + dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); + dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); + pi[pino].dx = !pi->dx ? dx : int_min(pi->dx, dx); + pi[pino].dy = !pi->dy ? dy : int_min(pi->dy, dy); + } + } + + if (pino == 0) { + pi[pino].include = (short int*) opj_calloc(tcp->numlayers * pi[pino].step_l, sizeof(short int)); + if(!pi[pino].include) { + pi_destroy(pi, cp, tileno); + return NULL; + } + } + else { + pi[pino].include = pi[pino - 1].include; + } + + /* Generation of boundaries for each prog flag*/ + if(tcp->POC && ( cp->cinema || ((!cp->cinema) && (t2_mode == FINAL_PASS)))){ + tcp->pocs[pino].compS= tcp->pocs[pino].compno0; + tcp->pocs[pino].compE= tcp->pocs[pino].compno1; + tcp->pocs[pino].resS = tcp->pocs[pino].resno0; + tcp->pocs[pino].resE = tcp->pocs[pino].resno1; + tcp->pocs[pino].layE = tcp->pocs[pino].layno1; + tcp->pocs[pino].prg = tcp->pocs[pino].prg1; + if (pino > 0) + tcp->pocs[pino].layS = (tcp->pocs[pino].layE > tcp->pocs[pino - 1].layE) ? tcp->pocs[pino - 1].layE : 0; + }else { + tcp->pocs[pino].compS= 0; + tcp->pocs[pino].compE= image->numcomps; + tcp->pocs[pino].resS = 0; + tcp->pocs[pino].resE = maxres; + tcp->pocs[pino].layS = 0; + tcp->pocs[pino].layE = tcp->numlayers; + tcp->pocs[pino].prg = tcp->prg; + } + tcp->pocs[pino].prcS = 0; + tcp->pocs[pino].prcE = maxprec;; + tcp->pocs[pino].txS = pi[pino].tx0; + tcp->pocs[pino].txE = pi[pino].tx1; + tcp->pocs[pino].tyS = pi[pino].ty0; + tcp->pocs[pino].tyE = pi[pino].ty1; + tcp->pocs[pino].dx = pi[pino].dx; + tcp->pocs[pino].dy = pi[pino].dy; + } + return pi; + } + + + +void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno) { + int compno, pino; + opj_tcp_t *tcp = &cp->tcps[tileno]; + if(pi) { + for (pino = 0; pino < tcp->numpocs + 1; pino++) { + if(pi[pino].comps) { + for (compno = 0; compno < pi->numcomps; compno++) { + opj_pi_comp_t *comp = &pi[pino].comps[compno]; + if(comp->resolutions) { + opj_free(comp->resolutions); + } + } + opj_free(pi[pino].comps); + } + } + if(pi->include) { + opj_free(pi->include); + } + opj_free(pi); + } +} + +opj_bool pi_next(opj_pi_iterator_t * pi) { + switch (pi->poc.prg) { + case LRCP: + return pi_next_lrcp(pi); + case RLCP: + return pi_next_rlcp(pi); + case RPCL: + return pi_next_rpcl(pi); + case PCRL: + return pi_next_pcrl(pi); + case CPRL: + return pi_next_cprl(pi); + case PROG_UNKNOWN: + return OPJ_FALSE; + } + + return OPJ_FALSE; +} + +opj_bool pi_create_encode( opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp){ + char prog[4]; + int i; + int incr_top=1,resetX=0; + opj_tcp_t *tcps =&cp->tcps[tileno]; + opj_poc_t *tcp= &tcps->pocs[pino]; + + pi[pino].first = 1; + pi[pino].poc.prg = tcp->prg; + + switch(tcp->prg){ + case CPRL: strncpy(prog, "CPRL",4); + break; + case LRCP: strncpy(prog, "LRCP",4); + break; + case PCRL: strncpy(prog, "PCRL",4); + break; + case RLCP: strncpy(prog, "RLCP",4); + break; + case RPCL: strncpy(prog, "RPCL",4); + break; + case PROG_UNKNOWN: + return OPJ_TRUE; + } + + if(!(cp->tp_on && ((!cp->cinema && (t2_mode == FINAL_PASS)) || cp->cinema))){ + pi[pino].poc.resno0 = tcp->resS; + pi[pino].poc.resno1 = tcp->resE; + pi[pino].poc.compno0 = tcp->compS; + pi[pino].poc.compno1 = tcp->compE; + pi[pino].poc.layno0 = tcp->layS; + pi[pino].poc.layno1 = tcp->layE; + pi[pino].poc.precno0 = tcp->prcS; + pi[pino].poc.precno1 = tcp->prcE; + pi[pino].poc.tx0 = tcp->txS; + pi[pino].poc.ty0 = tcp->tyS; + pi[pino].poc.tx1 = tcp->txE; + pi[pino].poc.ty1 = tcp->tyE; + }else { + if( tpnum < cur_totnum_tp){ + for(i=3;i>=0;i--){ + switch(prog[i]){ + case 'C': + if (i > tppos){ + pi[pino].poc.compno0 = tcp->compS; + pi[pino].poc.compno1 = tcp->compE; + }else{ + if (tpnum == 0){ + tcp->comp_t = tcp->compS; + pi[pino].poc.compno0 = tcp->comp_t; + pi[pino].poc.compno1 = tcp->comp_t+1; + tcp->comp_t+=1; + }else{ + if (incr_top == 1){ + if(tcp->comp_t ==tcp->compE){ + tcp->comp_t = tcp->compS; + pi[pino].poc.compno0 = tcp->comp_t; + pi[pino].poc.compno1 = tcp->comp_t+1; + tcp->comp_t+=1; + incr_top=1; + }else{ + pi[pino].poc.compno0 = tcp->comp_t; + pi[pino].poc.compno1 = tcp->comp_t+1; + tcp->comp_t+=1; + incr_top=0; + } + }else{ + pi[pino].poc.compno0 = tcp->comp_t-1; + pi[pino].poc.compno1 = tcp->comp_t; + } + } + } + break; + + case 'R': + if (i > tppos){ + pi[pino].poc.resno0 = tcp->resS; + pi[pino].poc.resno1 = tcp->resE; + }else{ + if (tpnum == 0){ + tcp->res_t = tcp->resS; + pi[pino].poc.resno0 = tcp->res_t; + pi[pino].poc.resno1 = tcp->res_t+1; + tcp->res_t+=1; + }else{ + if (incr_top == 1){ + if(tcp->res_t==tcp->resE){ + tcp->res_t = tcp->resS; + pi[pino].poc.resno0 = tcp->res_t; + pi[pino].poc.resno1 = tcp->res_t+1; + tcp->res_t+=1; + incr_top=1; + }else{ + pi[pino].poc.resno0 = tcp->res_t; + pi[pino].poc.resno1 = tcp->res_t+1; + tcp->res_t+=1; + incr_top=0; + } + }else{ + pi[pino].poc.resno0 = tcp->res_t - 1; + pi[pino].poc.resno1 = tcp->res_t; + } + } + } + break; + + case 'L': + if (i > tppos){ + pi[pino].poc.layno0 = tcp->layS; + pi[pino].poc.layno1 = tcp->layE; + }else{ + if (tpnum == 0){ + tcp->lay_t = tcp->layS; + pi[pino].poc.layno0 = tcp->lay_t; + pi[pino].poc.layno1 = tcp->lay_t+1; + tcp->lay_t+=1; + }else{ + if (incr_top == 1){ + if(tcp->lay_t == tcp->layE){ + tcp->lay_t = tcp->layS; + pi[pino].poc.layno0 = tcp->lay_t; + pi[pino].poc.layno1 = tcp->lay_t+1; + tcp->lay_t+=1; + incr_top=1; + }else{ + pi[pino].poc.layno0 = tcp->lay_t; + pi[pino].poc.layno1 = tcp->lay_t+1; + tcp->lay_t+=1; + incr_top=0; + } + }else{ + pi[pino].poc.layno0 = tcp->lay_t - 1; + pi[pino].poc.layno1 = tcp->lay_t; + } + } + } + break; + + case 'P': + switch(tcp->prg){ + case LRCP: + case RLCP: + if (i > tppos){ + pi[pino].poc.precno0 = tcp->prcS; + pi[pino].poc.precno1 = tcp->prcE; + }else{ + if (tpnum == 0){ + tcp->prc_t = tcp->prcS; + pi[pino].poc.precno0 = tcp->prc_t; + pi[pino].poc.precno1 = tcp->prc_t+1; + tcp->prc_t+=1; + }else{ + if (incr_top == 1){ + if(tcp->prc_t == tcp->prcE){ + tcp->prc_t = tcp->prcS; + pi[pino].poc.precno0 = tcp->prc_t; + pi[pino].poc.precno1 = tcp->prc_t+1; + tcp->prc_t+=1; + incr_top=1; + }else{ + pi[pino].poc.precno0 = tcp->prc_t; + pi[pino].poc.precno1 = tcp->prc_t+1; + tcp->prc_t+=1; + incr_top=0; + } + }else{ + pi[pino].poc.precno0 = tcp->prc_t - 1; + pi[pino].poc.precno1 = tcp->prc_t; + } + } + } + break; + default: + if (i > tppos){ + pi[pino].poc.tx0 = tcp->txS; + pi[pino].poc.ty0 = tcp->tyS; + pi[pino].poc.tx1 = tcp->txE; + pi[pino].poc.ty1 = tcp->tyE; + }else{ + if (tpnum == 0){ + tcp->tx0_t = tcp->txS; + tcp->ty0_t = tcp->tyS; + pi[pino].poc.tx0 = tcp->tx0_t; + pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx); + pi[pino].poc.ty0 = tcp->ty0_t; + pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); + tcp->tx0_t = pi[pino].poc.tx1; + tcp->ty0_t = pi[pino].poc.ty1; + }else{ + if (incr_top == 1){ + if(tcp->tx0_t >= tcp->txE){ + if(tcp->ty0_t >= tcp->tyE){ + tcp->ty0_t = tcp->tyS; + pi[pino].poc.ty0 = tcp->ty0_t; + pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); + tcp->ty0_t = pi[pino].poc.ty1; + incr_top=1;resetX=1; + }else{ + pi[pino].poc.ty0 = tcp->ty0_t; + pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); + tcp->ty0_t = pi[pino].poc.ty1; + incr_top=0;resetX=1; + } + if(resetX==1){ + tcp->tx0_t = tcp->txS; + pi[pino].poc.tx0 = tcp->tx0_t; + pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx); + tcp->tx0_t = pi[pino].poc.tx1; + } + }else{ + pi[pino].poc.tx0 = tcp->tx0_t; + pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx); + tcp->tx0_t = pi[pino].poc.tx1; + pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy); + pi[pino].poc.ty1 = tcp->ty0_t ; + incr_top=0; + } + }else{ + pi[pino].poc.tx0 = tcp->tx0_t - tcp->dx - (tcp->tx0_t % tcp->dx); + pi[pino].poc.tx1 = tcp->tx0_t ; + pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy); + pi[pino].poc.ty1 = tcp->ty0_t ; + } + } + } + break; + } + break; + } + } + } + } + return OPJ_FALSE; +} + diff --git a/openjpeg-dotnet/libopenjpeg/pi.h b/openjpeg-dotnet/libopenjpeg/pi.h index 2281e733..cf9135fd 100644 --- a/openjpeg-dotnet/libopenjpeg/pi.h +++ b/openjpeg-dotnet/libopenjpeg/pi.h @@ -1,154 +1,156 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#ifndef __PI_H -#define __PI_H -/** -@file pi.h -@brief Implementation of a packet iterator (PI) - -The functions in PI.C have for goal to realize a packet iterator that permits to get the next -packet following the progression order and change of it. The functions in PI.C are used -by some function in T2.C. -*/ - -/** @defgroup PI PI - Implementation of a packet iterator */ -/*@{*/ - -/** -FIXME: documentation -*/ -typedef struct opj_pi_resolution { - int pdx, pdy; - int pw, ph; -} opj_pi_resolution_t; - -/** -FIXME: documentation -*/ -typedef struct opj_pi_comp { - int dx, dy; - /** number of resolution levels */ - int numresolutions; - opj_pi_resolution_t *resolutions; -} opj_pi_comp_t; - -/** -Packet iterator -*/ -typedef struct opj_pi_iterator { - /** Enabling Tile part generation*/ - char tp_on; - /** precise if the packet has been already used (usefull for progression order change) */ - short int *include; - /** layer step used to localize the packet in the include vector */ - int step_l; - /** resolution step used to localize the packet in the include vector */ - int step_r; - /** component step used to localize the packet in the include vector */ - int step_c; - /** precinct step used to localize the packet in the include vector */ - int step_p; - /** component that identify the packet */ - int compno; - /** resolution that identify the packet */ - int resno; - /** precinct that identify the packet */ - int precno; - /** layer that identify the packet */ - int layno; - /** 0 if the first packet */ - int first; - /** progression order change information */ - opj_poc_t poc; - /** number of components in the image */ - int numcomps; - /** Components*/ - opj_pi_comp_t *comps; - int tx0, ty0, tx1, ty1; - int x, y, dx, dy; -} opj_pi_iterator_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a packet iterator for Encoder -@param image Raw image for which the packets will be listed -@param cp Coding parameters -@param tileno Number that identifies the tile for which to list the packets -@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass -@return Returns a packet iterator that points to the first packet of the tile -@see pi_destroy -*/ -opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp, int tileno,J2K_T2_MODE t2_mode); -/** -Modify the packet iterator for enabling tile part generation -@param pi Handle to the packet iterator generated in pi_initialise_encode -@param cp Coding parameters -@param tileno Number that identifies the tile for which to list the packets -@param tpnum Tile part number of the current tile -@param tppos The position of the tile part flag in the progression order -@param cur_totnum_tp The total number of tile parts in the current tile -@return Returns true if an error is detected -*/ -bool pi_create_encode(opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp); -/** -Create a packet iterator for Decoder -@param image Raw image for which the packets will be listed -@param cp Coding parameters -@param tileno Number that identifies the tile for which to list the packets -@return Returns a packet iterator that points to the first packet of the tile -@see pi_destroy -*/ -opj_pi_iterator_t *pi_create_decode(opj_image_t * image, opj_cp_t * cp, int tileno); - -/** -Destroy a packet iterator -@param pi Previously created packet iterator -@param cp Coding parameters -@param tileno Number that identifies the tile for which the packets were listed -@see pi_create -*/ -void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno); - -/** -Modify the packet iterator to point to the next packet -@param pi Packet iterator to modify -@return Returns false if pi pointed to the last packet or else returns true -*/ -bool pi_next(opj_pi_iterator_t * pi); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __PI_H */ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#ifndef __PI_H +#define __PI_H +/** +@file pi.h +@brief Implementation of a packet iterator (PI) + +The functions in PI.C have for goal to realize a packet iterator that permits to get the next +packet following the progression order and change of it. The functions in PI.C are used +by some function in T2.C. +*/ + +/** @defgroup PI PI - Implementation of a packet iterator */ +/*@{*/ + +/** +FIXME: documentation +*/ +typedef struct opj_pi_resolution { + int pdx, pdy; + int pw, ph; +} opj_pi_resolution_t; + +/** +FIXME: documentation +*/ +typedef struct opj_pi_comp { + int dx, dy; + /** number of resolution levels */ + int numresolutions; + opj_pi_resolution_t *resolutions; +} opj_pi_comp_t; + +/** +Packet iterator +*/ +typedef struct opj_pi_iterator { + /** Enabling Tile part generation*/ + char tp_on; + /** precise if the packet has been already used (usefull for progression order change) */ + short int *include; + /** layer step used to localize the packet in the include vector */ + int step_l; + /** resolution step used to localize the packet in the include vector */ + int step_r; + /** component step used to localize the packet in the include vector */ + int step_c; + /** precinct step used to localize the packet in the include vector */ + int step_p; + /** component that identify the packet */ + int compno; + /** resolution that identify the packet */ + int resno; + /** precinct that identify the packet */ + int precno; + /** layer that identify the packet */ + int layno; + /** 0 if the first packet */ + int first; + /** progression order change information */ + opj_poc_t poc; + /** number of components in the image */ + int numcomps; + /** Components*/ + opj_pi_comp_t *comps; + int tx0, ty0, tx1, ty1; + int x, y, dx, dy; +} opj_pi_iterator_t; + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Create a packet iterator for Encoder +@param image Raw image for which the packets will be listed +@param cp Coding parameters +@param tileno Number that identifies the tile for which to list the packets +@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass +@return Returns a packet iterator that points to the first packet of the tile +@see pi_destroy +*/ +opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp, int tileno,J2K_T2_MODE t2_mode); +/** +Modify the packet iterator for enabling tile part generation +@param pi Handle to the packet iterator generated in pi_initialise_encode +@param cp Coding parameters +@param tileno Number that identifies the tile for which to list the packets +@param pino Iterator index for pi +@param tpnum Tile part number of the current tile +@param tppos The position of the tile part flag in the progression order +@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass +@param cur_totnum_tp The total number of tile parts in the current tile +@return Returns true if an error is detected +*/ +opj_bool pi_create_encode(opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp); +/** +Create a packet iterator for Decoder +@param image Raw image for which the packets will be listed +@param cp Coding parameters +@param tileno Number that identifies the tile for which to list the packets +@return Returns a packet iterator that points to the first packet of the tile +@see pi_destroy +*/ +opj_pi_iterator_t *pi_create_decode(opj_image_t * image, opj_cp_t * cp, int tileno); + +/** +Destroy a packet iterator +@param pi Previously created packet iterator +@param cp Coding parameters +@param tileno Number that identifies the tile for which the packets were listed +@see pi_create +*/ +void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno); + +/** +Modify the packet iterator to point to the next packet +@param pi Packet iterator to modify +@return Returns false if pi pointed to the last packet or else returns true +*/ +opj_bool pi_next(opj_pi_iterator_t * pi); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __PI_H */ diff --git a/openjpeg-dotnet/libopenjpeg/raw.c b/openjpeg-dotnet/libopenjpeg/raw.c index 265ecbd7..3d231bfd 100644 --- a/openjpeg-dotnet/libopenjpeg/raw.c +++ b/openjpeg-dotnet/libopenjpeg/raw.c @@ -1,87 +1,87 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#include "opj_includes.h" - -/* -========================================================== - local functions -========================================================== -*/ - - -/* -========================================================== - RAW encoding interface -========================================================== -*/ - -opj_raw_t* raw_create(void) { - opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t)); - return raw; -} - -void raw_destroy(opj_raw_t *raw) { - if(raw) { - opj_free(raw); - } -} - -int raw_numbytes(opj_raw_t *raw) { - return raw->bp - raw->start; -} - -void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len) { - raw->start = bp; - raw->lenmax = len; - raw->len = 0; - raw->c = 0; - raw->ct = 0; -} - -int raw_decode(opj_raw_t *raw) { - int d; - if (raw->ct == 0) { - raw->ct = 8; - if (raw->len == raw->lenmax) { - raw->c = 0xff; - } else { - if (raw->c == 0xff) { - raw->ct = 7; - } - raw->c = *(raw->start + raw->len); - raw->len++; - } - } - raw->ct--; - d = (raw->c >> raw->ct) & 0x01; - - return d; -} - +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#include "opj_includes.h" + +/* +========================================================== + local functions +========================================================== +*/ + + +/* +========================================================== + RAW encoding interface +========================================================== +*/ + +opj_raw_t* raw_create(void) { + opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t)); + return raw; +} + +void raw_destroy(opj_raw_t *raw) { + if(raw) { + opj_free(raw); + } +} + +int raw_numbytes(opj_raw_t *raw) { + return raw->bp - raw->start; +} + +void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len) { + raw->start = bp; + raw->lenmax = len; + raw->len = 0; + raw->c = 0; + raw->ct = 0; +} + +int raw_decode(opj_raw_t *raw) { + int d; + if (raw->ct == 0) { + raw->ct = 8; + if (raw->len == raw->lenmax) { + raw->c = 0xff; + } else { + if (raw->c == 0xff) { + raw->ct = 7; + } + raw->c = *(raw->start + raw->len); + raw->len++; + } + } + raw->ct--; + d = (raw->c >> raw->ct) & 0x01; + + return d; +} + diff --git a/openjpeg-dotnet/libopenjpeg/raw.h b/openjpeg-dotnet/libopenjpeg/raw.h index f873ac57..3c4b372f 100644 --- a/openjpeg-dotnet/libopenjpeg/raw.h +++ b/openjpeg-dotnet/libopenjpeg/raw.h @@ -1,100 +1,100 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#ifndef __RAW_H -#define __RAW_H -/** -@file raw.h -@brief Implementation of operations for raw encoding (RAW) - -The functions in RAW.C have for goal to realize the operation of raw encoding linked -with the corresponding mode switch. -*/ - -/** @defgroup RAW RAW - Implementation of operations for raw encoding */ -/*@{*/ - -/** -RAW encoding operations -*/ -typedef struct opj_raw { - /** temporary buffer where bits are coded or decoded */ - unsigned char c; - /** number of bits already read or free to write */ - unsigned int ct; - /** maximum length to decode */ - unsigned int lenmax; - /** length decoded */ - unsigned int len; - /** pointer to the current position in the buffer */ - unsigned char *bp; - /** pointer to the start of the buffer */ - unsigned char *start; - /** pointer to the end of the buffer */ - unsigned char *end; -} opj_raw_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a new RAW handle -@return Returns a new RAW handle if successful, returns NULL otherwise -*/ -opj_raw_t* raw_create(void); -/** -Destroy a previously created RAW handle -@param raw RAW handle to destroy -*/ -void raw_destroy(opj_raw_t *raw); -/** -Return the number of bytes written/read since initialisation -@param raw RAW handle to destroy -@return Returns the number of bytes already encoded -*/ -int raw_numbytes(opj_raw_t *raw); -/** -Initialize the decoder -@param raw RAW handle -@param bp Pointer to the start of the buffer from which the bytes will be read -@param len Length of the input buffer -*/ -void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len); -/** -Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN -@param raw RAW handle -@return Returns the decoded symbol (0 or 1) -*/ -int raw_decode(opj_raw_t *raw); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __RAW_H */ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#ifndef __RAW_H +#define __RAW_H +/** +@file raw.h +@brief Implementation of operations for raw encoding (RAW) + +The functions in RAW.C have for goal to realize the operation of raw encoding linked +with the corresponding mode switch. +*/ + +/** @defgroup RAW RAW - Implementation of operations for raw encoding */ +/*@{*/ + +/** +RAW encoding operations +*/ +typedef struct opj_raw { + /** temporary buffer where bits are coded or decoded */ + unsigned char c; + /** number of bits already read or free to write */ + unsigned int ct; + /** maximum length to decode */ + unsigned int lenmax; + /** length decoded */ + unsigned int len; + /** pointer to the current position in the buffer */ + unsigned char *bp; + /** pointer to the start of the buffer */ + unsigned char *start; + /** pointer to the end of the buffer */ + unsigned char *end; +} opj_raw_t; + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Create a new RAW handle +@return Returns a new RAW handle if successful, returns NULL otherwise +*/ +opj_raw_t* raw_create(void); +/** +Destroy a previously created RAW handle +@param raw RAW handle to destroy +*/ +void raw_destroy(opj_raw_t *raw); +/** +Return the number of bytes written/read since initialisation +@param raw RAW handle to destroy +@return Returns the number of bytes already encoded +*/ +int raw_numbytes(opj_raw_t *raw); +/** +Initialize the decoder +@param raw RAW handle +@param bp Pointer to the start of the buffer from which the bytes will be read +@param len Length of the input buffer +*/ +void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len); +/** +Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN +@param raw RAW handle +@return Returns the decoded symbol (0 or 1) +*/ +int raw_decode(opj_raw_t *raw); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __RAW_H */ diff --git a/openjpeg-dotnet/libopenjpeg/t1.c b/openjpeg-dotnet/libopenjpeg/t1.c index 47f624ad..47772041 100644 --- a/openjpeg-dotnet/libopenjpeg/t1.c +++ b/openjpeg-dotnet/libopenjpeg/t1.c @@ -1,1225 +1,1584 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2007, Callum Lerwick - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#include "opj_includes.h" -#include "t1_luts.h" - -/** @defgroup T1 T1 - Implementation of the tier-1 coding */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -static INLINE char t1_getctxno_zc(int f, int orient); -static char t1_getctxno_sc(int f); -static INLINE int t1_getctxno_mag(int f); -static char t1_getspb(int f); -static short t1_getnmsedec_sig(int x, int bitpos); -static short t1_getnmsedec_ref(int x, int bitpos); -static void t1_updateflags(flag_t *flagsp, int s, int stride); -/** -Encode significant pass -*/ -static void t1_enc_sigpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int bpno, - int one, - int *nmsedec, - char type, - int vsc); -/** -Decode significant pass -*/ -static void t1_dec_sigpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf, - char type, - int vsc); -/** -Encode significant pass -*/ -static void t1_enc_sigpass( - opj_t1_t *t1, - int bpno, - int orient, - int *nmsedec, - char type, - int cblksty); -/** -Decode significant pass -*/ -static void t1_dec_sigpass( - opj_t1_t *t1, - int bpno, - int orient, - char type, - int cblksty); -/** -Encode refinement pass -*/ -static void t1_enc_refpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int bpno, - int one, - int *nmsedec, - char type, - int vsc); -/** -Decode refinement pass -*/ -static void t1_dec_refpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int poshalf, - int neghalf, - char type, - int vsc); -/** -Encode refinement pass -*/ -static void t1_enc_refpass( - opj_t1_t *t1, - int bpno, - int *nmsedec, - char type, - int cblksty); -/** -Decode refinement pass -*/ -static void t1_dec_refpass( - opj_t1_t *t1, - int bpno, - char type, - int cblksty); -/** -Encode clean-up pass -*/ -static void t1_enc_clnpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int bpno, - int one, - int *nmsedec, - int partial, - int vsc); -/** -Decode clean-up pass -*/ -static void t1_dec_clnpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf, - int partial, - int vsc); -/** -Encode clean-up pass -*/ -static void t1_enc_clnpass( - opj_t1_t *t1, - int bpno, - int orient, - int *nmsedec, - int cblksty); -/** -Decode clean-up pass -*/ -static void t1_dec_clnpass( - opj_t1_t *t1, - int bpno, - int orient, - int cblksty); -static double t1_getwmsedec( - int nmsedec, - int compno, - int level, - int orient, - int bpno, - int qmfbid, - double stepsize, - int numcomps, - int mct); -/** -Encode 1 code-block -@param t1 T1 handle -@param cblk Code-block coding parameters -@param orient -@param compno Component number -@param level -@param qmfbid -@param stepsize -@param cblksty Code-block style -@param numcomps -@param tile -*/ -static void t1_encode_cblk( - opj_t1_t *t1, - opj_tcd_cblk_enc_t* cblk, - int orient, - int compno, - int level, - int qmfbid, - double stepsize, - int cblksty, - int numcomps, - int mct, - opj_tcd_tile_t * tile); -/** -Decode 1 code-block -@param t1 T1 handle -@param cblk Code-block coding parameters -@param orient -@param roishift Region of interest shifting value -@param cblksty Code-block style -*/ -static void t1_decode_cblk( - opj_t1_t *t1, - opj_tcd_cblk_dec_t* cblk, - int orient, - int roishift, - int cblksty); - -/*@}*/ - -/*@}*/ - -/* ----------------------------------------------------------------------- */ - -static char t1_getctxno_zc(int f, int orient) { - return lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)]; -} - -static char t1_getctxno_sc(int f) { - return lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4]; -} - -static int t1_getctxno_mag(int f) { - int tmp1 = (f & T1_SIG_OTH) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG; - int tmp2 = (f & T1_REFINE) ? T1_CTXNO_MAG + 2 : tmp1; - return (tmp2); -} - -static char t1_getspb(int f) { - return lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4]; -} - -static short t1_getnmsedec_sig(int x, int bitpos) { - if (bitpos > T1_NMSEDEC_FRACBITS) { - return lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)]; - } - - return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; -} - -static short t1_getnmsedec_ref(int x, int bitpos) { - if (bitpos > T1_NMSEDEC_FRACBITS) { - return lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)]; - } - - return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; -} - -static void t1_updateflags(flag_t *flagsp, int s, int stride) { - flag_t *np = flagsp - stride; - flag_t *sp = flagsp + stride; - - static const flag_t mod[] = { - T1_SIG_S, T1_SIG_S|T1_SGN_S, - T1_SIG_E, T1_SIG_E|T1_SGN_E, - T1_SIG_W, T1_SIG_W|T1_SGN_W, - T1_SIG_N, T1_SIG_N|T1_SGN_N - }; - - np[-1] |= T1_SIG_SE; - np[0] |= mod[s]; - np[1] |= T1_SIG_SW; - - flagsp[-1] |= mod[s+2]; - flagsp[0] |= T1_SIG; - flagsp[1] |= mod[s+4]; - - sp[-1] |= T1_SIG_NE; - sp[0] |= mod[s+6]; - sp[1] |= T1_SIG_NW; -} - -static void t1_enc_sigpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int bpno, - int one, - int *nmsedec, - char type, - int vsc) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); - if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { - v = int_abs(*datap) & one ? 1 : 0; - mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); /* ESSAI */ - if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ - mqc_bypass_enc(mqc, v); - } else { - mqc_encode(mqc, v); - } - if (v) { - v = *datap < 0 ? 1 : 0; - *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS); - mqc_setcurctx(mqc, t1_getctxno_sc(flag)); /* ESSAI */ - if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ - mqc_bypass_enc(mqc, v); - } else { - mqc_encode(mqc, v ^ t1_getspb(flag)); - } - t1_updateflags(flagsp, v, t1->flags_stride); - } - *flagsp |= T1_VISIT; - } -} - -static void t1_dec_sigpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf, - char type, - int vsc) -{ - int v, flag; - - opj_raw_t *raw = t1->raw; /* RAW component */ - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); - if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { - if (type == T1_TYPE_RAW) { - if (raw_decode(raw)) { - v = raw_decode(raw); /* ESSAI */ - *datap = v ? -oneplushalf : oneplushalf; - t1_updateflags(flagsp, v, t1->flags_stride); - } - } else { - mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); - if (mqc_decode(mqc)) { - mqc_setcurctx(mqc, t1_getctxno_sc(flag)); - v = mqc_decode(mqc) ^ t1_getspb(flag); - *datap = v ? -oneplushalf : oneplushalf; - t1_updateflags(flagsp, v, t1->flags_stride); - } - } - *flagsp |= T1_VISIT; - } -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_sigpass( - opj_t1_t *t1, - int bpno, - int orient, - int *nmsedec, - char type, - int cblksty) -{ - int i, j, k, one, vsc; - *nmsedec = 0; - one = 1 << (bpno + T1_NMSEDEC_FRACBITS); - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - for (j = k; j < k + 4 && j < t1->h; ++j) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; - t1_enc_sigpass_step( - t1, - &t1->flags[((j+1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - orient, - bpno, - one, - nmsedec, - type, - vsc); - } - } - } -} - -static void t1_dec_sigpass( - opj_t1_t *t1, - int bpno, - int orient, - char type, - int cblksty) -{ - int i, j, k, one, half, oneplushalf, vsc; - one = 1 << bpno; - half = one >> 1; - oneplushalf = one | half; - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - for (j = k; j < k + 4 && j < t1->h; ++j) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; - t1_dec_sigpass_step( - t1, - &t1->flags[((j+1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - orient, - oneplushalf, - type, - vsc); - } - } - } -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_refpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int bpno, - int one, - int *nmsedec, - char type, - int vsc) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); - if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { - *nmsedec += t1_getnmsedec_ref(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS); - v = int_abs(*datap) & one ? 1 : 0; - mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */ - if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ - mqc_bypass_enc(mqc, v); - } else { - mqc_encode(mqc, v); - } - *flagsp |= T1_REFINE; - } -} - -static void t1_dec_refpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int poshalf, - int neghalf, - char type, - int vsc) -{ - int v, t, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - opj_raw_t *raw = t1->raw; /* RAW component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); - if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { - mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */ - if (type == T1_TYPE_RAW) { - v = raw_decode(raw); - } else { - v = mqc_decode(mqc); - } - t = v ? poshalf : neghalf; - *datap += *datap < 0 ? -t : t; - *flagsp |= T1_REFINE; - } -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_refpass( - opj_t1_t *t1, - int bpno, - int *nmsedec, - char type, - int cblksty) -{ - int i, j, k, one, vsc; - *nmsedec = 0; - one = 1 << (bpno + T1_NMSEDEC_FRACBITS); - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - for (j = k; j < k + 4 && j < t1->h; ++j) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; - t1_enc_refpass_step( - t1, - &t1->flags[((j+1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - bpno, - one, - nmsedec, - type, - vsc); - } - } - } -} - -static void t1_dec_refpass( - opj_t1_t *t1, - int bpno, - char type, - int cblksty) -{ - int i, j, k, one, poshalf, neghalf; - int vsc; - one = 1 << bpno; - poshalf = one >> 1; - neghalf = bpno > 0 ? -poshalf : -1; - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - for (j = k; j < k + 4 && j < t1->h; ++j) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; - t1_dec_refpass_step( - t1, - &t1->flags[((j+1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - poshalf, - neghalf, - type, - vsc); - } - } - } -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_clnpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int bpno, - int one, - int *nmsedec, - int partial, - int vsc) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); - if (partial) { - goto LABEL_PARTIAL; - } - if (!(*flagsp & (T1_SIG | T1_VISIT))) { - mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); - v = int_abs(*datap) & one ? 1 : 0; - mqc_encode(mqc, v); - if (v) { -LABEL_PARTIAL: - *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS); - mqc_setcurctx(mqc, t1_getctxno_sc(flag)); - v = *datap < 0 ? 1 : 0; - mqc_encode(mqc, v ^ t1_getspb(flag)); - t1_updateflags(flagsp, v, t1->flags_stride); - } - } - *flagsp &= ~T1_VISIT; -} - -static void t1_dec_clnpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf, - int partial, - int vsc) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); - if (partial) { - goto LABEL_PARTIAL; - } - if (!(flag & (T1_SIG | T1_VISIT))) { - mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); - if (mqc_decode(mqc)) { -LABEL_PARTIAL: - mqc_setcurctx(mqc, t1_getctxno_sc(flag)); - v = mqc_decode(mqc) ^ t1_getspb(flag); - *datap = v ? -oneplushalf : oneplushalf; - t1_updateflags(flagsp, v, t1->flags_stride); - } - } - *flagsp &= ~T1_VISIT; -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_clnpass( - opj_t1_t *t1, - int bpno, - int orient, - int *nmsedec, - int cblksty) -{ - int i, j, k, one, agg, runlen, vsc; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - *nmsedec = 0; - one = 1 << (bpno + T1_NMSEDEC_FRACBITS); - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - if (k + 3 < t1->h) { - if (cblksty & J2K_CCP_CBLKSTY_VSC) { - agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || (MACRO_t1_flags(1 + k + 3,1 + i) - & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); - } else { - agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); - } - } else { - agg = 0; - } - if (agg) { - for (runlen = 0; runlen < 4; ++runlen) { - if (int_abs(t1->data[((k + runlen)*t1->w) + i]) & one) - break; - } - mqc_setcurctx(mqc, T1_CTXNO_AGG); - mqc_encode(mqc, runlen != 4); - if (runlen == 4) { - continue; - } - mqc_setcurctx(mqc, T1_CTXNO_UNI); - mqc_encode(mqc, runlen >> 1); - mqc_encode(mqc, runlen & 1); - } else { - runlen = 0; - } - for (j = k + runlen; j < k + 4 && j < t1->h; ++j) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; - t1_enc_clnpass_step( - t1, - &t1->flags[((j+1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - orient, - bpno, - one, - nmsedec, - agg && (j == k + runlen), - vsc); - } - } - } -} - -static void t1_dec_clnpass( - opj_t1_t *t1, - int bpno, - int orient, - int cblksty) -{ - int i, j, k, one, half, oneplushalf, agg, runlen, vsc; - int segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - one = 1 << bpno; - half = one >> 1; - oneplushalf = one | half; - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - if (k + 3 < t1->h) { - if (cblksty & J2K_CCP_CBLKSTY_VSC) { - agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || (MACRO_t1_flags(1 + k + 3,1 + i) - & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); - } else { - agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); - } - } else { - agg = 0; - } - if (agg) { - mqc_setcurctx(mqc, T1_CTXNO_AGG); - if (!mqc_decode(mqc)) { - continue; - } - mqc_setcurctx(mqc, T1_CTXNO_UNI); - runlen = mqc_decode(mqc); - runlen = (runlen << 1) | mqc_decode(mqc); - } else { - runlen = 0; - } - for (j = k + runlen; j < k + 4 && j < t1->h; ++j) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; - t1_dec_clnpass_step( - t1, - &t1->flags[((j+1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - orient, - oneplushalf, - agg && (j == k + runlen), - vsc); - } - } - } - if (segsym) { - int v = 0; - mqc_setcurctx(mqc, T1_CTXNO_UNI); - v = mqc_decode(mqc); - v = (v << 1) | mqc_decode(mqc); - v = (v << 1) | mqc_decode(mqc); - v = (v << 1) | mqc_decode(mqc); - /* - if (v!=0xa) { - opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v); - } - */ - } -} /* VSC and BYPASS by Antonin */ - - -/** mod fixed_quality */ -static double t1_getwmsedec( - int nmsedec, - int compno, - int level, - int orient, - int bpno, - int qmfbid, - double stepsize, - int numcomps, - int mct) -{ - double w1 = 1, w2, wmsedec; - - // Prevent running an MCT on more than 3 components. NB openjpeg v2.0 will support this via - // custom MCT tables that can be passed as encode parameters, 1.3 cannot support this as it - // uses a static table of 3 entries and there for can only cope with 3 components with out an - // array overflow - - if(numcomps==3) { - if (qmfbid == 1) { - w1 = (mct && numcomps==3) ? mct_getnorm(compno) : 1.0; - } else { - w1 = (mct && numcomps==3) ? mct_getnorm_real(compno) : 1.0; - } - } - - if (qmfbid == 1) { - w2 = dwt_getnorm(level, orient); - } else { /* if (qmfbid == 0) */ - w2 = dwt_getnorm_real(level, orient); - } - wmsedec = w1 * w2 * stepsize * (1 << bpno); - wmsedec *= wmsedec * nmsedec / 8192.0; - - return wmsedec; -} - -static bool allocate_buffers( - opj_t1_t *t1, - int w, - int h) -{ - int datasize=w * h; - int flagssize; - - if(datasize > t1->datasize){ - opj_aligned_free(t1->data); - t1->data = (int*) opj_aligned_malloc(datasize * sizeof(int)); - if(!t1->data){ - return false; - } - t1->datasize=datasize; - } - memset(t1->data,0,datasize * sizeof(int)); - - t1->flags_stride=w+2; - flagssize=t1->flags_stride * (h+2); - - if(flagssize > t1->flagssize){ - opj_aligned_free(t1->flags); - t1->flags = (flag_t*) opj_aligned_malloc(flagssize * sizeof(flag_t)); - if(!t1->flags){ - return false; - } - t1->flagssize=flagssize; - } - memset(t1->flags,0,flagssize * sizeof(flag_t)); - - t1->w=w; - t1->h=h; - - return true; -} - -/** mod fixed_quality */ -static void t1_encode_cblk( - opj_t1_t *t1, - opj_tcd_cblk_enc_t* cblk, - int orient, - int compno, - int level, - int qmfbid, - double stepsize, - int cblksty, - int numcomps, - int mct, - opj_tcd_tile_t * tile) -{ - double cumwmsedec = 0.0; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - int passno, bpno, passtype; - int nmsedec = 0; - int i, max; - char type = T1_TYPE_MQ; - double tempwmsedec; - - max = 0; - for (i = 0; i < t1->w * t1->h; ++i) { - int tmp = abs(t1->data[i]); - max = int_max(max, tmp); - } - - cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0; - - bpno = cblk->numbps - 1; - passtype = 2; - - mqc_resetstates(mqc); - mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); - mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); - mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); - mqc_init_enc(mqc, cblk->data); - - for (passno = 0; bpno >= 0; ++passno) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - int correction = 3; - type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; - - switch (passtype) { - case 0: - t1_enc_sigpass(t1, bpno, orient, &nmsedec, type, cblksty); - break; - case 1: - t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty); - break; - case 2: - t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty); - /* code switch SEGMARK (i.e. SEGSYM) */ - if (cblksty & J2K_CCP_CBLKSTY_SEGSYM) - mqc_segmark_enc(mqc); - break; - } - - /* fixed_quality */ - tempwmsedec = t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps, mct); - cumwmsedec += tempwmsedec; - tile->distotile += tempwmsedec; - - /* Code switch "RESTART" (i.e. TERMALL) */ - if ((cblksty & J2K_CCP_CBLKSTY_TERMALL) && !((passtype == 2) && (bpno - 1 < 0))) { - if (type == T1_TYPE_RAW) { - mqc_flush(mqc); - correction = 1; - /* correction = mqc_bypass_flush_enc(); */ - } else { /* correction = mqc_restart_enc(); */ - mqc_flush(mqc); - correction = 1; - } - pass->term = 1; - } else { - if (((bpno < (cblk->numbps - 4) && (passtype > 0)) - || ((bpno == (cblk->numbps - 4)) && (passtype == 2))) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) { - if (type == T1_TYPE_RAW) { - mqc_flush(mqc); - correction = 1; - /* correction = mqc_bypass_flush_enc(); */ - } else { /* correction = mqc_restart_enc(); */ - mqc_flush(mqc); - correction = 1; - } - pass->term = 1; - } else { - pass->term = 0; - } - } - - if (++passtype == 3) { - passtype = 0; - bpno--; - } - - if (pass->term && bpno > 0) { - type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; - if (type == T1_TYPE_RAW) - mqc_bypass_init_enc(mqc); - else - mqc_restart_init_enc(mqc); - } - - pass->distortiondec = cumwmsedec; - pass->rate = mqc_numbytes(mqc) + correction; /* FIXME */ - - /* Code-switch "RESET" */ - if (cblksty & J2K_CCP_CBLKSTY_RESET) - mqc_reset_enc(mqc); - } - - /* Code switch "ERTERM" (i.e. PTERM) */ - if (cblksty & J2K_CCP_CBLKSTY_PTERM) - mqc_erterm_enc(mqc); - else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY)) - mqc_flush(mqc); - - cblk->totalpasses = passno; - - for (passno = 0; passnototalpasses; passno++) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - if (pass->rate > mqc_numbytes(mqc)) - pass->rate = mqc_numbytes(mqc); - /*Preventing generation of FF as last data byte of a pass*/ - if((pass->rate>1) && (cblk->data[pass->rate - 1] == 0xFF)){ - pass->rate--; - } - pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate); - } -} - -static void t1_decode_cblk( - opj_t1_t *t1, - opj_tcd_cblk_dec_t* cblk, - int orient, - int roishift, - int cblksty) -{ - opj_raw_t *raw = t1->raw; /* RAW component */ - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - int bpno, passtype; - int segno, passno; - char type = T1_TYPE_MQ; /* BYPASS mode */ - - if(!allocate_buffers( - t1, - cblk->x1 - cblk->x0, - cblk->y1 - cblk->y0)) - { - return; - } - - bpno = roishift + cblk->numbps - 1; - passtype = 2; - - mqc_resetstates(mqc); - mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); - mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); - mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); - - for (segno = 0; segno < cblk->numsegs; ++segno) { - opj_tcd_seg_t *seg = &cblk->segs[segno]; - - /* BYPASS mode */ - type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; - /* FIXME: slviewer gets here with a null pointer. Why? Partially downloaded and/or corrupt textures? */ - if(seg->data == NULL){ - continue; - } - if (type == T1_TYPE_RAW) { - raw_init_dec(raw, (*seg->data) + seg->dataindex, seg->len); - } else { - mqc_init_dec(mqc, (*seg->data) + seg->dataindex, seg->len); - } - - for (passno = 0; passno < seg->numpasses; ++passno) { - switch (passtype) { - case 0: - t1_dec_sigpass(t1, bpno+1, orient, type, cblksty); - break; - case 1: - t1_dec_refpass(t1, bpno+1, type, cblksty); - break; - case 2: - t1_dec_clnpass(t1, bpno+1, orient, cblksty); - break; - } - - if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) { - mqc_resetstates(mqc); - mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); - mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); - mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); - } - if (++passtype == 3) { - passtype = 0; - bpno--; - } - } - } -} - -/* ----------------------------------------------------------------------- */ - -opj_t1_t* t1_create(opj_common_ptr cinfo) { - opj_t1_t *t1 = (opj_t1_t*) opj_malloc(sizeof(opj_t1_t)); - if(!t1) - return NULL; - - t1->cinfo = cinfo; - /* create MQC and RAW handles */ - t1->mqc = mqc_create(); - t1->raw = raw_create(); - - t1->data=NULL; - t1->flags=NULL; - t1->datasize=0; - t1->flagssize=0; - - return t1; -} - -void t1_destroy(opj_t1_t *t1) { - if(t1) { - /* destroy MQC and RAW handles */ - mqc_destroy(t1->mqc); - raw_destroy(t1->raw); - opj_aligned_free(t1->data); - opj_aligned_free(t1->flags); - opj_free(t1); - } -} - -void t1_encode_cblks( - opj_t1_t *t1, - opj_tcd_tile_t *tile, - opj_tcp_t *tcp) -{ - int compno, resno, bandno, precno, cblkno; - - tile->distotile = 0; /* fixed_quality */ - - for (compno = 0; compno < tile->numcomps; ++compno) { - opj_tcd_tilecomp_t* tilec = &tile->comps[compno]; - opj_tccp_t* tccp = &tcp->tccps[compno]; - int tile_w = tilec->x1 - tilec->x0; - - for (resno = 0; resno < tilec->numresolutions; ++resno) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - for (bandno = 0; bandno < res->numbands; ++bandno) { - opj_tcd_band_t* restrict band = &res->bands[bandno]; - - for (precno = 0; precno < res->pw * res->ph; ++precno) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) { - opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; - int* restrict datap; - int* restrict tiledp; - int cblk_w; - int cblk_h; - int i, j; - - int x = cblk->x0 - band->x0; - int y = cblk->y0 - band->y0; - if (band->bandno & 1) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x += pres->x1 - pres->x0; - } - if (band->bandno & 2) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - y += pres->y1 - pres->y0; - } - - if(!allocate_buffers( - t1, - cblk->x1 - cblk->x0, - cblk->y1 - cblk->y0)) - { - return; - } - - datap=t1->data; - cblk_w = t1->w; - cblk_h = t1->h; - - tiledp=&tilec->data[(y * tile_w) + x]; - if (tccp->qmfbid == 1) { - for (j = 0; j < cblk_h; ++j) { - for (i = 0; i < cblk_w; ++i) { - int tmp = tiledp[(j * tile_w) + i]; - datap[(j * cblk_w) + i] = tmp << T1_NMSEDEC_FRACBITS; - } - } - } else { /* if (tccp->qmfbid == 0) */ - for (j = 0; j < cblk_h; ++j) { - for (i = 0; i < cblk_w; ++i) { - int tmp = tiledp[(j * tile_w) + i]; - datap[(j * cblk_w) + i] = - fix_mul( - tmp, - 8192 * 8192 / ((int) floor(band->stepsize * 8192))) >> (11 - T1_NMSEDEC_FRACBITS); - } - } - } - - t1_encode_cblk( - t1, - cblk, - band->bandno, - compno, - tilec->numresolutions - 1 - resno, - tccp->qmfbid, - band->stepsize, - tccp->cblksty, - tile->numcomps, - tcp->mct, - tile); - - } /* cblkno */ - } /* precno */ - } /* bandno */ - } /* resno */ - } /* compno */ -} - -void t1_decode_cblks( - opj_t1_t* t1, - opj_tcd_tilecomp_t* tilec, - opj_tccp_t* tccp) -{ - int resno, bandno, precno, cblkno; - - int tile_w = tilec->x1 - tilec->x0; - - for (resno = 0; resno < tilec->numresolutions; ++resno) { - opj_tcd_resolution_t* res = &tilec->resolutions[resno]; - - for (bandno = 0; bandno < res->numbands; ++bandno) { - opj_tcd_band_t* restrict band = &res->bands[bandno]; - - for (precno = 0; precno < res->pw * res->ph; ++precno) { - opj_tcd_precinct_t* precinct = &band->precincts[precno]; - - for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) { - opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno]; - int* restrict datap; - void* restrict tiledp; - int cblk_w, cblk_h; - int x, y; - int i, j; - - t1_decode_cblk( - t1, - cblk, - band->bandno, - tccp->roishift, - tccp->cblksty); - - x = cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - if (band->bandno & 1) { - opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1]; - x += pres->x1 - pres->x0; - } - if (band->bandno & 2) { - opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1]; - y += pres->y1 - pres->y0; - } - - datap=t1->data; - cblk_w = t1->w; - cblk_h = t1->h; - - if (tccp->roishift) { - int thresh = 1 << tccp->roishift; - for (j = 0; j < cblk_h; ++j) { - for (i = 0; i < cblk_w; ++i) { - int val = datap[(j * cblk_w) + i]; - int mag = abs(val); - if (mag >= thresh) { - mag >>= tccp->roishift; - datap[(j * cblk_w) + i] = val < 0 ? -mag : mag; - } - } - } - } - - tiledp=(void*)&tilec->data[(y * tile_w) + x]; - if (tccp->qmfbid == 1) { - for (j = 0; j < cblk_h; ++j) { - for (i = 0; i < cblk_w; ++i) { - int tmp = datap[(j * cblk_w) + i]; - ((int*)tiledp)[(j * tile_w) + i] = tmp / 2; - } - } - } else { /* if (tccp->qmfbid == 0) */ - for (j = 0; j < cblk_h; ++j) { - for (i = 0; i < cblk_w; ++i) { - float tmp = datap[(j * cblk_w) + i] * band->stepsize; - ((float*)tiledp)[(j * tile_w) + i] = tmp; - } - } - } - opj_free(cblk->data); - opj_free(cblk->segs); - } /* cblkno */ - opj_free(precinct->cblks.dec); - } /* precno */ - } /* bandno */ - } /* resno */ -} - +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2007, Callum Lerwick + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#include "opj_includes.h" +#include "t1_luts.h" + +/** @defgroup T1 T1 - Implementation of the tier-1 coding */ +/*@{*/ + +/** @name Local static functions */ +/*@{*/ + +static INLINE char t1_getctxno_zc(int f, int orient); +static char t1_getctxno_sc(int f); +static INLINE int t1_getctxno_mag(int f); +static char t1_getspb(int f); +static short t1_getnmsedec_sig(int x, int bitpos); +static short t1_getnmsedec_ref(int x, int bitpos); +static void t1_updateflags(flag_t *flagsp, int s, int stride); +/** +Encode significant pass +*/ +static void t1_enc_sigpass_step( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int bpno, + int one, + int *nmsedec, + char type, + int vsc); +/** +Decode significant pass +*/ +static INLINE void t1_dec_sigpass_step_raw( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf, + int vsc); +static INLINE void t1_dec_sigpass_step_mqc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf); +static INLINE void t1_dec_sigpass_step_mqc_vsc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf, + int vsc); +/** +Encode significant pass +*/ +static void t1_enc_sigpass( + opj_t1_t *t1, + int bpno, + int orient, + int *nmsedec, + char type, + int cblksty); +/** +Decode significant pass +*/ +static void t1_dec_sigpass_raw( + opj_t1_t *t1, + int bpno, + int orient, + int cblksty); +static void t1_dec_sigpass_mqc( + opj_t1_t *t1, + int bpno, + int orient); +static void t1_dec_sigpass_mqc_vsc( + opj_t1_t *t1, + int bpno, + int orient); +/** +Encode refinement pass +*/ +static void t1_enc_refpass_step( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int bpno, + int one, + int *nmsedec, + char type, + int vsc); +/** +Decode refinement pass +*/ +static INLINE void t1_dec_refpass_step_raw( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int poshalf, + int neghalf, + int vsc); +static INLINE void t1_dec_refpass_step_mqc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int poshalf, + int neghalf); +static INLINE void t1_dec_refpass_step_mqc_vsc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int poshalf, + int neghalf, + int vsc); + +/** +Encode refinement pass +*/ +static void t1_enc_refpass( + opj_t1_t *t1, + int bpno, + int *nmsedec, + char type, + int cblksty); +/** +Decode refinement pass +*/ +static void t1_dec_refpass_raw( + opj_t1_t *t1, + int bpno, + int cblksty); +static void t1_dec_refpass_mqc( + opj_t1_t *t1, + int bpno); +static void t1_dec_refpass_mqc_vsc( + opj_t1_t *t1, + int bpno); +/** +Encode clean-up pass +*/ +static void t1_enc_clnpass_step( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int bpno, + int one, + int *nmsedec, + int partial, + int vsc); +/** +Decode clean-up pass +*/ +static void t1_dec_clnpass_step_partial( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf); +static void t1_dec_clnpass_step( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf); +static void t1_dec_clnpass_step_vsc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf, + int partial, + int vsc); +/** +Encode clean-up pass +*/ +static void t1_enc_clnpass( + opj_t1_t *t1, + int bpno, + int orient, + int *nmsedec, + int cblksty); +/** +Decode clean-up pass +*/ +static void t1_dec_clnpass( + opj_t1_t *t1, + int bpno, + int orient, + int cblksty); +static double t1_getwmsedec( + int nmsedec, + int compno, + int level, + int orient, + int bpno, + int qmfbid, + double stepsize, + int numcomps, + int mct); +/** +Encode 1 code-block +@param t1 T1 handle +@param cblk Code-block coding parameters +@param orient +@param compno Component number +@param level +@param qmfbid +@param stepsize +@param cblksty Code-block style +@param numcomps +@param mct +@param tile +*/ +static void t1_encode_cblk( + opj_t1_t *t1, + opj_tcd_cblk_enc_t* cblk, + int orient, + int compno, + int level, + int qmfbid, + double stepsize, + int cblksty, + int numcomps, + int mct, + opj_tcd_tile_t * tile); +/** +Decode 1 code-block +@param t1 T1 handle +@param cblk Code-block coding parameters +@param orient +@param roishift Region of interest shifting value +@param cblksty Code-block style +*/ +static void t1_decode_cblk( + opj_t1_t *t1, + opj_tcd_cblk_dec_t* cblk, + int orient, + int roishift, + int cblksty); + +/*@}*/ + +/*@}*/ + +/* ----------------------------------------------------------------------- */ + +static char t1_getctxno_zc(int f, int orient) { + return lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)]; +} + +static char t1_getctxno_sc(int f) { + return lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4]; +} + +static int t1_getctxno_mag(int f) { + int tmp1 = (f & T1_SIG_OTH) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG; + int tmp2 = (f & T1_REFINE) ? T1_CTXNO_MAG + 2 : tmp1; + return (tmp2); +} + +static char t1_getspb(int f) { + return lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4]; +} + +static short t1_getnmsedec_sig(int x, int bitpos) { + if (bitpos > T1_NMSEDEC_FRACBITS) { + return lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)]; + } + + return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; +} + +static short t1_getnmsedec_ref(int x, int bitpos) { + if (bitpos > T1_NMSEDEC_FRACBITS) { + return lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)]; + } + + return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; +} + +static void t1_updateflags(flag_t *flagsp, int s, int stride) { + flag_t *np = flagsp - stride; + flag_t *sp = flagsp + stride; + + static const flag_t mod[] = { + T1_SIG_S, T1_SIG_S|T1_SGN_S, + T1_SIG_E, T1_SIG_E|T1_SGN_E, + T1_SIG_W, T1_SIG_W|T1_SGN_W, + T1_SIG_N, T1_SIG_N|T1_SGN_N + }; + + np[-1] |= T1_SIG_SE; + np[0] |= mod[s]; + np[1] |= T1_SIG_SW; + + flagsp[-1] |= mod[s+2]; + flagsp[0] |= T1_SIG; + flagsp[1] |= mod[s+4]; + + sp[-1] |= T1_SIG_NE; + sp[0] |= mod[s+6]; + sp[1] |= T1_SIG_NW; +} + +static void t1_enc_sigpass_step( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int bpno, + int one, + int *nmsedec, + char type, + int vsc) +{ + int v, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); + if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { + v = int_abs(*datap) & one ? 1 : 0; + mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); /* ESSAI */ + if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ + mqc_bypass_enc(mqc, v); + } else { + mqc_encode(mqc, v); + } + if (v) { + v = *datap < 0 ? 1 : 0; + *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS); + mqc_setcurctx(mqc, t1_getctxno_sc(flag)); /* ESSAI */ + if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ + mqc_bypass_enc(mqc, v); + } else { + mqc_encode(mqc, v ^ t1_getspb(flag)); + } + t1_updateflags(flagsp, v, t1->flags_stride); + } + *flagsp |= T1_VISIT; + } +} + +static INLINE void t1_dec_sigpass_step_raw( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf, + int vsc) +{ + int v, flag; + opj_raw_t *raw = t1->raw; /* RAW component */ + + OPJ_ARG_NOT_USED(orient); + + flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); + if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { + if (raw_decode(raw)) { + v = raw_decode(raw); /* ESSAI */ + *datap = v ? -oneplushalf : oneplushalf; + t1_updateflags(flagsp, v, t1->flags_stride); + } + *flagsp |= T1_VISIT; + } +} /* VSC and BYPASS by Antonin */ + +static INLINE void t1_dec_sigpass_step_mqc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf) +{ + int v, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = *flagsp; + if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { + mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); + if (mqc_decode(mqc)) { + mqc_setcurctx(mqc, t1_getctxno_sc(flag)); + v = mqc_decode(mqc) ^ t1_getspb(flag); + *datap = v ? -oneplushalf : oneplushalf; + t1_updateflags(flagsp, v, t1->flags_stride); + } + *flagsp |= T1_VISIT; + } +} /* VSC and BYPASS by Antonin */ + +static INLINE void t1_dec_sigpass_step_mqc_vsc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf, + int vsc) +{ + int v, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); + if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { + mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); + if (mqc_decode(mqc)) { + mqc_setcurctx(mqc, t1_getctxno_sc(flag)); + v = mqc_decode(mqc) ^ t1_getspb(flag); + *datap = v ? -oneplushalf : oneplushalf; + t1_updateflags(flagsp, v, t1->flags_stride); + } + *flagsp |= T1_VISIT; + } +} /* VSC and BYPASS by Antonin */ + +static void t1_enc_sigpass( + opj_t1_t *t1, + int bpno, + int orient, + int *nmsedec, + char type, + int cblksty) +{ + int i, j, k, one, vsc; + *nmsedec = 0; + one = 1 << (bpno + T1_NMSEDEC_FRACBITS); + for (k = 0; k < t1->h; k += 4) { + for (i = 0; i < t1->w; ++i) { + for (j = k; j < k + 4 && j < t1->h; ++j) { + vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; + t1_enc_sigpass_step( + t1, + &t1->flags[((j+1) * t1->flags_stride) + i + 1], + &t1->data[(j * t1->w) + i], + orient, + bpno, + one, + nmsedec, + type, + vsc); + } + } + } +} + +static void t1_dec_sigpass_raw( + opj_t1_t *t1, + int bpno, + int orient, + int cblksty) +{ + int i, j, k, one, half, oneplushalf, vsc; + one = 1 << bpno; + half = one >> 1; + oneplushalf = one | half; + for (k = 0; k < t1->h; k += 4) { + for (i = 0; i < t1->w; ++i) { + for (j = k; j < k + 4 && j < t1->h; ++j) { + vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; + t1_dec_sigpass_step_raw( + t1, + &t1->flags[((j+1) * t1->flags_stride) + i + 1], + &t1->data[(j * t1->w) + i], + orient, + oneplushalf, + vsc); + } + } + } +} /* VSC and BYPASS by Antonin */ + +static void t1_dec_sigpass_mqc( + opj_t1_t *t1, + int bpno, + int orient) +{ + int i, j, k, one, half, oneplushalf; + int *data1 = t1->data; + flag_t *flags1 = &t1->flags[1]; + one = 1 << bpno; + half = one >> 1; + oneplushalf = one | half; + for (k = 0; k < (t1->h & ~3); k += 4) { + for (i = 0; i < t1->w; ++i) { + int *data2 = data1 + i; + flag_t *flags2 = flags1 + i; + flags2 += t1->flags_stride; + t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + flags2 += t1->flags_stride; + t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + flags2 += t1->flags_stride; + t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + flags2 += t1->flags_stride; + t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + } + data1 += t1->w << 2; + flags1 += t1->flags_stride << 2; + } + for (i = 0; i < t1->w; ++i) { + int *data2 = data1 + i; + flag_t *flags2 = flags1 + i; + for (j = k; j < t1->h; ++j) { + flags2 += t1->flags_stride; + t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + } + } +} /* VSC and BYPASS by Antonin */ + +static void t1_dec_sigpass_mqc_vsc( + opj_t1_t *t1, + int bpno, + int orient) +{ + int i, j, k, one, half, oneplushalf, vsc; + one = 1 << bpno; + half = one >> 1; + oneplushalf = one | half; + for (k = 0; k < t1->h; k += 4) { + for (i = 0; i < t1->w; ++i) { + for (j = k; j < k + 4 && j < t1->h; ++j) { + vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0; + t1_dec_sigpass_step_mqc_vsc( + t1, + &t1->flags[((j+1) * t1->flags_stride) + i + 1], + &t1->data[(j * t1->w) + i], + orient, + oneplushalf, + vsc); + } + } + } +} /* VSC and BYPASS by Antonin */ + +static void t1_enc_refpass_step( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int bpno, + int one, + int *nmsedec, + char type, + int vsc) +{ + int v, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); + if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { + *nmsedec += t1_getnmsedec_ref(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS); + v = int_abs(*datap) & one ? 1 : 0; + mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */ + if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ + mqc_bypass_enc(mqc, v); + } else { + mqc_encode(mqc, v); + } + *flagsp |= T1_REFINE; + } +} + +static INLINE void t1_dec_refpass_step_raw( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int poshalf, + int neghalf, + int vsc) +{ + int v, t, flag; + + opj_raw_t *raw = t1->raw; /* RAW component */ + + flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); + if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { + v = raw_decode(raw); + t = v ? poshalf : neghalf; + *datap += *datap < 0 ? -t : t; + *flagsp |= T1_REFINE; + } +} /* VSC and BYPASS by Antonin */ + +static INLINE void t1_dec_refpass_step_mqc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int poshalf, + int neghalf) +{ + int v, t, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = *flagsp; + if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { + mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */ + v = mqc_decode(mqc); + t = v ? poshalf : neghalf; + *datap += *datap < 0 ? -t : t; + *flagsp |= T1_REFINE; + } +} /* VSC and BYPASS by Antonin */ + +static INLINE void t1_dec_refpass_step_mqc_vsc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int poshalf, + int neghalf, + int vsc) +{ + int v, t, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); + if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { + mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */ + v = mqc_decode(mqc); + t = v ? poshalf : neghalf; + *datap += *datap < 0 ? -t : t; + *flagsp |= T1_REFINE; + } +} /* VSC and BYPASS by Antonin */ + +static void t1_enc_refpass( + opj_t1_t *t1, + int bpno, + int *nmsedec, + char type, + int cblksty) +{ + int i, j, k, one, vsc; + *nmsedec = 0; + one = 1 << (bpno + T1_NMSEDEC_FRACBITS); + for (k = 0; k < t1->h; k += 4) { + for (i = 0; i < t1->w; ++i) { + for (j = k; j < k + 4 && j < t1->h; ++j) { + vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; + t1_enc_refpass_step( + t1, + &t1->flags[((j+1) * t1->flags_stride) + i + 1], + &t1->data[(j * t1->w) + i], + bpno, + one, + nmsedec, + type, + vsc); + } + } + } +} + +static void t1_dec_refpass_raw( + opj_t1_t *t1, + int bpno, + int cblksty) +{ + int i, j, k, one, poshalf, neghalf; + int vsc; + one = 1 << bpno; + poshalf = one >> 1; + neghalf = bpno > 0 ? -poshalf : -1; + for (k = 0; k < t1->h; k += 4) { + for (i = 0; i < t1->w; ++i) { + for (j = k; j < k + 4 && j < t1->h; ++j) { + vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; + t1_dec_refpass_step_raw( + t1, + &t1->flags[((j+1) * t1->flags_stride) + i + 1], + &t1->data[(j * t1->w) + i], + poshalf, + neghalf, + vsc); + } + } + } +} /* VSC and BYPASS by Antonin */ + +static void t1_dec_refpass_mqc( + opj_t1_t *t1, + int bpno) +{ + int i, j, k, one, poshalf, neghalf; + int *data1 = t1->data; + flag_t *flags1 = &t1->flags[1]; + one = 1 << bpno; + poshalf = one >> 1; + neghalf = bpno > 0 ? -poshalf : -1; + for (k = 0; k < (t1->h & ~3); k += 4) { + for (i = 0; i < t1->w; ++i) { + int *data2 = data1 + i; + flag_t *flags2 = flags1 + i; + flags2 += t1->flags_stride; + t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); + data2 += t1->w; + flags2 += t1->flags_stride; + t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); + data2 += t1->w; + flags2 += t1->flags_stride; + t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); + data2 += t1->w; + flags2 += t1->flags_stride; + t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); + data2 += t1->w; + } + data1 += t1->w << 2; + flags1 += t1->flags_stride << 2; + } + for (i = 0; i < t1->w; ++i) { + int *data2 = data1 + i; + flag_t *flags2 = flags1 + i; + for (j = k; j < t1->h; ++j) { + flags2 += t1->flags_stride; + t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); + data2 += t1->w; + } + } +} /* VSC and BYPASS by Antonin */ + +static void t1_dec_refpass_mqc_vsc( + opj_t1_t *t1, + int bpno) +{ + int i, j, k, one, poshalf, neghalf; + int vsc; + one = 1 << bpno; + poshalf = one >> 1; + neghalf = bpno > 0 ? -poshalf : -1; + for (k = 0; k < t1->h; k += 4) { + for (i = 0; i < t1->w; ++i) { + for (j = k; j < k + 4 && j < t1->h; ++j) { + vsc = ((j == k + 3 || j == t1->h - 1)) ? 1 : 0; + t1_dec_refpass_step_mqc_vsc( + t1, + &t1->flags[((j+1) * t1->flags_stride) + i + 1], + &t1->data[(j * t1->w) + i], + poshalf, + neghalf, + vsc); + } + } + } +} /* VSC and BYPASS by Antonin */ + +static void t1_enc_clnpass_step( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int bpno, + int one, + int *nmsedec, + int partial, + int vsc) +{ + int v, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); + if (partial) { + goto LABEL_PARTIAL; + } + if (!(*flagsp & (T1_SIG | T1_VISIT))) { + mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); + v = int_abs(*datap) & one ? 1 : 0; + mqc_encode(mqc, v); + if (v) { +LABEL_PARTIAL: + *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS); + mqc_setcurctx(mqc, t1_getctxno_sc(flag)); + v = *datap < 0 ? 1 : 0; + mqc_encode(mqc, v ^ t1_getspb(flag)); + t1_updateflags(flagsp, v, t1->flags_stride); + } + } + *flagsp &= ~T1_VISIT; +} + +static void t1_dec_clnpass_step_partial( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf) +{ + int v, flag; + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + OPJ_ARG_NOT_USED(orient); + + flag = *flagsp; + mqc_setcurctx(mqc, t1_getctxno_sc(flag)); + v = mqc_decode(mqc) ^ t1_getspb(flag); + *datap = v ? -oneplushalf : oneplushalf; + t1_updateflags(flagsp, v, t1->flags_stride); + *flagsp &= ~T1_VISIT; +} /* VSC and BYPASS by Antonin */ + +static void t1_dec_clnpass_step( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf) +{ + int v, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = *flagsp; + if (!(flag & (T1_SIG | T1_VISIT))) { + mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); + if (mqc_decode(mqc)) { + mqc_setcurctx(mqc, t1_getctxno_sc(flag)); + v = mqc_decode(mqc) ^ t1_getspb(flag); + *datap = v ? -oneplushalf : oneplushalf; + t1_updateflags(flagsp, v, t1->flags_stride); + } + } + *flagsp &= ~T1_VISIT; +} /* VSC and BYPASS by Antonin */ + +static void t1_dec_clnpass_step_vsc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf, + int partial, + int vsc) +{ + int v, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); + if (partial) { + goto LABEL_PARTIAL; + } + if (!(flag & (T1_SIG | T1_VISIT))) { + mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); + if (mqc_decode(mqc)) { +LABEL_PARTIAL: + mqc_setcurctx(mqc, t1_getctxno_sc(flag)); + v = mqc_decode(mqc) ^ t1_getspb(flag); + *datap = v ? -oneplushalf : oneplushalf; + t1_updateflags(flagsp, v, t1->flags_stride); + } + } + *flagsp &= ~T1_VISIT; +} + +static void t1_enc_clnpass( + opj_t1_t *t1, + int bpno, + int orient, + int *nmsedec, + int cblksty) +{ + int i, j, k, one, agg, runlen, vsc; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + *nmsedec = 0; + one = 1 << (bpno + T1_NMSEDEC_FRACBITS); + for (k = 0; k < t1->h; k += 4) { + for (i = 0; i < t1->w; ++i) { + if (k + 3 < t1->h) { + if (cblksty & J2K_CCP_CBLKSTY_VSC) { + agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || (MACRO_t1_flags(1 + k + 3,1 + i) + & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); + } else { + agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); + } + } else { + agg = 0; + } + if (agg) { + for (runlen = 0; runlen < 4; ++runlen) { + if (int_abs(t1->data[((k + runlen)*t1->w) + i]) & one) + break; + } + mqc_setcurctx(mqc, T1_CTXNO_AGG); + mqc_encode(mqc, runlen != 4); + if (runlen == 4) { + continue; + } + mqc_setcurctx(mqc, T1_CTXNO_UNI); + mqc_encode(mqc, runlen >> 1); + mqc_encode(mqc, runlen & 1); + } else { + runlen = 0; + } + for (j = k + runlen; j < k + 4 && j < t1->h; ++j) { + vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; + t1_enc_clnpass_step( + t1, + &t1->flags[((j+1) * t1->flags_stride) + i + 1], + &t1->data[(j * t1->w) + i], + orient, + bpno, + one, + nmsedec, + agg && (j == k + runlen), + vsc); + } + } + } +} + +static void t1_dec_clnpass( + opj_t1_t *t1, + int bpno, + int orient, + int cblksty) +{ + int i, j, k, one, half, oneplushalf, agg, runlen, vsc; + int segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + one = 1 << bpno; + half = one >> 1; + oneplushalf = one | half; + if (cblksty & J2K_CCP_CBLKSTY_VSC) { + for (k = 0; k < t1->h; k += 4) { + for (i = 0; i < t1->w; ++i) { + if (k + 3 < t1->h) { + agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || (MACRO_t1_flags(1 + k + 3,1 + i) + & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); + } else { + agg = 0; + } + if (agg) { + mqc_setcurctx(mqc, T1_CTXNO_AGG); + if (!mqc_decode(mqc)) { + continue; + } + mqc_setcurctx(mqc, T1_CTXNO_UNI); + runlen = mqc_decode(mqc); + runlen = (runlen << 1) | mqc_decode(mqc); + } else { + runlen = 0; + } + for (j = k + runlen; j < k + 4 && j < t1->h; ++j) { + vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0; + t1_dec_clnpass_step_vsc( + t1, + &t1->flags[((j+1) * t1->flags_stride) + i + 1], + &t1->data[(j * t1->w) + i], + orient, + oneplushalf, + agg && (j == k + runlen), + vsc); + } + } + } + } else { + int *data1 = t1->data; + flag_t *flags1 = &t1->flags[1]; + for (k = 0; k < (t1->h & ~3); k += 4) { + for (i = 0; i < t1->w; ++i) { + int *data2 = data1 + i; + flag_t *flags2 = flags1 + i; + agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); + if (agg) { + mqc_setcurctx(mqc, T1_CTXNO_AGG); + if (!mqc_decode(mqc)) { + continue; + } + mqc_setcurctx(mqc, T1_CTXNO_UNI); + runlen = mqc_decode(mqc); + runlen = (runlen << 1) | mqc_decode(mqc); + flags2 += runlen * t1->flags_stride; + data2 += runlen * t1->w; + for (j = k + runlen; j < k + 4 && j < t1->h; ++j) { + flags2 += t1->flags_stride; + if (agg && (j == k + runlen)) { + t1_dec_clnpass_step_partial(t1, flags2, data2, orient, oneplushalf); + } else { + t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); + } + data2 += t1->w; + } + } else { + flags2 += t1->flags_stride; + t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + flags2 += t1->flags_stride; + t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + flags2 += t1->flags_stride; + t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + flags2 += t1->flags_stride; + t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + } + } + data1 += t1->w << 2; + flags1 += t1->flags_stride << 2; + } + for (i = 0; i < t1->w; ++i) { + int *data2 = data1 + i; + flag_t *flags2 = flags1 + i; + for (j = k; j < t1->h; ++j) { + flags2 += t1->flags_stride; + t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + } + } + } + + if (segsym) { + int v = 0; + mqc_setcurctx(mqc, T1_CTXNO_UNI); + v = mqc_decode(mqc); + v = (v << 1) | mqc_decode(mqc); + v = (v << 1) | mqc_decode(mqc); + v = (v << 1) | mqc_decode(mqc); + /* + if (v!=0xa) { + opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v); + } + */ + } +} /* VSC and BYPASS by Antonin */ + + +/** mod fixed_quality */ +static double t1_getwmsedec( + int nmsedec, + int compno, + int level, + int orient, + int bpno, + int qmfbid, + double stepsize, + int numcomps, + int mct) +{ + double w1, w2, wmsedec; + if (qmfbid == 1) { + w1 = (mct && numcomps==3) ? mct_getnorm(compno) : 1.0; + w2 = dwt_getnorm(level, orient); + } else { /* if (qmfbid == 0) */ + w1 = (mct && numcomps==3) ? mct_getnorm_real(compno) : 1.0; + w2 = dwt_getnorm_real(level, orient); + } + wmsedec = w1 * w2 * stepsize * (1 << bpno); + wmsedec *= wmsedec * nmsedec / 8192.0; + + return wmsedec; +} + +static opj_bool allocate_buffers( + opj_t1_t *t1, + int w, + int h) +{ + int datasize=w * h; + int flagssize; + + if(datasize > t1->datasize){ + opj_aligned_free(t1->data); + t1->data = (int*) opj_aligned_malloc(datasize * sizeof(int)); + if(!t1->data){ + return OPJ_FALSE; + } + t1->datasize=datasize; + } + memset(t1->data,0,datasize * sizeof(int)); + + t1->flags_stride=w+2; + flagssize=t1->flags_stride * (h+2); + + if(flagssize > t1->flagssize){ + opj_aligned_free(t1->flags); + t1->flags = (flag_t*) opj_aligned_malloc(flagssize * sizeof(flag_t)); + if(!t1->flags){ + return OPJ_FALSE; + } + t1->flagssize=flagssize; + } + memset(t1->flags,0,flagssize * sizeof(flag_t)); + + t1->w=w; + t1->h=h; + + return OPJ_TRUE; +} + +/** mod fixed_quality */ +static void t1_encode_cblk( + opj_t1_t *t1, + opj_tcd_cblk_enc_t* cblk, + int orient, + int compno, + int level, + int qmfbid, + double stepsize, + int cblksty, + int numcomps, + int mct, + opj_tcd_tile_t * tile) +{ + double cumwmsedec = 0.0; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + int passno, bpno, passtype; + int nmsedec = 0; + int i, max; + char type = T1_TYPE_MQ; + double tempwmsedec; + + max = 0; + for (i = 0; i < t1->w * t1->h; ++i) { + int tmp = abs(t1->data[i]); + max = int_max(max, tmp); + } + + cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0; + + bpno = cblk->numbps - 1; + passtype = 2; + + mqc_resetstates(mqc); + mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); + mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); + mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); + mqc_init_enc(mqc, cblk->data); + + for (passno = 0; bpno >= 0; ++passno) { + opj_tcd_pass_t *pass = &cblk->passes[passno]; + int correction = 3; + type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; + + switch (passtype) { + case 0: + t1_enc_sigpass(t1, bpno, orient, &nmsedec, type, cblksty); + break; + case 1: + t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty); + break; + case 2: + t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty); + /* code switch SEGMARK (i.e. SEGSYM) */ + if (cblksty & J2K_CCP_CBLKSTY_SEGSYM) + mqc_segmark_enc(mqc); + break; + } + + /* fixed_quality */ + tempwmsedec = t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps, mct); + cumwmsedec += tempwmsedec; + tile->distotile += tempwmsedec; + + /* Code switch "RESTART" (i.e. TERMALL) */ + if ((cblksty & J2K_CCP_CBLKSTY_TERMALL) && !((passtype == 2) && (bpno - 1 < 0))) { + if (type == T1_TYPE_RAW) { + mqc_flush(mqc); + correction = 1; + /* correction = mqc_bypass_flush_enc(); */ + } else { /* correction = mqc_restart_enc(); */ + mqc_flush(mqc); + correction = 1; + } + pass->term = 1; + } else { + if (((bpno < (cblk->numbps - 4) && (passtype > 0)) + || ((bpno == (cblk->numbps - 4)) && (passtype == 2))) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) { + if (type == T1_TYPE_RAW) { + mqc_flush(mqc); + correction = 1; + /* correction = mqc_bypass_flush_enc(); */ + } else { /* correction = mqc_restart_enc(); */ + mqc_flush(mqc); + correction = 1; + } + pass->term = 1; + } else { + pass->term = 0; + } + } + + if (++passtype == 3) { + passtype = 0; + bpno--; + } + + if (pass->term && bpno > 0) { + type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; + if (type == T1_TYPE_RAW) + mqc_bypass_init_enc(mqc); + else + mqc_restart_init_enc(mqc); + } + + pass->distortiondec = cumwmsedec; + pass->rate = mqc_numbytes(mqc) + correction; /* FIXME */ + + /* Code-switch "RESET" */ + if (cblksty & J2K_CCP_CBLKSTY_RESET) + mqc_reset_enc(mqc); + } + + /* Code switch "ERTERM" (i.e. PTERM) */ + if (cblksty & J2K_CCP_CBLKSTY_PTERM) + mqc_erterm_enc(mqc); + else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY)) + mqc_flush(mqc); + + cblk->totalpasses = passno; + + for (passno = 0; passnototalpasses; passno++) { + opj_tcd_pass_t *pass = &cblk->passes[passno]; + if (pass->rate > mqc_numbytes(mqc)) + pass->rate = mqc_numbytes(mqc); + /*Preventing generation of FF as last data byte of a pass*/ + if((pass->rate>1) && (cblk->data[pass->rate - 1] == 0xFF)){ + pass->rate--; + } + pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate); + } +} + +static void t1_decode_cblk( + opj_t1_t *t1, + opj_tcd_cblk_dec_t* cblk, + int orient, + int roishift, + int cblksty) +{ + opj_raw_t *raw = t1->raw; /* RAW component */ + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + int bpno, passtype; + int segno, passno; + char type = T1_TYPE_MQ; /* BYPASS mode */ + + if(!allocate_buffers( + t1, + cblk->x1 - cblk->x0, + cblk->y1 - cblk->y0)) + { + return; + } + + bpno = roishift + cblk->numbps - 1; + passtype = 2; + + mqc_resetstates(mqc); + mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); + mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); + mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); + + for (segno = 0; segno < cblk->numsegs; ++segno) { + opj_tcd_seg_t *seg = &cblk->segs[segno]; + + /* BYPASS mode */ + type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; + /* FIXME: slviewer gets here with a null pointer. Why? Partially downloaded and/or corrupt textures? */ + if(seg->data == NULL){ + continue; + } + if (type == T1_TYPE_RAW) { + raw_init_dec(raw, (*seg->data) + seg->dataindex, seg->len); + } else { + mqc_init_dec(mqc, (*seg->data) + seg->dataindex, seg->len); + } + + for (passno = 0; passno < seg->numpasses; ++passno) { + switch (passtype) { + case 0: + if (type == T1_TYPE_RAW) { + t1_dec_sigpass_raw(t1, bpno+1, orient, cblksty); + } else { + if (cblksty & J2K_CCP_CBLKSTY_VSC) { + t1_dec_sigpass_mqc_vsc(t1, bpno+1, orient); + } else { + t1_dec_sigpass_mqc(t1, bpno+1, orient); + } + } + break; + case 1: + if (type == T1_TYPE_RAW) { + t1_dec_refpass_raw(t1, bpno+1, cblksty); + } else { + if (cblksty & J2K_CCP_CBLKSTY_VSC) { + t1_dec_refpass_mqc_vsc(t1, bpno+1); + } else { + t1_dec_refpass_mqc(t1, bpno+1); + } + } + break; + case 2: + t1_dec_clnpass(t1, bpno+1, orient, cblksty); + break; + } + + if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) { + mqc_resetstates(mqc); + mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); + mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); + mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); + } + if (++passtype == 3) { + passtype = 0; + bpno--; + } + } + } +} + +/* ----------------------------------------------------------------------- */ + +opj_t1_t* t1_create(opj_common_ptr cinfo) { + opj_t1_t *t1 = (opj_t1_t*) opj_malloc(sizeof(opj_t1_t)); + if(!t1) + return NULL; + + t1->cinfo = cinfo; + /* create MQC and RAW handles */ + t1->mqc = mqc_create(); + t1->raw = raw_create(); + + t1->data=NULL; + t1->flags=NULL; + t1->datasize=0; + t1->flagssize=0; + + return t1; +} + +void t1_destroy(opj_t1_t *t1) { + if(t1) { + /* destroy MQC and RAW handles */ + mqc_destroy(t1->mqc); + raw_destroy(t1->raw); + opj_aligned_free(t1->data); + opj_aligned_free(t1->flags); + opj_free(t1); + } +} + +void t1_encode_cblks( + opj_t1_t *t1, + opj_tcd_tile_t *tile, + opj_tcp_t *tcp) +{ + int compno, resno, bandno, precno, cblkno; + + tile->distotile = 0; /* fixed_quality */ + + for (compno = 0; compno < tile->numcomps; ++compno) { + opj_tcd_tilecomp_t* tilec = &tile->comps[compno]; + opj_tccp_t* tccp = &tcp->tccps[compno]; + int tile_w = tilec->x1 - tilec->x0; + + for (resno = 0; resno < tilec->numresolutions; ++resno) { + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + + for (bandno = 0; bandno < res->numbands; ++bandno) { + opj_tcd_band_t* restrict band = &res->bands[bandno]; + int bandconst = 8192 * 8192 / ((int) floor(band->stepsize * 8192)); + + for (precno = 0; precno < res->pw * res->ph; ++precno) { + opj_tcd_precinct_t *prc = &band->precincts[precno]; + + for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) { + opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; + int* restrict datap; + int* restrict tiledp; + int cblk_w; + int cblk_h; + int i, j; + + int x = cblk->x0 - band->x0; + int y = cblk->y0 - band->y0; + if (band->bandno & 1) { + opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; + x += pres->x1 - pres->x0; + } + if (band->bandno & 2) { + opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; + y += pres->y1 - pres->y0; + } + + if(!allocate_buffers( + t1, + cblk->x1 - cblk->x0, + cblk->y1 - cblk->y0)) + { + return; + } + + datap=t1->data; + cblk_w = t1->w; + cblk_h = t1->h; + + tiledp=&tilec->data[(y * tile_w) + x]; + if (tccp->qmfbid == 1) { + for (j = 0; j < cblk_h; ++j) { + for (i = 0; i < cblk_w; ++i) { + int tmp = tiledp[(j * tile_w) + i]; + datap[(j * cblk_w) + i] = tmp << T1_NMSEDEC_FRACBITS; + } + } + } else { /* if (tccp->qmfbid == 0) */ + for (j = 0; j < cblk_h; ++j) { + for (i = 0; i < cblk_w; ++i) { + int tmp = tiledp[(j * tile_w) + i]; + datap[(j * cblk_w) + i] = + fix_mul( + tmp, + bandconst) >> (11 - T1_NMSEDEC_FRACBITS); + } + } + } + + t1_encode_cblk( + t1, + cblk, + band->bandno, + compno, + tilec->numresolutions - 1 - resno, + tccp->qmfbid, + band->stepsize, + tccp->cblksty, + tile->numcomps, + tcp->mct, + tile); + + } /* cblkno */ + } /* precno */ + } /* bandno */ + } /* resno */ + } /* compno */ +} + +void t1_decode_cblks( + opj_t1_t* t1, + opj_tcd_tilecomp_t* tilec, + opj_tccp_t* tccp) +{ + int resno, bandno, precno, cblkno; + + int tile_w = tilec->x1 - tilec->x0; + + for (resno = 0; resno < tilec->numresolutions; ++resno) { + opj_tcd_resolution_t* res = &tilec->resolutions[resno]; + + for (bandno = 0; bandno < res->numbands; ++bandno) { + opj_tcd_band_t* restrict band = &res->bands[bandno]; + + for (precno = 0; precno < res->pw * res->ph; ++precno) { + opj_tcd_precinct_t* precinct = &band->precincts[precno]; + + for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) { + opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno]; + int* restrict datap; + int cblk_w, cblk_h; + int x, y; + int i, j; + + t1_decode_cblk( + t1, + cblk, + band->bandno, + tccp->roishift, + tccp->cblksty); + + x = cblk->x0 - band->x0; + y = cblk->y0 - band->y0; + if (band->bandno & 1) { + opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1]; + x += pres->x1 - pres->x0; + } + if (band->bandno & 2) { + opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1]; + y += pres->y1 - pres->y0; + } + + datap=t1->data; + cblk_w = t1->w; + cblk_h = t1->h; + + if (tccp->roishift) { + int thresh = 1 << tccp->roishift; + for (j = 0; j < cblk_h; ++j) { + for (i = 0; i < cblk_w; ++i) { + int val = datap[(j * cblk_w) + i]; + int mag = abs(val); + if (mag >= thresh) { + mag >>= tccp->roishift; + datap[(j * cblk_w) + i] = val < 0 ? -mag : mag; + } + } + } + } + + if (tccp->qmfbid == 1) { + int* restrict tiledp = &tilec->data[(y * tile_w) + x]; + for (j = 0; j < cblk_h; ++j) { + for (i = 0; i < cblk_w; ++i) { + int tmp = datap[(j * cblk_w) + i]; + ((int*)tiledp)[(j * tile_w) + i] = tmp / 2; + } + } + } else { /* if (tccp->qmfbid == 0) */ + float* restrict tiledp = (float*) &tilec->data[(y * tile_w) + x]; + for (j = 0; j < cblk_h; ++j) { + float* restrict tiledp2 = tiledp; + for (i = 0; i < cblk_w; ++i) { + float tmp = *datap * band->stepsize; + *tiledp2 = tmp; + datap++; + tiledp2++; + } + tiledp += tile_w; + } + } + opj_free(cblk->data); + opj_free(cblk->segs); + } /* cblkno */ + opj_free(precinct->cblks.dec); + } /* precno */ + } /* bandno */ + } /* resno */ +} + diff --git a/openjpeg-dotnet/libopenjpeg/t1.h b/openjpeg-dotnet/libopenjpeg/t1.h index f9500f8d..572ec88d 100644 --- a/openjpeg-dotnet/libopenjpeg/t1.h +++ b/openjpeg-dotnet/libopenjpeg/t1.h @@ -1,147 +1,147 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ -#ifndef __T1_H -#define __T1_H -/** -@file t1.h -@brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1) - -The functions in T1.C have for goal to realize the tier-1 coding operation. The functions -in T1.C are used by some function in TCD.C. -*/ - -/** @defgroup T1 T1 - Implementation of the tier-1 coding */ -/*@{*/ - -/* ----------------------------------------------------------------------- */ -#define T1_NMSEDEC_BITS 7 - -#define T1_SIG_NE 0x0001 /**< Context orientation : North-East direction */ -#define T1_SIG_SE 0x0002 /**< Context orientation : South-East direction */ -#define T1_SIG_SW 0x0004 /**< Context orientation : South-West direction */ -#define T1_SIG_NW 0x0008 /**< Context orientation : North-West direction */ -#define T1_SIG_N 0x0010 /**< Context orientation : North direction */ -#define T1_SIG_E 0x0020 /**< Context orientation : East direction */ -#define T1_SIG_S 0x0040 /**< Context orientation : South direction */ -#define T1_SIG_W 0x0080 /**< Context orientation : West direction */ -#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW) -#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W) - -#define T1_SGN_N 0x0100 -#define T1_SGN_E 0x0200 -#define T1_SGN_S 0x0400 -#define T1_SGN_W 0x0800 -#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W) - -#define T1_SIG 0x1000 -#define T1_REFINE 0x2000 -#define T1_VISIT 0x4000 - -#define T1_NUMCTXS_ZC 9 -#define T1_NUMCTXS_SC 5 -#define T1_NUMCTXS_MAG 3 -#define T1_NUMCTXS_AGG 1 -#define T1_NUMCTXS_UNI 1 - -#define T1_CTXNO_ZC 0 -#define T1_CTXNO_SC (T1_CTXNO_ZC+T1_NUMCTXS_ZC) -#define T1_CTXNO_MAG (T1_CTXNO_SC+T1_NUMCTXS_SC) -#define T1_CTXNO_AGG (T1_CTXNO_MAG+T1_NUMCTXS_MAG) -#define T1_CTXNO_UNI (T1_CTXNO_AGG+T1_NUMCTXS_AGG) -#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI) - -#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1) - -#define T1_TYPE_MQ 0 /**< Normal coding using entropy coder */ -#define T1_TYPE_RAW 1 /**< No encoding the information is store under raw format in codestream (mode switch RAW)*/ - -/* ----------------------------------------------------------------------- */ - -typedef short flag_t; - -/** -Tier-1 coding (coding of code-block coefficients) -*/ -typedef struct opj_t1 { - /** codec context */ - opj_common_ptr cinfo; - - /** MQC component */ - opj_mqc_t *mqc; - /** RAW component */ - opj_raw_t *raw; - - int *data; - flag_t *flags; - int w; - int h; - int datasize; - int flagssize; - int flags_stride; -} opj_t1_t; - -#define MACRO_t1_flags(x,y) t1->flags[((x)*(t1->flags_stride))+(y)] - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a new T1 handle -and initialize the look-up tables of the Tier-1 coder/decoder -@return Returns a new T1 handle if successful, returns NULL otherwise -@see t1_init_luts -*/ -opj_t1_t* t1_create(opj_common_ptr cinfo); -/** -Destroy a previously created T1 handle -@param t1 T1 handle to destroy -*/ -void t1_destroy(opj_t1_t *t1); -/** -Encode the code-blocks of a tile -@param t1 T1 handle -@param tile The tile to encode -@param tcp Tile coding parameters -*/ -void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp); -/** -Decode the code-blocks of a tile -@param t1 T1 handle -@param tile The tile to decode -@param tcp Tile coding parameters -*/ -void t1_decode_cblks(opj_t1_t* t1, opj_tcd_tilecomp_t* tilec, opj_tccp_t* tccp); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __T1_H */ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ +#ifndef __T1_H +#define __T1_H +/** +@file t1.h +@brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1) + +The functions in T1.C have for goal to realize the tier-1 coding operation. The functions +in T1.C are used by some function in TCD.C. +*/ + +/** @defgroup T1 T1 - Implementation of the tier-1 coding */ +/*@{*/ + +/* ----------------------------------------------------------------------- */ +#define T1_NMSEDEC_BITS 7 + +#define T1_SIG_NE 0x0001 /**< Context orientation : North-East direction */ +#define T1_SIG_SE 0x0002 /**< Context orientation : South-East direction */ +#define T1_SIG_SW 0x0004 /**< Context orientation : South-West direction */ +#define T1_SIG_NW 0x0008 /**< Context orientation : North-West direction */ +#define T1_SIG_N 0x0010 /**< Context orientation : North direction */ +#define T1_SIG_E 0x0020 /**< Context orientation : East direction */ +#define T1_SIG_S 0x0040 /**< Context orientation : South direction */ +#define T1_SIG_W 0x0080 /**< Context orientation : West direction */ +#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW) +#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W) + +#define T1_SGN_N 0x0100 +#define T1_SGN_E 0x0200 +#define T1_SGN_S 0x0400 +#define T1_SGN_W 0x0800 +#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W) + +#define T1_SIG 0x1000 +#define T1_REFINE 0x2000 +#define T1_VISIT 0x4000 + +#define T1_NUMCTXS_ZC 9 +#define T1_NUMCTXS_SC 5 +#define T1_NUMCTXS_MAG 3 +#define T1_NUMCTXS_AGG 1 +#define T1_NUMCTXS_UNI 1 + +#define T1_CTXNO_ZC 0 +#define T1_CTXNO_SC (T1_CTXNO_ZC+T1_NUMCTXS_ZC) +#define T1_CTXNO_MAG (T1_CTXNO_SC+T1_NUMCTXS_SC) +#define T1_CTXNO_AGG (T1_CTXNO_MAG+T1_NUMCTXS_MAG) +#define T1_CTXNO_UNI (T1_CTXNO_AGG+T1_NUMCTXS_AGG) +#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI) + +#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1) + +#define T1_TYPE_MQ 0 /**< Normal coding using entropy coder */ +#define T1_TYPE_RAW 1 /**< No encoding the information is store under raw format in codestream (mode switch RAW)*/ + +/* ----------------------------------------------------------------------- */ + +typedef short flag_t; + +/** +Tier-1 coding (coding of code-block coefficients) +*/ +typedef struct opj_t1 { + /** codec context */ + opj_common_ptr cinfo; + + /** MQC component */ + opj_mqc_t *mqc; + /** RAW component */ + opj_raw_t *raw; + + int *data; + flag_t *flags; + int w; + int h; + int datasize; + int flagssize; + int flags_stride; +} opj_t1_t; + +#define MACRO_t1_flags(x,y) t1->flags[((x)*(t1->flags_stride))+(y)] + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Create a new T1 handle +and initialize the look-up tables of the Tier-1 coder/decoder +@return Returns a new T1 handle if successful, returns NULL otherwise +@see t1_init_luts +*/ +opj_t1_t* t1_create(opj_common_ptr cinfo); +/** +Destroy a previously created T1 handle +@param t1 T1 handle to destroy +*/ +void t1_destroy(opj_t1_t *t1); +/** +Encode the code-blocks of a tile +@param t1 T1 handle +@param tile The tile to encode +@param tcp Tile coding parameters +*/ +void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp); +/** +Decode the code-blocks of a tile +@param t1 T1 handle +@param tilec The tile to decode +@param tccp Tile coding parameters +*/ +void t1_decode_cblks(opj_t1_t* t1, opj_tcd_tilecomp_t* tilec, opj_tccp_t* tccp); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __T1_H */ diff --git a/openjpeg-dotnet/libopenjpeg/t1_generate_luts.c b/openjpeg-dotnet/libopenjpeg/t1_generate_luts.c index 1925b951..39880414 100644 --- a/openjpeg-dotnet/libopenjpeg/t1_generate_luts.c +++ b/openjpeg-dotnet/libopenjpeg/t1_generate_luts.c @@ -260,16 +260,16 @@ int main(){ } printf("static short lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {\n "); - dump_array16(&lut_nmsedec_sig, 1 << T1_NMSEDEC_BITS); + dump_array16(lut_nmsedec_sig, 1 << T1_NMSEDEC_BITS); printf("static short lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {\n "); - dump_array16(&lut_nmsedec_sig0, 1 << T1_NMSEDEC_BITS); + dump_array16(lut_nmsedec_sig0, 1 << T1_NMSEDEC_BITS); printf("static short lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {\n "); - dump_array16(&lut_nmsedec_ref, 1 << T1_NMSEDEC_BITS); + dump_array16(lut_nmsedec_ref, 1 << T1_NMSEDEC_BITS); printf("static short lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {\n "); - dump_array16(&lut_nmsedec_ref0, 1 << T1_NMSEDEC_BITS); + dump_array16(lut_nmsedec_ref0, 1 << T1_NMSEDEC_BITS); return 0; } diff --git a/openjpeg-dotnet/libopenjpeg/t2.c b/openjpeg-dotnet/libopenjpeg/t2.c index fa84f401..232a5437 100644 --- a/openjpeg-dotnet/libopenjpeg/t2.c +++ b/openjpeg-dotnet/libopenjpeg/t2.c @@ -1,787 +1,793 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#include "opj_includes.h" - -/** @defgroup T2 T2 - Implementation of a tier-2 coding */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -static void t2_putcommacode(opj_bio_t *bio, int n); -static int t2_getcommacode(opj_bio_t *bio); -/** -Variable length code for signalling delta Zil (truncation point) -@param bio Bit Input/Output component -@param n delta Zil -*/ -static void t2_putnumpasses(opj_bio_t *bio, int n); -static int t2_getnumpasses(opj_bio_t *bio); -/** -Encode a packet of a tile to a destination buffer -@param tile Tile for which to write the packets -@param tcp Tile coding parameters -@param pi Packet identity -@param dest Destination buffer -@param len Length of the destination buffer -@param cstr_info Codestream information structure -@param tileno Number of the tile encoded -@return -*/ -static int t2_encode_packet(opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi, unsigned char *dest, int len, opj_codestream_info_t *cstr_info, int tileno); -/** -@param seg -@param cblksty -@param first -*/ -static void t2_init_seg(opj_tcd_cblk_dec_t* cblk, int index, int cblksty, int first); -/** -Decode a packet of a tile from a source buffer -@param t2 T2 handle -@param src Source buffer -@param len Length of the source buffer -@param tile Tile for which to write the packets -@param tcp Tile coding parameters -@param pi Packet identity -@return -*/ -static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_tile_t *tile, - opj_tcp_t *tcp, opj_pi_iterator_t *pi, opj_packet_info_t *pack_info); - -/*@}*/ - -/*@}*/ - -/* ----------------------------------------------------------------------- */ - -/* #define RESTART 0x04 */ - -static void t2_putcommacode(opj_bio_t *bio, int n) { - while (--n >= 0) { - bio_write(bio, 1, 1); - } - bio_write(bio, 0, 1); -} - -static int t2_getcommacode(opj_bio_t *bio) { - int n; - for (n = 0; bio_read(bio, 1); n++) { - ; - } - return n; -} - -static void t2_putnumpasses(opj_bio_t *bio, int n) { - if (n == 1) { - bio_write(bio, 0, 1); - } else if (n == 2) { - bio_write(bio, 2, 2); - } else if (n <= 5) { - bio_write(bio, 0xc | (n - 3), 4); - } else if (n <= 36) { - bio_write(bio, 0x1e0 | (n - 6), 9); - } else if (n <= 164) { - bio_write(bio, 0xff80 | (n - 37), 16); - } -} - -static int t2_getnumpasses(opj_bio_t *bio) { - int n; - if (!bio_read(bio, 1)) - return 1; - if (!bio_read(bio, 1)) - return 2; - if ((n = bio_read(bio, 2)) != 3) - return (3 + n); - if ((n = bio_read(bio, 5)) != 31) - return (6 + n); - return (37 + bio_read(bio, 7)); -} - -static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp, opj_pi_iterator_t *pi, unsigned char *dest, int length, opj_codestream_info_t *cstr_info, int tileno) { - int bandno, cblkno; - unsigned char *c = dest; - - int compno = pi->compno; /* component value */ - int resno = pi->resno; /* resolution level value */ - int precno = pi->precno; /* precinct value */ - int layno = pi->layno; /* quality layer value */ - - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - opj_bio_t *bio = NULL; /* BIO component */ - - /* */ - if (tcp->csty & J2K_CP_CSTY_SOP) { - c[0] = 255; - c[1] = 145; - c[2] = 0; - c[3] = 4; - c[4] = (tile->packno % 65536) / 256; - c[5] = (tile->packno % 65536) % 256; - c += 6; - } - /* */ - - if (!layno) { - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - tgt_reset(prc->incltree); - tgt_reset(prc->imsbtree); - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; - cblk->numpasses = 0; - tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps); - } - } - } - - bio = bio_create(); - bio_init_enc(bio, c, length); - bio_write(bio, 1, 1); /* Empty header bit */ - - /* Writing Packet header */ - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - if (!cblk->numpasses && layer->numpasses) { - tgt_setvalue(prc->incltree, cblkno, layno); - } - } - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - int increment = 0; - int nump = 0; - int len = 0, passno; - /* cblk inclusion bits */ - if (!cblk->numpasses) { - tgt_encode(bio, prc->incltree, cblkno, layno + 1); - } else { - bio_write(bio, layer->numpasses != 0, 1); - } - /* if cblk not included, go to the next cblk */ - if (!layer->numpasses) { - continue; - } - /* if first instance of cblk --> zero bit-planes information */ - if (!cblk->numpasses) { - cblk->numlenbits = 3; - tgt_encode(bio, prc->imsbtree, cblkno, 999); - } - /* number of coding passes included */ - t2_putnumpasses(bio, layer->numpasses); - - /* computation of the increase of the length indicator and insertion in the header */ - for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; passno++) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - nump++; - len += pass->len; - if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) { - increment = int_max(increment, int_floorlog2(len) + 1 - (cblk->numlenbits + int_floorlog2(nump))); - len = 0; - nump = 0; - } - } - t2_putcommacode(bio, increment); - - /* computation of the new Length indicator */ - cblk->numlenbits += increment; - - /* insertion of the codeword segment length */ - for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; passno++) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - nump++; - len += pass->len; - if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) { - bio_write(bio, len, cblk->numlenbits + int_floorlog2(nump)); - len = 0; - nump = 0; - } - } - } - } - - if (bio_flush(bio)) { - bio_destroy(bio); - return -999; /* modified to eliminate longjmp !! */ - } - - c += bio_numbytes(bio); - bio_destroy(bio); - - /* */ - if (tcp->csty & J2K_CP_CSTY_EPH) { - c[0] = 255; - c[1] = 146; - c += 2; - } - /* */ - - /* << INDEX */ - // End of packet header position. Currently only represents the distance to start of packet - // Will be updated later by incrementing with packet start value - if(cstr_info && cstr_info->index_write) { - opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno]; - info_PK->end_ph_pos = (int)(c - dest); - } - /* INDEX >> */ - - /* Writing the packet body */ - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - if (!layer->numpasses) { - continue; - } - if (c + layer->len > dest + length) { - return -999; - } - - memcpy(c, layer->data, layer->len); - cblk->numpasses += layer->numpasses; - c += layer->len; - /* << INDEX */ - if(cstr_info && cstr_info->index_write) { - opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno]; - info_PK->disto += layer->disto; - if (cstr_info->D_max < info_PK->disto) { - cstr_info->D_max = info_PK->disto; - } - } - /* INDEX >> */ - } - } - - return (c - dest); -} - -static void t2_init_seg(opj_tcd_cblk_dec_t* cblk, int index, int cblksty, int first) { - opj_tcd_seg_t* seg; - cblk->segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs, (index + 1) * sizeof(opj_tcd_seg_t)); - seg = &cblk->segs[index]; - seg->data = NULL; - seg->dataindex = 0; - seg->numpasses = 0; - seg->len = 0; - if (cblksty & J2K_CCP_CBLKSTY_TERMALL) { - seg->maxpasses = 1; - } - else if (cblksty & J2K_CCP_CBLKSTY_LAZY) { - if (first) { - seg->maxpasses = 10; - } else { - seg->maxpasses = (((seg - 1)->maxpasses == 1) || ((seg - 1)->maxpasses == 10)) ? 2 : 1; - } - } else { - seg->maxpasses = 109; - } -} - -static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_tile_t *tile, - opj_tcp_t *tcp, opj_pi_iterator_t *pi, opj_packet_info_t *pack_info) { - int bandno, cblkno; - unsigned char *c = src; - - opj_cp_t *cp = t2->cp; - - int compno = pi->compno; /* component value */ - int resno = pi->resno; /* resolution level value */ - int precno = pi->precno; /* precinct value */ - int layno = pi->layno; /* quality layer value */ - - opj_tcd_resolution_t* res = &tile->comps[compno].resolutions[resno]; - - unsigned char *hd = NULL; - int present; - - opj_bio_t *bio = NULL; /* BIO component */ - - if (layno == 0) { - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue; - - tgt_reset(prc->incltree); - tgt_reset(prc->imsbtree); - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; - cblk->numsegs = 0; - } - } - } - - /* SOP markers */ - - if (tcp->csty & J2K_CP_CSTY_SOP) { - if ((*c) != 0xff || (*(c + 1) != 0x91)) { - opj_event_msg(t2->cinfo, EVT_WARNING, "Expected SOP marker\n"); - } else { - c += 6; - } - - /** TODO : check the Nsop value */ - } - - /* - When the marker PPT/PPM is used the packet header are store in PPT/PPM marker - This part deal with this caracteristic - step 1: Read packet header in the saved structure - step 2: Return to codestream for decoding - */ - - bio = bio_create(); - - if (cp->ppm == 1) { /* PPM */ - hd = cp->ppm_data; - bio_init_dec(bio, hd, cp->ppm_len); - } else if (tcp->ppt == 1) { /* PPT */ - hd = tcp->ppt_data; - bio_init_dec(bio, hd, tcp->ppt_len); - } else { /* Normal Case */ - hd = c; - bio_init_dec(bio, hd, src+len-hd); - } - - present = bio_read(bio, 1); - - if (!present) { - bio_inalign(bio); - hd += bio_numbytes(bio); - bio_destroy(bio); - - /* EPH markers */ - - if (tcp->csty & J2K_CP_CSTY_EPH) { - if ((*hd) != 0xff || (*(hd + 1) != 0x92)) { - printf("Error : expected EPH marker\n"); - } else { - hd += 2; - } - } - - /* << INDEX */ - // End of packet header position. Currently only represents the distance to start of packet - // Will be updated later by incrementing with packet start value - if(pack_info) { - pack_info->end_ph_pos = (int)(c - src); - } - /* INDEX >> */ - - if (cp->ppm == 1) { /* PPM case */ - cp->ppm_len += cp->ppm_data-hd; - cp->ppm_data = hd; - return (c - src); - } - if (tcp->ppt == 1) { /* PPT case */ - tcp->ppt_len+=tcp->ppt_data-hd; - tcp->ppt_data = hd; - return (c - src); - } - - return (hd - src); - } - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue; - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int included, increment, n, segno; - opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; - /* if cblk not yet included before --> inclusion tagtree */ - if (!cblk->numsegs) { - included = tgt_decode(bio, prc->incltree, cblkno, layno + 1); - /* else one bit */ - } else { - included = bio_read(bio, 1); - } - /* if cblk not included */ - if (!included) { - cblk->numnewpasses = 0; - continue; - } - /* if cblk not yet included --> zero-bitplane tagtree */ - if (!cblk->numsegs) { - int i, numimsbs; - for (i = 0; !tgt_decode(bio, prc->imsbtree, cblkno, i); i++) { - ; - } - numimsbs = i - 1; - cblk->numbps = band->numbps - numimsbs; - cblk->numlenbits = 3; - } - /* number of coding passes */ - cblk->numnewpasses = t2_getnumpasses(bio); - increment = t2_getcommacode(bio); - /* length indicator increment */ - cblk->numlenbits += increment; - segno = 0; - if (!cblk->numsegs) { - t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 1); - } else { - segno = cblk->numsegs - 1; - if (cblk->segs[segno].numpasses == cblk->segs[segno].maxpasses) { - ++segno; - t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 0); - } - } - n = cblk->numnewpasses; - - do { - cblk->segs[segno].numnewpasses = int_min(cblk->segs[segno].maxpasses - cblk->segs[segno].numpasses, n); - cblk->segs[segno].newlen = bio_read(bio, cblk->numlenbits + int_floorlog2(cblk->segs[segno].numnewpasses)); - n -= cblk->segs[segno].numnewpasses; - if (n > 0) { - ++segno; - t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 0); - } - } while (n > 0); - } - } - - if (bio_inalign(bio)) { - bio_destroy(bio); - return -999; - } - - hd += bio_numbytes(bio); - bio_destroy(bio); - - /* EPH markers */ - if (tcp->csty & J2K_CP_CSTY_EPH) { - if ((*hd) != 0xff || (*(hd + 1) != 0x92)) { - opj_event_msg(t2->cinfo, EVT_ERROR, "Expected EPH marker\n"); - } else { - hd += 2; - } - } - - /* << INDEX */ - // End of packet header position. Currently only represents the distance to start of packet - // Will be updated later by incrementing with packet start value - if(pack_info) { - pack_info->end_ph_pos = (int)(hd - src); - } - /* INDEX >> */ - - if (cp->ppm==1) { - cp->ppm_len+=cp->ppm_data-hd; - cp->ppm_data = hd; - } else if (tcp->ppt == 1) { - tcp->ppt_len+=tcp->ppt_data-hd; - tcp->ppt_data = hd; - } else { - c=hd; - } - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue; - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; - opj_tcd_seg_t *seg = NULL; - if (!cblk->numnewpasses) - continue; - if (!cblk->numsegs) { - seg = &cblk->segs[0]; - cblk->numsegs++; - cblk->len = 0; - } else { - seg = &cblk->segs[cblk->numsegs - 1]; - if (seg->numpasses == seg->maxpasses) { - seg++; - cblk->numsegs++; - } - } - - do { - if (c + seg->newlen > src + len) { - return -999; - } - -#ifdef USE_JPWL - /* we need here a j2k handle to verify if making a check to - the validity of cblocks parameters is selected from user (-W) */ - - /* let's check that we are not exceeding */ - if ((cblk->len + seg->newlen) > 8192) { - opj_event_msg(t2->cinfo, EVT_WARNING, - "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n", - seg->newlen, cblkno, precno, bandno, resno, compno); - if (!JPWL_ASSUME) { - opj_event_msg(t2->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return -999; - } - seg->newlen = 8192 - cblk->len; - opj_event_msg(t2->cinfo, EVT_WARNING, " - truncating segment to %d\n", seg->newlen); - break; - }; - -#endif /* USE_JPWL */ - - cblk->data = (unsigned char*) opj_realloc(cblk->data, (cblk->len + seg->newlen) * sizeof(unsigned char*)); - memcpy(cblk->data + cblk->len, c, seg->newlen); - if (seg->numpasses == 0) { - seg->data = &cblk->data; - seg->dataindex = cblk->len; - } - c += seg->newlen; - cblk->len += seg->newlen; - seg->len += seg->newlen; - seg->numpasses += seg->numnewpasses; - cblk->numnewpasses -= seg->numnewpasses; - if (cblk->numnewpasses > 0) { - seg++; - cblk->numsegs++; - } - } while (cblk->numnewpasses > 0); - } - } - - return (c - src); -} - -/* ----------------------------------------------------------------------- */ - -int t2_encode_packets(opj_t2_t* t2,int tileno, opj_tcd_tile_t *tile, int maxlayers, unsigned char *dest, int len, opj_codestream_info_t *cstr_info,int tpnum, int tppos,int pino, J2K_T2_MODE t2_mode, int cur_totnum_tp){ - unsigned char *c = dest; - int e = 0; - int compno; - opj_pi_iterator_t *pi = NULL; - int poc; - opj_image_t *image = t2->image; - opj_cp_t *cp = t2->cp; - opj_tcp_t *tcp = &cp->tcps[tileno]; - int pocno = cp->cinema == CINEMA4K_24? 2: 1; - int maxcomp = cp->max_comp_size > 0 ? image->numcomps : 1; - - pi = pi_initialise_encode(image, cp, tileno, t2_mode); - if(!pi) { - /* TODO: throw an error */ - return -999; - } - - if(t2_mode == THRESH_CALC ){ /* Calculating threshold */ - for(compno = 0; compno < maxcomp; compno++ ){ - for(poc = 0; poc < pocno ; poc++){ - int comp_len = 0; - int tpnum = compno; - if (pi_create_encode(pi, cp,tileno,poc,tpnum,tppos,t2_mode,cur_totnum_tp)) { - opj_event_msg(t2->cinfo, EVT_ERROR, "Error initializing Packet Iterator\n"); - return -999; - } - while (pi_next(&pi[poc])) { - if (pi[poc].layno < maxlayers) { - e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[poc], c, dest + len - c, cstr_info, tileno); - comp_len = comp_len + e; - if (e == -999) { - break; - } else { - c += e; - } - } - } - if (e == -999) break; - if (cp->max_comp_size){ - if (comp_len > cp->max_comp_size){ - e = -999; - break; - } - } - } - if (e == -999) break; - } - }else{ /* t2_mode == FINAL_PASS */ - pi_create_encode(pi, cp,tileno,pino,tpnum,tppos,t2_mode,cur_totnum_tp); - while (pi_next(&pi[pino])) { - if (pi[pino].layno < maxlayers) { - e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[pino], c, dest + len - c, cstr_info, tileno); - if (e == -999) { - break; - } else { - c += e; - } - /* INDEX >> */ - if(cstr_info) { - if(cstr_info->index_write) { - opj_tile_info_t *info_TL = &cstr_info->tile[tileno]; - opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno]; - if (!cstr_info->packno) { - info_PK->start_pos = info_TL->end_header + 1; - } else { - info_PK->start_pos = ((cp->tp_on | tcp->POC)&& info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - 1].end_pos + 1; - } - info_PK->end_pos = info_PK->start_pos + e - 1; - info_PK->end_ph_pos += info_PK->start_pos - 1; // End of packet header which now only represents the distance - // to start of packet is incremented by value of start of packet - } - - cstr_info->packno++; - } - /* << INDEX */ - tile->packno++; - } - } - } - - pi_destroy(pi, cp, tileno); - - if (e == -999) { - return e; - } - - return (c - dest); -} - -int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile, opj_codestream_info_t *cstr_info) { - unsigned char *c = src; - opj_pi_iterator_t *pi; - int pino, e = 0; - int n = 0, curtp = 0; - int tp_start_packno; - - opj_image_t *image = t2->image; - opj_cp_t *cp = t2->cp; - - /* create a packet iterator */ - pi = pi_create_decode(image, cp, tileno); - if(!pi) { - /* TODO: throw an error */ - return -999; - } - - tp_start_packno = 0; - - for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) { - while (pi_next(&pi[pino])) { - if ((cp->layer==0) || (cp->layer>=((pi[pino].layno)+1))) { - opj_packet_info_t *pack_info; - if (cstr_info) - pack_info = &cstr_info->tile[tileno].packet[cstr_info->packno]; - else - pack_info = NULL; - e = t2_decode_packet(t2, c, src + len - c, tile, &cp->tcps[tileno], &pi[pino], pack_info); - } else { - e = 0; - } - - /* progression in resolution */ - image->comps[pi[pino].compno].resno_decoded = - (e > 0) ? - int_max(pi[pino].resno, image->comps[pi[pino].compno].resno_decoded) - : image->comps[pi[pino].compno].resno_decoded; - n++; - - /* INDEX >> */ - if(cstr_info) { - opj_tile_info_t *info_TL = &cstr_info->tile[tileno]; - opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno]; - if (!cstr_info->packno) { - info_PK->start_pos = info_TL->end_header + 1; - } else if (info_TL->packet[cstr_info->packno-1].end_pos >= (int)cstr_info->tile[tileno].tp[curtp].tp_end_pos){ // New tile part - info_TL->tp[curtp].tp_numpacks = cstr_info->packno - tp_start_packno; // Number of packets in previous tile-part - tp_start_packno = cstr_info->packno; - curtp++; - info_PK->start_pos = cstr_info->tile[tileno].tp[curtp].tp_end_header+1; - } else { - info_PK->start_pos = (cp->tp_on && info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - 1].end_pos + 1; - } - info_PK->end_pos = info_PK->start_pos + e - 1; - info_PK->end_ph_pos += info_PK->start_pos - 1; // End of packet header which now only represents the distance - // to start of packet is incremented by value of start of packet - cstr_info->packno++; - } - /* << INDEX */ - - if (e == -999) { /* ADD */ - break; - } else { - c += e; - } - } - } - /* INDEX >> */ - if(cstr_info) { - cstr_info->tile[tileno].tp[curtp].tp_numpacks = cstr_info->packno - tp_start_packno; // Number of packets in last tile-part - } - /* << INDEX */ - - /* don't forget to release pi */ - pi_destroy(pi, cp, tileno); - - if (e == -999) { - return e; - } - - return (c - src); -} - -/* ----------------------------------------------------------------------- */ - -opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp) { - /* create the tcd structure */ - opj_t2_t *t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t)); - if(!t2) return NULL; - t2->cinfo = cinfo; - t2->image = image; - t2->cp = cp; - - return t2; -} - -void t2_destroy(opj_t2_t *t2) { - if(t2) { - opj_free(t2); - } -} - - - - - +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#include "opj_includes.h" + +/** @defgroup T2 T2 - Implementation of a tier-2 coding */ +/*@{*/ + +/** @name Local static functions */ +/*@{*/ + +static void t2_putcommacode(opj_bio_t *bio, int n); +static int t2_getcommacode(opj_bio_t *bio); +/** +Variable length code for signalling delta Zil (truncation point) +@param bio Bit Input/Output component +@param n delta Zil +*/ +static void t2_putnumpasses(opj_bio_t *bio, int n); +static int t2_getnumpasses(opj_bio_t *bio); +/** +Encode a packet of a tile to a destination buffer +@param tile Tile for which to write the packets +@param tcp Tile coding parameters +@param pi Packet identity +@param dest Destination buffer +@param len Length of the destination buffer +@param cstr_info Codestream information structure +@param tileno Number of the tile encoded +@return +*/ +static int t2_encode_packet(opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi, unsigned char *dest, int len, opj_codestream_info_t *cstr_info, int tileno); +/** +@param cblk +@param index +@param cblksty +@param first +*/ +static void t2_init_seg(opj_tcd_cblk_dec_t* cblk, int index, int cblksty, int first); +/** +Decode a packet of a tile from a source buffer +@param t2 T2 handle +@param src Source buffer +@param len Length of the source buffer +@param tile Tile for which to write the packets +@param tcp Tile coding parameters +@param pi Packet identity +@param pack_info Packet information +@return +*/ +static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_tile_t *tile, + opj_tcp_t *tcp, opj_pi_iterator_t *pi, opj_packet_info_t *pack_info); + +/*@}*/ + +/*@}*/ + +/* ----------------------------------------------------------------------- */ + +/* #define RESTART 0x04 */ + +static void t2_putcommacode(opj_bio_t *bio, int n) { + while (--n >= 0) { + bio_write(bio, 1, 1); + } + bio_write(bio, 0, 1); +} + +static int t2_getcommacode(opj_bio_t *bio) { + int n; + for (n = 0; bio_read(bio, 1); n++) { + ; + } + return n; +} + +static void t2_putnumpasses(opj_bio_t *bio, int n) { + if (n == 1) { + bio_write(bio, 0, 1); + } else if (n == 2) { + bio_write(bio, 2, 2); + } else if (n <= 5) { + bio_write(bio, 0xc | (n - 3), 4); + } else if (n <= 36) { + bio_write(bio, 0x1e0 | (n - 6), 9); + } else if (n <= 164) { + bio_write(bio, 0xff80 | (n - 37), 16); + } +} + +static int t2_getnumpasses(opj_bio_t *bio) { + int n; + if (!bio_read(bio, 1)) + return 1; + if (!bio_read(bio, 1)) + return 2; + if ((n = bio_read(bio, 2)) != 3) + return (3 + n); + if ((n = bio_read(bio, 5)) != 31) + return (6 + n); + return (37 + bio_read(bio, 7)); +} + +static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp, opj_pi_iterator_t *pi, unsigned char *dest, int length, opj_codestream_info_t *cstr_info, int tileno) { + int bandno, cblkno; + unsigned char *c = dest; + + int compno = pi->compno; /* component value */ + int resno = pi->resno; /* resolution level value */ + int precno = pi->precno; /* precinct value */ + int layno = pi->layno; /* quality layer value */ + + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + + opj_bio_t *bio = NULL; /* BIO component */ + + /* */ + if (tcp->csty & J2K_CP_CSTY_SOP) { + c[0] = 255; + c[1] = 145; + c[2] = 0; + c[3] = 4; + c[4] = (unsigned char)((tile->packno % 65536) / 256); + c[5] = (unsigned char)((tile->packno % 65536) % 256); + c += 6; + } + /* */ + + if (!layno) { + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + opj_tcd_precinct_t *prc = &band->precincts[precno]; + tgt_reset(prc->incltree); + tgt_reset(prc->imsbtree); + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; + cblk->numpasses = 0; + tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps); + } + } + } + + bio = bio_create(); + bio_init_enc(bio, c, length); + bio_write(bio, 1, 1); /* Empty header bit */ + + /* Writing Packet header */ + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + opj_tcd_precinct_t *prc = &band->precincts[precno]; + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; + opj_tcd_layer_t *layer = &cblk->layers[layno]; + if (!cblk->numpasses && layer->numpasses) { + tgt_setvalue(prc->incltree, cblkno, layno); + } + } + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; + opj_tcd_layer_t *layer = &cblk->layers[layno]; + int increment = 0; + int nump = 0; + int len = 0, passno; + /* cblk inclusion bits */ + if (!cblk->numpasses) { + tgt_encode(bio, prc->incltree, cblkno, layno + 1); + } else { + bio_write(bio, layer->numpasses != 0, 1); + } + /* if cblk not included, go to the next cblk */ + if (!layer->numpasses) { + continue; + } + /* if first instance of cblk --> zero bit-planes information */ + if (!cblk->numpasses) { + cblk->numlenbits = 3; + tgt_encode(bio, prc->imsbtree, cblkno, 999); + } + /* number of coding passes included */ + t2_putnumpasses(bio, layer->numpasses); + + /* computation of the increase of the length indicator and insertion in the header */ + for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; passno++) { + opj_tcd_pass_t *pass = &cblk->passes[passno]; + nump++; + len += pass->len; + if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) { + increment = int_max(increment, int_floorlog2(len) + 1 - (cblk->numlenbits + int_floorlog2(nump))); + len = 0; + nump = 0; + } + } + t2_putcommacode(bio, increment); + + /* computation of the new Length indicator */ + cblk->numlenbits += increment; + + /* insertion of the codeword segment length */ + for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; passno++) { + opj_tcd_pass_t *pass = &cblk->passes[passno]; + nump++; + len += pass->len; + if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) { + bio_write(bio, len, cblk->numlenbits + int_floorlog2(nump)); + len = 0; + nump = 0; + } + } + } + } + + if (bio_flush(bio)) { + bio_destroy(bio); + return -999; /* modified to eliminate longjmp !! */ + } + + c += bio_numbytes(bio); + bio_destroy(bio); + + /* */ + if (tcp->csty & J2K_CP_CSTY_EPH) { + c[0] = 255; + c[1] = 146; + c += 2; + } + /* */ + + /* << INDEX */ + /* End of packet header position. Currently only represents the distance to start of packet + // Will be updated later by incrementing with packet start value */ + if(cstr_info && cstr_info->index_write) { + opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno]; + info_PK->end_ph_pos = (int)(c - dest); + } + /* INDEX >> */ + + /* Writing the packet body */ + + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + opj_tcd_precinct_t *prc = &band->precincts[precno]; + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; + opj_tcd_layer_t *layer = &cblk->layers[layno]; + if (!layer->numpasses) { + continue; + } + if (c + layer->len > dest + length) { + return -999; + } + + memcpy(c, layer->data, layer->len); + cblk->numpasses += layer->numpasses; + c += layer->len; + /* << INDEX */ + if(cstr_info && cstr_info->index_write) { + opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno]; + info_PK->disto += layer->disto; + if (cstr_info->D_max < info_PK->disto) { + cstr_info->D_max = info_PK->disto; + } + } + /* INDEX >> */ + } + } + + return (c - dest); +} + +static void t2_init_seg(opj_tcd_cblk_dec_t* cblk, int index, int cblksty, int first) { + opj_tcd_seg_t* seg; + cblk->segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs, (index + 1) * sizeof(opj_tcd_seg_t)); + seg = &cblk->segs[index]; + seg->data = NULL; + seg->dataindex = 0; + seg->numpasses = 0; + seg->len = 0; + if (cblksty & J2K_CCP_CBLKSTY_TERMALL) { + seg->maxpasses = 1; + } + else if (cblksty & J2K_CCP_CBLKSTY_LAZY) { + if (first) { + seg->maxpasses = 10; + } else { + seg->maxpasses = (((seg - 1)->maxpasses == 1) || ((seg - 1)->maxpasses == 10)) ? 2 : 1; + } + } else { + seg->maxpasses = 109; + } +} + +static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_tile_t *tile, + opj_tcp_t *tcp, opj_pi_iterator_t *pi, opj_packet_info_t *pack_info) { + int bandno, cblkno; + unsigned char *c = src; + + opj_cp_t *cp = t2->cp; + + int compno = pi->compno; /* component value */ + int resno = pi->resno; /* resolution level value */ + int precno = pi->precno; /* precinct value */ + int layno = pi->layno; /* quality layer value */ + + opj_tcd_resolution_t* res = &tile->comps[compno].resolutions[resno]; + + unsigned char *hd = NULL; + int present; + + opj_bio_t *bio = NULL; /* BIO component */ + + if (layno == 0) { + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + opj_tcd_precinct_t *prc = &band->precincts[precno]; + + if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue; + + tgt_reset(prc->incltree); + tgt_reset(prc->imsbtree); + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; + cblk->numsegs = 0; + } + } + } + + /* SOP markers */ + + if (tcp->csty & J2K_CP_CSTY_SOP) { + if ((*c) != 0xff || (*(c + 1) != 0x91)) { + opj_event_msg(t2->cinfo, EVT_WARNING, "Expected SOP marker\n"); + } else { + c += 6; + } + + /** TODO : check the Nsop value */ + } + + /* + When the marker PPT/PPM is used the packet header are store in PPT/PPM marker + This part deal with this caracteristic + step 1: Read packet header in the saved structure + step 2: Return to codestream for decoding + */ + + bio = bio_create(); + + if (cp->ppm == 1) { /* PPM */ + hd = cp->ppm_data; + bio_init_dec(bio, hd, cp->ppm_len); + } else if (tcp->ppt == 1) { /* PPT */ + hd = tcp->ppt_data; + bio_init_dec(bio, hd, tcp->ppt_len); + } else { /* Normal Case */ + hd = c; + bio_init_dec(bio, hd, src+len-hd); + } + + present = bio_read(bio, 1); + + if (!present) { + bio_inalign(bio); + hd += bio_numbytes(bio); + bio_destroy(bio); + + /* EPH markers */ + + if (tcp->csty & J2K_CP_CSTY_EPH) { + if ((*hd) != 0xff || (*(hd + 1) != 0x92)) { + printf("Error : expected EPH marker\n"); + } else { + hd += 2; + } + } + + /* << INDEX */ + /* End of packet header position. Currently only represents the distance to start of packet + // Will be updated later by incrementing with packet start value*/ + if(pack_info) { + pack_info->end_ph_pos = (int)(c - src); + } + /* INDEX >> */ + + if (cp->ppm == 1) { /* PPM case */ + cp->ppm_len += cp->ppm_data-hd; + cp->ppm_data = hd; + return (c - src); + } + if (tcp->ppt == 1) { /* PPT case */ + tcp->ppt_len+=tcp->ppt_data-hd; + tcp->ppt_data = hd; + return (c - src); + } + + return (hd - src); + } + + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + opj_tcd_precinct_t *prc = &band->precincts[precno]; + + if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue; + + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + int included, increment, n, segno; + opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; + /* if cblk not yet included before --> inclusion tagtree */ + if (!cblk->numsegs) { + included = tgt_decode(bio, prc->incltree, cblkno, layno + 1); + /* else one bit */ + } else { + included = bio_read(bio, 1); + } + /* if cblk not included */ + if (!included) { + cblk->numnewpasses = 0; + continue; + } + /* if cblk not yet included --> zero-bitplane tagtree */ + if (!cblk->numsegs) { + int i, numimsbs; + for (i = 0; !tgt_decode(bio, prc->imsbtree, cblkno, i); i++) { + ; + } + numimsbs = i - 1; + cblk->numbps = band->numbps - numimsbs; + cblk->numlenbits = 3; + } + /* number of coding passes */ + cblk->numnewpasses = t2_getnumpasses(bio); + increment = t2_getcommacode(bio); + /* length indicator increment */ + cblk->numlenbits += increment; + segno = 0; + if (!cblk->numsegs) { + t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 1); + } else { + segno = cblk->numsegs - 1; + if (cblk->segs[segno].numpasses == cblk->segs[segno].maxpasses) { + ++segno; + t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 0); + } + } + n = cblk->numnewpasses; + + do { + cblk->segs[segno].numnewpasses = int_min(cblk->segs[segno].maxpasses - cblk->segs[segno].numpasses, n); + cblk->segs[segno].newlen = bio_read(bio, cblk->numlenbits + int_floorlog2(cblk->segs[segno].numnewpasses)); + n -= cblk->segs[segno].numnewpasses; + if (n > 0) { + ++segno; + t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 0); + } + } while (n > 0); + } + } + + if (bio_inalign(bio)) { + bio_destroy(bio); + return -999; + } + + hd += bio_numbytes(bio); + bio_destroy(bio); + + /* EPH markers */ + if (tcp->csty & J2K_CP_CSTY_EPH) { + if ((*hd) != 0xff || (*(hd + 1) != 0x92)) { + opj_event_msg(t2->cinfo, EVT_ERROR, "Expected EPH marker\n"); + return -999; + } else { + hd += 2; + } + } + + /* << INDEX */ + /* End of packet header position. Currently only represents the distance to start of packet + // Will be updated later by incrementing with packet start value*/ + if(pack_info) { + pack_info->end_ph_pos = (int)(hd - src); + } + /* INDEX >> */ + + if (cp->ppm==1) { + cp->ppm_len+=cp->ppm_data-hd; + cp->ppm_data = hd; + } else if (tcp->ppt == 1) { + tcp->ppt_len+=tcp->ppt_data-hd; + tcp->ppt_data = hd; + } else { + c=hd; + } + + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + opj_tcd_precinct_t *prc = &band->precincts[precno]; + + if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue; + + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; + opj_tcd_seg_t *seg = NULL; + if (!cblk->numnewpasses) + continue; + if (!cblk->numsegs) { + seg = &cblk->segs[0]; + cblk->numsegs++; + cblk->len = 0; + } else { + seg = &cblk->segs[cblk->numsegs - 1]; + if (seg->numpasses == seg->maxpasses) { + seg++; + cblk->numsegs++; + } + } + + do { + if (c + seg->newlen > src + len) { + return -999; + } + +#ifdef USE_JPWL + /* we need here a j2k handle to verify if making a check to + the validity of cblocks parameters is selected from user (-W) */ + + /* let's check that we are not exceeding */ + if ((cblk->len + seg->newlen) > 8192) { + opj_event_msg(t2->cinfo, EVT_WARNING, + "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n", + seg->newlen, cblkno, precno, bandno, resno, compno); + if (!JPWL_ASSUME) { + opj_event_msg(t2->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return -999; + } + seg->newlen = 8192 - cblk->len; + opj_event_msg(t2->cinfo, EVT_WARNING, " - truncating segment to %d\n", seg->newlen); + break; + }; + +#endif /* USE_JPWL */ + + cblk->data = (unsigned char*) opj_realloc(cblk->data, (cblk->len + seg->newlen) * sizeof(unsigned char)); + memcpy(cblk->data + cblk->len, c, seg->newlen); + if (seg->numpasses == 0) { + seg->data = &cblk->data; + seg->dataindex = cblk->len; + } + c += seg->newlen; + cblk->len += seg->newlen; + seg->len += seg->newlen; + seg->numpasses += seg->numnewpasses; + cblk->numnewpasses -= seg->numnewpasses; + if (cblk->numnewpasses > 0) { + seg++; + cblk->numsegs++; + } + } while (cblk->numnewpasses > 0); + } + } + + return (c - src); +} + +/* ----------------------------------------------------------------------- */ + +int t2_encode_packets(opj_t2_t* t2,int tileno, opj_tcd_tile_t *tile, int maxlayers, unsigned char *dest, int len, opj_codestream_info_t *cstr_info,int tpnum, int tppos,int pino, J2K_T2_MODE t2_mode, int cur_totnum_tp){ + unsigned char *c = dest; + int e = 0; + int compno; + opj_pi_iterator_t *pi = NULL; + int poc; + opj_image_t *image = t2->image; + opj_cp_t *cp = t2->cp; + opj_tcp_t *tcp = &cp->tcps[tileno]; + int pocno = cp->cinema == CINEMA4K_24? 2: 1; + int maxcomp = cp->max_comp_size > 0 ? image->numcomps : 1; + + pi = pi_initialise_encode(image, cp, tileno, t2_mode); + if(!pi) { + /* TODO: throw an error */ + return -999; + } + + if(t2_mode == THRESH_CALC ){ /* Calculating threshold */ + for(compno = 0; compno < maxcomp; compno++ ){ + for(poc = 0; poc < pocno ; poc++){ + int comp_len = 0; + int tpnum = compno; + if (pi_create_encode(pi, cp,tileno,poc,tpnum,tppos,t2_mode,cur_totnum_tp)) { + opj_event_msg(t2->cinfo, EVT_ERROR, "Error initializing Packet Iterator\n"); + pi_destroy(pi, cp, tileno); + return -999; + } + while (pi_next(&pi[poc])) { + if (pi[poc].layno < maxlayers) { + e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[poc], c, dest + len - c, cstr_info, tileno); + comp_len = comp_len + e; + if (e == -999) { + break; + } else { + c += e; + } + } + } + if (e == -999) break; + if (cp->max_comp_size){ + if (comp_len > cp->max_comp_size){ + e = -999; + break; + } + } + } + if (e == -999) break; + } + }else{ /* t2_mode == FINAL_PASS */ + pi_create_encode(pi, cp,tileno,pino,tpnum,tppos,t2_mode,cur_totnum_tp); + while (pi_next(&pi[pino])) { + if (pi[pino].layno < maxlayers) { + e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[pino], c, dest + len - c, cstr_info, tileno); + if (e == -999) { + break; + } else { + c += e; + } + /* INDEX >> */ + if(cstr_info) { + if(cstr_info->index_write) { + opj_tile_info_t *info_TL = &cstr_info->tile[tileno]; + opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno]; + if (!cstr_info->packno) { + info_PK->start_pos = info_TL->end_header + 1; + } else { + info_PK->start_pos = ((cp->tp_on | tcp->POC)&& info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - 1].end_pos + 1; + } + info_PK->end_pos = info_PK->start_pos + e - 1; + info_PK->end_ph_pos += info_PK->start_pos - 1; /* End of packet header which now only represents the distance + // to start of packet is incremented by value of start of packet*/ + } + + cstr_info->packno++; + } + /* << INDEX */ + tile->packno++; + } + } + } + + pi_destroy(pi, cp, tileno); + + if (e == -999) { + return e; + } + + return (c - dest); +} + +int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile, opj_codestream_info_t *cstr_info) { + unsigned char *c = src; + opj_pi_iterator_t *pi; + int pino, e = 0; + int n = 0, curtp = 0; + int tp_start_packno; + + opj_image_t *image = t2->image; + opj_cp_t *cp = t2->cp; + + /* create a packet iterator */ + pi = pi_create_decode(image, cp, tileno); + if(!pi) { + /* TODO: throw an error */ + return -999; + } + + tp_start_packno = 0; + + for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) { + while (pi_next(&pi[pino])) { + if ((cp->layer==0) || (cp->layer>=((pi[pino].layno)+1))) { + opj_packet_info_t *pack_info; + if (cstr_info) + pack_info = &cstr_info->tile[tileno].packet[cstr_info->packno]; + else + pack_info = NULL; + e = t2_decode_packet(t2, c, src + len - c, tile, &cp->tcps[tileno], &pi[pino], pack_info); + } else { + e = 0; + } + if(e == -999) return -999; + /* progression in resolution */ + image->comps[pi[pino].compno].resno_decoded = + (e > 0) ? + int_max(pi[pino].resno, image->comps[pi[pino].compno].resno_decoded) + : image->comps[pi[pino].compno].resno_decoded; + n++; + + /* INDEX >> */ + if(cstr_info) { + opj_tile_info_t *info_TL = &cstr_info->tile[tileno]; + opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno]; + if (!cstr_info->packno) { + info_PK->start_pos = info_TL->end_header + 1; + } else if (info_TL->packet[cstr_info->packno-1].end_pos >= (int)cstr_info->tile[tileno].tp[curtp].tp_end_pos){ /* New tile part*/ + info_TL->tp[curtp].tp_numpacks = cstr_info->packno - tp_start_packno; /* Number of packets in previous tile-part*/ + info_TL->tp[curtp].tp_start_pack = tp_start_packno; + tp_start_packno = cstr_info->packno; + curtp++; + info_PK->start_pos = cstr_info->tile[tileno].tp[curtp].tp_end_header+1; + } else { + info_PK->start_pos = (cp->tp_on && info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - 1].end_pos + 1; + } + info_PK->end_pos = info_PK->start_pos + e - 1; + info_PK->end_ph_pos += info_PK->start_pos - 1; /* End of packet header which now only represents the distance + // to start of packet is incremented by value of start of packet*/ + cstr_info->packno++; + } + /* << INDEX */ + + if (e == -999) { /* ADD */ + break; + } else { + c += e; + } + } + } + /* INDEX >> */ + if(cstr_info) { + cstr_info->tile[tileno].tp[curtp].tp_numpacks = cstr_info->packno - tp_start_packno; /* Number of packets in last tile-part*/ + cstr_info->tile[tileno].tp[curtp].tp_start_pack = tp_start_packno; + } + /* << INDEX */ + + /* don't forget to release pi */ + pi_destroy(pi, cp, tileno); + + if (e == -999) { + return e; + } + + return (c - src); +} + +/* ----------------------------------------------------------------------- */ + +opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp) { + /* create the tcd structure */ + opj_t2_t *t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t)); + if(!t2) return NULL; + t2->cinfo = cinfo; + t2->image = image; + t2->cp = cp; + + return t2; +} + +void t2_destroy(opj_t2_t *t2) { + if(t2) { + opj_free(t2); + } +} + + + + + diff --git a/openjpeg-dotnet/libopenjpeg/t2.h b/openjpeg-dotnet/libopenjpeg/t2.h index 8458ae39..2151ba67 100644 --- a/openjpeg-dotnet/libopenjpeg/t2.h +++ b/openjpeg-dotnet/libopenjpeg/t2.h @@ -1,103 +1,105 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ -#ifndef __T2_H -#define __T2_H -/** -@file t2.h -@brief Implementation of a tier-2 coding (packetization of code-block data) (T2) - -*/ - -/** @defgroup T2 T2 - Implementation of a tier-2 coding */ -/*@{*/ - -/** -Tier-2 coding -*/ -typedef struct opj_t2 { - /** codec context */ - opj_common_ptr cinfo; - - /** Encoding: pointer to the src image. Decoding: pointer to the dst image. */ - opj_image_t *image; - /** pointer to the image coding parameters */ - opj_cp_t *cp; -} opj_t2_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ - -/** -Encode the packets of a tile to a destination buffer -@param t2 T2 handle -@param tileno number of the tile encoded -@param tile the tile for which to write the packets -@param maxlayers maximum number of layers -@param dest the destination buffer -@param len the length of the destination buffer -@param cstr_info Codestream information structure -@param tpnum Tile part number of the current tile -@param tppos The position of the tile part flag in the progression order -@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass -@param cur_totnum_tp The total number of tile parts in the current tile -*/ -int t2_encode_packets(opj_t2_t* t2,int tileno, opj_tcd_tile_t *tile, int maxlayers, unsigned char *dest, int len, opj_codestream_info_t *cstr_info,int tpnum, int tppos,int pino,J2K_T2_MODE t2_mode,int cur_totnum_tp); -/** -Decode the packets of a tile from a source buffer -@param t2 T2 handle -@param src the source buffer -@param len length of the source buffer -@param tileno number that identifies the tile for which to decode the packets -@param tile tile for which to decode the packets - */ -int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile, opj_codestream_info_t *cstr_info); - -/** -Create a T2 handle -@param cinfo Codec context info -@param image Source or destination image -@param cp Image coding parameters -@return Returns a new T2 handle if successful, returns NULL otherwise -*/ -opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp); -/** -Destroy a T2 handle -@param t2 T2 handle to destroy -*/ -void t2_destroy(opj_t2_t *t2); - -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __T2_H */ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ +#ifndef __T2_H +#define __T2_H +/** +@file t2.h +@brief Implementation of a tier-2 coding (packetization of code-block data) (T2) + +*/ + +/** @defgroup T2 T2 - Implementation of a tier-2 coding */ +/*@{*/ + +/** +Tier-2 coding +*/ +typedef struct opj_t2 { + /** codec context */ + opj_common_ptr cinfo; + + /** Encoding: pointer to the src image. Decoding: pointer to the dst image. */ + opj_image_t *image; + /** pointer to the image coding parameters */ + opj_cp_t *cp; +} opj_t2_t; + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ + +/** +Encode the packets of a tile to a destination buffer +@param t2 T2 handle +@param tileno number of the tile encoded +@param tile the tile for which to write the packets +@param maxlayers maximum number of layers +@param dest the destination buffer +@param len the length of the destination buffer +@param cstr_info Codestream information structure +@param tpnum Tile part number of the current tile +@param tppos The position of the tile part flag in the progression order +@param pino +@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass +@param cur_totnum_tp The total number of tile parts in the current tile +*/ +int t2_encode_packets(opj_t2_t* t2,int tileno, opj_tcd_tile_t *tile, int maxlayers, unsigned char *dest, int len, opj_codestream_info_t *cstr_info,int tpnum, int tppos,int pino,J2K_T2_MODE t2_mode,int cur_totnum_tp); +/** +Decode the packets of a tile from a source buffer +@param t2 T2 handle +@param src the source buffer +@param len length of the source buffer +@param tileno number that identifies the tile for which to decode the packets +@param tile tile for which to decode the packets +@param cstr_info Codestream information structure + */ +int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile, opj_codestream_info_t *cstr_info); + +/** +Create a T2 handle +@param cinfo Codec context info +@param image Source or destination image +@param cp Image coding parameters +@return Returns a new T2 handle if successful, returns NULL otherwise +*/ +opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp); +/** +Destroy a T2 handle +@param t2 T2 handle to destroy +*/ +void t2_destroy(opj_t2_t *t2); + +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __T2_H */ diff --git a/openjpeg-dotnet/libopenjpeg/tcd.c b/openjpeg-dotnet/libopenjpeg/tcd.c index f597c8ef..18cdbc78 100644 --- a/openjpeg-dotnet/libopenjpeg/tcd.c +++ b/openjpeg-dotnet/libopenjpeg/tcd.c @@ -1,1516 +1,1524 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2006-2007, Parvatha Elangovan - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#include "opj_includes.h" - -void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img) { - int tileno, compno, resno, bandno, precno;//, cblkno; - - fprintf(fd, "image {\n"); - fprintf(fd, " tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n", - img->tw, img->th, tcd->image->x0, tcd->image->x1, tcd->image->y0, tcd->image->y1); - - for (tileno = 0; tileno < img->th * img->tw; tileno++) { - opj_tcd_tile_t *tile = &tcd->tcd_image->tiles[tileno]; - fprintf(fd, " tile {\n"); - fprintf(fd, " x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n", - tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps); - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - fprintf(fd, " tilec {\n"); - fprintf(fd, - " x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\n", - tilec->x0, tilec->y0, tilec->x1, tilec->y1, tilec->numresolutions); - for (resno = 0; resno < tilec->numresolutions; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - fprintf(fd, "\n res {\n"); - fprintf(fd, - " x0=%d, y0=%d, x1=%d, y1=%d, pw=%d, ph=%d, numbands=%d\n", - res->x0, res->y0, res->x1, res->y1, res->pw, res->ph, res->numbands); - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - fprintf(fd, " band {\n"); - fprintf(fd, - " x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%f, numbps=%d\n", - band->x0, band->y0, band->x1, band->y1, band->stepsize, band->numbps); - for (precno = 0; precno < res->pw * res->ph; precno++) { - opj_tcd_precinct_t *prec = &band->precincts[precno]; - fprintf(fd, " prec {\n"); - fprintf(fd, - " x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\n", - prec->x0, prec->y0, prec->x1, prec->y1, prec->cw, prec->ch); - /* - for (cblkno = 0; cblkno < prec->cw * prec->ch; cblkno++) { - opj_tcd_cblk_t *cblk = &prec->cblks[cblkno]; - fprintf(fd, " cblk {\n"); - fprintf(fd, - " x0=%d, y0=%d, x1=%d, y1=%d\n", - cblk->x0, cblk->y0, cblk->x1, cblk->y1); - fprintf(fd, " }\n"); - } - */ - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, "}\n"); -} - -/* ----------------------------------------------------------------------- */ - -/** -Create a new TCD handle -*/ -opj_tcd_t* tcd_create(opj_common_ptr cinfo) { - /* create the tcd structure */ - opj_tcd_t *tcd = (opj_tcd_t*)opj_malloc(sizeof(opj_tcd_t)); - if(!tcd) return NULL; - tcd->cinfo = cinfo; - tcd->tcd_image = (opj_tcd_image_t*)opj_malloc(sizeof(opj_tcd_image_t)); - if(!tcd->tcd_image) { - opj_free(tcd); - return NULL; - } - - return tcd; -} - -/** -Destroy a previously created TCD handle -*/ -void tcd_destroy(opj_tcd_t *tcd) { - if(tcd) { - opj_free(tcd->tcd_image); - opj_free(tcd); - } -} - -/* ----------------------------------------------------------------------- */ - -void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno) { - int tileno, compno, resno, bandno, precno, cblkno; - - tcd->image = image; - tcd->cp = cp; - tcd->tcd_image->tw = cp->tw; - tcd->tcd_image->th = cp->th; - tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(sizeof(opj_tcd_tile_t)); - - for (tileno = 0; tileno < 1; tileno++) { - opj_tcp_t *tcp = &cp->tcps[curtileno]; - int j; - - /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - int p = curtileno % cp->tw; /* si numerotation matricielle .. */ - int q = curtileno / cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */ - - /* opj_tcd_tile_t *tile=&tcd->tcd_image->tiles[tileno]; */ - opj_tcd_tile_t *tile = tcd->tcd_image->tiles; - - /* 4 borders of the tile rescale on the image if necessary */ - tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0); - tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0); - tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); - tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); - tile->numcomps = image->numcomps; - /* tile->PPT=image->PPT; */ - - /* Modification of the RATE >> */ - for (j = 0; j < tcp->numlayers; j++) { - tcp->rates[j] = tcp->rates[j] ? - cp->tp_on ? - (((float) (tile->numcomps - * (tile->x1 - tile->x0) - * (tile->y1 - tile->y0) - * image->comps[0].prec)) - /(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - (((tcd->cur_totnum_tp - 1) * 14 )/ tcp->numlayers) - : - ((float) (tile->numcomps - * (tile->x1 - tile->x0) - * (tile->y1 - tile->y0) - * image->comps[0].prec))/ - (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy) - : 0; - - if (tcp->rates[j]) { - if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) { - tcp->rates[j] = tcp->rates[j - 1] + 20; - } else { - if (!j && tcp->rates[j] < 30) - tcp->rates[j] = 30; - } - - if(j == (tcp->numlayers-1)){ - tcp->rates[j] = tcp->rates[j]- 2; - } - } - } - /* << Modification of the RATE */ - - tile->comps = (opj_tcd_tilecomp_t *) opj_malloc(image->numcomps * sizeof(opj_tcd_tilecomp_t)); - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tccp_t *tccp = &tcp->tccps[compno]; - - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - /* border of each tile component (global) */ - tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); - tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy); - tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx); - tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy); - - tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int)); - tilec->numresolutions = tccp->numresolutions; - - tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t)); - - for (resno = 0; resno < tilec->numresolutions; resno++) { - int pdx, pdy; - int levelno = tilec->numresolutions - 1 - resno; - int tlprcxstart, tlprcystart, brprcxend, brprcyend; - int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; - int cbgwidthexpn, cbgheightexpn; - int cblkwidthexpn, cblkheightexpn; - - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - /* border for each resolution level (global) */ - res->x0 = int_ceildivpow2(tilec->x0, levelno); - res->y0 = int_ceildivpow2(tilec->y0, levelno); - res->x1 = int_ceildivpow2(tilec->x1, levelno); - res->y1 = int_ceildivpow2(tilec->y1, levelno); - - res->numbands = resno == 0 ? 1 : 3; - /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ - if (tccp->csty & J2K_CCP_CSTY_PRT) { - pdx = tccp->prcw[resno]; - pdy = tccp->prch[resno]; - } else { - pdx = 15; - pdy = 15; - } - /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; - tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; - - brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; - brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; - - res->pw = (brprcxend - tlprcxstart) >> pdx; - res->ph = (brprcyend - tlprcystart) >> pdy; - - if (resno == 0) { - tlcbgxstart = tlprcxstart; - tlcbgystart = tlprcystart; - brcbgxend = brprcxend; - brcbgyend = brprcyend; - cbgwidthexpn = pdx; - cbgheightexpn = pdy; - } else { - tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); - tlcbgystart = int_ceildivpow2(tlprcystart, 1); - brcbgxend = int_ceildivpow2(brprcxend, 1); - brcbgyend = int_ceildivpow2(brprcyend, 1); - cbgwidthexpn = pdx - 1; - cbgheightexpn = pdy - 1; - } - - cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn); - cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn); - - for (bandno = 0; bandno < res->numbands; bandno++) { - int x0b, y0b, i; - int gain, numbps; - opj_stepsize_t *ss = NULL; - - opj_tcd_band_t *band = &res->bands[bandno]; - - band->bandno = resno == 0 ? 0 : bandno + 1; - x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0; - y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0; - - if (band->bandno == 0) { - /* band border (global) */ - band->x0 = int_ceildivpow2(tilec->x0, levelno); - band->y0 = int_ceildivpow2(tilec->y0, levelno); - band->x1 = int_ceildivpow2(tilec->x1, levelno); - band->y1 = int_ceildivpow2(tilec->y1, levelno); - } else { - /* band border (global) */ - band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1); - band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1); - band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1); - band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1); - } - - ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1]; - gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); - numbps = image->comps[compno].prec + gain; - - band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)); - band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ - - band->precincts = (opj_tcd_precinct_t *) opj_malloc(3 * res->pw * res->ph * sizeof(opj_tcd_precinct_t)); - - for (i = 0; i < res->pw * res->ph * 3; i++) { - band->precincts[i].imsbtree = NULL; - band->precincts[i].incltree = NULL; - } - - for (precno = 0; precno < res->pw * res->ph; precno++) { - int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; - - int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); - int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); - int cbgxend = cbgxstart + (1 << cbgwidthexpn); - int cbgyend = cbgystart + (1 << cbgheightexpn); - - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - /* precinct size (global) */ - prc->x0 = int_max(cbgxstart, band->x0); - prc->y0 = int_max(cbgystart, band->y0); - prc->x1 = int_min(cbgxend, band->x1); - prc->y1 = int_min(cbgyend, band->y1); - - tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; - tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; - brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; - brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; - prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; - prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; - - prc->cblks.enc = (opj_tcd_cblk_enc_t*) opj_calloc((prc->cw * prc->ch), sizeof(opj_tcd_cblk_enc_t)); - prc->incltree = tgt_create(prc->cw, prc->ch); - prc->imsbtree = tgt_create(prc->cw, prc->ch); - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); - int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); - int cblkxend = cblkxstart + (1 << cblkwidthexpn); - int cblkyend = cblkystart + (1 << cblkheightexpn); - - opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; - - /* code-block size (global) */ - cblk->x0 = int_max(cblkxstart, prc->x0); - cblk->y0 = int_max(cblkystart, prc->y0); - cblk->x1 = int_min(cblkxend, prc->x1); - cblk->y1 = int_min(cblkyend, prc->y1); - cblk->data = (unsigned char*) opj_calloc(8192+2, sizeof(unsigned char)); - /* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */ - cblk->data += 2; - cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t)); - cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t)); - } - } - } - } - } - } - - /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ -} - -void tcd_free_encode(opj_tcd_t *tcd) { - int tileno, compno, resno, bandno, precno, cblkno; - - for (tileno = 0; tileno < 1; tileno++) { - opj_tcd_tile_t *tile = tcd->tcd_image->tiles; - - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - for (resno = 0; resno < tilec->numresolutions; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - - for (precno = 0; precno < res->pw * res->ph; precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - if (prc->incltree != NULL) { - tgt_destroy(prc->incltree); - prc->incltree = NULL; - } - if (prc->imsbtree != NULL) { - tgt_destroy(prc->imsbtree); - prc->imsbtree = NULL; - } - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_free(prc->cblks.enc[cblkno].data - 2); - opj_free(prc->cblks.enc[cblkno].layers); - opj_free(prc->cblks.enc[cblkno].passes); - } - opj_free(prc->cblks.enc); - } /* for (precno */ - opj_free(band->precincts); - band->precincts = NULL; - } /* for (bandno */ - } /* for (resno */ - opj_free(tilec->resolutions); - tilec->resolutions = NULL; - } /* for (compno */ - opj_free(tile->comps); - tile->comps = NULL; - } /* for (tileno */ - opj_free(tcd->tcd_image->tiles); - tcd->tcd_image->tiles = NULL; -} - -void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno) { - int tileno, compno, resno, bandno, precno, cblkno; - - for (tileno = 0; tileno < 1; tileno++) { - opj_tcp_t *tcp = &cp->tcps[curtileno]; - int j; - /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - int p = curtileno % cp->tw; - int q = curtileno / cp->tw; - - opj_tcd_tile_t *tile = tcd->tcd_image->tiles; - - /* 4 borders of the tile rescale on the image if necessary */ - tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0); - tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0); - tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); - tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); - - tile->numcomps = image->numcomps; - /* tile->PPT=image->PPT; */ - - /* Modification of the RATE >> */ - for (j = 0; j < tcp->numlayers; j++) { - tcp->rates[j] = tcp->rates[j] ? - cp->tp_on ? - (((float) (tile->numcomps - * (tile->x1 - tile->x0) - * (tile->y1 - tile->y0) - * image->comps[0].prec)) - /(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - (((tcd->cur_totnum_tp - 1) * 14 )/ tcp->numlayers) - : - ((float) (tile->numcomps - * (tile->x1 - tile->x0) - * (tile->y1 - tile->y0) - * image->comps[0].prec))/ - (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy) - : 0; - - if (tcp->rates[j]) { - if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) { - tcp->rates[j] = tcp->rates[j - 1] + 20; - } else { - if (!j && tcp->rates[j] < 30) - tcp->rates[j] = 30; - } - } - } - /* << Modification of the RATE */ - - /* tile->comps=(opj_tcd_tilecomp_t*)opj_realloc(tile->comps,image->numcomps*sizeof(opj_tcd_tilecomp_t)); */ - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tccp_t *tccp = &tcp->tccps[compno]; - - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - /* border of each tile component (global) */ - tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); - tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy); - tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx); - tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy); - - tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int)); - tilec->numresolutions = tccp->numresolutions; - /* tilec->resolutions=(opj_tcd_resolution_t*)opj_realloc(tilec->resolutions,tilec->numresolutions*sizeof(opj_tcd_resolution_t)); */ - for (resno = 0; resno < tilec->numresolutions; resno++) { - int pdx, pdy; - - int levelno = tilec->numresolutions - 1 - resno; - int tlprcxstart, tlprcystart, brprcxend, brprcyend; - int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; - int cbgwidthexpn, cbgheightexpn; - int cblkwidthexpn, cblkheightexpn; - - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - /* border for each resolution level (global) */ - res->x0 = int_ceildivpow2(tilec->x0, levelno); - res->y0 = int_ceildivpow2(tilec->y0, levelno); - res->x1 = int_ceildivpow2(tilec->x1, levelno); - res->y1 = int_ceildivpow2(tilec->y1, levelno); - res->numbands = resno == 0 ? 1 : 3; - - /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ - if (tccp->csty & J2K_CCP_CSTY_PRT) { - pdx = tccp->prcw[resno]; - pdy = tccp->prch[resno]; - } else { - pdx = 15; - pdy = 15; - } - /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; - tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; - brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; - brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; - - res->pw = (brprcxend - tlprcxstart) >> pdx; - res->ph = (brprcyend - tlprcystart) >> pdy; - - if (resno == 0) { - tlcbgxstart = tlprcxstart; - tlcbgystart = tlprcystart; - brcbgxend = brprcxend; - brcbgyend = brprcyend; - cbgwidthexpn = pdx; - cbgheightexpn = pdy; - } else { - tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); - tlcbgystart = int_ceildivpow2(tlprcystart, 1); - brcbgxend = int_ceildivpow2(brprcxend, 1); - brcbgyend = int_ceildivpow2(brprcyend, 1); - cbgwidthexpn = pdx - 1; - cbgheightexpn = pdy - 1; - } - - cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn); - cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn); - - for (bandno = 0; bandno < res->numbands; bandno++) { - int x0b, y0b; - int gain, numbps; - opj_stepsize_t *ss = NULL; - - opj_tcd_band_t *band = &res->bands[bandno]; - - band->bandno = resno == 0 ? 0 : bandno + 1; - x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0; - y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0; - - if (band->bandno == 0) { - /* band border */ - band->x0 = int_ceildivpow2(tilec->x0, levelno); - band->y0 = int_ceildivpow2(tilec->y0, levelno); - band->x1 = int_ceildivpow2(tilec->x1, levelno); - band->y1 = int_ceildivpow2(tilec->y1, levelno); - } else { - band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1); - band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1); - band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1); - band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1); - } - - ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1]; - gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); - numbps = image->comps[compno].prec + gain; - band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)); - band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ - - for (precno = 0; precno < res->pw * res->ph; precno++) { - int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; - - int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); - int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); - int cbgxend = cbgxstart + (1 << cbgwidthexpn); - int cbgyend = cbgystart + (1 << cbgheightexpn); - - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - /* precinct size (global) */ - prc->x0 = int_max(cbgxstart, band->x0); - prc->y0 = int_max(cbgystart, band->y0); - prc->x1 = int_min(cbgxend, band->x1); - prc->y1 = int_min(cbgyend, band->y1); - - tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; - tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; - brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; - brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; - prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; - prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; - - opj_free(prc->cblks.enc); - prc->cblks.enc = (opj_tcd_cblk_enc_t*) opj_calloc(prc->cw * prc->ch, sizeof(opj_tcd_cblk_enc_t)); - - if (prc->incltree != NULL) { - tgt_destroy(prc->incltree); - } - if (prc->imsbtree != NULL) { - tgt_destroy(prc->imsbtree); - } - - prc->incltree = tgt_create(prc->cw, prc->ch); - prc->imsbtree = tgt_create(prc->cw, prc->ch); - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); - int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); - int cblkxend = cblkxstart + (1 << cblkwidthexpn); - int cblkyend = cblkystart + (1 << cblkheightexpn); - - opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; - - /* code-block size (global) */ - cblk->x0 = int_max(cblkxstart, prc->x0); - cblk->y0 = int_max(cblkystart, prc->y0); - cblk->x1 = int_min(cblkxend, prc->x1); - cblk->y1 = int_min(cblkyend, prc->y1); - cblk->data = (unsigned char*) opj_calloc(8192+2, sizeof(unsigned char)); - /* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */ - cblk->data += 2; - cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t)); - cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t)); - } - } /* precno */ - } /* bandno */ - } /* resno */ - } /* compno */ - } /* tileno */ - - /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ -} - -void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp) { - int i, j, tileno, p, q; - unsigned int x0 = 0, y0 = 0, x1 = 0, y1 = 0, w, h; - - tcd->image = image; - tcd->tcd_image->tw = cp->tw; - tcd->tcd_image->th = cp->th; - tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(cp->tw * cp->th * sizeof(opj_tcd_tile_t)); - - /* - Allocate place to store the decoded data = final image - Place limited by the tile really present in the codestream - */ - - for (j = 0; j < cp->tileno_size; j++) { - opj_tcd_tile_t *tile; - - tileno = cp->tileno[j]; - tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]); - tile->numcomps = image->numcomps; - tile->comps = (opj_tcd_tilecomp_t*) opj_calloc(image->numcomps, sizeof(opj_tcd_tilecomp_t)); - } - - for (i = 0; i < image->numcomps; i++) { - for (j = 0; j < cp->tileno_size; j++) { - opj_tcd_tile_t *tile; - opj_tcd_tilecomp_t *tilec; - - /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - - tileno = cp->tileno[j]; - - tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]); - tilec = &tile->comps[i]; - - p = tileno % cp->tw; /* si numerotation matricielle .. */ - q = tileno / cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */ - - /* 4 borders of the tile rescale on the image if necessary */ - tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0); - tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0); - tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); - tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); - - tilec->x0 = int_ceildiv(tile->x0, image->comps[i].dx); - tilec->y0 = int_ceildiv(tile->y0, image->comps[i].dy); - tilec->x1 = int_ceildiv(tile->x1, image->comps[i].dx); - tilec->y1 = int_ceildiv(tile->y1, image->comps[i].dy); - - x0 = j == 0 ? tilec->x0 : int_min(x0, (unsigned int) tilec->x0); - y0 = j == 0 ? tilec->y0 : int_min(y0, (unsigned int) tilec->x0); - x1 = j == 0 ? tilec->x1 : int_max(x1, (unsigned int) tilec->x1); - y1 = j == 0 ? tilec->y1 : int_max(y1, (unsigned int) tilec->y1); - } - - w = int_ceildivpow2(x1 - x0, image->comps[i].factor); - h = int_ceildivpow2(y1 - y0, image->comps[i].factor); - - image->comps[i].w = w; - image->comps[i].h = h; - image->comps[i].x0 = x0; - image->comps[i].y0 = y0; - } -} - -void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int tileno, opj_codestream_info_t *cstr_info) { - int compno, resno, bandno, precno, cblkno; - opj_tcp_t *tcp; - opj_tcd_tile_t *tile; - - tcd->cp = cp; - - tcp = &(cp->tcps[cp->tileno[tileno]]); - tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]); - - tileno = cp->tileno[tileno]; - - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tccp_t *tccp = &tcp->tccps[compno]; - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - /* border of each tile component (global) */ - tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); - tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy); - tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx); - tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy); - - tilec->numresolutions = tccp->numresolutions; - tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t)); - - for (resno = 0; resno < tilec->numresolutions; resno++) { - int pdx, pdy; - int levelno = tilec->numresolutions - 1 - resno; - int tlprcxstart, tlprcystart, brprcxend, brprcyend; - int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; - int cbgwidthexpn, cbgheightexpn; - int cblkwidthexpn, cblkheightexpn; - - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - /* border for each resolution level (global) */ - res->x0 = int_ceildivpow2(tilec->x0, levelno); - res->y0 = int_ceildivpow2(tilec->y0, levelno); - res->x1 = int_ceildivpow2(tilec->x1, levelno); - res->y1 = int_ceildivpow2(tilec->y1, levelno); - res->numbands = resno == 0 ? 1 : 3; - - /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ - if (tccp->csty & J2K_CCP_CSTY_PRT) { - pdx = tccp->prcw[resno]; - pdy = tccp->prch[resno]; - } else { - pdx = 15; - pdy = 15; - } - - /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; - tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; - brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; - brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; - - res->pw = (res->x0 == res->x1) ? 0 : ((brprcxend - tlprcxstart) >> pdx); - res->ph = (res->y0 == res->y1) ? 0 : ((brprcyend - tlprcystart) >> pdy); - - if (resno == 0) { - tlcbgxstart = tlprcxstart; - tlcbgystart = tlprcystart; - brcbgxend = brprcxend; - brcbgyend = brprcyend; - cbgwidthexpn = pdx; - cbgheightexpn = pdy; - } else { - tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); - tlcbgystart = int_ceildivpow2(tlprcystart, 1); - brcbgxend = int_ceildivpow2(brprcxend, 1); - brcbgyend = int_ceildivpow2(brprcyend, 1); - cbgwidthexpn = pdx - 1; - cbgheightexpn = pdy - 1; - } - - cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn); - cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn); - - for (bandno = 0; bandno < res->numbands; bandno++) { - int x0b, y0b; - int gain, numbps; - opj_stepsize_t *ss = NULL; - - opj_tcd_band_t *band = &res->bands[bandno]; - band->bandno = resno == 0 ? 0 : bandno + 1; - x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0; - y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0; - - if (band->bandno == 0) { - /* band border (global) */ - band->x0 = int_ceildivpow2(tilec->x0, levelno); - band->y0 = int_ceildivpow2(tilec->y0, levelno); - band->x1 = int_ceildivpow2(tilec->x1, levelno); - band->y1 = int_ceildivpow2(tilec->y1, levelno); - } else { - /* band border (global) */ - band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1); - band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1); - band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1); - band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1); - } - - ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1]; - gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); - numbps = image->comps[compno].prec + gain; - band->stepsize = (float)(((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)) * 0.5); - band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ - - band->precincts = (opj_tcd_precinct_t *) opj_malloc(res->pw * res->ph * sizeof(opj_tcd_precinct_t)); - - for (precno = 0; precno < res->pw * res->ph; precno++) { - int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; - int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); - int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); - int cbgxend = cbgxstart + (1 << cbgwidthexpn); - int cbgyend = cbgystart + (1 << cbgheightexpn); - - opj_tcd_precinct_t *prc = &band->precincts[precno]; - /* precinct size (global) */ - prc->x0 = int_max(cbgxstart, band->x0); - prc->y0 = int_max(cbgystart, band->y0); - prc->x1 = int_min(cbgxend, band->x1); - prc->y1 = int_min(cbgyend, band->y1); - - tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; - tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; - brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; - brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; - prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; - prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; - - prc->cblks.dec = (opj_tcd_cblk_dec_t*) opj_malloc(prc->cw * prc->ch * sizeof(opj_tcd_cblk_dec_t)); - - prc->incltree = tgt_create(prc->cw, prc->ch); - prc->imsbtree = tgt_create(prc->cw, prc->ch); - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); - int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); - int cblkxend = cblkxstart + (1 << cblkwidthexpn); - int cblkyend = cblkystart + (1 << cblkheightexpn); - - opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; - cblk->data = NULL; - cblk->segs = NULL; - /* code-block size (global) */ - cblk->x0 = int_max(cblkxstart, prc->x0); - cblk->y0 = int_max(cblkystart, prc->y0); - cblk->x1 = int_min(cblkxend, prc->x1); - cblk->y1 = int_min(cblkyend, prc->y1); - cblk->numsegs = 0; - } - } /* precno */ - } /* bandno */ - } /* resno */ - } /* compno */ - /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ -} - -void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final) { - int compno, resno, bandno, precno, cblkno; - int value; /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3]; */ - int matrice[10][10][3]; - int i, j, k; - - opj_cp_t *cp = tcd->cp; - opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; - opj_tcp_t *tcd_tcp = tcd->tcp; - - /*matrice=(int*)opj_malloc(tcd_tcp->numlayers*tcd_tile->comps[0].numresolutions*3*sizeof(int)); */ - - for (compno = 0; compno < tcd_tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; - for (i = 0; i < tcd_tcp->numlayers; i++) { - for (j = 0; j < tilec->numresolutions; j++) { - for (k = 0; k < 3; k++) { - matrice[i][j][k] = - (int) (cp->matrice[i * tilec->numresolutions * 3 + j * 3 + k] - * (float) (tcd->image->comps[compno].prec / 16.0)); - } - } - } - - for (resno = 0; resno < tilec->numresolutions; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->pw * res->ph; precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - int n; - int imsb = tcd->image->comps[compno].prec - cblk->numbps; /* number of bit-plan equal to zero */ - /* Correction of the matrix of coefficient to include the IMSB information */ - if (layno == 0) { - value = matrice[layno][resno][bandno]; - if (imsb >= value) { - value = 0; - } else { - value -= imsb; - } - } else { - value = matrice[layno][resno][bandno] - matrice[layno - 1][resno][bandno]; - if (imsb >= matrice[layno - 1][resno][bandno]) { - value -= (imsb - matrice[layno - 1][resno][bandno]); - if (value < 0) { - value = 0; - } - } - } - - if (layno == 0) { - cblk->numpassesinlayers = 0; - } - - n = cblk->numpassesinlayers; - if (cblk->numpassesinlayers == 0) { - if (value != 0) { - n = 3 * value - 2 + cblk->numpassesinlayers; - } else { - n = cblk->numpassesinlayers; - } - } else { - n = 3 * value + cblk->numpassesinlayers; - } - - layer->numpasses = n - cblk->numpassesinlayers; - - if (!layer->numpasses) - continue; - - if (cblk->numpassesinlayers == 0) { - layer->len = cblk->passes[n - 1].rate; - layer->data = cblk->data; - } else { - layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate; - layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate; - } - if (final) - cblk->numpassesinlayers = n; - } - } - } - } - } -} - -void tcd_rateallocate_fixed(opj_tcd_t *tcd) { - int layno; - for (layno = 0; layno < tcd->tcp->numlayers; layno++) { - tcd_makelayer_fixed(tcd, layno, 1); - } -} - -void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final) { - int compno, resno, bandno, precno, cblkno, passno; - - opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; - - tcd_tile->distolayer[layno] = 0; /* fixed_quality */ - - for (compno = 0; compno < tcd_tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; - for (resno = 0; resno < tilec->numresolutions; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->pw * res->ph; precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - - int n; - if (layno == 0) { - cblk->numpassesinlayers = 0; - } - n = cblk->numpassesinlayers; - for (passno = cblk->numpassesinlayers; passno < cblk->totalpasses; passno++) { - int dr; - double dd; - opj_tcd_pass_t *pass = &cblk->passes[passno]; - if (n == 0) { - dr = pass->rate; - dd = pass->distortiondec; - } else { - dr = pass->rate - cblk->passes[n - 1].rate; - dd = pass->distortiondec - cblk->passes[n - 1].distortiondec; - } - if (!dr) { - if (dd != 0) - n = passno + 1; - continue; - } - if (dd / dr >= thresh) - n = passno + 1; - } - layer->numpasses = n - cblk->numpassesinlayers; - - if (!layer->numpasses) { - layer->disto = 0; - continue; - } - if (cblk->numpassesinlayers == 0) { - layer->len = cblk->passes[n - 1].rate; - layer->data = cblk->data; - layer->disto = cblk->passes[n - 1].distortiondec; - } else { - layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate; - layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate; - layer->disto = cblk->passes[n - 1].distortiondec - cblk->passes[cblk->numpassesinlayers - 1].distortiondec; - } - - tcd_tile->distolayer[layno] += layer->disto; /* fixed_quality */ - - if (final) - cblk->numpassesinlayers = n; - } - } - } - } - } -} - -bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info) { - int compno, resno, bandno, precno, cblkno, passno, layno; - double min, max; - double cumdisto[100]; /* fixed_quality */ - const double K = 1; /* 1.1; fixed_quality */ - double maxSE = 0; - - opj_cp_t *cp = tcd->cp; - opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; - opj_tcp_t *tcd_tcp = tcd->tcp; - - min = DBL_MAX; - max = 0; - - tcd_tile->numpix = 0; /* fixed_quality */ - - for (compno = 0; compno < tcd_tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; - tilec->numpix = 0; - - for (resno = 0; resno < tilec->numresolutions; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - - for (precno = 0; precno < res->pw * res->ph; precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno]; - - for (passno = 0; passno < cblk->totalpasses; passno++) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - int dr; - double dd, rdslope; - if (passno == 0) { - dr = pass->rate; - dd = pass->distortiondec; - } else { - dr = pass->rate - cblk->passes[passno - 1].rate; - dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec; - } - if (dr == 0) { - continue; - } - rdslope = dd / dr; - if (rdslope < min) { - min = rdslope; - } - if (rdslope > max) { - max = rdslope; - } - } /* passno */ - - /* fixed_quality */ - tcd_tile->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0)); - tilec->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0)); - } /* cbklno */ - } /* precno */ - } /* bandno */ - } /* resno */ - - maxSE += (((double)(1 << tcd->image->comps[compno].prec) - 1.0) - * ((double)(1 << tcd->image->comps[compno].prec) -1.0)) - * ((double)(tilec->numpix)); - } /* compno */ - - /* index file */ - if(cstr_info) { - opj_tile_info_t *tile_info = &cstr_info->tile[tcd->tcd_tileno]; - tile_info->numpix = tcd_tile->numpix; - tile_info->distotile = tcd_tile->distotile; - tile_info->thresh = (double *) opj_malloc(tcd_tcp->numlayers * sizeof(double)); - } - - for (layno = 0; layno < tcd_tcp->numlayers; layno++) { - double lo = min; - double hi = max; - int success = 0; - int maxlen = tcd_tcp->rates[layno] ? int_min(((int) ceil(tcd_tcp->rates[layno])), len) : len; - double goodthresh = 0; - double stable_thresh = 0; - int i; - double distotarget; /* fixed_quality */ - - /* fixed_quality */ - distotarget = tcd_tile->distotile - ((K * maxSE) / pow((float)10, tcd_tcp->distoratio[layno] / 10)); - - /* Don't try to find an optimal threshold but rather take everything not included yet, if - -r xx,yy,zz,0 (disto_alloc == 1 and rates == 0) - -q xx,yy,zz,0 (fixed_quality == 1 and distoratio == 0) - ==> possible to have some lossy layers and the last layer for sure lossless */ - if ( ((cp->disto_alloc==1) && (tcd_tcp->rates[layno]>0)) || ((cp->fixed_quality==1) && (tcd_tcp->distoratio[layno]>0))) { - opj_t2_t *t2 = t2_create(tcd->cinfo, tcd->image, cp); - double thresh = 0; - - for (i = 0; i < 32; i++) { - int l = 0; - double distoachieved = 0; /* fixed_quality */ - thresh = (lo + hi) / 2; - - tcd_makelayer(tcd, layno, thresh, 0); - - if (cp->fixed_quality) { /* fixed_quality */ - if(cp->cinema){ - l = t2_encode_packets(t2,tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC, tcd->cur_totnum_tp); - if (l == -999) { - lo = thresh; - continue; - }else{ - distoachieved = layno == 0 ? - tcd_tile->distolayer[0] : cumdisto[layno - 1] + tcd_tile->distolayer[layno]; - if (distoachieved < distotarget) { - hi=thresh; - stable_thresh = thresh; - continue; - }else{ - lo=thresh; - } - } - }else{ - distoachieved = (layno == 0) ? - tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]); - if (distoachieved < distotarget) { - hi = thresh; - stable_thresh = thresh; - continue; - } - lo = thresh; - } - } else { - l = t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC, tcd->cur_totnum_tp); - /* TODO: what to do with l ??? seek / tell ??? */ - /* opj_event_msg(tcd->cinfo, EVT_INFO, "rate alloc: len=%d, max=%d\n", l, maxlen); */ - if (l == -999) { - lo = thresh; - continue; - } - hi = thresh; - stable_thresh = thresh; - } - } - success = 1; - goodthresh = stable_thresh == 0? thresh : stable_thresh; - t2_destroy(t2); - } else { - success = 1; - goodthresh = min; - } - - if (!success) { - return false; - } - - if(cstr_info) { /* Threshold for Marcela Index */ - cstr_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh; - } - tcd_makelayer(tcd, layno, goodthresh, 1); - - /* fixed_quality */ - cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]); - } - - return true; -} - -int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_codestream_info_t *cstr_info) { - int compno; - int l, i, numpacks = 0; - opj_tcd_tile_t *tile = NULL; - opj_tcp_t *tcd_tcp = NULL; - opj_cp_t *cp = NULL; - - opj_tcp_t *tcp = &tcd->cp->tcps[0]; - opj_tccp_t *tccp = &tcp->tccps[0]; - opj_image_t *image = tcd->image; - - opj_t1_t *t1 = NULL; /* T1 component */ - opj_t2_t *t2 = NULL; /* T2 component */ - - tcd->tcd_tileno = tileno; - tcd->tcd_tile = tcd->tcd_image->tiles; - tcd->tcp = &tcd->cp->tcps[tileno]; - - tile = tcd->tcd_tile; - tcd_tcp = tcd->tcp; - cp = tcd->cp; - - if(tcd->cur_tp_num == 0){ - tcd->encoding_time = opj_clock(); /* time needed to encode a tile */ - /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */ - if(cstr_info) { - opj_tcd_tilecomp_t *tilec_idx = &tile->comps[0]; /* based on component 0 */ - for (i = 0; i < tilec_idx->numresolutions; i++) { - opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[i]; - - cstr_info->tile[tileno].pw[i] = res_idx->pw; - cstr_info->tile[tileno].ph[i] = res_idx->ph; - - numpacks += res_idx->pw * res_idx->ph; - - cstr_info->tile[tileno].pdx[i] = tccp->prcw[i]; - cstr_info->tile[tileno].pdy[i] = tccp->prch[i]; - } - cstr_info->tile[tileno].packet = (opj_packet_info_t*) opj_calloc(cstr_info->numcomps * cstr_info->numlayers * numpacks, sizeof(opj_packet_info_t)); - } - /* << INDEX */ - - /*---------------TILE-------------------*/ - - for (compno = 0; compno < tile->numcomps; compno++) { - int x, y; - - int adjust = image->comps[compno].sgnd ? 0 : 1 << (image->comps[compno].prec - 1); - int offset_x = int_ceildiv(image->x0, image->comps[compno].dx); - int offset_y = int_ceildiv(image->y0, image->comps[compno].dy); - - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - int tw = tilec->x1 - tilec->x0; - int w = int_ceildiv(image->x1 - image->x0, image->comps[compno].dx); - - /* extract tile data */ - - if (tcd_tcp->tccps[compno].qmfbid == 1) { - for (y = tilec->y0; y < tilec->y1; y++) { - /* start of the src tile scanline */ - int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w]; - /* start of the dst tile scanline */ - int *tile_data = &tilec->data[(y - tilec->y0) * tw]; - for (x = tilec->x0; x < tilec->x1; x++) { - *tile_data++ = *data++ - adjust; - } - } - } else if (tcd_tcp->tccps[compno].qmfbid == 0) { - for (y = tilec->y0; y < tilec->y1; y++) { - /* start of the src tile scanline */ - int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w]; - /* start of the dst tile scanline */ - int *tile_data = &tilec->data[(y - tilec->y0) * tw]; - for (x = tilec->x0; x < tilec->x1; x++) { - *tile_data++ = (*data++ - adjust) << 11; - } - - } - } - } - - /*----------------MCT-------------------*/ - if (tcd_tcp->mct) { - int samples = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0); - if (tcd_tcp->tccps[0].qmfbid == 0) { - mct_encode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples); - } else { - mct_encode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples); - } - } - - /*----------------DWT---------------------*/ - - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - if (tcd_tcp->tccps[compno].qmfbid == 1) { - dwt_encode(tilec); - } else if (tcd_tcp->tccps[compno].qmfbid == 0) { - dwt_encode_real(tilec); - } - } - - /*------------------TIER1-----------------*/ - t1 = t1_create(tcd->cinfo); - t1_encode_cblks(t1, tile, tcd_tcp); - t1_destroy(t1); - - /*-----------RATE-ALLOCATE------------------*/ - - /* INDEX */ - if(cstr_info) { - cstr_info->index_write = 0; - } - if (cp->disto_alloc || cp->fixed_quality) { /* fixed_quality */ - /* Normal Rate/distortion allocation */ - tcd_rateallocate(tcd, dest, len, cstr_info); - } else { - /* Fixed layer allocation */ - tcd_rateallocate_fixed(tcd); - } - } - /*--------------TIER2------------------*/ - - /* INDEX */ - if(cstr_info) { - cstr_info->index_write = 1; - } - - t2 = t2_create(tcd->cinfo, image, cp); - l = t2_encode_packets(t2,tileno, tile, tcd_tcp->numlayers, dest, len, cstr_info,tcd->tp_num,tcd->tp_pos,tcd->cur_pino,FINAL_PASS,tcd->cur_totnum_tp); - t2_destroy(t2); - - /*---------------CLEAN-------------------*/ - - - if(tcd->cur_tp_num == tcd->cur_totnum_tp - 1){ - tcd->encoding_time = opj_clock() - tcd->encoding_time; - opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n", tcd->encoding_time); - - /* cleaning memory */ - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - opj_aligned_free(tilec->data); - } - } - - return l; -} - -bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info) { - int l; - int compno; - int eof = 0; - double tile_time, t1_time, dwt_time; - opj_tcd_tile_t *tile = NULL; - - opj_t1_t *t1 = NULL; /* T1 component */ - opj_t2_t *t2 = NULL; /* T2 component */ - - tcd->tcd_tileno = tileno; - tcd->tcd_tile = &(tcd->tcd_image->tiles[tileno]); - tcd->tcp = &(tcd->cp->tcps[tileno]); - tile = tcd->tcd_tile; - - tile_time = opj_clock(); /* time needed to decode a tile */ - opj_event_msg(tcd->cinfo, EVT_INFO, "tile %d of %d\n", tileno + 1, tcd->cp->tw * tcd->cp->th); - - /* INDEX >> */ - if(cstr_info) { - int resno, compno, numprec = 0; - for (compno = 0; compno < cstr_info->numcomps; compno++) { - opj_tcp_t *tcp = &tcd->cp->tcps[0]; - opj_tccp_t *tccp = &tcp->tccps[compno]; - opj_tcd_tilecomp_t *tilec_idx = &tile->comps[compno]; - for (resno = 0; resno < tilec_idx->numresolutions; resno++) { - opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[resno]; - cstr_info->tile[tileno].pw[resno] = res_idx->pw; - cstr_info->tile[tileno].ph[resno] = res_idx->ph; - numprec += res_idx->pw * res_idx->ph; - if (tccp->csty & J2K_CP_CSTY_PRT) { - cstr_info->tile[tileno].pdx[resno] = tccp->prcw[resno]; - cstr_info->tile[tileno].pdy[resno] = tccp->prch[resno]; - } - else { - cstr_info->tile[tileno].pdx[resno] = 15; - cstr_info->tile[tileno].pdx[resno] = 15; - } - } - } - cstr_info->tile[tileno].packet = (opj_packet_info_t *) opj_malloc(cstr_info->numlayers * numprec * sizeof(opj_packet_info_t)); - cstr_info->packno = 0; - } - /* << INDEX */ - - /*--------------TIER2------------------*/ - - t2 = t2_create(tcd->cinfo, tcd->image, tcd->cp); - l = t2_decode_packets(t2, src, len, tileno, tile, cstr_info); - t2_destroy(t2); - - if (l == -999) { - eof = 1; - opj_event_msg(tcd->cinfo, EVT_ERROR, "tcd_decode: incomplete bistream\n"); - } - - /*------------------TIER1-----------------*/ - - t1_time = opj_clock(); /* time needed to decode a tile */ - t1 = t1_create(tcd->cinfo); - for (compno = 0; compno < tile->numcomps; ++compno) { - opj_tcd_tilecomp_t* tilec = &tile->comps[compno]; - /* The +3 is headroom required by the vectorized DWT */ - tilec->data = (int*) opj_aligned_malloc((((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0))+3) * sizeof(int)); - t1_decode_cblks(t1, tilec, &tcd->tcp->tccps[compno]); - } - t1_destroy(t1); - t1_time = opj_clock() - t1_time; - opj_event_msg(tcd->cinfo, EVT_INFO, "- tiers-1 took %f s\n", t1_time); - - /*----------------DWT---------------------*/ - - dwt_time = opj_clock(); /* time needed to decode a tile */ - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - int numres2decode; - - if (tcd->cp->reduce != 0) { - tcd->image->comps[compno].resno_decoded = - tile->comps[compno].numresolutions - tcd->cp->reduce - 1; - if (tcd->image->comps[compno].resno_decoded < 0) { - opj_event_msg(tcd->cinfo, EVT_ERROR, "Error decoding tile. The number of resolutions to remove [%d+1] is higher than the number " - " of resolutions in the original codestream [%d]\nModify the cp_reduce parameter.\n", tcd->cp->reduce, tile->comps[compno].numresolutions); - return false; - } - } - - numres2decode = tcd->image->comps[compno].resno_decoded + 1; - if(numres2decode > 0){ - if (tcd->tcp->tccps[compno].qmfbid == 1) { - dwt_decode(tilec, numres2decode); - } else { - dwt_decode_real(tilec, numres2decode); - } - } - } - dwt_time = opj_clock() - dwt_time; - opj_event_msg(tcd->cinfo, EVT_INFO, "- dwt took %f s\n", dwt_time); - - /*----------------MCT-------------------*/ - - if (tcd->tcp->mct) { - int n = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0); - if (tcd->tcp->tccps[0].qmfbid == 1) { - mct_decode( - tile->comps[0].data, - tile->comps[1].data, - tile->comps[2].data, - n); - } else { - mct_decode_real( - (float*)tile->comps[0].data, - (float*)tile->comps[1].data, - (float*)tile->comps[2].data, - n); - } - } - - /*---------------TILE-------------------*/ - - for (compno = 0; compno < tile->numcomps; ++compno) { - opj_tcd_tilecomp_t* tilec = &tile->comps[compno]; - opj_image_comp_t* imagec = &tcd->image->comps[compno]; - opj_tcd_resolution_t* res = &tilec->resolutions[imagec->resno_decoded]; - int adjust = imagec->sgnd ? 0 : 1 << (imagec->prec - 1); - int min = imagec->sgnd ? -(1 << (imagec->prec - 1)) : 0; - int max = imagec->sgnd ? (1 << (imagec->prec - 1)) - 1 : (1 << imagec->prec) - 1; - - int tw = tilec->x1 - tilec->x0; - int w = imagec->w; - - int offset_x = int_ceildivpow2(imagec->x0, imagec->factor); - int offset_y = int_ceildivpow2(imagec->y0, imagec->factor); - - int i, j; - if(!imagec->data){ - imagec->data = (int*) opj_malloc(imagec->w * imagec->h * sizeof(int)); - } - if(tcd->tcp->tccps[compno].qmfbid == 1) { - for(j = res->y0; j < res->y1; ++j) { - for(i = res->x0; i < res->x1; ++i) { - int v = tilec->data[i - res->x0 + (j - res->y0) * tw]; - v += adjust; - imagec->data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max); - } - } - }else{ - for(j = res->y0; j < res->y1; ++j) { - for(i = res->x0; i < res->x1; ++i) { - float tmp = ((float*)tilec->data)[i - res->x0 + (j - res->y0) * tw]; - int v = lrintf(tmp); - v += adjust; - imagec->data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max); - } - } - } - opj_aligned_free(tilec->data); - } - - tile_time = opj_clock() - tile_time; /* time needed to decode a tile */ - opj_event_msg(tcd->cinfo, EVT_INFO, "- tile decoded in %f s\n", tile_time); - - if (eof) { - return false; - } - - return true; -} - -void tcd_free_decode(opj_tcd_t *tcd) { - opj_tcd_image_t *tcd_image = tcd->tcd_image; - opj_free(tcd_image->tiles); -} - -void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno) { - int compno,resno,bandno,precno; - - opj_tcd_image_t *tcd_image = tcd->tcd_image; - - opj_tcd_tile_t *tile = &tcd_image->tiles[tileno]; - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - for (resno = 0; resno < tilec->numresolutions; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->ph * res->pw; precno++) { - opj_tcd_precinct_t *prec = &band->precincts[precno]; - if (prec->imsbtree != NULL) tgt_destroy(prec->imsbtree); - if (prec->incltree != NULL) tgt_destroy(prec->incltree); - } - opj_free(band->precincts); - } - } - opj_free(tilec->resolutions); - } - opj_free(tile->comps); -} - - - +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2006-2007, Parvatha Elangovan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#include "opj_includes.h" + +void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img) { + int tileno, compno, resno, bandno, precno;/*, cblkno;*/ + + fprintf(fd, "image {\n"); + fprintf(fd, " tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n", + img->tw, img->th, tcd->image->x0, tcd->image->x1, tcd->image->y0, tcd->image->y1); + + for (tileno = 0; tileno < img->th * img->tw; tileno++) { + opj_tcd_tile_t *tile = &tcd->tcd_image->tiles[tileno]; + fprintf(fd, " tile {\n"); + fprintf(fd, " x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n", + tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps); + for (compno = 0; compno < tile->numcomps; compno++) { + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + fprintf(fd, " tilec {\n"); + fprintf(fd, + " x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\n", + tilec->x0, tilec->y0, tilec->x1, tilec->y1, tilec->numresolutions); + for (resno = 0; resno < tilec->numresolutions; resno++) { + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + fprintf(fd, "\n res {\n"); + fprintf(fd, + " x0=%d, y0=%d, x1=%d, y1=%d, pw=%d, ph=%d, numbands=%d\n", + res->x0, res->y0, res->x1, res->y1, res->pw, res->ph, res->numbands); + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + fprintf(fd, " band {\n"); + fprintf(fd, + " x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%f, numbps=%d\n", + band->x0, band->y0, band->x1, band->y1, band->stepsize, band->numbps); + for (precno = 0; precno < res->pw * res->ph; precno++) { + opj_tcd_precinct_t *prec = &band->precincts[precno]; + fprintf(fd, " prec {\n"); + fprintf(fd, + " x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\n", + prec->x0, prec->y0, prec->x1, prec->y1, prec->cw, prec->ch); + /* + for (cblkno = 0; cblkno < prec->cw * prec->ch; cblkno++) { + opj_tcd_cblk_t *cblk = &prec->cblks[cblkno]; + fprintf(fd, " cblk {\n"); + fprintf(fd, + " x0=%d, y0=%d, x1=%d, y1=%d\n", + cblk->x0, cblk->y0, cblk->x1, cblk->y1); + fprintf(fd, " }\n"); + } + */ + fprintf(fd, " }\n"); + } + fprintf(fd, " }\n"); + } + fprintf(fd, " }\n"); + } + fprintf(fd, " }\n"); + } + fprintf(fd, " }\n"); + } + fprintf(fd, "}\n"); +} + +/* ----------------------------------------------------------------------- */ + +/** +Create a new TCD handle +*/ +opj_tcd_t* tcd_create(opj_common_ptr cinfo) { + /* create the tcd structure */ + opj_tcd_t *tcd = (opj_tcd_t*)opj_malloc(sizeof(opj_tcd_t)); + if(!tcd) return NULL; + tcd->cinfo = cinfo; + tcd->tcd_image = (opj_tcd_image_t*)opj_malloc(sizeof(opj_tcd_image_t)); + if(!tcd->tcd_image) { + opj_free(tcd); + return NULL; + } + + return tcd; +} + +/** +Destroy a previously created TCD handle +*/ +void tcd_destroy(opj_tcd_t *tcd) { + if(tcd) { + opj_free(tcd->tcd_image); + opj_free(tcd); + } +} + +/* ----------------------------------------------------------------------- */ + +void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno) { + int tileno, compno, resno, bandno, precno, cblkno; + + tcd->image = image; + tcd->cp = cp; + tcd->tcd_image->tw = cp->tw; + tcd->tcd_image->th = cp->th; + tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(sizeof(opj_tcd_tile_t)); + + for (tileno = 0; tileno < 1; tileno++) { + opj_tcp_t *tcp = &cp->tcps[curtileno]; + int j; + + /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ + int p = curtileno % cp->tw; /* si numerotation matricielle .. */ + int q = curtileno / cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */ + + /* opj_tcd_tile_t *tile=&tcd->tcd_image->tiles[tileno]; */ + opj_tcd_tile_t *tile = tcd->tcd_image->tiles; + + /* 4 borders of the tile rescale on the image if necessary */ + tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0); + tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0); + tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); + tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); + tile->numcomps = image->numcomps; + /* tile->PPT=image->PPT; */ + + /* Modification of the RATE >> */ + for (j = 0; j < tcp->numlayers; j++) { + tcp->rates[j] = tcp->rates[j] ? + cp->tp_on ? + (((float) (tile->numcomps + * (tile->x1 - tile->x0) + * (tile->y1 - tile->y0) + * image->comps[0].prec)) + /(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - (((tcd->cur_totnum_tp - 1) * 14 )/ tcp->numlayers) + : + ((float) (tile->numcomps + * (tile->x1 - tile->x0) + * (tile->y1 - tile->y0) + * image->comps[0].prec))/ + (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy) + : 0; + + if (tcp->rates[j]) { + if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) { + tcp->rates[j] = tcp->rates[j - 1] + 20; + } else { + if (!j && tcp->rates[j] < 30) + tcp->rates[j] = 30; + } + + if(j == (tcp->numlayers-1)){ + tcp->rates[j] = tcp->rates[j]- 2; + } + } + } + /* << Modification of the RATE */ + + tile->comps = (opj_tcd_tilecomp_t *) opj_malloc(image->numcomps * sizeof(opj_tcd_tilecomp_t)); + for (compno = 0; compno < tile->numcomps; compno++) { + opj_tccp_t *tccp = &tcp->tccps[compno]; + + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + + /* border of each tile component (global) */ + tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); + tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy); + tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx); + tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy); + + tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int)); + tilec->numresolutions = tccp->numresolutions; + + tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t)); + + for (resno = 0; resno < tilec->numresolutions; resno++) { + int pdx, pdy; + int levelno = tilec->numresolutions - 1 - resno; + int tlprcxstart, tlprcystart, brprcxend, brprcyend; + int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; + int cbgwidthexpn, cbgheightexpn; + int cblkwidthexpn, cblkheightexpn; + + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + + /* border for each resolution level (global) */ + res->x0 = int_ceildivpow2(tilec->x0, levelno); + res->y0 = int_ceildivpow2(tilec->y0, levelno); + res->x1 = int_ceildivpow2(tilec->x1, levelno); + res->y1 = int_ceildivpow2(tilec->y1, levelno); + + res->numbands = resno == 0 ? 1 : 3; + /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ + if (tccp->csty & J2K_CCP_CSTY_PRT) { + pdx = tccp->prcw[resno]; + pdy = tccp->prch[resno]; + } else { + pdx = 15; + pdy = 15; + } + /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ + tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; + tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; + + brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; + brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; + + res->pw = (brprcxend - tlprcxstart) >> pdx; + res->ph = (brprcyend - tlprcystart) >> pdy; + + if (resno == 0) { + tlcbgxstart = tlprcxstart; + tlcbgystart = tlprcystart; + brcbgxend = brprcxend; + brcbgyend = brprcyend; + cbgwidthexpn = pdx; + cbgheightexpn = pdy; + } else { + tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); + tlcbgystart = int_ceildivpow2(tlprcystart, 1); + brcbgxend = int_ceildivpow2(brprcxend, 1); + brcbgyend = int_ceildivpow2(brprcyend, 1); + cbgwidthexpn = pdx - 1; + cbgheightexpn = pdy - 1; + } + + cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn); + cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn); + + for (bandno = 0; bandno < res->numbands; bandno++) { + int x0b, y0b, i; + int gain, numbps; + opj_stepsize_t *ss = NULL; + + opj_tcd_band_t *band = &res->bands[bandno]; + + band->bandno = resno == 0 ? 0 : bandno + 1; + x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0; + y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0; + + if (band->bandno == 0) { + /* band border (global) */ + band->x0 = int_ceildivpow2(tilec->x0, levelno); + band->y0 = int_ceildivpow2(tilec->y0, levelno); + band->x1 = int_ceildivpow2(tilec->x1, levelno); + band->y1 = int_ceildivpow2(tilec->y1, levelno); + } else { + /* band border (global) */ + band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1); + band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1); + band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1); + band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1); + } + + ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1]; + gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); + numbps = image->comps[compno].prec + gain; + + band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)); + band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ + + band->precincts = (opj_tcd_precinct_t *) opj_malloc(3 * res->pw * res->ph * sizeof(opj_tcd_precinct_t)); + + for (i = 0; i < res->pw * res->ph * 3; i++) { + band->precincts[i].imsbtree = NULL; + band->precincts[i].incltree = NULL; + band->precincts[i].cblks.enc = NULL; + } + + for (precno = 0; precno < res->pw * res->ph; precno++) { + int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; + + int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); + int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); + int cbgxend = cbgxstart + (1 << cbgwidthexpn); + int cbgyend = cbgystart + (1 << cbgheightexpn); + + opj_tcd_precinct_t *prc = &band->precincts[precno]; + + /* precinct size (global) */ + prc->x0 = int_max(cbgxstart, band->x0); + prc->y0 = int_max(cbgystart, band->y0); + prc->x1 = int_min(cbgxend, band->x1); + prc->y1 = int_min(cbgyend, band->y1); + + tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; + tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; + brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; + brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; + prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; + prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; + + prc->cblks.enc = (opj_tcd_cblk_enc_t*) opj_calloc((prc->cw * prc->ch), sizeof(opj_tcd_cblk_enc_t)); + prc->incltree = tgt_create(prc->cw, prc->ch); + prc->imsbtree = tgt_create(prc->cw, prc->ch); + + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); + int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); + int cblkxend = cblkxstart + (1 << cblkwidthexpn); + int cblkyend = cblkystart + (1 << cblkheightexpn); + + opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; + + /* code-block size (global) */ + cblk->x0 = int_max(cblkxstart, prc->x0); + cblk->y0 = int_max(cblkystart, prc->y0); + cblk->x1 = int_min(cblkxend, prc->x1); + cblk->y1 = int_min(cblkyend, prc->y1); + cblk->data = (unsigned char*) opj_calloc(8192+2, sizeof(unsigned char)); + /* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */ + cblk->data += 2; + cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t)); + cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t)); + } + } + } + } + } + } + + /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ +} + +void tcd_free_encode(opj_tcd_t *tcd) { + int tileno, compno, resno, bandno, precno, cblkno; + + for (tileno = 0; tileno < 1; tileno++) { + opj_tcd_tile_t *tile = tcd->tcd_image->tiles; + + for (compno = 0; compno < tile->numcomps; compno++) { + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + + for (resno = 0; resno < tilec->numresolutions; resno++) { + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + + for (precno = 0; precno < res->pw * res->ph; precno++) { + opj_tcd_precinct_t *prc = &band->precincts[precno]; + + if (prc->incltree != NULL) { + tgt_destroy(prc->incltree); + prc->incltree = NULL; + } + if (prc->imsbtree != NULL) { + tgt_destroy(prc->imsbtree); + prc->imsbtree = NULL; + } + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_free(prc->cblks.enc[cblkno].data - 2); + opj_free(prc->cblks.enc[cblkno].layers); + opj_free(prc->cblks.enc[cblkno].passes); + } + opj_free(prc->cblks.enc); + } /* for (precno */ + opj_free(band->precincts); + band->precincts = NULL; + } /* for (bandno */ + } /* for (resno */ + opj_free(tilec->resolutions); + tilec->resolutions = NULL; + } /* for (compno */ + opj_free(tile->comps); + tile->comps = NULL; + } /* for (tileno */ + opj_free(tcd->tcd_image->tiles); + tcd->tcd_image->tiles = NULL; +} + +void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno) { + int tileno, compno, resno, bandno, precno, cblkno; + + for (tileno = 0; tileno < 1; tileno++) { + opj_tcp_t *tcp = &cp->tcps[curtileno]; + int j; + /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ + int p = curtileno % cp->tw; + int q = curtileno / cp->tw; + + opj_tcd_tile_t *tile = tcd->tcd_image->tiles; + + /* 4 borders of the tile rescale on the image if necessary */ + tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0); + tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0); + tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); + tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); + + tile->numcomps = image->numcomps; + /* tile->PPT=image->PPT; */ + + /* Modification of the RATE >> */ + for (j = 0; j < tcp->numlayers; j++) { + tcp->rates[j] = tcp->rates[j] ? + cp->tp_on ? + (((float) (tile->numcomps + * (tile->x1 - tile->x0) + * (tile->y1 - tile->y0) + * image->comps[0].prec)) + /(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - (((tcd->cur_totnum_tp - 1) * 14 )/ tcp->numlayers) + : + ((float) (tile->numcomps + * (tile->x1 - tile->x0) + * (tile->y1 - tile->y0) + * image->comps[0].prec))/ + (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy) + : 0; + + if (tcp->rates[j]) { + if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) { + tcp->rates[j] = tcp->rates[j - 1] + 20; + } else { + if (!j && tcp->rates[j] < 30) + tcp->rates[j] = 30; + } + } + } + /* << Modification of the RATE */ + + /* tile->comps=(opj_tcd_tilecomp_t*)opj_realloc(tile->comps,image->numcomps*sizeof(opj_tcd_tilecomp_t)); */ + for (compno = 0; compno < tile->numcomps; compno++) { + opj_tccp_t *tccp = &tcp->tccps[compno]; + + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + + /* border of each tile component (global) */ + tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); + tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy); + tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx); + tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy); + + tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int)); + tilec->numresolutions = tccp->numresolutions; + /* tilec->resolutions=(opj_tcd_resolution_t*)opj_realloc(tilec->resolutions,tilec->numresolutions*sizeof(opj_tcd_resolution_t)); */ + for (resno = 0; resno < tilec->numresolutions; resno++) { + int pdx, pdy; + + int levelno = tilec->numresolutions - 1 - resno; + int tlprcxstart, tlprcystart, brprcxend, brprcyend; + int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; + int cbgwidthexpn, cbgheightexpn; + int cblkwidthexpn, cblkheightexpn; + + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + + /* border for each resolution level (global) */ + res->x0 = int_ceildivpow2(tilec->x0, levelno); + res->y0 = int_ceildivpow2(tilec->y0, levelno); + res->x1 = int_ceildivpow2(tilec->x1, levelno); + res->y1 = int_ceildivpow2(tilec->y1, levelno); + res->numbands = resno == 0 ? 1 : 3; + + /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ + if (tccp->csty & J2K_CCP_CSTY_PRT) { + pdx = tccp->prcw[resno]; + pdy = tccp->prch[resno]; + } else { + pdx = 15; + pdy = 15; + } + /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ + tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; + tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; + brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; + brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; + + res->pw = (brprcxend - tlprcxstart) >> pdx; + res->ph = (brprcyend - tlprcystart) >> pdy; + + if (resno == 0) { + tlcbgxstart = tlprcxstart; + tlcbgystart = tlprcystart; + brcbgxend = brprcxend; + brcbgyend = brprcyend; + cbgwidthexpn = pdx; + cbgheightexpn = pdy; + } else { + tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); + tlcbgystart = int_ceildivpow2(tlprcystart, 1); + brcbgxend = int_ceildivpow2(brprcxend, 1); + brcbgyend = int_ceildivpow2(brprcyend, 1); + cbgwidthexpn = pdx - 1; + cbgheightexpn = pdy - 1; + } + + cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn); + cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn); + + for (bandno = 0; bandno < res->numbands; bandno++) { + int x0b, y0b; + int gain, numbps; + opj_stepsize_t *ss = NULL; + + opj_tcd_band_t *band = &res->bands[bandno]; + + band->bandno = resno == 0 ? 0 : bandno + 1; + x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0; + y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0; + + if (band->bandno == 0) { + /* band border */ + band->x0 = int_ceildivpow2(tilec->x0, levelno); + band->y0 = int_ceildivpow2(tilec->y0, levelno); + band->x1 = int_ceildivpow2(tilec->x1, levelno); + band->y1 = int_ceildivpow2(tilec->y1, levelno); + } else { + band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1); + band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1); + band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1); + band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1); + } + + ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1]; + gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); + numbps = image->comps[compno].prec + gain; + band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)); + band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ + + for (precno = 0; precno < res->pw * res->ph; precno++) { + int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; + + int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); + int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); + int cbgxend = cbgxstart + (1 << cbgwidthexpn); + int cbgyend = cbgystart + (1 << cbgheightexpn); + + opj_tcd_precinct_t *prc = &band->precincts[precno]; + + /* precinct size (global) */ + prc->x0 = int_max(cbgxstart, band->x0); + prc->y0 = int_max(cbgystart, band->y0); + prc->x1 = int_min(cbgxend, band->x1); + prc->y1 = int_min(cbgyend, band->y1); + + tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; + tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; + brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; + brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; + prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; + prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; + + opj_free(prc->cblks.enc); + prc->cblks.enc = (opj_tcd_cblk_enc_t*) opj_calloc(prc->cw * prc->ch, sizeof(opj_tcd_cblk_enc_t)); + + if (prc->incltree != NULL) { + tgt_destroy(prc->incltree); + } + if (prc->imsbtree != NULL) { + tgt_destroy(prc->imsbtree); + } + + prc->incltree = tgt_create(prc->cw, prc->ch); + prc->imsbtree = tgt_create(prc->cw, prc->ch); + + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); + int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); + int cblkxend = cblkxstart + (1 << cblkwidthexpn); + int cblkyend = cblkystart + (1 << cblkheightexpn); + + opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; + + /* code-block size (global) */ + cblk->x0 = int_max(cblkxstart, prc->x0); + cblk->y0 = int_max(cblkystart, prc->y0); + cblk->x1 = int_min(cblkxend, prc->x1); + cblk->y1 = int_min(cblkyend, prc->y1); + cblk->data = (unsigned char*) opj_calloc(8192+2, sizeof(unsigned char)); + /* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */ + cblk->data += 2; + cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t)); + cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t)); + } + } /* precno */ + } /* bandno */ + } /* resno */ + } /* compno */ + } /* tileno */ + + /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ +} + +void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp) { + int i, j, tileno, p, q; + unsigned int x0 = 0, y0 = 0, x1 = 0, y1 = 0, w, h; + + tcd->image = image; + tcd->tcd_image->tw = cp->tw; + tcd->tcd_image->th = cp->th; + tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(cp->tw * cp->th * sizeof(opj_tcd_tile_t)); + + /* + Allocate place to store the decoded data = final image + Place limited by the tile really present in the codestream + */ + + for (j = 0; j < cp->tileno_size; j++) { + opj_tcd_tile_t *tile; + + tileno = cp->tileno[j]; + tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]); + tile->numcomps = image->numcomps; + tile->comps = (opj_tcd_tilecomp_t*) opj_calloc(image->numcomps, sizeof(opj_tcd_tilecomp_t)); + } + + for (i = 0; i < image->numcomps; i++) { + for (j = 0; j < cp->tileno_size; j++) { + opj_tcd_tile_t *tile; + opj_tcd_tilecomp_t *tilec; + + /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ + + tileno = cp->tileno[j]; + + tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]); + tilec = &tile->comps[i]; + + p = tileno % cp->tw; /* si numerotation matricielle .. */ + q = tileno / cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */ + + /* 4 borders of the tile rescale on the image if necessary */ + tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0); + tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0); + tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); + tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); + + tilec->x0 = int_ceildiv(tile->x0, image->comps[i].dx); + tilec->y0 = int_ceildiv(tile->y0, image->comps[i].dy); + tilec->x1 = int_ceildiv(tile->x1, image->comps[i].dx); + tilec->y1 = int_ceildiv(tile->y1, image->comps[i].dy); + + x0 = j == 0 ? tilec->x0 : int_min(x0, (unsigned int) tilec->x0); + y0 = j == 0 ? tilec->y0 : int_min(y0, (unsigned int) tilec->y0); + x1 = j == 0 ? tilec->x1 : int_max(x1, (unsigned int) tilec->x1); + y1 = j == 0 ? tilec->y1 : int_max(y1, (unsigned int) tilec->y1); + } + + w = int_ceildivpow2(x1 - x0, image->comps[i].factor); + h = int_ceildivpow2(y1 - y0, image->comps[i].factor); + + image->comps[i].w = w; + image->comps[i].h = h; + image->comps[i].x0 = x0; + image->comps[i].y0 = y0; + } +} + +void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int tileno, opj_codestream_info_t *cstr_info) { + int compno, resno, bandno, precno, cblkno; + opj_tcp_t *tcp; + opj_tcd_tile_t *tile; + + OPJ_ARG_NOT_USED(cstr_info); + + tcd->cp = cp; + + tcp = &(cp->tcps[cp->tileno[tileno]]); + tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]); + + tileno = cp->tileno[tileno]; + + for (compno = 0; compno < tile->numcomps; compno++) { + opj_tccp_t *tccp = &tcp->tccps[compno]; + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + + /* border of each tile component (global) */ + tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); + tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy); + tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx); + tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy); + + tilec->numresolutions = tccp->numresolutions; + tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t)); + + for (resno = 0; resno < tilec->numresolutions; resno++) { + int pdx, pdy; + int levelno = tilec->numresolutions - 1 - resno; + int tlprcxstart, tlprcystart, brprcxend, brprcyend; + int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; + int cbgwidthexpn, cbgheightexpn; + int cblkwidthexpn, cblkheightexpn; + + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + + /* border for each resolution level (global) */ + res->x0 = int_ceildivpow2(tilec->x0, levelno); + res->y0 = int_ceildivpow2(tilec->y0, levelno); + res->x1 = int_ceildivpow2(tilec->x1, levelno); + res->y1 = int_ceildivpow2(tilec->y1, levelno); + res->numbands = resno == 0 ? 1 : 3; + + /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ + if (tccp->csty & J2K_CCP_CSTY_PRT) { + pdx = tccp->prcw[resno]; + pdy = tccp->prch[resno]; + } else { + pdx = 15; + pdy = 15; + } + + /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ + tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; + tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; + brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; + brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; + + res->pw = (res->x0 == res->x1) ? 0 : ((brprcxend - tlprcxstart) >> pdx); + res->ph = (res->y0 == res->y1) ? 0 : ((brprcyend - tlprcystart) >> pdy); + + if (resno == 0) { + tlcbgxstart = tlprcxstart; + tlcbgystart = tlprcystart; + brcbgxend = brprcxend; + brcbgyend = brprcyend; + cbgwidthexpn = pdx; + cbgheightexpn = pdy; + } else { + tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); + tlcbgystart = int_ceildivpow2(tlprcystart, 1); + brcbgxend = int_ceildivpow2(brprcxend, 1); + brcbgyend = int_ceildivpow2(brprcyend, 1); + cbgwidthexpn = pdx - 1; + cbgheightexpn = pdy - 1; + } + + cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn); + cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn); + + for (bandno = 0; bandno < res->numbands; bandno++) { + int x0b, y0b; + int gain, numbps; + opj_stepsize_t *ss = NULL; + + opj_tcd_band_t *band = &res->bands[bandno]; + band->bandno = resno == 0 ? 0 : bandno + 1; + x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0; + y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0; + + if (band->bandno == 0) { + /* band border (global) */ + band->x0 = int_ceildivpow2(tilec->x0, levelno); + band->y0 = int_ceildivpow2(tilec->y0, levelno); + band->x1 = int_ceildivpow2(tilec->x1, levelno); + band->y1 = int_ceildivpow2(tilec->y1, levelno); + } else { + /* band border (global) */ + band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1); + band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1); + band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1); + band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1); + } + + ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1]; + gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); + numbps = image->comps[compno].prec + gain; + band->stepsize = (float)(((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)) * 0.5); + band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ + + band->precincts = (opj_tcd_precinct_t *) opj_malloc(res->pw * res->ph * sizeof(opj_tcd_precinct_t)); + + for (precno = 0; precno < res->pw * res->ph; precno++) { + int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; + int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); + int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); + int cbgxend = cbgxstart + (1 << cbgwidthexpn); + int cbgyend = cbgystart + (1 << cbgheightexpn); + + opj_tcd_precinct_t *prc = &band->precincts[precno]; + /* precinct size (global) */ + prc->x0 = int_max(cbgxstart, band->x0); + prc->y0 = int_max(cbgystart, band->y0); + prc->x1 = int_min(cbgxend, band->x1); + prc->y1 = int_min(cbgyend, band->y1); + + tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; + tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; + brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; + brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; + prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; + prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; + + prc->cblks.dec = (opj_tcd_cblk_dec_t*) opj_malloc(prc->cw * prc->ch * sizeof(opj_tcd_cblk_dec_t)); + + prc->incltree = tgt_create(prc->cw, prc->ch); + prc->imsbtree = tgt_create(prc->cw, prc->ch); + + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); + int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); + int cblkxend = cblkxstart + (1 << cblkwidthexpn); + int cblkyend = cblkystart + (1 << cblkheightexpn); + + opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; + cblk->data = NULL; + cblk->segs = NULL; + /* code-block size (global) */ + cblk->x0 = int_max(cblkxstart, prc->x0); + cblk->y0 = int_max(cblkystart, prc->y0); + cblk->x1 = int_min(cblkxend, prc->x1); + cblk->y1 = int_min(cblkyend, prc->y1); + cblk->numsegs = 0; + } + } /* precno */ + } /* bandno */ + } /* resno */ + } /* compno */ + /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ +} + +void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final) { + int compno, resno, bandno, precno, cblkno; + int value; /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3]; */ + int matrice[10][10][3]; + int i, j, k; + + opj_cp_t *cp = tcd->cp; + opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; + opj_tcp_t *tcd_tcp = tcd->tcp; + + /*matrice=(int*)opj_malloc(tcd_tcp->numlayers*tcd_tile->comps[0].numresolutions*3*sizeof(int)); */ + + for (compno = 0; compno < tcd_tile->numcomps; compno++) { + opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; + for (i = 0; i < tcd_tcp->numlayers; i++) { + for (j = 0; j < tilec->numresolutions; j++) { + for (k = 0; k < 3; k++) { + matrice[i][j][k] = + (int) (cp->matrice[i * tilec->numresolutions * 3 + j * 3 + k] + * (float) (tcd->image->comps[compno].prec / 16.0)); + } + } + } + + for (resno = 0; resno < tilec->numresolutions; resno++) { + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + for (precno = 0; precno < res->pw * res->ph; precno++) { + opj_tcd_precinct_t *prc = &band->precincts[precno]; + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno]; + opj_tcd_layer_t *layer = &cblk->layers[layno]; + int n; + int imsb = tcd->image->comps[compno].prec - cblk->numbps; /* number of bit-plan equal to zero */ + /* Correction of the matrix of coefficient to include the IMSB information */ + if (layno == 0) { + value = matrice[layno][resno][bandno]; + if (imsb >= value) { + value = 0; + } else { + value -= imsb; + } + } else { + value = matrice[layno][resno][bandno] - matrice[layno - 1][resno][bandno]; + if (imsb >= matrice[layno - 1][resno][bandno]) { + value -= (imsb - matrice[layno - 1][resno][bandno]); + if (value < 0) { + value = 0; + } + } + } + + if (layno == 0) { + cblk->numpassesinlayers = 0; + } + + n = cblk->numpassesinlayers; + if (cblk->numpassesinlayers == 0) { + if (value != 0) { + n = 3 * value - 2 + cblk->numpassesinlayers; + } else { + n = cblk->numpassesinlayers; + } + } else { + n = 3 * value + cblk->numpassesinlayers; + } + + layer->numpasses = n - cblk->numpassesinlayers; + + if (!layer->numpasses) + continue; + + if (cblk->numpassesinlayers == 0) { + layer->len = cblk->passes[n - 1].rate; + layer->data = cblk->data; + } else { + layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate; + layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate; + } + if (final) + cblk->numpassesinlayers = n; + } + } + } + } + } +} + +void tcd_rateallocate_fixed(opj_tcd_t *tcd) { + int layno; + for (layno = 0; layno < tcd->tcp->numlayers; layno++) { + tcd_makelayer_fixed(tcd, layno, 1); + } +} + +void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final) { + int compno, resno, bandno, precno, cblkno, passno; + + opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; + + tcd_tile->distolayer[layno] = 0; /* fixed_quality */ + + for (compno = 0; compno < tcd_tile->numcomps; compno++) { + opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; + for (resno = 0; resno < tilec->numresolutions; resno++) { + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + for (precno = 0; precno < res->pw * res->ph; precno++) { + opj_tcd_precinct_t *prc = &band->precincts[precno]; + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno]; + opj_tcd_layer_t *layer = &cblk->layers[layno]; + + int n; + if (layno == 0) { + cblk->numpassesinlayers = 0; + } + n = cblk->numpassesinlayers; + for (passno = cblk->numpassesinlayers; passno < cblk->totalpasses; passno++) { + int dr; + double dd; + opj_tcd_pass_t *pass = &cblk->passes[passno]; + if (n == 0) { + dr = pass->rate; + dd = pass->distortiondec; + } else { + dr = pass->rate - cblk->passes[n - 1].rate; + dd = pass->distortiondec - cblk->passes[n - 1].distortiondec; + } + if (!dr) { + if (dd != 0) + n = passno + 1; + continue; + } + if (dd / dr >= thresh) + n = passno + 1; + } + layer->numpasses = n - cblk->numpassesinlayers; + + if (!layer->numpasses) { + layer->disto = 0; + continue; + } + if (cblk->numpassesinlayers == 0) { + layer->len = cblk->passes[n - 1].rate; + layer->data = cblk->data; + layer->disto = cblk->passes[n - 1].distortiondec; + } else { + layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate; + layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate; + layer->disto = cblk->passes[n - 1].distortiondec - cblk->passes[cblk->numpassesinlayers - 1].distortiondec; + } + + tcd_tile->distolayer[layno] += layer->disto; /* fixed_quality */ + + if (final) + cblk->numpassesinlayers = n; + } + } + } + } + } +} + +opj_bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info) { + int compno, resno, bandno, precno, cblkno, passno, layno; + double min, max; + double cumdisto[100]; /* fixed_quality */ + const double K = 1; /* 1.1; fixed_quality */ + double maxSE = 0; + + opj_cp_t *cp = tcd->cp; + opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; + opj_tcp_t *tcd_tcp = tcd->tcp; + + min = DBL_MAX; + max = 0; + + tcd_tile->numpix = 0; /* fixed_quality */ + + for (compno = 0; compno < tcd_tile->numcomps; compno++) { + opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; + tilec->numpix = 0; + + for (resno = 0; resno < tilec->numresolutions; resno++) { + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + + for (precno = 0; precno < res->pw * res->ph; precno++) { + opj_tcd_precinct_t *prc = &band->precincts[precno]; + + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno]; + + for (passno = 0; passno < cblk->totalpasses; passno++) { + opj_tcd_pass_t *pass = &cblk->passes[passno]; + int dr; + double dd, rdslope; + if (passno == 0) { + dr = pass->rate; + dd = pass->distortiondec; + } else { + dr = pass->rate - cblk->passes[passno - 1].rate; + dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec; + } + if (dr == 0) { + continue; + } + rdslope = dd / dr; + if (rdslope < min) { + min = rdslope; + } + if (rdslope > max) { + max = rdslope; + } + } /* passno */ + + /* fixed_quality */ + tcd_tile->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0)); + tilec->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0)); + } /* cbklno */ + } /* precno */ + } /* bandno */ + } /* resno */ + + maxSE += (((double)(1 << tcd->image->comps[compno].prec) - 1.0) + * ((double)(1 << tcd->image->comps[compno].prec) -1.0)) + * ((double)(tilec->numpix)); + } /* compno */ + + /* index file */ + if(cstr_info) { + opj_tile_info_t *tile_info = &cstr_info->tile[tcd->tcd_tileno]; + tile_info->numpix = tcd_tile->numpix; + tile_info->distotile = tcd_tile->distotile; + tile_info->thresh = (double *) opj_malloc(tcd_tcp->numlayers * sizeof(double)); + } + + for (layno = 0; layno < tcd_tcp->numlayers; layno++) { + double lo = min; + double hi = max; + int success = 0; + int maxlen = tcd_tcp->rates[layno] ? int_min(((int) ceil(tcd_tcp->rates[layno])), len) : len; + double goodthresh = 0; + double stable_thresh = 0; + int i; + double distotarget; /* fixed_quality */ + + /* fixed_quality */ + distotarget = tcd_tile->distotile - ((K * maxSE) / pow((float)10, tcd_tcp->distoratio[layno] / 10)); + + /* Don't try to find an optimal threshold but rather take everything not included yet, if + -r xx,yy,zz,0 (disto_alloc == 1 and rates == 0) + -q xx,yy,zz,0 (fixed_quality == 1 and distoratio == 0) + ==> possible to have some lossy layers and the last layer for sure lossless */ + if ( ((cp->disto_alloc==1) && (tcd_tcp->rates[layno]>0)) || ((cp->fixed_quality==1) && (tcd_tcp->distoratio[layno]>0))) { + opj_t2_t *t2 = t2_create(tcd->cinfo, tcd->image, cp); + double thresh = 0; + + for (i = 0; i < 128; i++) { + int l = 0; + double distoachieved = 0; /* fixed_quality */ + thresh = (lo + hi) / 2; + + tcd_makelayer(tcd, layno, thresh, 0); + + if (cp->fixed_quality) { /* fixed_quality */ + if(cp->cinema){ + l = t2_encode_packets(t2,tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC, tcd->cur_totnum_tp); + if (l == -999) { + lo = thresh; + continue; + }else{ + distoachieved = layno == 0 ? + tcd_tile->distolayer[0] : cumdisto[layno - 1] + tcd_tile->distolayer[layno]; + if (distoachieved < distotarget) { + hi=thresh; + stable_thresh = thresh; + continue; + }else{ + lo=thresh; + } + } + }else{ + distoachieved = (layno == 0) ? + tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]); + if (distoachieved < distotarget) { + hi = thresh; + stable_thresh = thresh; + continue; + } + lo = thresh; + } + } else { + l = t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC, tcd->cur_totnum_tp); + /* TODO: what to do with l ??? seek / tell ??? */ + /* opj_event_msg(tcd->cinfo, EVT_INFO, "rate alloc: len=%d, max=%d\n", l, maxlen); */ + if (l == -999) { + lo = thresh; + continue; + } + hi = thresh; + stable_thresh = thresh; + } + } + success = 1; + goodthresh = stable_thresh == 0? thresh : stable_thresh; + t2_destroy(t2); + } else { + success = 1; + goodthresh = min; + } + + if (!success) { + return OPJ_FALSE; + } + + if(cstr_info) { /* Threshold for Marcela Index */ + cstr_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh; + } + tcd_makelayer(tcd, layno, goodthresh, 1); + + /* fixed_quality */ + cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]); + } + + return OPJ_TRUE; +} + +int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_codestream_info_t *cstr_info) { + int compno; + int l, i, numpacks = 0; + opj_tcd_tile_t *tile = NULL; + opj_tcp_t *tcd_tcp = NULL; + opj_cp_t *cp = NULL; + + opj_tcp_t *tcp = &tcd->cp->tcps[0]; + opj_tccp_t *tccp = &tcp->tccps[0]; + opj_image_t *image = tcd->image; + + opj_t1_t *t1 = NULL; /* T1 component */ + opj_t2_t *t2 = NULL; /* T2 component */ + + tcd->tcd_tileno = tileno; + tcd->tcd_tile = tcd->tcd_image->tiles; + tcd->tcp = &tcd->cp->tcps[tileno]; + + tile = tcd->tcd_tile; + tcd_tcp = tcd->tcp; + cp = tcd->cp; + + if(tcd->cur_tp_num == 0){ + tcd->encoding_time = opj_clock(); /* time needed to encode a tile */ + /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */ + if(cstr_info) { + opj_tcd_tilecomp_t *tilec_idx = &tile->comps[0]; /* based on component 0 */ + for (i = 0; i < tilec_idx->numresolutions; i++) { + opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[i]; + + cstr_info->tile[tileno].pw[i] = res_idx->pw; + cstr_info->tile[tileno].ph[i] = res_idx->ph; + + numpacks += res_idx->pw * res_idx->ph; + + cstr_info->tile[tileno].pdx[i] = tccp->prcw[i]; + cstr_info->tile[tileno].pdy[i] = tccp->prch[i]; + } + cstr_info->tile[tileno].packet = (opj_packet_info_t*) opj_calloc(cstr_info->numcomps * cstr_info->numlayers * numpacks, sizeof(opj_packet_info_t)); + } + /* << INDEX */ + + /*---------------TILE-------------------*/ + + for (compno = 0; compno < tile->numcomps; compno++) { + int x, y; + + int adjust = image->comps[compno].sgnd ? 0 : 1 << (image->comps[compno].prec - 1); + int offset_x = int_ceildiv(image->x0, image->comps[compno].dx); + int offset_y = int_ceildiv(image->y0, image->comps[compno].dy); + + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + int tw = tilec->x1 - tilec->x0; + int w = int_ceildiv(image->x1 - image->x0, image->comps[compno].dx); + + /* extract tile data */ + + if (tcd_tcp->tccps[compno].qmfbid == 1) { + for (y = tilec->y0; y < tilec->y1; y++) { + /* start of the src tile scanline */ + int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w]; + /* start of the dst tile scanline */ + int *tile_data = &tilec->data[(y - tilec->y0) * tw]; + for (x = tilec->x0; x < tilec->x1; x++) { + *tile_data++ = *data++ - adjust; + } + } + } else if (tcd_tcp->tccps[compno].qmfbid == 0) { + for (y = tilec->y0; y < tilec->y1; y++) { + /* start of the src tile scanline */ + int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w]; + /* start of the dst tile scanline */ + int *tile_data = &tilec->data[(y - tilec->y0) * tw]; + for (x = tilec->x0; x < tilec->x1; x++) { + *tile_data++ = (*data++ - adjust) << 11; + } + + } + } + } + + /*----------------MCT-------------------*/ + if (tcd_tcp->mct) { + int samples = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0); + if (tcd_tcp->tccps[0].qmfbid == 0) { + mct_encode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples); + } else { + mct_encode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples); + } + } + + /*----------------DWT---------------------*/ + + for (compno = 0; compno < tile->numcomps; compno++) { + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + if (tcd_tcp->tccps[compno].qmfbid == 1) { + dwt_encode(tilec); + } else if (tcd_tcp->tccps[compno].qmfbid == 0) { + dwt_encode_real(tilec); + } + } + + /*------------------TIER1-----------------*/ + t1 = t1_create(tcd->cinfo); + t1_encode_cblks(t1, tile, tcd_tcp); + t1_destroy(t1); + + /*-----------RATE-ALLOCATE------------------*/ + + /* INDEX */ + if(cstr_info) { + cstr_info->index_write = 0; + } + if (cp->disto_alloc || cp->fixed_quality) { /* fixed_quality */ + /* Normal Rate/distortion allocation */ + tcd_rateallocate(tcd, dest, len, cstr_info); + } else { + /* Fixed layer allocation */ + tcd_rateallocate_fixed(tcd); + } + } + /*--------------TIER2------------------*/ + + /* INDEX */ + if(cstr_info) { + cstr_info->index_write = 1; + } + + t2 = t2_create(tcd->cinfo, image, cp); + l = t2_encode_packets(t2,tileno, tile, tcd_tcp->numlayers, dest, len, cstr_info,tcd->tp_num,tcd->tp_pos,tcd->cur_pino,FINAL_PASS,tcd->cur_totnum_tp); + t2_destroy(t2); + + /*---------------CLEAN-------------------*/ + + + if(tcd->cur_tp_num == tcd->cur_totnum_tp - 1){ + tcd->encoding_time = opj_clock() - tcd->encoding_time; + opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n", tcd->encoding_time); + + /* cleaning memory */ + for (compno = 0; compno < tile->numcomps; compno++) { + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + opj_aligned_free(tilec->data); + } + } + + return l; +} + +opj_bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info) { + int l; + int compno; + int eof = 0; + double tile_time, t1_time, dwt_time; + opj_tcd_tile_t *tile = NULL; + + opj_t1_t *t1 = NULL; /* T1 component */ + opj_t2_t *t2 = NULL; /* T2 component */ + + tcd->tcd_tileno = tileno; + tcd->tcd_tile = &(tcd->tcd_image->tiles[tileno]); + tcd->tcp = &(tcd->cp->tcps[tileno]); + tile = tcd->tcd_tile; + + tile_time = opj_clock(); /* time needed to decode a tile */ + opj_event_msg(tcd->cinfo, EVT_INFO, "tile %d of %d\n", tileno + 1, tcd->cp->tw * tcd->cp->th); + + /* INDEX >> */ + if(cstr_info) { + int resno, compno, numprec = 0; + for (compno = 0; compno < cstr_info->numcomps; compno++) { + opj_tcp_t *tcp = &tcd->cp->tcps[0]; + opj_tccp_t *tccp = &tcp->tccps[compno]; + opj_tcd_tilecomp_t *tilec_idx = &tile->comps[compno]; + for (resno = 0; resno < tilec_idx->numresolutions; resno++) { + opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[resno]; + cstr_info->tile[tileno].pw[resno] = res_idx->pw; + cstr_info->tile[tileno].ph[resno] = res_idx->ph; + numprec += res_idx->pw * res_idx->ph; + if (tccp->csty & J2K_CP_CSTY_PRT) { + cstr_info->tile[tileno].pdx[resno] = tccp->prcw[resno]; + cstr_info->tile[tileno].pdy[resno] = tccp->prch[resno]; + } + else { + cstr_info->tile[tileno].pdx[resno] = 15; + cstr_info->tile[tileno].pdy[resno] = 15; + } + } + } + cstr_info->tile[tileno].packet = (opj_packet_info_t *) opj_malloc(cstr_info->numlayers * numprec * sizeof(opj_packet_info_t)); + cstr_info->packno = 0; + } + /* << INDEX */ + + /*--------------TIER2------------------*/ + + t2 = t2_create(tcd->cinfo, tcd->image, tcd->cp); + l = t2_decode_packets(t2, src, len, tileno, tile, cstr_info); + t2_destroy(t2); + + if (l == -999) { + eof = 1; + opj_event_msg(tcd->cinfo, EVT_ERROR, "tcd_decode: incomplete bistream\n"); + } + + /*------------------TIER1-----------------*/ + + t1_time = opj_clock(); /* time needed to decode a tile */ + t1 = t1_create(tcd->cinfo); + for (compno = 0; compno < tile->numcomps; ++compno) { + opj_tcd_tilecomp_t* tilec = &tile->comps[compno]; + /* The +3 is headroom required by the vectorized DWT */ + tilec->data = (int*) opj_aligned_malloc((((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0))+3) * sizeof(int)); + t1_decode_cblks(t1, tilec, &tcd->tcp->tccps[compno]); + } + t1_destroy(t1); + t1_time = opj_clock() - t1_time; + opj_event_msg(tcd->cinfo, EVT_INFO, "- tiers-1 took %f s\n", t1_time); + + /*----------------DWT---------------------*/ + + dwt_time = opj_clock(); /* time needed to decode a tile */ + for (compno = 0; compno < tile->numcomps; compno++) { + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + int numres2decode; + + if (tcd->cp->reduce != 0) { + tcd->image->comps[compno].resno_decoded = + tile->comps[compno].numresolutions - tcd->cp->reduce - 1; + if (tcd->image->comps[compno].resno_decoded < 0) { + opj_event_msg(tcd->cinfo, EVT_ERROR, "Error decoding tile. The number of resolutions to remove [%d+1] is higher than the number " + " of resolutions in the original codestream [%d]\nModify the cp_reduce parameter.\n", tcd->cp->reduce, tile->comps[compno].numresolutions); + return OPJ_FALSE; + } + } + + numres2decode = tcd->image->comps[compno].resno_decoded + 1; + if(numres2decode > 0){ + if (tcd->tcp->tccps[compno].qmfbid == 1) { + dwt_decode(tilec, numres2decode); + } else { + dwt_decode_real(tilec, numres2decode); + } + } + } + dwt_time = opj_clock() - dwt_time; + opj_event_msg(tcd->cinfo, EVT_INFO, "- dwt took %f s\n", dwt_time); + + /*----------------MCT-------------------*/ + + if (tcd->tcp->mct) { + int n = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0); + + if (tile->numcomps >= 3 ){ + if (tcd->tcp->tccps[0].qmfbid == 1) { + mct_decode( + tile->comps[0].data, + tile->comps[1].data, + tile->comps[2].data, + n); + } else { + mct_decode_real( + (float*)tile->comps[0].data, + (float*)tile->comps[1].data, + (float*)tile->comps[2].data, + n); + } + } else{ + opj_event_msg(tcd->cinfo, EVT_WARNING,"Number of components (%d) is inconsistent with a MCT. Skip the MCT step.\n",tile->numcomps); + } + } + + /*---------------TILE-------------------*/ + + for (compno = 0; compno < tile->numcomps; ++compno) { + opj_tcd_tilecomp_t* tilec = &tile->comps[compno]; + opj_image_comp_t* imagec = &tcd->image->comps[compno]; + opj_tcd_resolution_t* res = &tilec->resolutions[imagec->resno_decoded]; + int adjust = imagec->sgnd ? 0 : 1 << (imagec->prec - 1); + int min = imagec->sgnd ? -(1 << (imagec->prec - 1)) : 0; + int max = imagec->sgnd ? (1 << (imagec->prec - 1)) - 1 : (1 << imagec->prec) - 1; + + int tw = tilec->x1 - tilec->x0; + int w = imagec->w; + + int offset_x = int_ceildivpow2(imagec->x0, imagec->factor); + int offset_y = int_ceildivpow2(imagec->y0, imagec->factor); + + int i, j; + if(!imagec->data){ + imagec->data = (int*) opj_malloc(imagec->w * imagec->h * sizeof(int)); + } + if(tcd->tcp->tccps[compno].qmfbid == 1) { + for(j = res->y0; j < res->y1; ++j) { + for(i = res->x0; i < res->x1; ++i) { + int v = tilec->data[i - res->x0 + (j - res->y0) * tw]; + v += adjust; + imagec->data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max); + } + } + }else{ + for(j = res->y0; j < res->y1; ++j) { + for(i = res->x0; i < res->x1; ++i) { + float tmp = ((float*)tilec->data)[i - res->x0 + (j - res->y0) * tw]; + int v = lrintf(tmp); + v += adjust; + imagec->data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max); + } + } + } + opj_aligned_free(tilec->data); + } + + tile_time = opj_clock() - tile_time; /* time needed to decode a tile */ + opj_event_msg(tcd->cinfo, EVT_INFO, "- tile decoded in %f s\n", tile_time); + + if (eof) { + return OPJ_FALSE; + } + + return OPJ_TRUE; +} + +void tcd_free_decode(opj_tcd_t *tcd) { + opj_tcd_image_t *tcd_image = tcd->tcd_image; + opj_free(tcd_image->tiles); +} + +void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno) { + int compno,resno,bandno,precno; + + opj_tcd_image_t *tcd_image = tcd->tcd_image; + + opj_tcd_tile_t *tile = &tcd_image->tiles[tileno]; + for (compno = 0; compno < tile->numcomps; compno++) { + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + for (resno = 0; resno < tilec->numresolutions; resno++) { + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + for (precno = 0; precno < res->ph * res->pw; precno++) { + opj_tcd_precinct_t *prec = &band->precincts[precno]; + if (prec->imsbtree != NULL) tgt_destroy(prec->imsbtree); + if (prec->incltree != NULL) tgt_destroy(prec->incltree); + } + opj_free(band->precincts); + } + } + opj_free(tilec->resolutions); + } + opj_free(tile->comps); +} + + + diff --git a/openjpeg-dotnet/libopenjpeg/tcd.h b/openjpeg-dotnet/libopenjpeg/tcd.h index 74f61f77..e3f93adc 100644 --- a/openjpeg-dotnet/libopenjpeg/tcd.h +++ b/openjpeg-dotnet/libopenjpeg/tcd.h @@ -1,285 +1,286 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ -#ifndef __TCD_H -#define __TCD_H -/** -@file tcd.h -@brief Implementation of a tile coder/decoder (TCD) - -The functions in TCD.C have for goal to encode or decode each tile independently from -each other. The functions in TCD.C are used by some function in J2K.C. -*/ - -/** @defgroup TCD TCD - Implementation of a tile coder/decoder */ -/*@{*/ - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_seg { - unsigned char** data; - int dataindex; - int numpasses; - int len; - int maxpasses; - int numnewpasses; - int newlen; -} opj_tcd_seg_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_pass { - int rate; - double distortiondec; - int term, len; -} opj_tcd_pass_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_layer { - int numpasses; /* Number of passes in the layer */ - int len; /* len of information */ - double disto; /* add for index (Cfr. Marcela) */ - unsigned char *data; /* data */ -} opj_tcd_layer_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_cblk_enc { - unsigned char* data; /* Data */ - opj_tcd_layer_t* layers; /* layer information */ - opj_tcd_pass_t* passes; /* information about the passes */ - int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */ - int numbps; - int numlenbits; - int numpasses; /* number of pass already done for the code-blocks */ - int numpassesinlayers; /* number of passes in the layer */ - int totalpasses; /* total number of passes */ -} opj_tcd_cblk_enc_t; - -typedef struct opj_tcd_cblk_dec { - unsigned char* data; /* Data */ - opj_tcd_seg_t* segs; /* segments informations */ - int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */ - int numbps; - int numlenbits; - int len; /* length */ - int numnewpasses; /* number of pass added to the code-blocks */ - int numsegs; /* number of segments */ -} opj_tcd_cblk_dec_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_precinct { - int x0, y0, x1, y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */ - int cw, ch; /* number of precinct in width and heigth */ - union{ /* code-blocks informations */ - opj_tcd_cblk_enc_t* enc; - opj_tcd_cblk_dec_t* dec; - } cblks; - opj_tgt_tree_t *incltree; /* inclusion tree */ - opj_tgt_tree_t *imsbtree; /* IMSB tree */ -} opj_tcd_precinct_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_band { - int x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */ - int bandno; - opj_tcd_precinct_t *precincts; /* precinct information */ - int numbps; - float stepsize; -} opj_tcd_band_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_resolution { - int x0, y0, x1, y1; /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */ - int pw, ph; - int numbands; /* number sub-band for the resolution level */ - opj_tcd_band_t bands[3]; /* subband information */ -} opj_tcd_resolution_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_tilecomp { - int x0, y0, x1, y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */ - int numresolutions; /* number of resolutions level */ - opj_tcd_resolution_t *resolutions; /* resolutions information */ - int *data; /* data of the component */ - int numpix; /* add fixed_quality */ -} opj_tcd_tilecomp_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_tile { - int x0, y0, x1, y1; /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */ - int numcomps; /* number of components in tile */ - opj_tcd_tilecomp_t *comps; /* Components information */ - int numpix; /* add fixed_quality */ - double distotile; /* add fixed_quality */ - double distolayer[100]; /* add fixed_quality */ - /** packet number */ - int packno; -} opj_tcd_tile_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_image { - int tw, th; /* number of tiles in width and heigth */ - opj_tcd_tile_t *tiles; /* Tiles information */ -} opj_tcd_image_t; - -/** -Tile coder/decoder -*/ -typedef struct opj_tcd { - /** Position of the tilepart flag in Progression order*/ - int tp_pos; - /** Tile part number*/ - int tp_num; - /** Current tile part number*/ - int cur_tp_num; - /** Total number of tileparts of the current tile*/ - int cur_totnum_tp; - /** Current Packet iterator number */ - int cur_pino; - /** codec context */ - opj_common_ptr cinfo; - - /** info on each image tile */ - opj_tcd_image_t *tcd_image; - /** image */ - opj_image_t *image; - /** coding parameters */ - opj_cp_t *cp; - /** pointer to the current encoded/decoded tile */ - opj_tcd_tile_t *tcd_tile; - /** coding/decoding parameters common to all tiles */ - opj_tcp_t *tcp; - /** current encoded/decoded tile */ - int tcd_tileno; - /** Time taken to encode a tile*/ - double encoding_time; -} opj_tcd_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ - -/** -Dump the content of a tcd structure -*/ -void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img); -/** -Create a new TCD handle -@param cinfo Codec context info -@return Returns a new TCD handle if successful returns NULL otherwise -*/ -opj_tcd_t* tcd_create(opj_common_ptr cinfo); -/** -Destroy a previously created TCD handle -@param tcd TCD handle to destroy -*/ -void tcd_destroy(opj_tcd_t *tcd); -/** -Initialize the tile coder (allocate the memory) -@param tcd TCD handle -@param image Raw image -@param cp Coding parameters -@param curtileno Number that identifies the tile that will be encoded -*/ -void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno); -/** -Free the memory allocated for encoding -@param tcd TCD handle -*/ -void tcd_free_encode(opj_tcd_t *tcd); -/** -Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode) -@param tcd TCD handle -@param image Raw image -@param cp Coding parameters -@param curtileno Number that identifies the tile that will be encoded -*/ -void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno); -/** -Initialize the tile decoder -@param tcd TCD handle -@param image Raw image -@param cp Coding parameters -*/ -void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp); -void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int tileno, opj_codestream_info_t *cstr_info); -void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final); -void tcd_rateallocate_fixed(opj_tcd_t *tcd); -void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final); -bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info); -/** -Encode a tile from the raw image into a buffer -@param tcd TCD handle -@param tileno Number that identifies one of the tiles to be encoded -@param dest Destination buffer -@param len Length of destination buffer -@param cstr_info Codestream information structure -@return -*/ -int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_codestream_info_t *cstr_info); -/** -Decode a tile from a buffer into a raw image -@param tcd TCD handle -@param src Source buffer -@param len Length of source buffer -@param tileno Number that identifies one of the tiles to be decoded -*/ -bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info); -/** -Free the memory allocated for decoding -@param tcd TCD handle -*/ -void tcd_free_decode(opj_tcd_t *tcd); -void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno); - -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __TCD_H */ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ +#ifndef __TCD_H +#define __TCD_H +/** +@file tcd.h +@brief Implementation of a tile coder/decoder (TCD) + +The functions in TCD.C have for goal to encode or decode each tile independently from +each other. The functions in TCD.C are used by some function in J2K.C. +*/ + +/** @defgroup TCD TCD - Implementation of a tile coder/decoder */ +/*@{*/ + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_seg { + unsigned char** data; + int dataindex; + int numpasses; + int len; + int maxpasses; + int numnewpasses; + int newlen; +} opj_tcd_seg_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_pass { + int rate; + double distortiondec; + int term, len; +} opj_tcd_pass_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_layer { + int numpasses; /* Number of passes in the layer */ + int len; /* len of information */ + double disto; /* add for index (Cfr. Marcela) */ + unsigned char *data; /* data */ +} opj_tcd_layer_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_cblk_enc { + unsigned char* data; /* Data */ + opj_tcd_layer_t* layers; /* layer information */ + opj_tcd_pass_t* passes; /* information about the passes */ + int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */ + int numbps; + int numlenbits; + int numpasses; /* number of pass already done for the code-blocks */ + int numpassesinlayers; /* number of passes in the layer */ + int totalpasses; /* total number of passes */ +} opj_tcd_cblk_enc_t; + +typedef struct opj_tcd_cblk_dec { + unsigned char* data; /* Data */ + opj_tcd_seg_t* segs; /* segments informations */ + int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */ + int numbps; + int numlenbits; + int len; /* length */ + int numnewpasses; /* number of pass added to the code-blocks */ + int numsegs; /* number of segments */ +} opj_tcd_cblk_dec_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_precinct { + int x0, y0, x1, y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */ + int cw, ch; /* number of precinct in width and heigth */ + union{ /* code-blocks informations */ + opj_tcd_cblk_enc_t* enc; + opj_tcd_cblk_dec_t* dec; + } cblks; + opj_tgt_tree_t *incltree; /* inclusion tree */ + opj_tgt_tree_t *imsbtree; /* IMSB tree */ +} opj_tcd_precinct_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_band { + int x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */ + int bandno; + opj_tcd_precinct_t *precincts; /* precinct information */ + int numbps; + float stepsize; +} opj_tcd_band_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_resolution { + int x0, y0, x1, y1; /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */ + int pw, ph; + int numbands; /* number sub-band for the resolution level */ + opj_tcd_band_t bands[3]; /* subband information */ +} opj_tcd_resolution_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_tilecomp { + int x0, y0, x1, y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */ + int numresolutions; /* number of resolutions level */ + opj_tcd_resolution_t *resolutions; /* resolutions information */ + int *data; /* data of the component */ + int numpix; /* add fixed_quality */ +} opj_tcd_tilecomp_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_tile { + int x0, y0, x1, y1; /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */ + int numcomps; /* number of components in tile */ + opj_tcd_tilecomp_t *comps; /* Components information */ + int numpix; /* add fixed_quality */ + double distotile; /* add fixed_quality */ + double distolayer[100]; /* add fixed_quality */ + /** packet number */ + int packno; +} opj_tcd_tile_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_image { + int tw, th; /* number of tiles in width and heigth */ + opj_tcd_tile_t *tiles; /* Tiles information */ +} opj_tcd_image_t; + +/** +Tile coder/decoder +*/ +typedef struct opj_tcd { + /** Position of the tilepart flag in Progression order*/ + int tp_pos; + /** Tile part number*/ + int tp_num; + /** Current tile part number*/ + int cur_tp_num; + /** Total number of tileparts of the current tile*/ + int cur_totnum_tp; + /** Current Packet iterator number */ + int cur_pino; + /** codec context */ + opj_common_ptr cinfo; + + /** info on each image tile */ + opj_tcd_image_t *tcd_image; + /** image */ + opj_image_t *image; + /** coding parameters */ + opj_cp_t *cp; + /** pointer to the current encoded/decoded tile */ + opj_tcd_tile_t *tcd_tile; + /** coding/decoding parameters common to all tiles */ + opj_tcp_t *tcp; + /** current encoded/decoded tile */ + int tcd_tileno; + /** Time taken to encode a tile*/ + double encoding_time; +} opj_tcd_t; + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ + +/** +Dump the content of a tcd structure +*/ +void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img); +/** +Create a new TCD handle +@param cinfo Codec context info +@return Returns a new TCD handle if successful returns NULL otherwise +*/ +opj_tcd_t* tcd_create(opj_common_ptr cinfo); +/** +Destroy a previously created TCD handle +@param tcd TCD handle to destroy +*/ +void tcd_destroy(opj_tcd_t *tcd); +/** +Initialize the tile coder (allocate the memory) +@param tcd TCD handle +@param image Raw image +@param cp Coding parameters +@param curtileno Number that identifies the tile that will be encoded +*/ +void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno); +/** +Free the memory allocated for encoding +@param tcd TCD handle +*/ +void tcd_free_encode(opj_tcd_t *tcd); +/** +Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode) +@param tcd TCD handle +@param image Raw image +@param cp Coding parameters +@param curtileno Number that identifies the tile that will be encoded +*/ +void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno); +/** +Initialize the tile decoder +@param tcd TCD handle +@param image Raw image +@param cp Coding parameters +*/ +void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp); +void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int tileno, opj_codestream_info_t *cstr_info); +void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final); +void tcd_rateallocate_fixed(opj_tcd_t *tcd); +void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final); +opj_bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info); +/** +Encode a tile from the raw image into a buffer +@param tcd TCD handle +@param tileno Number that identifies one of the tiles to be encoded +@param dest Destination buffer +@param len Length of destination buffer +@param cstr_info Codestream information structure +@return +*/ +int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_codestream_info_t *cstr_info); +/** +Decode a tile from a buffer into a raw image +@param tcd TCD handle +@param src Source buffer +@param len Length of source buffer +@param tileno Number that identifies one of the tiles to be decoded +@param cstr_info Codestream information structure +*/ +opj_bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info); +/** +Free the memory allocated for decoding +@param tcd TCD handle +*/ +void tcd_free_decode(opj_tcd_t *tcd); +void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno); + +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __TCD_H */ diff --git a/openjpeg-dotnet/libopenjpeg/tgt.c b/openjpeg-dotnet/libopenjpeg/tgt.c index f1329cad..a5dbcd3c 100644 --- a/openjpeg-dotnet/libopenjpeg/tgt.c +++ b/openjpeg-dotnet/libopenjpeg/tgt.c @@ -1,213 +1,213 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#include "opj_includes.h" - -/* -========================================================== - Tag-tree coder interface -========================================================== -*/ - -opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv) { - int nplh[32]; - int nplv[32]; - opj_tgt_node_t *node = NULL; - opj_tgt_node_t *parentnode = NULL; - opj_tgt_node_t *parentnode0 = NULL; - opj_tgt_tree_t *tree = NULL; - int i, j, k; - int numlvls; - int n; - - tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t)); - if(!tree) return NULL; - tree->numleafsh = numleafsh; - tree->numleafsv = numleafsv; - - numlvls = 0; - nplh[0] = numleafsh; - nplv[0] = numleafsv; - tree->numnodes = 0; - do { - n = nplh[numlvls] * nplv[numlvls]; - nplh[numlvls + 1] = (nplh[numlvls] + 1) / 2; - nplv[numlvls + 1] = (nplv[numlvls] + 1) / 2; - tree->numnodes += n; - ++numlvls; - } while (n > 1); - - /* ADD */ - if (tree->numnodes == 0) { - opj_free(tree); - return NULL; - } - - tree->nodes = (opj_tgt_node_t*) opj_calloc(tree->numnodes, sizeof(opj_tgt_node_t)); - if(!tree->nodes) { - opj_free(tree); - return NULL; - } - - node = tree->nodes; - parentnode = &tree->nodes[tree->numleafsh * tree->numleafsv]; - parentnode0 = parentnode; - - for (i = 0; i < numlvls - 1; ++i) { - for (j = 0; j < nplv[i]; ++j) { - k = nplh[i]; - while (--k >= 0) { - node->parent = parentnode; - ++node; - if (--k >= 0) { - node->parent = parentnode; - ++node; - } - ++parentnode; - } - if ((j & 1) || j == nplv[i] - 1) { - parentnode0 = parentnode; - } else { - parentnode = parentnode0; - parentnode0 += nplh[i]; - } - } - } - node->parent = 0; - - tgt_reset(tree); - - return tree; -} - -void tgt_destroy(opj_tgt_tree_t *tree) { - opj_free(tree->nodes); - opj_free(tree); -} - -void tgt_reset(opj_tgt_tree_t *tree) { - int i; - - if (NULL == tree) - return; - - for (i = 0; i < tree->numnodes; i++) { - tree->nodes[i].value = 999; - tree->nodes[i].low = 0; - tree->nodes[i].known = 0; - } -} - -void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value) { - opj_tgt_node_t *node; - node = &tree->nodes[leafno]; - while (node && node->value > value) { - node->value = value; - node = node->parent; - } -} - -void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) { - opj_tgt_node_t *stk[31]; - opj_tgt_node_t **stkptr; - opj_tgt_node_t *node; - int low; - - stkptr = stk; - node = &tree->nodes[leafno]; - while (node->parent) { - *stkptr++ = node; - node = node->parent; - } - - low = 0; - for (;;) { - if (low > node->low) { - node->low = low; - } else { - low = node->low; - } - - while (low < threshold) { - if (low >= node->value) { - if (!node->known) { - bio_write(bio, 1, 1); - node->known = 1; - } - break; - } - bio_write(bio, 0, 1); - ++low; - } - - node->low = low; - if (stkptr == stk) - break; - node = *--stkptr; - } -} - -int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) { - opj_tgt_node_t *stk[31]; - opj_tgt_node_t **stkptr; - opj_tgt_node_t *node; - int low; - - stkptr = stk; - node = &tree->nodes[leafno]; - while (node->parent) { - *stkptr++ = node; - node = node->parent; - } - - low = 0; - for (;;) { - if (low > node->low) { - node->low = low; - } else { - low = node->low; - } - while (low < threshold && low < node->value) { - if (bio_read(bio, 1)) { - node->value = low; - } else { - ++low; - } - } - node->low = low; - if (stkptr == stk) { - break; - } - node = *--stkptr; - } - - return (node->value < threshold) ? 1 : 0; -} +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#include "opj_includes.h" + +/* +========================================================== + Tag-tree coder interface +========================================================== +*/ + +opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv) { + int nplh[32]; + int nplv[32]; + opj_tgt_node_t *node = NULL; + opj_tgt_node_t *parentnode = NULL; + opj_tgt_node_t *parentnode0 = NULL; + opj_tgt_tree_t *tree = NULL; + int i, j, k; + int numlvls; + int n; + + tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t)); + if(!tree) return NULL; + tree->numleafsh = numleafsh; + tree->numleafsv = numleafsv; + + numlvls = 0; + nplh[0] = numleafsh; + nplv[0] = numleafsv; + tree->numnodes = 0; + do { + n = nplh[numlvls] * nplv[numlvls]; + nplh[numlvls + 1] = (nplh[numlvls] + 1) / 2; + nplv[numlvls + 1] = (nplv[numlvls] + 1) / 2; + tree->numnodes += n; + ++numlvls; + } while (n > 1); + + /* ADD */ + if (tree->numnodes == 0) { + opj_free(tree); + return NULL; + } + + tree->nodes = (opj_tgt_node_t*) opj_calloc(tree->numnodes, sizeof(opj_tgt_node_t)); + if(!tree->nodes) { + opj_free(tree); + return NULL; + } + + node = tree->nodes; + parentnode = &tree->nodes[tree->numleafsh * tree->numleafsv]; + parentnode0 = parentnode; + + for (i = 0; i < numlvls - 1; ++i) { + for (j = 0; j < nplv[i]; ++j) { + k = nplh[i]; + while (--k >= 0) { + node->parent = parentnode; + ++node; + if (--k >= 0) { + node->parent = parentnode; + ++node; + } + ++parentnode; + } + if ((j & 1) || j == nplv[i] - 1) { + parentnode0 = parentnode; + } else { + parentnode = parentnode0; + parentnode0 += nplh[i]; + } + } + } + node->parent = 0; + + tgt_reset(tree); + + return tree; +} + +void tgt_destroy(opj_tgt_tree_t *tree) { + opj_free(tree->nodes); + opj_free(tree); +} + +void tgt_reset(opj_tgt_tree_t *tree) { + int i; + + if (NULL == tree) + return; + + for (i = 0; i < tree->numnodes; i++) { + tree->nodes[i].value = 999; + tree->nodes[i].low = 0; + tree->nodes[i].known = 0; + } +} + +void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value) { + opj_tgt_node_t *node; + node = &tree->nodes[leafno]; + while (node && node->value > value) { + node->value = value; + node = node->parent; + } +} + +void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) { + opj_tgt_node_t *stk[31]; + opj_tgt_node_t **stkptr; + opj_tgt_node_t *node; + int low; + + stkptr = stk; + node = &tree->nodes[leafno]; + while (node->parent) { + *stkptr++ = node; + node = node->parent; + } + + low = 0; + for (;;) { + if (low > node->low) { + node->low = low; + } else { + low = node->low; + } + + while (low < threshold) { + if (low >= node->value) { + if (!node->known) { + bio_write(bio, 1, 1); + node->known = 1; + } + break; + } + bio_write(bio, 0, 1); + ++low; + } + + node->low = low; + if (stkptr == stk) + break; + node = *--stkptr; + } +} + +int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) { + opj_tgt_node_t *stk[31]; + opj_tgt_node_t **stkptr; + opj_tgt_node_t *node; + int low; + + stkptr = stk; + node = &tree->nodes[leafno]; + while (node->parent) { + *stkptr++ = node; + node = node->parent; + } + + low = 0; + for (;;) { + if (low > node->low) { + node->low = low; + } else { + low = node->low; + } + while (low < threshold && low < node->value) { + if (bio_read(bio, 1)) { + node->value = low; + } else { + ++low; + } + } + node->low = low; + if (stkptr == stk) { + break; + } + node = *--stkptr; + } + + return (node->value < threshold) ? 1 : 0; +} diff --git a/openjpeg-dotnet/libopenjpeg/tgt.h b/openjpeg-dotnet/libopenjpeg/tgt.h index 2544767a..c08c8da0 100644 --- a/openjpeg-dotnet/libopenjpeg/tgt.h +++ b/openjpeg-dotnet/libopenjpeg/tgt.h @@ -1,114 +1,114 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. - */ - -#ifndef __TGT_H -#define __TGT_H -/** -@file tgt.h -@brief Implementation of a tag-tree coder (TGT) - -The functions in TGT.C have for goal to realize a tag-tree coder. The functions in TGT.C -are used by some function in T2.C. -*/ - -/** @defgroup TGT TGT - Implementation of a tag-tree coder */ -/*@{*/ - -/** -Tag node -*/ -typedef struct opj_tgt_node { - struct opj_tgt_node *parent; - int value; - int low; - int known; -} opj_tgt_node_t; - -/** -Tag tree -*/ -typedef struct opj_tgt_tree { - int numleafsh; - int numleafsv; - int numnodes; - opj_tgt_node_t *nodes; -} opj_tgt_tree_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a tag-tree -@param numleafsh Width of the array of leafs of the tree -@param numleafsv Height of the array of leafs of the tree -@return Returns a new tag-tree if successful, returns NULL otherwise -*/ -opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv); -/** -Destroy a tag-tree, liberating memory -@param tree Tag-tree to destroy -*/ -void tgt_destroy(opj_tgt_tree_t *tree); -/** -Reset a tag-tree (set all leaves to 0) -@param tree Tag-tree to reset -*/ -void tgt_reset(opj_tgt_tree_t *tree); -/** -Set the value of a leaf of a tag-tree -@param tree Tag-tree to modify -@param leafno Number that identifies the leaf to modify -@param value New value of the leaf -*/ -void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value); -/** -Encode the value of a leaf of the tag-tree up to a given threshold -@param bio Pointer to a BIO handle -@param tree Tag-tree to modify -@param leafno Number that identifies the leaf to encode -@param threshold Threshold to use when encoding value of the leaf -*/ -void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold); -/** -Decode the value of a leaf of the tag-tree up to a given threshold -@param bio Pointer to a BIO handle -@param tree Tag-tree to decode -@param leafno Number that identifies the leaf to decode -@param threshold Threshold to use when decoding value of the leaf -@return Returns 1 if the node's value < threshold, returns 0 otherwise -*/ -int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __TGT_H */ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#ifndef __TGT_H +#define __TGT_H +/** +@file tgt.h +@brief Implementation of a tag-tree coder (TGT) + +The functions in TGT.C have for goal to realize a tag-tree coder. The functions in TGT.C +are used by some function in T2.C. +*/ + +/** @defgroup TGT TGT - Implementation of a tag-tree coder */ +/*@{*/ + +/** +Tag node +*/ +typedef struct opj_tgt_node { + struct opj_tgt_node *parent; + int value; + int low; + int known; +} opj_tgt_node_t; + +/** +Tag tree +*/ +typedef struct opj_tgt_tree { + int numleafsh; + int numleafsv; + int numnodes; + opj_tgt_node_t *nodes; +} opj_tgt_tree_t; + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Create a tag-tree +@param numleafsh Width of the array of leafs of the tree +@param numleafsv Height of the array of leafs of the tree +@return Returns a new tag-tree if successful, returns NULL otherwise +*/ +opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv); +/** +Destroy a tag-tree, liberating memory +@param tree Tag-tree to destroy +*/ +void tgt_destroy(opj_tgt_tree_t *tree); +/** +Reset a tag-tree (set all leaves to 0) +@param tree Tag-tree to reset +*/ +void tgt_reset(opj_tgt_tree_t *tree); +/** +Set the value of a leaf of a tag-tree +@param tree Tag-tree to modify +@param leafno Number that identifies the leaf to modify +@param value New value of the leaf +*/ +void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value); +/** +Encode the value of a leaf of the tag-tree up to a given threshold +@param bio Pointer to a BIO handle +@param tree Tag-tree to modify +@param leafno Number that identifies the leaf to encode +@param threshold Threshold to use when encoding value of the leaf +*/ +void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold); +/** +Decode the value of a leaf of the tag-tree up to a given threshold +@param bio Pointer to a BIO handle +@param tree Tag-tree to decode +@param leafno Number that identifies the leaf to decode +@param threshold Threshold to use when decoding value of the leaf +@return Returns 1 if the node's value < threshold, returns 0 otherwise +*/ +int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __TGT_H */ From f3e3f534cfec1d2930acf3b13458a1bb711acc78 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey Date: Thu, 6 Sep 2012 22:51:37 +0100 Subject: [PATCH 07/57] Add new necessary opj_config.h file with openjpeg 1.5 --- openjpeg-dotnet/libopenjpeg/opj_config.h | 117 +++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 openjpeg-dotnet/libopenjpeg/opj_config.h diff --git a/openjpeg-dotnet/libopenjpeg/opj_config.h b/openjpeg-dotnet/libopenjpeg/opj_config.h new file mode 100644 index 00000000..53e1c0bd --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/opj_config.h @@ -0,0 +1,117 @@ +/* opj_config.h. Generated from opj_config.h.in by configure. */ +/* opj_config.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#define HAVE_DIRENT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* define to 1 if you have lcms version 1.x */ +/* #undef HAVE_LIBLCMS1 */ + +/* define to 1 if you have lcms version 2.x */ +/* #undef HAVE_LIBLCMS2 */ + +/* define to 1 if you have libpng */ +#define HAVE_LIBPNG 1 + +/* define to 1 if you have libtiff */ +#define HAVE_LIBTIFF 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +/* #undef HAVE_NDIR_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_DIR_H */ + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "openjpeg" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "openjpeg@googlegroups.com" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "OpenJPEG" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "OpenJPEG 1.5.0" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "openjpeg" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "http://www.openjpeg.org" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.5.0" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* define to 1 if you use jpip */ +/* #undef USE_JPIP */ + +/* define to 1 if you use jpip server */ +/* #undef USE_JPIP_SERVER */ + +/* define to 1 if you use mj2 */ +/* #undef USE_MJ2 */ + +/* Version number of package */ +#define VERSION "1.5.0" + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif From 854f95c4c8de3176fffba038d1bacbbff57528f7 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey Date: Thu, 6 Sep 2012 22:54:40 +0100 Subject: [PATCH 08/57] Add more libopenjpeg 1.5 files that I forgot were new --- openjpeg-dotnet/libopenjpeg/cidx_manager.c | 213 ++ openjpeg-dotnet/libopenjpeg/cidx_manager.h | 56 + .../libopenjpeg/indexbox_manager.h | 118 ++ .../libopenjpeg/jpwl/.README.txt.swp | Bin 0 -> 16384 bytes .../jpwl/.deps/libopenjpeg_JPWL_la-bio.Plo | 1 + .../libopenjpeg_JPWL_la-cidx_manager.Plo | 1 + .../jpwl/.deps/libopenjpeg_JPWL_la-cio.Plo | 1 + .../jpwl/.deps/libopenjpeg_JPWL_la-crc.Plo | 1 + .../jpwl/.deps/libopenjpeg_JPWL_la-dwt.Plo | 1 + .../jpwl/.deps/libopenjpeg_JPWL_la-event.Plo | 1 + .../jpwl/.deps/libopenjpeg_JPWL_la-image.Plo | 1 + .../jpwl/.deps/libopenjpeg_JPWL_la-j2k.Plo | 1 + .../.deps/libopenjpeg_JPWL_la-j2k_lib.Plo | 1 + .../jpwl/.deps/libopenjpeg_JPWL_la-jp2.Plo | 1 + .../jpwl/.deps/libopenjpeg_JPWL_la-jpt.Plo | 1 + .../jpwl/.deps/libopenjpeg_JPWL_la-jpwl.Plo | 1 + .../.deps/libopenjpeg_JPWL_la-jpwl_lib.Plo | 1 + .../jpwl/.deps/libopenjpeg_JPWL_la-mct.Plo | 1 + .../jpwl/.deps/libopenjpeg_JPWL_la-mqc.Plo | 1 + .../.deps/libopenjpeg_JPWL_la-openjpeg.Plo | 1 + .../libopenjpeg_JPWL_la-phix_manager.Plo | 1 + .../jpwl/.deps/libopenjpeg_JPWL_la-pi.Plo | 1 + .../libopenjpeg_JPWL_la-ppix_manager.Plo | 1 + .../jpwl/.deps/libopenjpeg_JPWL_la-raw.Plo | 1 + .../jpwl/.deps/libopenjpeg_JPWL_la-rs.Plo | 1 + .../jpwl/.deps/libopenjpeg_JPWL_la-t1.Plo | 1 + .../libopenjpeg_JPWL_la-t1_generate_luts.Plo | 1 + .../jpwl/.deps/libopenjpeg_JPWL_la-t2.Plo | 1 + .../jpwl/.deps/libopenjpeg_JPWL_la-tcd.Plo | 1 + .../jpwl/.deps/libopenjpeg_JPWL_la-tgt.Plo | 1 + .../libopenjpeg_JPWL_la-thix_manager.Plo | 1 + .../libopenjpeg_JPWL_la-tpix_manager.Plo | 1 + .../libopenjpeg/jpwl/CMakeLists.txt | 32 + openjpeg-dotnet/libopenjpeg/jpwl/Makefile | 908 +++++++++ openjpeg-dotnet/libopenjpeg/jpwl/Makefile.am | 77 + openjpeg-dotnet/libopenjpeg/jpwl/Makefile.in | 908 +++++++++ openjpeg-dotnet/libopenjpeg/jpwl/README.txt | 136 ++ openjpeg-dotnet/libopenjpeg/jpwl/crc.c | 160 ++ openjpeg-dotnet/libopenjpeg/jpwl/crc.h | 84 + openjpeg-dotnet/libopenjpeg/jpwl/jpwl.c | 1358 +++++++++++++ openjpeg-dotnet/libopenjpeg/jpwl/jpwl.h | 425 ++++ openjpeg-dotnet/libopenjpeg/jpwl/jpwl_lib.c | 1797 +++++++++++++++++ openjpeg-dotnet/libopenjpeg/jpwl/rs.c | 597 ++++++ openjpeg-dotnet/libopenjpeg/jpwl/rs.h | 108 + openjpeg-dotnet/libopenjpeg/phix_manager.c | 170 ++ openjpeg-dotnet/libopenjpeg/ppix_manager.c | 173 ++ openjpeg-dotnet/libopenjpeg/thix_manager.c | 120 ++ openjpeg-dotnet/libopenjpeg/tpix_manager.c | 153 ++ 48 files changed, 7621 insertions(+) create mode 100644 openjpeg-dotnet/libopenjpeg/cidx_manager.c create mode 100644 openjpeg-dotnet/libopenjpeg/cidx_manager.h create mode 100644 openjpeg-dotnet/libopenjpeg/indexbox_manager.h create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.README.txt.swp create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-bio.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-cidx_manager.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-cio.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-crc.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-dwt.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-event.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-image.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-j2k.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-j2k_lib.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jp2.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpt.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpwl.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpwl_lib.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-mct.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-mqc.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-openjpeg.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-phix_manager.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-pi.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-ppix_manager.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-raw.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-rs.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t1.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t1_generate_luts.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t2.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tcd.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tgt.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-thix_manager.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tpix_manager.Plo create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/CMakeLists.txt create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/Makefile create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/Makefile.am create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/Makefile.in create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/README.txt create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/crc.c create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/crc.h create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/jpwl.c create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/jpwl.h create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/jpwl_lib.c create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/rs.c create mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/rs.h create mode 100644 openjpeg-dotnet/libopenjpeg/phix_manager.c create mode 100644 openjpeg-dotnet/libopenjpeg/ppix_manager.c create mode 100644 openjpeg-dotnet/libopenjpeg/thix_manager.c create mode 100644 openjpeg-dotnet/libopenjpeg/tpix_manager.c diff --git a/openjpeg-dotnet/libopenjpeg/cidx_manager.c b/openjpeg-dotnet/libopenjpeg/cidx_manager.c new file mode 100644 index 00000000..6131b938 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/cidx_manager.c @@ -0,0 +1,213 @@ +/* + * $Id: cidx_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $ + * + * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2011, Professor Benoit Macq + * Copyright (c) 2003-2004, Yannick Verschueren + * Copyright (c) 2010-2011, Kaori Hagihara + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#include +#include +#include "opj_includes.h" + + +/* + * Write CPTR Codestream finder box + * + * @param[in] coff offset of j2k codestream + * @param[in] clen length of j2k codestream + * @param[in] cio file output handle + */ +void write_cptr(int coff, int clen, opj_cio_t *cio); + + +/* + * Write main header index table (box) + * + * @param[in] coff offset of j2k codestream + * @param[in] cstr_info codestream information + * @param[in] cio file output handle + * @return length of mainmhix box + */ +int write_mainmhix( int coff, opj_codestream_info_t cstr_info, opj_cio_t *cio); + + +/* + * Check if EPH option is used + * + * @param[in] coff offset of j2k codestream + * @param[in] markers marker information + * @param[in] marknum number of markers + * @param[in] cio file output handle + * @return true if EPH is used + */ +opj_bool check_EPHuse( int coff, opj_marker_info_t *markers, int marknum, opj_cio_t *cio); + + +int write_cidx( int offset, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t cstr_info, int j2klen) +{ + int len, i, lenp; + opj_jp2_box_t *box; + int num_box = 0; + opj_bool EPHused; + (void)image; /* unused ? */ + + lenp = -1; + box = (opj_jp2_box_t *)opj_calloc( 32, sizeof(opj_jp2_box_t)); + + for (i=0;i<2;i++){ + + if(i) + cio_seek( cio, lenp); + + lenp = cio_tell( cio); + + cio_skip( cio, 4); /* L [at the end] */ + cio_write( cio, JPIP_CIDX, 4); /* CIDX */ + write_cptr( offset, cstr_info.codestream_size, cio); + + write_manf( i, num_box, box, cio); + + num_box = 0; + box[num_box].length = write_mainmhix( offset, cstr_info, cio); + box[num_box].type = JPIP_MHIX; + num_box++; + + box[num_box].length = write_tpix( offset, cstr_info, j2klen, cio); + box[num_box].type = JPIP_TPIX; + num_box++; + + box[num_box].length = write_thix( offset, cstr_info, cio); + box[num_box].type = JPIP_THIX; + num_box++; + + EPHused = check_EPHuse( offset, cstr_info.marker, cstr_info.marknum, cio); + + box[num_box].length = write_ppix( offset, cstr_info, EPHused, j2klen, cio); + box[num_box].type = JPIP_PPIX; + num_box++; + + box[num_box].length = write_phix( offset, cstr_info, EPHused, j2klen, cio); + box[num_box].type = JPIP_PHIX; + num_box++; + + len = cio_tell( cio)-lenp; + cio_seek( cio, lenp); + cio_write( cio, len, 4); /* L */ + cio_seek( cio, lenp+len); + } + + opj_free( box); + + return len; +} + +void write_cptr(int coff, int clen, opj_cio_t *cio) +{ + int len, lenp; + + lenp = cio_tell( cio); + cio_skip( cio, 4); /* L [at the end] */ + cio_write( cio, JPIP_CPTR, 4); /* T */ + cio_write( cio, 0, 2); /* DR A PRECISER !! */ + cio_write( cio, 0, 2); /* CONT */ + cio_write( cio, coff, 8); /* COFF A PRECISER !! */ + cio_write( cio, clen, 8); /* CLEN */ + len = cio_tell( cio) - lenp; + cio_seek( cio, lenp); + cio_write( cio, len, 4); /* L */ + cio_seek( cio, lenp+len); +} + +void write_manf(int second, int v, opj_jp2_box_t *box, opj_cio_t *cio) +{ + int len, lenp, i; + + lenp = cio_tell( cio); + cio_skip( cio, 4); /* L [at the end] */ + cio_write( cio, JPIP_MANF,4); /* T */ + + if (second){ /* Write only during the second pass */ + for( i=0; i> 2) & 1)) + EPHused = OPJ_TRUE; + cio_seek( cio, org_pos); + + break; + } + } + return EPHused; +} diff --git a/openjpeg-dotnet/libopenjpeg/cidx_manager.h b/openjpeg-dotnet/libopenjpeg/cidx_manager.h new file mode 100644 index 00000000..23eebd52 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/cidx_manager.h @@ -0,0 +1,56 @@ +/* + * $Id: cidx_manager.h 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $ + * + * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2011, Professor Benoit Macq + * Copyright (c) 2003-2004, Yannick Verschueren + * Copyright (c) 2010-2011, Kaori Hagihara + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +/*! \file + * \brief Modification of jpip.h from 2KAN indexer + */ + + +#ifndef CIDX_MANAGER_H_ +# define CIDX_MANAGER_H_ + +#include "openjpeg.h" + + +/* + * Write Codestream index box (superbox) + * + * @param[in] offset offset of j2k codestream + * @param[in] cio file output handle + * @param[in] image image data + * @param[in] cstr_info codestream information + * @param[in] j2klen length of j2k codestream + * @return length of cidx box + */ +int write_cidx( int offset, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t cstr_info, int j2klen); + + +#endif /* !CIDX_MANAGER_H_ */ diff --git a/openjpeg-dotnet/libopenjpeg/indexbox_manager.h b/openjpeg-dotnet/libopenjpeg/indexbox_manager.h new file mode 100644 index 00000000..7364df62 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/indexbox_manager.h @@ -0,0 +1,118 @@ +/* + * $Id: indexbox_manager.h 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $ + * + * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2011, Professor Benoit Macq + * Copyright (c) 2003-2004, Yannick Verschueren + * Copyright (c) 2010-2011, Kaori Hagihara + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +/*! \file + * \brief Modification of jpip.c from 2KAN indexer + */ + +#ifndef INDEXBOX_MANAGER_H_ +# define INDEXBOX_MANAGER_H_ + +#include "openjpeg.h" +#include "j2k.h" /* needed to use jp2.h */ +#include "jp2.h" + +#define JPIP_CIDX 0x63696478 /* Codestream index */ +#define JPIP_CPTR 0x63707472 /* Codestream Finder Box */ +#define JPIP_MANF 0x6d616e66 /* Manifest Box */ +#define JPIP_FAIX 0x66616978 /* Fragment array Index box */ +#define JPIP_MHIX 0x6d686978 /* Main Header Index Table */ +#define JPIP_TPIX 0x74706978 /* Tile-part Index Table box */ +#define JPIP_THIX 0x74686978 /* Tile header Index Table box */ +#define JPIP_PPIX 0x70706978 /* Precinct Packet Index Table box */ +#define JPIP_PHIX 0x70686978 /* Packet Header index Table */ +#define JPIP_FIDX 0x66696478 /* File Index */ +#define JPIP_FPTR 0x66707472 /* File Finder */ +#define JPIP_PRXY 0x70727879 /* Proxy boxes */ +#define JPIP_IPTR 0x69707472 /* Index finder box */ +#define JPIP_PHLD 0x70686c64 /* Place holder */ + + +/* + * Write tile-part Index table box (superbox) + * + * @param[in] coff offset of j2k codestream + * @param[in] cstr_info codestream information + * @param[in] j2klen length of j2k codestream + * @param[in] cio file output handle + * @return length of tpix box + */ +int write_tpix( int coff, opj_codestream_info_t cstr_info, int j2klen, opj_cio_t *cio); + + +/* + * Write tile header index table box (superbox) + * + * @param[in] coff offset of j2k codestream + * @param[in] cstr_info codestream information pointer + * @param[in] cio file output handle + * @return length of thix box + */ +int write_thix( int coff, opj_codestream_info_t cstr_info, opj_cio_t *cio); + + +/* + * Write precinct packet index table box (superbox) + * + * @param[in] coff offset of j2k codestream + * @param[in] cstr_info codestream information + * @param[in] EPHused true if EPH option used + * @param[in] j2klen length of j2k codestream + * @param[in] cio file output handle + * @return length of ppix box + */ +int write_ppix( int coff, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio); + + +/* + * Write packet header index table box (superbox) + * + * @param[in] coff offset of j2k codestream + * @param[in] cstr_info codestream information + * @param[in] EPHused true if EPH option used + * @param[in] j2klen length of j2k codestream + * @param[in] cio file output handle + * @return length of ppix box + */ +int write_phix( int coff, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio); + +/* + * Wriet manifest box (box) + * + * @param[in] second number to be visited + * @param[in] v number of boxes + * @param[in] box box to be manifested + * @param[in] cio file output handle + */ +void write_manf(int second, int v, opj_jp2_box_t *box, opj_cio_t *cio); + + +#endif /* !INDEXBOX_MANAGER_H_ */ diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.README.txt.swp b/openjpeg-dotnet/libopenjpeg/jpwl/.README.txt.swp new file mode 100644 index 0000000000000000000000000000000000000000..41357afbf5b7cf9b9e782a1108ce3caf6bf48f64 GIT binary patch literal 16384 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 BFDn25 literal 0 HcmV?d00001 diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-bio.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-bio.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-bio.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-cidx_manager.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-cidx_manager.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-cidx_manager.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-cio.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-cio.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-cio.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-crc.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-crc.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-crc.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-dwt.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-dwt.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-dwt.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-event.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-event.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-event.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-image.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-image.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-image.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-j2k.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-j2k.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-j2k.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-j2k_lib.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-j2k_lib.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-j2k_lib.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jp2.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jp2.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jp2.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpt.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpt.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpt.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpwl.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpwl.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpwl.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpwl_lib.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpwl_lib.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpwl_lib.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-mct.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-mct.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-mct.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-mqc.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-mqc.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-mqc.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-openjpeg.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-openjpeg.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-openjpeg.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-phix_manager.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-phix_manager.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-phix_manager.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-pi.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-pi.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-pi.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-ppix_manager.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-ppix_manager.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-ppix_manager.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-raw.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-raw.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-raw.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-rs.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-rs.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-rs.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t1.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t1.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t1.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t1_generate_luts.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t1_generate_luts.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t1_generate_luts.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t2.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t2.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t2.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tcd.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tcd.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tcd.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tgt.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tgt.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tgt.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-thix_manager.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-thix_manager.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-thix_manager.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tpix_manager.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tpix_manager.Plo new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tpix_manager.Plo @@ -0,0 +1 @@ +# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/CMakeLists.txt b/openjpeg-dotnet/libopenjpeg/jpwl/CMakeLists.txt new file mode 100644 index 00000000..6fcfc957 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/CMakeLists.txt @@ -0,0 +1,32 @@ +# Makefile for the main JPWL OpenJPEG codecs: JPWL_ j2k_to_image and JPWL_image_to_j2k + +ADD_DEFINITIONS(-DUSE_JPWL) + +SET(JPWL_SRCS crc.c jpwl.c jpwl_lib.c rs.c) +IF(APPLE) + SET_SOURCE_FILES_PROPERTIES( + rs.c + PROPERTIES + COMPILE_FLAGS -fno-common) +ENDIF(APPLE) + +INCLUDE_DIRECTORIES( + ${OPENJPEG_SOURCE_DIR}/libopenjpeg + ) + +# Build the library +IF(WIN32) + IF(BUILD_SHARED_LIBS) + ADD_DEFINITIONS(-DOPJ_EXPORTS) + ELSE(BUILD_SHARED_LIBS) + ADD_DEFINITIONS(-DOPJ_STATIC) + ENDIF(BUILD_SHARED_LIBS) +ENDIF(WIN32) +ADD_LIBRARY(${OPENJPEG_LIBRARY_NAME}_JPWL ${JPWL_SRCS} ${OPENJPEG_SRCS}) +SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME}_JPWL + PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES}) + +# Install library +INSTALL(TARGETS ${OPENJPEG_LIBRARY_NAME}_JPWL + DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries +) diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/Makefile b/openjpeg-dotnet/libopenjpeg/jpwl/Makefile new file mode 100644 index 00000000..5e391778 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/Makefile @@ -0,0 +1,908 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# libopenjpeg/jpwl/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + + +pkgdatadir = $(datadir)/openjpeg +pkgincludedir = $(includedir)/openjpeg +pkglibdir = $(libdir)/openjpeg +pkglibexecdir = $(libexecdir)/openjpeg +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-unknown-linux-gnu +host_triplet = x86_64-unknown-linux-gnu +target_triplet = x86_64-unknown-linux-gnu +subdir = libopenjpeg/jpwl +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/opj_check_lib.m4 \ + $(top_srcdir)/m4/opj_compiler_flag.m4 \ + $(top_srcdir)/m4/opj_doxygen.m4 $(top_srcdir)/m4/pkg.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/opj_config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(libdir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +libopenjpeg_JPWL_la_DEPENDENCIES = +am__objects_1 = libopenjpeg_JPWL_la-bio.lo libopenjpeg_JPWL_la-cio.lo \ + libopenjpeg_JPWL_la-dwt.lo libopenjpeg_JPWL_la-event.lo \ + libopenjpeg_JPWL_la-image.lo libopenjpeg_JPWL_la-j2k.lo \ + libopenjpeg_JPWL_la-j2k_lib.lo libopenjpeg_JPWL_la-jp2.lo \ + libopenjpeg_JPWL_la-jpt.lo libopenjpeg_JPWL_la-mct.lo \ + libopenjpeg_JPWL_la-mqc.lo libopenjpeg_JPWL_la-openjpeg.lo \ + libopenjpeg_JPWL_la-pi.lo libopenjpeg_JPWL_la-raw.lo \ + libopenjpeg_JPWL_la-t1.lo \ + libopenjpeg_JPWL_la-t1_generate_luts.lo \ + libopenjpeg_JPWL_la-t2.lo libopenjpeg_JPWL_la-tcd.lo \ + libopenjpeg_JPWL_la-tgt.lo libopenjpeg_JPWL_la-cidx_manager.lo \ + libopenjpeg_JPWL_la-phix_manager.lo \ + libopenjpeg_JPWL_la-ppix_manager.lo \ + libopenjpeg_JPWL_la-thix_manager.lo \ + libopenjpeg_JPWL_la-tpix_manager.lo +am_libopenjpeg_JPWL_la_OBJECTS = $(am__objects_1) \ + libopenjpeg_JPWL_la-crc.lo libopenjpeg_JPWL_la-jpwl.lo \ + libopenjpeg_JPWL_la-jpwl_lib.lo libopenjpeg_JPWL_la-rs.lo +libopenjpeg_JPWL_la_OBJECTS = $(am_libopenjpeg_JPWL_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +libopenjpeg_JPWL_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) \ + $(libopenjpeg_JPWL_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I. -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libopenjpeg_JPWL_la_SOURCES) +DIST_SOURCES = $(libopenjpeg_JPWL_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} /home/justincc/jc/it/g/graphics/jpeg/jpeg2000/openjpeg/src/openjpeg-1.5.0/missing --run aclocal-1.11 +AMTAR = ${SHELL} /home/justincc/jc/it/g/graphics/jpeg/jpeg2000/openjpeg/src/openjpeg-1.5.0/missing --run tar +AM_DEFAULT_VERBOSITY = 0 +AR = ar +AS = as +AUTOCONF = ${SHELL} /home/justincc/jc/it/g/graphics/jpeg/jpeg2000/openjpeg/src/openjpeg-1.5.0/missing --run autoconf +AUTOHEADER = ${SHELL} /home/justincc/jc/it/g/graphics/jpeg/jpeg2000/openjpeg/src/openjpeg-1.5.0/missing --run autoheader +AUTOMAKE = ${SHELL} /home/justincc/jc/it/g/graphics/jpeg/jpeg2000/openjpeg/src/openjpeg-1.5.0/missing --run automake-1.11 +AWK = mawk +CC = gcc +CCDEPMODE = depmode=gcc3 +CFLAGS = -g -O2 -Wno-unused-result -O3 +CPP = gcc -E +CPPFLAGS = +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = dlltool +DSYMUTIL = +DUMPBIN = +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /bin/grep -E +EXEEXT = +FCGI_CFLAGS = +FCGI_LIBS = +FGREP = /bin/grep -F +GREP = /bin/grep +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LCMS1_CFLAGS = +LCMS1_LIBS = +LCMS2_CFLAGS = +LCMS2_LIBS = +LD = /usr/bin/ld -m elf_x86_64 +LDFLAGS = +LIBCURL_CFLAGS = +LIBCURL_LIBS = +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIPO = +LN_S = ln -s +LTLIBOBJS = +MAJOR_NR = 1 +MAKEINFO = ${SHELL} /home/justincc/jc/it/g/graphics/jpeg/jpeg2000/openjpeg/src/openjpeg-1.5.0/missing --run makeinfo +MICRO_NR = 0 +MINOR_NR = 5 +MKDIR_P = /bin/mkdir -p +NM = /usr/bin/nm -B +NMEDIT = +OBJDUMP = objdump +OBJEXT = o +OTOOL = +OTOOL64 = +PACKAGE = openjpeg +PACKAGE_BUGREPORT = openjpeg@googlegroups.com +PACKAGE_NAME = OpenJPEG +PACKAGE_STRING = OpenJPEG 1.5.0 +PACKAGE_TARNAME = openjpeg +PACKAGE_URL = http://www.openjpeg.org +PACKAGE_VERSION = 1.5.0 +PATH_SEPARATOR = : +PKG_CONFIG = /usr/bin/pkg-config +PKG_CONFIG_LIBDIR = +PKG_CONFIG_PATH = +PNG_CFLAGS = -I/usr/include/libpng12 +PNG_LIBS = -lpng12 -lz +RANLIB = ranlib +SED = /bin/sed +SET_MAKE = +SHELL = /bin/bash +STRIP = strip +THREAD_CFLAGS = +THREAD_LIBS = +TIFF_CFLAGS = -I/usr/include +TIFF_LIBS = -L/usr/lib -ltiff +VERSION = 1.5.0 +Z_CFLAGS = +Z_LIBS = +abs_builddir = /home/justincc/jc/it/g/graphics/jpeg/jpeg2000/openjpeg/src/openjpeg-1.5.0/libopenjpeg/jpwl +abs_srcdir = /home/justincc/jc/it/g/graphics/jpeg/jpeg2000/openjpeg/src/openjpeg-1.5.0/libopenjpeg/jpwl +abs_top_builddir = /home/justincc/jc/it/g/graphics/jpeg/jpeg2000/openjpeg/src/openjpeg-1.5.0 +abs_top_srcdir = /home/justincc/jc/it/g/graphics/jpeg/jpeg2000/openjpeg/src/openjpeg-1.5.0 +ac_ct_CC = gcc +ac_ct_DUMPBIN = +am__include = include +am__leading_dot = . +am__quote = +am__tar = ${AMTAR} chof - "$$tardir" +am__untar = ${AMTAR} xf - +bindir = ${exec_prefix}/bin +build = x86_64-unknown-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = unknown +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-unknown-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = unknown +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /home/justincc/jc/it/g/graphics/jpeg/jpeg2000/openjpeg/src/openjpeg-1.5.0/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +lt_ECHO = echo +lt_version = 6:0:5 +mandir = ${datarootdir}/man +mkdir_p = /bin/mkdir -p +oldincludedir = /usr/include +opj_doxygen = doxygen +opj_have_doxygen = no +pdfdir = ${docdir} +pkgconfig_requires_private = Requires.private +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +requirements = +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = . +sysconfdir = ${prefix}/etc +target = x86_64-unknown-linux-gnu +target_alias = +target_cpu = x86_64 +target_os = linux-gnu +target_vendor = unknown +top_build_prefix = ../../ +top_builddir = ../.. +top_srcdir = ../.. +MAINTAINERCLEANFILES = Makefile.in +lib_LTLIBRARIES = libopenjpeg_JPWL.la +OPJ_SRC = \ +../bio.c \ +../cio.c \ +../dwt.c \ +../event.c \ +../image.c \ +../j2k.c \ +../j2k_lib.c \ +../jp2.c \ +../jpt.c \ +../mct.c \ +../mqc.c \ +../openjpeg.c \ +../pi.c \ +../raw.c \ +../t1.c \ +../t1_generate_luts.c \ +../t2.c \ +../tcd.c \ +../tgt.c \ +../cidx_manager.c \ +../phix_manager.c \ +../ppix_manager.c \ +../thix_manager.c \ +../tpix_manager.c + +libopenjpeg_JPWL_la_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/libopenjpeg \ +-I$(top_builddir)/libopenjpeg \ +-I$(top_srcdir)/libopenjpeg/jpwl \ +-I$(top_builddir)/libopenjpeg/jpwl \ +-DUSE_JPWL + +libopenjpeg_JPWL_la_CFLAGS = +libopenjpeg_JPWL_la_LIBADD = -lm +libopenjpeg_JPWL_la_LDFLAGS = -no-undefined -version-info 6:0:5 +libopenjpeg_JPWL_la_SOURCES = \ +$(OPJ_SRC) \ +crc.c \ +jpwl.c \ +jpwl_lib.c \ +rs.c \ +crc.h \ +jpwl.h \ +rs.h + +solist = $(foreach f, $(dll) $(so), echo -e ' $(SO_PREFIX)\t$(base)/$(f)' ;) +get_tok = $(shell grep -E "^$(1)=" $(lib_LTLIBRARIES) | cut -d "'" -f 2) +base = $(call get_tok,libdir) +so = $(call get_tok,library_names) +a = $(call get_tok,old_library) +SO_PREFIX = (SO) +#SO_PREFIX = (DY) +#SO_PREFIX = (DLL) +dll = +#dll = +#dll = $(call get_tok,dlname) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libopenjpeg/jpwl/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign libopenjpeg/jpwl/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libopenjpeg_JPWL.la: $(libopenjpeg_JPWL_la_OBJECTS) $(libopenjpeg_JPWL_la_DEPENDENCIES) + $(AM_V_CCLD)$(libopenjpeg_JPWL_la_LINK) -rpath $(libdir) $(libopenjpeg_JPWL_la_OBJECTS) $(libopenjpeg_JPWL_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +include ./$(DEPDIR)/libopenjpeg_JPWL_la-bio.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-cidx_manager.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-cio.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-crc.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-dwt.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-event.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-image.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-j2k.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-j2k_lib.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-jp2.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-jpt.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-jpwl.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-jpwl_lib.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-mct.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-mqc.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-openjpeg.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-phix_manager.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-pi.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-ppix_manager.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-raw.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-rs.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-t1.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-t1_generate_luts.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-t2.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-tcd.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-tgt.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-thix_manager.Plo +include ./$(DEPDIR)/libopenjpeg_JPWL_la-tpix_manager.Plo + +.c.o: + $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# $(AM_V_CC) \ +# source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(COMPILE) -c $< + +.c.obj: + $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# $(AM_V_CC) \ +# source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: + $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +# $(AM_V_CC) \ +# source='$<' object='$@' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LTCOMPILE) -c -o $@ $< + +libopenjpeg_JPWL_la-bio.lo: ../bio.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-bio.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-bio.Tpo -c -o libopenjpeg_JPWL_la-bio.lo `test -f '../bio.c' || echo '$(srcdir)/'`../bio.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-bio.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-bio.Plo +# $(AM_V_CC) \ +# source='../bio.c' object='libopenjpeg_JPWL_la-bio.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-bio.lo `test -f '../bio.c' || echo '$(srcdir)/'`../bio.c + +libopenjpeg_JPWL_la-cio.lo: ../cio.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-cio.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-cio.Tpo -c -o libopenjpeg_JPWL_la-cio.lo `test -f '../cio.c' || echo '$(srcdir)/'`../cio.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-cio.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-cio.Plo +# $(AM_V_CC) \ +# source='../cio.c' object='libopenjpeg_JPWL_la-cio.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-cio.lo `test -f '../cio.c' || echo '$(srcdir)/'`../cio.c + +libopenjpeg_JPWL_la-dwt.lo: ../dwt.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-dwt.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-dwt.Tpo -c -o libopenjpeg_JPWL_la-dwt.lo `test -f '../dwt.c' || echo '$(srcdir)/'`../dwt.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-dwt.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-dwt.Plo +# $(AM_V_CC) \ +# source='../dwt.c' object='libopenjpeg_JPWL_la-dwt.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-dwt.lo `test -f '../dwt.c' || echo '$(srcdir)/'`../dwt.c + +libopenjpeg_JPWL_la-event.lo: ../event.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-event.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-event.Tpo -c -o libopenjpeg_JPWL_la-event.lo `test -f '../event.c' || echo '$(srcdir)/'`../event.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-event.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-event.Plo +# $(AM_V_CC) \ +# source='../event.c' object='libopenjpeg_JPWL_la-event.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-event.lo `test -f '../event.c' || echo '$(srcdir)/'`../event.c + +libopenjpeg_JPWL_la-image.lo: ../image.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-image.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-image.Tpo -c -o libopenjpeg_JPWL_la-image.lo `test -f '../image.c' || echo '$(srcdir)/'`../image.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-image.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-image.Plo +# $(AM_V_CC) \ +# source='../image.c' object='libopenjpeg_JPWL_la-image.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-image.lo `test -f '../image.c' || echo '$(srcdir)/'`../image.c + +libopenjpeg_JPWL_la-j2k.lo: ../j2k.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-j2k.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-j2k.Tpo -c -o libopenjpeg_JPWL_la-j2k.lo `test -f '../j2k.c' || echo '$(srcdir)/'`../j2k.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-j2k.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-j2k.Plo +# $(AM_V_CC) \ +# source='../j2k.c' object='libopenjpeg_JPWL_la-j2k.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-j2k.lo `test -f '../j2k.c' || echo '$(srcdir)/'`../j2k.c + +libopenjpeg_JPWL_la-j2k_lib.lo: ../j2k_lib.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-j2k_lib.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-j2k_lib.Tpo -c -o libopenjpeg_JPWL_la-j2k_lib.lo `test -f '../j2k_lib.c' || echo '$(srcdir)/'`../j2k_lib.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-j2k_lib.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-j2k_lib.Plo +# $(AM_V_CC) \ +# source='../j2k_lib.c' object='libopenjpeg_JPWL_la-j2k_lib.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-j2k_lib.lo `test -f '../j2k_lib.c' || echo '$(srcdir)/'`../j2k_lib.c + +libopenjpeg_JPWL_la-jp2.lo: ../jp2.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-jp2.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-jp2.Tpo -c -o libopenjpeg_JPWL_la-jp2.lo `test -f '../jp2.c' || echo '$(srcdir)/'`../jp2.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-jp2.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-jp2.Plo +# $(AM_V_CC) \ +# source='../jp2.c' object='libopenjpeg_JPWL_la-jp2.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-jp2.lo `test -f '../jp2.c' || echo '$(srcdir)/'`../jp2.c + +libopenjpeg_JPWL_la-jpt.lo: ../jpt.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-jpt.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-jpt.Tpo -c -o libopenjpeg_JPWL_la-jpt.lo `test -f '../jpt.c' || echo '$(srcdir)/'`../jpt.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-jpt.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-jpt.Plo +# $(AM_V_CC) \ +# source='../jpt.c' object='libopenjpeg_JPWL_la-jpt.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-jpt.lo `test -f '../jpt.c' || echo '$(srcdir)/'`../jpt.c + +libopenjpeg_JPWL_la-mct.lo: ../mct.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-mct.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-mct.Tpo -c -o libopenjpeg_JPWL_la-mct.lo `test -f '../mct.c' || echo '$(srcdir)/'`../mct.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-mct.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-mct.Plo +# $(AM_V_CC) \ +# source='../mct.c' object='libopenjpeg_JPWL_la-mct.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-mct.lo `test -f '../mct.c' || echo '$(srcdir)/'`../mct.c + +libopenjpeg_JPWL_la-mqc.lo: ../mqc.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-mqc.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-mqc.Tpo -c -o libopenjpeg_JPWL_la-mqc.lo `test -f '../mqc.c' || echo '$(srcdir)/'`../mqc.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-mqc.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-mqc.Plo +# $(AM_V_CC) \ +# source='../mqc.c' object='libopenjpeg_JPWL_la-mqc.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-mqc.lo `test -f '../mqc.c' || echo '$(srcdir)/'`../mqc.c + +libopenjpeg_JPWL_la-openjpeg.lo: ../openjpeg.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-openjpeg.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-openjpeg.Tpo -c -o libopenjpeg_JPWL_la-openjpeg.lo `test -f '../openjpeg.c' || echo '$(srcdir)/'`../openjpeg.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-openjpeg.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-openjpeg.Plo +# $(AM_V_CC) \ +# source='../openjpeg.c' object='libopenjpeg_JPWL_la-openjpeg.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-openjpeg.lo `test -f '../openjpeg.c' || echo '$(srcdir)/'`../openjpeg.c + +libopenjpeg_JPWL_la-pi.lo: ../pi.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-pi.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-pi.Tpo -c -o libopenjpeg_JPWL_la-pi.lo `test -f '../pi.c' || echo '$(srcdir)/'`../pi.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-pi.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-pi.Plo +# $(AM_V_CC) \ +# source='../pi.c' object='libopenjpeg_JPWL_la-pi.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-pi.lo `test -f '../pi.c' || echo '$(srcdir)/'`../pi.c + +libopenjpeg_JPWL_la-raw.lo: ../raw.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-raw.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-raw.Tpo -c -o libopenjpeg_JPWL_la-raw.lo `test -f '../raw.c' || echo '$(srcdir)/'`../raw.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-raw.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-raw.Plo +# $(AM_V_CC) \ +# source='../raw.c' object='libopenjpeg_JPWL_la-raw.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-raw.lo `test -f '../raw.c' || echo '$(srcdir)/'`../raw.c + +libopenjpeg_JPWL_la-t1.lo: ../t1.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-t1.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-t1.Tpo -c -o libopenjpeg_JPWL_la-t1.lo `test -f '../t1.c' || echo '$(srcdir)/'`../t1.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-t1.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-t1.Plo +# $(AM_V_CC) \ +# source='../t1.c' object='libopenjpeg_JPWL_la-t1.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-t1.lo `test -f '../t1.c' || echo '$(srcdir)/'`../t1.c + +libopenjpeg_JPWL_la-t1_generate_luts.lo: ../t1_generate_luts.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-t1_generate_luts.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-t1_generate_luts.Tpo -c -o libopenjpeg_JPWL_la-t1_generate_luts.lo `test -f '../t1_generate_luts.c' || echo '$(srcdir)/'`../t1_generate_luts.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-t1_generate_luts.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-t1_generate_luts.Plo +# $(AM_V_CC) \ +# source='../t1_generate_luts.c' object='libopenjpeg_JPWL_la-t1_generate_luts.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-t1_generate_luts.lo `test -f '../t1_generate_luts.c' || echo '$(srcdir)/'`../t1_generate_luts.c + +libopenjpeg_JPWL_la-t2.lo: ../t2.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-t2.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-t2.Tpo -c -o libopenjpeg_JPWL_la-t2.lo `test -f '../t2.c' || echo '$(srcdir)/'`../t2.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-t2.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-t2.Plo +# $(AM_V_CC) \ +# source='../t2.c' object='libopenjpeg_JPWL_la-t2.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-t2.lo `test -f '../t2.c' || echo '$(srcdir)/'`../t2.c + +libopenjpeg_JPWL_la-tcd.lo: ../tcd.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-tcd.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-tcd.Tpo -c -o libopenjpeg_JPWL_la-tcd.lo `test -f '../tcd.c' || echo '$(srcdir)/'`../tcd.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-tcd.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-tcd.Plo +# $(AM_V_CC) \ +# source='../tcd.c' object='libopenjpeg_JPWL_la-tcd.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-tcd.lo `test -f '../tcd.c' || echo '$(srcdir)/'`../tcd.c + +libopenjpeg_JPWL_la-tgt.lo: ../tgt.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-tgt.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-tgt.Tpo -c -o libopenjpeg_JPWL_la-tgt.lo `test -f '../tgt.c' || echo '$(srcdir)/'`../tgt.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-tgt.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-tgt.Plo +# $(AM_V_CC) \ +# source='../tgt.c' object='libopenjpeg_JPWL_la-tgt.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-tgt.lo `test -f '../tgt.c' || echo '$(srcdir)/'`../tgt.c + +libopenjpeg_JPWL_la-cidx_manager.lo: ../cidx_manager.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-cidx_manager.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-cidx_manager.Tpo -c -o libopenjpeg_JPWL_la-cidx_manager.lo `test -f '../cidx_manager.c' || echo '$(srcdir)/'`../cidx_manager.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-cidx_manager.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-cidx_manager.Plo +# $(AM_V_CC) \ +# source='../cidx_manager.c' object='libopenjpeg_JPWL_la-cidx_manager.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-cidx_manager.lo `test -f '../cidx_manager.c' || echo '$(srcdir)/'`../cidx_manager.c + +libopenjpeg_JPWL_la-phix_manager.lo: ../phix_manager.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-phix_manager.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-phix_manager.Tpo -c -o libopenjpeg_JPWL_la-phix_manager.lo `test -f '../phix_manager.c' || echo '$(srcdir)/'`../phix_manager.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-phix_manager.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-phix_manager.Plo +# $(AM_V_CC) \ +# source='../phix_manager.c' object='libopenjpeg_JPWL_la-phix_manager.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-phix_manager.lo `test -f '../phix_manager.c' || echo '$(srcdir)/'`../phix_manager.c + +libopenjpeg_JPWL_la-ppix_manager.lo: ../ppix_manager.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-ppix_manager.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-ppix_manager.Tpo -c -o libopenjpeg_JPWL_la-ppix_manager.lo `test -f '../ppix_manager.c' || echo '$(srcdir)/'`../ppix_manager.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-ppix_manager.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-ppix_manager.Plo +# $(AM_V_CC) \ +# source='../ppix_manager.c' object='libopenjpeg_JPWL_la-ppix_manager.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-ppix_manager.lo `test -f '../ppix_manager.c' || echo '$(srcdir)/'`../ppix_manager.c + +libopenjpeg_JPWL_la-thix_manager.lo: ../thix_manager.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-thix_manager.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-thix_manager.Tpo -c -o libopenjpeg_JPWL_la-thix_manager.lo `test -f '../thix_manager.c' || echo '$(srcdir)/'`../thix_manager.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-thix_manager.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-thix_manager.Plo +# $(AM_V_CC) \ +# source='../thix_manager.c' object='libopenjpeg_JPWL_la-thix_manager.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-thix_manager.lo `test -f '../thix_manager.c' || echo '$(srcdir)/'`../thix_manager.c + +libopenjpeg_JPWL_la-tpix_manager.lo: ../tpix_manager.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-tpix_manager.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-tpix_manager.Tpo -c -o libopenjpeg_JPWL_la-tpix_manager.lo `test -f '../tpix_manager.c' || echo '$(srcdir)/'`../tpix_manager.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-tpix_manager.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-tpix_manager.Plo +# $(AM_V_CC) \ +# source='../tpix_manager.c' object='libopenjpeg_JPWL_la-tpix_manager.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-tpix_manager.lo `test -f '../tpix_manager.c' || echo '$(srcdir)/'`../tpix_manager.c + +libopenjpeg_JPWL_la-crc.lo: crc.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-crc.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-crc.Tpo -c -o libopenjpeg_JPWL_la-crc.lo `test -f 'crc.c' || echo '$(srcdir)/'`crc.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-crc.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-crc.Plo +# $(AM_V_CC) \ +# source='crc.c' object='libopenjpeg_JPWL_la-crc.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-crc.lo `test -f 'crc.c' || echo '$(srcdir)/'`crc.c + +libopenjpeg_JPWL_la-jpwl.lo: jpwl.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-jpwl.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-jpwl.Tpo -c -o libopenjpeg_JPWL_la-jpwl.lo `test -f 'jpwl.c' || echo '$(srcdir)/'`jpwl.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-jpwl.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-jpwl.Plo +# $(AM_V_CC) \ +# source='jpwl.c' object='libopenjpeg_JPWL_la-jpwl.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-jpwl.lo `test -f 'jpwl.c' || echo '$(srcdir)/'`jpwl.c + +libopenjpeg_JPWL_la-jpwl_lib.lo: jpwl_lib.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-jpwl_lib.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-jpwl_lib.Tpo -c -o libopenjpeg_JPWL_la-jpwl_lib.lo `test -f 'jpwl_lib.c' || echo '$(srcdir)/'`jpwl_lib.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-jpwl_lib.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-jpwl_lib.Plo +# $(AM_V_CC) \ +# source='jpwl_lib.c' object='libopenjpeg_JPWL_la-jpwl_lib.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-jpwl_lib.lo `test -f 'jpwl_lib.c' || echo '$(srcdir)/'`jpwl_lib.c + +libopenjpeg_JPWL_la-rs.lo: rs.c + $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-rs.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-rs.Tpo -c -o libopenjpeg_JPWL_la-rs.lo `test -f 'rs.c' || echo '$(srcdir)/'`rs.c + $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-rs.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-rs.Plo +# $(AM_V_CC) \ +# source='rs.c' object='libopenjpeg_JPWL_la-rs.lo' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-rs.lo `test -f 'rs.c' || echo '$(srcdir)/'`rs.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(libdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-libLTLIBRARIES + +.MAKE: install-am install-data-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-data-hook install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-libLTLIBRARIES install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-libLTLIBRARIES + + +install-data-hook: + @echo -e " (LA)\t$(libdir)/libopenjpeg_JPWL.la" >> $(top_builddir)/report.txt + @( $(call solist) ) >> $(top_builddir)/report.txt + @echo -e " (A)\t$(base)/$(a)" >> $(top_builddir)/report.txt + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/Makefile.am b/openjpeg-dotnet/libopenjpeg/jpwl/Makefile.am new file mode 100644 index 00000000..f1eda310 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/Makefile.am @@ -0,0 +1,77 @@ +MAINTAINERCLEANFILES = Makefile.in + +lib_LTLIBRARIES = libopenjpeg_JPWL.la + +OPJ_SRC = \ +../bio.c \ +../cio.c \ +../dwt.c \ +../event.c \ +../image.c \ +../j2k.c \ +../j2k_lib.c \ +../jp2.c \ +../jpt.c \ +../mct.c \ +../mqc.c \ +../openjpeg.c \ +../pi.c \ +../raw.c \ +../t1.c \ +../t1_generate_luts.c \ +../t2.c \ +../tcd.c \ +../tgt.c \ +../cidx_manager.c \ +../phix_manager.c \ +../ppix_manager.c \ +../thix_manager.c \ +../tpix_manager.c + +libopenjpeg_JPWL_la_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/libopenjpeg \ +-I$(top_builddir)/libopenjpeg \ +-I$(top_srcdir)/libopenjpeg/jpwl \ +-I$(top_builddir)/libopenjpeg/jpwl \ +-DUSE_JPWL +libopenjpeg_JPWL_la_CFLAGS = +libopenjpeg_JPWL_la_LIBADD = -lm +libopenjpeg_JPWL_la_LDFLAGS = -no-undefined -version-info @lt_version@ +libopenjpeg_JPWL_la_SOURCES = \ +$(OPJ_SRC) \ +crc.c \ +jpwl.c \ +jpwl_lib.c \ +rs.c \ +crc.h \ +jpwl.h \ +rs.h + +install-data-hook: + @echo -e " (LA)\t$(libdir)/libopenjpeg_JPWL.la" >> $(top_builddir)/report.txt +if BUILD_SHARED + @( $(call solist) ) >> $(top_builddir)/report.txt +endif +if BUILD_STATIC + @echo -e " (A)\t$(base)/$(a)" >> $(top_builddir)/report.txt +endif + +solist = $(foreach f, $(dll) $(so), echo -e ' $(SO_PREFIX)\t$(base)/$(f)' ;) +get_tok = $(shell grep -E "^$(1)=" $(lib_LTLIBRARIES) | cut -d "'" -f 2) +base = $(call get_tok,libdir) +so = $(call get_tok,library_names) +a = $(call get_tok,old_library) + +if HAVE_WIN32 +SO_PREFIX = (DLL) +dll = $(call get_tok,dlname) +else +if HAVE_DARWIN +SO_PREFIX = (DY) +dll = +else +SO_PREFIX = (SO) +dll = +endif +endif diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/Makefile.in b/openjpeg-dotnet/libopenjpeg/jpwl/Makefile.in new file mode 100644 index 00000000..ace28875 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/Makefile.in @@ -0,0 +1,908 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = libopenjpeg/jpwl +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/opj_check_lib.m4 \ + $(top_srcdir)/m4/opj_compiler_flag.m4 \ + $(top_srcdir)/m4/opj_doxygen.m4 $(top_srcdir)/m4/pkg.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/opj_config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(libdir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +libopenjpeg_JPWL_la_DEPENDENCIES = +am__objects_1 = libopenjpeg_JPWL_la-bio.lo libopenjpeg_JPWL_la-cio.lo \ + libopenjpeg_JPWL_la-dwt.lo libopenjpeg_JPWL_la-event.lo \ + libopenjpeg_JPWL_la-image.lo libopenjpeg_JPWL_la-j2k.lo \ + libopenjpeg_JPWL_la-j2k_lib.lo libopenjpeg_JPWL_la-jp2.lo \ + libopenjpeg_JPWL_la-jpt.lo libopenjpeg_JPWL_la-mct.lo \ + libopenjpeg_JPWL_la-mqc.lo libopenjpeg_JPWL_la-openjpeg.lo \ + libopenjpeg_JPWL_la-pi.lo libopenjpeg_JPWL_la-raw.lo \ + libopenjpeg_JPWL_la-t1.lo \ + libopenjpeg_JPWL_la-t1_generate_luts.lo \ + libopenjpeg_JPWL_la-t2.lo libopenjpeg_JPWL_la-tcd.lo \ + libopenjpeg_JPWL_la-tgt.lo libopenjpeg_JPWL_la-cidx_manager.lo \ + libopenjpeg_JPWL_la-phix_manager.lo \ + libopenjpeg_JPWL_la-ppix_manager.lo \ + libopenjpeg_JPWL_la-thix_manager.lo \ + libopenjpeg_JPWL_la-tpix_manager.lo +am_libopenjpeg_JPWL_la_OBJECTS = $(am__objects_1) \ + libopenjpeg_JPWL_la-crc.lo libopenjpeg_JPWL_la-jpwl.lo \ + libopenjpeg_JPWL_la-jpwl_lib.lo libopenjpeg_JPWL_la-rs.lo +libopenjpeg_JPWL_la_OBJECTS = $(am_libopenjpeg_JPWL_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +libopenjpeg_JPWL_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) \ + $(libopenjpeg_JPWL_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libopenjpeg_JPWL_la_SOURCES) +DIST_SOURCES = $(libopenjpeg_JPWL_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FCGI_CFLAGS = @FCGI_CFLAGS@ +FCGI_LIBS = @FCGI_LIBS@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LCMS1_CFLAGS = @LCMS1_CFLAGS@ +LCMS1_LIBS = @LCMS1_LIBS@ +LCMS2_CFLAGS = @LCMS2_CFLAGS@ +LCMS2_LIBS = @LCMS2_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAJOR_NR = @MAJOR_NR@ +MAKEINFO = @MAKEINFO@ +MICRO_NR = @MICRO_NR@ +MINOR_NR = @MINOR_NR@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PNG_CFLAGS = @PNG_CFLAGS@ +PNG_LIBS = @PNG_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +THREAD_CFLAGS = @THREAD_CFLAGS@ +THREAD_LIBS = @THREAD_LIBS@ +TIFF_CFLAGS = @TIFF_CFLAGS@ +TIFF_LIBS = @TIFF_LIBS@ +VERSION = @VERSION@ +Z_CFLAGS = @Z_CFLAGS@ +Z_LIBS = @Z_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +lt_version = @lt_version@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +opj_doxygen = @opj_doxygen@ +opj_have_doxygen = @opj_have_doxygen@ +pdfdir = @pdfdir@ +pkgconfig_requires_private = @pkgconfig_requires_private@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +requirements = @requirements@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +MAINTAINERCLEANFILES = Makefile.in +lib_LTLIBRARIES = libopenjpeg_JPWL.la +OPJ_SRC = \ +../bio.c \ +../cio.c \ +../dwt.c \ +../event.c \ +../image.c \ +../j2k.c \ +../j2k_lib.c \ +../jp2.c \ +../jpt.c \ +../mct.c \ +../mqc.c \ +../openjpeg.c \ +../pi.c \ +../raw.c \ +../t1.c \ +../t1_generate_luts.c \ +../t2.c \ +../tcd.c \ +../tgt.c \ +../cidx_manager.c \ +../phix_manager.c \ +../ppix_manager.c \ +../thix_manager.c \ +../tpix_manager.c + +libopenjpeg_JPWL_la_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/libopenjpeg \ +-I$(top_builddir)/libopenjpeg \ +-I$(top_srcdir)/libopenjpeg/jpwl \ +-I$(top_builddir)/libopenjpeg/jpwl \ +-DUSE_JPWL + +libopenjpeg_JPWL_la_CFLAGS = +libopenjpeg_JPWL_la_LIBADD = -lm +libopenjpeg_JPWL_la_LDFLAGS = -no-undefined -version-info @lt_version@ +libopenjpeg_JPWL_la_SOURCES = \ +$(OPJ_SRC) \ +crc.c \ +jpwl.c \ +jpwl_lib.c \ +rs.c \ +crc.h \ +jpwl.h \ +rs.h + +solist = $(foreach f, $(dll) $(so), echo -e ' $(SO_PREFIX)\t$(base)/$(f)' ;) +get_tok = $(shell grep -E "^$(1)=" $(lib_LTLIBRARIES) | cut -d "'" -f 2) +base = $(call get_tok,libdir) +so = $(call get_tok,library_names) +a = $(call get_tok,old_library) +@HAVE_DARWIN_FALSE@@HAVE_WIN32_FALSE@SO_PREFIX = (SO) +@HAVE_DARWIN_TRUE@@HAVE_WIN32_FALSE@SO_PREFIX = (DY) +@HAVE_WIN32_TRUE@SO_PREFIX = (DLL) +@HAVE_DARWIN_FALSE@@HAVE_WIN32_FALSE@dll = +@HAVE_DARWIN_TRUE@@HAVE_WIN32_FALSE@dll = +@HAVE_WIN32_TRUE@dll = $(call get_tok,dlname) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libopenjpeg/jpwl/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign libopenjpeg/jpwl/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libopenjpeg_JPWL.la: $(libopenjpeg_JPWL_la_OBJECTS) $(libopenjpeg_JPWL_la_DEPENDENCIES) + $(AM_V_CCLD)$(libopenjpeg_JPWL_la_LINK) -rpath $(libdir) $(libopenjpeg_JPWL_la_OBJECTS) $(libopenjpeg_JPWL_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-bio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-cidx_manager.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-cio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-crc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-dwt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-event.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-image.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-j2k.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-j2k_lib.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-jp2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-jpt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-jpwl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-jpwl_lib.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-mct.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-mqc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-openjpeg.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-phix_manager.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-pi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-ppix_manager.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-raw.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-rs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-t1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-t1_generate_luts.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-t2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-tcd.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-tgt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-thix_manager.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopenjpeg_JPWL_la-tpix_manager.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +libopenjpeg_JPWL_la-bio.lo: ../bio.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-bio.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-bio.Tpo -c -o libopenjpeg_JPWL_la-bio.lo `test -f '../bio.c' || echo '$(srcdir)/'`../bio.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-bio.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-bio.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../bio.c' object='libopenjpeg_JPWL_la-bio.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-bio.lo `test -f '../bio.c' || echo '$(srcdir)/'`../bio.c + +libopenjpeg_JPWL_la-cio.lo: ../cio.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-cio.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-cio.Tpo -c -o libopenjpeg_JPWL_la-cio.lo `test -f '../cio.c' || echo '$(srcdir)/'`../cio.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-cio.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-cio.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../cio.c' object='libopenjpeg_JPWL_la-cio.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-cio.lo `test -f '../cio.c' || echo '$(srcdir)/'`../cio.c + +libopenjpeg_JPWL_la-dwt.lo: ../dwt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-dwt.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-dwt.Tpo -c -o libopenjpeg_JPWL_la-dwt.lo `test -f '../dwt.c' || echo '$(srcdir)/'`../dwt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-dwt.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-dwt.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../dwt.c' object='libopenjpeg_JPWL_la-dwt.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-dwt.lo `test -f '../dwt.c' || echo '$(srcdir)/'`../dwt.c + +libopenjpeg_JPWL_la-event.lo: ../event.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-event.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-event.Tpo -c -o libopenjpeg_JPWL_la-event.lo `test -f '../event.c' || echo '$(srcdir)/'`../event.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-event.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-event.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../event.c' object='libopenjpeg_JPWL_la-event.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-event.lo `test -f '../event.c' || echo '$(srcdir)/'`../event.c + +libopenjpeg_JPWL_la-image.lo: ../image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-image.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-image.Tpo -c -o libopenjpeg_JPWL_la-image.lo `test -f '../image.c' || echo '$(srcdir)/'`../image.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-image.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-image.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../image.c' object='libopenjpeg_JPWL_la-image.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-image.lo `test -f '../image.c' || echo '$(srcdir)/'`../image.c + +libopenjpeg_JPWL_la-j2k.lo: ../j2k.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-j2k.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-j2k.Tpo -c -o libopenjpeg_JPWL_la-j2k.lo `test -f '../j2k.c' || echo '$(srcdir)/'`../j2k.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-j2k.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-j2k.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../j2k.c' object='libopenjpeg_JPWL_la-j2k.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-j2k.lo `test -f '../j2k.c' || echo '$(srcdir)/'`../j2k.c + +libopenjpeg_JPWL_la-j2k_lib.lo: ../j2k_lib.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-j2k_lib.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-j2k_lib.Tpo -c -o libopenjpeg_JPWL_la-j2k_lib.lo `test -f '../j2k_lib.c' || echo '$(srcdir)/'`../j2k_lib.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-j2k_lib.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-j2k_lib.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../j2k_lib.c' object='libopenjpeg_JPWL_la-j2k_lib.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-j2k_lib.lo `test -f '../j2k_lib.c' || echo '$(srcdir)/'`../j2k_lib.c + +libopenjpeg_JPWL_la-jp2.lo: ../jp2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-jp2.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-jp2.Tpo -c -o libopenjpeg_JPWL_la-jp2.lo `test -f '../jp2.c' || echo '$(srcdir)/'`../jp2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-jp2.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-jp2.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../jp2.c' object='libopenjpeg_JPWL_la-jp2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-jp2.lo `test -f '../jp2.c' || echo '$(srcdir)/'`../jp2.c + +libopenjpeg_JPWL_la-jpt.lo: ../jpt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-jpt.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-jpt.Tpo -c -o libopenjpeg_JPWL_la-jpt.lo `test -f '../jpt.c' || echo '$(srcdir)/'`../jpt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-jpt.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-jpt.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../jpt.c' object='libopenjpeg_JPWL_la-jpt.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-jpt.lo `test -f '../jpt.c' || echo '$(srcdir)/'`../jpt.c + +libopenjpeg_JPWL_la-mct.lo: ../mct.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-mct.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-mct.Tpo -c -o libopenjpeg_JPWL_la-mct.lo `test -f '../mct.c' || echo '$(srcdir)/'`../mct.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-mct.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-mct.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../mct.c' object='libopenjpeg_JPWL_la-mct.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-mct.lo `test -f '../mct.c' || echo '$(srcdir)/'`../mct.c + +libopenjpeg_JPWL_la-mqc.lo: ../mqc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-mqc.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-mqc.Tpo -c -o libopenjpeg_JPWL_la-mqc.lo `test -f '../mqc.c' || echo '$(srcdir)/'`../mqc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-mqc.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-mqc.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../mqc.c' object='libopenjpeg_JPWL_la-mqc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-mqc.lo `test -f '../mqc.c' || echo '$(srcdir)/'`../mqc.c + +libopenjpeg_JPWL_la-openjpeg.lo: ../openjpeg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-openjpeg.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-openjpeg.Tpo -c -o libopenjpeg_JPWL_la-openjpeg.lo `test -f '../openjpeg.c' || echo '$(srcdir)/'`../openjpeg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-openjpeg.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-openjpeg.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../openjpeg.c' object='libopenjpeg_JPWL_la-openjpeg.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-openjpeg.lo `test -f '../openjpeg.c' || echo '$(srcdir)/'`../openjpeg.c + +libopenjpeg_JPWL_la-pi.lo: ../pi.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-pi.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-pi.Tpo -c -o libopenjpeg_JPWL_la-pi.lo `test -f '../pi.c' || echo '$(srcdir)/'`../pi.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-pi.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-pi.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../pi.c' object='libopenjpeg_JPWL_la-pi.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-pi.lo `test -f '../pi.c' || echo '$(srcdir)/'`../pi.c + +libopenjpeg_JPWL_la-raw.lo: ../raw.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-raw.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-raw.Tpo -c -o libopenjpeg_JPWL_la-raw.lo `test -f '../raw.c' || echo '$(srcdir)/'`../raw.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-raw.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-raw.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../raw.c' object='libopenjpeg_JPWL_la-raw.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-raw.lo `test -f '../raw.c' || echo '$(srcdir)/'`../raw.c + +libopenjpeg_JPWL_la-t1.lo: ../t1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-t1.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-t1.Tpo -c -o libopenjpeg_JPWL_la-t1.lo `test -f '../t1.c' || echo '$(srcdir)/'`../t1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-t1.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-t1.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../t1.c' object='libopenjpeg_JPWL_la-t1.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-t1.lo `test -f '../t1.c' || echo '$(srcdir)/'`../t1.c + +libopenjpeg_JPWL_la-t1_generate_luts.lo: ../t1_generate_luts.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-t1_generate_luts.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-t1_generate_luts.Tpo -c -o libopenjpeg_JPWL_la-t1_generate_luts.lo `test -f '../t1_generate_luts.c' || echo '$(srcdir)/'`../t1_generate_luts.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-t1_generate_luts.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-t1_generate_luts.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../t1_generate_luts.c' object='libopenjpeg_JPWL_la-t1_generate_luts.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-t1_generate_luts.lo `test -f '../t1_generate_luts.c' || echo '$(srcdir)/'`../t1_generate_luts.c + +libopenjpeg_JPWL_la-t2.lo: ../t2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-t2.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-t2.Tpo -c -o libopenjpeg_JPWL_la-t2.lo `test -f '../t2.c' || echo '$(srcdir)/'`../t2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-t2.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-t2.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../t2.c' object='libopenjpeg_JPWL_la-t2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-t2.lo `test -f '../t2.c' || echo '$(srcdir)/'`../t2.c + +libopenjpeg_JPWL_la-tcd.lo: ../tcd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-tcd.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-tcd.Tpo -c -o libopenjpeg_JPWL_la-tcd.lo `test -f '../tcd.c' || echo '$(srcdir)/'`../tcd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-tcd.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-tcd.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../tcd.c' object='libopenjpeg_JPWL_la-tcd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-tcd.lo `test -f '../tcd.c' || echo '$(srcdir)/'`../tcd.c + +libopenjpeg_JPWL_la-tgt.lo: ../tgt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-tgt.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-tgt.Tpo -c -o libopenjpeg_JPWL_la-tgt.lo `test -f '../tgt.c' || echo '$(srcdir)/'`../tgt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-tgt.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-tgt.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../tgt.c' object='libopenjpeg_JPWL_la-tgt.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-tgt.lo `test -f '../tgt.c' || echo '$(srcdir)/'`../tgt.c + +libopenjpeg_JPWL_la-cidx_manager.lo: ../cidx_manager.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-cidx_manager.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-cidx_manager.Tpo -c -o libopenjpeg_JPWL_la-cidx_manager.lo `test -f '../cidx_manager.c' || echo '$(srcdir)/'`../cidx_manager.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-cidx_manager.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-cidx_manager.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../cidx_manager.c' object='libopenjpeg_JPWL_la-cidx_manager.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-cidx_manager.lo `test -f '../cidx_manager.c' || echo '$(srcdir)/'`../cidx_manager.c + +libopenjpeg_JPWL_la-phix_manager.lo: ../phix_manager.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-phix_manager.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-phix_manager.Tpo -c -o libopenjpeg_JPWL_la-phix_manager.lo `test -f '../phix_manager.c' || echo '$(srcdir)/'`../phix_manager.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-phix_manager.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-phix_manager.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../phix_manager.c' object='libopenjpeg_JPWL_la-phix_manager.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-phix_manager.lo `test -f '../phix_manager.c' || echo '$(srcdir)/'`../phix_manager.c + +libopenjpeg_JPWL_la-ppix_manager.lo: ../ppix_manager.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-ppix_manager.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-ppix_manager.Tpo -c -o libopenjpeg_JPWL_la-ppix_manager.lo `test -f '../ppix_manager.c' || echo '$(srcdir)/'`../ppix_manager.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-ppix_manager.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-ppix_manager.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../ppix_manager.c' object='libopenjpeg_JPWL_la-ppix_manager.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-ppix_manager.lo `test -f '../ppix_manager.c' || echo '$(srcdir)/'`../ppix_manager.c + +libopenjpeg_JPWL_la-thix_manager.lo: ../thix_manager.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-thix_manager.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-thix_manager.Tpo -c -o libopenjpeg_JPWL_la-thix_manager.lo `test -f '../thix_manager.c' || echo '$(srcdir)/'`../thix_manager.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-thix_manager.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-thix_manager.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../thix_manager.c' object='libopenjpeg_JPWL_la-thix_manager.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-thix_manager.lo `test -f '../thix_manager.c' || echo '$(srcdir)/'`../thix_manager.c + +libopenjpeg_JPWL_la-tpix_manager.lo: ../tpix_manager.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-tpix_manager.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-tpix_manager.Tpo -c -o libopenjpeg_JPWL_la-tpix_manager.lo `test -f '../tpix_manager.c' || echo '$(srcdir)/'`../tpix_manager.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-tpix_manager.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-tpix_manager.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../tpix_manager.c' object='libopenjpeg_JPWL_la-tpix_manager.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-tpix_manager.lo `test -f '../tpix_manager.c' || echo '$(srcdir)/'`../tpix_manager.c + +libopenjpeg_JPWL_la-crc.lo: crc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-crc.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-crc.Tpo -c -o libopenjpeg_JPWL_la-crc.lo `test -f 'crc.c' || echo '$(srcdir)/'`crc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-crc.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-crc.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crc.c' object='libopenjpeg_JPWL_la-crc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-crc.lo `test -f 'crc.c' || echo '$(srcdir)/'`crc.c + +libopenjpeg_JPWL_la-jpwl.lo: jpwl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-jpwl.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-jpwl.Tpo -c -o libopenjpeg_JPWL_la-jpwl.lo `test -f 'jpwl.c' || echo '$(srcdir)/'`jpwl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-jpwl.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-jpwl.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='jpwl.c' object='libopenjpeg_JPWL_la-jpwl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-jpwl.lo `test -f 'jpwl.c' || echo '$(srcdir)/'`jpwl.c + +libopenjpeg_JPWL_la-jpwl_lib.lo: jpwl_lib.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-jpwl_lib.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-jpwl_lib.Tpo -c -o libopenjpeg_JPWL_la-jpwl_lib.lo `test -f 'jpwl_lib.c' || echo '$(srcdir)/'`jpwl_lib.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-jpwl_lib.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-jpwl_lib.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='jpwl_lib.c' object='libopenjpeg_JPWL_la-jpwl_lib.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-jpwl_lib.lo `test -f 'jpwl_lib.c' || echo '$(srcdir)/'`jpwl_lib.c + +libopenjpeg_JPWL_la-rs.lo: rs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -MT libopenjpeg_JPWL_la-rs.lo -MD -MP -MF $(DEPDIR)/libopenjpeg_JPWL_la-rs.Tpo -c -o libopenjpeg_JPWL_la-rs.lo `test -f 'rs.c' || echo '$(srcdir)/'`rs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libopenjpeg_JPWL_la-rs.Tpo $(DEPDIR)/libopenjpeg_JPWL_la-rs.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rs.c' object='libopenjpeg_JPWL_la-rs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopenjpeg_JPWL_la_CPPFLAGS) $(CPPFLAGS) $(libopenjpeg_JPWL_la_CFLAGS) $(CFLAGS) -c -o libopenjpeg_JPWL_la-rs.lo `test -f 'rs.c' || echo '$(srcdir)/'`rs.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(libdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-libLTLIBRARIES + +.MAKE: install-am install-data-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-data-hook install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-libLTLIBRARIES install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-libLTLIBRARIES + + +install-data-hook: + @echo -e " (LA)\t$(libdir)/libopenjpeg_JPWL.la" >> $(top_builddir)/report.txt +@BUILD_SHARED_TRUE@ @( $(call solist) ) >> $(top_builddir)/report.txt +@BUILD_STATIC_TRUE@ @echo -e " (A)\t$(base)/$(a)" >> $(top_builddir)/report.txt + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/README.txt b/openjpeg-dotnet/libopenjpeg/jpwl/README.txt new file mode 100644 index 00000000..66e9d5b1 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/README.txt @@ -0,0 +1,136 @@ +=============================================================================== + JPEG2000 Part 11 (ISO/IEC 15444-11 JPWL) Software + + + + Version 20061213 +=============================================================================== + + + + + +1. Scope +============= + +This document describes the installation and use of the JPWL module in the framework of OpenJPEG library. + +This implementation has been developed from OpenJPEG implementation of JPEG2000 standard, and for this reason it is written in C language. + +If you find some bugs or if you have problems using the encoder/decoder, please send an e-mail to jpwl@diei.unipg.it + + +2. Installing the code +========================== + +The JPWL code is integrated with the standard OpenJPEG library and codecs: it is activated by setting the macro USE_JPWL to defined in the preprocessor configuration options of your preferred C compiler. + +2.1. Compiling the source code in Windows +------------------------------------------- + +The "jpwl" directory is already populated with a couple of Visual C++ 6.0 workspaces + + * JPWL_image_to_j2k.dsw - Creates the encoder with JPWL functionalities + * JPWL_j2k_to_image.dsw - Creates the decoder with JPWL functionalities + +2.2. Compiling the source code in Unix-like systems +----------------------------------------------------- + +Under linux, enter the jpwl directory and type "make clean" and "make". + + +3. Running the JPWL software +========================= + +The options available at the command line are exactly the same of the base OpenJPEG codecs. In addition, there is a "-W" switch that activates JPWL functionalities. + +3.1. JPWL Encoder +------------------- + +-W : adoption of JPWL (Part 11) capabilities (-W params) + The parameters can be written and repeated in any order: + [h<=type>,s<=method>,a=,z=,g=,... + ...,p<=type>] + + h selects the header error protection (EPB): 'type' can be + [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS] + if 'tile' is absent, it applies to main and tile headers + if 'tile' is present, it applies from that tile + onwards, up to the next h spec, or to the last tile + in the codestream (max. 16 specs) + + p selects the packet error protection (EEP/UEP with EPBs) + to be applied to raw data: 'type' can be + [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS] + if 'tile:pack' is absent, it starts from tile 0, packet 0 + if 'tile:pack' is present, it applies from that tile + and that packet onwards, up to the next packet spec + or to the last packet in the last tile in the codestream + (max. 16 specs) + + s enables sensitivity data insertion (ESD): 'method' can be + [-1=NO ESD 0=RELATIVE ERROR 1=MSE 2=MSE REDUCTION 3=PSNR + 4=PSNR INCREMENT 5=MAXERR 6=TSE 7=RESERVED] + if 'tile' is absent, it applies to main header only + if 'tile' is present, it applies from that tile + onwards, up to the next s spec, or to the last tile + in the codestream (max. 16 specs) + + g determines the addressing mode: can be + [0=PACKET 1=BYTE RANGE 2=PACKET RANGE] + + a determines the size of data addressing: can be + 2/4 bytes (small/large codestreams). If not set, auto-mode + + z determines the size of sensitivity values: can be + 1/2 bytes, for the transformed pseudo-floating point value + + ex.: + h,h0=64,h3=16,h5=32,p0=78,p0:24=56,p1,p3:0=0,p3:20=32,s=0,s0=6,s3=-1,a=0,g=1,z=1 + means + predefined EPB in MH, rs(64,32) from TPH 0 to TPH 2, + CRC-16 in TPH 3 and TPH 4, CRC-32 in remaining TPHs, + UEP rs(78,32) for packets 0 to 23 of tile 0, + UEP rs(56,32) for packets 24 to the last of tile 0, + UEP rs default for packets of tile 1, + no UEP for packets 0 to 19 of tile 3, + UEP CRC-32 for packets 20 of tile 3 to last tile, + relative sensitivity ESD for MH, + TSE ESD from TPH 0 to TPH 2, byte range with automatic + size of addresses and 1 byte for each sensitivity value + + ex.: + h,s,p + means + default protection to headers (MH and TPHs) as well as + data packets, one ESD in MH + + N.B.: use the following recommendations when specifying + the JPWL parameters list + - when you use UEP, always pair the 'p' option with 'h' + +3.2. JPWL Decoder +------------------- + + -W + Activates the JPWL correction capability, if the codestream complies. + Options can be a comma separated list of tokens: + c, c=numcomps + numcomps is the number of expected components in the codestream + (search of first EPB rely upon this, default is 3) + + +4. Known bugs and limitations +=============================== + +4.1. Bugs +----------- + +* It is not possible to save a JPWL encoded codestream using the wrapped file format (i.e. JP2): only raw file format (i.e. J2K) is working + +4.2. Limitations +------------------ + +* When specifying an UEP protection, you need to activate even TPH protection for those tiles where there is a protection of the packets +* RED insertion is not currently implemented at the decoder +* JPWL at entropy coding level is not implemented diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/crc.c b/openjpeg-dotnet/libopenjpeg/jpwl/crc.c new file mode 100644 index 00000000..f65e4e1e --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/crc.c @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium + * Copyright (c) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#ifdef USE_JPWL + +#include "crc.h" + +/** +@file crc.c +@brief Functions used to compute the 16- and 32-bit CRC of byte arrays + +*/ + +/** file: CRC16.CPP + * + * CRC - Cyclic Redundancy Check (16-bit) + * + * A CRC-checksum is used to be sure, the data hasn't changed or is false. + * To create a CRC-checksum, initialise a check-variable (unsigned short), + * and set this to zero. Than call for every byte in the file (e.g.) the + * procedure updateCRC16 with this check-variable as the first parameter, + * and the byte as the second. At the end, the check-variable contains the + * CRC-checksum. + * + * implemented by Michael Neumann, 14.06.1998 + * + */ +const unsigned short CRC16_table[256] = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, + 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, + 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, + 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, + 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, + 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, + 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, + 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, + 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, + 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, + 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, + 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, + 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, + 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, + 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, + 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, + 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, + 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, + 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, + 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, + 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, + 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, + 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 +}; + +void updateCRC16(unsigned short *crc, unsigned char data) { + *crc = CRC16_table[(*crc >> 8) & 0xFF] ^ (*crc << 8) ^ data; +}; + + +/** file: CRC32.CPP + * + * CRC - Cyclic Redundancy Check (32-bit) + * + * A CRC-checksum is used to be sure, the data hasn't changed or is false. + * To create a CRC-checksum, initialise a check-variable (unsigned long), + * and set this to zero. Than call for every byte in the file (e.g.) the + * procedure updateCRC32 with this check-variable as the first parameter, + * and the byte as the second. At the end, the check-variable contains the + * CRC-checksum. + * + * implemented by Michael Neumann, 14.06.1998 + * + */ +const unsigned long CRC32_table[256] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, + 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, + 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, + 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, + 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, + 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, + 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, + 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, + 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, + 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, + 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, + 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, + 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, + 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, + 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +void updateCRC32(unsigned long *crc, unsigned char data) { + *crc = CRC32_table[(unsigned char) *crc ^ data] ^ ((*crc >> 8) & 0x00FFFFFF); +}; + +#endif /* USE_JPWL */ diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/crc.h b/openjpeg-dotnet/libopenjpeg/jpwl/crc.h new file mode 100644 index 00000000..4ea2c4ce --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/crc.h @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium + * Copyright (c) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#ifdef USE_JPWL + +/** +@file crc.h +@brief Functions used to compute the 16- and 32-bit CRC of byte arrays + +*/ + +#ifndef __CRC16_HEADER__ +#define __CRC16_HEADER__ + +/** file: CRC16.HPP + * + * CRC - Cyclic Redundancy Check (16-bit) + * + * A CRC-checksum is used to be sure, the data hasn't changed or is false. + * To create a CRC-checksum, initialise a check-variable (unsigned short), + * and set this to zero. Than call for every byte in the file (e.g.) the + * procedure updateCRC16 with this check-variable as the first parameter, + * and the byte as the second. At the end, the check-variable contains the + * CRC-checksum. + * + * implemented by Michael Neumann, 14.06.1998 + * + */ +void updateCRC16(unsigned short *, unsigned char); + +#endif /* __CRC16_HEADER__ */ + + +#ifndef __CRC32_HEADER__ +#define __CRC32_HEADER__ + +/** file: CRC32.HPP + * + * CRC - Cyclic Redundancy Check (32-bit) + * + * A CRC-checksum is used to be sure, the data hasn't changed or is false. + * To create a CRC-checksum, initialise a check-variable (unsigned short), + * and set this to zero. Than call for every byte in the file (e.g.) the + * procedure updateCRC32 with this check-variable as the first parameter, + * and the byte as the second. At the end, the check-variable contains the + * CRC-checksum. + * + * implemented by Michael Neumann, 14.06.1998 + * + */ +void updateCRC32(unsigned long *, unsigned char); + +#endif /* __CRC32_HEADER__ */ + + +#endif /* USE_JPWL */ diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/jpwl.c b/openjpeg-dotnet/libopenjpeg/jpwl/jpwl.c new file mode 100644 index 00000000..4247f750 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/jpwl.c @@ -0,0 +1,1358 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium + * Copyright (c) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#include "opj_includes.h" + +#ifdef USE_JPWL + +/** @defgroup JPWL JPWL - JPEG-2000 Part11 (JPWL) codestream manager */ +/*@{*/ + +/** @name Local static variables */ +/*@{*/ + +/** number of JPWL prepared markers */ +static int jwmarker_num; +/** properties of JPWL markers to insert */ +static jpwl_marker_t jwmarker[JPWL_MAX_NO_MARKERS]; + +/*@}*/ + +/*@}*/ + +/** @name Local static functions */ +/*@{*/ + +/** create an EPC marker segment +@param j2k J2K compressor handle +@param esd_on true if ESD is activated +@param red_on true if RED is activated +@param epb_on true if EPB is activated +@param info_on true if informative techniques are activated +@return returns the freshly created EPC +*/ +jpwl_epc_ms_t *jpwl_epc_create(opj_j2k_t *j2k, opj_bool esd_on, opj_bool red_on, opj_bool epb_on, opj_bool info_on); + +/*@}*/ + +/** create an EPC marker segment +@param j2k J2K compressor handle +@param comps considered component (-1=average, 0/1/2/...=component no.) +@param addrm addressing mode (0=packet, 1=byte range, 2=packet range, 3=reserved) +@param ad_size size of addresses (2/4 bytes) +@param senst sensitivity type +@param se_size sensitivity values size (1/2 bytes) +@param tileno tile where this ESD lies (-1 means MH) +@param svalnum number of sensitivity values (if 0, they will be automatically filled) +@param sensval pointer to an array of sensitivity values (if NULL, they will be automatically filled) +@return returns the freshly created ESD +*/ +jpwl_esd_ms_t *jpwl_esd_create(opj_j2k_t *j2k, int comps, + unsigned char addrm, unsigned char ad_size, + unsigned char senst, int se_size, int tileno, + unsigned long int svalnum, void *sensval); + +/** this function is used to compare two JPWL markers based on +their relevant wishlist position +@param arg1 pointer to first marker +@param arg2 pointer to second marker +@return 1 if arg1>arg2, 0 if arg1=arg2, -1 if arg1pos_correction = 0; + +} + +void j2k_add_marker(opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len) { + + if (!cstr_info) + return; + + /* expand the list? */ + if ((cstr_info->marknum + 1) > cstr_info->maxmarknum) { + cstr_info->maxmarknum += 100; + cstr_info->marker = (opj_marker_info_t*)opj_realloc(cstr_info->marker, cstr_info->maxmarknum * sizeof(opj_marker_info_t)); + } + + /* add the marker */ + cstr_info->marker[cstr_info->marknum].type = type; + cstr_info->marker[cstr_info->marknum].pos = pos; + cstr_info->marker[cstr_info->marknum].len = len; + cstr_info->marknum++; + +} + +void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image) { + + unsigned short int socsiz_len = 0; + int ciopos = cio_tell(cio), soc_pos = j2k->cstr_info->main_head_start; + unsigned char *socp = NULL; + + int tileno, acc_tpno, tpno, tilespec, hprot, sens, pprot, packspec, lastileno, packno; + + jpwl_epb_ms_t *epb_mark; + jpwl_epc_ms_t *epc_mark; + jpwl_esd_ms_t *esd_mark; + + /* find (SOC + SIZ) length */ + /* I assume SIZ is always the first marker after SOC */ + cio_seek(cio, soc_pos + 4); + socsiz_len = (unsigned short int) cio_read(cio, 2) + 4; /* add the 2 marks length itself */ + cio_seek(cio, soc_pos + 0); + socp = cio_getbp(cio); /* pointer to SOC */ + + /* + EPC MS for Main Header: if we are here it's required + */ + /* create the EPC */ + if ((epc_mark = jpwl_epc_create( + j2k, + j2k->cp->esd_on, /* is ESD present? */ + j2k->cp->red_on, /* is RED present? */ + j2k->cp->epb_on, /* is EPB present? */ + OPJ_FALSE /* are informative techniques present? */ + ))) { + + /* Add this marker to the 'insertanda' list */ + if (epc_mark) { + jwmarker[jwmarker_num].id = J2K_MS_EPC; /* its type */ + jwmarker[jwmarker_num].m.epcmark = epc_mark; /* the EPC */ + jwmarker[jwmarker_num].pos = soc_pos + socsiz_len; /* after SIZ */ + jwmarker[jwmarker_num].dpos = (double) jwmarker[jwmarker_num].pos + 0.1; /* not so first */ + jwmarker[jwmarker_num].len = epc_mark->Lepc; /* its length */ + jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* ready */ + jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */ + jwmarker[jwmarker_num].parms_ready = OPJ_FALSE; /* not ready */ + jwmarker[jwmarker_num].data_ready = OPJ_TRUE; /* ready */ + jwmarker_num++; + }; + + opj_event_msg(j2k->cinfo, EVT_INFO, + "MH EPC : setting %s%s%s\n", + j2k->cp->esd_on ? "ESD, " : "", + j2k->cp->red_on ? "RED, " : "", + j2k->cp->epb_on ? "EPB, " : "" + ); + + } else { + /* ooops, problems */ + opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create MH EPC\n"); + }; + + /* + ESD MS for Main Header + */ + /* first of all, must MH have an ESD MS? */ + if (j2k->cp->esd_on && (j2k->cp->sens_MH >= 0)) { + + /* Create the ESD */ + if ((esd_mark = jpwl_esd_create( + j2k, /* this encoder handle */ + -1, /* we are averaging over all components */ + (unsigned char) j2k->cp->sens_range, /* range method */ + (unsigned char) j2k->cp->sens_addr, /* sensitivity addressing */ + (unsigned char) j2k->cp->sens_MH, /* sensitivity method */ + j2k->cp->sens_size, /* sensitivity size */ + -1, /* this ESD is in main header */ + 0 /*j2k->cstr_info->num*/, /* number of packets in codestream */ + NULL /*sensval*/ /* pointer to sensitivity data of packets */ + ))) { + + /* Add this marker to the 'insertanda' list */ + if (jwmarker_num < JPWL_MAX_NO_MARKERS) { + jwmarker[jwmarker_num].id = J2K_MS_ESD; /* its type */ + jwmarker[jwmarker_num].m.esdmark = esd_mark; /* the EPB */ + jwmarker[jwmarker_num].pos = soc_pos + socsiz_len; /* we choose to place it after SIZ */ + jwmarker[jwmarker_num].dpos = (double) jwmarker[jwmarker_num].pos + 0.2; /* not first at all! */ + jwmarker[jwmarker_num].len = esd_mark->Lesd; /* its length */ + jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* not ready, yet */ + jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */ + jwmarker[jwmarker_num].parms_ready = OPJ_TRUE; /* not ready */ + jwmarker[jwmarker_num].data_ready = OPJ_FALSE; /* not ready */ + jwmarker_num++; + } + + opj_event_msg(j2k->cinfo, EVT_INFO, + "MH ESDs: method %d\n", + j2k->cp->sens_MH + ); + + } else { + /* ooops, problems */ + opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create MH ESD\n"); + }; + + } + + /* + ESD MSs for Tile Part Headers + */ + /* cycle through tiles */ + sens = -1; /* default spec: no ESD */ + tilespec = 0; /* first tile spec */ + acc_tpno = 0; + for (tileno = 0; tileno < j2k->cstr_info->tw * j2k->cstr_info->th; tileno++) { + + opj_event_msg(j2k->cinfo, EVT_INFO, + "Tile %d has %d tile part(s)\n", + tileno, j2k->cstr_info->tile[tileno].num_tps + ); + + /* for every tile part in the tile */ + for (tpno = 0; tpno < j2k->cstr_info->tile[tileno].num_tps; tpno++, acc_tpno++) { + + int sot_len, Psot, Psotp, mm; + unsigned long sot_pos, post_sod_pos; + + unsigned long int left_THmarks_len; + + /******* sot_pos = j2k->cstr_info->tile[tileno].start_pos; */ + sot_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos; + cio_seek(cio, sot_pos + 2); + sot_len = cio_read(cio, 2); /* SOT Len */ + cio_skip(cio, 2); + Psotp = cio_tell(cio); + Psot = cio_read(cio, 4); /* tile length */ + + /******* post_sod_pos = j2k->cstr_info->tile[tileno].end_header + 1; */ + post_sod_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_end_header + 1; + left_THmarks_len = post_sod_pos - sot_pos; + + /* add all the lengths of the markers which are len-ready and stay within SOT and SOD */ + for (mm = 0; mm < jwmarker_num; mm++) { + if ((jwmarker[mm].pos >= sot_pos) && (jwmarker[mm].pos < post_sod_pos)) { + if (jwmarker[mm].len_ready) + left_THmarks_len += jwmarker[mm].len + 2; + else { + opj_event_msg(j2k->cinfo, EVT_ERROR, "MS %x in %f is not len-ready: could not set up TH EPB\n", + jwmarker[mm].id, jwmarker[mm].dpos); + exit(1); + } + } + } + + /******* if ((tilespec < JPWL_MAX_NO_TILESPECS) && (j2k->cp->sens_TPH_tileno[tilespec] == tileno)) */ + if ((tilespec < JPWL_MAX_NO_TILESPECS) && (j2k->cp->sens_TPH_tileno[tilespec] == acc_tpno)) + /* we got a specification from this tile onwards */ + sens = j2k->cp->sens_TPH[tilespec++]; + + /* must this TPH have an ESD MS? */ + if (j2k->cp->esd_on && (sens >= 0)) { + + /* Create the ESD */ + if ((esd_mark = jpwl_esd_create( + j2k, /* this encoder handle */ + -1, /* we are averaging over all components */ + (unsigned char) j2k->cp->sens_range, /* range method */ + (unsigned char) j2k->cp->sens_addr, /* sensitivity addressing size */ + (unsigned char) sens, /* sensitivity method */ + j2k->cp->sens_size, /* sensitivity value size */ + tileno, /* this ESD is in a tile */ + 0, /* number of packets in codestream */ + NULL /* pointer to sensitivity data of packets */ + ))) { + + /* Add this marker to the 'insertanda' list */ + if (jwmarker_num < JPWL_MAX_NO_MARKERS) { + jwmarker[jwmarker_num].id = J2K_MS_ESD; /* its type */ + jwmarker[jwmarker_num].m.esdmark = esd_mark; /* the EPB */ + /****** jwmarker[jwmarker_num].pos = j2k->cstr_info->tile[tileno].start_pos + sot_len + 2; */ /* after SOT */ + jwmarker[jwmarker_num].pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos + sot_len + 2; /* after SOT */ + jwmarker[jwmarker_num].dpos = (double) jwmarker[jwmarker_num].pos + 0.2; /* not first at all! */ + jwmarker[jwmarker_num].len = esd_mark->Lesd; /* its length */ + jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* ready, yet */ + jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */ + jwmarker[jwmarker_num].parms_ready = OPJ_TRUE; /* not ready */ + jwmarker[jwmarker_num].data_ready = OPJ_FALSE; /* ready */ + jwmarker_num++; + } + + /* update Psot of the tile */ + cio_seek(cio, Psotp); + cio_write(cio, Psot + esd_mark->Lesd + 2, 4); + + opj_event_msg(j2k->cinfo, EVT_INFO, + /******* "TPH ESDs: tile %02d, method %d\n", */ + "TPH ESDs: tile %02d, part %02d, method %d\n", + /******* tileno, */ + tileno, tpno, + sens + ); + + } else { + /* ooops, problems */ + /***** opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create TPH ESD #%d\n", tileno); */ + opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create TPH ESD #%d,%d\n", tileno, tpno); + }; + + } + + } + + }; + + /* + EPB MS for Main Header + */ + /* first of all, must MH have an EPB MS? */ + if (j2k->cp->epb_on && (j2k->cp->hprot_MH > 0)) { + + int mm; + + /* position of SOT */ + unsigned int sot_pos = j2k->cstr_info->main_head_end + 1; + + /* how much space is there between end of SIZ and beginning of SOT? */ + int left_MHmarks_len = sot_pos - socsiz_len; + + /* add all the lengths of the markers which are len-ready and stay within SOC and SOT */ + for (mm = 0; mm < jwmarker_num; mm++) { + if ((jwmarker[mm].pos >=0) && (jwmarker[mm].pos < sot_pos)) { + if (jwmarker[mm].len_ready) + left_MHmarks_len += jwmarker[mm].len + 2; + else { + opj_event_msg(j2k->cinfo, EVT_ERROR, "MS %x in %f is not len-ready: could not set up MH EPB\n", + jwmarker[mm].id, jwmarker[mm].dpos); + exit(1); + } + } + } + + /* Create the EPB */ + if ((epb_mark = jpwl_epb_create( + j2k, /* this encoder handle */ + OPJ_TRUE, /* is it the latest? */ + OPJ_TRUE, /* is it packed? not for now */ + -1, /* we are in main header */ + 0, /* its index is 0 (first) */ + j2k->cp->hprot_MH, /* protection type parameters of data */ + socsiz_len, /* pre-data: only SOC+SIZ */ + left_MHmarks_len /* post-data: from SOC to SOT, and all JPWL markers within */ + ))) { + + /* Add this marker to the 'insertanda' list */ + if (jwmarker_num < JPWL_MAX_NO_MARKERS) { + jwmarker[jwmarker_num].id = J2K_MS_EPB; /* its type */ + jwmarker[jwmarker_num].m.epbmark = epb_mark; /* the EPB */ + jwmarker[jwmarker_num].pos = soc_pos + socsiz_len; /* after SIZ */ + jwmarker[jwmarker_num].dpos = (double) jwmarker[jwmarker_num].pos; /* first first first! */ + jwmarker[jwmarker_num].len = epb_mark->Lepb; /* its length */ + jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* ready */ + jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */ + jwmarker[jwmarker_num].parms_ready = OPJ_TRUE; /* ready */ + jwmarker[jwmarker_num].data_ready = OPJ_FALSE; /* not ready */ + jwmarker_num++; + } + + opj_event_msg(j2k->cinfo, EVT_INFO, + "MH EPB : prot. %d\n", + j2k->cp->hprot_MH + ); + + } else { + /* ooops, problems */ + opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create MH EPB\n"); + }; + } + + /* + EPB MSs for Tile Parts + */ + /* cycle through TPHs */ + hprot = j2k->cp->hprot_MH; /* default spec */ + tilespec = 0; /* first tile spec */ + lastileno = 0; + packspec = 0; + pprot = -1; + acc_tpno = 0; + for (tileno = 0; tileno < j2k->cstr_info->tw * j2k->cstr_info->th; tileno++) { + + opj_event_msg(j2k->cinfo, EVT_INFO, + "Tile %d has %d tile part(s)\n", + tileno, j2k->cstr_info->tile[tileno].num_tps + ); + + /* for every tile part in the tile */ + for (tpno = 0; tpno < j2k->cstr_info->tile[tileno].num_tps; tpno++, acc_tpno++) { + + int sot_len, Psot, Psotp, mm, epb_index = 0, prot_len = 0; + unsigned long sot_pos, post_sod_pos; + unsigned long int left_THmarks_len/*, epbs_len = 0*/; + int startpack = 0, stoppack = j2k->cstr_info->packno; + int first_tp_pack, last_tp_pack; + jpwl_epb_ms_t *tph_epb = NULL; + + /****** sot_pos = j2k->cstr_info->tile[tileno].start_pos; */ + sot_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos; + cio_seek(cio, sot_pos + 2); + sot_len = cio_read(cio, 2); /* SOT Len */ + cio_skip(cio, 2); + Psotp = cio_tell(cio); + Psot = cio_read(cio, 4); /* tile length */ + + /* a-priori length of the data dwelling between SOT and SOD */ + /****** post_sod_pos = j2k->cstr_info->tile[tileno].end_header + 1; */ + post_sod_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_end_header + 1; + left_THmarks_len = post_sod_pos - (sot_pos + sot_len + 2); + + /* add all the lengths of the JPWL markers which are len-ready and stay within SOT and SOD */ + for (mm = 0; mm < jwmarker_num; mm++) { + if ((jwmarker[mm].pos >= sot_pos) && (jwmarker[mm].pos < post_sod_pos)) { + if (jwmarker[mm].len_ready) + left_THmarks_len += jwmarker[mm].len + 2; + else { + opj_event_msg(j2k->cinfo, EVT_ERROR, "MS %x in %f is not len-ready: could not set up TH EPB\n", + jwmarker[mm].id, jwmarker[mm].dpos); + exit(1); + } + } + } + + /****** if ((tilespec < JPWL_MAX_NO_TILESPECS) && (j2k->cp->hprot_TPH_tileno[tilespec] == tileno)) */ + if ((tilespec < JPWL_MAX_NO_TILESPECS) && (j2k->cp->hprot_TPH_tileno[tilespec] == acc_tpno)) + /* we got a specification from this tile part onwards */ + hprot = j2k->cp->hprot_TPH[tilespec++]; + + /* must this TPH have an EPB MS? */ + if (j2k->cp->epb_on && (hprot > 0)) { + + /* Create the EPB */ + if ((epb_mark = jpwl_epb_create( + j2k, /* this encoder handle */ + OPJ_FALSE, /* is it the latest? in TPH, no for now (if huge data size in TPH, we'd need more) */ + OPJ_TRUE, /* is it packed? yes for now */ + tileno, /* we are in TPH */ + epb_index++, /* its index is 0 (first) */ + hprot, /* protection type parameters of following data */ + sot_len + 2, /* pre-data length: only SOT */ + left_THmarks_len /* post-data length: from SOT end to SOD inclusive */ + ))) { + + /* Add this marker to the 'insertanda' list */ + if (jwmarker_num < JPWL_MAX_NO_MARKERS) { + jwmarker[jwmarker_num].id = J2K_MS_EPB; /* its type */ + jwmarker[jwmarker_num].m.epbmark = epb_mark; /* the EPB */ + /****** jwmarker[jwmarker_num].pos = j2k->cstr_info->tile[tileno].start_pos + sot_len + 2; */ /* after SOT */ + jwmarker[jwmarker_num].pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos + sot_len + 2; /* after SOT */ + jwmarker[jwmarker_num].dpos = (double) jwmarker[jwmarker_num].pos; /* first first first! */ + jwmarker[jwmarker_num].len = epb_mark->Lepb; /* its length */ + jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* ready */ + jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */ + jwmarker[jwmarker_num].parms_ready = OPJ_TRUE; /* ready */ + jwmarker[jwmarker_num].data_ready = OPJ_FALSE; /* not ready */ + jwmarker_num++; + } + + /* update Psot of the tile */ + Psot += epb_mark->Lepb + 2; + + opj_event_msg(j2k->cinfo, EVT_INFO, + /***** "TPH EPB : tile %02d, prot. %d\n", */ + "TPH EPB : tile %02d, part %02d, prot. %d\n", + /***** tileno, */ + tileno, tpno, + hprot + ); + + /* save this TPH EPB address */ + tph_epb = epb_mark; + + } else { + /* ooops, problems */ + /****** opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create TPH EPB #%d\n", tileno); */ + opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create TPH EPB in #%d,d\n", tileno, tpno); + }; + + } + + startpack = 0; + /* EPB MSs for UEP packet data protection in Tile Parts */ + /****** for (packno = 0; packno < j2k->cstr_info->num; packno++) { */ + /*first_tp_pack = (tpno > 0) ? (first_tp_pack + j2k->cstr_info->tile[tileno].tp[tpno - 1].tp_numpacks) : 0;*/ + first_tp_pack = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pack; + last_tp_pack = first_tp_pack + j2k->cstr_info->tile[tileno].tp[tpno].tp_numpacks - 1; + for (packno = 0; packno < j2k->cstr_info->tile[tileno].tp[tpno].tp_numpacks; packno++) { + + /******** if ((packspec < JPWL_MAX_NO_PACKSPECS) && + (j2k->cp->pprot_tileno[packspec] == tileno) && (j2k->cp->pprot_packno[packspec] == packno)) { */ + if ((packspec < JPWL_MAX_NO_PACKSPECS) && + (j2k->cp->pprot_tileno[packspec] == acc_tpno) && (j2k->cp->pprot_packno[packspec] == packno)) { + + /* we got a specification from this tile and packet onwards */ + /* print the previous spec */ + if (packno > 0) { + stoppack = packno - 1; + opj_event_msg(j2k->cinfo, EVT_INFO, + /***** "UEP EPBs: tile %02d, packs. %02d-%02d (B %d-%d), prot. %d\n", */ + "UEP EPBs: tile %02d, part %02d, packs. %02d-%02d (B %d-%d), prot. %d\n", + /***** tileno, */ + tileno, tpno, + startpack, + stoppack, + /***** j2k->cstr_info->tile[tileno].packet[startpack].start_pos, */ + j2k->cstr_info->tile[tileno].packet[first_tp_pack + startpack].start_pos, + /***** j2k->cstr_info->tile[tileno].packet[stoppack].end_pos, */ + j2k->cstr_info->tile[tileno].packet[first_tp_pack + stoppack].end_pos, + pprot); + + /***** prot_len = j2k->cstr_info->tile[tileno].packet[stoppack].end_pos + 1 - + j2k->cstr_info->tile[tileno].packet[startpack].start_pos; */ + prot_len = j2k->cstr_info->tile[tileno].packet[first_tp_pack + stoppack].end_pos + 1 - + j2k->cstr_info->tile[tileno].packet[first_tp_pack + startpack].start_pos; + + /* + particular case: if this is the last header and the last packet, + then it is better to protect even the EOC marker + */ + /****** if ((tileno == ((j2k->cstr_info->tw * j2k->cstr_info->th) - 1)) && + (stoppack == (j2k->cstr_info->num - 1))) */ + if ((tileno == ((j2k->cstr_info->tw * j2k->cstr_info->th) - 1)) && + (tpno == (j2k->cstr_info->tile[tileno].num_tps - 1)) && + (stoppack == last_tp_pack)) + /* add the EOC len */ + prot_len += 2; + + /* let's add the EPBs */ + Psot += jpwl_epbs_add( + j2k, /* J2K handle */ + jwmarker, /* pointer to JPWL markers list */ + &jwmarker_num, /* pointer to the number of current markers */ + OPJ_FALSE, /* latest */ + OPJ_TRUE, /* packed */ + OPJ_FALSE, /* inside MH */ + &epb_index, /* pointer to EPB index */ + pprot, /* protection type */ + /****** (double) (j2k->cstr_info->tile[tileno].start_pos + sot_len + 2) + 0.0001, */ /* position */ + (double) (j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos + sot_len + 2) + 0.0001, /* position */ + tileno, /* number of tile */ + 0, /* length of pre-data */ + prot_len /*4000*/ /* length of post-data */ + ); + } + + startpack = packno; + pprot = j2k->cp->pprot[packspec++]; + } + + //printf("Tile %02d, pack %02d ==> %d\n", tileno, packno, pprot); + + } + + /* we are at the end: print the remaining spec */ + stoppack = packno - 1; + if (pprot >= 0) { + + opj_event_msg(j2k->cinfo, EVT_INFO, + /**** "UEP EPBs: tile %02d, packs. %02d-%02d (B %d-%d), prot. %d\n", */ + "UEP EPBs: tile %02d, part %02d, packs. %02d-%02d (B %d-%d), prot. %d\n", + /**** tileno, */ + tileno, tpno, + startpack, + stoppack, + /***** j2k->image_info->tile[tileno].packet[startpack].start_pos, + j2k->image_info->tile[tileno].packet[stoppack].end_pos, */ + j2k->cstr_info->tile[tileno].packet[first_tp_pack + startpack].start_pos, + j2k->cstr_info->tile[tileno].packet[first_tp_pack + stoppack].end_pos, + pprot); + + /***** prot_len = j2k->cstr_info->tile[tileno].packet[stoppack].end_pos + 1 - + j2k->cstr_info->tile[tileno].packet[startpack].start_pos; */ + prot_len = j2k->cstr_info->tile[tileno].packet[first_tp_pack + stoppack].end_pos + 1 - + j2k->cstr_info->tile[tileno].packet[first_tp_pack + startpack].start_pos; + + /* + particular case: if this is the last header and the last packet, + then it is better to protect even the EOC marker + */ + /***** if ((tileno == ((j2k->cstr_info->tw * j2k->cstr_info->th) - 1)) && + (stoppack == (j2k->cstr_info->num - 1))) */ + if ((tileno == ((j2k->cstr_info->tw * j2k->cstr_info->th) - 1)) && + (tpno == (j2k->cstr_info->tile[tileno].num_tps - 1)) && + (stoppack == last_tp_pack)) + /* add the EOC len */ + prot_len += 2; + + /* let's add the EPBs */ + Psot += jpwl_epbs_add( + j2k, /* J2K handle */ + jwmarker, /* pointer to JPWL markers list */ + &jwmarker_num, /* pointer to the number of current markers */ + OPJ_TRUE, /* latest */ + OPJ_TRUE, /* packed */ + OPJ_FALSE, /* inside MH */ + &epb_index, /* pointer to EPB index */ + pprot, /* protection type */ + /***** (double) (j2k->cstr_info->tile[tileno].start_pos + sot_len + 2) + 0.0001,*/ /* position */ + (double) (j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos + sot_len + 2) + 0.0001, /* position */ + tileno, /* number of tile */ + 0, /* length of pre-data */ + prot_len /*4000*/ /* length of post-data */ + ); + } + + /* we can now check if the TPH EPB was really the last one */ + if (tph_epb && (epb_index == 1)) { + /* set the TPH EPB to be the last one in current header */ + tph_epb->Depb |= (unsigned char) ((OPJ_TRUE & 0x0001) << 6); + tph_epb = NULL; + } + + /* write back Psot */ + cio_seek(cio, Psotp); + cio_write(cio, Psot, 4); + + } + + }; + + /* reset the position */ + cio_seek(cio, ciopos); + +} + +void jpwl_dump_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image) { + + int mm; + unsigned long int old_size = j2k->cstr_info->codestream_size; + unsigned long int new_size = old_size; + int /*ciopos = cio_tell(cio),*/ soc_pos = j2k->cstr_info->main_head_start; + unsigned char *jpwl_buf, *orig_buf; + unsigned long int orig_pos; + double epbcoding_time = 0.0, esdcoding_time = 0.0; + + /* Order JPWL markers according to their wishlist position */ + qsort((void *) jwmarker, (size_t) jwmarker_num, sizeof (jpwl_marker_t), jpwl_markcomp); + + /* compute markers total size */ + for (mm = 0; mm < jwmarker_num; mm++) { + /*printf("%x, %d, %.10f, %d long\n", jwmarker[mm].id, jwmarker[mm].pos, + jwmarker[mm].dpos, jwmarker[mm].len);*/ + new_size += jwmarker[mm].len + 2; + } + + /* allocate a new buffer of proper size */ + if (!(jpwl_buf = (unsigned char *) opj_malloc((size_t) (new_size + soc_pos) * sizeof(unsigned char)))) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not allocate room for JPWL codestream buffer\n"); + exit(1); + }; + + /* copy the jp2 part, if any */ + orig_buf = jpwl_buf; + memcpy(jpwl_buf, cio->buffer, soc_pos); + jpwl_buf += soc_pos; + + /* cycle through markers */ + orig_pos = soc_pos + 0; /* start from the beginning */ + cio_seek(cio, soc_pos + 0); /* rewind the original */ + for (mm = 0; mm < jwmarker_num; mm++) { + + /* + need to copy a piece of the original codestream + if there is such + */ + memcpy(jpwl_buf, cio_getbp(cio), jwmarker[mm].pos - orig_pos); + jpwl_buf += jwmarker[mm].pos - orig_pos; + orig_pos = jwmarker[mm].pos; + cio_seek(cio, orig_pos); + + /* + then write down the marker + */ + switch (jwmarker[mm].id) { + + case J2K_MS_EPB: + jpwl_epb_write(j2k, jwmarker[mm].m.epbmark, jpwl_buf); + break; + + case J2K_MS_EPC: + jpwl_epc_write(j2k, jwmarker[mm].m.epcmark, jpwl_buf); + break; + + case J2K_MS_ESD: + jpwl_esd_write(j2k, jwmarker[mm].m.esdmark, jpwl_buf); + break; + + case J2K_MS_RED: + memset(jpwl_buf, 0, jwmarker[mm].len + 2); /* placeholder */ + break; + + default: + break; + }; + + /* we update the markers struct */ + if (j2k->cstr_info) + j2k->cstr_info->marker[j2k->cstr_info->marknum - 1].pos = (jpwl_buf - orig_buf); + + /* we set the marker dpos to the new position in the JPWL codestream */ + jwmarker[mm].dpos = (double) (jpwl_buf - orig_buf); + + /* advance JPWL buffer position */ + jpwl_buf += jwmarker[mm].len + 2; + + } + + /* finish remaining original codestream */ + memcpy(jpwl_buf, cio_getbp(cio), old_size - (orig_pos - soc_pos)); + jpwl_buf += old_size - (orig_pos - soc_pos); + cio_seek(cio, soc_pos + old_size); + + /* + update info file based on added markers + */ + if (!jpwl_update_info(j2k, jwmarker, jwmarker_num)) + opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not update OPJ cstr_info structure\n"); + + /* now we need to repass some markers and fill their data fields */ + + /* first of all, DL and Pcrc in EPCs */ + for (mm = 0; mm < jwmarker_num; mm++) { + + /* find the EPCs */ + if (jwmarker[mm].id == J2K_MS_EPC) { + + int epc_pos = (int) jwmarker[mm].dpos, pp; + unsigned short int mycrc = 0x0000; + + /* fix and fill the DL field */ + jwmarker[mm].m.epcmark->DL = new_size; + orig_buf[epc_pos + 6] = (unsigned char) (jwmarker[mm].m.epcmark->DL >> 24); + orig_buf[epc_pos + 7] = (unsigned char) (jwmarker[mm].m.epcmark->DL >> 16); + orig_buf[epc_pos + 8] = (unsigned char) (jwmarker[mm].m.epcmark->DL >> 8); + orig_buf[epc_pos + 9] = (unsigned char) (jwmarker[mm].m.epcmark->DL >> 0); + + /* compute the CRC field (excluding itself) */ + for (pp = 0; pp < 4; pp++) + jpwl_updateCRC16(&mycrc, orig_buf[epc_pos + pp]); + for (pp = 6; pp < (jwmarker[mm].len + 2); pp++) + jpwl_updateCRC16(&mycrc, orig_buf[epc_pos + pp]); + + /* fix and fill the CRC */ + jwmarker[mm].m.epcmark->Pcrc = mycrc; + orig_buf[epc_pos + 4] = (unsigned char) (jwmarker[mm].m.epcmark->Pcrc >> 8); + orig_buf[epc_pos + 5] = (unsigned char) (jwmarker[mm].m.epcmark->Pcrc >> 0); + + } + } + + /* then, sensitivity data in ESDs */ + esdcoding_time = opj_clock(); + for (mm = 0; mm < jwmarker_num; mm++) { + + /* find the ESDs */ + if (jwmarker[mm].id == J2K_MS_ESD) { + + /* remember that they are now in a new position (dpos) */ + int esd_pos = (int) jwmarker[mm].dpos; + + jpwl_esd_fill(j2k, jwmarker[mm].m.esdmark, &orig_buf[esd_pos]); + + } + + } + esdcoding_time = opj_clock() - esdcoding_time; + if (j2k->cp->esd_on) + opj_event_msg(j2k->cinfo, EVT_INFO, "ESDs sensitivities computed in %f s\n", esdcoding_time); + + /* finally, RS or CRC parity in EPBs */ + epbcoding_time = opj_clock(); + for (mm = 0; mm < jwmarker_num; mm++) { + + /* find the EPBs */ + if (jwmarker[mm].id == J2K_MS_EPB) { + + /* remember that they are now in a new position (dpos) */ + int nn, accum_len; + + /* let's see how many EPBs are following this one, included itself */ + /* for this to work, we suppose that the markers are correctly ordered */ + /* and, overall, that they are in packed mode inside headers */ + accum_len = 0; + for (nn = mm; (nn < jwmarker_num) && (jwmarker[nn].id == J2K_MS_EPB) && + (jwmarker[nn].pos == jwmarker[mm].pos); nn++) + accum_len += jwmarker[nn].m.epbmark->Lepb + 2; + + /* fill the current (first) EPB with post-data starting from the computed position */ + jpwl_epb_fill(j2k, jwmarker[mm].m.epbmark, &orig_buf[(int) jwmarker[mm].dpos], + &orig_buf[(int) jwmarker[mm].dpos + accum_len]); + + /* fill the remaining EPBs in the header with post-data starting from the last position */ + for (nn = mm + 1; (nn < jwmarker_num) && (jwmarker[nn].id == J2K_MS_EPB) && + (jwmarker[nn].pos == jwmarker[mm].pos); nn++) + jpwl_epb_fill(j2k, jwmarker[nn].m.epbmark, &orig_buf[(int) jwmarker[nn].dpos], NULL); + + /* skip all the processed EPBs */ + mm = nn - 1; + } + + } + epbcoding_time = opj_clock() - epbcoding_time; + if (j2k->cp->epb_on) + opj_event_msg(j2k->cinfo, EVT_INFO, "EPBs redundancy computed in %f s\n", epbcoding_time); + + /* free original cio buffer and set it to the JPWL one */ + opj_free(cio->buffer); + cio->cinfo = cio->cinfo; /* no change */ + cio->openmode = cio->openmode; /* no change */ + cio->buffer = orig_buf; + cio->length = new_size + soc_pos; + cio->start = cio->buffer; + cio->end = cio->buffer + cio->length; + cio->bp = cio->buffer; + cio_seek(cio, soc_pos + new_size); + +} + + +void j2k_read_epc(opj_j2k_t *j2k) { + unsigned long int DL, Lepcp, Pcrcp, l; + unsigned short int Lepc, Pcrc = 0x0000; + unsigned char Pepc; + opj_cio_t *cio = j2k->cio; + const char *ans1; + + /* Simply read the EPC parameters */ + Lepcp = cio_tell(cio); + Lepc = cio_read(cio, 2); + Pcrcp = cio_tell(cio); + cio_skip(cio, 2); /* Pcrc */ + DL = cio_read(cio, 4); + Pepc = cio_read(cio, 1); + + /* compute Pcrc */ + cio_seek(cio, Lepcp - 2); + + /* Marker */ + jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); + jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); + + /* Length */ + jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); + jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); + + /* skip Pcrc */ + cio_skip(cio, 2); + + /* read all remaining */ + for (l = 4; l < Lepc; l++) + jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); + + /* check Pcrc with the result */ + cio_seek(cio, Pcrcp); + ans1 = (Pcrc == (unsigned short int) cio_read(cio, 2)) ? "crc-ok" : "crc-ko"; + + /* now we write them to screen */ + opj_event_msg(j2k->cinfo, EVT_INFO, + "EPC(%u,%d): %s, DL=%d%s %s %s\n", + Lepcp - 2, + Lepc, + ans1, + DL, /* data length this EPC is referring to */ + (Pepc & 0x10) ? ", esd" : "", /* ESD is present */ + (Pepc & 0x20) ? ", red" : "", /* RED is present */ + (Pepc & 0x40) ? ", epb" : ""); /* EPB is present */ + + cio_seek(cio, Lepcp + Lepc); +} + +void j2k_write_epc(opj_j2k_t *j2k) { + + unsigned long int DL, Lepcp, Pcrcp, l; + unsigned short int Lepc, Pcrc; + unsigned char Pepc; + + opj_cio_t *cio = j2k->cio; + + cio_write(cio, J2K_MS_EPC, 2); /* EPC */ + Lepcp = cio_tell(cio); + cio_skip(cio, 2); + + /* CRC-16 word of the EPC */ + Pcrc = 0x0000; /* initialize */ + Pcrcp = cio_tell(cio); + cio_write(cio, Pcrc, 2); /* Pcrc placeholder*/ + + /* data length of the EPC protection domain */ + DL = 0x00000000; /* we leave this set to 0, as if the information is not available */ + cio_write(cio, DL, 4); /* DL */ + + /* jpwl capabilities */ + Pepc = 0x00; + cio_write(cio, Pepc, 1); /* Pepc */ + + /* ID section */ + /* no ID's, as of now */ + + Lepc = (unsigned short) (cio_tell(cio) - Lepcp); + cio_seek(cio, Lepcp); + cio_write(cio, Lepc, 2); /* Lepc */ + + /* compute Pcrc */ + cio_seek(cio, Lepcp - 2); + + /* Marker */ + jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); + jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); + + /* Length */ + jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); + jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); + + /* skip Pcrc */ + cio_skip(cio, 2); + + /* read all remaining */ + for (l = 4; l < Lepc; l++) + jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); + + /* fill Pcrc with the result */ + cio_seek(cio, Pcrcp); + cio_write(cio, Pcrc, 2); + + cio_seek(cio, Lepcp + Lepc); + + /* marker struct update */ + j2k_add_marker(j2k->cstr_info, J2K_MS_EPC, Lepcp - 2, Lepc + 2); + +} + +void j2k_read_epb(opj_j2k_t *j2k) { + unsigned long int LDPepb, Pepb; + unsigned short int Lepb; + unsigned char Depb; + char str1[25] = ""; + opj_bool status; + static opj_bool first_in_tph = OPJ_TRUE; + int type, pre_len, post_len; + static unsigned char *redund = NULL; + + opj_cio_t *cio = j2k->cio; + + /* B/W = 45, RGB = 51 */ + /* SIZ SIZ_FIELDS SIZ_COMPS FOLLOWING_MARKER */ + int skipnum = 2 + 38 + 3 * j2k->cp->exp_comps + 2; + + if (j2k->cp->correct) { + + /* go back to EPB marker value */ + cio_seek(cio, cio_tell(cio) - 2); + + /* we need to understand where we are */ + if (j2k->state == J2K_STATE_MH) { + /* we are in MH */ + type = 0; /* MH */ + pre_len = skipnum; /* SOC+SIZ */ + post_len = -1; /* auto */ + + } else if ((j2k->state == J2K_STATE_TPH) && first_in_tph) { + /* we are in TPH */ + type = 1; /* TPH */ + pre_len = 12; /* SOC+SIZ */ + first_in_tph = OPJ_FALSE; + post_len = -1; /* auto */ + + } else { + /* we are elsewhere */ + type = 2; /* other */ + pre_len = 0; /* nada */ + post_len = -1; /* auto */ + + } + + /* call EPB corrector */ + /*printf("before %x, ", redund);*/ + status = jpwl_epb_correct(j2k, /* J2K decompressor handle */ + cio->bp, /* pointer to EPB in codestream buffer */ + type, /* EPB type: MH */ + pre_len, /* length of pre-data */ + post_len, /* length of post-data: -1 means auto */ + NULL, /* do everything auto */ + &redund + ); + /*printf("after %x\n", redund);*/ + + /* Read the (possibly corrected) EPB parameters */ + cio_skip(cio, 2); + Lepb = cio_read(cio, 2); + Depb = cio_read(cio, 1); + LDPepb = cio_read(cio, 4); + Pepb = cio_read(cio, 4); + + if (!status) { + + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL correction could not be performed\n"); + + /* advance to EPB endpoint */ + cio_skip(cio, Lepb + 2); + + return; + } + + /* last in current header? */ + if (Depb & 0x40) { + redund = NULL; /* reset the pointer to L4 buffer */ + first_in_tph = OPJ_TRUE; + } + + /* advance to EPB endpoint */ + cio_skip(cio, Lepb - 11); + + } else { + + /* Simply read the EPB parameters */ + Lepb = cio_read(cio, 2); + Depb = cio_read(cio, 1); + LDPepb = cio_read(cio, 4); + Pepb = cio_read(cio, 4); + + /* What does Pepb tells us about the protection method? */ + if (((Pepb & 0xF0000000) >> 28) == 0) + sprintf(str1, "pred"); /* predefined */ + else if (((Pepb & 0xF0000000) >> 28) == 1) + sprintf(str1, "crc-%lu", 16 * ((Pepb & 0x00000001) + 1)); /* CRC mode */ + else if (((Pepb & 0xF0000000) >> 28) == 2) + sprintf(str1, "rs(%lu,32)", (Pepb & 0x0000FF00) >> 8); /* RS mode */ + else if (Pepb == 0xFFFFFFFF) + sprintf(str1, "nometh"); /* RS mode */ + else + sprintf(str1, "unknown"); /* unknown */ + + /* Now we write them to screen */ + opj_event_msg(j2k->cinfo, EVT_INFO, + "EPB(%d): (%sl, %sp, %u), %lu, %s\n", + cio_tell(cio) - 13, + (Depb & 0x40) ? "" : "n", /* latest EPB or not? */ + (Depb & 0x80) ? "" : "n", /* packed or unpacked EPB? */ + (Depb & 0x3F), /* EPB index value */ + LDPepb, /*length of the data protected by the EPB */ + str1); /* protection method */ + + cio_skip(cio, Lepb - 11); + } +} + +void j2k_write_epb(opj_j2k_t *j2k) { + unsigned long int LDPepb, Pepb, Lepbp; + unsigned short int Lepb; + unsigned char Depb; + + opj_cio_t *cio = j2k->cio; + + cio_write(cio, J2K_MS_EPB, 2); /* EPB */ + Lepbp = cio_tell(cio); + cio_skip(cio, 2); + + /* EPB style */ + Depb = 0x00; /* test */ + cio_write(cio, Depb, 1); /* Depb */ + + /* length of the data to be protected by this EPB */ + LDPepb = 0x00000000; /* test */ + cio_write(cio, LDPepb, 4); /* LDPepb */ + + /* next error correction tool */ + Pepb = 0x00000000; /* test */ + cio_write(cio, Pepb, 4); /* Pepb */ + + /* EPB data */ + /* no data, as of now */ + + Lepb = (unsigned short) (cio_tell(cio) - Lepbp); + cio_seek(cio, Lepbp); + cio_write(cio, Lepb, 2); /* Lepb */ + + cio_seek(cio, Lepbp + Lepb); + + /* marker struct update */ + j2k_add_marker(j2k->cstr_info, J2K_MS_EPB, Lepbp - 2, Lepb + 2); +} + +void j2k_read_esd(opj_j2k_t *j2k) { + unsigned short int Lesd, Cesd; + unsigned char Pesd; + + int cesdsize = (j2k->image->numcomps >= 257) ? 2 : 1; + + char str1[4][4] = {"p", "br", "pr", "res"}; + char str2[8][8] = {"res", "mse", "mse-r", "psnr", "psnr-i", "maxerr", "tse", "res"}; + + opj_cio_t *cio = j2k->cio; + + /* Simply read the ESD parameters */ + Lesd = cio_read(cio, 2); + Cesd = cio_read(cio, cesdsize); + Pesd = cio_read(cio, 1); + + /* Now we write them to screen */ + opj_event_msg(j2k->cinfo, EVT_INFO, + "ESD(%d): c%d, %s, %s, %s, %s, %s\n", + cio_tell(cio) - (5 + cesdsize), + Cesd, /* component number for this ESD */ + str1[(Pesd & (unsigned char) 0xC0) >> 6], /* addressing mode */ + str2[(Pesd & (unsigned char) 0x38) >> 3], /* sensitivity type */ + ((Pesd & (unsigned char) 0x04) >> 2) ? "2Bs" : "1Bs", + ((Pesd & (unsigned char) 0x02) >> 1) ? "4Ba" : "2Ba", + (Pesd & (unsigned char) 0x01) ? "avgc" : ""); + + cio_skip(cio, Lesd - (3 + cesdsize)); +} + +void j2k_read_red(opj_j2k_t *j2k) { + unsigned short int Lred; + unsigned char Pred; + char str1[4][4] = {"p", "br", "pr", "res"}; + + opj_cio_t *cio = j2k->cio; + + /* Simply read the RED parameters */ + Lred = cio_read(cio, 2); + Pred = cio_read(cio, 1); + + /* Now we write them to screen */ + opj_event_msg(j2k->cinfo, EVT_INFO, + "RED(%d): %s, %dc, %s, %s\n", + cio_tell(cio) - 5, + str1[(Pred & (unsigned char) 0xC0) >> 6], /* addressing mode */ + (Pred & (unsigned char) 0x38) >> 3, /* corruption level */ + ((Pred & (unsigned char) 0x02) >> 1) ? "4Ba" : "2Ba", /* address range */ + (Pred & (unsigned char) 0x01) ? "errs" : "free"); /* error free? */ + + cio_skip(cio, Lred - 3); +} + +opj_bool jpwl_check_tile(opj_j2k_t *j2k, opj_tcd_t *tcd, int tileno) { + +#ifdef oerhgierhgvhreit4u + /* + we navigate through the tile and find possible invalid parameters: + this saves a lot of crashes!!!!! + */ + int compno, resno, precno, /*layno,*/ bandno, blockno; + int numprecincts, numblocks; + + /* this is the selected tile */ + opj_tcd_tile_t *tile = &(tcd->tcd_image->tiles[tileno]); + + /* will keep the component */ + opj_tcd_tilecomp_t *comp = NULL; + + /* will keep the resolution */ + opj_tcd_resolution_t *res; + + /* will keep the subband */ + opj_tcd_band_t *band; + + /* will keep the precinct */ + opj_tcd_precinct_t *prec; + + /* will keep the codeblock */ + opj_tcd_cblk_t *block; + + /* check all tile components */ + for (compno = 0; compno < tile->numcomps; compno++) { + comp = &(tile->comps[compno]); + + /* check all component resolutions */ + for (resno = 0; resno < comp->numresolutions; resno++) { + res = &(comp->resolutions[resno]); + numprecincts = res->pw * res->ph; + + /* check all the subbands */ + for (bandno = 0; bandno < res->numbands; bandno++) { + band = &(res->bands[bandno]); + + /* check all the precincts */ + for (precno = 0; precno < numprecincts; precno++) { + prec = &(band->precincts[precno]); + numblocks = prec->ch * prec->cw; + + /* check all the codeblocks */ + for (blockno = 0; blockno < numblocks; blockno++) { + block = &(prec->cblks[blockno]); + + /* x-origin is invalid */ + if ((block->x0 < prec->x0) || (block->x0 > prec->x1)) { + opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, + "JPWL: wrong x-cord of block origin %d => x-prec is (%d, %d)\n", + block->x0, prec->x0, prec->x1); + if (!JPWL_ASSUME || JPWL_ASSUME) + return OPJ_FALSE; + }; + } + } + } + } + } + +#endif + + return OPJ_TRUE; +} + +/*@}*/ + +#endif /* USE_JPWL */ + + +#ifdef USE_JPSEC + +/** @defgroup JPSEC JPSEC - JPEG-2000 Part 8 (JPSEC) codestream manager */ +/*@{*/ + + +/** @name Local static functions */ +/*@{*/ + +void j2k_read_sec(opj_j2k_t *j2k) { + unsigned short int Lsec; + + opj_cio_t *cio = j2k->cio; + + /* Simply read the SEC length */ + Lsec = cio_read(cio, 2); + + /* Now we write them to screen */ + opj_event_msg(j2k->cinfo, EVT_INFO, + "SEC(%d)\n", + cio_tell(cio) - 2 + ); + + cio_skip(cio, Lsec - 2); +} + +void j2k_write_sec(opj_j2k_t *j2k) { + unsigned short int Lsec = 24; + int i; + + opj_cio_t *cio = j2k->cio; + + cio_write(cio, J2K_MS_SEC, 2); /* SEC */ + cio_write(cio, Lsec, 2); + + /* write dummy data */ + for (i = 0; i < Lsec - 2; i++) + cio_write(cio, 0, 1); +} + +void j2k_read_insec(opj_j2k_t *j2k) { + unsigned short int Linsec; + + opj_cio_t *cio = j2k->cio; + + /* Simply read the INSEC length */ + Linsec = cio_read(cio, 2); + + /* Now we write them to screen */ + opj_event_msg(j2k->cinfo, EVT_INFO, + "INSEC(%d)\n", + cio_tell(cio) - 2 + ); + + cio_skip(cio, Linsec - 2); +} + + +/*@}*/ + +/*@}*/ + +#endif /* USE_JPSEC */ + diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/jpwl.h b/openjpeg-dotnet/libopenjpeg/jpwl/jpwl.h new file mode 100644 index 00000000..b77afdd6 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/jpwl.h @@ -0,0 +1,425 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium + * Copyright (c) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ +#ifndef __JPWL_H +#define __JPWL_H + +#ifdef USE_JPWL + +#include "crc.h" +#include "rs.h" + +/** +@file jpwl.h +@brief The JPEG-2000 Part11 (JPWL) marker segments manager + +The functions in JPWL.C have for goal to read/write the markers added by JPWL. +*/ + +/** @defgroup JPWL JPWL - JPEG-2000 Part11 (JPWL) codestream manager */ +/*@{*/ + +/** +Assume a basic codestream structure, so you can resort better from uncorrected errors +*/ +#define JPWL_ASSUME OPJ_TRUE + +/** +EPB (Error Protection Block) Marker segment +*/ +typedef struct jpwl_epb_ms { + /**@name Private fields set by epb_create */ + /*@{*/ + /** is the latest in header? */ + opj_bool latest; + /** is it in packed mode? */ + opj_bool packed; + /** TH where this marker has been placed (-1 means MH) */ + int tileno; + /** index in current header (0-63) */ + unsigned char index; + /** error protection method [-1=absent 0=none 1=predefined 16=CRC-16 32=CRC-32 37-128=RS] */ + int hprot; + /** message word length of pre-data */ + int k_pre; + /** code word length of pre-data */ + int n_pre; + /** length of pre-data */ + int pre_len; + /** message word length of post-data */ + int k_post; + /** code word length of post-data */ + int n_post; + /** length of post-data */ + int post_len; + /*@}*/ + /**@name Marker segment fields */ + /*@{*/ + /** two bytes for the length of EPB MS, exluding the marker itself (11 to 65535 bytes) */ + unsigned short int Lepb; + /** single byte for the style */ + unsigned char Depb; + /** four bytes, from 0 to 2^31-1 */ + unsigned long int LDPepb; + /** four bytes, next error management method */ + unsigned long int Pepb; + /** EPB data, variable size */ + unsigned char *data; + /*@}*/ +} jpwl_epb_ms_t; + +/** +EPC (Error Protection Capability) Marker segment +*/ +typedef struct jpwl_epc_ms { + /** is ESD active? */ + opj_bool esd_on; + /** is RED active? */ + opj_bool red_on; + /** is EPB active? */ + opj_bool epb_on; + /** are informative techniques active? */ + opj_bool info_on; + /**@name Marker segment fields */ + /*@{*/ + /** two bytes for the length of EPC MS, exluding the marker itself (9 to 65535 bytes) */ + unsigned short int Lepc; + /** two bytes, CRC for the EPC, excluding Pcrc itself */ + unsigned short int Pcrc; + /** four bytes, the codestream length from SOC to EOC */ + unsigned long int DL; + /** one byte, signals JPWL techniques adoption */ + unsigned char Pepc; + /** EPC data, variable length */ + unsigned char *data; + /*@}*/ +} jpwl_epc_ms_t; + +/** +ESD (Error Sensitivity Descriptor) Marker segment +*/ +typedef struct jpwl_esd_ms { + /** codestream addressing mode [0=packet, 1=byte range, 2=packet range, 3=reserved] */ + unsigned char addrm; + /** size of codestream addresses [2/4 bytes] */ + unsigned char ad_size; + /** type of sensitivity + [0=relative error, 1=MSE, 2=MSE reduction, 3=PSNR, 4=PSNR increment, + 5=MAXERR (absolute peak error), 6=TSE (total squared error), 7=reserved */ + unsigned char senst; + /** size of sensitivity data (1/2 bytes) */ + unsigned char se_size; + /**@name Marker segment fields */ + /*@{*/ + /** two bytes for the length of ESD MS, exluding the marker itself (4 to 65535 bytes) */ + unsigned short int Lesd; + /** two bytes, component of error sensitivity */ + unsigned short int Cesd; + /** one byte, signals JPWL techniques adoption */ + unsigned char Pesd; + /** ESD data, variable length */ + unsigned char *data; + /*@}*/ + /**@name Fields set by esd_create (only internal use) */ + /*@{*/ + /** number of components in the image */ + int numcomps; + /** tile where this marker has been placed (-1 means MH) */ + int tileno; + /** number of sensitivity values */ + unsigned long int svalnum; + /** size of a single sensitivity pair (address+value) */ + size_t sensval_size; + /*@}*/ +} jpwl_esd_ms_t; + +/** +RED (Residual Error Descriptor) Marker segment +*/ +typedef struct jpwl_red_ms { + /** two bytes for the length of RED MS, exluding the marker itself (3 to 65535 bytes) */ + unsigned short int Lred; + /** one byte, signals JPWL techniques adoption */ + unsigned char Pred; + /** RED data, variable length */ + unsigned char *data; +} jpwl_red_ms_t; + +/** +Structure used to store JPWL markers temporary position and readyness +*/ +typedef struct jpwl_marker { + /** marker value (J2K_MS_EPC, etc.) */ + int id; + /** union keeping the pointer to the real marker struct */ + union jpwl_marks { + /** pointer to EPB marker */ + jpwl_epb_ms_t *epbmark; + /** pointer to EPC marker */ + jpwl_epc_ms_t *epcmark; + /** pointer to ESD marker */ + jpwl_esd_ms_t *esdmark; + /** pointer to RED marker */ + jpwl_red_ms_t *redmark; + } m; + /** position where the marker should go, in the pre-JPWL codestream */ + unsigned long int pos; + /** same as before, only written as a double, so we can sort it better */ + double dpos; + /** length of the marker segment (marker excluded) */ + unsigned short int len; + /** the marker length is ready or not? */ + opj_bool len_ready; + /** the marker position is ready or not? */ + opj_bool pos_ready; + /** the marker parameters are ready or not? */ + opj_bool parms_ready; + /** are the written data ready or not */ + opj_bool data_ready; +} jpwl_marker_t; + +/** +Encode according to JPWL specs +@param j2k J2K handle +@param cio codestream handle +@param image image handle +*/ +void jpwl_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image); + +/** +Prepare the list of JPWL markers, after the Part 1 codestream +has been finalized (index struct is full) +@param j2k J2K handle +@param cio codestream handle +@param image image handle +*/ +void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image); + +/** +Dump the list of JPWL markers, after it has been prepared +@param j2k J2K handle +@param cio codestream handle +@param image image handle +*/ +void jpwl_dump_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image); + +/** +Read the EPC marker (Error Protection Capability) +@param j2k J2K handle +*/ +void j2k_read_epc(opj_j2k_t *j2k); + +/** +Write the EPC marker (Error Protection Capability), BUT the DL field is always set to 0 +(this simplifies the management of EPBs and it is openly stated in the standard +as a possible value, mening that the information is not available) and the informative techniques +are not yet implemented +@param j2k J2K handle +*/ +void j2k_write_epc(opj_j2k_t *j2k); + +/** +Read the EPB marker (Error Protection Block) +@param j2k J2K handle +*/ +void j2k_read_epb(opj_j2k_t *j2k); + +/** +Write the EPB marker (Error Protection Block) +@param j2k J2K handle +*/ +void j2k_write_epb(opj_j2k_t *j2k); + +/** +Read the ESD marker (Error Sensitivity Descriptor) +@param j2k J2K handle +*/ +void j2k_read_esd(opj_j2k_t *j2k); + +/** +Read the RED marker (Residual Error Descriptor) +@param j2k J2K handle +*/ +void j2k_read_red(opj_j2k_t *j2k); + +/** create an EPB marker segment +@param j2k J2K compressor handle +@param latest it is the latest EPB in the header +@param packed EPB is in packed style +@param tileno tile number where the marker has been placed (-1 means MH) +@param idx current EPB running index +@param hprot applied protection type (-1/0,1,16,32,37-128) +@param pre_len length of pre-protected data +@param post_len length of post-protected data +@return returns the freshly created EPB +*/ +jpwl_epb_ms_t *jpwl_epb_create(opj_j2k_t *j2k, opj_bool latest, opj_bool packed, int tileno, int idx, int hprot, + unsigned long int pre_len, unsigned long int post_len); + +/** add a number of EPB marker segments +@param j2k J2K compressor handle +@param jwmarker pointer to the JPWL markers list +@param jwmarker_num pointer to the number of JPWL markers (gets updated) +@param latest it is the latest group of EPBs in the header +@param packed EPBs are in packed style +@param insideMH it is in the MH +@param idx pointer to the starting EPB running index (gets updated) +@param hprot applied protection type (-1/0,1,16,32,37-128) +@param place_pos place in original codestream where EPBs should go +@param tileno tile number of these EPBs +@param pre_len length of pre-protected data +@param post_len length of post-protected data +@return returns the length of all added markers +*/ +int jpwl_epbs_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num, + opj_bool latest, opj_bool packed, opj_bool insideMH, int *idx, int hprot, + double place_pos, int tileno, + unsigned long int pre_len, unsigned long int post_len); + +/** add a number of ESD marker segments +@param j2k J2K compressor handle +@param jwmarker pointer to the JPWL markers list +@param jwmarker_num pointer to the number of JPWL markers (gets updated) +@param comps considered component (-1=average, 0/1/2/...=component no.) +@param addrm addressing mode (0=packet, 1=byte range, 2=packet range, 3=reserved) +@param ad_size size of addresses (2/4 bytes) +@param senst sensitivity type +@param se_size sensitivity values size (1/2 bytes) +@param place_pos place in original codestream where EPBs should go +@param tileno tile number of these EPBs +@return returns the length of all added markers +*/ +int jpwl_esds_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num, + int comps, unsigned char addrm, unsigned char ad_size, + unsigned char senst, unsigned char se_size, + double place_pos, int tileno); + +/** updates the information structure by modifying the positions and lengths +@param j2k J2K compressor handle +@param jwmarker pointer to JPWL markers list +@param jwmarker_num number of JPWL markers +@return returns true in case of success +*/ +opj_bool jpwl_update_info(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int jwmarker_num); + + +opj_bool jpwl_esd_fill(opj_j2k_t *j2k, jpwl_esd_ms_t *esdmark, unsigned char *buf); + +opj_bool jpwl_epb_fill(opj_j2k_t *j2k, jpwl_epb_ms_t *epbmark, unsigned char *buf, unsigned char *post_buf); + +void j2k_add_marker(opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len); + +/** corrects the data in the JPWL codestream +@param j2k J2K compressor handle +@return true if correction is performed correctly +*/ +opj_bool jpwl_correct(opj_j2k_t *j2k); + +/** corrects the data protected by an EPB +@param j2k J2K compressor handle +@param buffer pointer to the EPB position +@param type type of EPB: 0=MH, 1=TPH, 2=other, 3=auto +@param pre_len length of pre-data +@param post_len length of post_data +@param conn is a pointer to the length of all connected (packed) EPBs +@param L4_bufp is a pointer to the buffer pointer of redundancy data +@return returns true if correction could be succesfully performed +*/ +opj_bool jpwl_epb_correct(opj_j2k_t *j2k, unsigned char *buffer, int type, int pre_len, int post_len, int *conn, + unsigned char **L4_bufp); + +/** check that a tile and its children have valid data +@param j2k J2K decompressor handle +@param tcd Tile decompressor handle +@param tileno number of the tile to check +*/ +opj_bool jpwl_check_tile(opj_j2k_t *j2k, opj_tcd_t *tcd, int tileno); + +/** Macro functions for CRC computation */ + +/** +Computes the CRC-16, as stated in JPWL specs +@param CRC two bytes containing the CRC value (must be initialized with 0x0000) +@param DATA byte for which the CRC is computed; call this on every byte of the sequence +and get the CRC at the end +*/ +#define jpwl_updateCRC16(CRC, DATA) updateCRC16(CRC, DATA) + +/** +Computes the CRC-32, as stated in JPWL specs +@param CRC four bytes containing the CRC value (must be initialized with 0x00000000) +@param DATA byte for which the CRC is computed; call this on every byte of the sequence +and get the CRC at the end +*/ +#define jpwl_updateCRC32(CRC, DATA) updateCRC32(CRC, DATA) + +/** +Computes the minimum between two integers +@param a first integer to compare +@param b second integer to compare +@return returns the minimum integer between a and b +*/ +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif /* min */ + +/*@}*/ + +#endif /* USE_JPWL */ + +#ifdef USE_JPSEC + +/** @defgroup JPSEC JPSEC - JPEG-2000 Part 8 (JPSEC) codestream manager */ +/*@{*/ + +/** +Read the SEC marker (SEcured Codestream) +@param j2k J2K handle +*/ +void j2k_read_sec(opj_j2k_t *j2k); + +/** +Write the SEC marker (SEcured Codestream) +@param j2k J2K handle +*/ +void j2k_write_sec(opj_j2k_t *j2k); + +/** +Read the INSEC marker (SEcured Codestream) +@param j2k J2K handle +*/ +void j2k_read_insec(opj_j2k_t *j2k); + +/*@}*/ + +#endif /* USE_JPSEC */ + +#endif /* __JPWL_H */ + diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/jpwl_lib.c b/openjpeg-dotnet/libopenjpeg/jpwl/jpwl_lib.c new file mode 100644 index 00000000..90a71cec --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/jpwl_lib.c @@ -0,0 +1,1797 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium + * Copyright (c) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#ifdef USE_JPWL + +#include "opj_includes.h" +#include + +/** Minimum and maximum values for the double->pfp conversion */ +#define MIN_V1 0.0 +#define MAX_V1 17293822569102704640.0 +#define MIN_V2 0.000030517578125 +#define MAX_V2 131040.0 + +/** conversion between a double precision floating point +number and the corresponding pseudo-floating point used +to represent sensitivity values +@param V the double precision value +@param bytes the number of bytes of the representation +@return the pseudo-floating point value (cast accordingly) +*/ +unsigned short int jpwl_double_to_pfp(double V, int bytes); + +/** conversion between a pseudo-floating point used +to represent sensitivity values and the corresponding +double precision floating point number +@param em the pseudo-floating point value (cast accordingly) +@param bytes the number of bytes of the representation +@return the double precision value +*/ +double jpwl_pfp_to_double(unsigned short int em, int bytes); + + /*-------------------------------------------------------------*/ + +int jpwl_markcomp(const void *arg1, const void *arg2) +{ + /* Compare the two markers' positions */ + double diff = (((jpwl_marker_t *) arg1)->dpos - ((jpwl_marker_t *) arg2)->dpos); + + if (diff == 0.0) + return (0); + else if (diff < 0) + return (-1); + else + return (+1); +} + +int jpwl_epbs_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num, + opj_bool latest, opj_bool packed, opj_bool insideMH, int *idx, int hprot, + double place_pos, int tileno, + unsigned long int pre_len, unsigned long int post_len) { + + jpwl_epb_ms_t *epb_mark = NULL; + + int k_pre, k_post, n_pre, n_post; + + unsigned long int L1, L2, dL4, max_postlen, epbs_len = 0; + + /* We find RS(n,k) for EPB parms and pre-data, if any */ + if (insideMH && (*idx == 0)) { + /* First EPB in MH */ + k_pre = 64; + n_pre = 160; + } else if (!insideMH && (*idx == 0)) { + /* First EPB in TH */ + k_pre = 25; + n_pre = 80; + } else { + /* Following EPBs in MH or TH */ + k_pre = 13; + n_pre = 40; + }; + + /* Find lengths, Figs. B3 and B4 */ + /* size of pre data: pre_buf(pre_len) + EPB(2) + Lepb(2) + Depb(1) + LDPepb(4) + Pepb(4) */ + L1 = pre_len + 13; + + /* size of pre-data redundancy */ + /* (redundancy per codeword) * (number of codewords, rounded up) */ + L2 = (n_pre - k_pre) * (unsigned long int) ceil((double) L1 / (double) k_pre); + + /* Find protection type for post data and its associated redundancy field length*/ + if ((hprot == 16) || (hprot == 32)) { + /* there is a CRC for post-data */ + k_post = post_len; + n_post = post_len + (hprot >> 3); + /*L3 = hprot >> 3;*/ /* 2 (CRC-16) or 4 (CRC-32) bytes */ + + } else if ((hprot >= 37) && (hprot <= 128)) { + /* there is a RS for post-data */ + k_post = 32; + n_post = hprot; + + } else { + /* Use predefined codes */ + n_post = n_pre; + k_post = k_pre; + }; + + /* Create the EPB(s) */ + while (post_len > 0) { + + /* maximum postlen in order to respect EPB size + (we use JPWL_MAXIMUM_EPB_ROOM instead of 65535 for keeping room for EPB parms)*/ + /* (message word size) * (number of containable parity words) */ + max_postlen = k_post * (unsigned long int) floor((double) JPWL_MAXIMUM_EPB_ROOM / (double) (n_post - k_post)); + + /* maximum postlen in order to respect EPB size */ + if (*idx == 0) + /* (we use (JPWL_MAXIMUM_EPB_ROOM - L2) instead of 65535 for keeping room for EPB parms + pre-data) */ + /* (message word size) * (number of containable parity words) */ + max_postlen = k_post * (unsigned long int) floor((double) (JPWL_MAXIMUM_EPB_ROOM - L2) / (double) (n_post - k_post)); + + else + /* (we use JPWL_MAXIMUM_EPB_ROOM instead of 65535 for keeping room for EPB parms) */ + /* (message word size) * (number of containable parity words) */ + max_postlen = k_post * (unsigned long int) floor((double) JPWL_MAXIMUM_EPB_ROOM / (double) (n_post - k_post)); + + /* null protection case */ + /* the max post length can be as large as the LDPepb field can host */ + if (hprot == 0) + max_postlen = INT_MAX; + + /* length to use */ + dL4 = min(max_postlen, post_len); + + if ((epb_mark = jpwl_epb_create( + j2k, /* this encoder handle */ + latest ? (dL4 < max_postlen) : OPJ_FALSE, /* is it the latest? */ + packed, /* is it packed? */ + tileno, /* we are in TPH */ + *idx, /* its index */ + hprot, /* protection type parameters of following data */ + 0, /* pre-data: nothing for now */ + dL4 /* post-data: the stub computed previously */ + ))) { + + /* Add this marker to the 'insertanda' list */ + if (*jwmarker_num < JPWL_MAX_NO_MARKERS) { + jwmarker[*jwmarker_num].id = J2K_MS_EPB; /* its type */ + jwmarker[*jwmarker_num].m.epbmark = epb_mark; /* the EPB */ + jwmarker[*jwmarker_num].pos = (int) place_pos; /* after SOT */ + jwmarker[*jwmarker_num].dpos = place_pos + 0.0000001 * (double)(*idx); /* not very first! */ + jwmarker[*jwmarker_num].len = epb_mark->Lepb; /* its length */ + jwmarker[*jwmarker_num].len_ready = OPJ_TRUE; /* ready */ + jwmarker[*jwmarker_num].pos_ready = OPJ_TRUE; /* ready */ + jwmarker[*jwmarker_num].parms_ready = OPJ_TRUE; /* ready */ + jwmarker[*jwmarker_num].data_ready = OPJ_FALSE; /* not ready */ + (*jwmarker_num)++; + } + + /* increment epb index */ + (*idx)++; + + /* decrease postlen */ + post_len -= dL4; + + /* increase the total length of EPBs */ + epbs_len += epb_mark->Lepb + 2; + + } else { + /* ooops, problems */ + opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create TPH EPB for UEP in tile %d\n", tileno); + }; + } + + return epbs_len; +} + + +jpwl_epb_ms_t *jpwl_epb_create(opj_j2k_t *j2k, opj_bool latest, opj_bool packed, int tileno, int idx, int hprot, + unsigned long int pre_len, unsigned long int post_len) { + + jpwl_epb_ms_t *epb = NULL; + /*unsigned short int data_len = 0;*/ + unsigned short int L2, L3; + unsigned long int L1, L4; + /*unsigned char *predata_in = NULL;*/ + + opj_bool insideMH = (tileno == -1); + + /* Alloc space */ + if (!(epb = (jpwl_epb_ms_t *) opj_malloc((size_t) 1 * sizeof (jpwl_epb_ms_t)))) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not allocate room for one EPB MS\n"); + return NULL; + }; + + /* We set RS(n,k) for EPB parms and pre-data, if any */ + if (insideMH && (idx == 0)) { + /* First EPB in MH */ + epb->k_pre = 64; + epb->n_pre = 160; + } else if (!insideMH && (idx == 0)) { + /* First EPB in TH */ + epb->k_pre = 25; + epb->n_pre = 80; + } else { + /* Following EPBs in MH or TH */ + epb->k_pre = 13; + epb->n_pre = 40; + }; + + /* Find lengths, Figs. B3 and B4 */ + /* size of pre data: pre_buf(pre_len) + EPB(2) + Lepb(2) + Depb(1) + LDPepb(4) + Pepb(4) */ + L1 = pre_len + 13; + epb->pre_len = pre_len; + + /* size of pre-data redundancy */ + /* (redundancy per codeword) * (number of codewords, rounded up) */ + L2 = (epb->n_pre - epb->k_pre) * (unsigned short int) ceil((double) L1 / (double) epb->k_pre); + + /* length of post-data */ + L4 = post_len; + epb->post_len = post_len; + + /* Find protection type for post data and its associated redundancy field length*/ + if ((hprot == 16) || (hprot == 32)) { + /* there is a CRC for post-data */ + epb->Pepb = 0x10000000 | ((unsigned long int) hprot >> 5); /* 0=CRC-16, 1=CRC-32 */ + epb->k_post = post_len; + epb->n_post = post_len + (hprot >> 3); + /*L3 = hprot >> 3;*/ /* 2 (CRC-16) or 4 (CRC-32) bytes */ + + } else if ((hprot >= 37) && (hprot <= 128)) { + /* there is a RS for post-data */ + epb->Pepb = 0x20000020 | (((unsigned long int) hprot & 0x000000FF) << 8); + epb->k_post = 32; + epb->n_post = hprot; + + } else if (hprot == 1) { + /* Use predefined codes */ + epb->Pepb = (unsigned long int) 0x00000000; + epb->n_post = epb->n_pre; + epb->k_post = epb->k_pre; + + } else if (hprot == 0) { + /* Placeholder EPB: only protects its parameters, no protection method */ + epb->Pepb = (unsigned long int) 0xFFFFFFFF; + epb->n_post = 1; + epb->k_post = 1; + + } else { + opj_event_msg(j2k->cinfo, EVT_ERROR, "Invalid protection value for EPB h = %d\n", hprot); + return NULL; + } + + epb->hprot = hprot; + + /* (redundancy per codeword) * (number of codewords, rounded up) */ + L3 = (epb->n_post - epb->k_post) * (unsigned short int) ceil((double) L4 / (double) epb->k_post); + + /* private fields */ + epb->tileno = tileno; + + /* Fill some fields of the EPB */ + + /* total length of the EPB MS (less the EPB marker itself): */ + /* Lepb(2) + Depb(1) + LDPepb(4) + Pepb(4) + pre_redundancy + post-redundancy */ + epb->Lepb = 11 + L2 + L3; + + /* EPB style */ + epb->Depb = ((packed & 0x0001) << 7) | ((latest & 0x0001) << 6) | (idx & 0x003F); + + /* length of data protected by EPB: */ + epb->LDPepb = L1 + L4; + + return epb; +} + +void jpwl_epb_write(opj_j2k_t *j2k, jpwl_epb_ms_t *epb, unsigned char *buf) { + + /* Marker */ + *(buf++) = (unsigned char) (J2K_MS_EPB >> 8); + *(buf++) = (unsigned char) (J2K_MS_EPB >> 0); + + /* Lepb */ + *(buf++) = (unsigned char) (epb->Lepb >> 8); + *(buf++) = (unsigned char) (epb->Lepb >> 0); + + /* Depb */ + *(buf++) = (unsigned char) (epb->Depb >> 0); + + /* LDPepb */ + *(buf++) = (unsigned char) (epb->LDPepb >> 24); + *(buf++) = (unsigned char) (epb->LDPepb >> 16); + *(buf++) = (unsigned char) (epb->LDPepb >> 8); + *(buf++) = (unsigned char) (epb->LDPepb >> 0); + + /* Pepb */ + *(buf++) = (unsigned char) (epb->Pepb >> 24); + *(buf++) = (unsigned char) (epb->Pepb >> 16); + *(buf++) = (unsigned char) (epb->Pepb >> 8); + *(buf++) = (unsigned char) (epb->Pepb >> 0); + + /* Data */ + /*memcpy(buf, epb->data, (size_t) epb->Lepb - 11);*/ + memset(buf, 0, (size_t) epb->Lepb - 11); + + /* update markers struct */ + j2k_add_marker(j2k->cstr_info, J2K_MS_EPB, -1, epb->Lepb + 2); + +}; + + +jpwl_epc_ms_t *jpwl_epc_create(opj_j2k_t *j2k, opj_bool esd_on, opj_bool red_on, opj_bool epb_on, opj_bool info_on) { + + jpwl_epc_ms_t *epc = NULL; + + /* Alloc space */ + if (!(epc = (jpwl_epc_ms_t *) opj_malloc((size_t) 1 * sizeof (jpwl_epc_ms_t)))) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not allocate room for EPC MS\n"); + return NULL; + }; + + /* Set the EPC parameters */ + epc->esd_on = esd_on; + epc->epb_on = epb_on; + epc->red_on = red_on; + epc->info_on = info_on; + + /* Fill the EPC fields with default values */ + epc->Lepc = 9; + epc->Pcrc = 0x0000; + epc->DL = 0x00000000; + epc->Pepc = ((j2k->cp->esd_on & 0x0001) << 4) | ((j2k->cp->red_on & 0x0001) << 5) | + ((j2k->cp->epb_on & 0x0001) << 6) | ((j2k->cp->info_on & 0x0001) << 7); + + return (epc); +} + +opj_bool jpwl_epb_fill(opj_j2k_t *j2k, jpwl_epb_ms_t *epb, unsigned char *buf, unsigned char *post_buf) { + + unsigned long int L1, L2, L3, L4; + int remaining; + unsigned long int P, NN_P; + + /* Operating buffer */ + static unsigned char codeword[NN], *parityword; + + unsigned char *L1_buf, *L2_buf; + /* these ones are static, since we need to keep memory of + the exact place from one call to the other */ + static unsigned char *L3_buf, *L4_buf; + + /* some consistency check */ + if (!buf) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "There is no operating buffer for EPBs\n"); + return OPJ_FALSE; + } + + if (!post_buf && !L4_buf) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "There is no operating buffer for EPBs data\n"); + return OPJ_FALSE; + } + + /* + * Compute parity bytes on pre-data, ALWAYS present (at least only for EPB parms) + */ + + /* Initialize RS structures */ + P = epb->n_pre - epb->k_pre; + NN_P = NN - P; + memset(codeword, 0, NN); + parityword = codeword + NN_P; + init_rs(NN_P); + + /* pre-data begins pre_len bytes before of EPB buf */ + L1_buf = buf - epb->pre_len; + L1 = epb->pre_len + 13; + + /* redundancy for pre-data begins immediately after EPB parms */ + L2_buf = buf + 13; + L2 = (epb->n_pre - epb->k_pre) * (unsigned short int) ceil((double) L1 / (double) epb->k_pre); + + /* post-data + the position of L4 buffer can be: + 1) passed as a parameter: in that case use it + 2) null: in that case use the previous (static) one + */ + if (post_buf) + L4_buf = post_buf; + L4 = epb->post_len; + + /* post-data redundancy begins immediately after pre-data redundancy */ + L3_buf = L2_buf + L2; + L3 = (epb->n_post - epb->k_post) * (unsigned short int) ceil((double) L4 / (double) epb->k_post); + + /* let's check whether EPB length is sufficient to contain all these data */ + if (epb->Lepb < (11 + L2 + L3)) + opj_event_msg(j2k->cinfo, EVT_ERROR, "There is no room in EPB data field for writing redundancy data\n"); + /*printf("Env. %d, nec. %d (%d + %d)\n", epb->Lepb - 11, L2 + L3, L2, L3);*/ + + /* Compute redundancy of pre-data message words */ + remaining = L1; + while (remaining) { + + /* copy message data into codeword buffer */ + if (remaining < epb->k_pre) { + /* the last message word is zero-padded */ + memset(codeword, 0, NN); + memcpy(codeword, L1_buf, remaining); + L1_buf += remaining; + remaining = 0; + + } else { + memcpy(codeword, L1_buf, epb->k_pre); + L1_buf += epb->k_pre; + remaining -= epb->k_pre; + + } + + /* Encode the buffer and obtain parity bytes */ + if (encode_rs(codeword, parityword)) + opj_event_msg(j2k->cinfo, EVT_WARNING, + "Possible encoding error in codeword @ position #%d\n", (L1_buf - buf) / epb->k_pre); + + /* copy parity bytes only in redundancy buffer */ + memcpy(L2_buf, parityword, P); + + /* advance parity buffer */ + L2_buf += P; + } + + /* + * Compute parity bytes on post-data, may be absent if there are no data + */ + /*printf("Hprot is %d (tileno=%d, k_pre=%d, n_pre=%d, k_post=%d, n_post=%d, pre_len=%d, post_len=%d)\n", + epb->hprot, epb->tileno, epb->k_pre, epb->n_pre, epb->k_post, epb->n_post, epb->pre_len, + epb->post_len);*/ + if (epb->hprot < 0) { + + /* there should be no EPB */ + + } else if (epb->hprot == 0) { + + /* no protection for the data */ + /* advance anyway */ + L4_buf += epb->post_len; + + } else if (epb->hprot == 16) { + + /* CRC-16 */ + unsigned short int mycrc = 0x0000; + + /* compute the CRC field (excluding itself) */ + remaining = L4; + while (remaining--) + jpwl_updateCRC16(&mycrc, *(L4_buf++)); + + /* write the CRC field */ + *(L3_buf++) = (unsigned char) (mycrc >> 8); + *(L3_buf++) = (unsigned char) (mycrc >> 0); + + } else if (epb->hprot == 32) { + + /* CRC-32 */ + unsigned long int mycrc = 0x00000000; + + /* compute the CRC field (excluding itself) */ + remaining = L4; + while (remaining--) + jpwl_updateCRC32(&mycrc, *(L4_buf++)); + + /* write the CRC field */ + *(L3_buf++) = (unsigned char) (mycrc >> 24); + *(L3_buf++) = (unsigned char) (mycrc >> 16); + *(L3_buf++) = (unsigned char) (mycrc >> 8); + *(L3_buf++) = (unsigned char) (mycrc >> 0); + + } else { + + /* RS */ + + /* Initialize RS structures */ + P = epb->n_post - epb->k_post; + NN_P = NN - P; + memset(codeword, 0, NN); + parityword = codeword + NN_P; + init_rs(NN_P); + + /* Compute redundancy of post-data message words */ + remaining = L4; + while (remaining) { + + /* copy message data into codeword buffer */ + if (remaining < epb->k_post) { + /* the last message word is zero-padded */ + memset(codeword, 0, NN); + memcpy(codeword, L4_buf, remaining); + L4_buf += remaining; + remaining = 0; + + } else { + memcpy(codeword, L4_buf, epb->k_post); + L4_buf += epb->k_post; + remaining -= epb->k_post; + + } + + /* Encode the buffer and obtain parity bytes */ + if (encode_rs(codeword, parityword)) + opj_event_msg(j2k->cinfo, EVT_WARNING, + "Possible encoding error in codeword @ position #%d\n", (L4_buf - buf) / epb->k_post); + + /* copy parity bytes only in redundancy buffer */ + memcpy(L3_buf, parityword, P); + + /* advance parity buffer */ + L3_buf += P; + } + + } + + return OPJ_TRUE; +} + + +opj_bool jpwl_correct(opj_j2k_t *j2k) { + + opj_cio_t *cio = j2k->cio; + opj_bool status; + static opj_bool mh_done = OPJ_FALSE; + int mark_pos, id, len, skips, sot_pos; + unsigned long int Psot = 0; + + /* go back to marker position */ + mark_pos = cio_tell(cio) - 2; + cio_seek(cio, mark_pos); + + if ((j2k->state == J2K_STATE_MHSOC) && !mh_done) { + + int mark_val = 0, skipnum = 0; + + /* + COLOR IMAGE + first thing to do, if we are here, is to look whether + 51 (skipnum) positions ahead there is an EPB, in case of MH + */ + /* + B/W IMAGE + first thing to do, if we are here, is to look whether + 45 (skipnum) positions ahead there is an EPB, in case of MH + */ + /* SIZ SIZ_FIELDS SIZ_COMPS FOLLOWING_MARKER */ + skipnum = 2 + 38 + 3 * j2k->cp->exp_comps + 2; + if ((cio->bp + skipnum) < cio->end) { + + cio_skip(cio, skipnum); + + /* check that you are not going beyond the end of codestream */ + + /* call EPB corrector */ + status = jpwl_epb_correct(j2k, /* J2K decompressor handle */ + cio->bp, /* pointer to EPB in codestream buffer */ + 0, /* EPB type: MH */ + skipnum, /* length of pre-data */ + -1, /* length of post-data: -1 means auto */ + NULL, + NULL + ); + + /* read the marker value */ + mark_val = (*(cio->bp) << 8) | *(cio->bp + 1); + + if (status && (mark_val == J2K_MS_EPB)) { + /* we found it! */ + mh_done = OPJ_TRUE; + return OPJ_TRUE; + } + + /* Disable correction in case of missing or bad head EPB */ + /* We can't do better! */ + /* PATCHED: 2008-01-25 */ + /* MOVED UP: 2008-02-01 */ + if (!status) { + j2k->cp->correct = OPJ_FALSE; + opj_event_msg(j2k->cinfo, EVT_WARNING, "Couldn't find the MH EPB: disabling JPWL\n"); + } + + } + + } + + if (OPJ_TRUE /*(j2k->state == J2K_STATE_TPHSOT) || (j2k->state == J2K_STATE_TPH)*/) { + /* else, look if 12 positions ahead there is an EPB, in case of TPH */ + cio_seek(cio, mark_pos); + if ((cio->bp + 12) < cio->end) { + + cio_skip(cio, 12); + + /* call EPB corrector */ + status = jpwl_epb_correct(j2k, /* J2K decompressor handle */ + cio->bp, /* pointer to EPB in codestream buffer */ + 1, /* EPB type: TPH */ + 12, /* length of pre-data */ + -1, /* length of post-data: -1 means auto */ + NULL, + NULL + ); + if (status) + /* we found it! */ + return OPJ_TRUE; + } + } + + return OPJ_FALSE; + + /* for now, don't use this code */ + + /* else, look if here is an EPB, in case of other */ + if (mark_pos > 64) { + /* it cannot stay before the first MH EPB */ + cio_seek(cio, mark_pos); + cio_skip(cio, 0); + + /* call EPB corrector */ + status = jpwl_epb_correct(j2k, /* J2K decompressor handle */ + cio->bp, /* pointer to EPB in codestream buffer */ + 2, /* EPB type: TPH */ + 0, /* length of pre-data */ + -1, /* length of post-data: -1 means auto */ + NULL, + NULL + ); + if (status) + /* we found it! */ + return OPJ_TRUE; + } + + /* nope, no EPBs probably, or they are so damaged that we can give up */ + return OPJ_FALSE; + + return OPJ_TRUE; + + /* AN ATTEMPT OF PARSER */ + /* NOT USED ACTUALLY */ + + /* go to the beginning of the file */ + cio_seek(cio, 0); + + /* let's begin */ + j2k->state = J2K_STATE_MHSOC; + + /* cycle all over the markers */ + while (cio_tell(cio) < cio->length) { + + /* read the marker */ + mark_pos = cio_tell(cio); + id = cio_read(cio, 2); + + /* details */ + printf("Marker@%d: %X\n", cio_tell(cio) - 2, id); + + /* do an action in response to the read marker */ + switch (id) { + + /* short markers */ + + /* SOC */ + case J2K_MS_SOC: + j2k->state = J2K_STATE_MHSIZ; + len = 0; + skips = 0; + break; + + /* EOC */ + case J2K_MS_EOC: + j2k->state = J2K_STATE_MT; + len = 0; + skips = 0; + break; + + /* particular case of SOD */ + case J2K_MS_SOD: + len = Psot - (mark_pos - sot_pos) - 2; + skips = len; + break; + + /* long markers */ + + /* SOT */ + case J2K_MS_SOT: + j2k->state = J2K_STATE_TPH; + sot_pos = mark_pos; /* position of SOT */ + len = cio_read(cio, 2); /* read the length field */ + cio_skip(cio, 2); /* this field is unnecessary */ + Psot = cio_read(cio, 4); /* tile length */ + skips = len - 8; + break; + + /* remaining */ + case J2K_MS_SIZ: + j2k->state = J2K_STATE_MH; + /* read the length field */ + len = cio_read(cio, 2); + skips = len - 2; + break; + + /* remaining */ + default: + /* read the length field */ + len = cio_read(cio, 2); + skips = len - 2; + break; + + } + + /* skip to marker's end */ + cio_skip(cio, skips); + + } + + +} + +opj_bool jpwl_epb_correct(opj_j2k_t *j2k, unsigned char *buffer, int type, int pre_len, int post_len, int *conn, + unsigned char **L4_bufp) { + + /* Operating buffer */ + unsigned char codeword[NN], *parityword; + + unsigned long int P, NN_P; + unsigned long int L1, L4; + int remaining, n_pre, k_pre, n_post, k_post; + + int status, tt; + + int orig_pos = cio_tell(j2k->cio); + + unsigned char *L1_buf, *L2_buf; + unsigned char *L3_buf, *L4_buf; + + unsigned long int LDPepb, Pepb; + unsigned short int Lepb; + unsigned char Depb; + char str1[25] = ""; + int myconn, errnum = 0; + opj_bool errflag = OPJ_FALSE; + + opj_cio_t *cio = j2k->cio; + + /* check for common errors */ + if (!buffer) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "The EPB pointer is a NULL buffer\n"); + return OPJ_FALSE; + } + + /* set bignesses */ + L1 = pre_len + 13; + + /* pre-data correction */ + switch (type) { + + case 0: + /* MH EPB */ + k_pre = 64; + n_pre = 160; + break; + + case 1: + /* TPH EPB */ + k_pre = 25; + n_pre = 80; + break; + + case 2: + /* other EPBs */ + k_pre = 13; + n_pre = 40; + break; + + case 3: + /* automatic setup */ + opj_event_msg(j2k->cinfo, EVT_ERROR, "Auto. setup not yet implemented\n"); + return OPJ_FALSE; + break; + + default: + /* unknown type */ + opj_event_msg(j2k->cinfo, EVT_ERROR, "Unknown expected EPB type\n"); + return OPJ_FALSE; + break; + + } + + /* Initialize RS structures */ + P = n_pre - k_pre; + NN_P = NN - P; + tt = (int) floor((float) P / 2.0F); /* correction capability of the code */ + memset(codeword, 0, NN); + parityword = codeword + NN_P; + init_rs(NN_P); + + /* Correct pre-data message words */ + L1_buf = buffer - pre_len; + L2_buf = buffer + 13; + remaining = L1; + while (remaining) { + + /* always zero-pad codewords */ + /* (this is required, since after decoding the zeros in the long codeword + could change, and keep unchanged in subsequent calls) */ + memset(codeword, 0, NN); + + /* copy codeword buffer into message bytes */ + if (remaining < k_pre) + memcpy(codeword, L1_buf, remaining); + else + memcpy(codeword, L1_buf, k_pre); + + /* copy redundancy buffer in parity bytes */ + memcpy(parityword, L2_buf, P); + + /* Decode the buffer and possibly obtain corrected bytes */ + status = eras_dec_rs(codeword, NULL, 0); + if (status == -1) { + /*if (conn == NULL) + opj_event_msg(j2k->cinfo, EVT_WARNING, + "Possible decoding error in codeword @ position #%d\n", (L1_buf - buffer) / k_pre);*/ + errflag = OPJ_TRUE; + /* we can try to safely get out from the function: + if we are here, either this is not an EPB or the first codeword + is too damaged to be helpful */ + /*return OPJ_FALSE;*/ + + } else if (status == 0) { + /*if (conn == NULL) + opj_event_msg(j2k->cinfo, EVT_INFO, "codeword is correctly decoded\n");*/ + + } else if (status <= tt) { + /* it has corrected 0 <= errs <= tt */ + /*if (conn == NULL) + opj_event_msg(j2k->cinfo, EVT_WARNING, "%d errors corrected in codeword\n", status);*/ + errnum += status; + + } else { + /*if (conn == NULL) + opj_event_msg(j2k->cinfo, EVT_WARNING, "EPB correction capability exceeded\n"); + return OPJ_FALSE;*/ + errflag = OPJ_TRUE; + } + + + /* advance parity buffer */ + if ((status >= 0) && (status <= tt)) + /* copy back corrected parity only if all is OK */ + memcpy(L2_buf, parityword, P); + L2_buf += P; + + /* advance message buffer */ + if (remaining < k_pre) { + if ((status >= 0) && (status <= tt)) + /* copy back corrected data only if all is OK */ + memcpy(L1_buf, codeword, remaining); + L1_buf += remaining; + remaining = 0; + + } else { + if ((status >= 0) && (status <= tt)) + /* copy back corrected data only if all is OK */ + memcpy(L1_buf, codeword, k_pre); + L1_buf += k_pre; + remaining -= k_pre; + + } + } + + /* print summary */ + if (!conn) { + + /*if (errnum) + opj_event_msg(j2k->cinfo, EVT_INFO, "+ %d symbol errors corrected (Ps=%.1e)\n", errnum, + (float) errnum / ((float) n_pre * (float) L1 / (float) k_pre));*/ + if (errflag) { + /*opj_event_msg(j2k->cinfo, EVT_INFO, "+ there were unrecoverable errors\n");*/ + return OPJ_FALSE; + } + + } + + /* presumably, now, EPB parameters are correct */ + /* let's get them */ + + /* Simply read the EPB parameters */ + if (conn) + cio->bp = buffer; + cio_skip(cio, 2); /* the marker */ + Lepb = cio_read(cio, 2); + Depb = cio_read(cio, 1); + LDPepb = cio_read(cio, 4); + Pepb = cio_read(cio, 4); + + /* What does Pepb tells us about the protection method? */ + if (((Pepb & 0xF0000000) >> 28) == 0) + sprintf(str1, "pred"); /* predefined */ + else if (((Pepb & 0xF0000000) >> 28) == 1) + sprintf(str1, "crc-%lu", 16 * ((Pepb & 0x00000001) + 1)); /* CRC mode */ + else if (((Pepb & 0xF0000000) >> 28) == 2) + sprintf(str1, "rs(%lu,32)", (Pepb & 0x0000FF00) >> 8); /* RS mode */ + else if (Pepb == 0xFFFFFFFF) + sprintf(str1, "nometh"); /* RS mode */ + else + sprintf(str1, "unknown"); /* unknown */ + + /* Now we write them to screen */ + if (!conn && post_len) + opj_event_msg(j2k->cinfo, EVT_INFO, + "EPB(%d): (%sl, %sp, %u), %lu, %s\n", + cio_tell(cio) - 13, + (Depb & 0x40) ? "" : "n", /* latest EPB or not? */ + (Depb & 0x80) ? "" : "n", /* packed or unpacked EPB? */ + (Depb & 0x3F), /* EPB index value */ + LDPepb, /*length of the data protected by the EPB */ + str1); /* protection method */ + + + /* well, we need to investigate how long is the connected length of packed EPBs */ + myconn = Lepb + 2; + if ((Depb & 0x40) == 0) /* not latest in header */ + jpwl_epb_correct(j2k, /* J2K decompressor handle */ + buffer + Lepb + 2, /* pointer to next EPB in codestream buffer */ + 2, /* EPB type: should be of other type */ + 0, /* only EPB fields */ + 0, /* do not look after */ + &myconn, + NULL + ); + if (conn) + *conn += myconn; + + /*if (!conn) + printf("connected = %d\n", myconn);*/ + + /*cio_seek(j2k->cio, orig_pos); + return OPJ_TRUE;*/ + + /* post-data + the position of L4 buffer is at the end of currently connected EPBs + */ + if (!(L4_bufp)) + L4_buf = buffer + myconn; + else if (!(*L4_bufp)) + L4_buf = buffer + myconn; + else + L4_buf = *L4_bufp; + if (post_len == -1) + L4 = LDPepb - pre_len - 13; + else if (post_len == 0) + L4 = 0; + else + L4 = post_len; + + L3_buf = L2_buf; + + /* Do a further check here on the read parameters */ + if (L4 > (unsigned long) cio_numbytesleft(j2k->cio)) + /* overflow */ + return OPJ_FALSE; + + /* we are ready for decoding the remaining data */ + if (((Pepb & 0xF0000000) >> 28) == 1) { + /* CRC here */ + if ((16 * ((Pepb & 0x00000001) + 1)) == 16) { + + /* CRC-16 */ + unsigned short int mycrc = 0x0000, filecrc = 0x0000; + + /* compute the CRC field */ + remaining = L4; + while (remaining--) + jpwl_updateCRC16(&mycrc, *(L4_buf++)); + + /* read the CRC field */ + filecrc = *(L3_buf++) << 8; + filecrc |= *(L3_buf++); + + /* check the CRC field */ + if (mycrc == filecrc) { + if (conn == NULL) + opj_event_msg(j2k->cinfo, EVT_INFO, "- CRC is OK\n"); + } else { + if (conn == NULL) + opj_event_msg(j2k->cinfo, EVT_WARNING, "- CRC is KO (r=%d, c=%d)\n", filecrc, mycrc); + errflag = OPJ_TRUE; + } + } + + if ((16 * ((Pepb & 0x00000001) + 1)) == 32) { + + /* CRC-32 */ + unsigned long int mycrc = 0x00000000, filecrc = 0x00000000; + + /* compute the CRC field */ + remaining = L4; + while (remaining--) + jpwl_updateCRC32(&mycrc, *(L4_buf++)); + + /* read the CRC field */ + filecrc = *(L3_buf++) << 24; + filecrc |= *(L3_buf++) << 16; + filecrc |= *(L3_buf++) << 8; + filecrc |= *(L3_buf++); + + /* check the CRC field */ + if (mycrc == filecrc) { + if (conn == NULL) + opj_event_msg(j2k->cinfo, EVT_INFO, "- CRC is OK\n"); + } else { + if (conn == NULL) + opj_event_msg(j2k->cinfo, EVT_WARNING, "- CRC is KO (r=%d, c=%d)\n", filecrc, mycrc); + errflag = OPJ_TRUE; + } + } + + } else if (Pepb == 0xFFFFFFFF) { + /* no method */ + + /* advance without doing anything */ + remaining = L4; + while (remaining--) + L4_buf++; + + } else if ((((Pepb & 0xF0000000) >> 28) == 2) || (((Pepb & 0xF0000000) >> 28) == 0)) { + /* RS coding here */ + + if (((Pepb & 0xF0000000) >> 28) == 0) { + + k_post = k_pre; + n_post = n_pre; + + } else { + + k_post = 32; + n_post = (Pepb & 0x0000FF00) >> 8; + } + + /* Initialize RS structures */ + P = n_post - k_post; + NN_P = NN - P; + tt = (int) floor((float) P / 2.0F); /* again, correction capability */ + memset(codeword, 0, NN); + parityword = codeword + NN_P; + init_rs(NN_P); + + /* Correct post-data message words */ + /*L4_buf = buffer + Lepb + 2;*/ + L3_buf = L2_buf; + remaining = L4; + while (remaining) { + + /* always zero-pad codewords */ + /* (this is required, since after decoding the zeros in the long codeword + could change, and keep unchanged in subsequent calls) */ + memset(codeword, 0, NN); + + /* copy codeword buffer into message bytes */ + if (remaining < k_post) + memcpy(codeword, L4_buf, remaining); + else + memcpy(codeword, L4_buf, k_post); + + /* copy redundancy buffer in parity bytes */ + memcpy(parityword, L3_buf, P); + + /* Decode the buffer and possibly obtain corrected bytes */ + status = eras_dec_rs(codeword, NULL, 0); + if (status == -1) { + /*if (conn == NULL) + opj_event_msg(j2k->cinfo, EVT_WARNING, + "Possible decoding error in codeword @ position #%d\n", (L4_buf - (buffer + Lepb + 2)) / k_post);*/ + errflag = OPJ_TRUE; + + } else if (status == 0) { + /*if (conn == NULL) + opj_event_msg(j2k->cinfo, EVT_INFO, "codeword is correctly decoded\n");*/ + + } else if (status <= tt) { + /*if (conn == NULL) + opj_event_msg(j2k->cinfo, EVT_WARNING, "%d errors corrected in codeword\n", status);*/ + errnum += status; + + } else { + /*if (conn == NULL) + opj_event_msg(j2k->cinfo, EVT_WARNING, "EPB correction capability exceeded\n"); + return OPJ_FALSE;*/ + errflag = OPJ_TRUE; + } + + + /* advance parity buffer */ + if ((status >= 0) && (status <= tt)) + /* copy back corrected data only if all is OK */ + memcpy(L3_buf, parityword, P); + L3_buf += P; + + /* advance message buffer */ + if (remaining < k_post) { + if ((status >= 0) && (status <= tt)) + /* copy back corrected data only if all is OK */ + memcpy(L4_buf, codeword, remaining); + L4_buf += remaining; + remaining = 0; + + } else { + if ((status >= 0) && (status <= tt)) + /* copy back corrected data only if all is OK */ + memcpy(L4_buf, codeword, k_post); + L4_buf += k_post; + remaining -= k_post; + + } + } + } + + /* give back the L4_buf address */ + if (L4_bufp) + *L4_bufp = L4_buf; + + /* print summary */ + if (!conn) { + + if (errnum) + opj_event_msg(j2k->cinfo, EVT_INFO, "- %d symbol errors corrected (Ps=%.1e)\n", errnum, + (float) errnum / (float) LDPepb); + if (errflag) + opj_event_msg(j2k->cinfo, EVT_INFO, "- there were unrecoverable errors\n"); + + } + + cio_seek(j2k->cio, orig_pos); + + return OPJ_TRUE; +} + +void jpwl_epc_write(opj_j2k_t *j2k, jpwl_epc_ms_t *epc, unsigned char *buf) { + + /* Marker */ + *(buf++) = (unsigned char) (J2K_MS_EPC >> 8); + *(buf++) = (unsigned char) (J2K_MS_EPC >> 0); + + /* Lepc */ + *(buf++) = (unsigned char) (epc->Lepc >> 8); + *(buf++) = (unsigned char) (epc->Lepc >> 0); + + /* Pcrc */ + *(buf++) = (unsigned char) (epc->Pcrc >> 8); + *(buf++) = (unsigned char) (epc->Pcrc >> 0); + + /* DL */ + *(buf++) = (unsigned char) (epc->DL >> 24); + *(buf++) = (unsigned char) (epc->DL >> 16); + *(buf++) = (unsigned char) (epc->DL >> 8); + *(buf++) = (unsigned char) (epc->DL >> 0); + + /* Pepc */ + *(buf++) = (unsigned char) (epc->Pepc >> 0); + + /* Data */ + /*memcpy(buf, epc->data, (size_t) epc->Lepc - 9);*/ + memset(buf, 0, (size_t) epc->Lepc - 9); + + /* update markers struct */ + j2k_add_marker(j2k->cstr_info, J2K_MS_EPC, -1, epc->Lepc + 2); + +}; + +int jpwl_esds_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num, + int comps, unsigned char addrm, unsigned char ad_size, + unsigned char senst, unsigned char se_size, + double place_pos, int tileno) { + + return 0; +} + +jpwl_esd_ms_t *jpwl_esd_create(opj_j2k_t *j2k, int comp, + unsigned char addrm, unsigned char ad_size, + unsigned char senst, int se_size, int tileno, + unsigned long int svalnum, void *sensval) { + + jpwl_esd_ms_t *esd = NULL; + + /* Alloc space */ + if (!(esd = (jpwl_esd_ms_t *) opj_malloc((size_t) 1 * sizeof (jpwl_esd_ms_t)))) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not allocate room for ESD MS\n"); + return NULL; + }; + + /* if relative sensitivity, activate byte range mode */ + if (senst == 0) + addrm = 1; + + /* size of sensval's ... */ + if ((ad_size != 0) && (ad_size != 2) && (ad_size != 4)) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "Address size %d for ESD MS is forbidden\n", ad_size); + return NULL; + } + if ((se_size != 1) && (se_size != 2)) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "Sensitivity size %d for ESD MS is forbidden\n", se_size); + return NULL; + } + + /* ... depends on the addressing mode */ + switch (addrm) { + + /* packet mode */ + case (0): + ad_size = 0; /* as per the standard */ + esd->sensval_size = (unsigned int)se_size; + break; + + /* byte range */ + case (1): + /* auto sense address size */ + if (ad_size == 0) + /* if there are more than 66% of (2^16 - 1) bytes, switch to 4 bytes + (we keep space for possible EPBs being inserted) */ + ad_size = (j2k->cstr_info->codestream_size > (1 * 65535 / 3)) ? 4 : 2; + esd->sensval_size = ad_size + ad_size + se_size; + break; + + /* packet range */ + case (2): + /* auto sense address size */ + if (ad_size == 0) + /* if there are more than 2^16 - 1 packets, switch to 4 bytes */ + ad_size = (j2k->cstr_info->packno > 65535) ? 4 : 2; + esd->sensval_size = ad_size + ad_size + se_size; + break; + + case (3): + opj_event_msg(j2k->cinfo, EVT_ERROR, "Address mode %d for ESD MS is unimplemented\n", addrm); + return NULL; + + default: + opj_event_msg(j2k->cinfo, EVT_ERROR, "Address mode %d for ESD MS is forbidden\n", addrm); + return NULL; + } + + /* set or unset sensitivity values */ + if (svalnum <= 0) { + + switch (senst) { + + /* just based on the portions of a codestream */ + case (0): + /* MH + no. of THs + no. of packets */ + svalnum = 1 + (j2k->cstr_info->tw * j2k->cstr_info->th) * (1 + j2k->cstr_info->packno); + break; + + /* all the ones that are based on the packets */ + default: + if (tileno < 0) + /* MH: all the packets and all the tiles info is written */ + svalnum = j2k->cstr_info->tw * j2k->cstr_info->th * j2k->cstr_info->packno; + else + /* TPH: only that tile info is written */ + svalnum = j2k->cstr_info->packno; + break; + + } + } + + /* fill private fields */ + esd->senst = senst; + esd->ad_size = ad_size; + esd->se_size = se_size; + esd->addrm = addrm; + esd->svalnum = svalnum; + esd->numcomps = j2k->image->numcomps; + esd->tileno = tileno; + + /* Set the ESD parameters */ + /* length, excluding data field */ + if (esd->numcomps < 257) + esd->Lesd = 4 + (unsigned short int) (esd->svalnum * esd->sensval_size); + else + esd->Lesd = 5 + (unsigned short int) (esd->svalnum * esd->sensval_size); + + /* component data field */ + if (comp >= 0) + esd->Cesd = comp; + else + /* we are averaging */ + esd->Cesd = 0; + + /* Pesd field */ + esd->Pesd = 0x00; + esd->Pesd |= (esd->addrm & 0x03) << 6; /* addressing mode */ + esd->Pesd |= (esd->senst & 0x07) << 3; /* sensitivity type */ + esd->Pesd |= ((esd->se_size >> 1) & 0x01) << 2; /* sensitivity size */ + esd->Pesd |= ((esd->ad_size >> 2) & 0x01) << 1; /* addressing size */ + esd->Pesd |= (comp < 0) ? 0x01 : 0x00; /* averaging components */ + + /* if pointer to sensval is NULL, we can fill data field by ourselves */ + if (!sensval) { + + /* old code moved to jpwl_esd_fill() */ + esd->data = NULL; + + } else { + /* we set the data field as the sensitivity values poinnter passed to the function */ + esd->data = (unsigned char *) sensval; + } + + return (esd); +} + +opj_bool jpwl_esd_fill(opj_j2k_t *j2k, jpwl_esd_ms_t *esd, unsigned char *buf) { + + int i; + unsigned long int vv; + unsigned long int addr1 = 0L, addr2 = 0L; + double dvalue = 0.0, Omax2, tmp, TSE = 0.0, MSE, oldMSE = 0.0, PSNR, oldPSNR = 0.0; + unsigned short int pfpvalue; + unsigned long int addrmask = 0x00000000; + opj_bool doneMH = OPJ_FALSE, doneTPH = OPJ_FALSE; + + /* sensitivity values in image info are as follows: + - for each tile, distotile is the starting distortion for that tile, sum of all components + - for each packet in a tile, disto is the distortion reduction caused by that packet to that tile + - the TSE for a single tile should be given by distotile - sum(disto) , for all components + - the MSE for a single tile is given by TSE / nbpix , for all components + - the PSNR for a single tile is given by 10*log10( Omax^2 / MSE) , for all components + (Omax is given by 2^bpp - 1 for unsigned images and by 2^(bpp - 1) - 1 for signed images + */ + + /* browse all components and find Omax */ + Omax2 = 0.0; + for (i = 0; i < j2k->image->numcomps; i++) { + tmp = pow(2.0, (double) (j2k->image->comps[i].sgnd ? + (j2k->image->comps[i].bpp - 1) : (j2k->image->comps[i].bpp))) - 1; + if (tmp > Omax2) + Omax2 = tmp; + } + Omax2 = Omax2 * Omax2; + + /* if pointer of esd->data is not null, simply write down all the values byte by byte */ + if (esd->data) { + for (i = 0; i < (int) esd->svalnum; i++) + *(buf++) = esd->data[i]; + return OPJ_TRUE; + } + + /* addressing mask */ + if (esd->ad_size == 2) + addrmask = 0x0000FFFF; /* two bytes */ + else + addrmask = 0xFFFFFFFF; /* four bytes */ + + /* set on precise point where sensitivity starts */ + if (esd->numcomps < 257) + buf += 6; + else + buf += 7; + + /* let's fill the data fields */ + for (vv = (esd->tileno < 0) ? 0 : (j2k->cstr_info->packno * esd->tileno); vv < esd->svalnum; vv++) { + + int thistile = vv / j2k->cstr_info->packno, thispacket = vv % j2k->cstr_info->packno; + + /* skip for the hack some lines below */ + if (thistile == j2k->cstr_info->tw * j2k->cstr_info->th) + break; + + /* starting tile distortion */ + if (thispacket == 0) { + TSE = j2k->cstr_info->tile[thistile].distotile; + oldMSE = TSE / j2k->cstr_info->tile[thistile].numpix; + oldPSNR = 10.0 * log10(Omax2 / oldMSE); + } + + /* TSE */ + TSE -= j2k->cstr_info->tile[thistile].packet[thispacket].disto; + + /* MSE */ + MSE = TSE / j2k->cstr_info->tile[thistile].numpix; + + /* PSNR */ + PSNR = 10.0 * log10(Omax2 / MSE); + + /* fill the address range */ + switch (esd->addrm) { + + /* packet mode */ + case (0): + /* nothing, there is none */ + break; + + /* byte range */ + case (1): + /* start address of packet */ + addr1 = (j2k->cstr_info->tile[thistile].packet[thispacket].start_pos) & addrmask; + /* end address of packet */ + addr2 = (j2k->cstr_info->tile[thistile].packet[thispacket].end_pos) & addrmask; + break; + + /* packet range */ + case (2): + /* not implemented here */ + opj_event_msg(j2k->cinfo, EVT_WARNING, "Addressing mode packet_range is not implemented\n"); + break; + + /* unknown addressing method */ + default: + /* not implemented here */ + opj_event_msg(j2k->cinfo, EVT_WARNING, "Unknown addressing mode\n"); + break; + + } + + /* hack for writing relative sensitivity of MH and TPHs */ + if ((esd->senst == 0) && (thispacket == 0)) { + + /* possible MH */ + if ((thistile == 0) && !doneMH) { + /* we have to manage MH addresses */ + addr1 = 0; /* start of MH */ + addr2 = j2k->cstr_info->main_head_end; /* end of MH */ + /* set special dvalue for this MH */ + dvalue = -10.0; + doneMH = OPJ_TRUE; /* don't come here anymore */ + vv--; /* wrap back loop counter */ + + } else if (!doneTPH) { + /* we have to manage TPH addresses */ + addr1 = j2k->cstr_info->tile[thistile].start_pos; + addr2 = j2k->cstr_info->tile[thistile].end_header; + /* set special dvalue for this TPH */ + dvalue = -1.0; + doneTPH = OPJ_TRUE; /* don't come here till the next tile */ + vv--; /* wrap back loop counter */ + } + + } else + doneTPH = OPJ_FALSE; /* reset TPH counter */ + + /* write the addresses to the buffer */ + switch (esd->ad_size) { + + case (0): + /* do nothing */ + break; + + case (2): + /* two bytes */ + *(buf++) = (unsigned char) (addr1 >> 8); + *(buf++) = (unsigned char) (addr1 >> 0); + *(buf++) = (unsigned char) (addr2 >> 8); + *(buf++) = (unsigned char) (addr2 >> 0); + break; + + case (4): + /* four bytes */ + *(buf++) = (unsigned char) (addr1 >> 24); + *(buf++) = (unsigned char) (addr1 >> 16); + *(buf++) = (unsigned char) (addr1 >> 8); + *(buf++) = (unsigned char) (addr1 >> 0); + *(buf++) = (unsigned char) (addr2 >> 24); + *(buf++) = (unsigned char) (addr2 >> 16); + *(buf++) = (unsigned char) (addr2 >> 8); + *(buf++) = (unsigned char) (addr2 >> 0); + break; + + default: + /* do nothing */ + break; + } + + + /* let's fill the value field */ + switch (esd->senst) { + + /* relative sensitivity */ + case (0): + /* we just write down the packet ordering */ + if (dvalue == -10) + /* MH */ + dvalue = MAX_V1 + 1000.0; /* this will cause pfpvalue set to 0xFFFF */ + else if (dvalue == -1) + /* TPH */ + dvalue = MAX_V1 + 1000.0; /* this will cause pfpvalue set to 0xFFFF */ + else + /* packet: first is most important, and then in decreasing order + down to the last, which counts for 1 */ + dvalue = jpwl_pfp_to_double((unsigned short) (j2k->cstr_info->packno - thispacket), esd->se_size); + break; + + /* MSE */ + case (1): + /* !!! WRONG: let's put here disto field of packets !!! */ + dvalue = MSE; + break; + + /* MSE reduction */ + case (2): + dvalue = oldMSE - MSE; + oldMSE = MSE; + break; + + /* PSNR */ + case (3): + dvalue = PSNR; + break; + + /* PSNR increase */ + case (4): + dvalue = PSNR - oldPSNR; + oldPSNR = PSNR; + break; + + /* MAXERR */ + case (5): + dvalue = 0.0; + opj_event_msg(j2k->cinfo, EVT_WARNING, "MAXERR sensitivity mode is not implemented\n"); + break; + + /* TSE */ + case (6): + dvalue = TSE; + break; + + /* reserved */ + case (7): + dvalue = 0.0; + opj_event_msg(j2k->cinfo, EVT_WARNING, "Reserved sensitivity mode is not implemented\n"); + break; + + default: + dvalue = 0.0; + break; + } + + /* compute the pseudo-floating point value */ + pfpvalue = jpwl_double_to_pfp(dvalue, esd->se_size); + + /* write the pfp value to the buffer */ + switch (esd->se_size) { + + case (1): + /* one byte */ + *(buf++) = (unsigned char) (pfpvalue >> 0); + break; + + case (2): + /* two bytes */ + *(buf++) = (unsigned char) (pfpvalue >> 8); + *(buf++) = (unsigned char) (pfpvalue >> 0); + break; + } + + } + + return OPJ_TRUE; +} + +void jpwl_esd_write(opj_j2k_t *j2k, jpwl_esd_ms_t *esd, unsigned char *buf) { + + /* Marker */ + *(buf++) = (unsigned char) (J2K_MS_ESD >> 8); + *(buf++) = (unsigned char) (J2K_MS_ESD >> 0); + + /* Lesd */ + *(buf++) = (unsigned char) (esd->Lesd >> 8); + *(buf++) = (unsigned char) (esd->Lesd >> 0); + + /* Cesd */ + if (esd->numcomps >= 257) + *(buf++) = (unsigned char) (esd->Cesd >> 8); + *(buf++) = (unsigned char) (esd->Cesd >> 0); + + /* Pesd */ + *(buf++) = (unsigned char) (esd->Pesd >> 0); + + /* Data */ + if (esd->numcomps < 257) + memset(buf, 0xAA, (size_t) esd->Lesd - 4); + /*memcpy(buf, esd->data, (size_t) esd->Lesd - 4);*/ + else + memset(buf, 0xAA, (size_t) esd->Lesd - 5); + /*memcpy(buf, esd->data, (size_t) esd->Lesd - 5);*/ + + /* update markers struct */ + j2k_add_marker(j2k->cstr_info, J2K_MS_ESD, -1, esd->Lesd + 2); + +} + +unsigned short int jpwl_double_to_pfp(double V, int bytes) { + + unsigned short int em, e, m; + + switch (bytes) { + + case (1): + + if (V < MIN_V1) { + e = 0x0000; + m = 0x0000; + } else if (V > MAX_V1) { + e = 0x000F; + m = 0x000F; + } else { + e = (unsigned short int) (floor(log(V) * 1.44269504088896) / 4.0); + m = (unsigned short int) (0.5 + (V / (pow(2.0, (double) (4 * e))))); + } + em = ((e & 0x000F) << 4) + (m & 0x000F); + break; + + case (2): + + if (V < MIN_V2) { + e = 0x0000; + m = 0x0000; + } else if (V > MAX_V2) { + e = 0x001F; + m = 0x07FF; + } else { + e = (unsigned short int) floor(log(V) * 1.44269504088896) + 15; + m = (unsigned short int) (0.5 + 2048.0 * ((V / (pow(2.0, (double) e - 15.0))) - 1.0)); + } + em = ((e & 0x001F) << 11) + (m & 0x07FF); + break; + + default: + + em = 0x0000; + break; + }; + + return em; +} + +double jpwl_pfp_to_double(unsigned short int em, int bytes) { + + double V; + + switch (bytes) { + + case 1: + V = (double) (em & 0x0F) * pow(2.0, (double) (em & 0xF0)); + break; + + case 2: + + V = pow(2.0, (double) ((em & 0xF800) >> 11) - 15.0) * (1.0 + (double) (em & 0x07FF) / 2048.0); + break; + + default: + V = 0.0; + break; + + } + + return V; + +} + +opj_bool jpwl_update_info(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int jwmarker_num) { + + int mm; + unsigned long int addlen; + + opj_codestream_info_t *info = j2k->cstr_info; + int tileno, tpno, packno, numtiles = info->th * info->tw, numpacks = info->packno; + + if (!j2k || !jwmarker ) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "J2K handle or JPWL markers list badly allocated\n"); + return OPJ_FALSE; + } + + /* main_head_end: how many markers are there before? */ + addlen = 0; + for (mm = 0; mm < jwmarker_num; mm++) + if (jwmarker[mm].pos < (unsigned long int) info->main_head_end) + addlen += jwmarker[mm].len + 2; + info->main_head_end += addlen; + + /* codestream_size: always increment with all markers */ + addlen = 0; + for (mm = 0; mm < jwmarker_num; mm++) + addlen += jwmarker[mm].len + 2; + info->codestream_size += addlen; + + /* navigate through all the tiles */ + for (tileno = 0; tileno < numtiles; tileno++) { + + /* start_pos: increment with markers before SOT */ + addlen = 0; + for (mm = 0; mm < jwmarker_num; mm++) + if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].start_pos) + addlen += jwmarker[mm].len + 2; + info->tile[tileno].start_pos += addlen; + + /* end_header: increment with markers before of it */ + addlen = 0; + for (mm = 0; mm < jwmarker_num; mm++) + if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].end_header) + addlen += jwmarker[mm].len + 2; + info->tile[tileno].end_header += addlen; + + /* end_pos: increment with markers before the end of this tile */ + /* code is disabled, since according to JPWL no markers can be beyond TPH */ + addlen = 0; + for (mm = 0; mm < jwmarker_num; mm++) + if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].end_pos) + addlen += jwmarker[mm].len + 2; + info->tile[tileno].end_pos += addlen; + + /* navigate through all the tile parts */ + for (tpno = 0; tpno < info->tile[tileno].num_tps; tpno++) { + + /* start_pos: increment with markers before SOT */ + addlen = 0; + for (mm = 0; mm < jwmarker_num; mm++) + if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].tp[tpno].tp_start_pos) + addlen += jwmarker[mm].len + 2; + info->tile[tileno].tp[tpno].tp_start_pos += addlen; + + /* end_header: increment with markers before of it */ + addlen = 0; + for (mm = 0; mm < jwmarker_num; mm++) + if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].tp[tpno].tp_end_header) + addlen += jwmarker[mm].len + 2; + info->tile[tileno].tp[tpno].tp_end_header += addlen; + + /* end_pos: increment with markers before the end of this tile part */ + addlen = 0; + for (mm = 0; mm < jwmarker_num; mm++) + if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].tp[tpno].tp_end_pos) + addlen += jwmarker[mm].len + 2; + info->tile[tileno].tp[tpno].tp_end_pos += addlen; + + } + + /* navigate through all the packets in this tile */ + for (packno = 0; packno < numpacks; packno++) { + + /* start_pos: increment with markers before the packet */ + /* disabled for the same reason as before */ + addlen = 0; + for (mm = 0; mm < jwmarker_num; mm++) + if (jwmarker[mm].pos <= (unsigned long int) info->tile[tileno].packet[packno].start_pos) + addlen += jwmarker[mm].len + 2; + info->tile[tileno].packet[packno].start_pos += addlen; + + /* end_ph_pos: increment with markers before the packet */ + /* disabled for the same reason as before */ + /*addlen = 0; + for (mm = 0; mm < jwmarker_num; mm++) + if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].packet[packno].end_ph_pos) + addlen += jwmarker[mm].len + 2;*/ + info->tile[tileno].packet[packno].end_ph_pos += addlen; + + /* end_pos: increment if marker is before the end of packet */ + /* disabled for the same reason as before */ + /*addlen = 0; + for (mm = 0; mm < jwmarker_num; mm++) + if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].packet[packno].end_pos) + addlen += jwmarker[mm].len + 2;*/ + info->tile[tileno].packet[packno].end_pos += addlen; + + } + } + + /* reorder the markers list */ + + return OPJ_TRUE; +} + +#endif /* USE_JPWL */ diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/rs.c b/openjpeg-dotnet/libopenjpeg/jpwl/rs.c new file mode 100644 index 00000000..0841c637 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/rs.c @@ -0,0 +1,597 @@ + /* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium + * Copyright (c) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#ifdef USE_JPWL + +/** +@file rs.c +@brief Functions used to compute the Reed-Solomon parity and check of byte arrays + +*/ + +/** + * Reed-Solomon coding and decoding + * Phil Karn (karn@ka9q.ampr.org) September 1996 + * + * This file is derived from the program "new_rs_erasures.c" by Robert + * Morelos-Zaragoza (robert@spectra.eng.hawaii.edu) and Hari Thirumoorthy + * (harit@spectra.eng.hawaii.edu), Aug 1995 + * + * I've made changes to improve performance, clean up the code and make it + * easier to follow. Data is now passed to the encoding and decoding functions + * through arguments rather than in global arrays. The decode function returns + * the number of corrected symbols, or -1 if the word is uncorrectable. + * + * This code supports a symbol size from 2 bits up to 16 bits, + * implying a block size of 3 2-bit symbols (6 bits) up to 65535 + * 16-bit symbols (1,048,560 bits). The code parameters are set in rs.h. + * + * Note that if symbols larger than 8 bits are used, the type of each + * data array element switches from unsigned char to unsigned int. The + * caller must ensure that elements larger than the symbol range are + * not passed to the encoder or decoder. + * + */ +#include +#include +#include "rs.h" + +/* This defines the type used to store an element of the Galois Field + * used by the code. Make sure this is something larger than a char if + * if anything larger than GF(256) is used. + * + * Note: unsigned char will work up to GF(256) but int seems to run + * faster on the Pentium. + */ +typedef int gf; + +/* KK = number of information symbols */ +static int KK; + +/* Primitive polynomials - see Lin & Costello, Appendix A, + * and Lee & Messerschmitt, p. 453. + */ +#if(MM == 2)/* Admittedly silly */ +int Pp[MM+1] = { 1, 1, 1 }; + +#elif(MM == 3) +/* 1 + x + x^3 */ +int Pp[MM+1] = { 1, 1, 0, 1 }; + +#elif(MM == 4) +/* 1 + x + x^4 */ +int Pp[MM+1] = { 1, 1, 0, 0, 1 }; + +#elif(MM == 5) +/* 1 + x^2 + x^5 */ +int Pp[MM+1] = { 1, 0, 1, 0, 0, 1 }; + +#elif(MM == 6) +/* 1 + x + x^6 */ +int Pp[MM+1] = { 1, 1, 0, 0, 0, 0, 1 }; + +#elif(MM == 7) +/* 1 + x^3 + x^7 */ +int Pp[MM+1] = { 1, 0, 0, 1, 0, 0, 0, 1 }; + +#elif(MM == 8) +/* 1+x^2+x^3+x^4+x^8 */ +int Pp[MM+1] = { 1, 0, 1, 1, 1, 0, 0, 0, 1 }; + +#elif(MM == 9) +/* 1+x^4+x^9 */ +int Pp[MM+1] = { 1, 0, 0, 0, 1, 0, 0, 0, 0, 1 }; + +#elif(MM == 10) +/* 1+x^3+x^10 */ +int Pp[MM+1] = { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1 }; + +#elif(MM == 11) +/* 1+x^2+x^11 */ +int Pp[MM+1] = { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; + +#elif(MM == 12) +/* 1+x+x^4+x^6+x^12 */ +int Pp[MM+1] = { 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1 }; + +#elif(MM == 13) +/* 1+x+x^3+x^4+x^13 */ +int Pp[MM+1] = { 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; + +#elif(MM == 14) +/* 1+x+x^6+x^10+x^14 */ +int Pp[MM+1] = { 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 }; + +#elif(MM == 15) +/* 1+x+x^15 */ +int Pp[MM+1] = { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; + +#elif(MM == 16) +/* 1+x+x^3+x^12+x^16 */ +int Pp[MM+1] = { 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1 }; + +#else +#error "MM must be in range 2-16" +#endif + +/* Alpha exponent for the first root of the generator polynomial */ +#define B0 0 /* Different from the default 1 */ + +/* index->polynomial form conversion table */ +gf Alpha_to[NN + 1]; + +/* Polynomial->index form conversion table */ +gf Index_of[NN + 1]; + +/* No legal value in index form represents zero, so + * we need a special value for this purpose + */ +#define A0 (NN) + +/* Generator polynomial g(x) + * Degree of g(x) = 2*TT + * has roots @**B0, @**(B0+1), ... ,@^(B0+2*TT-1) + */ +/*gf Gg[NN - KK + 1];*/ +gf Gg[NN - 1]; + +/* Compute x % NN, where NN is 2**MM - 1, + * without a slow divide + */ +static /*inline*/ gf +modnn(int x) +{ + while (x >= NN) { + x -= NN; + x = (x >> MM) + (x & NN); + } + return x; +} + +/*#define min(a,b) ((a) < (b) ? (a) : (b))*/ + +#define CLEAR(a,n) {\ + int ci;\ + for(ci=(n)-1;ci >=0;ci--)\ + (a)[ci] = 0;\ + } + +#define COPY(a,b,n) {\ + int ci;\ + for(ci=(n)-1;ci >=0;ci--)\ + (a)[ci] = (b)[ci];\ + } +#define COPYDOWN(a,b,n) {\ + int ci;\ + for(ci=(n)-1;ci >=0;ci--)\ + (a)[ci] = (b)[ci];\ + } + +void init_rs(int k) +{ + KK = k; + if (KK >= NN) { + printf("KK must be less than 2**MM - 1\n"); + exit(1); + } + + generate_gf(); + gen_poly(); +} + +/* generate GF(2**m) from the irreducible polynomial p(X) in p[0]..p[m] + lookup tables: index->polynomial form alpha_to[] contains j=alpha**i; + polynomial form -> index form index_of[j=alpha**i] = i + alpha=2 is the primitive element of GF(2**m) + HARI's COMMENT: (4/13/94) alpha_to[] can be used as follows: + Let @ represent the primitive element commonly called "alpha" that + is the root of the primitive polynomial p(x). Then in GF(2^m), for any + 0 <= i <= 2^m-2, + @^i = a(0) + a(1) @ + a(2) @^2 + ... + a(m-1) @^(m-1) + where the binary vector (a(0),a(1),a(2),...,a(m-1)) is the representation + of the integer "alpha_to[i]" with a(0) being the LSB and a(m-1) the MSB. Thus for + example the polynomial representation of @^5 would be given by the binary + representation of the integer "alpha_to[5]". + Similarily, index_of[] can be used as follows: + As above, let @ represent the primitive element of GF(2^m) that is + the root of the primitive polynomial p(x). In order to find the power + of @ (alpha) that has the polynomial representation + a(0) + a(1) @ + a(2) @^2 + ... + a(m-1) @^(m-1) + we consider the integer "i" whose binary representation with a(0) being LSB + and a(m-1) MSB is (a(0),a(1),...,a(m-1)) and locate the entry + "index_of[i]". Now, @^index_of[i] is that element whose polynomial + representation is (a(0),a(1),a(2),...,a(m-1)). + NOTE: + The element alpha_to[2^m-1] = 0 always signifying that the + representation of "@^infinity" = 0 is (0,0,0,...,0). + Similarily, the element index_of[0] = A0 always signifying + that the power of alpha which has the polynomial representation + (0,0,...,0) is "infinity". + +*/ + +void +generate_gf(void) +{ + register int i, mask; + + mask = 1; + Alpha_to[MM] = 0; + for (i = 0; i < MM; i++) { + Alpha_to[i] = mask; + Index_of[Alpha_to[i]] = i; + /* If Pp[i] == 1 then, term @^i occurs in poly-repr of @^MM */ + if (Pp[i] != 0) + Alpha_to[MM] ^= mask; /* Bit-wise EXOR operation */ + mask <<= 1; /* single left-shift */ + } + Index_of[Alpha_to[MM]] = MM; + /* + * Have obtained poly-repr of @^MM. Poly-repr of @^(i+1) is given by + * poly-repr of @^i shifted left one-bit and accounting for any @^MM + * term that may occur when poly-repr of @^i is shifted. + */ + mask >>= 1; + for (i = MM + 1; i < NN; i++) { + if (Alpha_to[i - 1] >= mask) + Alpha_to[i] = Alpha_to[MM] ^ ((Alpha_to[i - 1] ^ mask) << 1); + else + Alpha_to[i] = Alpha_to[i - 1] << 1; + Index_of[Alpha_to[i]] = i; + } + Index_of[0] = A0; + Alpha_to[NN] = 0; +} + + +/* + * Obtain the generator polynomial of the TT-error correcting, length + * NN=(2**MM -1) Reed Solomon code from the product of (X+@**(B0+i)), i = 0, + * ... ,(2*TT-1) + * + * Examples: + * + * If B0 = 1, TT = 1. deg(g(x)) = 2*TT = 2. + * g(x) = (x+@) (x+@**2) + * + * If B0 = 0, TT = 2. deg(g(x)) = 2*TT = 4. + * g(x) = (x+1) (x+@) (x+@**2) (x+@**3) + */ +void +gen_poly(void) +{ + register int i, j; + + Gg[0] = Alpha_to[B0]; + Gg[1] = 1; /* g(x) = (X+@**B0) initially */ + for (i = 2; i <= NN - KK; i++) { + Gg[i] = 1; + /* + * Below multiply (Gg[0]+Gg[1]*x + ... +Gg[i]x^i) by + * (@**(B0+i-1) + x) + */ + for (j = i - 1; j > 0; j--) + if (Gg[j] != 0) + Gg[j] = Gg[j - 1] ^ Alpha_to[modnn((Index_of[Gg[j]]) + B0 + i - 1)]; + else + Gg[j] = Gg[j - 1]; + /* Gg[0] can never be zero */ + Gg[0] = Alpha_to[modnn((Index_of[Gg[0]]) + B0 + i - 1)]; + } + /* convert Gg[] to index form for quicker encoding */ + for (i = 0; i <= NN - KK; i++) + Gg[i] = Index_of[Gg[i]]; +} + + +/* + * take the string of symbols in data[i], i=0..(k-1) and encode + * systematically to produce NN-KK parity symbols in bb[0]..bb[NN-KK-1] data[] + * is input and bb[] is output in polynomial form. Encoding is done by using + * a feedback shift register with appropriate connections specified by the + * elements of Gg[], which was generated above. Codeword is c(X) = + * data(X)*X**(NN-KK)+ b(X) + */ +int +encode_rs(dtype *data, dtype *bb) +{ + register int i, j; + gf feedback; + + CLEAR(bb,NN-KK); + for (i = KK - 1; i >= 0; i--) { +#if (MM != 8) + if(data[i] > NN) + return -1; /* Illegal symbol */ +#endif + feedback = Index_of[data[i] ^ bb[NN - KK - 1]]; + if (feedback != A0) { /* feedback term is non-zero */ + for (j = NN - KK - 1; j > 0; j--) + if (Gg[j] != A0) + bb[j] = bb[j - 1] ^ Alpha_to[modnn(Gg[j] + feedback)]; + else + bb[j] = bb[j - 1]; + bb[0] = Alpha_to[modnn(Gg[0] + feedback)]; + } else { /* feedback term is zero. encoder becomes a + * single-byte shifter */ + for (j = NN - KK - 1; j > 0; j--) + bb[j] = bb[j - 1]; + bb[0] = 0; + } + } + return 0; +} + +/* + * Performs ERRORS+ERASURES decoding of RS codes. If decoding is successful, + * writes the codeword into data[] itself. Otherwise data[] is unaltered. + * + * Return number of symbols corrected, or -1 if codeword is illegal + * or uncorrectable. + * + * First "no_eras" erasures are declared by the calling program. Then, the + * maximum # of errors correctable is t_after_eras = floor((NN-KK-no_eras)/2). + * If the number of channel errors is not greater than "t_after_eras" the + * transmitted codeword will be recovered. Details of algorithm can be found + * in R. Blahut's "Theory ... of Error-Correcting Codes". + */ +int +eras_dec_rs(dtype *data, int *eras_pos, int no_eras) +{ + int deg_lambda, el, deg_omega; + int i, j, r; + gf u,q,tmp,num1,num2,den,discr_r; + gf recd[NN]; + /* Err+Eras Locator poly and syndrome poly */ + /*gf lambda[NN-KK + 1], s[NN-KK + 1]; + gf b[NN-KK + 1], t[NN-KK + 1], omega[NN-KK + 1]; + gf root[NN-KK], reg[NN-KK + 1], loc[NN-KK];*/ + gf lambda[NN + 1], s[NN + 1]; + gf b[NN + 1], t[NN + 1], omega[NN + 1]; + gf root[NN], reg[NN + 1], loc[NN]; + int syn_error, count; + + /* data[] is in polynomial form, copy and convert to index form */ + for (i = NN-1; i >= 0; i--){ +#if (MM != 8) + if(data[i] > NN) + return -1; /* Illegal symbol */ +#endif + recd[i] = Index_of[data[i]]; + } + /* first form the syndromes; i.e., evaluate recd(x) at roots of g(x) + * namely @**(B0+i), i = 0, ... ,(NN-KK-1) + */ + syn_error = 0; + for (i = 1; i <= NN-KK; i++) { + tmp = 0; + for (j = 0; j < NN; j++) + if (recd[j] != A0) /* recd[j] in index form */ + tmp ^= Alpha_to[modnn(recd[j] + (B0+i-1)*j)]; + syn_error |= tmp; /* set flag if non-zero syndrome => + * error */ + /* store syndrome in index form */ + s[i] = Index_of[tmp]; + } + if (!syn_error) { + /* + * if syndrome is zero, data[] is a codeword and there are no + * errors to correct. So return data[] unmodified + */ + return 0; + } + CLEAR(&lambda[1],NN-KK); + lambda[0] = 1; + if (no_eras > 0) { + /* Init lambda to be the erasure locator polynomial */ + lambda[1] = Alpha_to[eras_pos[0]]; + for (i = 1; i < no_eras; i++) { + u = eras_pos[i]; + for (j = i+1; j > 0; j--) { + tmp = Index_of[lambda[j - 1]]; + if(tmp != A0) + lambda[j] ^= Alpha_to[modnn(u + tmp)]; + } + } +#ifdef ERASURE_DEBUG + /* find roots of the erasure location polynomial */ + for(i=1;i<=no_eras;i++) + reg[i] = Index_of[lambda[i]]; + count = 0; + for (i = 1; i <= NN; i++) { + q = 1; + for (j = 1; j <= no_eras; j++) + if (reg[j] != A0) { + reg[j] = modnn(reg[j] + j); + q ^= Alpha_to[reg[j]]; + } + if (!q) { + /* store root and error location + * number indices + */ + root[count] = i; + loc[count] = NN - i; + count++; + } + } + if (count != no_eras) { + printf("\n lambda(x) is WRONG\n"); + return -1; + } +#ifndef NO_PRINT + printf("\n Erasure positions as determined by roots of Eras Loc Poly:\n"); + for (i = 0; i < count; i++) + printf("%d ", loc[i]); + printf("\n"); +#endif +#endif + } + for(i=0;i 0; j--) + if (reg[j] != A0) { + reg[j] = modnn(reg[j] + j); + q ^= Alpha_to[reg[j]]; + } + if (!q) { + /* store root (index-form) and error location number */ + root[count] = i; + loc[count] = NN - i; + count++; + } + } + +#ifdef DEBUG + printf("\n Final error positions:\t"); + for (i = 0; i < count; i++) + printf("%d ", loc[i]); + printf("\n"); +#endif + if (deg_lambda != count) { + /* + * deg(lambda) unequal to number of roots => uncorrectable + * error detected + */ + return -1; + } + /* + * Compute err+eras evaluator poly omega(x) = s(x)*lambda(x) (modulo + * x**(NN-KK)). in index form. Also find deg(omega). + */ + deg_omega = 0; + for (i = 0; i < NN-KK;i++){ + tmp = 0; + j = (deg_lambda < i) ? deg_lambda : i; + for(;j >= 0; j--){ + if ((s[i + 1 - j] != A0) && (lambda[j] != A0)) + tmp ^= Alpha_to[modnn(s[i + 1 - j] + lambda[j])]; + } + if(tmp != 0) + deg_omega = i; + omega[i] = Index_of[tmp]; + } + omega[NN-KK] = A0; + + /* + * Compute error values in poly-form. num1 = omega(inv(X(l))), num2 = + * inv(X(l))**(B0-1) and den = lambda_pr(inv(X(l))) all in poly-form + */ + for (j = count-1; j >=0; j--) { + num1 = 0; + for (i = deg_omega; i >= 0; i--) { + if (omega[i] != A0) + num1 ^= Alpha_to[modnn(omega[i] + i * root[j])]; + } + num2 = Alpha_to[modnn(root[j] * (B0 - 1) + NN)]; + den = 0; + + /* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */ + for (i = min(deg_lambda,NN-KK-1) & ~1; i >= 0; i -=2) { + if(lambda[i+1] != A0) + den ^= Alpha_to[modnn(lambda[i+1] + i * root[j])]; + } + if (den == 0) { +#ifdef DEBUG + printf("\n ERROR: denominator = 0\n"); +#endif + return -1; + } + /* Apply error to data */ + if (num1 != 0) { + data[loc[j]] ^= Alpha_to[modnn(Index_of[num1] + Index_of[num2] + NN - Index_of[den])]; + } + } + return count; +} + + +#endif /* USE_JPWL */ diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/rs.h b/openjpeg-dotnet/libopenjpeg/jpwl/rs.h new file mode 100644 index 00000000..7d02a477 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/jpwl/rs.h @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium + * Copyright (c) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +#ifdef USE_JPWL + +/** +@file rs.h +@brief Functions used to compute Reed-Solomon parity and check of byte arrays + +*/ + +#ifndef __RS_HEADER__ +#define __RS_HEADER__ + +/** Global definitions for Reed-Solomon encoder/decoder + * Phil Karn KA9Q, September 1996 + * + * The parameters MM and KK specify the Reed-Solomon code parameters. + * + * Set MM to be the size of each code symbol in bits. The Reed-Solomon + * block size will then be NN = 2**M - 1 symbols. Supported values are + * defined in rs.c. + * + * Set KK to be the number of data symbols in each block, which must be + * less than the block size. The code will then be able to correct up + * to NN-KK erasures or (NN-KK)/2 errors, or combinations thereof with + * each error counting as two erasures. + */ +#define MM 8 /* RS code over GF(2**MM) - change to suit */ + +/* KK defined in rs.c */ + +#define NN ((1 << MM) - 1) + +#if (MM <= 8) +typedef unsigned char dtype; +#else +typedef unsigned int dtype; +#endif + +/** Initialization function */ +void init_rs(int); + +/** These two functions *must* be called in this order (e.g., + * by init_rs()) before any encoding/decoding + */ +void generate_gf(void); /* Generate Galois Field */ +void gen_poly(void); /* Generate generator polynomial */ + +/** Reed-Solomon encoding + * data[] is the input block, parity symbols are placed in bb[] + * bb[] may lie past the end of the data, e.g., for (255,223): + * encode_rs(&data[0],&data[223]); + */ +int encode_rs(dtype data[], dtype bb[]); + +/** Reed-Solomon erasures-and-errors decoding + * The received block goes into data[], and a list of zero-origin + * erasure positions, if any, goes in eras_pos[] with a count in no_eras. + * + * The decoder corrects the symbols in place, if possible and returns + * the number of corrected symbols. If the codeword is illegal or + * uncorrectible, the data array is unchanged and -1 is returned + */ +int eras_dec_rs(dtype data[], int eras_pos[], int no_eras); + +/** +Computes the minimum between two integers +@param a first integer to compare +@param b second integer to compare +@return returns the minimum integer between a and b +*/ +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif /* min */ + +#endif /* __RS_HEADER__ */ + + +#endif /* USE_JPWL */ diff --git a/openjpeg-dotnet/libopenjpeg/phix_manager.c b/openjpeg-dotnet/libopenjpeg/phix_manager.c new file mode 100644 index 00000000..60a02811 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/phix_manager.c @@ -0,0 +1,170 @@ +/* + * $Id: phix_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $ + * + * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2011, Professor Benoit Macq + * Copyright (c) 2003-2004, Yannick Verschueren + * Copyright (c) 2010-2011, Kaori Hagihara + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +/*! \file + * \brief Modification of jpip.c from 2KAN indexer + */ + +#include +#include +#include "opj_includes.h" + +/* + * Write faix box of phix + * + * @param[in] coff offset of j2k codestream + * @param[in] compno component number + * @param[in] cstr_info codestream information + * @param[in] EPHused true if if EPH option used + * @param[in] j2klen length of j2k codestream + * @param[in] cio file output handle + * @return length of faix box + */ +int write_phixfaix( int coff, int compno, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio); + +int write_phix( int coff, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio) +{ + int len, lenp=0, compno, i; + opj_jp2_box_t *box; + + box = (opj_jp2_box_t *)opj_calloc( cstr_info.numcomps, sizeof(opj_jp2_box_t)); + + for( i=0;i<2;i++){ + if (i) cio_seek( cio, lenp); + + lenp = cio_tell( cio); + cio_skip( cio, 4); /* L [at the end] */ + cio_write( cio, JPIP_PHIX, 4); /* PHIX */ + + write_manf( i, cstr_info.numcomps, box, cio); + + for( compno=0; compno pow( 2, 32)){ + size_of_coding = 8; + version = 1; + } + else{ + size_of_coding = 4; + version = 0; + } + + lenp = cio_tell( cio); + cio_skip( cio, 4); /* L [at the end] */ + cio_write( cio, JPIP_FAIX, 4); /* FAIX */ + cio_write( cio, version,1); /* Version 0 = 4 bytes */ + + nmax = 0; + for( i=0; i<=cstr_info.numdecompos[compno]; i++) + nmax += cstr_info.tile[0].ph[i] * cstr_info.tile[0].pw[i] * cstr_info.numlayers; + + cio_write( cio, nmax, size_of_coding); /* NMAX */ + cio_write( cio, cstr_info.tw*cstr_info.th, size_of_coding); /* M */ + + for( tileno=0; tilenopw[resno]*tile_Idx->ph[resno]; + for( precno=0; precnopacket[ ((layno*numOfres+resno)*cstr_info.numcomps+compno)*numOfprec+precno]; + break; + case RLCP: + packet = tile_Idx->packet[ ((resno*numOflayers+layno)*cstr_info.numcomps+compno)*numOfprec+precno]; + break; + case RPCL: + packet = tile_Idx->packet[ ((resno*numOfprec+precno)*cstr_info.numcomps+compno)*numOflayers+layno]; + break; + case PCRL: + packet = tile_Idx->packet[ ((precno*cstr_info.numcomps+compno)*numOfres+resno)*numOflayers + layno]; + break; + case CPRL: + packet = tile_Idx->packet[ ((compno*numOfprec+precno)*numOfres+resno)*numOflayers + layno]; + break; + default: + fprintf( stderr, "failed to ppix indexing\n"); + } + + cio_write( cio, packet.start_pos-coff, size_of_coding); /* start position */ + cio_write( cio, packet.end_ph_pos-packet.start_pos+1, size_of_coding); /* length */ + + num_packet++; + } + } + } + + /* PADDING */ + while( num_packet < nmax){ + cio_write( cio, 0, size_of_coding); /* start position */ + cio_write( cio, 0, size_of_coding); /* length */ + num_packet++; + } + } + + len = cio_tell( cio)-lenp; + cio_seek( cio, lenp); + cio_write( cio, len, 4); /* L */ + cio_seek( cio, lenp+len); + + return len; +} diff --git a/openjpeg-dotnet/libopenjpeg/ppix_manager.c b/openjpeg-dotnet/libopenjpeg/ppix_manager.c new file mode 100644 index 00000000..58d324ce --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/ppix_manager.c @@ -0,0 +1,173 @@ +/* + * $Id: ppix_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $ + * + * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2011, Professor Benoit Macq + * Copyright (c) 2003-2004, Yannick Verschueren + * Copyright (c) 2010-2011, Kaori Hagihara + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +/*! \file + * \brief Modification of jpip.c from 2KAN indexer + */ + +#include +#include +#include +#include "opj_includes.h" + +/* + * Write faix box of ppix + * + * @param[in] coff offset of j2k codestream + * @param[in] compno component number + * @param[in] cstr_info codestream information + * @param[in] EPHused true if if EPH option used + * @param[in] j2klen length of j2k codestream + * @param[in] cio file output handle + * @return length of faix box + */ +int write_ppixfaix( int coff, int compno, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio); + +int write_ppix( int coff, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio) +{ + int len, lenp, compno, i; + opj_jp2_box_t *box; + + /* printf("cstr_info.packno %d\n", cstr_info.packno); //NMAX? */ + + lenp = -1; + box = (opj_jp2_box_t *)opj_calloc( cstr_info.numcomps, sizeof(opj_jp2_box_t)); + + for (i=0;i<2;i++){ + if (i) cio_seek( cio, lenp); + + lenp = cio_tell( cio); + cio_skip( cio, 4); /* L [at the end] */ + cio_write( cio, JPIP_PPIX, 4); /* PPIX */ + + write_manf( i, cstr_info.numcomps, box, cio); + + for (compno=0; compno pow( 2, 32)){ + size_of_coding = 8; + version = 1; + } + else{ + size_of_coding = 4; + version = 0; + } + + lenp = cio_tell( cio); + cio_skip( cio, 4); /* L [at the end] */ + cio_write( cio, JPIP_FAIX, 4); /* FAIX */ + cio_write( cio, version, 1); /* Version 0 = 4 bytes */ + + nmax = 0; + for( i=0; i<=cstr_info.numdecompos[compno]; i++) + nmax += cstr_info.tile[0].ph[i] * cstr_info.tile[0].pw[i] * cstr_info.numlayers; + + cio_write( cio, nmax, size_of_coding); /* NMAX */ + cio_write( cio, cstr_info.tw*cstr_info.th, size_of_coding); /* M */ + + for( tileno=0; tilenopw[resno]*tile_Idx->ph[resno]; + for( precno=0; precnopacket[ ((layno*numOfres+resno)*cstr_info.numcomps+compno)*numOfprec+precno]; + break; + case RLCP: + packet = tile_Idx->packet[ ((resno*numOflayers+layno)*cstr_info.numcomps+compno)*numOfprec+precno]; + break; + case RPCL: + packet = tile_Idx->packet[ ((resno*numOfprec+precno)*cstr_info.numcomps+compno)*numOflayers+layno]; + break; + case PCRL: + packet = tile_Idx->packet[ ((precno*cstr_info.numcomps+compno)*numOfres+resno)*numOflayers + layno]; + break; + case CPRL: + packet = tile_Idx->packet[ ((compno*numOfprec+precno)*numOfres+resno)*numOflayers + layno]; + break; + default: + fprintf( stderr, "failed to ppix indexing\n"); + } + + cio_write( cio, packet.start_pos-coff, size_of_coding); /* start position */ + cio_write( cio, packet.end_pos-packet.start_pos+1, size_of_coding); /* length */ + + num_packet++; + } + } + } + + while( num_packet < nmax){ /* PADDING */ + cio_write( cio, 0, size_of_coding); /* start position */ + cio_write( cio, 0, size_of_coding); /* length */ + num_packet++; + } + } + + len = cio_tell( cio)-lenp; + cio_seek( cio, lenp); + cio_write( cio, len, 4); /* L */ + cio_seek( cio, lenp+len); + + return len; +} diff --git a/openjpeg-dotnet/libopenjpeg/thix_manager.c b/openjpeg-dotnet/libopenjpeg/thix_manager.c new file mode 100644 index 00000000..aa55f217 --- /dev/null +++ b/openjpeg-dotnet/libopenjpeg/thix_manager.c @@ -0,0 +1,120 @@ +/* + * $Id: thix_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $ + * + * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2011, Professor Benoit Macq + * Copyright (c) 2003-2004, Yannick Verschueren + * Copyright (c) 2010-2011, Kaori Hagihara + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `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 COPYRIGHT OWNER OR 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. + */ + +/*! \file + * \brief Modification of jpip.c from 2KAN indexer + */ + +#include +#include +#include +#include "opj_includes.h" + +/* + * Write tile-part headers mhix box + * + * @param[in] coff offset of j2k codestream + * @param[in] cstr_info codestream information + * @param[in] tileno tile number + * @param[in] cio file output handle + * @return length of mhix box + */ +int write_tilemhix( int coff, opj_codestream_info_t cstr_info, int tileno, opj_cio_t *cio); + +int write_thix( int coff, opj_codestream_info_t cstr_info, opj_cio_t *cio) +{ + int len, lenp, i; + int tileno; + opj_jp2_box_t *box; + + lenp = 0; + box = (opj_jp2_box_t *)opj_calloc( cstr_info.tw*cstr_info.th, sizeof(opj_jp2_box_t)); + + for ( i = 0; i < 2 ; i++ ){ + if (i) + cio_seek( cio, lenp); + + lenp = cio_tell( cio); + cio_skip( cio, 4); /* L [at the end] */ + cio_write( cio, JPIP_THIX, 4); /* THIX */ + write_manf( i, cstr_info.tw*cstr_info.th, box, cio); + + for (tileno = 0; tileno < cstr_info.tw*cstr_info.th; tileno++){ + box[tileno].length = write_tilemhix( coff, cstr_info, tileno, cio); + box[tileno].type = JPIP_MHIX; + } + + len = cio_tell( cio)-lenp; + cio_seek( cio, lenp); + cio_write( cio, len, 4); /* L */ + cio_seek( cio, lenp+len); + } + + opj_free(box); + + return len; +} + +int write_tilemhix( int coff, opj_codestream_info_t cstr_info, int tileno, opj_cio_t *cio) +{ + int i; + opj_tile_info_t tile; + opj_tp_info_t tp; + int len, lenp; + opj_marker_info_t *marker; + + lenp = cio_tell( cio); + cio_skip( cio, 4); /* L [at the end] */ + cio_write( cio, JPIP_MHIX, 4); /* MHIX */ + + tile = cstr_info.tile[tileno]; + tp = tile.tp[0]; + + cio_write( cio, tp.tp_end_header-tp.tp_start_pos+1, 8); /* TLEN */ + + marker = cstr_info.tile[tileno].marker; + + for( i=0; i +#include "opj_includes.h" + +#define MAX(a,b) ((a)>(b)?(a):(b)) + + +/* + * Write faix box of tpix + * + * @param[in] coff offset of j2k codestream + * @param[in] compno component number + * @param[in] cstr_info codestream information + * @param[in] j2klen length of j2k codestream + * @param[in] cio file output handle + * @return length of faix box + */ +int write_tpixfaix( int coff, int compno, opj_codestream_info_t cstr_info, int j2klen, opj_cio_t *cio); + + +int write_tpix( int coff, opj_codestream_info_t cstr_info, int j2klen, opj_cio_t *cio) +{ + int len, lenp; + lenp = cio_tell( cio); + cio_skip( cio, 4); /* L [at the end] */ + cio_write( cio, JPIP_TPIX, 4); /* TPIX */ + + write_tpixfaix( coff, 0, cstr_info, j2klen, cio); + + len = cio_tell( cio)-lenp; + cio_seek( cio, lenp); + cio_write( cio, len, 4); /* L */ + cio_seek( cio, lenp+len); + + return len; +} + + +/* + * Get number of maximum tile parts per tile + * + * @param[in] cstr_info codestream information + * @return number of maximum tile parts per tile + */ +int get_num_max_tile_parts( opj_codestream_info_t cstr_info); + +int write_tpixfaix( int coff, int compno, opj_codestream_info_t cstr_info, int j2klen, opj_cio_t *cio) +{ + int len, lenp; + int i, j; + int Aux; + int num_max_tile_parts; + int size_of_coding; /* 4 or 8 */ + opj_tp_info_t tp; + int version; + + num_max_tile_parts = get_num_max_tile_parts( cstr_info); + + if( j2klen > pow( 2, 32)){ + size_of_coding = 8; + version = num_max_tile_parts == 1 ? 1:3; + } + else{ + size_of_coding = 4; + version = num_max_tile_parts == 1 ? 0:2; + } + + lenp = cio_tell( cio); + cio_skip( cio, 4); /* L [at the end] */ + cio_write( cio, JPIP_FAIX, 4); /* FAIX */ + cio_write( cio, version, 1); /* Version 0 = 4 bytes */ + + cio_write( cio, num_max_tile_parts, size_of_coding); /* NMAX */ + cio_write( cio, cstr_info.tw*cstr_info.th, size_of_coding); /* M */ + for (i = 0; i < cstr_info.tw*cstr_info.th; i++){ + for (j = 0; j < cstr_info.tile[i].num_tps; j++){ + tp = cstr_info.tile[i].tp[j]; + cio_write( cio, tp.tp_start_pos-coff, size_of_coding); /* start position */ + cio_write( cio, tp.tp_end_pos-tp.tp_start_pos+1, size_of_coding); /* length */ + if (version & 0x02){ + if( cstr_info.tile[i].num_tps == 1 && cstr_info.numdecompos[compno] > 1) + Aux = cstr_info.numdecompos[compno] + 1; + else + Aux = j + 1; + + cio_write( cio, Aux,4); + /*cio_write(img.tile[i].tile_parts[j].num_reso_AUX,4);*/ /* Aux_i,j : Auxiliary value */ + /* fprintf(stderr,"AUX value %d\n",Aux);*/ + } + /*cio_write(0,4);*/ + } + /* PADDING */ + while (j < num_max_tile_parts){ + cio_write( cio, 0, size_of_coding); /* start position */ + cio_write( cio, 0, size_of_coding); /* length */ + if (version & 0x02) + cio_write( cio, 0,4); /* Aux_i,j : Auxiliary value */ + j++; + } + } + + len = cio_tell( cio)-lenp; + cio_seek( cio, lenp); + cio_write( cio, len, 4); /* L */ + cio_seek( cio, lenp+len); + + return len; + +} + +int get_num_max_tile_parts( opj_codestream_info_t cstr_info) +{ + int num_max_tp = 0, i; + + for( i=0; i Date: Thu, 6 Sep 2012 22:55:34 +0100 Subject: [PATCH 09/57] Remove some temporary files that I just added by mistake --- .../libopenjpeg/jpwl/.README.txt.swp | Bin 16384 -> 0 bytes .../jpwl/.deps/libopenjpeg_JPWL_la-bio.Plo | 1 - .../.deps/libopenjpeg_JPWL_la-cidx_manager.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-cio.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-crc.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-dwt.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-event.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-image.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-j2k.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-j2k_lib.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-jp2.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-jpt.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-jpwl.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-jpwl_lib.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-mct.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-mqc.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-openjpeg.Plo | 1 - .../.deps/libopenjpeg_JPWL_la-phix_manager.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-pi.Plo | 1 - .../.deps/libopenjpeg_JPWL_la-ppix_manager.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-raw.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-rs.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-t1.Plo | 1 - .../libopenjpeg_JPWL_la-t1_generate_luts.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-t2.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-tcd.Plo | 1 - .../jpwl/.deps/libopenjpeg_JPWL_la-tgt.Plo | 1 - .../.deps/libopenjpeg_JPWL_la-thix_manager.Plo | 1 - .../.deps/libopenjpeg_JPWL_la-tpix_manager.Plo | 1 - 29 files changed, 28 deletions(-) delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.README.txt.swp delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-bio.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-cidx_manager.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-cio.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-crc.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-dwt.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-event.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-image.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-j2k.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-j2k_lib.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jp2.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpt.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpwl.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpwl_lib.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-mct.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-mqc.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-openjpeg.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-phix_manager.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-pi.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-ppix_manager.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-raw.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-rs.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t1.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t1_generate_luts.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t2.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tcd.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tgt.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-thix_manager.Plo delete mode 100644 openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tpix_manager.Plo diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.README.txt.swp b/openjpeg-dotnet/libopenjpeg/jpwl/.README.txt.swp deleted file mode 100644 index 41357afbf5b7cf9b9e782a1108ce3caf6bf48f64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 BFDn25 diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-bio.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-bio.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-bio.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-cidx_manager.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-cidx_manager.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-cidx_manager.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-cio.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-cio.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-cio.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-crc.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-crc.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-crc.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-dwt.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-dwt.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-dwt.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-event.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-event.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-event.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-image.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-image.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-image.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-j2k.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-j2k.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-j2k.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-j2k_lib.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-j2k_lib.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-j2k_lib.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jp2.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jp2.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jp2.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpt.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpt.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpt.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpwl.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpwl.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpwl.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpwl_lib.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpwl_lib.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-jpwl_lib.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-mct.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-mct.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-mct.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-mqc.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-mqc.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-mqc.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-openjpeg.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-openjpeg.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-openjpeg.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-phix_manager.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-phix_manager.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-phix_manager.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-pi.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-pi.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-pi.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-ppix_manager.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-ppix_manager.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-ppix_manager.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-raw.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-raw.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-raw.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-rs.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-rs.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-rs.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t1.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t1.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t1.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t1_generate_luts.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t1_generate_luts.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t1_generate_luts.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t2.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t2.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-t2.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tcd.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tcd.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tcd.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tgt.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tgt.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tgt.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-thix_manager.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-thix_manager.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-thix_manager.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tpix_manager.Plo b/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tpix_manager.Plo deleted file mode 100644 index 9ce06a81..00000000 --- a/openjpeg-dotnet/libopenjpeg/jpwl/.deps/libopenjpeg_JPWL_la-tpix_manager.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy From e4b2493598fec1f68a9bb9eaee1fe38d55e0af8e Mon Sep 17 00:00:00 2001 From: justincc Date: Thu, 6 Sep 2012 23:09:10 +0100 Subject: [PATCH 10/57] Update windows openjpeg dlls to 1.5 Also updates DllOpenJPEG.vcproj --- bin/openjpeg-dotnet-x86_64.dll | Bin 843776 -> 215040 bytes bin/openjpeg-dotnet.dll | Bin 187392 -> 201216 bytes openjpeg-dotnet/DllOpenJPEG.vcproj | 28 ++++++++++++++++++++++++++++ 3 files changed, 28 insertions(+) mode change 100644 => 100755 bin/openjpeg-dotnet.dll diff --git a/bin/openjpeg-dotnet-x86_64.dll b/bin/openjpeg-dotnet-x86_64.dll index 97729fffa0763558b7e511f78dec94e89c184456..9e8cd21507bbf9eed60af9d664f166ac9b6ee1f8 100644 GIT binary patch literal 215040 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 t!vjfmVKD9v&=*yr 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 z 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�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�NeQv(vir;;Q09N`OL@HBYD>m0-b8m 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

    WP|%De6a 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

    h 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 v8P^GQi~0<|Bf#&TaB45> + + @@ -842,6 +846,10 @@ /> + + @@ -878,6 +886,10 @@ /> + + @@ -1058,6 +1070,14 @@ /> + + + + + + @@ -1091,6 +1115,10 @@ RelativePath="libopenjpeg\image.h" > + + From a41f9a374db9d4ddb018b34deb3c7ec3702f4ad1 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey Date: Thu, 6 Sep 2012 23:57:36 +0100 Subject: [PATCH 11/57] Rename libopenjpeg linux libraries from 2.1.3.0 to 2-1.5.0, which I said I did in a previous commit but forgot --- ... => libopenjpeg-dotnet-2-1.5.0-dotnet-1-i686.so} | Bin ...> libopenjpeg-dotnet-2-1.5.0-dotnet-1-x86_64.so} | Bin 2 files changed, 0 insertions(+), 0 deletions(-) rename bin/{libopenjpeg-dotnet-2.1.3.0-dotnet-1-i686.so => libopenjpeg-dotnet-2-1.5.0-dotnet-1-i686.so} (100%) mode change 100644 => 100755 rename bin/{libopenjpeg-dotnet-2.1.3.0-dotnet-1-x86_64.so => libopenjpeg-dotnet-2-1.5.0-dotnet-1-x86_64.so} (100%) mode change 100644 => 100755 diff --git a/bin/libopenjpeg-dotnet-2.1.3.0-dotnet-1-i686.so b/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-i686.so old mode 100644 new mode 100755 similarity index 100% rename from bin/libopenjpeg-dotnet-2.1.3.0-dotnet-1-i686.so rename to bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-i686.so diff --git a/bin/libopenjpeg-dotnet-2.1.3.0-dotnet-1-x86_64.so b/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-x86_64.so old mode 100644 new mode 100755 similarity index 100% rename from bin/libopenjpeg-dotnet-2.1.3.0-dotnet-1-x86_64.so rename to bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-x86_64.so From 7d6c7b73fcbb576c23fdb5eaf50b0e82dd08463b Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey Date: Thu, 6 Sep 2012 23:58:48 +0100 Subject: [PATCH 12/57] Update mac openjpeg to 1.5 and Makefile.osx --- bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylib | Bin 0 -> 147288 bytes bin/libopenjpeg-dotnet-2.1.3.0-dotnet-1.dylib | Bin 125136 -> 0 bytes openjpeg-dotnet/Makefile.osx | 8 ++++---- 3 files changed, 4 insertions(+), 4 deletions(-) create mode 100755 bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylib delete mode 100644 bin/libopenjpeg-dotnet-2.1.3.0-dotnet-1.dylib diff --git a/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylib b/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylib new file mode 100755 index 0000000000000000000000000000000000000000..18ca868c6511030cf94c9d8e23ab337180385ffa GIT binary patch literal 147288 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%0Agq^Jjf0Rqs~EFc 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 JeULx#e*v#&$3g%A diff --git a/openjpeg-dotnet/Makefile.osx b/openjpeg-dotnet/Makefile.osx index cad4535a..b59d7f75 100644 --- a/openjpeg-dotnet/Makefile.osx +++ b/openjpeg-dotnet/Makefile.osx @@ -1,11 +1,11 @@ # MacOSX makefile for OpenJPEG VER_MAJOR = 2 -VER_MINOR = 1.3.0-dotnet-1 +VER_MINOR = 1.5.0-dotnet-1 -SRCS = ./libopenjpeg/bio.c ./libopenjpeg/cio.c ./libopenjpeg/dwt.c ./libopenjpeg/event.c ./libopenjpeg/image.c ./libopenjpeg/j2k.c ./libopenjpeg/j2k_lib.c ./libopenjpeg/jp2.c ./libopenjpeg/jpt.c ./libopenjpeg/mct.c ./libopenjpeg/mqc.c ./libopenjpeg/openjpeg.c ./libopenjpeg/pi.c ./libopenjpeg/raw.c ./libopenjpeg/t1.c ./libopenjpeg/t2.c ./libopenjpeg/tcd.c ./libopenjpeg/tgt.c +SRCS = ./libopenjpeg/bio.c ./libopenjpeg/cio.c ./libopenjpeg/dwt.c ./libopenjpeg/event.c ./libopenjpeg/image.c ./libopenjpeg/j2k.c ./libopenjpeg/j2k_lib.c ./libopenjpeg/jp2.c ./libopenjpeg/jpt.c ./libopenjpeg/mct.c ./libopenjpeg/mqc.c ./libopenjpeg/openjpeg.c ./libopenjpeg/pi.c ./libopenjpeg/raw.c ./libopenjpeg/t1.c ./libopenjpeg/t2.c ./libopenjpeg/tcd.c ./libopenjpeg/tgt.c ./libopenjpeg/cidx_manager.c ./libopenjpeg/phix_manager.c ./libopenjpeg/ppix_manager.c ./libopenjpeg/thix_manager.c ./libopenjpeg/tpix_manager.c CPPSRCS = ./dotnet/dotnet.cpp -INCLS = ./libopenjpeg/bio.h ./libopenjpeg/cio.h ./libopenjpeg/dwt.h ./libopenjpeg/event.h ./libopenjpeg/fix.h ./libopenjpeg/image.h ./libopenjpeg/int.h ./libopenjpeg/j2k.h ./libopenjpeg/j2k_lib.h ./libopenjpeg/jp2.h ./libopenjpeg/jpt.h ./libopenjpeg/mct.h ./libopenjpeg/mqc.h ./libopenjpeg/openjpeg.h ./libopenjpeg/pi.h ./libopenjpeg/raw.h ./libopenjpeg/t1.h ./libopenjpeg/t2.h ./libopenjpeg/tcd.h ./libopenjpeg/tgt.h ./libopenjpeg/opj_includes.h ./dotnet/dotnet.h +INCLS = ./libopenjpeg/bio.h ./libopenjpeg/cio.h ./libopenjpeg/dwt.h ./libopenjpeg/event.h ./libopenjpeg/fix.h ./libopenjpeg/image.h ./libopenjpeg/int.h ./libopenjpeg/j2k.h ./libopenjpeg/j2k_lib.h ./libopenjpeg/jp2.h ./libopenjpeg/jpt.h ./libopenjpeg/mct.h ./libopenjpeg/mqc.h ./libopenjpeg/openjpeg.h ./libopenjpeg/pi.h ./libopenjpeg/raw.h ./libopenjpeg/t1.h ./libopenjpeg/t2.h ./libopenjpeg/tcd.h ./libopenjpeg/tgt.h ./libopenjpeg/opj_includes.h ./dotnet/dotnet.h ./libopenjpeg/cidx_manager.h ./libopenjpeg/indexbox_manager.h INCLUDE = -Ilibopenjpeg # General configuration variables: @@ -21,7 +21,7 @@ CPPMODULES = $(CPPSRCS:.cpp=.o) CFLAGS = $(COMPILERFLAGS) $(INCLUDE) TARGET = openjpeg-dotnet -SHAREDLIB = lib$(TARGET)-$(VER_MAJOR).$(VER_MINOR).dylib +SHAREDLIB = lib$(TARGET)-$(VER_MAJOR)-$(VER_MINOR).dylib LIBNAME = lib$(TARGET).dylib From a9336c0199da9c6e3abea0ca4167416db77b0465 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey Date: Fri, 7 Sep 2012 00:36:05 +0100 Subject: [PATCH 13/57] Revert "Some rough hacks to get GridProxy to return information on specific cap requests via the command line GridProxyApp." Wasn't meant to be on this branch and this now seems the easiest way of getting rid of it This reverts commit d19f09bdacdabf5ba2ee12e15f4474f6dbeddf5d. --- Programs/GridProxy/GridProxy.cs | 25 +- Programs/GridProxy/GridProxyMain.cs | 4 +- Programs/GridProxy/Plugins/CapAnalyst.cs | 875 ----------------------- 3 files changed, 9 insertions(+), 895 deletions(-) delete mode 100644 Programs/GridProxy/Plugins/CapAnalyst.cs diff --git a/Programs/GridProxy/GridProxy.cs b/Programs/GridProxy/GridProxy.cs index f28afbd3..f7e8e85a 100644 --- a/Programs/GridProxy/GridProxy.cs +++ b/Programs/GridProxy/GridProxy.cs @@ -370,9 +370,9 @@ namespace GridProxy Thread connThread = new Thread((ThreadStart)delegate { -// OpenMetaverse.Logger.Log(">T> LoginProxy", Helpers.LogLevel.Debug); + OpenMetaverse.Logger.Log(">T> LoginProxy", Helpers.LogLevel.Debug); ProxyHTTP(client); -// OpenMetaverse.Logger.Log(" headers, byte[] content, int reqNo) { -// Console.WriteLine("ProxyCaps {0} {1}", meth, uri); Match match = new Regex(@"^(https?)://([^:/]+)(:\d+)?(/.*)$").Match(uri); if (!match.Success) { @@ -641,9 +640,6 @@ namespace GridProxy CapsRequest capReq = null; bool shortCircuit = false; bool requestFailed = false; if (cap != null) { -// if (cap.CapType != "GetTexture" && cap.CapType != "ViewerStats" && cap.CapType != "ViewerMetrics") -// Console.WriteLine("CAP request {0} {1}", meth, cap.CapType); - capReq = new CapsRequest(cap); if (cap.ReqFmt == CapsDataFormat.OSD) @@ -752,7 +748,7 @@ namespace GridProxy } else if (cap == null) { -// OpenMetaverse.Logger.Log(string.Format("{0} {1}", req.Method, req.Address.ToString()), Helpers.LogLevel.Info); + OpenMetaverse.Logger.Log(string.Format("{0} {1}", req.Method, req.Address.ToString()), Helpers.LogLevel.Info); } resp = (HttpWebResponse)req.GetResponse(); } @@ -883,11 +879,8 @@ namespace GridProxy } consoleMsg += "\n" + respString + "\n--------"; -// OpenMetaverse.Logger.Log(consoleMsg, Helpers.LogLevel.Debug); - -// if (cap.CapType == "FetchInventory2" || cap.CapType == "FetchInventoryDescendents2") - -// OpenMetaverse.Logger.Log("[" + reqNo + "] Fixed-up response:\n" + respString + "\n--------", Helpers.LogLevel.Debug); + OpenMetaverse.Logger.Log(consoleMsg, Helpers.LogLevel.Debug); + OpenMetaverse.Logger.Log("[" + reqNo + "] Fixed-up response:\n" + respString + "\n--------", Helpers.LogLevel.Debug); try { @@ -922,8 +915,6 @@ namespace GridProxy if (!String.IsNullOrEmpty(val)) { - OpenMetaverse.Logger.Log(string.Format("Got CAP {0}:{1}", key, val), Helpers.LogLevel.Debug); - if (!KnownCaps.ContainsKey(val)) { CapsDataFormat resFmt = BinaryResponseCaps.Contains(key) ? CapsDataFormat.Binary : CapsDataFormat.OSD; diff --git a/Programs/GridProxy/GridProxyMain.cs b/Programs/GridProxy/GridProxyMain.cs index ad4c0e48..04430ca7 100644 --- a/Programs/GridProxy/GridProxyMain.cs +++ b/Programs/GridProxy/GridProxyMain.cs @@ -8,9 +8,7 @@ class ProxyMain { ProxyFrame p = new ProxyFrame(args); ProxyPlugin analyst = new Analyst(p); - analyst.Init(); - ProxyPlugin capAnalyst = new CapAnalyst(p); - capAnalyst.Init(); + analyst.Init(); p.proxy.Start(); } } \ No newline at end of file diff --git a/Programs/GridProxy/Plugins/CapAnalyst.cs b/Programs/GridProxy/Plugins/CapAnalyst.cs deleted file mode 100644 index d02fff0e..00000000 --- a/Programs/GridProxy/Plugins/CapAnalyst.cs +++ /dev/null @@ -1,875 +0,0 @@ -/* - * Analyst.cs: proxy that makes packet inspection and modifcation interactive - * See the README for usage instructions. - * - * Copyright (c) 2006 Austin Jennings - * Modified by "qode" and "mcortez" on December 21st, 2006 to work with the new - * pregen - * All rights reserved. - * - * - 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. - * - Neither the name of the openmetaverse.org 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR 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; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Net; -using System.Text.RegularExpressions; -using System.Reflection; -using System.Xml; -using Nwc.XmlRpc; -using OpenMetaverse; -using OpenMetaverse.StructuredData; -using OpenMetaverse.Packets; -using GridProxy; - - -public class CapAnalyst : ProxyPlugin -{ - private ProxyFrame frame; - private Proxy proxy; - private HashSet loggedCaps = new HashSet(); - private string logGrep = null; - private Dictionary> modifiedPackets = new Dictionary>(); - private Assembly openmvAssembly; - private StreamWriter output; - - //private PacketDecoder DecodePacket = new PacketDecoder(); - - public CapAnalyst(ProxyFrame frame) - { - this.frame = frame; - this.proxy = frame.proxy; - } - - ~CapAnalyst() - { - if (output != null) - output.Close(); - } - - public override void Init() - { - openmvAssembly = Assembly.Load("OpenMetaverse"); - if (openmvAssembly == null) throw new Exception("Assembly load exception"); - - // build the table of /command delegates - InitializeCommandDelegates(); - - // handle command line arguments - foreach (string arg in frame.Args) - if (arg == "--log-all") - LogAll(); - else if (arg.Contains("--log-whitelist=")) - LogWhitelist(arg.Substring(arg.IndexOf('=') + 1)); - else if (arg.Contains("--no-log-blacklist=")) - NoLogBlacklist(arg.Substring(arg.IndexOf('=') + 1)); - else if (arg.Contains("--output=")) - SetOutput(arg.Substring(arg.IndexOf('=') + 1)); - - StartLogCap("FetchInventory2"); - StartLogCap("FetchInventoryDescendents2"); - - Console.WriteLine("CapAnalyst loaded"); - } - - // InitializeCommandDelegates: configure Analyst's commands - private void InitializeCommandDelegates() - { - frame.AddCommand("/logcap", new ProxyFrame.CommandDelegate(CmdLog)); - frame.AddCommand("/-logcap", new ProxyFrame.CommandDelegate(CmdNoLog)); -// frame.AddCommand("/grep", new ProxyFrame.CommandDelegate(CmdGrep)); -// frame.AddCommand("/drop", new ProxyFrame.CommandDelegate(CmdDrop)); -// frame.AddCommand("/-drop", new ProxyFrame.CommandDelegate(CmdNoDrop)); -// frame.AddCommand("/set", new ProxyFrame.CommandDelegate(CmdSet)); -// frame.AddCommand("/-set", new ProxyFrame.CommandDelegate(CmdNoSet)); -// frame.AddCommand("/inject", new ProxyFrame.CommandDelegate(CmdInject)); -// frame.AddCommand("/in", new ProxyFrame.CommandDelegate(CmdInject)); - } - -// private static PacketType packetTypeFromName(string name) -// { -// Type packetTypeType = typeof(PacketType); -// System.Reflection.FieldInfo f = packetTypeType.GetField(name); -// if (f == null) throw new ArgumentException("Bad packet type"); -// return (PacketType)Enum.ToObject(packetTypeType, (int)f.GetValue(packetTypeType)); -// } - - // CmdLog: handle a /log command - private void CmdLog(string[] words) - { - if (words.Length != 2) - SayToUser("Usage: /logcap "); - else if (words[1] == "*") - { - LogAll(); - SayToUser("logging all caps"); - } - else - { -// PacketType pType; -// try -// { -// pType = packetTypeFromName(words[1]); -// } -// catch (ArgumentException) -// { -// SayToUser("Bad cap name: " + words[1]); -// return; -// } - string capName = words[1]; - - StartLogCap(capName); - SayToUser("logging " + capName); - } - } - - private void StartLogCap(string capName) - { - loggedCaps.Add(capName); - proxy.AddCapsDelegate(capName, LogCap); - } - - // CmdNoLog: handle a /-log command - private void CmdNoLog(string[] words) - { - if (words.Length != 2) - SayToUser("Usage: /-logcap "); - else if (words[1] == "*") - { - NoLogAll(); - SayToUser("stopped logging all caps"); - } - else - { -// PacketType pType = packetTypeFromName(words[1]); - string capName = words[1]; - loggedCaps.Remove(capName); - proxy.RemoveCapRequestDelegate(capName, LogCap); - - SayToUser("stopped logging " + capName); - } - } - - // CmdGrep: handle a /grep command - private void CmdGrep(string[] words) - { - if (words.Length == 1) - { - logGrep = null; - SayToUser("stopped filtering logs"); - } - else - { - string[] regexArray = new string[words.Length - 1]; - Array.Copy(words, 1, regexArray, 0, words.Length - 1); - logGrep = String.Join(" ", regexArray); - SayToUser("filtering log with " + logGrep); - } - } - - private void CmdDrop(string[] words) - { - throw new NotImplementedException(); - } - - private void CmdNoDrop(string[] words) - { - throw new NotImplementedException(); - } - - // CmdSet: handle a /set command - private void CmdSet(string[] words) - { -// if (words.Length < 5) -// SayToUser("Usage: /set "); -// else -// { -// PacketType pType; -// try -// { -// pType = packetTypeFromName(words[1]); -// } -// catch (ArgumentException) -// { -// SayToUser("Bad packet name: " + words[1]); -// return; -// } -// -// string[] valueArray = new string[words.Length - 4]; -// Array.Copy(words, 4, valueArray, 0, words.Length - 4); -// string valueString = String.Join(" ", valueArray); -// object value; -// try -// { -// value = MagicCast(words[1], words[2], words[3], valueString); -// } -// catch (Exception e) -// { -// SayToUser(e.Message); -// return; -// } -// -// Dictionary fields; -// if (modifiedPackets.ContainsKey(pType)) -// fields = (Dictionary)modifiedPackets[pType]; -// else -// fields = new Dictionary(); -// -// fields[new BlockField(words[2], words[3])] = value; -// modifiedPackets[pType] = fields; -// -// proxy.AddDelegate(pType, Direction.Incoming, new PacketDelegate(ModifyIn)); -// proxy.AddDelegate(pType, Direction.Outgoing, new PacketDelegate(ModifyOut)); -// -// SayToUser("setting " + words[1] + "." + words[2] + "." + words[3] + " = " + valueString); -// } - } - - // CmdNoSet: handle a /-set command - private void CmdNoSet(string[] words) - { -// if (words.Length == 2 && words[1] == "*") -// { -// foreach (PacketType pType in modifiedPackets.Keys) -// { -// proxy.RemoveDelegate(pType, Direction.Incoming, new PacketDelegate(ModifyIn)); -// proxy.RemoveDelegate(pType, Direction.Outgoing, new PacketDelegate(ModifyOut)); -// } -// modifiedPackets = new Dictionary>(); -// -// SayToUser("stopped setting all fields"); -// } -// else if (words.Length == 4) -// { -// PacketType pType; -// try -// { -// pType = packetTypeFromName(words[1]); -// } -// catch (ArgumentException) -// { -// SayToUser("Bad packet name: " + words[1]); -// return; -// } -// -// -// if (modifiedPackets.ContainsKey(pType)) -// { -// Dictionary fields = modifiedPackets[pType]; -// fields.Remove(new BlockField(words[2], words[3])); -// -// if (fields.Count == 0) -// { -// modifiedPackets.Remove(pType); -// -// proxy.RemoveDelegate(pType, Direction.Incoming, new PacketDelegate(ModifyIn)); -// proxy.RemoveDelegate(pType, Direction.Outgoing, new PacketDelegate(ModifyOut)); -// } -// } -// -// SayToUser("stopped setting " + words[1] + "." + words[2] + "." + words[3]); -// } -// else -// SayToUser("Usage: /-set "); - } - - - // CmdInject: handle an /inject command - private void CmdInject(string[] words) - { -// if (words.Length < 2) -// SayToUser("Usage: /inject [value]"); -// else -// { -// string[] valueArray = new string[words.Length - 2]; -// Array.Copy(words, 2, valueArray, 0, words.Length - 2); -// string value = String.Join(" ", valueArray); -// -// FileStream fs = null; -// StreamReader sr = null; -// Direction direction = Direction.Incoming; -// string name = null; -// string block = null; -// object blockObj = null; -// Type packetClass = null; -// Packet packet = null; -// -// try -// { -// fs = File.OpenRead(words[1] + ".packet"); -// sr = new StreamReader(fs); -// -// string line; -// while ((line = sr.ReadLine()) != null) -// { -// Match match; -// -// if (name == null) -// { -// match = (new Regex(@"^\s*(in|out)\s+(\w+)\s*$")).Match(line); -// if (!match.Success) -// { -// SayToUser("expecting direction and packet name, got: " + line); -// return; -// } -// -// string lineDir = match.Groups[1].Captures[0].ToString(); -// string lineName = match.Groups[2].Captures[0].ToString(); -// -// if (lineDir == "in") -// direction = Direction.Incoming; -// else if (lineDir == "out") -// direction = Direction.Outgoing; -// else -// { -// SayToUser("expecting 'in' or 'out', got: " + line); -// return; -// } -// -// name = lineName; -// packetClass = openmvAssembly.GetType("OpenMetaverse.Packets." + name + "Packet"); -// if (packetClass == null) throw new Exception("Couldn't get class " + name + "Packet"); -// ConstructorInfo ctr = packetClass.GetConstructor(new Type[] { }); -// if (ctr == null) throw new Exception("Couldn't get suitable constructor for " + name + "Packet"); -// packet = (Packet)ctr.Invoke(new object[] { }); -// //Console.WriteLine("Created new " + name + "Packet"); -// } -// else -// { -// match = (new Regex(@"^\s*\[(\w+)\]\s*$")).Match(line); -// if (match.Success) -// { -// block = match.Groups[1].Captures[0].ToString(); -// FieldInfo blockField = packetClass.GetField(block); -// if (blockField == null) throw new Exception("Couldn't get " + name + "Packet." + block); -// Type blockClass = blockField.FieldType; -// if (blockClass.IsArray) -// { -// blockClass = blockClass.GetElementType(); -// ConstructorInfo ctr = blockClass.GetConstructor(new Type[] { }); -// if (ctr == null) throw new Exception("Couldn't get suitable constructor for " + blockClass.Name); -// blockObj = ctr.Invoke(new object[] { }); -// object[] arr = (object[])blockField.GetValue(packet); -// object[] narr = (object[])Array.CreateInstance(blockClass, arr.Length + 1); -// Array.Copy(arr, narr, arr.Length); -// narr[arr.Length] = blockObj; -// blockField.SetValue(packet, narr); -// //Console.WriteLine("Added block "+block); -// } -// else -// { -// blockObj = blockField.GetValue(packet); -// } -// if (blockObj == null) throw new Exception("Got " + name + "Packet." + block + " == null"); -// //Console.WriteLine("Got block " + name + "Packet." + block); -// -// continue; -// } -// -// if (block == null) -// { -// SayToUser("expecting block name, got: " + line); -// return; -// } -// -// match = (new Regex(@"^\s*(\w+)\s*=\s*(.*)$")).Match(line); -// if (match.Success) -// { -// string lineField = match.Groups[1].Captures[0].ToString(); -// string lineValue = match.Groups[2].Captures[0].ToString(); -// object fval; -// -// //FIXME: use of MagicCast inefficient -// if (lineValue == "$Value") -// fval = MagicCast(name, block, lineField, value); -// else if (lineValue == "$UUID") -// fval = UUID.Random(); -// else if (lineValue == "$AgentID") -// fval = frame.AgentID; -// else if (lineValue == "$SessionID") -// fval = frame.SessionID; -// else -// fval = MagicCast(name, block, lineField, lineValue); -// -// MagicSetField(blockObj, lineField, fval); -// continue; -// } -// -// SayToUser("expecting block name or field, got: " + line); -// return; -// } -// } -// -// if (name == null) -// { -// SayToUser("expecting direction and packet name, got EOF"); -// return; -// } -// -// packet.Header.Reliable = true; -// //if (protocolManager.Command(name).Encoded) -// // packet.Header.Zerocoded = true; -// proxy.InjectPacket(packet, direction); -// -// SayToUser("injected " + words[1]); -// } -// catch (Exception e) -// { -// SayToUser("failed to inject " + words[1] + ": " + e.Message); -// Console.WriteLine("failed to inject " + words[1] + ": " + e.Message + "\n" + e.StackTrace); -// } -// finally -// { -// if (fs != null) -// fs.Close(); -// if (sr != null) -// sr.Close(); -// } -// } - } - - // SayToUser: send a message to the user as in-world chat - private void SayToUser(string message) - { - ChatFromSimulatorPacket packet = new ChatFromSimulatorPacket(); - packet.ChatData.FromName = Utils.StringToBytes("Analyst"); - packet.ChatData.SourceID = UUID.Random(); - packet.ChatData.OwnerID = frame.AgentID; - packet.ChatData.SourceType = (byte)2; - packet.ChatData.ChatType = (byte)1; - packet.ChatData.Audible = (byte)1; - packet.ChatData.Position = new Vector3(0, 0, 0); - packet.ChatData.Message = Utils.StringToBytes(message); - proxy.InjectPacket(packet, Direction.Incoming); - } - - // BlockField: product type for a block name and field name - private struct BlockField - { - public string block; - public string field; - - - public BlockField(string block, string field) - { - this.block = block; - this.field = field; - } - } - - private static void MagicSetField(object obj, string field, object val) - { - Type cls = obj.GetType(); - - FieldInfo fieldInf = cls.GetField(field); - if (fieldInf == null) - { - PropertyInfo prop = cls.GetProperty(field); - if (prop == null) throw new Exception("Couldn't find field " + cls.Name + "." + field); - prop.SetValue(obj, val, null); - //throw new Exception("FIXME: can't set properties"); - } - else - { - fieldInf.SetValue(obj, val); - } - } - - // MagicCast: given a packet/block/field name and a string, convert the string to a value of the appropriate type - private object MagicCast(string name, string block, string field, string value) - { - Type packetClass = openmvAssembly.GetType("OpenMetaverse.Packets." + name + "Packet"); - if (packetClass == null) throw new Exception("Couldn't get class " + name + "Packet"); - - FieldInfo blockField = packetClass.GetField(block); - if (blockField == null) throw new Exception("Couldn't get " + name + "Packet." + block); - Type blockClass = blockField.FieldType; - if (blockClass.IsArray) blockClass = blockClass.GetElementType(); - // Console.WriteLine("DEBUG: " + blockClass.Name); - - FieldInfo fieldField = blockClass.GetField(field); PropertyInfo fieldProp = null; - Type fieldClass = null; - if (fieldField == null) - { - fieldProp = blockClass.GetProperty(field); - if (fieldProp == null) throw new Exception("Couldn't get " + name + "Packet." + block + "." + field); - fieldClass = fieldProp.PropertyType; - } - else - { - fieldClass = fieldField.FieldType; - } - - try - { - if (fieldClass == typeof(byte)) - { - return Convert.ToByte(value); - } - else if (fieldClass == typeof(ushort)) - { - return Convert.ToUInt16(value); - } - else if (fieldClass == typeof(uint)) - { - return Convert.ToUInt32(value); - } - else if (fieldClass == typeof(ulong)) - { - return Convert.ToUInt64(value); - } - else if (fieldClass == typeof(sbyte)) - { - return Convert.ToSByte(value); - } - else if (fieldClass == typeof(short)) - { - return Convert.ToInt16(value); - } - else if (fieldClass == typeof(int)) - { - return Convert.ToInt32(value); - } - else if (fieldClass == typeof(long)) - { - return Convert.ToInt64(value); - } - else if (fieldClass == typeof(float)) - { - return Convert.ToSingle(value); - } - else if (fieldClass == typeof(double)) - { - return Convert.ToDouble(value); - } - else if (fieldClass == typeof(UUID)) - { - return new UUID(value); - } - else if (fieldClass == typeof(bool)) - { - if (value.ToLower() == "true") - return true; - else if (value.ToLower() == "false") - return false; - else - throw new Exception(); - } - else if (fieldClass == typeof(byte[])) - { - return Utils.StringToBytes(value); - } - else if (fieldClass == typeof(Vector3)) - { - Vector3 result; - if (Vector3.TryParse(value, out result)) - return result; - else - throw new Exception(); - } - else if (fieldClass == typeof(Vector3d)) - { - Vector3d result; - if (Vector3d.TryParse(value, out result)) - return result; - else - throw new Exception(); - } - else if (fieldClass == typeof(Vector4)) - { - Vector4 result; - if (Vector4.TryParse(value, out result)) - return result; - else - throw new Exception(); - } - else if (fieldClass == typeof(Quaternion)) - { - Quaternion result; - if (Quaternion.TryParse(value, out result)) - return result; - else - throw new Exception(); - } - else - { - throw new Exception("unsupported field type " + fieldClass); - } - } - catch - { - throw new Exception("unable to interpret " + value + " as " + fieldClass); - } - } - - // ModifyIn: modify an incoming packet - private Packet ModifyIn(Packet packet, IPEndPoint endPoint) - { - return Modify(packet, endPoint, Direction.Incoming); - } - - // ModifyOut: modify an outgoing packet - private Packet ModifyOut(Packet packet, IPEndPoint endPoint) - { - return Modify(packet, endPoint, Direction.Outgoing); - } - - // Modify: modify a packet - private Packet Modify(Packet packet, IPEndPoint endPoint, Direction direction) - { - if (modifiedPackets.ContainsKey(packet.Type)) - { - try - { - Dictionary changes = modifiedPackets[packet.Type]; - Type packetClass = packet.GetType(); - - foreach (KeyValuePair change in changes) - { - BlockField bf = change.Key; - FieldInfo blockField = packetClass.GetField(bf.block); - if (blockField.FieldType.IsArray) // We're modifying a variable block. - { - // Modify each block in the variable block identically. - // This is really simple, can probably be improved. - object[] blockArray = (object[])blockField.GetValue(packet); - foreach (object blockElement in blockArray) - { - MagicSetField(blockElement, bf.field, change.Value); - } - } - else - { - //Type blockClass = blockField.FieldType; - object blockObject = blockField.GetValue(packet); - MagicSetField(blockObject, bf.field, change.Value); - } - } - } - catch (Exception e) - { - Console.WriteLine("failed to modify " + packet.Type + ": " + e.Message); - Console.WriteLine(e.StackTrace); - } - } - - return packet; - } - - // LogAll: register logging delegates for all packets - private void LogAll() - { -// Type packetTypeType = typeof(PacketType); -// System.Reflection.MemberInfo[] packetTypes = packetTypeType.GetMembers(); -// -// for (int i = 0; i < packetTypes.Length; i++) -// { -// if (packetTypes[i].MemberType == System.Reflection.MemberTypes.Field && packetTypes[i].DeclaringType == packetTypeType) -// { -// string name = packetTypes[i].Name; -// PacketType pType; -// -// try -// { -// pType = packetTypeFromName(name); -// } -// catch (Exception) -// { -// continue; -// } -// -// loggedCaps[pType] = null; -// -// proxy.AddDelegate(pType, Direction.Incoming, new PacketDelegate(LogPacketIn)); -// proxy.AddDelegate(pType, Direction.Outgoing, new PacketDelegate(LogPacketOut)); -// } -// } - } - - private void LogWhitelist(string whitelistFile) - { -// try -// { -// string[] lines = File.ReadAllLines(whitelistFile); -// int count = 0; -// -// for (int i = 0; i < lines.Length; i++) -// { -// string line = lines[i].Trim(); -// if (line.Length == 0) -// continue; -// -// PacketType pType; -// -// try -// { -// pType = packetTypeFromName(line); -// proxy.AddDelegate(pType, Direction.Incoming, new PacketDelegate(LogPacketIn)); -// proxy.AddDelegate(pType, Direction.Outgoing, new PacketDelegate(LogPacketOut)); -// ++count; -// } -// catch (ArgumentException) -// { -// Console.WriteLine("Bad packet name: " + line); -// } -// } -// -// Console.WriteLine(String.Format("Logging {0} packet types loaded from whitelist", count)); -// } -// catch (Exception) -// { -// Console.WriteLine("Failed to load packet whitelist from " + whitelistFile); -// } - } - - private void NoLogBlacklist(string blacklistFile) - { -// try -// { -// string[] lines = File.ReadAllLines(blacklistFile); -// int count = 0; -// -// for (int i = 0; i < lines.Length; i++) -// { -// string line = lines[i].Trim(); -// if (line.Length == 0) -// continue; -// -// PacketType pType; -// -// try -// { -// pType = packetTypeFromName(line); -// string[] noLogStr = new string[] {"/-log", line}; -// CmdNoLog(noLogStr); -// ++count; -// } -// catch (ArgumentException) -// { -// Console.WriteLine("Bad packet name: " + line); -// } -// } -// -// Console.WriteLine(String.Format("Not logging {0} packet types loaded from blacklist", count)); -// } -// catch (Exception) -// { -// Console.WriteLine("Failed to load packet blacklist from " + blacklistFile); -// } - } - - private void SetOutput(string outputFile) - { - try - { - output = new StreamWriter(outputFile, false); - Console.WriteLine("Logging packets to " + outputFile); - } - catch (Exception) - { - Console.WriteLine(String.Format("Failed to open {0} for logging", outputFile)); - } - } - - // NoLogAll: unregister logging delegates for all packets - private void NoLogAll() - { -// Type packetTypeType = typeof(PacketType); -// System.Reflection.MemberInfo[] packetTypes = packetTypeType.GetMembers(); -// -// for (int i = 0; i < packetTypes.Length; i++) -// { -// if (packetTypes[i].MemberType == System.Reflection.MemberTypes.Field && packetTypes[i].DeclaringType == packetTypeType) -// { -// string name = packetTypes[i].Name; -// PacketType pType; -// -// try -// { -// pType = packetTypeFromName(name); -// } -// catch (Exception) -// { -// continue; -// } -// -// loggedCaps.Remove(pType); -// -// proxy.RemoveDelegate(pType, Direction.Incoming, new PacketDelegate(LogPacketIn)); -// proxy.RemoveDelegate(pType, Direction.Outgoing, new PacketDelegate(LogPacketOut)); -// } -// } - } - - private bool LogCap(CapsRequest req, CapsStage stage) - { - if (stage == CapsStage.Request) - return false; - - using (StringWriter sw = new StringWriter()) - { - using (XmlTextWriter xtw = new XmlTextWriter(sw)) - { - xtw.Formatting = Formatting.Indented; - OSDParser.SerializeLLSDXmlElement(xtw, req.Request); - } - - Console.WriteLine("REQUEST {0}", req.Info.CapType); - Console.WriteLine(sw.ToString()); - } - - using (StringWriter sw = new StringWriter()) - { - using (XmlTextWriter xtw = new XmlTextWriter(sw)) - { - xtw.Formatting = Formatting.Indented; - OSDParser.SerializeLLSDXmlElement(xtw, req.Response); - } - - Console.WriteLine("RESPONSE {0}", req.Info.CapType); - Console.WriteLine(sw.ToString()); - } - - Console.WriteLine("------------------------------"); - - // We don't want to stop any other delegates from executing. - return false; - } - - // InterpretOptions: produce a string representing a packet's header options - private static string InterpretOptions(Header header) - { - return "[" - + (header.AppendedAcks ? "Ack" : " ") - + " " - + (header.Resent ? "Res" : " ") - + " " - + (header.Reliable ? "Rel" : " ") - + " " - + (header.Zerocoded ? "Zer" : " ") - + "]" - ; - } -} \ No newline at end of file From 111cb9cb3ca0669845319d1e372d0d0a757a3db0 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey Date: Fri, 7 Sep 2012 00:55:56 +0100 Subject: [PATCH 14/57] Revert "Use the 1.2.10 log4net.dll taken from the Apache website which ships the publickeytoken to replace the existing libomv 1.2.10 log4net.dll" This reverts commit 422b161df04dfdcf02abbf255fb3d06f1481aa1c. --- bin/log4net.dll | Bin 270336 -> 241664 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/log4net.dll b/bin/log4net.dll index ffc57e11254ad9530867b35d15aaf38eb4747d8d..974b4939f04a66e160ff48ef5c00d2b82cc26eb5 100644 GIT binary patch literal 241664 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 literal 270336 zcmeFa37A|*b@yG<-P1kOGmnOR_Bk7BV)n@xI|5$>0?)c){27$SiKR zFq^@6!7L%*ge78i2us)@kT~pXVhB5CfCQ32LSEj4tR&|9{m-epbkB@z^YOmV_dFkC ztM9FRXybL!No^`3sg-Ju#nsPXStzY5{QJoUHTe)s-!3(1SueROen|L~Xh`|!YN zU*7NBr(HcWbwfM7s(tCxr=EK0_1CAnrY^f;s(s`2Q&(R2)7i$1>ZjS>2F=P_SLWc{MUYX-~N?}7k~K2r=R!BQ~vowcTJ5y>ZER|{)j$Yiq0$kGW_{Cvp-sdMl@3g*wJ+o~*+kalavMlfjVRopJ zY!?0p!t?-R_zH1bw)pUW*`WhACMQmK2Zgs4>eCxSrP@`9vNITF00bkF3}*GAm2f1u zD4h89&Eyaj5~|}54oo~aFw)qxPte@J4arp^C$xrz(<%f>_2kef)j6wIw@rQtb{FdX?M;-`jSvdSBZU+SE)BeL`j6$+b8D;+pk^9Ns{^bO@x9T)Z2aanDww&|dZgoSJQy{`&! zR#D4U58wN^73a0B-gWiNVW>wlRF@4-EUUMYvB9zWJtLvgFg8$q%hn9_Mv54lkUdtP z+_9`aRv#O@>*@zj?o*JQjL%_{O# zcsaB%FNb@0dCY05MhNHg?+*U`HUB30=X~|}w-Wwu{uzULsy*5}1T^`F4%y!_+SjF? z2EVK6@zqdIS3)0h9}E*Ct&=P1B7)7)R7AL&AJ ztO^ zst1#g5JK^-Ia^~_p7rEmUU3Z5GcqySTG|-82Ys){W-&CmV|1t?ome!y=|@>Tk0%ej zQ#rC6o6wLcxZ>@K_K*GZmh_iYz2CliW1VQWYEB8bmSLZt#B;IZgoU--3@$~>j(~YH ze=m!!Budp|N~Uv4^-X_j7Tcq%$vQ}hFzHruT79jI+lw+pcU}fUI;Mh<9_vC3S(#DkT*uB##ws|q#jK-|Ev%riCrgVYyC zQe;xK?4~Q;Z|&p!7VZK@p%M%TBxgWNFbd6uL5E5(3K>i#KwH$ybQAPWod$;=9LVHS z2}zb-g{?FUIA<^^9WS+OEhelw$MAGkM~V<_;zU8eLetZj?36yTZZ=x||9&upB;ZT7 z7lo^BTvqAmnI4Q5<&u@1+x8>q0>5||jpnxd6eThZ;N1#UI;twlWKnl|lwn*C#%4X5 zuPMeToB4uwUcC)!B>YJ) z$73Ak+u~-2azl*B!ZFzK%&sniZOE3vT~DGkOBCx_ zH;SFAS{TPlTdNf5YL8{o=f$^H-4-b@IH$T^P#s!_?j7SidSmT-Fu;N^E*aEPQ~Bt` z(m$f*^~jdiDYOK*$p0ivW<)F+hIPXk%!UBa}dlq92jTu^fxNW ze#Y!doAt#Tx_Fy4oISidJy73TW#(wIb(iaPqPs7TklT&u+u{wB?1n;CAGeJWMu-dB zqR?CzJjfD^LM0dokZy{k0*^u^7;j4*QD49)RD!{Q6&@ZX7==nO5sxZc;8CaqgFhua zJW4PM8B8_oM3#;xIn3I2rK1{cT;k8H|3eMCh`i<$d6TE{E~B^pFfF5!{t3Tb(MQbb zhA4TW9u&iPtP-BXbA{28Y_a4HAz4v0w54{TV2Wqb#OEGshW0-q=X&xqvtqLVjCTbQ zt5V9Rx}=XU@?BT!&nF1?-H}5G6Jg1QFt)*}eMVSvk-w|Y7=RI|h4>{dZd~nr6ECck z?UXVpTQT9|iQ_{1Unng?O_reUxD52>jkE^auNuSv9z))2s9EMutdM%8av5%tXgD(f zNHx3}?Q}a}kjH|tS;3b*Rs5`{PjDV=q2qx)WW|it)8jmLkov;K%slUbq(nilUa1%l=x-bqg&*Sg0~fQqOn zYm2&9Q8F3Uq3sh>@z{;hQ1f1Mm-U(`gBO*aK;q(+xg`ovY-}Ip{yELa7C&60A1BGlV;i9nl zj(}=F9V4e}P8-18ao_q(o-|@)kwqcLP?Y{&!szC>pOBGdXWx+?%g0pa~G;M&{am4Or;}p zp3<=BCe_xkNFT%^Ey^TEPE=ub$*?z##&FKi+0E#_v!x9$98)2%*h(-zDot%@It<`P zX;a3MsmzX?6qfAp_eywMSn{E4_s2l^!WYA4wHfj5NOB=Cxt zK4v5+u^=JNO+2_tBTvo$fG&(J4I47NOhN<8|;FQ{e$Uo7K38cQp~Ihras}yz0*qT`eXkr}acrqP|HY>CI;(e}j z)XMCLqGXEPKGa$#j@1hLK${tgC@(}MAZkNS)CmnuRGdZh9HL-!0F5jOWW8&4^;pgA z$l%zZvu|i@u+X3V5yM^yhwd`ro1T;fQyQvRbzDx>??crBta|7&+-~0>S#JzW9+&Cn zePPM{VGtGI|Fz*6cZGALH;j%3#ts-T9jb)N!1+4{kdXeKGqB{gfe8OE;f2o{*x&Ph zZ(zyKviN%kmV9L3IN`Ym|7$-4kk86aboW-P+vUC( zLFw{T26L>&vI>D!WdWMQ5-nJjS@=K-mGDIv5mdk^RD!{!79LSsz$jFLp=`md?}1Us zU@GBm=%Q%mgQQr^CJw%8mYyv!S2`jcZ)YEjlhrLf$Hec%(_v<5qCP!0risi_nu6(h zF-_!^(iBY3x3p@Ck~QmTjo%IU!If|fw2@h~DJfF6gV$Y`BgSSWc`|JQ6UwBcKqjqJ8yY$RVOoBO%CDy9%1xx6)o{c> z2rz=Os|hx-PE8%eCIrs|?nZ{66{{lk+b1;AX8=|=2aPFGb9jAlIy$uNRw%?mtQw-f z#Dp|AEvdJsvH+yv3W8(>`7Pgyo$U=uy-2kQt&{5QLo;CId{h>gn{%=^=VA&Krbtz2 zZD-CPy%@CXnwytouZxU5PQ#L58M1mXhti9|MM1&PyCfu+fU2He$}ckn!}O|`*=yhY zl+W0mPnSxsqjA4jnVxUVp3Yi)G0v*E%pV6((S{W2TWg@nNH>n^fl~9orBR>|QC-Z#|O?dx>xNU!wpk?B?bl2ke> zE+%*>lNbAh5iM2xJvPS^saVmQeo}w>s^0W7`qTIAO+U9kech5?fD7gTO!Wd>G6!IL zFTj-rKz-fQz3%v~w9ICAyEvK2BerM7nQYIfnCoajl?3Kl`>V+QX?_p6xDA0-Bkk)b zB~FRY+zY5-cr}LP383R~oF3V--nu1sqDYnQu|$UHS1bTkEdzaKA)xdoN-H2)7r2Xv z4Vq`2zi<{)dca@i;0qUkVl{hm&qKaQEaGy(|Ias^G@yu`uD!q;zR%j{x zU@yzkpWc&RVdQM%4``_-uM~w|TJ;`7a%&O2z9WfF?r^~xN!8jOv(Fg%fcKfz$1$+r z5Dh)?PWj}H z0J6#uEe2I5cX)brrz=^e3^mC}8KX>kWnnsS1T-CDe6OZ263>|rkB$t={Ha2jd&O8! zsSM2m{?tPo9EUoNsEe`GohF|$@tB~Tcu{TS_Yps7Z5Tp4*;6OIW_>mAwuC)&zWN%D zwXeBx727Xxn9(`&W>r-SK5F~;Jt4Mz(R0_;u_3C>qbpvwzFNqM6la$VFxza^P{W~m zPtX#D)~I+tD7b0N6`3k2Q>;tf?N5t&mvXbPhOM%@lg?VpN|pK+Z*x5fQrO@0G6=7})?n2Ltx0hnBmp?j?lT$5;+285KPe#GLn*4&dI4 z)?C&LDVIsg%tlpH8TnGtxKJe?SYj+4Pqqo{qSnN)4MUMweOCn|mOc;RZwSLSswDpp zW>*dSppv;NdP<^(7;}!2nOz57D{I8Q-(y=i@FH`o13s^(rgvIn5TCX|@8Jc#uF4MO zY5{g8;9Wja@j@SP_GNOc*KzYeXCa(V%y?hhgeED&pMG!F06l&(E9 z9B!!Ifyf5h&njN={BB56YLyH$Lj5MUZSXdetLy&8(M+9JT+l) zT^S3-iARUIo~Vwdfc-oy^Z1U8M?DmH-R9$gbaB3ThL@0t8d!f{3$WH@l{^EUVlip& z&j=Ps@dcVGZ9ond(L1ri8tv~set>T8Bfi{D{C*|yYI-6NagHF}MPA&}bqfOE83N$6 z%;6oR?w65jYhAL(k2ap=`}``|s@G{S5$ds-TB%nk{hvXr=lpx-HXQ0p@#53I84o<8 zGeHX|LQ_ru13Zj8e7%iXoA4OX5Eo~uKkfA{DJ9Vi6iVCfB2CUcrp#yl4NP6d=D7dM zXe@1pqnNm_Z@;kliB6-|`4}??{5$N*yamt`4Ts$_Rn1wMYh%DKLEbFku7lkBy=FN0 z@B;UCa5FNUi+kg6tfkL|46;f#%W|Bv<-g}(&v3UMUErQiW`@9p#Ui@XYQkbl+PJg8 zKF3UE;>R&_X|8I5Uim@o3yCbXM`9l|VwaS+9kLev)%$$SFT%h_!7NN^4g3Of0IVi2&fAfs$9P}TLh!101dwC`q62d??gp^)5U zZ^?J5UPABP9I4bBQ!?Z;OmQ?_myC|dl-^eZ91)e!)6$L02U&p}j-=cbckaR{FhEvx{RLcfN&bgw`r`RAb^jtU zxfS+kl14e%#cYw4j_6EYOwtHzm`iOKOL}P-Ti-aw1`RPHVdh5OnXN}}IzOzv^T~)* zmTsc`3AnsxY>@t1W%0J6JuzxgD;tDXwGZ_WyK#hys5Q1^%S&<_Xnj{rXr0Q2?oB6z z)g{y?c+N8Fw@1`DvQ_gT8z1ds#6nfs-ph@bLQfteY9p6WUu;W1-$q00FcG~mPkI73eyTiT1-6*lW$*!$!H|YZIn1v z9Q29XPoX`tW7;QVh^I8|Wz!jkXN=|l35(Nm0o#el;0Fq-$Z^?Vk8TV_;f>Mj){~d1 z{$Y09cO0okr5#6M_UvV-fl(KQG(0vu(Y_f%_lymrrmo<_E7~9RsFhix7|zsm*mR!W zJwLCK$!j(&{}*k`)Zg8qGcs`Y2DPzy$9fgp_jioj5VtS3G`bGnG~@O$Er!;p??`J) zb@y?lp%i_*&0(*u`Up#>4iJGwuNZ07R{896(eEvD&1rQT_&%jx z^8{vPX6}ZY$*|fEUFWTRFqtK;)KWGr1Csj!u|E;Q!qzHOvb9Vci6%TehmpQQXE@H{ zi*Z}ZW@vW#`zT;Fis0g#8Q0>sa#zxoPT>6Gx6NC#@mnpt5&Xo2Dzg&6;VA;5CWO>GO_b;l>a~TEG2aTI{fU{55aSRE!IE(jw zG3P3+bcYtqt0q*cBn|_LoJl7PjAmat^_J0c+!+Ne_yEpRpL1c_DqUehPABwWA7w3^ z3=BSRrkk#JINp)fuW%u`B2&!Pt zrcs@7Q(?hqenDj~wz6#p;Kt>Sc;lj2xYUUroVu?E1CaIfXts-(!6-2#+gD&^|C)G@ z+ACfg8@O!Iw~SXsTNgXnGd|g62&5q^;}J~DD`8ES0f}N5eK4%0gQ|Bi{jxja2R5V% zAI{}Pf4>HTl2PIW3LG9x4zOpsMEVn^AA?<+O!keX6*e;ZhoZEohe9Qr744cTRlq1z zf;rLop=uT|3YB0c9ER~&2}Yq343om*tC&;ZQ3x3Mm*0Uu=nF8}cu)x3fMFZ@{7a=p zY&nP~nsNce#7er;xRq?+;a(`?Zzx<;mg9Rn|(hg?IyAAAga_fJ7eaSF>N+$ z3;c=llCGtvQ@oqaea-*a$H#i-&&=%VJCP;*=tTRRCHQKM$?BfQiuP6ZzOr@) z5**mmSk=DPBD9XytglL6hhKz9Or+5U4}?XF!|@vcH-7`9r>e~4>b#>q1&^RoQh&Ca zYi*I~l-VVkOTx|;yTRo`tO)JfD7M=EHotzN{TlC&N+;jki}6~>>z!yHFeaa~Mn%SI zE7~`DD67g?Eps<(R+)Hkq3VXT=4LfXU{c;-70|MqOig;O*vI*NMb2#H$L+0Yy4PV_ zSu2o*w*t>T^J?mwK1Mj^6J_Rb^&VmyNRS-+TSpRas})XjtXVr??WYnh3E$ePO9*wQ z7#Gf{EES`MTz2e|H7Y#!C*3wDgA6sy7Rt|2U#a$uDPXcnT?#7{T5h{VkBRQ{^hkb} zn)qP{*Zi^2z8zM#Kg-X|Ye>9_St@0WePvyHJ~&ZscJ(w7QRxVMwKll8wsJ~XB!1(lwjm)Cb0IAEIWdMsZRvTD=o!lx`+ zWTmeYF8IXxv^-x%aQb=`nC*9zJrHdspANz=7yc`zd-XZQ_aW~_!|51EriK3RgvmAI= z3F=JYcN?9}6Q5~xcAig7P2Q+jwX4wd(X?~D#8r0VZ9Tk<{AVc-3bO-rY2m#r!hFA* z(wg<;Jv{7WlD6CaF@X(C?N(Q`2G)#Js*M$sGw&s?`vR~t#iMg723$U=vXSGJUVw%& z?UhSq_IL6-l)jI=$@}?#JGOAc_GoAK`)=bsQ{hC_@~xRP8Te%mI9E>o{H7J`_3^&P^i zv0;A!Ui@$Lq;o6ruG8YgHYCX391brV1XP&z!skjyWn|2D@SNi+22WoQnz+#s5955# zA&P(}MXfLlvs@OfaQd^eIhx7voV&wenJgYh-4>RGXmnY?M+N2;iMNMk zVRG8#A*NgHBGYLfn7cY9xsQ4{Z}>euZL;%Xu)_kHpa$a#&AULIwY_x*XXD$R_34NO z?_3_PLe=!&S$nkg=|0;vAMBj9?DIwE!&u9X$lMU-YuSp;>3BqI*-vu*6nE4V1@y0F zDoHMZ?$=wHk3quJK7l^>NU*0P=0 zUu!M<5#WDBYuT@-iN6FoE4HZHeW_mk1k3Gu%^OB$!x|==&TS+XeSku=|58N&AWy6%T9D`dG~R7yNiEaXtBfdIlr8qhBV9RZ7w^ zQ|kWHA>h8CpeLKKehwhXP5doBe~f#XL~jVEN_AvhJ8r7N({5v2|O#+ z7?*qyQoM1=Jcyd)Lqu5zDx092BbrOYAa-ZLx#tf9^<<~jnPhX%8!_(L-18zj(cRE6 zvh^-ttGkbxXZrbB)!oPTM>G9=$vl(QE4ltBPFBb5KsH&;L^V^}C-fs(JvTreG^_vLyGdf>*2dR zFA^WwDB&yE>=qG3en>gFi^9CfO7c?PnbX=vDZ4+)&jrcv5W}4#(J^5sNy1TOOvC(+ zqNp|x=4ysU=xKf5VoB7G_OReL+5Q`>fkZ7l!s@siE&>_GLOv z{2Z@ZHzp@WmsXOGA(iCg{Ad>FHcMD(X!;UY*%pF54PU3W9ncy|h?uO-B^qfe1&w&L zk;aYVbIGKu{l7w~NGj$*PIP`t9)&GXsKoC}9fl@Sf>EdhbD6`?Z~6 zEM@9xl<1|05|j|7M8MtecqS6`uK1De7AZV+r1&N3=<`fGZQ8Dmh@N zt$}%av>j;apOLLuN!~<`IydrElDF`d-bd_)FnexxTHU7;u}kewiuj>PFWL?d?ipIq zUb|eeD@(lJGZb6IkWDK#Cg-0c-Ew$1cf(%%2Rwz$R83t|nE7N88)lEnri0suQ8kC?Y4O(F zZ4Qtn-Fs-M=Hj)x}w;hthuGM^N=Ve;-V(koMy3NG2}6{xh| zK*`CcMAh$GMDl69@9|24C$o)LcpJk=mD-p>rFM9w!>HV%Ju77Xt7s_vSMhH-?eZ$) zU-`C>j?o=ANW33Hk`M4RQeXGD^fS<=ljEPY=enakqS6r^>ZI8Jqe&$TbKl6Zx=>I1 z%y>VWogyj5q=|sr@1xQl;JzDQMD~u1Z90EIVMB%5E^_e?5BIC>h1$juw_Z?>0bPGN z(f){Zlueao)nzxO>+V>+M|sEUQG3VgroPOc&#%89_+YqD^3`nV+a#GvN6d@|rzN9` zeVgZL&VOgL`M{6r^MOAoPX2$?2d>)vmxov#Cbl#y>-^Nb9|*!ceAJ9GlRq;Rc(DHGJZHWLbT#>sA>TAj>V1~#i}_!toVYUiOI}NxGos()bVj^e z%=UFu->E}y_3_2atTtk-DQR`lFGrR#Q`3A%FG z=E-E;SFFtL*BuD-2Tj>X*~@3@g+HdY{uca|_R*m0{+(XOyMM38?yo{u_a}Ot3gM06 zn(ja9eWLp_fBcgk%e((ekCok@>oM8=-~RY#fBcIc$y%elGV>2StuWQKPoGq9p_dAk zVD@pHQ@I6a4e;3GtIng2CD)IyiTV7a=QX9=#@^lnbd7}*zU!fN zXcj+d@vW(h)ehHMl7(Y>;cL3?btH*`ZiUKgb!(__T&p_)3-B1DvGq^IVjeI>blK$?83fOIx++1gWK^`06A!?#Y)PRJ;R=c)XJae3Uu5yN0<3s z>HIx2XQpyyq@Lhcf|m`k6eVIuhis)}q+u&khCP&Zx0q=M?O zs4<*;8zOZw#g?n&rwQQrFtKcqJ43b4^&SJ22Q{3|0+%5f2}I@h*$#5YI3C^@hugVh zTsS@ff!W?zg-d&5+g#RtL&G_-36#!>I#>R2s~-$;eoTg!yusH`R&z#~r9tV5`gQ4u zj#Wj)uy(a=8|m6wU~-B&%|)#HTXd=Iu(snc->2YtH(L0hk-JOV--XOQ!;|t_d-ZJ( zyLN|HDRJfe3b`lS!|Pjky@GS`%%3^^0i>b9Ps{2vH=`-MHNy5v=%{qm8}>7l)3s)( z+RreMyb<)PAdJiAbdCv2&hj=Y9eW2UZR2_JE$MP4`K~|UDsxnR%Pnink)twN94aWc zn}*pbv3bsAd~qA`X)sr|2({vW%*(3K{t5Ip+J~&pOwi?KQCd@3$~SsbDvjiCMOUdF zj}0ToW%U>ge}NLrs2+@Qq{1w3*TdF7A(n_A5JAZvhX)TIbrvN3q4Z;UJzFm)19Npz z`y75fod`W*v%YhrYA=l)9+6?&Nd|IAPd9Qoo%9xErKHm-xYP?Rt1V?WO|OcXgfnW_ zg!YYV!VR_dpYiKv*?6+`-&JWmugM)L{Y{gJk+?^mJM$Q-*`0WjySd`Ty-jgk3LuVW zHKUVnozC{pavToakeR~JqGQXfDwLNJR_MY#%TytOULoedrrHiFKk>10tp;6#lYZFa z$sS^>d#;TnW*d+OOB;}&b9VKH(0(~N=4f`@Xys$UEyy@re!edb@O zAnHU|$wRfI4w1?+DTjDEXc#Q+|EJ*Y|pTgZv`5SNn!T zPWO8ow8w>Eulkj-u=`)(wIp0E`m5%|$kvwv5Gt11Fz2EVW^`?dixc}g7aP`#!Lk+Y zvps5M-57YKhgR#LM{#84Rn#dO*Nq&l7-sPN1ENqu*>iUGHx_ZLOk;A#NMp4hi6DC0 zm0X6pJT7I^KMn@gl;ZwR*JW(4l$G8BOpFq)m7&Ugs@!=ph5kOw?8ad+w2nNe z^i9z0mS^Db{{19;OA39)wj(vI|Jet31Vrr9kZBiFIN z3kNNBt=GLBFGenmk+MFK`q}1*mYba@q8O_SGkoBA^g68D8?;|>>&ZaQPYOdi5%1Lc zMRS>@wB-iOcAQ^P3-YG^3J{}ytXL|mDe0R%YNg|mrb=B)s|i~_Lo3Mc+?Nqawy46o zHVL2CJnHDhx$2t(#|?>B9?Q|$&ZXS_b@b>`bXl=5F0a@Lj8Mt zUs=<{sh!js@}&f`^koHQpAnd7$CuTb7Pw4G6QNjNI!-yXW0Y!*|tHE>$KAo5XD z^Aq`ei+3XZ^n~q=mk@?S#l)4bxkgqfoz z`(KFosYl@FDB=L|EQFswKKVyQY-JSou=0Tj&I+^TD+xw0=C#D&jHzx$ zb?efHBR4Yj@_!Cq<^mGt{BpcY!(@U++q{fz7dmC?y$!sV$r+r)<}Gsl%~lN99-^D2 zX9^}r}J7iO>r zMxnVd^&S|7A`IoYefPce+NPe*mv@~8)v2IUp%P4_bEpSKp}8=_JunKDVD|B{#J8d> zg-S5H9Y#zoU=#vIKHKk7m*)y*?w1i#9ZvL9>@stAYQ$jR{iMEBpX=WL4N}_c(^#$>Hd$n%`ScW4x!d1a{lLcdey>DsmCp< z#|&PmF0+xm^tBN^ZH6K@+PGMDH@T(!yH$vZYVj@o4~6gs|5HysYeyU(Lcx@iXN{(_ zB_+P!$nVU50h9jHvbVThS+FZISZ+;D{<}z@`5)d#8rAecfpb@clyc@*0-$Qdqys$o ztQyg2#bWrjodU#I21!h()J+Ja_+GR9v@+()6MgG7%=4Dytx!oPqW+Ebz$i2qW@!(M zLUUm-ilwp?D#1*+{*Cv*CWoaA!84NcIcR50@o|+fyE5M;&{mVonpD(UXc zxkXHN*V(w(!=K`BlM+kOkgoJ%zIllFE!(YO)!9B?n%`ddnQCtb#d)_=SljPTfVtQv zo!j+jYn5tt^w-{BcN^;R8`zDdg(wl@eUFbVVY|kbt9-qjT`b};(>~e=uTVNAbIba% z0%V+zHY+32gW(eL>o4vqUI`ib z)u1aT*UVt5o81+P?dW$mX1-aq{bDILRYqRXtJBdUP!940P~+Gt=i%PuXtHtp{ybo5il}5)j)gNf=e5>H1 zWU46!mrrKAPr8(1Wt+C|&NXloOpkNCGyB0^hF+?meN1w6Xx(_`^J5JgZBB6Cz>OTP zz()|UF_B9O>8x?-jOG&a$)M%ryc%GKi^61rVh~|4TQu8>bkfog9v7#WKFy~>w(TPf zBvguPVp#aK`kK+tw=Gh&7z8ED<-)VF|9gC57$51#7cdx z3!~4@zP+T;Hb@{Nz(Go@uRP#KI{d8G#XJ8R#cOX)+mI(&%YF0 zL5o6m6m{C*?HmM|z`>1jA%RKF zdq8O1Y&RR`UPIry59>WG=0%87(M%8Hcc_) z|6fkz*hpxb_CzY-exmhffO4v$OBVy*f1Cn7w~DG=CiSql;%g-@heal096;m~vrB zEiqNp1-ZPN0-G(CtZ>xAoewQ5yM&j1ckj}&>uWg~T-6jrZg> zOw|@~OJLYaADv(vB8oSu!_olE3J7p^-V&=sqK8Bby*nawqI*ZJZJZ#+9j>{hmBDyh6=41 z%lRtHTV+3{sr{H1)6~(-Cdrw3Q=Kc?Nw=Y@w}?rU-o|7z{nE^OxKtcJ(*mx%G0s;%*SX4 zOP2=C?5Jyi9$CKidgR@;#d_Bj-*s(mny&4ENuQHrl@OdP)ZEM`Am~=U|;(C(&&GNL*A)pE;8S zVO^$Z^ZWPA*5(DW61;C{pR!ptL!{_-ie@oRXtq|wMA1`@hvV14OTd|i zzC89HbhL`F_MGt|@=NgrFBFQr_HZ1B94!6&IIzxy4B;E zd57-(*bf1`TlHvPcPMnFQ}|8o`*?M-ZBah7|4R|-Knh+uwam+~dFlMaNOn-Is*g9@ zUrhRO?7?foAOk`@ro=uaysO&V?gC9gx)TV?R-;}BaMU#|)KZVQZO1OJ~Iw!J7^@HXCi zJrJX4`qe#5x#=;nh$yG3)7|Ic&gc1Vv zhtk=G$#>@C0{d`j6Ir}N!bW~eL;F5a>I~lc3F^%z(`>pv(PX82yqi9$d#cG{V8b_DgOBqKFvT4WDXN;OC)#PdF2J_!dCEr<-a;@xb~Cv9Ur z$$ca^U*_sdg{l2%(!K50%|4}%Bd-)CJ&Kp8^r8bBwfe{mHnh%&5PlZS)M9;TKLA8b z@M)&4k0XoZn%OpvZK8zf(I7V~nAthEMa;zoZs*=6&uPG42%wN7oD zZD?dl&Gs9!4GmP9%{L#1iam|Fw!s#{+W#sVqv_qM!JDfqFKx5Iv->fXd&f~~@YWFX z-8XS+*G3C*ykdKwqTgH#Z-vg^5uH(>SZ&0){^-2CtuF>5en8Xvf%g}Qt*3|f$&b(b zpS;*;YH$2lsUsvad#7I~==QhyEsyG1+Bbz6X*8;n>Eq#ix}Be0>V%{%7uu`REwHSPt&skf@dn}bVB3Hm(QHRvr9jj z`7Tx6L85iu%nmXY(LQK9Dp8;0E9OAo@j+Ozhtr@JS}Z%1txA&i9?pV_^LzX#XykoI z=%;=`Q(m6prE!$be6s%w<(!Q_X)-VpT~(PxsdV5ryNu6*m|Yj37+r-+31{~vNWO#l zx0Wh)2(n9kai$SI#-ry3rl-OdKZSokD&gL1)x1~6f%H;JueM)izdz>Jwa>0WKxODd zYwc$qBL~l3O_9wexOe2dW1?PXw(z6b9WS`#g$UK$OzX?8ApNzawnW=yEc5_qv+o=& z$}hW9MXKpJRQX2Hn|WGfnZ#`)OSL_IEM%6v?2*zflRAbH_Z{vR9(zHyE>H~@XEa3D z7KG@ZQM;tVE~H)x+FL1OUMjdM%MxqJi&RHu^m9ST=iYf{A#+NEKDrFu1iDZ;ifO8 z?sV((*8MTz^v{|7ZEy-ob*YC7el--qerFNdp+we*$eJxLC6ZeCb*BLFAJDa0j zf-$VlyaTqRZ#Ujd8yXy(o|dg}Ii)DTQoyaYO}`@tWh}OB{5S3#_&l}h;(TSVcvSx< zT0A~lt$h(XQt8<1+!pU+Shcg)ix1J-Fr1@Je~OH;O=Aj#Ah}!3#1HMM|CcRzLn+_h zY=J8No3;hwuh#vey{cJbo=jezQK|W_pTYb$mS{8=si$_a#ae>Qh-zwPWLZ78WRlf9 z)GN=nE+vHaPvKU{fA$V)aHKZ6*mhvbbz{P(x^#f^LBDHS70;HiCt{*~<#B4r*_P$^ zdMIvLe!xRIR?^6hm6V;RN=LkH%(ZYXLpF7=QC4WanfeLDeSOmzWR+)lYCv=@TAW*{~@TqB3ce zzv$D*D9reZ;J)t5WgirBr{4ye zjCA10m06$1QK*Tw_jz^I1>ey7yt?|l%qNWZgLs>pzt1z)7k%EVP0v~TLUC%D;?T38 zHzOlKH z5P{qAsG}ae;-oCPToYF~HdJZM3E&lUOeHNeSHcobj_Rh9Epp|u6ExdEt4oObGr8tr z23}|Yc4Ec9WE)z~&YDJ1?s+P=XfH*%k6obLPkFiQEyBss@tq5U2{0I4iVJLqR}P;Z>|iFp^c;Wr(>J8(!!W{ z1}6tTJ$M$;+w$lWLotZ)cpJ$$?$I#lac9}|+doi(hug=W+FKZG_f@ESNhqxjSzFeo zF8)^V??N~W~^cEZ*@mue2-Y%kJc&{)HELaW3#U|iHP%tgviD3P-5m*PbGt3p&`Ys8}A zjf;nS_bH2(ZGR=OadvC^8W`JT)W2(%_q5X#dvre}az#>a*94z3)Rj=8#(0Kb3 z1?o^5?v@Z!CF#k4>B;lMqL+mY8%#IG2S(QUTp?dx8`yYl_Wr?vMV}m4D;Tx)50Uq6 zB|YhH>xECyrz2enibWvWX6TME#GQvMJn(EY& z-*H9P;;MWNk1oW!*ZRD(RG+0cdwnz?Gw-OaNH`ml=@T_JXgk5~OQ&aGzJ!U_(*717 zV{{a0BOtBEpDo>iSJ`AuPyhM_B;wt!HonpLz1yA5qbY((FJ|$QCqqQ{OuY|w&$3eW z)uLMRF5}0XJvM@jH2A)feI&0+N7#De8y+u|^Tn6&_}%pPn%r-s=hR$H@-d2sZbo&w z{6g64_RD%-OM65TmH?Z!VG=%MYm;+nsp@;b;SU$W4W@eXaf%vgaYh#I@ae*{qK)^H z=r#`|erv2}rrN2gIyIG8w}sNPx>v&Fy!mZYnhk1I#{4ic-c}6t^gYgu9pL%Kx`xb{ zb%x9tlOkEb^QppWIiIH0o&IVPKjN3u{xs4KF`Q(fG!U|wp5#kZ?Fe|$M7%jDL&f~T#?v1w+_mVu0$>`eD-4_%0syvQ4>DtsStdg|fn#VCkU7NaL zjJWsbaZFOzrY`v@-O+t{9P`z+sWU%G+!yjVX02;e+nGgbe=Cn;65DTOYyWi~$1HY? z`=>mPY3$n66b88cA9);;*)gtmcE$tdwrf*M4gzjT9(P(EH*^lx?>hLx1ze3y=*jVb=h(eK0pqb=efC3) zFs^K-4Nat<1BvY5pdAX0Hb5|>T|JC7xTO#kL83DM{eT40LXBqW+L$ZF9qJ(Y82ziC3 zN6S!Ujf!G1-X2fA|EQp4=FcgRNdekj8E{*hG^C`G<`VLNO zDiUA6r<$to@Xp1)ZMrgWSXzr%!f2JJ+qvJj<6Aotp3M(|hl1zFv)p?rt);yLJkbVE zCf|3V&0#!RG?(#Af*Nsg6LVG>qQ#)<mAz8_!1`C9s})7-d+M(4~wsjBLD)fN|%Kl%=$=dP<`LsXkbSG;b0 zwa`qPIJ;zkOX;i{YB*Hy3A)ZieKzk01vibkB2y)0igl^G{b{ilRBjeFFi_cD%68dU zuButk$TW?vD1o)~$URSt4YiuJ7}ci?kaJOFM1*end*y2dMm8YhLER78L(5%P_Y%SZ zwpb1+85KPeYD%XpIRt*Q4_jnT@L28cnHanrev$>H)IS*^kmBxTwW_0(kmt zmZ;QssW(f%jPN&v{DP++?Dc{tuaz}oUz6Jw4!p?kdE#b!PffpVjlud0Z`fwjo|y5B zgToFuxw94ROw;bjt(&I!KInr&duA9H)OSrht9YGmMwc|Pf3VgyPAG6Yb1OOvs!cBeaUL-{>4&Y zz1>s`#^!CO!dd>@-g)}{8Nvnfn*ma*EEV`wD^MR1a2$VS;c3wqO%VL>{*s|Ibf@10 zVi)b-z2;YBBP7N=Oj7AO*qwS*z0t2OFJnW9B$+K51;6t@`Cl2gPT?lMPpjHgy32qK zg5gI;Z`Jg(#t#_g;acvmI8R(YmS%+(ZMw$?5w7&}S%J`y@ih7%mi~pFbeC`Bm(!9f z%$Cre8i5Tr(C%(B-l|?kODUljs?dq(7dg%abtcw7*O?w{3kPD|^8O(|KR@RzP|gGI zGn|J~u6`btdHk&`y@vv?+k8Bb-pv<(bY-`OLP<03Srr_H3wEcYEk-mlg|CAh~-}zqYC`LAmrxzGL}Ea*Y>wi zm)dx;RIF0E`YSZgeS)4{EJb;KVXIrOzWOlT|oa`s&4U>F|Y1>z`+&#;#l9(K&}&w%1FF*Gr4n%Zk^h@+zs@3i<27$Av62kksVbMYc#YgLx4F?n7KQl!CXJg0bl{ zADSfBa(Okh#&v^S;FukSG&#MY=ufujobv2Tdb2-7-p}NyP$DDkpF~+ix5z#MNg3O| zsn}s7OnWe6J#=R?yDB%LgI!gXcTt_Ca;agAv1LwU7j1qx1-98Wjt!^qrKu|dlMTDt+_^+~+0sB}~!Z!6a&b`>$Nt12B~LO3%lx-i?r{o*k43ZJ+CL`c9%!>T_H z#?4&8dwL~5dGwKa^i_(MUCrd~^YqF7K=jBl#vf3`SAxi~eNS=gulKjbVqUTp=t}x* z*>NAIE|jO(D;4uRtDHxD(FaUVolX7a^lZB-y2n!SED*EoV?xWe6>;8n*M?8_pgb{C=OlREwg--*P#Rd06EXym*Lm zo|9EcHdKB7hov(nu=M6~8Z$ULi@<%_GWlkW_K)3!>CRh8=Wr4CCR~nV)3hUSeE;-+ zs9AaiF%8@1Vz2E3cErdH^>!Ab34I-NKt;W|TqB|k&aR&jkB=Su3UKMrlagm|XX zZ_{J4`%*m$TrW~^@nDygG9B75*v0kkixs^2`TP!c>E7Zyo)n#04A@15-D?Pk>3@D$ z#YFUjUE!^OOeAsp1*5Y;t@G`ZY*(f6_*gm|uO`RDP!%7KwK4nKdqGBVwfzjS8_Jp` z+N-LzR@-mNW07AT`w_)nr((nfXIHiTWfg-; zm5WiZOMyAi-{lC&pU3`Z9?Q0$Ja*+y5dK>)LIt}wlzchPl~EwrBF zFgHFKr_+61D!wYOxbj{L}7Ld2fCj~d-K6mxing2Q#p=+Wj?M}5x!l$RHn(m z_dQ(}_Ip9tqH&1k#&k~OPfK-_$>^;k^D0*{%EKV|Cd>30ydgG*O(bzOoYlQ<(OqQ^ zEw+SMr0b%^h1n_UaNq^KbtnPM=4|XJgRfjdq&jAHvLE-AADk)r&!T#Zr z=X-tR<7|h}a+{Zx?XQov*|?JFYwcZu#E6dGbNg}%xc;mpPuX#VMg3UmGXxz)HCr1h zofmoft^_=N zCOi$^O~z;${VZA?V~n=;AEDJV#%OCdFRu>qfC18*CH8S;a_Zh$J6Y0qg*c91m;|A^N^7LwQ zo>*Av$o@q+mgjhq3$m>0A6`ekvaX2uIl7X9O}&u|{tQC0e;%6Gt_#@hy71|WF0YoO zal39Q{SCn*BM%g?3h-5S_qnWQ<|AuN=KUV(hEZlux--T=>{ggk7VUYd+IJTITs-6u zi944VYiZx5)r&cFZR?kO3Mv6_Xso&z#26&*i%Cuw$5;Uq?5a!LDQWCm0(fExVBZX2 z-I54F?UR#A5bKuYAX6ofGs_@TImq@Bh`uhH5wdQ31~PRE1V<=tEKJTSL0MW3D3+A~ zO%r0hrj%9y;!l+TF9xG_zlZ@-^0gwM?M;VC#Nf5dAHwlBeS9g;Pnf>4NgFHh0@88| zK@QxDP7#+@fWf*R&4k`W`V<0oKma(bjKS42kY^dlQhsd@eF>xyK|Dk9I6%^~LFLg9 zrat&V=wcUK-Uq8y_UgNB)BX-%v1HU7O|b3P`lic8Vns|!tD@A*921SUM9+uct{Q9D zBK=#AMny*ho$0f&DCST2)VTIuAEWr^5U;tu8=nM5&7)J66*R(aO6eOJGqO><*!|75 z9UQYsKV-b34h_3@)H2*LyLPPMH;=MmJwwB5%H*z2b9s|$m>;gOzpwva5T5pFgVu09sjA|e^`CVK@Wl1`L3zN zPtao=WfG~TZ-HMNo_{~VnRnt|riW{ugSB-fq_-QC*@26o8thF-b)OJ@-Uy zPoo!|a2+=vu17C~Yefmyl2?JZ zPhP_NQ1VivTu5G)wy?bZcp-Ty-@}wwfum1e1&)U;uL4(}yb4^8NL~fLK6w@Rel2+w zc>ClfybmQW+02FHWoZk`>%9xfOZgtAyb2tB@+xpVYA0$HSIafvZnm1+GUVuL576yb653 zmb?nQeex3CIr6gpuYB&tdOY_#(l_IE_-Ijn-el27%0a1gWMCf(MveNRV5CS71ta47 zU{*uV>&+i4?zh38Y-*opblZ--|2kY`n+(52{?v5#!J%wk__NBt`{g8AJ>l3b3Y70h zq@VUVp7|(TaPW`DOGREm-qOm$D;31I{0x9IZ^38mzKR$*S{hT_3;oRP z<@?Q81RUb-+pVu4zOsHa?Js50se~yzrLAY{oz&WK(VGstsZP` zqaL$E`IQs!)9Gr4eG}hDC4JqSeteq3HNPsj+bH)-DtDg&`x;oYzK-2axX$o)gl}vf znlkao#~--=^-8_e)@}0`;D1KMNMix`#$5QH0?#K2=Epze@Kne2<7+&>9O=3l22h+H zQ@6bOHQ|~IcQ$vw20rq2X2^U>*!@}ph0>JLws_h^+7%NkRf9}FCkFVd*7HUhw{YD; zt$vGe!rYSF`C5jO(n|q@8ynNl=mlc_-s^ICFRv^$%&DSB*M?GB99u?QUWbQcZ*)C6 zW#Squ+LkVFQC;$;$_C3Xn6xU%x5(T5Jy9qgX>Mj0&qE@Q{+ZNVb{K;BWjE!rV`wEr zRAV=6NuR49mart<41%;<6di>gqglyIjCryVPMGOYH9Q|$Hj5TvE$7^ntBcCYNn{RU zei93KRVi1me)wFy=1^8%N&S6e*YzT*(ow*;n0y<|E>iZ^s~z}U-=OHPbY2IXwM&MM z)viLhIH>ivO&n1MzGwI^l#kPoG-Z9-U=KOwz-hmjkFh#RFYqgbKrVZ+n zU@C!GkMNg*=~-AW_UU?7KR~;Y{d~&mdv~)vnyeY1A2LNMdQ){d5tt%BJ0tqvO!VI9 zS9(FeLUZYVOAm}fb79`v1EWx^qt-+AUPmF!4+&G7bxcbfk6&AqUFetg4 zLS2P^{v1k4KGd6o*~gA5mLY*bcH}im_-!PWIF!jQ%2%lce-tX!z2WkGdk>64vF^0D zhp4-NHy%*w=xNJX8z-viiB@@wnnk&x+r`XGY)2H7Dl!a5%9Xj7NgMCl%GQdsj7O9_#v8U(yUAb;c473m^uAZj@7)Es@gKhbGz@;>qPhcdW?5Jpofj4X8xWD*X{=`3~!t8 zh(~UZzv}Jvk4ZN%gF;qD0a%n8}_?LG1-PZVy0sir6E-5_DR-UZLx zYI&WhBf1KCD-`9uj53{;YFETmIyp(u$|s9xfcQ)qO%sPKtr%Ha(0Q)S#-sbFBX*x_ zT?TFCed{+sN+neJDS19q>Y~!0LYx}Aq9dpW(id6}p1z332tre3;sTH?a6LxRR+N(7 zsz!9Fv9xtPY2t&qOOWwIidFr+K~0g_7PuT79TjY2XENkF1ooBMmZN&Wxy)vtUId6x zJh_0{nSa#ch~Vz`fO7Rcv4nL~JC|^BbKO*SMs9Xhv$Z}{C+q9hU3{5ValDVTT=kfX z@q@mgoF9n^epHVv%`5Hy&eJSOiyxj;d_Qf^UcaAKY4b7mNRss0eb32o*>n61qx{H| z6fgSaQ()?s(wl0pNv)D?(b$-o5??h;{uLF;M9XTE?>dPQzHZ1mj=p0yw#F`TgK6y= zba35nd&r(E+KcVEvc1BdtJ>4{T-`p+p0`L`=1zTxmrC+0Yt+K+?ZxP=bd*@M7lo|7 zc%8nfI@NBx1|84t&eF$b_;Qk~)pTgzMPc^~!1s)8fWO71FYP}ib%q^8&6_xIN3%Iw z*3vXu#%B~P_PsXB33%tUy|hYPHabPkhqyWd9PE0v=cHMjcSL&x% zQbppLxrrv;v*yNICV7_Wd+`t##JFm1PH0!#x`QXf4Rm9o`w{r$D&ii)Go!-TH$Az2 z79pV*Iy;W)>kd9s_!SxjtLAy`CiQ@f4y zdi#5QP-Ytk?OZhrw$R13PEy)RN90k29i-sPK6wMbn2L+E5x!x-A!C6pYE6gwy3IqA zJJT1_WJZVF-Lb4Ac~%VS@Z?T?+uf0Vsaj{(cVlQL+0gT>bC^Cl+iqD0j7wEKN7UZCBto66h$a>-F2@%gCQ#CZ2l^qA~^OpmyE+4W!~qq}`4 zXpLg{)8jJ9~LIr{AdQ+}qD zm&}*ve=nF)y_7u6i_I-(*@7ttESPe*QeHJ5wj<_Ap?_|lOnh>-SwOdcCt-wS|Ki%u zCow>|t(iyuE4rg!pNYUq;(;4BOTz)OZ<@NT9|dQe_fVF?7Au6kmf!gmU}j}A zt24igeT)_^y%S@%sFnClFWEpVeJv1iK*d9Yr?|LN`b_Yb9^x~>^mnS<|G^UcE2!e< z8brcPgIiDYZwgn!GsD(*`MdfH#tq^7s(Xdexp^EKV$vU`IPem$NY_0tvX>Cfk+BSF_$+JJkeM@J%1CSM{@3Q2lfPm_ zep5ppE7_Z6!u$N8&-BowP%LjL9h_o4cRUe)#imu0gV*%+XjvdoSo z&)}Av8>CCQiihc0Mi!r?rj_xTAE=dlPVat=#OL+e=iOnk1T7|HJT>|%9Yq)RNTCu; zv{}Mfz$j!jbzFrX+oA>rMj6#`?f*mDmw?GtRBcz^-g}lzXJ&e`CzJIuJqaWsWC$dX z010H%u!OLg5FqT_q$gn;CJe|X`>r5}iKu`Is3?nqs0dL}gW`f{1d&}qL=Z&6|Gsb4 z?Y=!TA$*_TKTmS{o~lz-r%s(ZwO2s~&ryC(27N0Pd5#Cqf_<1GBAwVWfQ7U|a3%AN zUo6^l-9HhW&g`fBzp>(7EzjT@`6*nJjie3d1U$W;fuv!K`6OZYpAfHCnhDmrpV22f z9^KFCb3eNNS)Xj!yPwl1ds^Lp(dPjqc%Gky?icLOi~R8e6^C@H>dfN*$28+k2cl)@ z%7=NZln=2;8M<;N`xP2ueQB7t3Jo#Q#LYKCefIoy%(>UaMELkHetb5 zYj1QjYMflK^Bxe4UXsO;u+nqj(Ge&R_~8T%LusO>|4{5gIf5|M$6YA?Ru@7!t?6to z0uk6yu#l9vm4N4Wqc}y}!T~>5m^{A|ZvJ@8&tSHt-T0q|7_3)-Z3L{JxZK{q0iQMT zbQN_xxDl?1oKpt1nP3yDtIa->m@yElNDIxfwdrH7HwO_lW;-5&S3c6osUsnaJ1i>R z;4m<*Dde?>!MeJHCvacCa)xWvJ^$=5J3c~|mw*sXU8F1F8wrQ)^u?)R{`w_WhPf5L zkWaciBT&4wD~>*6@4eD>nI`x1m>1@B3f3mD2S01~;OFwX&ITS6Gx=P&2R{sFhtu4* z-##GUUom3x-s_@{J5l7rJgA7mXgq%na)%i;mF5Yc=4?n~8ev%zLNRiQq`V>!R2+*8{R+6vJ+Xf63lI>5W z&3FTKA#5`|GYVQDdlfIy!^c>H^T~D!;$67d`)4&bjh+4Gd9^R4HAkW8T19(;~<)5eoaR(?8rEi7dCgQ0T&WCTK7BjNJVPp*CsBC6DGM)dM_BBH+wV9vO>Ny!4ey(2{ILs;{j`^|cjlT_S2LQroo^2YYKaSz9rG)Hl$TX=&;FCn|go zb+EeQ&Na`eFbprK4YyTDC!Nr%egYg<4Wr~S&?F;kc^&VCh;DSj>tXWX=j<>c5=7=VR{z#+rGUat7yi5l-_axReBS7U~ z7uLYySuK_({mYn8vE*SRCRHqSI5M#gd5>|00U1-o^$3+ugamsg*3ANeJ!0sBBD9G4NDJF`9eY+&JG?boOv=Vh8&xXh*_?i^F;)8})>OGcekb-&dvC_6-vs zU{B;Z{*#e~X?n2^JFm9u-IUNP(9dvKX`TFAK-T>--0gUOXUO_R>8cL;N$0fB12ZDS zD|6yC&;?(21=v?cwE2Vm)fx!krKqm+2C+t1=E(AN$ID2>#48DCjcNe*vq~RL$73Ym zoCM3$zXpoJ9TK0S!k9na1~06XzJ&s|1ifxFb8DtLLth(judzhXP-;KfsmEHn6lFZ} zUW-}!V~)XFL6tRT%SHJfwRYX3ro9ljN6o!(jdl@%vZZGMwczJiPn6z=i$gFe#?iZd z5BwLV21N+*;NMa`^JC@BC%`zsHGTh;vqvk(@-UWu&)s}mw^722tCRN z)}%81!nfsE((b;_FF}&w`Zq`yn|KXW&cmC5kY`xHSUqmUl+@=Tk;o?Orz)GeGiLp( zh!cZa8+Z6BoSP|QK30LRSIL*xMTP2}e5giyq3nYVNXR~DGe(cUU=pmFAahjUZ$-whW{(mwA^vxzKJ6^|0}8HRp|f-fMo3MDGmy>J+B-+Aaa1m1Zlrw;P_Ecvz*I35+X zD#ZOZ#QJTp)a3FN&gl%WmptBod@eYu8Sp#yQWpJmZtjz4P#0TWF-U z*>r+OE$2kOvR4*7hM|g-`{F<_DlBbR=zKAO{*iYcqzroJfgUJ+B~(>nnp>X^x$kK8 zD7cd{NAHBG*!jk)cOIg}mzjyN*Apzv>c*Tqs$}PGV|nGZ1!TlMRgdA zSZ^na@*4pWHk|!Uhjr;Ayz}se`0V^Cv&!nkx?hj*uI`hcKJPpzZ@qHCHi#l^&^r${ zn55SGod;U5vLYi(4CL~Xvi8Tl^H4T*nr!d&&I3cmWkH?LqVGIJJY7YNhc$+bIq@oV zS&ES`{iucwQn5Ex?>s1|-g$7@=7SS@=OOe7xu`0^=sOP~;fE*9bv>-}hwnUCmTBZ8 zGC)UI?>t02UFvAybD*t$=Yc{F?m*%H58ioT)Y@uc_el17=YhV#w^bR`UihlmvS}X+ z>z3YmAfbKdfnWcJ?>yL2;5!fYYn$&pST6a_0}1;!Ol()`!1E5y9^4jIk~wGy6Kf^A z+m%zcVfLPXTW{jllY(_h6Z+dW&iQ|>uYXl|86eimNP>4MLA~=J2JRN##%`%ILFM)o z;|7?{;2u!)|IWidkZtV#ev?0O+i3g~-*)U|&vM!}wM&#;Bn-+@Ksr_LJTRyyN<|gg z%+E*Pd0-4MzDiNi*#N4G(RUt5AX`*hmcRdaC@sG8u#wqDrn}z)rG4jtU-95p$pZrG z5}qjcSE}B5pq~=0)aj~s9_0U}FhTG@yI5Z9vvCJsuJX6#@8o59DT}K5kpt=i^QE%> z=MK-SK$$zf}6jL-=;WKdAFnXTCVMW@mJwZznJwHyC0y+V0y4j30Kuys0`B zc}sv1=}qX)4b19Cc}w67#M7701?7PZ#){)=%ZFPnr#B#SdnQ-xdR-Og%4-Of=N~Y@ zK_iq!n9m}h)=4O;;6`HXb6eXz#!OlgzA0eep1_n@S$=kaRpBf82z4d-pbNuB9<@z} zk91e!Z#9MKHvZ_&zIR-qh2sq99>;xjmMUo<0WrIy;9Y)2&mUrc0_o{qp%)c);2Z)m z`mZX}rmf_aHUP&Js%ZI~D{RJl2&ukW)!s+CR^lUujIhn+9vF ztE?cnTP0xd{U4@h_k3dx&%70u6^a_RK3-d>E4F5`ygb^LKQFjqm{icN;+hJO^FI;bQtx@OIh&NZv#ybb=1EDu!duklV z-@VS~uwK`l;Ac2|j@xHcx7uvTrqTxdOS0|4o}P&Oi9!CMj<~TQW3H4DG0}L2`)=P+ zJh|dh znWMmmc&(bdxSWstKsWf>1Xy*T{jN;v z%!Hl)n{+<-AEy)Qu(PGCV$#o{n5S8cd=6rH@eo5EQQJCGkh}v>3ykAN7f# zKrzCWx8hjJqGKags{t3H(!m{}z$7a4-Oi!LOk2^~F_u=_?gm3Zqx)JvR!)~X0YQ#L zigwpSg$oQE<3Wo}_ai18ri<+a`SDVbm?_SzqH=P>_H-3;UQO{RlMXEe{PzSFsnb!fJl@A~D*7*EWLXYnI3OesD>HB!OvGd-mSqmZ ziDkH6ZN(EDjTk0osU-M^8h~pnAAm&7P#sajF_qGV(1eZI7B8p=>Bj7!(#vuf?D+%X zphxUCW`}6o}Ltju-ne{gE)GyEM zWOiC%&mnR|S~}b2fpa3Qh#$$YZxU8**hQeK*QnL5PPeTGg%>0s5L;}l@11*a<3=Ne z)b(27C&|SkHe<|bh)-Q&;`6dWa&@sM;kF{B;Z3)jbBK+$ka#Qu%Sxnj~#&V1tCCcuMi8(1%nWkst>x*YFT ztKZCki`VvlaThZCJ0lEubU)pw zBOUx0I28YdEiLv2QLSaeA)O63E_qGCGASUUZGg;8qZu(-*GQR1kvN$Ru1746kzjzd z(@D4xERv*~fn=BL8UfW*umteBc-La-k%eHW@;mUaMB`Ty{zh~I^w!>1d zs>9w<35#)^No+eT^(zcJ0O_tLN5P#oye0(?RmG6XH8ES({@zR5NZeKj>my~X_`o>+ z2NLjCDmK$L2g6=D994GE^~7;MbO5ikReR!>a)&u=L=tE(tbMJFbWjY-D)LTrH;_yh zl-a!xdEgbB>FP4$s?=p-C>z?Ol}HbZ_^dAj;cCZIFfwyd)9cFfC{+&*>E<)#p(_hS{pUgOj#7(A!co8%BIga#Ute~%E=+r8LNNX?disX zab+BBW?c3i4Q*7vAf(9LRTpIv@4Osr+Ib*0%SuWzVE-j;c_3l%W#~cYWb~Q1Fe8_x z)QlWl>Wbs+)>!sg7>nBr#BCU`-RWQoh{m(qG7lfxo$-t99R5jFItjrv1X_zGY^Vm; zR$gPxv_mTAb5Lydt+h&Bs?ICcmMBR7bY#|MQS&hDg=Uz?(po5w7wiG=$_^3t-h{u3 z5^4f)8Lv#G1@jmmI&FoPH#k{7<0psg}TF*vQ0>%JbLJ={nD!ulSn+YbzX&?Pks?p^nFO?_OV9x~Wo$ z!@HHr1s4w*7%lS5y1+V`V;(zUm9cfo%GF;Z?ra`ZEJGs2l1e-OzS4avwHYerPWegW zuz%NToK2557yF)I6XL;b(0thCG5nTp$JJF2?IvnS$|YoU$KYIqtz}p&nLUD157^Vk zDWkM{`XXN~zSCjH{`qb9Z^~s}Z$?hE{TkY3zf;0NuUusw4>H8PmU4&2mW4>Mk+3Ys zR`6D*e05$AXS`k>e7fI|prhP(Cw(8g5_w=ZScu?uLICp|!E9i0UGv4;uk2y~t{$}} zGX$6I)I*<%ulhTCxBoteMG{qB4J|)3%+dn150QIJ&Hjdl=4H+yRO%e$) zo7ZE!B&oxB1y{FBaf~Uwg2Kk>1I&=*N>fh6s3gEw=f`5`O`NEyMY26|5^lY)8Nt;T z++@MzX0+q9Lq-YXwjyVKm9&$Mz1uHO*QQcI48U@^tV4+H;94AsAq)ino)s z;GQJwr?}Dyn;o#xvW%4o<15^^3BtSBcTAYCf_s2&T7XKm4;*ZWpaI==6n=QgAP8^@^GpP`{-rx8t%;P@t^j8ub6@9$D(6u4 zRWZc_CKC_N0}KXo5TJg<0`LvhDf7)iV(EyJDtuoAdds)G&M13%{(*{+1o7ZvMyoCV z8a>+%qK5934kCx{{q`KeLpTn@#5DV5&D41=E{x}hm6+Ovs`Zyb6%DbzG%Zy$#6%M} z2QW>R*YL}beM~kMN;e~G8`CW|@k>vF>&En;()Z0x?_ za3eN8LjGd;R4kE`V@xkI41P%ICI@VNt;)wB_*U{tERqkcvv^&Dt7wS1e9R2YVb6>!uRG!Zq$aq)EzLpf#B;D%l5U5q&;h>73u0zVvaW#bRh&{nj4 z!YfTcZrp?t+|_M~@PSqy>G>(BqvONMy05#({pg|YhxH3O-egLXkwnz`6wzqJeV0_J zB9-o`6o|$l-BYYQ*w$T#zD2WaK|5|qB#o^=SmJ1e5yTZ`9qT|65AJ{1Lo13X>Z${l+xTlm>y; z&Lfq+Q2xwR#cv9A@zU_sE>5;QI6%_t=%yG$TAR^I*`8WH;a>&zzDNgb+a88Rg(Bj} zCnCLg`(!n&He?3B?4=~uM(^Gt$>Puf8x7`vFm#Ru6R0a&s#{aeI*R415Nq%?fW}-0 z=DG|{&DB5zYhm;8!aSeDxf7n1*k(M%GRY^`V*I2|f(lm0JN*|aJC`W>OZk+4BUICv zj$0WdWhpN=`-$ylOSWT3c1Q0-6F6{*x`P9L z5{-Y00x0|QkPB(w8(Vd>FlUbz*5qs0=u@DXd`&n*7ccFCEfiAD#&qesNG6|-6qqy& zT?ngHdHD6Gpa&bT^5!V|OJ4vpdUaGijc}DlNz;C?EYaoAz{eB^o6@k7lKnb<>|I`( z=d}H$*_ERSIKvg)OZlTcF9JE~Qk$!c`3 zL{sJB#eo~x)NF0Bp30R3PL6HF%TFw-49ig+jQG+PcB zx%mudT8mf&%lJ1y`1W8D$+^6#Jcr#tlmPAc&+zwy?rJ4)^h( zgEe1vm8cP_R49EC>2J)}w4?wAmHue4!D(P_aVTFCSsj82Yw@?zhG7C;QwX@mErnB` ztY6VuT-(8!(0pyB7DJlRI$W2po56~1vbGAtJlTr*1_ct%GElH4$cHH>&)m7*(rQPvgX0^eFj43X+)MDW35FAqX2)X z?3v=6szf$yH<7k=V#6k4jixEqqPizCm6~2_RfswLnXT!yR*UNM^&uabe0``z86Hsc z!oEM5%o)@|h#&t-w<5(p^DXG9Z`r#sTgCiV%bF|p6HXPQuGr7DnApx|?P#D0anLNW zFU7jdI@^u^Gf>L+;(u6Y;iP`v18~EnsosqmkGjM&PWQkM^_g{Oi{2J7cF|a6qfz--KkVCKz2kn`KVABb*aTs4p{EeJ$IraaJprs?7exQ!V9~ z%A-#R(9SOvO#RqOTl2%u%d@0)wV!=Ap1Q>0$TZGIeok^J^2Af3 zQhk!P`Y?A-+v=0F)yIvF838`S>Z9|WRg(*-J_%QSP&Tu*mW#Fsf@+7*vG!8dZR+sP z;Xc&r@S9-O>TtZ2Kckmzl`c+%D|Hbj2Woh}#aPKA8dzC*Pi_7Z3P-EBP5!m8v1^H! zr&-txpppF=Vu@B4nHB7;2s>AMK}w;K&e-J<^y1Lf9CKz>m(|s4z3l6B(wM8vh`S8B zd^}$lHyCr6VOA%(i6ECmrwU^STm;Kr5pUDrJbAQ9;l_jWkq$N_X^*9$1rE9EJN=L7FPvN=FX7ZI#8!fE^#WgO9klm22l3 z%BMAoxBe(zIG4xsNNKv$a`O9EL<)Yv;g}xjIY3%#}-b1%u`j zs2ofzxEnJ9D(B0sJ8l?|J7)?m)i^hw80K1`s2O5!X(-;YD`cQ|R?jN7(vDtApGTA$ zTuj6b67}H)5_Ts@p>aTd05&$bfey?`5%Q{Os%@%6*CL%7IW4#w{hhjOdrda@I=)b* z9H1~%4O-}Lz^T?0+i-T%OQ-ye$P07JhKMA2R+euv*p0zGA}#l7=sh>I9u4`1Lg}l@ zdIQzJ0e2*KQ$P(65XPuEe1-jshG_fPF)EE3h8a7jT;D<>VdA_=rL1un6m;AT(s=M~ zvSaz1@j19ucSQ2V<@tQYa5kpcX`|^JGKrUO@N2N!MPp^RBMdE4bTM+;43jLNLV|dR z8Z&Vg^=Bg&aD!dWTN6Y9T#HU%-rApm`GFzhnf$=e{@BPV%Naw_kkhLB_aS!wI#hT> zw}rd7Iv^@HDnz5(geyHNoj11p7{~R#7l9F?t}?=m>!LMgT|ZBSvBP?a-xbC>iw(w& z2jh`?-_p>CAp`Gm%sR8S7W0Q0|7x%qiY8|==qzQSE(f7v@QRj3CAGmNRf!zCk6eP( zg(0O6EH*R~rar8+=xp&9)dhpuZANdl?A4g7(yXsp;+A{{(e;kpPgP>d=PH*rqgM@K zb5O%hV!Q3;g}T42D*n12D=ZAKSbcOdUMbybJqDvw*xs)e+mTicMo-tUK=F{PhHEUI z-?Ml$9ZT$KmQ_@0-*9PW!uDq*Ec1j_e$k&WA zqo6`fI)WbDkHUmF4{NLqEm>o}u~2GLbd4=x(v5>kS6ipSiH-TjA*DMlhV+1jNj0kX zgf2e%dQmZV;Cuzlgj4<*&j72+=+7#@S?99g8d=%49WllxkR?aU_^>@uH(>6-)Ew)5U1l?DmAV8| zvzQM1Jd`)oSRCbF4NY&ve%x`OtB!%-8g!SLvJTe$-|8Tf+O7`%2E12va8vKB zSRHJv=pc$|`+4bC%g9cZmL0wgEi3E$wpHSzWDQwie{C6heCVC7{zhy#GlyF)V*~#Y zYxoYljG65HCLQ04{WxQGPYhX_IPBN@9-s6VCzsmqhf_m-pK|V(ru}=;htr*VHBLrs zBiQ$dj_7NPJKCooG$j{~KL$-g|D!SxL62Q~`CDqXv{znrck)|CN)ti|M z!uK3Jo$DA$UcBJDsKo6VFL)5Ys08T7wc~ok%g|wu1rNb3muhcF1>eKhL`+FMT&B|e zw_d(6X{^5_^j_a6^=osby`aDewdFPOkvj+9N2pph>ZK$Dcm zO>5ZKK+ki~3qtFoM|2fKV<%R97ADJTd$-u)wL#>vi%cc z#~57g6LwGNkTNZ>jf=vD9qX2b(v@IlV?NiCavhJ{pwcteX|QD%o<_gfZWUcjYxz7fv{iNtoXvhTkDN)ZhQ&J(1~{?lm9vJrNOqr1wNDB__qg_eA8d z{r5yH8FFUNlJtI01m@YC%RHk_lGJ|-a;bV&pwDw6vV9P%DYV!#3ZW2bk1=1(eWi>~ zLc}ec`mMei4Tcwox#i(wHl60MJT`RKg@FX4_VBhKbOcAE6VY%1N8!hy{NRvB4NPB% zTYW0sX5^6u3cT%qfXUnT1>e|XKs|`^d90|&r(XgC?W6P)bn?5Y@*S*&1N0R(97}(L zpgg1&nY^qTff=qn-3eywP$=&ItE^+3wFqS&GyCpmhLNw37urg!%$u>4S$y5&kXyL! zIULtiNJJ?ssM#o)Ab}c=F&+BW@85qk9J?0vX4JS*CRu=Z^=&=I%10#4%o zBNXS42p(gFw1Uhdk!=W)?Jmo=xzJmV33D-gFa*S&FvuvC^Jno9m*8-GhbQ;Y6-Wo3 z)W<(fz5@X@Z6$q6VPaLjDSvlf-MK#y>teGHO#mI#pb0xXX(NIdDBR0XxXTIdL7XmG z7E{E$s7>Ua0xShq>`Nb|N87ivseXTkQ;6NW(xz}r{vRNjRB7?WRm~Lji)$&jA%2XI zq0{R-5TNofEB3V4 zawh~hq>2R3&5T^;=8z7y8qDbz+4opkuGd~? z>*}P=$G~R~^MQNthe!hMH7f0?TZFt$P+psI{%VlIgw&*hHTbgC6+2<{IvHK6YU$r8 zJoWec)>3fb^lQ?N)%r#G_OX?l5Oj+CHc{Qw23E(8O<`pjE9kabP4v)+TI#>W+ghGP^f*~K(jVe zDCI9jKPA&*Z)Mw<8C04lhr#iUnIWaa^gYzum~n%pjK-K@JP=6q5HZg#+zvkYr_B{T zGgv<=a@hPUm{Cc@{~Z`Hn@5Kd+KjPQl@EL5qTKv+FQ3nb_-54EsxWVc_~ze-UoIW& z#&NNs9}x{B-JuTA))yt)_7t}|+J&oshbpvd8JZ^4T zfhmn_Lr&Xv&BF~pa}NyHhiuvtKRoT5w~=<){eP1-$4iGJ-;*TY&3_1spe6VTs*4Q7 z<;Pbpyv6_ry^vJl#&x8$>(_L{-j8(fPe`KB;=d1LUYn6{>oCLDR97@v$rp^89hHu) z2e91OmD345E?oi8c|WSbnVXp%X_u$I|HS6a6mG=D4!jU}C%UtzUbAH`4$BU^j2qH9 z-C4R8pIS%=_d2qJjx*^|nzut5w+zu_50iq>+Ozp4ccASTe-yieRSVOP-9h8&{}de2 zs) z)u*D*GR^E_ren|At{7#k#JT*V%`vzQakiO*n;!Qz`?t#T+J4{Bp7O-!HnFra&8 zvMmdmHdK^aFX6w;8XyA&_2eAN9jFU6#SD)8{0d%p663$j!>x)hzqxEq%Mq8Qw0&J- z|9MC7-;ci5qFZ7&fKXCpL*FNrx!BgYI||41u|SS4sKE}^Y8PxVC4p%>wU3AYZ{))H zhI<{cDulMPi$T~ z8V|5Ahs3dtY2rGw(#$g}?DxBpsyeQM%J>X=0o3~=5U1@wTK&MV4Z0J#8>C5!U`wn_ zf{|HE=QU* zbHJm1IphnI-;>;yCtZAweRC4RKzn<)o&>@78E9YJiw>ZMNwB9Oxf|1M1i}s=h*ABR z3>NQeLBidbc>j7F_6_Jv3;8VJOp8lGJyL6fJ=`>~$0c?PP}qdxk@o3`#NVu@4Gr0B zl!fev-S@tiZL8?2LRVWw3`)WF43h~4jIxaB8a#n`ocfggJFG0_|I2>-(~C#` zv|0OHbzYbB$g3?2<<;vV4-zrwq)~X`{A}FME7>hRjvFYY(%oPxekpsJc2gn;-#DXr zGdAwPX0c}5wg~ap8O?<=PIP_Cabh}sppA7=c;0{`o+?yA7BQJ#|PuV*~fA` zKGp@8=9qFU;;ph*vR8x=zQ!;rndb#N71B6y}}9IdqXHRR6}te?%_yx zSE(k7Y7j|q0|N;>sb`D2-Z-%nzd0TJ8p?ITG8;0yTS|9TKqv7k zfgMD`xb6cZfJ;&Q!F{;kRVlxTCQkX<#Cyw^`LgNNnYQT_`5ujYD!q7neY|=C9Z4@_ z(*BUX2?xK8Cd&ee!ITc#N~Sh`mQi_xI*EBU>NTZXu@A&#ACedaQ7dpZ-?a?! z7Fj8%`UF!-TuJpj2^6KK%I9Ky>Hwb~!yN0Guu1!|?BbW5fE;!2!|y`(T>CT6{_Kk% zJFoFP(wo7ucjrXWLR9yc%Uf@~E=ASFC~m|y{0bK5)!KA!S%x{%Zhqx);U2kAmlSd0 zN$-L@kas5Td})B;i{-9ya>mu8Vy#$&16j5)@~ht%>CtbDm|CdWQm5IK@x^NqVqWba$*$|y=I(`a4a4o7Q_6LgNihWHBlP;*aq*2OwthV z;;?)Sy*&SuGpC#$@|QB-27kL(^JlqJ3HRpo3U#XDdImF$;tl$M4R*87oG+ZpG7voubdQWMoE_!H$Hhd+_QyimwV`kbs<;n+) z$sjo658mJU9ow<~Rd-7!6<+_~>N?|})KQ6lU&KGl#$V&&j~AxY;N}A6dn;~KD?ssd z{atG`?{VDK%nTlJWA#;`tj|ni>dY_=&x}MGxY7mnxjfNm16Kzv=Reo9ov>tWJ7J^q zwzMfV;9*bluzo%RbDY2<;A%(FPq6KMuRCLP=Cjw`<7mT>58D$7nOg-|DbR&t8hB z7{;SCx8+W`OP=<=&M?hMol_`3%BSseoLOCn4{sEDo@aM2;%A|IF@MTKfuk)+br5Oey$ewL#l0~H!#5gONzB6k%UVr>_Do!>y7wl;Qu45-(M zK)LRZ^V3hk9r42jvf^vN;XU138@otshbD@T<4D>A++@VIk>M*9%8_?IPSNv0ULAVI zqWw232}f_sK!Uce4lp}J?7=d`zt4xnA00TM&)zH5U^8>mE77V{!!-9;T&d&CyRBC? zPh~?F6&hmcYs&_h{3sg_>lW9K=8AX6mZTQmxV(hoZtC7&QfC2x+RkUp#+NHQ62*gK zG4crxLfx_b|0W1K;?YHWTjdlFE~Oju!7@A$zw@jNnVKD+?!h2LHPteXQ!SctU|PDc z(Khj#alrnD=nXC~z?;!d7kN)3@5;kS#q4Y2CtJEB=Q2#n@I8Wx1GLt|uw4$=R*QER zIH$mFvYeK}Deat6X+B=r6&w#XrKuvE;f z(cJaY=h5KR>Qlkzig>t~SQ&H|6Uw;0knXvNuh6p;0x0wx42UykwO1kX1XubarutFB^#~7uMYh-%L|ed8$tp zepW^K*{j0O$=l$kLJxj=)A#1bM)E)6=lCc;%eT)@g&zF$rr#z%+`Ga)l>PJn1a0(! z-Bg$TXQZ0p%VCvqcgrCA9$2riD-h}g~rggtP5##1^gG# ze-zavHwv9iQ!@&iIZUm#de;q1Y;9f*T^g9QzueZPt)d?{smzM>ih<}r42+NZ0P*0Y z!#X6v^K*9mBDz+S9i)*w_X-w9*4>=Xwv5aH27d1OP`YELcb`{nZZF#Y+!iq{OE;7|bFRy|L`$hI{_m44d+gF^_c|M5`CvgcgI7i^4tgVu0_b1@QCAD6j zap%FZ!d%iM{7OEae;H!5#%`o3UBSxS#W+gW;4`kBstLD31>^kRhUFS-pL9oTBVD(; z9`-Lf5EdH9`o(;MXEcbI`YlKd=#UT7wH)nf|43xXPT1=Xtc11kQH5fkavtJ)Px0Yi zkm~s!bUmOEp7#CJY#EJ)>IMp?^gX~nn*;FnAG;{7-5O+aqbuhmvDj)p&ho=8eL6SB z4PZEehl>cFf|nN@26eYb1pY$f&~ides`MUG3EF^;tHnJ;>S{EZQEXu0Tgd3PsGKS8 zpDM+!>6a3Ap^DN^mC}7F2O>^m_KZ?$Hk>TZK>vZP|m*vZ|>GPyTt;AUus-OuAmSoX+3 z1}`IYe1XF9f6uj&RC{x(5-eDbrFk%i;zr!+Uaf#jZE-Dx`#fX_KPBqLTm0*x7qvyK zRg?m7(4zAJocu3T;={qr-~|K=w=j+~>84Rs+3@%fq*I7*gbk&!3wU~{wwM8TdP6Z2 z>gpMA*kAdM-lz{oaM+->xB~k}v2)V#1|6*}F2dyEQ_3C`1$50^op}ZhmVeRgfDN1! zLC9OP!HsGz|B4#%D1JTV2>Hj&kHNvT;$U6WzgW#IHq3Nl{3Pm z%jt_0`#i8i>RAxg6;F4JXeXz9hZ~%$aIDCo#^5*xOQNngKip3-`pIPMO8CBxG~No}(){fX-G8Bm{@rF>a;uf;F6NLjtA%g#6lI5fmr0|GF{=?LdEK1GQN~_6rYEm=!+69R z3~bTogkWQ;Hk6Tz?##{Z~L-?$4#obLgKfV_bz?$0mGZ_wG1cwhbb5 zil#K6Zm|qo4hij?q=Xk_Q9u6-5C0~zZi(=i^!bVb$AE(6@Ekd=q8XUCji=J7L*R9J zIb3=WUJ&TOEDCCbe4~E2FRybS+CkVC@?cjvsbzR99CerpOsphOZ!#^xLUO~K_R#;^ zpNF@Ax#dv?#9`k;urFy$#(Iv-9qQuJWAZeW{;SBm|6P9l6<^D207dFJ*|FY*@&5(_ z9*|<>SN7o(Hy}DbCsp_?^S2cI?FURVXBB_(I6vf(1RsS*1=v21ms(M#4&l5($B!U) zE=b%c`DV9z%*PDw76;>WFO)qCcD495JNG+et_%~BN*!NzZ>(DkNv0vm8INJ%Q zG;$pO{s$j$43IG6;Rh3kbt3uOaRo-bm_sUkVL3XI(m9&|2U1+moQMF2u#SwZxeT9L zhA)&pcAboJ3))y-jA60CIBN{+{8@_)#bQ1rj@x^puHau`L623jc5~%jZ}& z8iU&QS<5&VT{x58BNHn*WhsxUV;S4*gltf93Adb%CH;aI}+i|wMA?qrLk#D48+}B z{PKrF=h0qf+9q}0f~@t>ini(fh80i-{f!*Zc?qa`j)&KJg3?nf%<9dXAP?>7wbPH* z=WkH5&9LfyeOf*ZpP%&S^9E!4X@5Rc+0Bpl=krba{H#Bpkxb|3{rQ~8bbisF&s2ul z+@H_%BjNKze?D>gpfAujr;Xe68PktX+fsK`;z^KfIEXY@daxHLMqM!xasr8hFNaFl zYrccNYDY0QZfV;N_``F7Ki zw)UWI1vh|VV9Y-qp7_zO9!)&ET}$e3KE9nR&e7O2M;|=}^e)ldMJ`d_UJ8}{nXn#Q z(dbxc?@ag1sRkW0xY~Zs9{7DmdAHR_quA1kC?dDvrHf+9;YJZ0SqRd!5UBta7gBPy z3?ZJQ-L>;$hqI2VA?aLznw7(K*ta7H0Ng;=$d3{#WS_Gpzm-dU(!u zm(4~^(1-%I2KUyTflMSy_X29ifu&c^-HIP`+>&dRwdtix zCoA)qw2>|m1EV3$C6t@jbxIWtv9dN}6K6!5IaW9k`8xtKa*AC=U?0`3Df($0xs}Rs z2gm&o&_H8V&O}u%t$k#eANcvU?+k}z?Rw8pv&#~DXE^(}oHPH#Hu-oR`X)a9j*kcn zZvgfG0RVR1#E&}}f+G_^$Va&xi-_O$U&X#%AHg6#hB-Ipr@HHEd&JZs^w`}xl*nuo zsM?H!jk95)Ix(@BJ5%~bT9{|{wHakRK!V{0wXlp_-Dh4AeUm?@kQz14e2B4 z*?Dq>mOl1QZ-pMo`K@Di_c%m6e3))WGG$E? z_A@#eYo(L+^+WWb4>e_C(~HO?Qa`Za(ux7*I$Sf2SLR`D9}DFULyA>87JTU`mcF%~ zq5Q)I*D5_K?`g2_-1O0-ZN{gAX(|%hr}CWeN94tdt)dJ6jqa7}gw0E&aID6KWf75W z(4W5juk?veqNSbQw4tT+vqZR2W@*?j@;cu`v30M8O|!36^Q$@dkIIsJX^98#3x#S3 zZ4S0pdw(F5sV#siQ)OLUvitofs4fKOfr_iv-K0jtk8MTqtz6E5MSw#hh;gG)uMRuQ z?+(Pc0xE0oJ?ZHLN4j31=X7#idKTK0E4>a_Q>yt4T4=7*)@Iu4d*2s^(ICe=6G4-y zOmx{ZyctY|Ul<0)O>yaH zu+D@FgkA3kvR{uA8ClTv(A8|grBUVg3PspHP(Mx{c6?MoxSpz@LVOs%f&3X#U zre{edoEVHE*{dIEl9((~mB4+WdJ7RNji&x!lUyNpd>?MznJ>;j97&V5eqA|VcpUN) z#%3x{HTKZgUN$%82B?X>s|lTT1p~A6ug)d9A;S^H-%)LHDgS9Gw~Hi6AtCk;4I1WC z=~_~CPVC(hO{Q^zad#ITY?@E9`C%DSZ!n@qeyHFTy(#O{dTN>6xmSQld9Q%Bag_?mLh_>trk9 zQd;hG>Dz~4_Bg0Tv;mIO=d^HQIj7FrcY0Q`j6C`0QX|`gI#6TQP&NSLX^e;pY0c=- zJfMGPhtU-~?9!vYt1K$XCWEXBWmquHs#a+f`zLQldgTjHv z8?KQbddqmqgSv{kSchpozZvL(xNHj-^}AXa-lk>wz?@y1-7CSlIE)m-I8Qie+mRL! z=|TNPYU50r@x?GsPv;(vC7;G`K{ziM1X#1BfF|S=NG!7Lr+lo)$tY$9G}ygAv|E>h zx8o!WJ3dtrVT$dro5B&ZR=#saZ_rkjuv$&Ja~SjhPbLh<4`ic|SxgX*1&%hfESkRe z;fR#a`}k?l`oBjtt1D))1gVcmd5$vE4zhU;ZIZ@6{$ONQ<+;AxhlqEd0ULwuBxmv` z+1-U7G=i-6FrUs&bcv=*BweKNvuLNoI?S=uX`nq`a;9i0ZpDJBa{>C~_4cG_$4Q01f>HTBEi0mu~7V&WW_I6OX1-sG?pEIj#w=^Tq zbhTRzoFflFc`v>cT7^2qY+{s)$xMQ zJA$^eUy>x-+%H)UZ#&F!yF0htS`O)K zh1;cA2Ev6{Fa#{ODck3%9Az*{Jh^?Zw!cz~@aTb~owIpj1E_gF<{g!gHkCBCPvZ|p z3=&W1?#6o&_sUz#*!A2KkvJx%*Aq>2pN*f&tR@!M<07QahVk0;x){Kvm(YG8+b`^5 zyc4m@m@%R9+r373pwPM~qooAuo~Ibp%d<&%3aThE#*KHMg9yOUx%iPh_eNe(KPV5n z;Yf{{Q4QJR$4mF)kl(i#B1xZlgnVbs|7SE2pk4RNTL;5vFHiVafpeuoUGQ&=X zyT({sKg=!cIwjdz!>*4{SZr`QdXF-;emrm8hvNR`WO$dW-3Vfhv}FwS%pJvbeTD-~ z&2rlgNB4PgeDlMpiGa${zgeP`wibY&)T51GW7R?UAo2NE;?7nyrO$GMIVVj3#^t!xT zZ>z8b-9qZxW)N7;p!n>AaBf$6zy1O!1r`h@fN!ZP>tP(%ycx5aax7r~irs`#YnOZL zGSCC60(#UFQ^;eoIG>kDRy$2EvS!=OF6>^pp##Iju`0>MXh;Q{L(&=CYDVYHxb_@- z$&zhzOM{W&5uN8Cdp+b1yB`bP7m`hlt-C*^&&uY>upY0mwuO|+iEIlo)P<17)%A<2 zXo&TtVKS9?h*@iOF~4YE&xMR!{bedv2B?m!QB4`8?J2;argS!P6fXEMrij;d5idp^ z@w%(xWn=WZl=m*u`8z|OyDz~P>pJc8a`3aiwI>yR&@STksV>qXW?)zm78dv@@y-s` zkzyNOg7mr=$X*QsvPQH1RH&oBLxn0~_oX7Ol=%8Db;O|-%x8(;A96_ZAkr0B~hCigj4?0 z!}w>o_*0h4Z-Z4Tpj}B%`MZD)y}dDr)yAm(#+`~T(^*8Ub(#J`W?aY*jW+8xJw|Qr z6)FcdE`5$7{HC0CM4{h}sLdQ6(N zqPZ%hDZ8(e`_-ZQ37rQsS<r8_5i#9|4 znA9ALt;_z=6$0vC)PGzbe>=x_S~-4yUKpBnlWEHj2S*w7n9vjMz5FNi_4gD$%KQAP z@YTHeeR!+(-=QD>LYQ|e8*L)=BZ>6Re_KCsMCDVg@*i#db~u=}U99Z=C1Bss-1sn; z?rTyN#erpt9m^E3+n|-aIQ@XRO;?uwp`kcJJ19TTKV%#3RrDV*uF*(c>e4HXF%@@P zP8Gg9e`Uyk%6WVKwtwh&pHhi;TkanBkXt!GXLk+*xU@d1-!2~#uG-JeQ{E@JPcMg} zZj|+B{WYk3Uho6>u04@GD@_BT%o4h53;Q0>W?z2%W%9!;P9E2)dg&Wg*EZTAAG~#6 z)bnl^0^?`D8B3@L+j()A@F$wKrdC0|oe#pL^ZNijOuVY*GpvuWXR2QE-d0Z?#IVDs z=><&LpvTey8>_LvEF7XGA#PWKap7Gd77rTWDjlYGkQWxQUQBBU(z0{$r^CDS3dgo% zN!<(}S$qNu!_{5|pkW)w@ESw(CK?ikU)ei6#>-_qt<9%5`U!Imn2%%7=(XUFI&j6V-gV;}s%xA(~Afc!f)l@)=hzli^}__!VfXP`i^ zqZD`k;a*MPJSLzo`@zOc>piP77&6$GApg6<9McW;RL!|HGw>Q0WfDSYU^&p zv`+EwfMbf?Z7Fj``*H0l^ZX?8fBWPcCg;pwr~Do6mrd=OI?%i^^@XYE-A(;w<3RJy z&M!>OnT^vJ=QGoeYtNb2rjdtnyD%+(I&=4lJ?J}b4*9umPS2d2Id<=T_a0~-p2v7@ znNOO(9ngjE{SGAM`%C}0G-U=1Bo9x0f-WxzUcG|f_pTuQ)RlvAYV?8;C;t1o*&Bh ziDSsyU-Ug-73qtsdgegd`hEzo-fUjQayj5wexGqHOX^0!+W}MN3Am@sJA%36_&xYI z#(%WFuM*q{STH|4?!My+<`;k|Gvs(ut`R){cyjn-!KdZ&jK1Fn%$Zkx>OkxS@|ih- zZJo<#bdllXm& z;DaYI@9&?)v~njCP7s_SIA5^yWQH0b4SYl2d!9m!^LLw!u&#|RFd!JKxkW-6Be=1g|Y;>IE7vNiAF`)hzH^X3}n zI#Z&?HkBB|NWr}T2bz;hFF@PR5d5s*9e_FWH_;F4WT@Q)PX$bwJ3FcW59zypEz|Ya zk%#pI33p$|@;z@Ib!^i*`kp+W@NIpsIhFc+mEgUneio+-eqI%yd|cSqL^&SgU@vCOV@NHFv;M1u{YKbS zU`*i|^ADu3JN;{G#$pSAb(jUXJ)3;4LM%MP7+52G)a{cZbKATO3-&?YrwuM=Um~!5r@`#vQunqL1Xk56kV? z^>;2#pPh?vn4^GP&c&H6rf?&$Yt1LkVZv?`b{_VwFok=R-i28GB=(rFi!gu3@_QPT zS;V?t*ek-WBL>QMf$e1O1jcabIP-UxIY(GQ*w@XcgpC*WEpxrFJsozVu!X=LHs3K{ zjimQI^X*7_n~0UudlneeI}+grnLnHRV;fPbr8t0j!Tdme=fm$jU_VqWH^47z-Zn4C z63EdPg}n!i;qFqnc=EYhY%yMA0u@SL} zUJRwV7FZIRKgl}>ab6(G5wWQXcayM@v0W7IZeYV=t+Cw|?qP*%jm;9}W?+Nhx1T6q z2Ij}c#tsxOUXm${jUD7|fF#BxcSaX(Z0ulB?ghWez?KO+0N9||_}B`|nZiwo9qmyg z&qJsrUMeUlmYb8TW5w8MO5y9k@K9syY+*kYwqxuP#A3|zz_Pfh^k#*7UEyXr?0tuQ zUVe2c#yK;#L0GfHzNA>j0-FiHFDr%pfXxQ>6;Ylj%2~0mDG%oZOX3EqJ4Jbku>E7- z^EM)G99zTR(%7qB8k|}CvNZOZ^0y~kk~mprv2TO&^w?psHxf@HyM#O{o}FYJDYZ51y+%&?WYGxmY7Co`{R65hSB+Ju4Rz3i)*jCWrw zk2>05hB*vRNx^Tju=`^LVGA5KNZ4@>8zSs{hoPn;+~*uNLfAbH8VfD(re-OktX^yPV&2 z<#rRW2Keoopk_UjdkJI12V%P=sGt7=mISsZ3?_DD)V!2C+h!4JsLYw*i{ZYTG$taJr+Ao z*tZ>ag0RPd9qv6AJ4t*#<*-10F9N&N`$_B!VQ&a~DfUUFo~kWip#5^}Q)psQtAHhe zT`bC(4!c5>`_-S^-Q7o+v+nPusM?Qw#PkKpja54tYrowNgNqR$)EWgFTW&<0MWJ#~8I~}ws zZ&Z>ceF-oeF!!d*?^gLWc!vx7zQc}CEPp^OFL@2#Cm;`4H^hN6)?SaWH-ruHE<%S9 zJvnhU#JgNrw*K|nMP`_Hm11cD_M|t=yIR<2U|22mu1})kn%(NzPVek}QF&Nce|p_a zGu>fp9Co|>KJT!vDFrY4M18`W?tLBQ##(H#Z_4lOdSV^kw}qWAzYgy{Q4Snn{T`5C z8?c??9o|F2<~YBHh3%KKls^!5xbu5N*j@6Q;cZf!n}Cgt&+vXC?2G{`Ym#P$_jr=F z{9<4ef&D^xxWoDVT9n@vwww1yN&e@+AP?^u`90)?UPbV3GA%+$Gk*dk$vd1nhd9N0av!@cvB z`fB+d;aw!Z^Mx(fF+QmInKKU;f%RYe#d(oQx$u5viG$VOY>3r z1>QH5+vk8i8DH)FRO!6~tOwXLN@2i2=3%w>ocu-sJJPK2UV_V?CjSh_2jBx1PdmW1N&x-R3VB{>;xCh$zE4>+tWq`1&yqUtr3cJRe zEo?_&*LueZo9eKWg-v(ZspwY`F!#>zT_>-0o0DsZK@zm2T zq(916H>$a28akfQ+C4`J$832qd;d&seHe+Z#s zX0zZghmz*cL%#y|SBKL5UqkQ0cYGLO%`lsnZ^V}NOdEE!S=zHF;F6w2fHBiOjPzFz zOM9u*ZJ=D*bN8@XZ)wlHg5ME*RPb@ZCk3Ad4C!AUHWl=*3%)7%uAmuC_oQH*;6Om^ z7aUGW?yT=U1s4vlh5I4H$<@~3&qdfbhY`LmI8ZL{>ig=^ zbgz@k4fsx(FOR+e@OHtk2;MDtkKhA>-yi)c&}s}!G&@-7jRF(Lxx{a z#d*l5KZa%W*D)-ww*@m}`OQ)bb!Nuc?;)Olj*X!$xAeap$579XBjsPmv6p1E>tEyc z$F~`OFyN%|?AzGy-LNS*X66arGvRx1|JOMB{%Znb@OJwMi`Z^_T& zJE}!@`IC}Md+rzfp5P|Ip9}s*@Q;G80*3N`192|xc}MVlL2n1Tn*7`GS`M#>_Q4OiCuqPj^@vOBmMKnEBlf z%;uLxSH2E|RFKf6d7URwMazHip|?Zsc>oAO`M^Qv49_t8p0ZW92jCDxIm#0bA9 zxJmHmg1-^`qu{H66^V@o{X2+rY0vwD-VXfE2@Vn*DL6r}U2wACbiuiT^92_R-miEL z)c0Y6D+P}iTrGH-;CjLH1uq4p#5w?HwNpy_wtpPo`?pgj7q=gT@Bd8tG+-L{D&icE z;0`<91ea-oyY09E-}83-65v5QGSmrzXA54r4a9fIEy{4wI0Y<`CrLYXYw z>2^q9r(uLk^t}`?^j)#j2Dq;g>=wLG@Cw1t2yO(7ncq()pMMg3LGbT_?@j&_d~2uB zw?%OD6mq-6l)scy>6!8;q;kICC4l|K_Em+o`tyS+Z-M4<#IvO54~p&0DgTCxHrFe8tJ?*?w=-q6-!!@$IE}s+050jdcN#<8 zwDV1H`PH-yfG3sz`C*&f|-U}kAg zr(loZWr8;f-XVA&piOrd^X{(K!M5M!6TYwS`}O@j!T1ciZ_;;8-@noK0DZrz?{&&Va3^V@4a`J~NoRC4iMy=237`X=TD(G_;P-vNb7Yd$%uiu|0uPXN-nq z?pB=d3ewWHn&fVT0|iF{=FPsl{|&LN-u(j{Ej(lQt1+v6e(E~F^YneG;HP(o_F|?c zkxQ8ka=96HHD&J5_XC38-#v>9ByAi0`0iP>=9>l26TDRLg%sU4==%Y|n|-=mIDrr` z0QO8F+<6A!lXCe3;$PbHH^HrdF>~RpKjmWP@>zcYymeMK*J{2!YihdHJT>cOd_Onq zuW+}TW3A#_vu;HlT)U@qY)`iD*9hJs_!YtX0Q2UFJ@>9@HCNB37Hyb)1-|c_eQnLs zo6*L=;L>VtoAV6lAH;XeyfWt&>`u1Qcw^3Mh~aI) zt$;C;+>4suycapK-{z@MV&9CNPSzoD}KdSG)ZtgmOb#vB$-gR>p+-EMJURlkw za$*ZyoB>h@rFn<7394FWT7&FBKDQC(mtb@BA_-=k_&mMqQ^Cz2+ zA6PRGz4`;&pxbwY9wmMt``)%aT5u41?}r}5e*OsuQ9h?0#Fp-esiz~99cS6G)$0eb zKQMUdJ#Zhrlu~LFoGiFI;AC^y(#Hl8z66@Sbu)8tqOsKsKlo*&vd_Vk|NaM$Y7A@5 z;RiE!#{%ZfuMfTz@GpQdbMP{z_0%l(E)H9IZzJK)8+S3QmOh0+|8`S(IJ)d1h z_~m8KA!^@1@-5o6@P7-Y`(anxf$cr z6+@b7&*{E&VFz4xJCY@P%#lOzT{@C2=39#wH81Ho8}3VbJ_VRJ&m2kH__rf30!?fs z>1zdTFX&kRvgS}9-tjMLUfT1Ml@}qE*H%8-JlQ0V`kmnGfWwdaC*a;ktuN61%Ybxg zjD4Z|B6WDpe9?c%ryf@|xZgSY#=J~+> z>9F&gm!PGt9nCl&&0gDlFtD)>yQTREV3RBsBQI&Qv#=Mk%tP8NbQtrHHp?s)W8O37 zHit3q8FT3vrtm_H`OBLBj3xF+?2hK6v7hOral{^teY^QY>;Ze+VGkpJwHSL?%AYlt zfDIjQvFG52$x{72l6a{~zeE)|O|1t#H_m@GF?p9X1Dk1#_OTN3#dDoPo=DZgtq2|Ht0D z$5mCdjo&kCX7*m2jey8j@PMd@sAzZwMa45JnWh$+2UJv4Jm!fcgG5r((lW!slG4)B zGBeY%(jwB*QZv#!OHJd}G_$f&v-(}vHN#^2cz3_u&-=XZ=l93M=d&;7JJ&VW9M@X2 z)~rK~13*U&Evs=B)^9HvdaTApplh1=ni>Htg4yt>5w`9cNEg8dH6dcyn>E>IL?sN{ zvnD%f2-~wJ%b>Ab!k?}2Gs8Ow@vlT}tx+GIhWiKU3aFJLSx7U~71(LvJ{HOFp&_Kn z;SoTs4c!mAx-8YuW1y?c(hO|?T@;&UXb0$`SdO8S;gP%^TWRQ0cmtrdhFC;4tIu{A z3X3=ZRAMMLqA_p4jvGpfxCQ8}q5hB#24Hht&asd#ngtT&+lwOF@`fzh(BlyufZ~Zt zsm)?oA(3vg7?y+&-NV+1?GnQ>#O4x}@U1m^@mMBXk|lpP;$FA`G@U4q z9gcweiC9r9t-BmCfH!5AiSk%LP1McATmP7DYp~R0cc|q9-8MtF)`|eyZD?Grc|49C zH8j0eF3<%-IkgISGbZT{$pU*xttCJqh6+K~oL`yK*DB&ISUB8oi({~~)-${%8%v~X)SBgMoo85WAACJ| zlcDjoBY-YxOZbL0x7xtM7Wkd51IJ9a0L?xS{WGLhb6wqtXN3heMY z?Z9%mq55@TU4%WM)6w27fvq*V33d8g32cXT(*SX7r zUkJ{(ZrJ?3#=~ephK&z zuB>(^^jYfZ7Mabuvm`@zL>61!*)T(6BG&`WH8-Znb(bcW3g#vm*oG z-l8}|_koubmTPEXsQuli+jkPf}ukK}Q2usn#*VMgc-NiBuy;1j1YZzN(=s4(xv*!%`4(Ud)*A3N) zk|LdbV5nnM85_lp7#bPn5u@1;L@UCFb%<7@u^{kQTIIW_I-t{krRr)_HmfA7UI38j ziP{A)vT`lBPo1dTgXzYwR81VyjbYCi!gOQUCZbcGX7!4#F|340dl|z%Cn{w)A~RsV zi8&yxw#LHwB$95k@hq?x>1-Uy6Ih%f9IX>rsv#V$6IhlZ9IX@B5<@szC$d6K3`c7g z+hPbu>twj=mvUe@J}0x2hH!jNVSgCH@i~=wQ?wCTe ze=1t)+;iDXhlaCUmgmqQk;k?XmC{jW0XuF8k1`8b)UD(NjxxhUK8q*PEx3?%?}s|w zf(0y%Nbk!FPyzX@i0WK_lBlHH>reHgiS=iRMULgd`uB<@>>zp3Tik=}GEsp&q0S2N zAiie+{tE0lbyfj|8(Ijur7Ygiqo7;L+7s!rEMvon@VHVWma&=IlICa2SpE&P%Aw(G z8GF{DLE<4+LZn-1IlEv8TWL9q?~f(Z?E)V^(nLq!N7w=)-4Bnj#~d2Y9${NF*;a#W z_9)wH$k*Ti&=Df-b0rHLKsk`l$5>q=?ej5qmqWuDyw6yZozlR^RXHFAw0v}$cl(`-CtlYYvPNd z1K0~}x1ncP0!>${e3sk~d(3GN-;q`)jEZNY4n0w?tHqy|8F?sSsHrf!L(SF3{8d@2%NPff$ z4Xutj%sys23~i2CET0~L`Mw8H7W$%1)@Bb*eHONvG5G^ zS-^UNmoipp=yuZ4!(-;CR>r(z$r9Q#0xWAdv{`=6qKWW4=QVkZwQzJ1>NZLy| zi@Jg0i1aynImdV zVTN#4@-5rtP`o(LYEP;x*#*{JlkJW5u?uXNq43xUpiDyzW51E#v0OtfW6uLE(FDh% zALT_>M5Ol&-?J-3`Y7`~Yn_Gp>Dpdm%Qewa^b%XAiFb~@Dlf6j$!NKP^^LXE4;ZBR z%fi?&^^-%(V(X}199kJ0t*)|MN>^Y%)i@id(9nyG?*n>96CJCru@`Qj{Y0gFPvfQP z8oQ#2u4i3i;Zrb^QV(9wy2ers;q|QFScW0Ip7k4>LZoYZojs^^bWZs@dxA)hg5TK& zP4+L1ee8F(+YoOO0kq#xU=ttvgPk!{6Lf#DONL@W_b0q&4NF#Fw*uXtEX)w@%NdU| zg!^*F6Nq%LaK4gAmy`3Q)6k1P{=qT<{N=KhQJtDRsx1CA>2#^x`~_`E$6Ghw<(CdF zoSSr$niMIUf8v+U!_R86A8AsoJe*BO+X8!Cljnf~4Q+37m<8}?L+>{!1KMKf26CJa#7Lpj#=JAJjynHH4orI-FgE@Y=J;k`HQ%w1r5w89XsETbI)tdr^UthVczVC9vfLyTW)Dog%G* zEhpUNN*M%@_1ns@BKVXSMiA(&-kg%`@hq zvcP^h&IeD@1O ze>Bvh8C>nd--ug&o+ar zy}X zQ|?2`W94Akm>(xv!K~&fvN6AIbhVpjxtj0`x!ST>bGS~+)9**hXQ@Q73$$)X^BM3( zzp#axrZ%7JYQ~EUEo^?D>lU6_fI8jp@$f)8Qa)T|KEUGn%Eg-2gO?V3+Y(JLH7{_r z;@1uBYz|jSdC^j>D}mhG@Z4pZ4uP%>@BXl+i_IT&wdIemK+cTQ?rE5`C8NgOEcv?s|-Jp#4O59;S)fvpbJ7gzed#Cm6!^ z?7{mR!uIUJhZ(~5?8#>u!uIURa}6zT>4WcE7aDr1WdzVVLwHn6;kyjsQ7whVnw5;hK#)lB$ z*+dzB?}PqI)wos-+#~r+(v|a7t*%+4_(w##?xXn`ha%W$E{ic?fsLge!)qJDQjg)W zhSs(kz%zKVp;ucqb7$~Any3zA`Cx}4;0eD`M7nbx-8G92(@F#1A?&)Sbn@a45q)g_j#rt#5TtYmQkGgMnD_1!#H zlU<{=58iy0Y$&F61W>A>HlUlyGYs7dx|w{Mp|P#A;SDH@3{7o)0B9vqDfCeT_iTQd zD34{gZs4BFv({nmNR!?7@U?~>1YHh4`dnqn=JS&`&;_D$xOH`odp<`y*us^&O|CnS z|LIspusmM(dDLM~H*??5lQr34Z3gfKJk3y@HqG1%c!r^vHa?cma}2d=69Ke{sGMUC z3*nY4%8w<35^E{|DlUvxjsR~l;D_EmQ=|IN^lwo*Ln^xx#RZ@Sm{QHguKL-X2xK5$KJ!(yEazCVt^AThW$tbK!ZxkLl5OYluW7=Pz0MbD@?gnc=g%0z zlI`HTh)Vbe?c(g6{G6ZV8(eHBFCMgflSdKhQMZeiXdRXFEq>jh68GCY_jR2+mh&CH zmZ*TuYun1+!_V%l(3QF0=a=5pgr)v~x89`*OTCvbB`RR$?UL=i{N!7x)8+h-hrErH z$9`#-Vt>SsyrapJ(7^pMzrIIP9iW5!;Jca{10CjT->dA0BYdYJ?1#^s-rO5I#4hur z&GMKZ!F3{s_9qlu$18~LQF2Iqk&pq;9%J6PpZFpnh@EukM8XVMl{3037ZRr1UpwSV zyw{MReaK>mN_o}9hwU?DDd5h4@WjV$*dM_kQgmXT{FWbv8tJhVXP@V1G}+A)r`s1Q za!`X3GvK+>>yG7m`#V0gq$1rW`x4L8M8~5ad9I;xiHF&bywK3JL?6%=qEgx~{mAzk z%1!*!`jH2|k3LJ;1CZ_~9!;c=hClHvqE+^ziCf`m>ZOLB0s4h+GV~JA6@JiA3D7lu z+0f@e*Lhqi=CH~>4fF?3(Zqg8++{Os7m=Q`TUOLwvV{8t_S=@#k4PVjg*DTmGI$&I zYKK09=e0j_=(w${YYr{5TvpsZ^ojQgoUz?jDv`cVz_v0p!F>Y9;c4n=4xP6>)-Gd- zE3aPbxFKA5^;*{rjfuQ$d#%V1F^5u5R^)GXpp~o%?h_E6AnSQUxbhlo?Kgz?2?SeF zA5l8KFmeXyG7UWh=|Ze6hE{>ks#f>?+Hy@~M^?>RWC+(`!z}xN&K=ibeO7HlxDM;H z;x)m20s$VMm11-;W9*6`G@&Nx(Ng8p1mRVy(bKI(NJ?ps|Hv=rOn#pdE9F z?ggkMT$^ZYHKug9ivOA2*y>M&_X4zIO{|%k=w5&()`x~LT@&jFk-it8iFJWUdud|* zNrbEa$L*$8@L?(o5I&0^rHNMmn_J0-a11uL(hcDlY;NTm!ZFy~ddd)v!CS0Nnqc)` zcv@H`hHwnFw2m0UQP}VBe9rRxS>tq#aV%QR$tW74}n8NnbAC$*PT9p3Pav1%Kd*Y*w1 zSS!=fz2_NkqI!_a|5PZQ@+L=kX8iDv0ij&ZNNP1 zZHG1m%(wOv>D99PtmrekWWgO@4al>Si1a;zdDbvPbvo{J}T|bKSmiSRa?+1R=%=?i;zb8uZu^)N7pE$G}ayaBi;oeXEDAN0x zA2swI^`mCq;}uk;sB<vr^B%%!~lmp zUMZ#-!m;EM+Z+n_+JgP8(`9##^ahCj4mI>v5gQz8=B+BeF@$3&Oz>ZHy1lU;uTMl7 z!m(6CWH=P=jSyQLiuBeJ>{p#GAGWwik>*e{Z+-EYAskB$#VZbZyfNaSAskDwBJ7Ix zvK(5eiAZ-S(i0M<|JC(7yrgPL_F@N8!9$wvZK3Y zv!SBIP}^DG?jCC(Ze(yb%VWg_i!n7EU1r#**@EKTHdINYg9Ivafs7t0Mj z2|h=N4Td&=&kW z*l4lWkmwF80OAOd_BlrMq?;dfn`H=i6C%_|ukK`sMOsHWWQetfFoz5{R_glYboa5b zqQuZcki%GU(9l}YjT2`Ly#l&%;xduWeZ2TcRMsd{9Mxo>hIE+%-+_ncN9Q43rnpX| z(@hXURi>LLyf;vNB0VN1igcn<7(G|K6UAIZzjprvsMt_I4;eU7;5#;;?w&e5d~A|9 zX(+Zw1Q00TuSB)#;SJ0Z7qpId=n)z?MFhGi9q$IZsUiyAY=Cbe9nhn0;B>Lb(2^ca z1Me0obi>F>_C$}ifwM&sk>38YMLCf!b+))dRO;E>Bb#N55V(B=OZIM$13*|3U6y=y zkEl&L*is?)95KzId^TU?66wCp6^n?<=~ z3m-hAS&=SZG$GRI3PejkU4iK3r&}a$^V2O7BmHzs#CSj55|QJlTPpJXbW6o*KixxO z9g(ilLr%MRd)~_)5=rnxY(+UA7W;{G>#h*TjSekWh|5H}4v&cIe(4?&Zg>j5Vvo5} z1QTIf=d+appOCN6trBs5x>cf=pRQ2!_tO=MHGaA$#0Edz6XH103RbV@fWRUV08gn` z)`~cz!y2s>z5R5>Vt`+|Vlm23_pHeB(>*J8`RVWtviMi3x7L#svbBz$8{8yv3}IO|Rn!ma zepld2;w2~DaCn#QZfyzM`(1%s#APDA6~7{~!YX_06_Mjm1bams)MSVB^0BSrtf81* z5kQxTN_bMQYk{wdOFpVCm28_xtF8%4woSZ2RKWW8;#IbbgAUnMUKc4fDs$f{25F)z z>pMl3AzbO*Ddrl&mBKf~aznUM_=Z#Wsl9@$yy?*VUcM^3L=jn*bJV>hb{j(7+v2MB zLbD5aUsQNyS>6$WnrP4dj)*pdd-iukJW(mN=Wfx@FWnw7%ulyRWc%sf75RR;cg03O z-Fsq})=>+-Cw3dc7JN^HMqtVGheITAA(#OrcVv{BtNAg}#Vsx1MUelf>>cd_&t9&Su=q4~dBKM0e4jo|oMRYA{ zK|8Luj~x(6hT8Rx07@~`wRblASfm>o+WP=dmZ2G-`$Xg$S_ZmL#Bw5C&V!%;l?6COMp#$u&IH}1V+{ed06;}+6>JtGJ9aZV&h`8JUNpBDMHfj7TRkQkJ z1eFPQbY%|5L>N&yN8K?os3Gd|*!_K`1RWRG4L#H+JLrU%9HVtF_sI|XT0B9d+w2>$ zTNC@H&tpN~2-b*l0D2;*T(pkW^i!YWptB;wp$$Rj#C4)P_G_OFLEnmLjmgpu?z<)E zym&wpU12>h)){KhcRT2=5$XDUS5ZG&k8?;h>KkWQ($)^}H49-k!5r}E(T{>Iinc_$ z4&RGm4wbR*MV>=Pf-Z?y9r_~Z2l2H-%d8*a)0*fLSA|Xo{Ullw=~bc2B2^Qt3VjiD zS)@7iZP3qRow39#^1q4_LwH60S8>MBn8=@keig1b%mG)0t_58Yv6^62$O^tD9yWy6 zp??$G4B@KKZ^CXy>0njJ6a1U#Z|EUNcU=@3S_M9T7jezC<(kNl;6KGQLwJ3j$xE8( z=}|7_ExIgteV)s3O|U9dBbdv0qr>a-T&5br>+@XhHI|nn>jYbJ5ZuHEHR6{eql1Oq z?@*Z~WmXHV!&Mh6VmiGlvjt3ttYgCSfM3X!FTa8;(?qL6)#X-0n6A3qMWk1Ss>>rp+Dmo$ zPa<3u`XZ=?{MDgvgTkfVnp&4ug=)e#1vTLqtSM6r;TWtbGY#PwtSJi&;TWtXS89S4 z4lB5h+++yHV5Hn-2uEF{JZ=a_U0r$25RSSi>25>0GaPmGWtbrxbq!>+CR!DWmI;P% z)J4lwV~L|KT4os?j=E^M*bt7oXjy11anv=GTO5iGj*)wbaO;n=8_Bbp>@ktuf@5V$ zTP#_D-Mnv~;Kp*fCa7%)P;5KWQK_5AMMQWUgSQLFBBD}y^GBTAW(be=aq?|V9QRAj z=s!&fm+ZrrLT|0%hrbO=^Fu* ztchWME#x{wm|sh|he+4Gr947Z&hZZDRx&D4_sY|Ki>=lbBU$b2J36?vY(+X8XK)9t zOeQMlsB0sq6X}*{D~q%jPifx?!R_QWLx=iK1=?-scwboKlSd7m?|T5~jG=3N+p$C$ z-CozPO6u(3M44o$R%#AViXnVsL3^2Q2;W%HUS?^cCssPh3r2^}(I(0M9mpp=v63Wr z7{Vu3I?C`Qt-~i)I?7y!;zcKURulDYX9=(V$1R-WT_2t0T!(^KH+jhr-u2O4=5#{K zau2R>^pGowN_gYcAl5@hCu=Y5QUh2|dEC$!2@8UIN>3NmmGIQm47;~%>`)N9RdylL z$G?8^b|UN*xW|)vtm3NJZHDlw*v8-i4uvPa5RUM87 z4|8Y(=qd?E@^DA@@ePD`-#EG|pQmQC5fzqI%2N**ih>&boO&X7B0|l`)@sNjg^a_J)_`$u+V-dg2&2YLoq<( z{lKT%!$1>dBv8d1dXkKHsBXw4xrj*biL&Hc zL)c?ka+4wKhsmX|juN%ZBf|95M9vZ3lo(8v5e4 z3BeD@^c0=@ncMn?JRs*9`sKFvKE3&WmXEcY71o?ar? z_R%`*=_RszUrpH4OJu$wZ0iT*Wug_#?mr;pK^dQlmMd6z{~;mE#%Ad84 zd_F4!2U6XEBG|Jso=D&8w@#)Q!utT%$)%3v)Zq2)~XO*4TuOEz57{DE&*eMxQ@q3KD`y&_kR)U*+FTV=>7P1^?UtNNN;IsqwgzImBGL+WY~azVJ7gA79=kH|tExL?^dz0mJ?NiR-;~P@)fjZK>RYtER~(sl8^R-V zJMX&=g(v<|wZtJjGVi@1-9AT$={|A@(;aXK(;d1Y-C;+E>5e#r>B=0!bpMdMCu1G- z)$A|iCq#Pw`K3Hcq_6gVDfdsQwER+rO-0g{CuD6R?d62r<)=F(OZ;@FWXiP4bf;y1 zqEd#}^-s&k4B>VCGjctV_E|2s`lUN7cM<85os|jGD}A1o$wWHcS-IR#_pL1S(|s$O z&!|jyK_(DspBH2yk@j*y&b+(Q@}kTn(lfG)GM`9WUX+*oEHB9`e!5FCd1j@TA7u)W zzOwhD%rt~o_I{Gj`B`3;FWo>p9g1L=<@*k8mOsnGL^v;hP5vrR60L&IL4<@}mDe4L z2>ngYorPu5_k;Z*^NDng{*XztQMU@Ncs30EL#}ivE|jTthDHx+9crnlIofjSpiZGu z6%nmq^9S_|RZ7l9-3nF+-Wts=6~QjaB%f*|~rsy%~(t5nj*gHl5S zR5V#?FM+DNA@ov3b-t(4OOT2o(lrWFDMUJ5kjgZK>4H_UU%C*r$>=cm5OvTH=3Z3= z&chtEmuf1`5PAtyV~KPfd}^AXrB5yQv#hQ@^0Ta=KD~jyaVUb-P=7eo%pI<3=TQCZ z3xj+tLbWzz4UPcnq>1+4HC3u6)@1O&(3&dxUP=cvG_;m#O^>&%V9A3=ht^h$h|1~Q zDN^xoSF_HfW zsIN9?g0t(a&<1L^p~ZvW4~VYl_bO;vNm-HM-iB(!{pdwsL2jhBICN1oQhPPo_#T&7 zbAS$)->FvfUZ~=NLwO0(z32m(646PgNV~tgBLtCId8>=Cj=uI3=R3=dg z`#k0VYoeAK9lm>`se01TiJ1FCo2nNbdLT4Tz2y*`zpH~pI6@u^jaMQ0rd{AoF)dZB zA$(IzOEt*Qr-QRuE0sl5$}opkYPUlVgtk`pLaGtyB3L_>W(eOOlAtCK>HHE@u48$B zXnS?Vp$9@csLX;&FP+p`q5`;Tv|e^r>;YZQZw40v1!{siz;mA}M-x0z{8VTcmAi;6 z+4aHChjvv_i#56KSgN|J%ZBi(QCBr+iS{`rax+-&FjVD^!>pUSY$&V|Qv8ExsrORd zR1(oDyWbsqLc6JfMCEY3^{mxRrD>w~^Yu_!hVX4@JyfnCyw=r2tu*QOM|wmL^&*kp zPxMf)6Y2bVs1hQ~?{H`j^@T}?`SnmIHBo-O)MZ1MUoT}Z#Zs4hFuz`^Hqj}LR||Wo zR$2#FbdQGiQXLFoyYyDw4K0lP)9S6#4DFBnDzuN9YG_TQ6n)fOO>~{MuUcvdubA~! zYYk1k<8)|WwZqU{qJxIUMEa`qRi_PQL0MAOc_Q5s{nW2SdVkhW)mlb92L1kfXg@Vb zll?IC*Z`Gf==xp||ch0Q5GI-fIj}XNcfE zO0X{&q~t@Gd#R24g25_-r~t0X!84)is3B~@G!^wQS}tI*cLr8VQ|*a#9nw^qCfN6c zf^LJMPIrb^8=~yx)MK<#KU6(Oq{}i?Z6nfU8LGZEgk`x)T_)0H8Ln!tpjM*ujuEOm z(E^s;sbRGdYB7->StHd-BHh*_m3#!#t+MaFb56C9s+OU}cg_QfHuN;;(&2Li+Hy1K z(p7guMV;qV8>KQe!55^9)F@TxP;Rx+>bSAo1C|-;iqQqMFH#vQ_EGZ50@~+R8>_N3 z*`I>tc(usr_JYsxYKKF))iTv}q804TJB!prm9P@MtY9AiO;R(7u(q4*EVZ1dzz$41 z%%-RfhH9kwfOZqDVhz%kR-2;E7>ZAO1V}!nOO}|ny4qB=mPntkOrxVkF1%~5ciL0c zrm5dZr(1W9vRCO=>UYPB)#j)uBD~ICY|T-vHPLnUIjWZ-yv{yHr5elA-O)1L5S}~D zQ8NvVPkRM?K0u`VZ;pDDs3P~ZM7Y=33zj=fI-UD|O(ypfhIH;<6IJ-UNL1nTI#DUZ z`|IYY;K!-0=?#^0RV^Yt%IB&Cha%WqHHfI3<5O?hYPmz3WschKPz0N=>_YUJXU|E? zX7{O7P0)VkeXo+DeEaDtWgA8p`tXgotGPtw{D;JzVXM_?BHb%bs!KP}u=N$?3}8>H84g7N6>6e;4~ojkQpq5i#6!=6^@4%t=Ks-v2y4$r7F zn&?i1XVi5=c%9)HWp5y#^vv?JD#{SviSVpyqKUk$Q^^ixg|1V3iS)U}dKJ4-m+T0% z{PQZE2;Qs?`|Ib`d_%a8+@O{k%Y~8fRIS=Xly4u0{(DiCXiK{9{zaAb0{T3~zaR2d z=w`LpQ0<{oY*vMax(@x*dP!|3Dy4TGy{z6dx`{)NhQ6#0YVs@_3h$^>XAHeL)K}#d zRr5v4!E+icx2jk}-n&kRZc{0S+7M+L8h%$c+ol$3qW9BoQ-wyi6m;9w4x(~;hwyfF z)ac&6s~ElxdBvo|WB+#L+eB?ft-D=CIg}N;UBwaM_WqiDT_q9eW6n-B)DX7k8)}kH zN5{WiDu+n7*;{J0A#Ag^)FwmNW^bzxiAw3{^o}}ibl7I^sPN6YU9ipes5nE|W_who zA#AgE)jC7iW+ke`5Vl!~I%5ditVI2)iQ240*)QoFu+2(UtRZZrQk9~KW=N%KED>(~ z7e%R>t_fDQE{YFS4v~IC-d=T|V;R8qs>h6F=y0U_Y{g;ln)&_1}IKOQiP<`_)OJRrb2UUwiheD~28#juf^9)2*^! zBuX%}k7$sg)59l;{c4(_UrCqpicTj-pqKEinxaO$8n9o*8)`$kUWU4kC{p`Xe?zx{ z?tmI^Cjd&IJ^kJTAvKeip{kV-Z5!H6fq4y!DO z)`gX+r4DThJEo3r)9Jn%@p{;o>arngK-l6!7+GME1$RlCp>OCSHAI{*d7o1ZeuVcCu?C$hSVdvBqL%HeK!Y-)7 z9a?vPAL;vErS8-;t4|f*59%n9p7Z^r&JgMC?tFp?&FfeOFWw z(E|1{=&q{cn(Qyr8~U!Q%Z9#BZwkbAQK{+a?Q1HW=oE)nhgjECJQ3EmqwkuUrpd+` z*>$zZQ14MlUpSUMeAm?lBK>ZdKUC6Nm;-vb-S>y;PgDSN_94DMRqMA=r?(a6N+w#x zibvh;W3J41P`8S`J}Sp2T#JZSu!E!S_bHcqH|lhoxm^)NdT!%(C1|p{jef-EcJ((j zaC9NiFhlrMnC+TrXv}E%-h(UG(6rG$=5ZAox({?7*E5FjEk^;aO+@+{px2eO2g{;o zU0&A)q803+(NFsVU7%n%|9oil24Ap4g`;2f`5am|dWWyNYsp|I-Fu0n^}RgZD)a;S6lMy}%yrBrY1x@HKU?QH52@9X^DB&zCA5$I|;^r|P$ z)zHw#VA;&o%Aq2ljt;%*Y3@ofG_S+J>bJNu9Gc|0#g*gG3{SjkrJ>1f2Uc(4+Tze8 zPYc&xhh}(Mx=tE8)nQ2WRxY?<0Qw!Cqis8+dTUpdA$-oXjVr;?P4cvL^>=h{c-pzL z9Nin9MAsrm_nxPNYn`Ke&(qPh+Ymly+SzrKXa#FFW>odguIq*p#!Rf9>`M3m%d&#a zanGvW#noREoj-JSWfJL;)zvkVXchaZPm1j7+F)qFm<83lxpo*@6IrBsxIQqH9T}~9 zx;`V)UV6GtYMniJ%p}p%<=U%TLR&@|8aZZh^`5Sth9-`A7%1J)`{`eMdbt)E+Lykn zdN0?@hSorSDXwjXW{fGSp5hAJhdJond%MDkR>782T)np|-Vkmby<8^xy+&89#j}#^3UXf##&DAt*ww~W8D-}(T~s9M|&-GUU}pJrNtId_;He$dquwfHo7kUesuUr zviFb27WL1%l|5Abr`q1 zijkmgbdEP~-P-SC@nUW!V@Sw#fj$(TSM1Qu-O!^ zJ=`3BbBup0{na@1FOUCTMfY-K7UtdvBbznVo??=1}WG^kdofRt=Lw|MSJ)w|2KQSImdrrFMkhuo7E%XKi%i+k>=m#{-Y7Y z@b&r0D4!yE5TwP9`Gxru)P|9aBH0wA#adHXk70j5qewfQwEngDPs8RoH5GIJ_i44I zE{V3(^}R@Gbsu$_hJLivTgnKE(b}8$MS9Pvz4`A&U#3(jEvEOYINmsWgJSlP_8%nu zJ^1_49=;+Q?MH{pDdq>icpal{bi99z4&U4|{w47bW7(k0nQ z@elv?NUJduJ^%Oo==SmNDeWzheCkqRxS}MLVZl%^ zGA!sACmC8o+mh5})7vllvDih37wigYD`PnG&cakxNCtz1qv!u<_=VnY4QR=q>BNhApP^ z(%Y8~|6Lo4>HVQjtHb{_Eoc7uYAwo&ZPq`m{ph`re^|FniM5)?IIX=uNO% z5F_b)Q_+^_GFzg*O$^yIy(ulmbEc*L98Z_rf6nZ$Jx{4FljL*IgPWw@Gw6MV-W%W? z%wk^B>TvXb2@BTvU&ct*oZ?%7w3wdDX+Qs)%m1A%rbnh8Ise;7|9AG$|3CfWzrWJ6 zFTGDoqAl8gR-nfWN{eO!uqUT|yPgU3Ap1%i&h+T=_dk^O4|-3f!}`kDzmL~8xL1L% zuKRh=$0Pq^)6L<(iutQ}f1ldsX3Lvxutt_S_uo(L;2)#I7yaV(u|Rv)TK^dTc%9eH z-u&bLXTvvpyE#Ue=kLek%*0|p`?Y{h`}aNg=jh)rH@B7csm~B~xZPYFIoeW({k?T2 zt)9c&d=7OhY4Hq&Gykym=3k4O>yqY|@6F}(FT>52H{1K$_@{-BP(s`OgJu^P&)Hwa z;5AIa{B7_HJvYX{%blDU^vTJyWm4%F-AYT9q%FFjWE-cPSs;dW#(9sa95sy-{%Td@wKtQdRP+7)vc?f=}pl`(pS2v=0~ zYE*@#?xUalEOpwyZ-298mHCzVR;946slM){*GcvIuYcITE|s;bxEA5B#Z_I4MSy3) z>iFfQORi<5hl=*mF*tjvSk3<{n|?R>^dF7-O2~f}!`YMI(=yjuG0fRElBE>?F-XBa z2PxTUkcwRb>0(zwy4jx~Va`U^X+8I07<2!Bx}qBbme5LM?;pm!nZ=q@yxt=8816{+ zI;^k7r9zA_9!W*f@&Ob7qtln@%x#Bn!w=ujQ?z7`^wv>xUNGNGtgN zdhX5Hzn^tKOWypiV*OQb{%adOu5KI~=%FIUe`NmsyeiA^pZM2Xu9m)B>|ed*Mnl+Q z@f71fw#z8S%&~Qtq$>~YaX%wiH3&=7I~Ze8Ohtc1{e|TKiXRD5uL8h6Fc0qsm<%yD zhILK#3f;}u^lpwhOP>9&`{@?eXYP13w`eu?Uv2L?FTGXj?M}Cb-U@KFi?g8n(L)4C zJ-4awqxWyo5HDCW(qh;?tm`mvE#+C6E*Pkn6{*|R33EGbiYd@9o z6@K&#AGHKfFeWm*)4p(j+6 zfh>g&g5Pk68v*`CK-v+Ias>Dr1^z~{96p9k7IQ)NtWmr$KnbyXU%KaKk=Wnnx)?4fX{4QDhz~=$@9faSf;I|BZN8xu2 ze*a*@#6RHw7x4QM(w+hTXTbkAY%u()!p{e-5CUJ@9s<8Q>^t~<4_{FHkqu`*LHy59 zzn{VOXR!SlY<~g%1^5@>Ux0sS!}y=jeijd5k~e1c;N4?qE%=&YBf}>gH!}Q!Q9XulHLJ()iOb#=J~uRgV~tPjTys^MXsApVqf zZ0w{Or>qkoSA%64TTN}Un&A_or`RuJABK3l?&CFn0B;fOs?~1XF-VJF0OSH=j#>Bw zY%!ZW4zz6RxN6}Zibrn&><~Sfe2ASKcUL&(o8vpgz8yCz{22RfTmU=9tnmTt9IHKk zYWQl?&R3(dAtrA8VMv=aepdK7wj(@(?E!CTVG&~Z_@1GM*kp(~#Ih*urSJy)9DBPK z`dKo5UwC72Yb|&(T1>B%%j=0HwU&TzK7F@+Syi9Dg;ui(r|5gcsA(%U#5Ym?G61>Ik*tTAufXMI7Si zeYHr|j~GBLP>-jXfwa@bcTsC2ri2GhD|+VFPG+v7x~SpnYoM5zua!_z%jrt1M>tqG_kf&B;Rj>#AdG%`vz0N6 zAiO%}FoZY9EQj#cm_m^F)Oc@bfi)2RCT0om&3=o?h8TAvlwpn5LwsG5ag7S)4^;Od zI$x0Rb}*2eCCb<2IdR{l6nRxV+~LKVSH*@&vuk@Kv|;TQ9G@|u-l^SKo||;CcAhw$ z_$`EgpLD7AYI^a<+5>D4Sw@JTvewrb0R9)-L!@u= z);gnP%gJxlnINrt_&%yTChx8@U8aMaAP0=eW)t|t$wjVgiDj6;UrH>ilP9ruE5I8( zrO2^;j`5GPegJK9n_ugk6WNnfpdA*1#QJ(7uZkBZ2S*;WwoNW@<;iy@H-d0(B5o1i zOzr~VrzZ9U893$6NO%X-lm*pS$kZv5M4lWvr3l97=P+_6@Oe`XLrET-vN>`Bf0Dw_ zQTP>-yC~)Z3Lm8KF$$lbvJLF7QVgH^280uQAA{T+|7t)nv;d4QS$`_NF9^RzTr4|H z{W0*ZZqC>PJA&n$CoEhPrb8lHsqdNw>OWNwpV5Im}vzN({x%Hs|WFm z?QGt1+OoQ<8NStYH607Gd5>vZ!KQiBH$iUgupcD$xJThPiK{By?y4%>?jj)Oblp)j zCi8gFw4PC;#Hv=w5yjL;#r%(H+3;?M1m6So8mqAB_|}Iy)A4N&G1DKahc+ugo=z+R z*&MW|*y!oORZg+HA)LoiwouPZuU0=%l|cBI^-yG&$UJ^zde5jX3biYE*7yeXyC^&s z>=D+CqUy!`bMQ7mu{NFS?~!pcQtA&-14s7*dE1P^^+&0@W*m^C6xL+|lq!HtH}b(5 z@YZ=ql~sR&T0dhB$n7)c*UwXU?8s9e%~%LAWivL^U(HX=*jj%vrCP!NoZ(}OsYZ)c z)w|)irkdQnxBhC-F18n|+wcAaEJu)>2(sA3FS)x6;#b{$fNi9hjnEEX)_;W`y8FBO z8~Mq*f2zMzeKGY9kZU6UsK1BfQFsr>qwpTyZ04WV9*)Q2J@DSyKdn(Lf9A#pS6SiA z_Zs9;FC4SvtQ5J2p3~d|{$cA=t!531-luxax-0sSHDJ~NzDJFjb(rl_3n%+P&cLwP zK5Ko=Q&gUP;QTXk-Gh72)$!#t-s>*+x zJEa!x75`{7$|bX9>^WX78}^EzjgGy_Zpl6jvj{BDRn~d-_t0y-vu}?*#qP)+z)!I; z*}1V3T&E@-1zDPXI(7y1-9B+B8%92J-E(K-Jsij0YMPa;rkUPqKJp$IZ+!AS<6W!y zJ@>R}lBaM+x0*k8PlqO}`AhcjJXhm+FjG<~^G-Hd;kpCDi}|d1 z{{+i|dD(0=FPsNkkbG|5MX-N=-cL%c6L3gXO_WVfvERVv6m#dGjLGTK^pL{v zA=QRr`sLgOF+(7{LOzg_B6qrqbGA3#>3TH>-c4+M(=|DQ)0}MreJxIHe=Jnuj$fW;IDf;DgR@iI7DhI^%J$dxH2cA|V1BjwKe!&8zqDBw z@#y?N!mFyu1YE3WM3meRoElVlD5(`u3XjDa1b%S*K-Vstad>r`V6+e}GHn;ueat=solg*_wXL#`2O7$5}$nCCz5huD;C3ZOPYJ!Ga#JD7v=Vh%Hyjcyhl6-pP$_0dL#F1 z&kDJy!PlNVekvDBay9oL)vm009^W$d>*o7Ji@a}}N4W7Qa|-6z>%t-|e4ex(l&8uq z_1w`TYu+--wJ@&{$YpsgZ)u_S=C!+}g?mgS>=WGhlqk+2;W!1e$5FTJ5ew#Lf_!lP zRFGHl=G@YP>ea%+QQgAAXE$3|@23}AEiBLdDEFmHagKMtAGf&vAW!l1`(L;v(Rx35 zH_6glT9E%l@N?jnF4mw00dPhtSu>C}YYD%2winJu3*jNKAXdb_1i6-7;WpdCLM$83 z>wF-0u$mxuvAQ64vuKbd@a<3=QZ@&95Wbgbvm<1Gl5?1zzkI@xEC zeJ0swk^MBXpGo#}Eo_GztCg}@u9W~X-|7f*k<}ICQh1Y&&6ZoKAXi!gKo(k9-y-V{ z2(Pv70=dpg2f4u-3v!b+5#$zYD#&ftOpq6>b0C?(T1bJlum#p4P+%=W1lA%rwHM?i@B?*G)gb< z1#+glKghZ6Awe)E-Pl$oZfvV*HkM?j{b&ei?R6k??AJi%+8=|=w~v8bWPb~Csf}e= zZlj--_HPhVXb*vKku9sjzQx8;t+T5@c!M1Va+BQ{{HOSCycUe}#r!;P9{wKh zCgLNyStw6i7(d2-&;GXV0wd3J8TB57?}|E2Qh3hu8BxN6F%2O6LR2>jkAd(T^~O;6 zJ&@nlJx$@oUdjc&83(xpqFg|-K@}=P@Od6xw?VZhZduf*n-8_`kvvT@z2&C?Rn=V~gb)xy60&vnG)Z?B z0$~r8?&_qZxAc;L5t~YNb-GA(RZ~@+PRk%c#AOs2M;*q$;|MA^;x2y|+z`hZ*AacV z%zF;%45Fh9;|hq(jPLtB=ic8^Rh@1!&YOWxPT$|%@44rm?Jm^>IRD%=%bEH^iMeY9 zKAzHN`_-igl5$fk@(Ukftgk1)6a;0Zp{;s%F-VKeq(8(^@+&&>+Wi24L{uT zMCAKTW-norz$*n_C-Atyy99nt;12=UuQDmZFYJ3{-Wk#Me!?FK93Eu2VL#z34iK)r zn($rM5VpUF@Cyee=Ea0-Um`IA+plBzM*@crG2D&F z_g_=YIX%AD#Qmxn}A9r3aTDS~|LP#j>@_&RcfjvOUZC zm%Vt|b<1+g#+SWu*}EU&zC<-1nCZ{?Go!JbZ!{faNUMu8*bk4!3`hX@V6VjvEjQLez4)m4X15v-q^PB z;Kt0xv5l3DuiW@&8~(*7H|ET%7=ID8g&ucnw!+9;| zCCbWXK%VHW}H+^~2cQ!q`>9I{e z-Sn$X&u)ruUb=b1=Jw4m*<9Rw)8^N1zH{@tHh*aI=Qn?S^Y=IZ%jVy0KC@*}%c_=* zEv+p(S}tz6q9xhV)zaT`W6Phmyrt!ymit>CXnC;ZZ(6?6@@UJGEx&D<)4HT}W9ucY z2U~NkQ?18aU)}op)_Yn%*!t<#ue5%z^_Q)4ww%3X^OnoEv~TI&vVY4>TW;HO`<6Fu zxqHipwtRBS|Jw4{mY;6<`Ie`)Jhvsfb-~t!TbFKKy|oX!LjBl_8i1Dj0QRsx2^;$} zW&zg3Qx}d#j2YTVsNrDD|JQYP%$UFGS`7H9u4RDHZpK{R&6q#yW=w6KyY}%HaQ6d7 z(QYH!jYE>pfgC@@oP(B^VdrNB_D)tJW(|6=340TpvD?#X&cY7P*;uO!%}(UJ$SgIN zAou0i}{&a|1=qvkuz3-QuIw|SH4!RrrK zV-M&WSk4Er2Xw7@D{B5rGi2_?j?%l$A?|9xA{aIwHd%AO8G%J`7}&iY*gaytZ1U#o zX!Q{@4lCfO`8Hbpj(Ms1uDKB&{y#GRU~V$sH!p*Ibc^{X^K$I#{F(VNTKgGV`B&H+ zKR0hTzclYOzcTN_KF&Snx8|>4{lCZj4m(ZHnfF4rz8^Nj2TVNjK{G${A+sRzVc4`E zH7|(3E{Qwlo`Jvef55lF9 zf5MMsJZ7$lz%GeAZjzB7o9@U@;FbNU>5Kf#^hch6?eQ<>MUf}XP~_+E#QxG8iu~GS zBENwJ@{}3D59^LcerJwF{>{8R^6%!>$bXpIA|~>xNHp^5NMq!6k$B|x$lS;sky9go z0y=y8>=mHAH=px9z_*|C5y1DI^9jI@pYvHjP5taSUqJW;iwPGmJ{_gjEPerCi@?hy zeqixp#5{H`Yx|AB*iweSwfG3)7c6Djo;l+PuaxlCrAHBd!7}Co0joOobv>3 zUB*^Ee$M9r@0L8;huh-p=Qo#+fTq7E@bTqG5dOt-*7Le1mip5swsm*Y=~xf{B`Db5)_UDVM_?x*3gZ=#G^1BfKJ%PViehXnrNa!TIe!k9l4sa9Cil zx7w?ZZ2B%reQp!y;;RC+SKr?BDB}NN(_>!!Z`-&z&K9==exmt>fOl;1j0){pJa~Dm*s9rVyR=~E48P@pWOW4orFJbt@4e(jfahJxKI{;9xxl>w`vqQm*{_gC`yb!+%Tw{|Zn9eMyo_@+bs5W^vFjPc zuieG9wtd&XBdnv|y-P+XdF~dd)c8pWKXh4ao-xW{p4~+po^mDOIRe)TJYV36Q&%Of zMLl0hyan*_-Q;o#uWw^*$J&S`4L>a5zYoMLY-bNO_45+`hQMD7e0=wnry2A0Gdck8 zO)}@tlC1M39a2i*4FXRbf9)RT*Lhbu(fXB!7w%=M*16_|44?NxwsM8QF^Oq8?LnCL zT0=c**$hQvdVY95Qcqb$I6bx0ui?I?UX<#->Hwg&t~7k-RqW?&oo_?@>pI!nJ3EQz zf0+MH#3+R*|It!z6)?ZXTz=Yb5We%Y-vK@v$FT}4t?uYzZAu%OQz^DKe=z6$`&jC0 z`&j=s_uY=#bbVoLm4s^rUUxP7^9osUBl|y%_)|nC{<@ubP;A_A z_2&^kvi}h;^$l0Em5*J+HC0Q!+WOB9GWFSm%(>>p?B|{rv*%+1-|%9_e_Eho;Abyp zi&}Ozr8NIn2Y+z3G4~Gs*)*m51Y(-jilBT(DY)?3os7dkv# zlje-y*K{3X?mzT7K;=#k9%8)8k%umO6!8yT_AKD~%!pHUDjZQPYGH zXP6z0XCUT$z=&CkT)006cn03Re*xlm0!E?RpM})*fM=LX8qY@j#efm$`wNk}0q_)q zN9&M!8DJDPz#^oc2Y8C6H9izSHP3SdP?-08cS5X1-=-)#>q#(2yBy!5x!2~F!~iSqv%l-wh7_&=oij=0!Cq>BoH1G zSVWJauvZ9gz?rcqY?VELH{tY16n4s0fH#{i`aknDo8G+B5+Ys|xfxk1aLi}?A{{!QW;tU;OH1b-+ zH%4wpxIy5lkvkAGPvHE>8xVh*z!yZ`i1@Prqvq_$n*oRgZRBl;Uk4a9>mzSRc!R*^$lZw9D6k{)PK5VF?g88zc{gAx@*d>8D)L^0UkHd7 zVj}NH_-cXI!&;1(8(=F&VX=J};d11Dgi8XC!G6SCM?Q}Dn+3iCmLy(W6L?$XQ;2`1 zz}LdE#OwoN-eFyW1_Zu7@(^O~5cr13UnBlc1imTqHwgcE@-`-2&ek`6lAu1qfP-Jc97OfH-3w`8L8Ihcr9qj0+c~;nA^c*2>1YdL4grD^qFVs(iEabDH+nwc`=S>B zeki&V@WauI0Y4JG6!34Omjiw|x(o0t(FEXEqiv|?Yk=Sw(Int^qI&@UKAJ-O{{{rF zh+c*8V}McfM6?U==g}U(Uq$x;J{|1`d?q>w_}l0Kz-Ob^Aph?Gf%(`$z*y{B#KdDm z2sa9x7fU1NG(gDVSO)OySQc<`>@eVxSPt;q*b%^`u`$49u_E9_u^Uk8V!)`mB31@$ zk4*q3W0Qa#u_?eku^R#R#%=;k#cl?CVeA&bt75kTcExT3?1{nqg5As40Pc&u7O*dN zJ79n84#0uf8_>!iVAR|edn4d0V{Zn0RqRf{SK}NAIDG7_fFF##4e&#;w*!7Sb~oTh zV($dJKXwn`Ct~kLJr4jz@k{aV0emF(Uc`J0FlxRVdq2W|FYx=Z4>p;MW@F0zTX@5AczO`GDVQSOEC#hBJ}# zyA5X{{2hTmz-}{Sal<0Oe`;8Q)W-lZrwvO1|G8l~VxDYRiSWM&{6)hm#Qaj=Qw?hn z{~Lk7Z&-(T)3^>Xk;V-OM*%Tw*nfu1ZQO*IMuBr0TM!c$IJa>N!lyTG1AIZ_`G6}M zFF?*!*q4r)CV{IPFGhGx0 zJ&4&22zqEt0k$_@1(sz@5ip7uwTlSP1&rd&>>B{*#mj)F#U~IyA24bb#wQUz2QX?D z#isz9;x{5@6(Dr)IBkoK@tXmg32f@jC$%@wWi(j=vSHv;l(4#ovbTUO;fU_}dYFAt1P1{BDFh z0i&in{!WB@0HNW;??Lz)f!D>~jhG>U>G*pPe+V#YGV%8Uj>O*&n2Uc9uo(X^;CTFg zz{&VW0guH$4tQhy0l+_se+uxX_-6o*#~%c|CH@fL?eV_`d`tXq0Pl%^5%u2-2+cPB zWrRNn2%Z`LD#9NIjGB+d{|@1g14hjQ@rMCF7yl;UL-9ut|9L?0&-k|izYzZ};NRd} zanyV<{yo4i#UBOya{LE?UyuJI@;?lSwHAL2@VoKH5%c$e(1hbZ0sKGlp8|d_{siEo z@h1VlAOAVvlkr~y{%ic#fIp8v1^A2jGl0L0KMVM)_;Y~2j{iI0Z{oiPd@2sb!aNNK z*%yx?{98b*tT~McF8~Cc%$Wmt?wq-ZSqg}?HfJ7S)13K$Yv(Kg+%)G*q;3WTh0Hk% z;Z{IU$ee`;Zxy(0&LYHIHfIUo6?2vX?wYe4urOyO;N+ZDfXC*niQ(KwBnE4?m+0$_3jn{-$U8;?`OSdG<}U|)>HL*|FPpy#@c8^SfG?lF4)7K8 zHvk@;zZCG*^EUzh@%$FR*UiVxck}xBTLAxb{x-lj&F3wkcOd7}=3S`sX>%{?eA?WH zI-fT0L!D2X51`Jc&4*Cu)8->+{b}?6qt2(z$57|f<`by%Y4b_c`Ly{o>U`RK7Ipr+ zx#aXK8~;4FH9wlaUP{4W>X+WbIsN95y?U8`Z!MjnXt$=^>!u9v@`iQI<2Ch|=5 zwvE(RpN-y*zb5ir^iBACWn@$Aiu2%tiJTuhavsY+aa!tXaNfv~(_fEGg?MD_^gln; zi1^~^@51*lrtq#@wBa}kKu?Bi1%HkC$T_><+eWS4e~{Mj8&$`3*NOYm;@W&aKEFEd z&Ly81t&Mw5>f?=~dH6>!2`P}b+em{iz`sS<&s>auOYrYp{9B5DE3v1!+N^>HWHr15 ztKjQc1rNb0_%NE`5om_bq8X{(S)dJ_4)zV>re5Sy11D`1b|#*Vt$L zrTGmk;s3zA{vQ8gk!XZU!D*3sk^7@xUGwo+xdr3CtgARYk6;DQjG&{v+9Zwo)vZ-4i1t*;1}> zxF#hrT zWQAPtkvY;|NmsJrDC7n;X7jt#<*Y$cexjT^nq_9wl`G`N(s>EjK@Q^6`TnUgh}i3l ze)fX^&`JElp`>=CGr2rJWmH~bS9Yve@@CFpvid>)UR6C4mGOy+;0ePC&dT8MxRDggqNad`Nn4F;}RVR6CG1kQ>XI_UuS{B46>o z`^PGNPvm2wGK!hZWzs^*jOxv0j!cZV=lls9$mX%;y%F>S)!B+$&HB}r&!HLG9G^t{yt8XL(SHj=NsIF`;8{5+W6Tt+iY=t>HH`1$J9UtL#wPgk(8 zxq2)g{PruW%IGIxB6eWD{Zd%?{kr}gB2vBi2}~AfhlBOTsIf->_!Xk?1St+RR@*J^n-`8bz~kJM?dPMSc<5Vk}Q>qr8ZJh zN`hYf9l2wmyT0rV6S-1$*rZ65;IsDcfl?YQvBaf|SijyjENIe{umo4v2{R>1hs!24 zP|C3)v?wK$N7MNUVWhGaJznfFUx}{Ec^#{*%Ar+M)eGiNej`0j6-J77I9=&Nnq$>| z+o7h$#vv1QWlA5hywV0(>d2=tf?$du$&mt6q-@pPo2qX|3&ytRFzJwJquFIy>ELu@ z=?X<(-b!b#cRx092(kbYj~pSK;`l;1HdQWObm7)*;mH0RMqO1r1zr?v)_&?APoTGF z3sZ@FK9ty=&E(3IoiaCFBxjp05q;^x;jD`gx(a4d<{FFv#z2CVDO;p#IAcTIUZ__v zRKO|%r)Q^aL}z-cIKg#oqa6x0zSZWU*jJ`fQxDNp6X{8;niO=5vPuZ8HgO_P;Z;8| zHB3fbnW`xzD65Ul6{c^f8@kePZ4p6rO>|ebT*fM>6JHrE4o}-(;J&7ao2Z(EzHA<& zJ}NX?lQ=L6UQ*j#>K7bHP5!}hwp2f%lBqjgDV=R^{n$_a;}NnqsWv&)m!1se-0npr zhSTFUL`D{_R3;oIWj{Mg#WAmC>YJ?`n3uO~yjs0DMmbd49w3J68~W1NxF0oG$yCSc zLbh2TWHcnol=npesqy`p(d<|njBCgBCe?H3dWe@k(fI@1rYhQ#FfW-aSyu`-qQYLYioVdW`X0@iKA;S{Jfs}|k9Fl*hLgF0Wzj7~X~ z3MheKa3%E1iV06XWJ`{9*AarDBo%#Hi{Gk86@jSgJl>d7qA>Y6K`f##i0n*ZLZ?ac zM<#qkG3mImcXqN9jJGBph|7SDrfRtuWZiIaOdGE$wz~)`E*+3s+C7TS?qa2XVtl*^VK(e> zCZEOhWe?}dv}BWoOpzv{H!$NE&p;8&E-^e@LdX16+lMM_m=I42fB8DAGZ7F2V>LT0 zD}lNwEr6^gsvJyjG-tJ5%5B65{|VTNmVfS>$iX7^Oh}ZQfD9}gu8E(@ppe`;7+J8562Ls}w*(2SHCElMU(N>O`rTC^$YK?u^b?XSQ&-GAi0XS#M}A!HCuM z;Ln5KKeysB72(JVIDT8cSk4A!ffZ#-YSlyh!!*rKl{sRqUJT zFd2%6G(+tIJLujqiHSTb%sm))e6|wBdbry+;v$gec6^~_G`(fv$^SPHw zPfW`D{nu(acUF)g&**^N*HbEsLf7wb$mQ<(#a(;KC=vpd!&P_~Va4dum}GGjvpVsdP#;*EA} zC`vth@EMllH6J>*O0oPjttlp(trM(GlLBy{fWnSh&9BG?T(e}3OXXwo_bMYda2 zy=+f*BnCSNoU^k(^`fLAvsf-q$*gorhyx7FGLankl=<>}6Ea!e7t^E;-^n0T#A^L0 z<|3nq;{ZIof`uT6g@KZmUQCz9awsEt__qTN&{6mh3d6J{tPJF*4UP>R5|_HrDzJM9 zh|GF@#hl4#?O(rpV?!g(qrv=8g1RQkmEADQk705YMFD*H1*=9r-7wg74h5{FpbSLi zgN&;tGMrO598v1$lPJwKHU^c79Ku%Re_Qq=CIvMo@!acx~k)tuP>X?k@pmYex<^i$W;3we~eZ5vfXs(<9Y`nVd2s8M8QCJ&7LeZ zb;wPKWK5+=6>_9Fa3vz+5M1ejW(1eevWxknfoO@XS5EK*qM9f}#mho)aR0$YQjSQE z%E(a;J3SFI92}ku))i!m3tLP9@0LbD#va*7zZfC8W#0WS&ZhJ%fDHBotR;+nfB3cu zKSCOC5dV^Z36x%N$iKDa; z!ehWriq(5XMF0l8iIGlmCM+Uz1?<1s@VM77CQquzU#ZhgtCaS8qQjVb^m%4qct({?R~Did$_4>gA$>+bW$V7N*U?&I+EU%|QfCn}{U|r3=`cHitv=2{H)&r%ksLGebIN ztX>Y^)@cpTm{L_0DS2ch7)b?YKZOlQHG7RWL-pDdtV?MjiHQ=_{EF!UWp$I~i_gil z*=XzHlm+1C7auS-v&T*}8klG@v#y?c9r1~?)n&s(sxl6_&fd9?GR3<4a0?)xcQIub z<&J6i30T24606>K)$|Xv5A_TV^bQUT?M-yIcP0&El6`$WeJ-LrG>KutriP~r{4{IL zORJNUBRH;)y>J_gUi!iS(QUm@S6vhZw#RxnAe*&6Lk_GOruu2H-Ch}11H$x9l&~EI zCVqG{1;-5zcEH>^hD#rv*%53*7spMXh=AS2N(Juq;YnG)!;?U1xmbb-g8Bn~HR-hs zrdd*N0W!me%Z*Kp>9@~B#;|FU!?IV6TNYqA3M3GYNQFN+c~HYVHNb@#kI8X1xtCrY z$9!FwF5unE6Z{sRa#qZU{^CR_gV_-$Olx~CeYgO*o6EqhX^(CsdC*1VJdo~x&=Alb z3Xz2RG&VFAXx;U`x|hKo!F2GNVee}jCmL&Gnb%SeGuWW~>43PvMtNaa3|5;G3Z0mJFha&FZS|)|;GD=7#+^vw% z74#0iM>qvX!K~834%67nD@}36)MJcHW%V7ACIY>Yrb6Qjb(Y#S&e^!4_yAri={)LV zHL5115@m}1Y#H7nBjL7mK2J5t?1t+aPJZ|}BqZ|#Av-Kl_^T1}MX-Acnpl4}d!z?i zUk(}_g5)pi3w0|X;QqpDptBFBW9(n8P@q)C`D{yT7i?H6wPDT958DKT9!udwdLM~0 zMI^BUeJ7E*fhQ>V19#)qA!1zB4N@DIU=&qM2X+ujCS`~|QkQ~5z4*he1{<%>9?Bv>XC?(=O{1WlrhZn#M2#=-di(-XJS=^|sgqx#M8x17{ zXz`89VJ@v#qP12DG8P7}&BFx$OG`+NT0(+2H)W3ySbq^1B^IdE=9dLYvnMr&=-dKE zE&g_ukfHA7LOFs*Rc)SdjP{hL?Rv3GCd8^4$lL zHpoHRV5%3KNsr(8?Rrs)CU(V(@;xb91JL2w&R-S)n-*&rECvTasW}LlqR&WW#QSJMY3l9!*@J-{G2X>!jZue1pq_v z<|A~&M0NsZuVwnG)myyNvzz9gCDvYHB8{DEG%fUta+AfHYs$gwwV)%MEZJB9z7F^Ey^r>ajs?oLP zRnbnzAx=zZAqT2)gAxaF`QZ%w@OD$tDi^FPc?>2iri(Sf=m1K4u#{6H#QAOvZy39- zZ6&ywIi)T$=^wn;xgqJh?kVul7df(v4Nec760jYzvLVq6VNx9Sn&KH3`HGG>M^stHt3)GX+jjBJ ztq^ejda1Jrf&`Cnh_I`Onz;44R!frH*Ou1c(6I*tFyZjr<%U^OF$DvzX9TCYG2b-i zdPerboH2XTdC=69#(04P)c3RiRG(214c)*z|8cFr`NZXDeNb}Rir*4odjEtRYm!VZ zEb%xCy%#o20aPr_*S!#gNNLS+OAzXv##&w7kZbKLq_(X;%B;KbA*0Lxr^i2lDCw56x z>JsC7(>zRLMR^%VIqVmxH5q%C(jvo^JZrlo8a!mGi{2oL-{FL zKj{)wWUCFqrjc{@V$*ZJ{R2_foeu*zn5Qb;Hie^HJkFKO>rN4Qn^+iL_h5R<0d#3r zW0^_jA@E6L_@BvR;-!Jlg*~em&-_|1b7)BO!MjQ_l14%?gQXmBl@Yv2YVgBv(Z!-3 zukU^jEZ$k(FQUx@4RX*;{VK2{aHKtJPZF}b9;PMWVmx`wSowhaST2O1vlSPoK{-h! zd01MG*Fg>U>J3GZD)g3sq=(Xoi4bZyi4-rxa%J#P zMhPd`q3MX45yeI#tJ;`w)k#`%u@H%|==k zr|QXBdrE-E@)qv9pA&M%F;*6pqsfT_taT6(rt%QkdM)DUJ_e zixL!F8h~Vja|F()GS2g8IFQs+lG4E(fhb9%Uj`MV3b^8fslgXjGl&+`Gcsa2a6ljr zu?LkN(*oZKMvn_JIMoE*jF%N9h_h$e(jmBH7`_Cp3_!@)6XreF*e zULxNwC;qUuq_V?l=fJZq~d*a(uF=Tb_nc_X zE)ILCbd$;;AvwG{&}Y98`sNpb{^SbyO?u4*nhG@IHPM=pLt=VfS8hq_MH6ew?vaBV zAx@?yl#qk<*eP*Ij3v;1d#c*FK!A?LoOTRd6j{qxEy3~H3es5<;<0#KFXpt3w}1w`XIdsYNw$bq!^K=VlMK_?+L$j z4x~T&>6;7I(P)WI?$uaE#GGF5ZJh2b`v|gAL(f@u*dauG#So~WNa>WgQM_)rVMrx` zsSe;~Pqv~h!x~JJ|8peJ7K9dEoYzU97+q5bfW5P8u?_~izsL(ca$_uQ$;-3%0xh<2 z^D*$PtJ*_7x)4Yd`#TM;l5v(}C=nbAC-wcAM!qz5XG@r>%n|2@z|FIKnzswBlQ)Q{oN->$>RGG^$9K+heF;ZzbO6qn|RTYOTO_hTcLWuH! zr(ZHu5%xR44m{Q!mW3f+Y=w1#Bym#5ZPqo)zfc3q$kEd*bP&~ zX<{DIiAF0(yf|{a>Nr&+s}J;5=K|fjd$Fw8TfuVoLBuxp3TzIKLY$)EShl-i>y@4w z@{$7TJL?3kO0Bj^tDGacY~_H9@#1jpH|x=sEFlcn ziyV=@*t&T26nC6CEpoDhlPm!N>cE5FurP(~oQVqV_+a0T+zrS~OQ5G9S5NURR5wu6 zPgbZoT?W=1j$s~I1FjIWgd)QELrJzhc*R`PaKyiFR`#%z8HKD_)IKn&^@ zf$RDuWkWGiK`2J0oGSrR6BD=k8+uLln2WUY$ZhaeBus!4Cy(KbA#`?bu1Q|>r4%f~ zuISXcTG*9v4D*Bf%VA~b$BI|NsSAYn3ekvkv`E3tlFsLUv=(q54*i@UMw*=5CvA|Owf?=CSr$S;a z`&FEimYk0sTN*I?YU9g8hvn8+AH4TvPy;-IxEKZpOPcrSiT+WZKj4wBawUx+g)`c5 zVSi8CG{_ySXD=zOtCuB ztCQdivh<@9N#_ukyswvX>?Po`_OcgoAl~`vN~h^YZ(p(_b+t)$b`2%>C%XqE)RpY- zPwYubxVNvTH`zCk!ZKi{J)J$f6P-gp2b01yaMEbR-q5f?&KvJIUbsU}{A8W-&Pl5m zU!5O1i8ElTiv*H5iPAE5`SW9xCtxU| z)%zNtW~Ro1bB)k-^qYJRyqj0P$+-~EV}>OhRe|2bo?DjVmF~qccN`{!#URP>ML3_B z@5Zp6<3JkcQstvg3F4!AO*a;-jd({;}VuWL7JfhQ` z#cqptepQstOct+3&;>oNT>!WBuGd4$($3H%(=$iBc!tw7w!eYSRdr0180nsy6*^rx z0!6(0vRaQOfw}6lI=a^u_(VTEeOs53^|Cr8TqBvyl@e!)xL2HqxlT$=0cY{p>O)0b z+8+O)uN>!deGc~}R8;#BigLA4#S(u(i8#SLi2GKSApn^j~m~T@JC%8=Q*LB z(V*m!Ya+JGg194yD(xJd{NwqGP(CI$Ac+1BH5U5Nz0T3UH2| zf|~~2?(?t4>Kw=(pdaaGp)Z}2Yge@?BoSS-x`6BLT7*($nU3Y4ybO2S3$3^(Y0tTF zNhhaEWJ&J=hPH`wbn=1~%Y|d?Wn{O)p}NTFclTYc^I%2miQc8aH3+xm2_ccgaZqOi z`w4mbRD++^I{j-FfeNAH_(lBc;L*s*J#YFZ12~4#sFb5mRVcH;u`hYJqHPpLEtU*t zU6~*PR+Ld~9M)|ehdA&vnu{ggYk{1d4)xCH3e6;^zHWj?u|Npi!J$Hdakw3>X(wDJ zTMM}Ua-!A!&QRC|57iGF5*QIT9_SC_n}HpvJ%fFshz$)S_L#n8cYCrA4+rui(c3GZ z;SVT<649IJOLR#Hid=F}Pv12f-Iwa=gDxf?s@6%6%GD4RE;DdVuMLTsrICF-Jp)>V z>YjwykQ7L?x2FbD`&p@005!0GZ%=2te(ETO+LOBn_h?M2dw?onXE4s@8tjEWnjGrt zX}5jQ5vRKM4Eg=CSZEJKrMmYfF|1^}Di`+3g%r2ZBT3*`8OS~{iA#PybDh42CD=1&je(=T)dZ!4Y78q z66v0Wd?Ft#72LuQ|0#YtM0`%Fq0v%Nv%(4O-FW!2iwAKHPlHYJjDyj~PN00@g@$1{ za)N_Xc(H=&maQGf8T=2ifBa88xPxZAk$8S(?^z`^)=+;1!`hzlZ7k2CLiK(_V%Ma` zv6x{jm%*1ys@&Nex)Co1E*C~^Y;BCPLU^&qdkQ{V^wlD)B!?e+0@r=2ZVN*fesh?^ zI4@3L6m_S7&Wso4m?%n(nsP`~uQ3@poQm9S5~a+AtFpOhW*7a8m+YXXIrT^H^JRD_ zk!Rt{2G4Euz@vv9J%pgTO51QL*)wLKHJm0!Uq^B!=RF{GrEu!}FXm?+ zKgK$x+?y2KrNF*L$*Ry?BW^DPV*$m>^R0n7fg0p4G4A2fg_;byr-8!2R0)1pRj%xZ z!R;y-zhW~VNc45Pup)`hh;&{&-rR?g5sD!aie+B8p(0P2aJ>E(KyiEoXEvvJ5oh$6MltkEVOf~`zIKBCuUy#?)V4?oZ+a%=)QzXxCI-iFDVwB zLN?{?%>#czVstfOPF%O!lbxxqAz1!>1IC4Wdc7c`hdPtp-gi&0d=3=t%St#nD92rR zr`dPAkSPWjg?=e{;?_J4wNCl_yg1v2!><*bRNRk!C2ka9&5*0pKsCvJ+?q`ewe3yx zX{_2KT*W2lVeoKV6mR_4Kzo7kU7btZP>oo-1YjX}3?H#6y8)1%>h zc9@A+O}{UW6o^xg3YsW{MT2P7FTXzBSRR%;nmKTjD7 zk7gv_I+II}TtD82q!cTOqu^X*n0}7x$m(v28tNj$TM#a`ANRB5KnHFW>OooWB+eeZ zB?n$k9a42zvu7eV%xhcn7l#({YI}j=vS&o@{`>w=Rdr94W1xhWS^2O8S^=K=vlVU{ zITaOi1oK{drj0Q2OP-izG=5uz|G&{Y?HseZ{qLJe7nA;ueWy%eBwlD4&kn;1v((*{E+4^HV50_}9cmkLV?z`dT5?cvyJ1wP+Nq`V17EqC z=kfH=zgR->cF0TZ@?p8YI}Xu`6Z-{R4aBCoeRHkkGa<%m$+j=(|+)*UEoiPP&|aHLd1urpna02f{6B6I#g z5{=9h*KL{fB?qkehi5RX4etk;ZBk!Kr}_`>AQ-Xp%lA!m-cyB9-jihpSSgyU&~Y;y zxg5rmyrm-v_l%6k==i9JynItH2?sjy4tGr%GDo}PQkzJ2YtJ{O^V8;BR+c13}&IdN%YM)bXRCkDybeGw@e2Y4by=3LrT&U%z)QK4cJj5vbuKACPR zb^ZBZ`}du<5R}^CVKe( zJ+1-z2m}_qH|Jo^$x_7nLr6|^2i^+f?7?c5%Z2hd!MNvB!-HAyVu?u}ERZ~gN6so) zTv@^`RVZYtIj|bIyf{zVPy4PU=0G!e&JSRuU@|s4UPNn$kON^tGH|Liv;WN>00<<9 zKYhhjM(CBoy~y31J9*m3j6v6+rh)_PWuDbiRxQ3T;EAY{7?r#769+yb?Lt;M^P_pg z%0L+DE0`JlDp97GHx)Pp_2DQmOdO2?eGS4TT9Tug#u1fI2yi~)IUTqS$MAE&SeC^} zIjxRA_7NF~Am53(y} z3P83gWGA8FXoP*%Qb;%a4jDSqTPc|rWlKf466irxKOSch6veBr!-~0J3^Yt!WhDaS zGyt(roddVxiu$(9o;JhBo#~Z?4;CkF;GSs5nRHy3ECo1^K2vc1_E!EJQ${DtF4eSS zb!DSVLRKUi_GhU=7Qrr4zXHS6OA~&&eqV)Yu!pYwUqN8kRjLYYg!Dh5Z>&k&q~jAb z_9iYOD7;1YmUt26dOuf6*avIM`fd%@iDU@AHxtMv%K%)1)DKL-14Bi|szKsG0$Ffo zErEhj*c-Y!$?`1?I6n}aC8KaF@eiHu@Q1Pp5W}}~!GuS#bma*YQydw=WC7iDmGXqK z@CA@G*hf0>s0p5l09%42w{P5r1i%<(HVxN!j`nttpQc&FR%^oV=Eqnw4KpN9zW%5lcvlqC>kkFk088LgJDE7Q&nX;3`G1svBJ&slng zf`{s4y!I{NL_k6g7Qjz|!C?_}V`U|m5tw#TLTO$qRp+8w618GUVnEI6>?X-1`rA?| z;@loRIgrj(=)jk0R@=B2&$8o9AUr}qHS_>pBoO}wbK2#{Ag;6PV@rW}Q4UB+Ah1*+ zgH1gm31?Dm2uh#0LCE1Q+`(SZL=fU+7;~q?gFRXE5zJ+;`zb?5N&03*u!?DZ$QC!a zZ0=RVEGe>FJgukL@~2qXHglH2Eg0jDPro8bpit zlD@3U0o>3P8w4Y#WM)6Gz3Tr?m49dcFlIzg6Y5D}cmM;Ry2$MzVkBuucIV;fhZy!Y z3wVDHOB_NpknEW&pzuwJbJgeSGVaC!HXROQF0V_3STJIyua%koT(Giliy z=^^ifqwka>lEH=piUAZ8z6)s;ivij{a+BNU>`0I0aMf6ELCaEuc3vq$oXbZ7$D|>T z_0s-sN(%03L4naHLiFIY-kfGWJ>6_;^Uh4zd(d`FmgRb4Xpnr;`{EfZeLPd2{M1`e zSe;=1&O*Z38+VMrs5tRbpmzX^{<#2C#9JgFL0N_1yKtKc)oRdog?Oh&5!8%RSMGp2 zV`aq=*%Dw3k7e<%I3Xk!3L}@e*4SoQd)Yn!LJ=$rnvZgqaT=HIFv>_3t62Jy3d2*p zB!Y9);d}S+Knl;kzAFRfCw*UUCo|t}e$cyB$~@VB~r? zS#Jn>LRD(voC8DD$RQ7NBlef4w0psrKy9MFsCX#J4P}Tu{xFG#p=VI(NaOg2@5Cg??LE4bFn9ISO^a=#Nb)l1J+F+Fj zw*MjH_~t~```tP!W7!j3_sV)kCe}Tc3%EJ&eFBp_4Tm=6H99e5W#GesJGdgbanaV` zXVwfojrxke#etp*g2taYqQ(Tet3O$xLV!M44#A29QepUV6Jw-+%0(8(3ZxlqH%GC& zC#YQcD-d_1?DbY1hIAQ>(3N17)_ZGp^%@eyN}?tx4geuNaqYRgn`)cml^J;qKvs57 zzxDQr#{oElq7MF}*rGCybI)1GRJ}fk6-~7qgHfdh0VL@wJAvM*Ql&F2dH^2!@*IhQ ze12rg^D9~t&ta#vmroek`y?*XkMjr)YPq75b~uo z)#^Ms$!3q_U`;^T8!S+jDdVSaxbIGYyDM_v9A;MqhP0rMU63~(L%Nx5iYP!GV3s0E zR3r;0fg&ug8;>C4J|25Lo`!Rg(5;H-^mkQ~r0+hRqC)l`@Nw!$^{6!{jM4o3#_NwfH@4&=! zyV3bfMBt)!a(>V{Mj^@L1tZ)vDWkWQPwAI`=9~Bug-OU6nD8b`Ix1qBV!G_ayI_o^ z7%LyH9~>tWdM42gPmOS?ZnBhVxi6m6bYak=3+Bpl`c73w9=sr8ri4_f>4LE-qd-c8^mY^o7+U^m6!sQ# z0u@SGoL9;hB`Ra#leG)dPm#=JIqo8(gQ7}r3+9)KCPHu=6?I{w{Xmq>4W7-P&w=xg znzxJ+`BV%l3a|q&@01xUO0_SNvw~%yRf4Rnzs$2F-2lyaCLlV1eM&TKUAM6DBZzzp zjAz*3OXJFx%9Rf(N7RRWrTzNUGZ9V_%oRXe3E zy@FQ0;>N8P@7{V*+s=zxF1l#P_LdzTyDwEx9+?!+p^7A&agL|2kDmG zXGboZch6}1H%HWMNreY5L_ubYR^_x+44eKDRZTGG@EP0le>h2(_fFbbhU8n9W$cY& z9p*Cp#VC1Eq;%ajD+t}moND&fss;-CKphs-FU~M@L9_}`vHT_S;mtJQuslJAWN~ri z3g>TEe=7t8Ek_(<7{CMm;M926TNiA8ykDJ+c<9^9G>o6}EF7ND68UkvzfcelQoSLs!gi z%(C><*$^5E?%aR`;A&GJ6Zt6 zN%zw|F2&1=W^I^~l(Wm1k^H8|ofMFcftlhqtrAh08+!OvvI(MGReyQp5w#SdAYj)+ z{=zp{XSMZ@<8r&~7T{D1R3xd=Uygz|rV-EeEtJLbe+!ZeD1znckcx&XQI8$oiS zqL*(i297BN4k?gCWo72-Ul$dHDX2WPN$xS6QGntq*H}&2^W;yIol)T*HW*La#|G2G zM}0SOe!TordSMF~ui=Nabr|e*C9t}AXh4>k4SR$;KB^}Mj-ZZg-a4OQ5aab}@3B(J zq1@2)C))<)u0pB{_gMRTy7eN2-Z%}PLa-%5=P4XR!w=IGtuh6DUr(yI9e;B$VaD-4 zcA?BLAcVJpHVMNMga;F}U@kFDrUTnz1?;Wm@%NXx)!Zm1X0;NV#>rvFugw{)FN$X-ynhY2iV%aWRnm}*z2(iy4F_v4TG{?c-m(X_P z+5}3#a5valk-zMj))wr&i_4%S-ta_z<_qRveKq4-*MU4aX^r`bqbAdi8iFG>Tk7T7 zE&V@IFaM<@QYU-OHpkHhyf_#^6aG!0cf6usiOv|pqL zrg6MYCJEXg6;1$h7CFaFX2AB9Wk&G7;%!o}ND3(+hBU=-`8_J2hE>KK|7kxOBvMHv zt(ZPmokplfCbk_#g5fqaTaYR<$d{9^&8WD3Elk-jO_y!n%gr{_w-x`+$NyU;wAC;ZCrIPy$zZ*D*b9!a{)mD#_$;0)QyCR%t&6E~>7AC~C}yr5H7#QQaDWJqqLKWJ zoW(4yj!&X?6{e{KCy#cs#BR&aaNkwXQ-vCuns7 zo_z7Nur&bPL zPqMdR6pD2xB~&F+{!YF?t%I^(_~H`I^$21p&2{Bb)`OEQWQxyeZESjWec-~>-n(_| zdQJs2*oXem7ur3G?dp;vA7H!Yg4wiMQ`0uBiR*&>IV`iQTsLTJxK_~i0>7OUB%s+d zh!t3BZym;pb}49k^#YKBlLoLFRxdRljeTS!P)}7TE%gYUAY+zV-WQp z=|-DeW2EMBfy6U4O3njkR+W7YV%MX$B;FPSA?0Esb8NoL5tm>w*37490aF zlT-P*MpP#Vnq}k(1BgF{aU8%%l!fD=tE#%GN&OcYmD{-1t2G$EkK|5%zhu>%TeAQ_&)$DmLbeTF*?u!oXe@=fxZ}8{$WAolmImo%mOk7zbsx3!!qK6_WKhaHAS3n znCR$T9UQmWRgXF0bhROla+aQ436d_wo8Ovg1b-=Ybivp8|z&QS?s4_X%Loy@3 zPHI-Q%yI+fxw?i8$mtXff2maKc<=$OX)+s4FYrgv4=1_MML+5*S+Bt5#w?)$UfTvz z&SDC4JO3EsV$H_P^A#1-=Ema3k(E~W#ZeyVqgpXD=%upU!-89iNi_s2R&)cKS=Y|& za7Ke~SZZTyv&Pp-wn%De6^xJy*_U4FAC&itT`!2Q>eLgCak*c!(mL0gSMN?&Z*AHM zYrUo(rIKl?o=zG)EMmS^>F`Z@Hx7y)x;Ln3o3k8U)8#?IjkvLT%%3Y(O>pHNs#kKkTUKb;F}df-8)2r@FKB zn`SmwFZ-{`i>egFPS{W}XOgQ2^M-5UI-<&_;*pB?^fhq?gLw_;QcZW|$GSc`ZLU1b z%MQ!Q%{relm6uk_6ydkWZ>P2q6hlszBO!8$QO75F(u`|0`%ryW{tW_E9K->nl)$i4 zvOs)InL1@Pu~FnO)@LSk0Xugk#LU!mz41xeiB7Uh?FreXuOG4v3I-KDBt2g%Asf^7 zX|s?R)zOWXFXjY0QS5SYs-9fYoU3k-w_uy7pwA*ATJH@1~S=M+K5R4wrc`wdU~b z`>T?(AEmj6}m1 z{11b=$YyI>0X1F2agyZ`fnndBqStp~&~c-#BHbZUJ=8f+$t=}8r=Je`Z({a+bp7|u zS)r8+*f;7GoItM3u+FVIzywCeIZ%9KM8|KPeZxr<&Y%IUgeX%>nnQIwnhYsO#E!<4 zyE~-vZxg15-bi%f(%JW6zzXFi>_ACbcxotXN>Ep7CAYvAZqy)NM|WtfhSCjd(eKV&?_l2IvtaPD{ zqh7Dj)A=OE7IOt4e7Tn=G1Dj7>2rN^gsYcrKyhm>n&eu48CLDm2)M8Uf_=- zdkOpLxKF8z#-~>&u+4Jr(z+uGG)#iDY>waJnwhzKGoe9OZ!HpZwW`n^zisHgwzt; zoOfn|ql7G$JF!7}a!gD&N+>Jcwg~(qv2JW&hD`va@9;*bT58UX>@x(%4yzRu;A8Fp z`YhJ!{0Y$!Y ze5lDrMnvO=CH5kPMiA@PQ!#pShAoo*Rjd&DHao_B?M$uCjP2=rVGhhxdqU{M9plhZ zk=|-I(S7X*z20=9dTATz!4-Pb%r#RF|o)zYKxKO=Q_f-o+7-mT7&p;2&v& z*d&b>B(`23X`QirWOAL%5jP9ewo=}6&@kRN*D2=K$$YV2qDuH9DQ2wmS)QKo8HUX{@J8>M?i@n0X!Px1l?@VjUWwZd*Hv z-H9Aw_CafhiZ?YQ6^PZ^8W&g@_2 zCuI3PkdATx4n3nKX*LCO)XJcP z5ct|BY@i)~RX>WTE~|SAI=ifr%(@p9s{zYFb929*NUM#lzw4$fpUW-C%VeRR?`T4o zt~++wRMP|3dCdKde~7-<>YcjlNuyoIOnslbE1{`8{;5AiU6&U#A}9XRB#25Avw*2La?rSbulL}cnYR9R7Y?Xaq@j5%N(4!H}wT)xR=2eRFFaG zEC1o^=86oe2pn|*W(swcNkBaUa2V&kb;~gu^RauXQ)kW4H*ZmaL21!`oncE-r}*Icwi6lTDrBgfl4H_cASdFMR!@m4p*kVA&fLvE#Dolr zb}-F!jLqDKdeaehcpkuT4~b((&s(UE!-Gk30@ z^G|1*2Sijwq8(RHO$m$7nU-n-)T-`8yG&=H;m)T2;oeeRgNA$jR`P(EJFOa154eY( zF{S1~{;R@Qc`y}N?ed9vQOy8%vJbui?I^}AQD0Ed*Qyt#=;$-Y-#qio)-IHUFw6s( zHQ!$Ug9?%3ch20cdTfj1_RrtAi#Y1I>bZQpHZ8eGl(M0&OFX(%Zdwf_WKSeZpmCw z-FKelqyFG8hp@FEDqf?oicR!qj9~I<{osA`I-_;o6*Jh2e0olsmI`T-HO;;T9zEGF zgvKM1EKB;mgN#BqFr8pCH52f$x_y|qH2U!(drCM&EP6uS(fP3 zGamFv)GJ4Qnp!T?$ zKF@syC%FYZt|jV7k@MiQe&(U5=O#dP3-z|t+&&FCiGQj@z3Z&2x(<_W5A~|vi0k3G z);U*iG>T)6DCmE3M!BSBPp*9($7~jiw6d;V@2a44J&~Njnhm;GsPfeB0oaqMF+s0>wWFFEM|ek9 z4lVbbTz{wSN5A50`h(JBu0dL_UsDLDC%FO>;C=Wd1}JMzNY-x)*pp+HU`8k>DVj}+)KZ_9`xwy?>g?33QP$}$#f{&(?#9oW%a6@O zw>}rBSLgHW?U~ga&a7nnotO`QkIw17GQKp^YgI8iRrK%-?LSgRwGueH4KDg9zsM$7 zAoF$Y$8`2ykX_K~C<#eY2@9TO(@i4`iU$@Py%M5<3BJ4?}VE^v8~`eDMQ6Nqw^9(y`( zd2AnuT7Dv8H^;yEhwG*?LZ89b-!44ySsvXLqY~;L#Nrx0(IEW8A;MmS5&!27o7h7H z$KU#gLr&18=k{;he4co4zH@@*)GbdV?guB=xlRy9(4SbXnz0GrFQR*g!Vx3Mz z`zo8xeC;gO+W?{I=TyUxbNBdXPHup+SwSZ@?`K|DdYVb+A~*o`!V4MRd~&_7r%{Fd z@DyV1WQ*GB)j~(wKZ~MH4}E$z?jpL8ISKmMofqFy-_1~x8z(jHgGY>x?iJ8*_F4}>s#7XQY^3j4lfZf=Fy#`mvJHT59@UIhLLZ%PM4G#41)V7 zDU{|gIVHNMSKVK}p`k(@Pbvq-(FAhPTYw2nnBEp}2Y4Y&Z+U_h@%lXdTV2S&xzext zL$Ak;HiFK`^f+vu16Fp~j<8-(;9BYwbl~@?(UKksAI9-}D&66>z7}E>D`6g0*D~WVW9ip~JMDg@vZ>?#Cx3{!rUTJX`F5H=Dr_rcAM9&Uw zA~z8(m3}aiiJo+xzHiRb)yvDAS}MIh#Ve(|TD46*UdG2INJ6zOW3sD!diwlBwM|m( zFT<;j)1!$bQjZ{lYeCtF9uIdbq7NvTso^ReeCj{f3t!|szdk@Q*>~cWPhu=Ei0ccS z6qxqRm@#vmsc-7KfSv7P*5yHj{*f`-b756q1nV3%&&^Vf(>HN_?FTqmxe=;21q+?U zeIRcxb~?_vxR5@V79W?QSs28YCy?g_818~Dlwv=W(U^q;R@ks@uf$mcwtntLlcdKX zf>?JwE^W>nM15TRUip=^bjh0Bkwddk&!C2{2$=anre)4dp+|ajmUbsZ%JE0s@RW>v zDOjIdX6sl#!NpOJb_(e34C$!7qjuVTCq#%x6uP#qM&*=kSIR5B= z-=N5<$-22mOuI-=$0~KP+ho(TA0oXGDguJTd;Gs|cutSfIU|qeaP_Gq`lX)V@T!sH z>qD5uIo+U$HauQ*Bc706A%MlQyojNX?L)?ia44emB>Kx=~c*YOO&P1l$oD4_cn;F^wCx zT(C-0b#IbLbLVElUNkQIAoIuw&voUMA<;LcZGj~E9XI4NH#4_Pjz~?HrjWCkgO}#z zX5db$LCjIWnP9RddhvW&?j9*+Z#Yg>C2M0N%X};(MtJ{W3ou5LmHp$vZb}!@1bb~3a1(YCA*N=re32)XfvJ|qd^=U$ z#IV%o@%bN>=_UpfZLXVpb5^b3F)^5_bDi_W#L&{2tT8B0O$^4LJmae^04s`B6%N5URwRrpEayjOY% z`Q5y`;|@w2?s7mYSR(Z^3YeKzKA)f9P1(qqK6M_$SV152{HLcJZKbUvAV@VSV1n*s zGyf8dfc%JS-<)|#6~@e>OE6mUHb*0tBIaFUX9u+}WF6HmW3%)U^e0TKeybrGn8RDl z+re}FJqqQJK2Ose4s)b9&XdF7^$3@NVaAfOoTl#I%;)Izv|IR=FK5rJa`kWpRUlvX zqTi%)$BX?O*Gv6uNmsf@YqBn>w_lI;d8@)N<7%zZOl#V$(TEqho?VY#1?FjKFurQF z!|A3L1j|?j!)u9gb?0+ou$1y7%OM6b)e1dMOV#0+wC|X);aPDyBKCE9HcHW|p{C1~AGX*36mJcsBEc zj#|Ef!u6qVM|R?`{{|yn2=498UbOF=yO)3~QLEy*aGr5*3>{~!zh9VZLL$zNlPb*v}YWD*sDnlnne9pw5{oP zAVwHd)HrTIR3`qFi6(b6IkyjeyChn!sVS+dO`w}G?{=BMs_3FLvegD7jy{cAm z)CAJhXN7@lCNa#nnAu#wi;Vin)F+8xsvJ5L>SmF#7)HfadY}Y#Bu&mSnY9gA0XxH- zskt12DyQ+MSkatKt!0u-^D5>y9>Q5j4`P%CiEbVtq6i1i%eelV9GDVMw5b0{{->^t zFHS|f;bhohD6Oj|yQO9u!36YMEE*k!!-sxP2u9$~sCUz-Mfmj|Am*01_1_&u&mC93 zx2X2xM&^zX))2AtBl~-iz?jWcMu1dY=Xp(8n!4UMr!_J^HD;pm<6K&hyL&C+U->CWm+OwNT%Xs$Vx>>VDuTT6R>kS zZRE>zj4B z3>KK?>Bj_mZ_@CKY(D_DnVezpF4gq`K($NJ{Sss}Bu>~Z^AVb7q3sAh&l8Y^z)~ty z!c`Rk#NEvxTfO^G>c1q)Mag$%C{&4S3K=7}N8g(< zge7WU-nl+HG!l&_hJ2djaT6;LIqO(4-4-7fKOlEA3y43_9g1Ej} zHulfMggbd1D3n(z2+Nf`c98n%X2?kE6J;Oul|!dYMwcJW3Fb_*0Ep(*vyr~4vDGAM zud!Yq9(q6pjXOzOjfd+;n1YqB(vwk3ch$Dd*}wH5ZMe@m1S|wLw28W|a8*F$`|O%t zXG&)3CR3_$CMx3=cL;{v2Kju|5gb9GHCtv_5HIzDBjA<#4LGFE;D10tumP((oG$EjLnn#+MOMQSAXq!eO z1k#2!wJ#N1uaqm)*C^leeE^kj#a<*2QF~YWddH8Oz9|}I9+@j(#xNg3LrRZ|wx6Y7 zTlPc*!K?BBe-5FxPI3!{Gq_99iQH?-?Iphi{RJEs&Ci1-_!I^sj%Z62+PZd4d0@2F z_2L@kbD(`pDNo%T?pCNSY+&CHi;i}dyh z6*Wvvqlo|4Xk}AZF9VNNNYbQj#gBD*q=mXt#1i(@D0Yz-KAQ^o8m(!BVi1l>rv83&L?&T_Bs{ed7saA( z2pLlsPZ~`vaI`|XkLoah)lRgkRN|_saEXE!&1N^0{#oHT-2W7X2je!Ck!pnefC)p* z788z$HjV2Zz#wlLP7@ptH$%UA+|YDu)}7h&AZ^kRW5s61n=U~xRlqQ7zue3)jZhyC zQ{w22tNoBTjGNWOX^Z$%0MG7$_Jj}76oU{M;YS?f{>uhv;Rbs@{2w-hjx|t-|4F)I z9yk>Hz-gYUj%g6$YZTL=uR&yokE^ne`rk--Qgi`7&q2wjN$9O9QJ9%EU*z0CoQCi2 zaFY)6y;BoaAztt--aH}vn$-P575ScKX4#mbsaqMgj={;Nyb`BTN;ja3Xqc&+4usMD zU#>uhQ~e2Aaw<@&`YY{Bq$2rO>fQLSH9zgBOV!MVOooS35w7+p>cBxd{6DYX*YnRu z7sl{pulPPEs*>>67j(6sF2J>KVdnRgnRX6iRE^-M7=kf1TBE|KU;hl)Ti0Fmx3=iv zaw>YnepFOOUINl^#l?AFOOukivdhb zR;j}t<-K}$-i)rtlo=#28r*=%6D{=4u4O)r0{E!+MpUkWfeJkYXiQ0WtC?gV&apH} zzY^yqb2m5M?fE=VMdy3{vL+IwD`VlCAlHJ7FGjNk+*~g~pZ6UH^H{x^rcns?eb+m( z!4hle?8b~9zVt<=3EYBul84EK*i*97Q0Fj9!dICg*7lZopR_2wH3z`>zZcD0lLy0z zup#*6?wY~+)qoz18!QOBq5nWo@oxbQ8?Km;^{$6XY)_lEmE?~IsI)?eS{*x~FZ zXEKjxnx=UaEjV-L+^}u@jz$;?H#eyME&mzNT!zdKml19J_n*9p{gn~Z--LDQ1x zY9!v#w|4@-m0_p*GHN`4*F4`tlHtDgujXqG?5ZC_pWN@Qdp$XiV5?t1j{ERUNc|)M z?$v#agBZVs*R}4$aVhs_C&5H%S|-yKbuQv+heWF}T!ZkA_=@j3 zrPs(kTSKT1(o}E-(vRT@O7UEAsJwQ0igIl#reBwU(T*On%SqcEKr-lfVW z?Za)jL5d7>yeIBWhSUz!3aDQ*Jv8;Xr#J^v%EEP4fe1g<8oD5%BM__-5GTYWh;mCzF zD}l!-aLMQKqG?fGunIn)sdB5_5~NAgNou5pMW@-M{kO4J7!SM{cA0kaNf1_Rbm;E1@ZB%7fWJ!_cT=>bu3Cg4 zp0Ty1X`hdNDLX^l^K?t_LDwD_?;f~bt580O60gVJUT^*$uRYg`F=;f-(;F~0Wsc4e zwF$K;@x^o9(?ByxO&G{ceIM~?M4dUv&ElzJQ_81)lVlQ>!De8YzRxSb=KtB1hWh^- z7DiuN(-o2E>jt4{QeCY8JE^}IT~*d)J@eH^Kolx(5{J8UnAac)^+)|Qg3%Y+%sq5a z$c$lJzZPxzdIi}#6!qn(CDCR1{O&7Zh`mt|*s9JnNvX=Yya@`ze-=RRjt7`WBN8=u0irCYSE}Wu4Qi2wq(LUs{~%0T4E67 zw)!pXb?>n?{3Y#vP$BGdIvCA=Xawc8J#TK{?<7Pa##?ze@Xfory7pzl-~(Vdw3y8n z>etEjZ%+pwKhebx8}LJ5d_{*?4gKtEgEPM2F8pMq;@tTEb$S#xk044MH7VU(8j`?$ zP;EsGG61Q(`m2h|8nBWW^CZxDQ=_}6$4@nf>1%3=Fh(T8=@5Pk1Ytik>fxT!Ae5l% zAG8Z~GPNDp(*G_!Cd#|U39PQqVAFC>UG@z3HwUo?zlX!zbvOtq7JTHFshjBL)X*0J z7~)BWJ=W#v>}Sj~c(H5vzAw1mn)vHkbByGTxuW2%NEa=#N6%XS=^^`4>Pi69&4lK@A2B)jkKp;p;CSx zKwUva%6SS}9`z zG=OTMV}~b>Kr*7Ej^H9&KFkXoS~+0(h*y1y{jw;Jq*`zTJvq|z2ufV1@KiC)hfreh z8j*~(BA5XSqiz#$jl-`fy)Ei{yyQTBpfH_T= z(}K5t8Ku%M1B?rH#?dqS*lo3>(Ql=neeDLcY4%s?zfm=c{`xfo%Qaw|lDWCQdIdN| z-8bhJ=#6d&x(u>}csPUs=BGemlL9VHD#gNK(ZQm?;sF$BwvhKsD#;?vqJ@Rc0+U)O zlUm5r`Eoj+;4Wk_Kh=`=oEDStmU>Hpn58oOQcf84a*>rs9)9NH94G0Veu@1!gzULG?$*w!BX?l zkaajifjK|GE5hqJE{5>{1aB=R>Pl8iYwDMuefC-EG75rDM&?Akp=3)wi8g*2*mBaw zvN~;>Wk+^f$|O2l(e);)#l~SX{`X^)>?S^$-Gr&zMA{~RWlLu-w3uYVbzP^B$ok(E zA;A&zL`fX-0uT7#6{e|d^tytRb%cJMbb``&)xB(w1Hs?RiL4_lRrflDB!PFW+ALhQ z_Ft6N{)=+4UoZ9(kFL(L3sZ3^xBiPPzQwlj#$)Ga9N+2Qw9N-!Qdj3I?Hvb1%|BpG2fb3cv8lZLwh&nre zuMEByRayTiN2(n>|Cpfg2vFE+EC*PY&)(C!X?lVD%j#ks+D}6 zVKIwE8;f=pE{oYLvMf9nH?Ww)VlImtS=@v|U=p2(E~R%|fM1~wO&WuO$iQhr(f^ua z={1?#>w59JT)d$dZx9i$v5>RZW!|qzspoH`EC@9psSL>@l_7!PG%vEg96bMLf|d6s zv2r@=zsEVBM$dQvl$25`a7%i4PkVSz=783of0o6Ya`T+tJO^^Rm`cK1jS@tJ1d)`h zaXaf@ps}&sSp_TWpOAkS*u!6Qrj{F;%&Wn zn@?S4@wT+QEG25aGIW;bzsqJ`IVA`G-82v`+6fYH!7-HL3!bCgb`s|zK2+|b6qr${ zv4rQJ0s~1y|CCm|FWq!aR=*$g)FnNkOaFaHSuU6J{0{)FS2?T?o|$~)OzJW%Eg*a! zMMco@b89sfN$f*ku$x@XII?ZiM7&?Y830>Qd=@5$Z zD9YQUm&%2t0@J7K@fc~INSWG$b37fhZ zG-1ivb?V&8L+u#De>vxshg4OF9E#p{fh775H6GQoG^|Rwv@?i z`#_3ZI=E(Qj^*fW9t4;da1R%J6m|rU!Wf__XXFzH>>3ry#OMffbVNkUyGRZJOP_IN zTDz=o;JZdC>TDN82BKU-DP)5cz`R{f2uC2#wG9E>j2bzj3arBlZ!{A$3fN9=p*y`L z9rBitJ8gi`M}?`%k3xH4XtGWZXYgp+k(xm>u+j zkP9XV#zlClN}m&Vslnt)=#(5R5-vEkT~;WW9AA^^BQoWfg@eu%;Y#KTX) z&9L88v~yD;X|5SI(!jFVU&2F;9cyATP5@7?e! z`ZgRp<~Q2(J7QNGmNcsVl&&1)5n%%D(I^ONL4g5s5F6<5e<@h=svo&=S;#0DO?27NRJHf)F!w8jRbtWGPqkj>b%AuUM zjz+<&9P;*rr+IIk$av*Y*8i2aj+}M?_^0eq#MY5al>-n#9!MbY+X0FNwZ;KqzXMeN zmBXS~k9d_MO41{E1Zot9-p3)S zCM(oEa#`&p1Rw%c15_&xJ#qmrN9OR69!`sxRL^>q(*nh5+kiByJ*ReDi~E=ZT!dOn zXqFll{!x4QCypx)=0^h3=?<=Y2boyrHahC}u5{K{1n-t-n6l9wB^@d*;fD=6D3{R} zG@W2ulEaXgOExVWd8?VjTz~z`vkwoQ_WXcb!hTeGEWCQF1!RWID$nG^mi9$60+`s^#>p z6gMSUElF#SVdeqBI;^vs0X@kL7#lo7uTkh`n`90qFo#Rm^`77*8d+AC0S4g;0Hbam zsRw2t0PJ){NM=Jto00#g7 zi5xRh13%d!s*naDSZ;@-hYWGSkR^{qoMT-4rvu|(ghP{q=Yk>V!s*#T zoB{R74Z&F=F(4mwn#yxo%mXuc3)I1%CsRTdHRe3rt^T7;l+=!><0#b^6bn3f)yppJ z0S}t{PVvC>0vrp(!$dSog!>T3y=@#aPXh04V=p+!4D)D}F)eINZUAQ>hh&mgCoV{R zeeiaL?{?vYR|(3i!U?ZR#bK6v4Xa_ga3=Q-v)pUQa^<7s2OcyaIm&=U;)(K6TjG(U zwYY?LP=lsWF#1R>KH(iI1K6tzYynphEu>|6b4EL1fFpJEh&kb(00B%6;HmOFK!WD; zzyUxz1w`fh6TFa;7@c(S-eSP+ZAAkHm=3ct#I|BzsK5U;b zKU(zVRlhzz^;?@Cc=qpqXXPK<*4Fn&f3eW{!$19-2Y>!&zxHc)Y`E#aJ#fo?FYN!F zAO6Gncm96apX^-m{Qp{fYO+lE2KQChIZ z$=E3md2tKge2dL+`0Om!9Fdz=3RR*^%6o9?S{T6*5JpfUrnQ>rH1=aOul$OX2MIv=6)qZ-e_*4>@+&zD>I7nj`aRG|2-;zGl2Ee9dtyx2 zTLP>lkfTO1pUC$wLE-V>=piYSx@5H`OloDRh_}Q^$)y&$L4MLk{una{mXnT!5_dpp zoP*M^YNQBK&^G4D^Mtpo)lTOenMSLfL@jTSZ4hMge%?9ujc0#5`}53wA{KAUwBBXE zz334H@8z_X;)+KH$K?t0jg>ogmWqA-g>g`*w5?d^FK+D{A1W2L4CBVw_?FV}SfOu6 ze_>~_B==YK?H(R4MF_bjVg6&2oqVOx+c!3Vj%#c&Sj1*%&^e!U?bc4)8*;PT@xVIFO+Z}d8)H$sgJKFj^W zcMAmbIh9FRP8dL;+blZ`u3Ug*JSsWwm+=pz%Q!X?&z}E1az78!*Iv@Ul5i2rB;0JJ zHCt)VR*Z7c9_9&R9 z)1~+c=XBC|V$B6@{A0+wYojAAU^?icHfWgYQP;tMbaxmv-kz8%5WhysRk~0~?*SSE zEkvjKugm>6=n5bMPi>J;=ab-UE@vPePx;2O$H6?1MkQ~-OJPfw&mo&m{yXhL#rHX` zG_>HFu;tH?U|0CwtGQyL8sL{Rq~fdKWOG8%SJ=y;0(95SFq> z1xRJ;I&b8%6p`HQFCZ75_myw1D+OKLh-XpVkPg2@<)eO*2W!DpVc`X z3yVN57x4&1JG5c8qDu!SoHhXo)v`<=4m}Bj3Mns3`F6%m!>)iH2iXY-`vebO#l^klU9#9^}+G2TZ?0ZI|ft&i(?zURU9gohIfcf++Hkg z8}5hZ6B?IY*f`9jECYKB;IV>L%YX=QAQ=cSMzfXiY-P6&xu+GDjgs?94l+QSpYrm+ z2&D}dVsTbmjEVer(N3V(%9g0w`!Z^!`u4?cTC=g zEu>yMNjNJ*-UubL^1m%d2gItUokBp^sitrA>j`rgN4v^EQ^vSEVHWYZjoXJF8s4#W zaA16_j}|Qg-10T6qqp!yn}m6=!8413RG@|!QvZzVk~8$f!4GHf?*{lv{uvdDGhXHUkR5A9!aUFbrb((y1IlC@ zZ10BnA(3_%|3pQX-(p;vQ?W#1;RmkeB5hqsPpWCMW(BIP@>)J;NzUzcz$S8}i;@*%YfxB$Q$4-hir|z^w zG(JEp<$s<*^1aF@e8N9flj`@i-w*U~rj=_6m7nL3SD>;z1-P=64@Gf0bTp9U07Spg zf70ZFbb0}i3p~YDE~gq?K&gqVy$VjTmqkAC0{^2G*}c3?u!qN@9jv_(bdxn2nGXA0 zo6qH4IN;hZN~zYX?G-$=)Bb=Gl?7+ zg?Bn}hdT5O6sQBc$+{)ddh)WZb}9aG2|+g09ag%O39wqiN$sMchhZtv4teDls1k93 z45321kEWh0Zu>ZES^Sclr0PXSxZu(aHdy66{$G@TmnOEC7 z?2PH*3o_G3g`IyX<*&pVUjpXEWS2L0B@C6x&kNe~Ow7Rad`gs66Ksrh6PY+$ZS@Z?O89#>?1pc@ zebI*EmT|b7yBDo3j%^>@xpNS%{bXfWH!0u?3)^>Y86F!Nd~RXk$>JE>-+$MlZvI_Z zcnAhye5`o?j^cP}tZ!&xVeR;HLxWo$EAH+c{#J3v{m*^<>wWiZx#w$(@4b6Tv3u#g zw}&*9v&Xs-dBS6o1o5ugDpn4eCUpZxwS^l6}z?+N7!})tjUgn z0RQ-$iJi&I4jOw9$wer6f$43Lx6b%(G_!Ua+*@<~{VmK%CC&9&fIf^`7v+$utQdjDH>;qRU{OP9V?%Z;#_w z4yc@BEr;j8EYfszS-85x8eFQnJ|NA-M~8LN3sp$4RYIMkGVjCa^c^Cyas(%6$7?KB zdewWql@LL=$dq_=xGN_CD*y4tCSoSKITcIQ>-n{w#`YG(pU+FPBY z8WW!lrcll+6F?--97~K*c*(2*`Cv63mIMOZ5b(7G7$MNI0GPHLp@OSWFB3WZ_o{#u zqpPe`K7!QE0=L4?ubQ0RM9Im^q&W%E{}yZ%1)vJ2L^S(Jl-cV2opu`n1*|22#<0q# zxQ;JeBaKdYaOP#Hg3At?@wm;N4ci1?T$``OX$SZNNf1}&&iGG2#Ka_+1kjZUriV&*bc(H!)%6 z0QY#O4IIlT%z+>}4*VFe4RNbVC6S3ul_FhqG9_B0sPRU1A}3sxwaLsAqWiES11eC6 zxX^$#+9V?oumYEpaHRtvEXD}f<}1U=6)wQ=VQ!PxP=d^Qit4GpL{y_G>VYl{_>zb< z3=rnMpV^3~S!6}T&#GLUtzmkC;C6f6m{hlOLx+{7Zaw0eT>BmpClLbkV!uL+pKo zOAR!6&j3z{8jJ^Z2bS@mWs_X5!lSTv5UX~(7451ABy>+w#Y4YKUbh1dJsyV&Owm44 z{fJ@H{KBt9oTxsk$kjr}ltB%YxFna;IOW9Z$+Lh?ntqp7SI_;EOiCbQn_`>_^c)-t|dV^TtPdBfi3hsHz&^DTxyE)JU#||%~Mt`&!db~ zFVoUq28KyiP(l0&kfIg*FMnvgu=2yXmv5&$mT&LGv=f~jw%v&|RwtZG{6i1IBdDz+ChT*NH=ljO6IxsxGqhI_(ycS1SaQa5j3JK#ZUUb)@#c)dz6emm) zSH`p@j9v4IjJZEymQLSKq1Lv*K!L92!()Bhi_Z^_;TN-JB}~iuVySNsKlwq3f~H%M zKv?wnir%no0q!yUEXiG<#2>)JUGT=-%1XGvPmT4BJU+Z*(zET|Ha7hH&V<>UNl7~v z|Aps;$;;TuzDPS`o_%O|Z28d8YGhQ5IP1mYqW&Ski9erpnZg5dHdD-CUR)jCSl>IJFv+-*h|j)p9dyBzfJlNaKlY~{0&}i91M5kvRys&`i^x0 zuiiZl>i5d5>)|ipvxJKTqXxgJ+lqMv<2;FR_}icQg%|d(zYV+y$L`5zmYOy^L&`^A zT@Gg-hiMV;%?}2UeoOG&DvU7zj137TM}RlZY5+6F7dINz5nA%WV!UUoXJ5mtJ`aB3 z4Vry*uqfAZ$0R@dMJkiC{`uf}KybRIh70brB!&XI1e=-b=^f&>8@^!zAG+igQojGr zFRz3YsejJkb9jg!>e|;+UukdfDmrh`zzhavFffCG84S!|U Date: Fri, 7 Sep 2012 10:45:04 +0100 Subject: [PATCH 15/57] switching to an implicit cast as Vector3 to Vector3d results in no precision loss --- OpenMetaverseTypes/Vector3d.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenMetaverseTypes/Vector3d.cs b/OpenMetaverseTypes/Vector3d.cs index 9606bab5..12e4c938 100644 --- a/OpenMetaverseTypes/Vector3d.cs +++ b/OpenMetaverseTypes/Vector3d.cs @@ -498,11 +498,11 @@ namespace OpenMetaverse } /// - /// Explicit casting for Vector3 > Vector3d + /// Implicit casting for Vector3 > Vector3d /// /// /// - public static explicit operator Vector3d(Vector3 value) + public static implicit operator Vector3d(Vector3 value) { return new Vector3d(value); } From ed995a247b19861ca82be65585b3b3860b26df92 Mon Sep 17 00:00:00 2001 From: SignpostMarv Date: Fri, 7 Sep 2012 10:54:34 +0100 Subject: [PATCH 16/57] adding unit test for vector casting --- OpenMetaverse.Tests/TypeTests.cs | 60 ++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/OpenMetaverse.Tests/TypeTests.cs b/OpenMetaverse.Tests/TypeTests.cs index fdfb63e1..a5c5be8f 100644 --- a/OpenMetaverse.Tests/TypeTests.cs +++ b/OpenMetaverse.Tests/TypeTests.cs @@ -99,6 +99,66 @@ namespace OpenMetaverse.Tests Assert.IsTrue(b.ApproxEquals(a, 0.0001f), "ApproxEquals failed (7)"); } + [Test] + public void VectorCasting() + { + Dictionary testNumbers; + testNumbers = new Dictionary(); + testNumbers["1.0"] = 1.0; + testNumbers["1.1"] = 1.1; + testNumbers["1.01"] = 1.01; + testNumbers["1.001"] = 1.001; + testNumbers["1.0001"] = 1.0001; + testNumbers["1.00001"] = 1.00001; + testNumbers["1.000001"] = 1.000001; + testNumbers["1.0000001"] = 1.0000001; + testNumbers["1.00000001"] = 1.00000001; + + foreach (KeyValuePair kvp in testNumbers) + { + double testNumber = kvp.Value; + double testNumber2 = (double)((float)testNumber); + bool noPrecisionLoss = testNumber == testNumber2; + + Vector3 a = new Vector3( + (float)testNumber, + (float)testNumber, (float)testNumber); + Vector3d b = new Vector3d(testNumber, testNumber, testNumber); + + Vector3 c = (Vector3)b; + Vector3d d = a; + + if (noPrecisionLoss) + { + Console.Error.WriteLine("Unsuitable test value used-" + + " test number should have precision loss when" + + " cast to float ({0}).", kvp.Key); + } + else + { + Assert.IsFalse(a == b, string.Format( + "Vector casting failed, precision loss should" + + " have occurred. " + + "{0}: {1}, {2}", kvp.Key, a.X, b.X)); + Assert.IsFalse(b == d, string.Format( + "Vector casting failed, explicit cast of double" + + " to float should result in precision loss" + + " whichwas should not magically disappear when" + + " Vector3 is implicitly cast to Vector3d." + + " {0}: {1}, {2}", kvp.Key, b.X, d.X)); + } + Assert.IsTrue(a == c, string.Format( + "Vector casting failed, Vector3 compared to" + + " explicit cast of Vector3d to Vector3 should" + + " result in identical precision loss." + + " {0}: {1}, {2}", kvp.Key, a.X, c.X)); + Assert.IsTrue(a == d, string.Format( + "Vector casting failed, implicit cast of Vector3" + + " to Vector3d should not result in precision loss." + + " {0}: {1}, {2}", kvp.Key, a.X, d.X)); + } + } + [Test] public void Quaternions() { From db856384d00335be3fb71791079819057021427b Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Tue, 18 Sep 2012 01:36:01 +0200 Subject: [PATCH 17/57] Line endings --- OpenMetaverse/AgentManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenMetaverse/AgentManager.cs b/OpenMetaverse/AgentManager.cs index 2f915b17..562aef26 100644 --- a/OpenMetaverse/AgentManager.cs +++ b/OpenMetaverse/AgentManager.cs @@ -76,7 +76,7 @@ namespace OpenMetaverse /// Script wants to track avatars camera position and rotation TrackCamera = 1 << 10, /// Script wants to control your camera - ControlCamera = 1 << 11, + ControlCamera = 1 << 11, /// Script wants the ability to teleport you Teleport = 1 << 12 } From f8adcd0a37f160894dff23aaff1449a7b03aa39a Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Wed, 19 Sep 2012 04:41:52 +0200 Subject: [PATCH 18/57] arch cmd is depreciated on some distros. using 'uname -m' instead --- openjpeg-dotnet/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openjpeg-dotnet/Makefile b/openjpeg-dotnet/Makefile index ab22ac64..2e9383f9 100644 --- a/openjpeg-dotnet/Makefile +++ b/openjpeg-dotnet/Makefile @@ -15,7 +15,7 @@ AR = ar OSNAME = $(shell uname -s) ifeq ($(OSNAME), Linux) - ARCH = $(shell arch) + ARCH = $(shell uname -m) ARCHSET = 0 ifeq ($(ARCH), x86_64) ARCH=-x86_64 From 70924264aeeb8ae3b8d844d139e00fc95e6a1f44 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Wed, 19 Sep 2012 04:44:50 +0200 Subject: [PATCH 19/57] Rebuild openjpeg 1.5 on Debian Lenny (glibc 2.7) --- ...ibopenjpeg-dotnet-2-1.5.0-dotnet-1-i686.so | Bin 139088 -> 140028 bytes ...openjpeg-dotnet-2-1.5.0-dotnet-1-x86_64.so | Bin 149392 -> 149368 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-i686.so b/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-i686.so index 591436847b00541642952d8b9777030d708442ce..193eca4b34eca3e82ea4fa8773f13adbccd7f86f 100755 GIT binary patch literal 140028 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 T7XQ!Zd7l{u^1Ijn_rI>+|8QM@ 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 Sm>H2YRL2fGE+u0?rsX8Y$9%8-IZ7-uD( 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 z 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�PM(vvK;o%^EnwT& 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 z zf78!kh7v}qKJ9zT*xg~nSHo+dW>??6GDFoW+aj#PL|uMWSAB z_toO-sWdGeDAkCPzI`kVBwM0yBwD_YDpm#5v_*4+Y^jTjZIZstmo#U0TpHh3(h_U} zoAcfAW<4L)MC+U4%|1ToC+ogPzRlXlAJ6Hle#O)#;09|mpkATv#b~zCo4A#Fd?Kgo z;kF6*gErrpyDGwbTe^taWpmQV%-jKFd>+MjR#(`Fwv<{df zKvbvRVQIlpe5XqBt(aHjpE<9n?+q-dgq3oiH_|VouGH~RoEy>v~7M&k}{=G}lgpCYW{zL2Z} zfAVplIZ-A)t>(eV21f{2FYUWYJz{MDquw`>OVZI=0tjPAXJ^Ly;~9N95}e;`&+8f^ z15)rzWxfBw#CAhJQ?o&F6Usa^9KYTN-esIVM7e@C?$uCf)-qDpAQOn5jJ>skXb0QX zr~2LxNyqkQ^@YKR;eapyCt#XUgw{92e<+Nqw>0+lOvyf}!LQQvnzCfb6f3nEQXhJNN(o1Pq(|f5pS8E+B`fG|?Q0 zYpBNH@!}M7UvF%0;gwv9yW_(obPe1O{5qt#Vb7~PZ%aNiG5CRln!HllAwSuRsb8A3 zKPT;m=kKEsjEZg?x+PnJ1lP)W-p)$Kej^PVj`^YF(AJEBbwJrFi#Qw$wgara;NX*O zS(wli9XkrWIQfa8`WFF|c-Mn=b|jVFZ;G^KdHwfmE_?GqL|QWO2Wm~;u~#Xrj+;ze zAdg+7NZ#=R@k0*%kmybzBKj@?W(}`qYl7CI+@V1xYBgS(*+|VIW*TW!vsM~*oAP7o z9mIl%kQ5{~X8-_dR8XB4EX0Dt8El(KEmKn5D6qcNM72r$2yH8H1vMb8Z2qK!;-Zf)>gN^-S0jxc(M0GGLE z=j`lS1meR2UTFcZw4Ea3>NLPx_c;a3F?Xu|heokP>5srV;wYIIC*UOys5W^=2|hq+ zp>ly__!^+wfuP01e$qOQbLj0gSe)o=4XOZ{0Y23PagtO!DI-WYkQ&r#5_ZOa9qyfb zowDpA>_H?_GSO<`o}Wxiv~Vv-Cf;RXZV=40q+aq$TgHGRgJI5)pbw5qMzZpgvwS3~ z0>Z`&*t8(^uMbn3!lxRjd#4t0pV#U1L6Z42htm!!P_wFbYe zdx@ZdO9WkG>B6j*<)dcW>ALVhLE7F=Aq{&>s}-I-lnP1jqvSfJ*`kWnrcS06Ri4v<&u33{b^s2)Q6Ui zip%o-x3|eKu^g4jjcqZAAHe+`GMG%QF*|?jb~vwM2HCr${@Fv&ne5WE2Czcq-%@sa z;+zsXiFG6L{P(-L7(_l`km3}ZWINFa9w}`DWgt_pri=}H?<3SMK`=kUea;KG%)A6? zyJ1i90}v`xzdc^FaF|*_dUW^wTwVvKU}zGd-bl^05jBO8yy5pmqe)JBC3QB`cH$Y$ zPpfsdORjH%zM(}9N6g|WRwd*By4-*}WdQ43DV zu{R|$guE<3R-5u#DKAk|n`kcNA9)1H z0CTgh4T<-`oe>^d-cw8-_w1)@92HeE};7pyMRRd^Qv)sWBDpi3+sAaSdHtwrr<=*u_GtOi#}Lr&s=5W zOHNP2!<{aeRRU+1x8kj}peg4nC3%=$JBK{sbBAu8v+H5vqqTN^VR>$KMs+D_7 z8Xy$GD)PEVvd?x>f+x?b3$#_?b_Qhzbn$|IeD1Vgn$;DU&GuRmb5HmtlMZw!O~Tw7 zzU%k)W^wfhHnTml=u{1IItlj7E=*MD9jH^D>Y)#b+fL&8YMU%x%z#AM0wod27uHoM zZgH|D9 z^k^c9flnK`nG`Z>{fD2Wz^%%$+{-Mc%!wxRY~50GaenUvB0RgX5wtZ zNkY^SNgf1Y1F+_ZzU~DA-5whyoM~5k1x&m>-{1LFq9$=SqHP&{s3abeZo}mudVD{- zLu{xU?-~2KmH$2ydH5OSQmZDO6s_q6JBKWHiG@H*{a@aF`1b=@*t%`V zb3WvW!Hxu0DdQ-`zF%K9krdV|SsA4oM83h3B`VJj%Q?#n;**1tu;0_z_L<#`ZM(@J z(f#npkIfOY?yX zEG3zjiTY6y8kr6kpce?mP!Q9sOF2dO8uz<+(90^GWBJiP^SSu>jL9=k5!)VL=j9HO z*^i>b%_m7me4d^!6#?8)TZ-{mXD|0wWs^>~Hhg!;gXAjAXS}Y@kCTl*!9ES-^7h7u$+BUJU4DYYb&1f&pa5PCG|PPo`jHp<^iJX%}(dpY=tIG1L5WV+5BMxQG8Z@oC_># z3NsocBSlsKg1e2~-JITuk5@zifDzGzlUhjxGv_0N=bK=*9)&nlUgz(sw@SLS=LK&5 zGzLXV(+m9f@27sQWxidFWg0HAwxG|0PTo89&E8lx1bk%IZ=XBX>)*JaX`>@CA0fT( z>H7(uEe`n)YCcyKf}WCfD9Am3Q_p$&;iq34qQHE93MKlxD)@WsNZ%be%twph?Hy4u zdl^zTZWKV>6)Sl%T(`&og9Lm6-o7H6ho#rc;?XpJNWIlpgLGU3Q4IrT5{RY00|}uN3B-f z2Mla;l0$0*Ev+y^817!Y9k?25=imAVtEXwP5As#ihZt*>Ya;3#2sH;S{~ zI^AQX(~*{2yuAx<@%H`Uuh=+dhmU=K%I@dZihX11I^@oVJx%w3QxvLjc4Db4&yZxw zgKh&>8Rfg6e{ItYX>)hDz`ZMRnby3ty@Z_~n-|%X;hsm6Mr;0V8|AEv8VZNNq%(vu{VwIu**MuHiD?h+i_|#Rs^j#y-Tu z=ITu75fd6v5zhK3+q7%gul53TSyRaPo$zvtijlo{J%|Kht*@%wtWqQgyxHtuRTZBz zA;4EtP?1{S?O0%o6-tBP#v-v~VWtf*WRd^&S>o6_8aA~+Wqe{Vb+O%4$x1L5bWd2) z088|FYe<(e#liv><(UJ|6KZ7ggp#ZQ4G(=ij}MaX%kj%p@OEhp!InaJzzj+uDFWX}y{Y(1Z~UuL3Jl6CFjT3L$*p5;Dv zS|B6XfGxtbTEe6kdS8TIL$Un@eUDS|z`A@0mQ-uBXu+#D{>}rS3&~=D)p{gTcaN52 zu|u@vGKo(xq~_XV9>qh1DRYz~>_(IWOhm_ew1x{~k;Ln8wF7(c>_L0+8`LjtrVw|S zy=XV7^nPZTy(o2czn6p5rE80O$ICb@hC2OSALK8_A!;sNKai&5s5J`3wH0q?@(Gd6 zr<;6(FGLyi448R4Nj~I#DJQa1p;i%-@i$4v-${(WjI157=5$olF?V_}(W(axz1K25 zF<>4pRT)FfJeh)~zWsEhYK*sL#}7>G$Iu%z^XN1aHPttf6AmYPtdZxKe5sB92D1zp zJ~H&A(^c!{dhVv(+&6)MKX2G4`%VU%wP41y?d~GKez3=O92%w&U~#ILDD`=-640+x2gejAf+8}&=klu36t-=_Z< z^r{9;y4ulAI$gu@Uo+{{)*&X{U0#|#x=D8@QKOo40&z@}PLbB6+s4;_(WEn3FxdXb zCY|A#YGcx&p?zB>-Nqf#5*fi^VXU5@YKCf5(ZuU|6_wrqEQCj z_pL!E#~B>KvLfBMdvOO1y6QoL&L;8Sei_%cfqZEbB$rO3>rLh2wFcTsR;P{)H_p`l z0Tb}sZ*Ky=K@F$dYaNW}A_Y`cGmu+VDD|BmNC*EmH|fM%ixRDciRD#s-OAJeP=Ya0 z&Ewmsq)b#acWYfoJbMt9)DCL)eKL8#{50D+{F}!Sn<@Rqe8Mz;+QKePOCO2Kx zgL0XYAt>Mk70adirp$d0l&Iwg?dNk^#q+sL2B+uj5aAe4G~>IjpHu^=2swrHd3HQq=ip^M^S?-Ttb5ljY1#)%%&9s*kV8j++l9Bv${3SMxo7t{{_ymlx29_CF08cg$b;w2(DlKG@&wOjL>Rm9ZlR*{7_t|OJ zLY=rUF{CV_UCI@p>x)?{q3y-~S^XHU`Tkk_0Z8rl36Lb{pZNrzI8eR z{VI=LfV^V5Bi~;g;f!N7d9>`O$sqi+J;>3;`TnkN$i78Bn$5((9xRdhrMxq>9eSx- zbNl2t{Ck0@*`91tm6D20ms%xl$%Ol2`$B9A)RIRNR|{&h+};j5lj4w&d4jX0?_)%b zE?Su4afiM&FCu45&_#HJX<*4Qn-PY^%%+@S8{-$96-MO=YR=av2=X z-XOaZaCAd#!){})?J5HKJAs*0;&%O5i7`s1m3@ONZWEsbx3`fXW0C!o!C0HAnhrlh z%vLDl7%SXUX!NBf*72GAARreab|?V z_**7*vyrwuf?UJby$mQU^OB#pgh_Sk1r*vCF9X$6Q-X}Ur9sLWg2yGC9TG1S~hGs?U`Zg zXgh-22HMX$nyeQso<)M~Ca3l5$@31!AK!(iKI4fXwC(vG`qzxW&Qcn9FiUCUPdbfE zuF|;;vy`SCW$g0U5sXqbRB5*%#9Q%c0S;f8@#w1*jsQ)j_=m|S-62PT)Z zd}bDOB`53(n%2_(o>jDSzXKaHLvNSQjwFh-RB;uHXn-PG@N5i%R7of*kcOc4+!LFSAA%FPSkrkn=4;RW8+u0$F&OuIDp zx_{>D@lSEG{1;IBeE-Z8Lv1_5vMjN`wLqo?sVW{CsWSGNR>CMlXKrefEjcV%u#N`A zfAb*kU?!F5d=s8qFCgqCaAo(ok;+HJWFr5+c;1tfO^f~gLr6phs4GQ&P z;bnsYeJ~s;J}4i%;()?JlN=f)plOtZ=TN&u!_;UCO`nNB2bK~uyoot_1Iet;IP;m> zzjUc~IF|LDhvgxmE8*LBCwrUWg<4mX(LsOAa@5bX9M$(*67nk4I4xq>5gOYZaCQ(W zaKzprE*+QOziBZR-jJ23QP016CH=Ps3*~fLhqrU^rT%cY^rhoTBIf9>i3Gzsa+)Vg z0JU72|3xrlmP=v=$nQC4gbG;sSoTD_L(1A3TBa?&A5sxa?N54v zY}v}z8w(&|5;x^1z3c7qBC~-^_fciwtkb%blxNo43ZJUVE=pb-JT=*0zrwT5R%Uirx+I=+k9(Mflhesf({lzR|S!DVkQQrX?;l z$DJU@Kw@p7(rC(&G^IQrl|T*FI()&UY7JQoBPScavGzoDoY~lEa4I1^KX8KQrj*z*8{N)<1$OZIh*Lf;`X?C*i zi*F?BlCDItx&6Z%pRE(%0q6wdl!u-?@%m!aideUlec!qWeJdiuNRir-?`ijz)N*Bv zzq3uW-a=O|zYPhgHR5b8Ml9iIDVB$~kLF7!P9ggUWvY{Oo$oiS>- z$GIi`1|~?N^k3p!;@|ScHxj;oNt6aB_Cc~CK#P|$*0=V)mi`}a20;O508H_@wHrcEB+JB>)3R)<))Kjm9 zU|IV+f1%{H#T278bYEg+DGUw2+^O*C8a938uy?VRu^0fg^e|1hsoQhy1&$&wX!4qc=os3=(# ze}krW&9r`1SRmk%-dhs+)DY(Z&UYW1$5cW-Eee9>;-gh5@393bGat>Y?*xj;kI&Gl zOigHr1`9>0`D~Y+S^$l+Pn>HvHC&hJae*5x8-yG-C=wfl{I{ddhylwGS!AB9M_5?- zzSdG@IU58B4XfNTaX{F=shB9d<|>d{KFR}FESz|K3F19=ghfoR{>Jt;7zWr9f3)v8 za%_Q4>*7y7g~)#TwckGHpLVeC34+-d0LLdI@i%C5vf}~JTk?sc*LnNCDgeNVRev)D53h6e7)*%~}VjDPcQMOL*1nAV;6_2YA|{gRb^H=pD;PM90|DDrWF{F`r5 zM!T<<9QQam7~PqT&L@>Lqe1Oy^Z80{(;@#=9J#hRxnS!=l{-YPtu~i&wp!o7u;nbZ zZvGi*;*Vy~b(1)|T?KK0nHlfaly<$c?lO3F(qkt+zGREI@Zrb@Xv+~2F+nbe-BH|) z_SB>NeeO4p9sA7*&lX70vg1n;w#_86Bm2o&Qv3YT#*-(0D!Q6pz{%|r-c_9LW9JD3 z-L3- z0Es$u*cmMK+WCcl#|02^Nb{;vb1reKiS(?RPq?N1!ebDw<%eTmFJ(-LZ!G377iX}Q zv!4Iqr1vd=F!SW!`ci+IAu1dn&)<5D9Zjmks=dH=C+W;)&GFYah;g>Mny6d`bqcgrZA2gT)l&pKV=o z2)9myY->~>ptsu{f4%0A%t&oV_TXaT3XYhY{v-ZCGyQ*yY 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 bG@g_c_h?}HpYl0WmrHTt{_X@z#VGw3Bu0Sz diff --git a/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-x86_64.so b/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-x86_64.so index 421dc56dec586c81d36da0341fe9b7daeb40cb83..7a9bdfcd1dc5c7a453d8453edc004451d5b9ca88 100755 GIT binary patch literal 149368 zcmeFa33wD$+BRIBG#Dk?4MvTMW9zh<2x@|;X+`Zyx}jPdjVuz^1VSLu04;PRC?t*D z5z4Y5ZX@G18ONDH$0aVKh+Bs(fQ|-mL2;anYc&xG>Oe#!|NWeEDmf|j{oeom|LeQ{ z@4EidO4WVWS)TKp=R9YrQ%z$qJT}AOP^=?Uxkw?@TE-c_c(BT!A?_5#uM{bR@b`G- zI2LwL-;TnFED+@}7-yb%o;TuT##`6!p$sa@FmV;}C^d>#D&m!jc-A#V z3FEM?SsW^*Uqq)naX)DYm&blxCkkO*DJ&gVARguS-#x7S;)swEk^XLrd@=ASoJZrl z8Ru-At8u=7^KP6c;T(F=UALi;Pm5s5$CBmkHFcC^EjN3;hcf<7@W`IycXwhoTuZQhO-hUl{bKs z4iC;S-QYNlUz9g+jfi_gT(1$=h2pvh*O$aSUC0FQ!+9aj7|!c(&crze=UF%lar$tc zfs>9SabAgYI?f3=563wUX9Z3=p63_#_c!=^3(nu+yn-=`@<&`B#(56T`*HpmXBE!B z;-q6D&LqxLaL&R>$CLb`EEQKW+vPYf68LO!{hPS{SC_%!;ZstetHk|EajnPo_u@WJ zT9;r_Qcn{eKSlUqM-q~m4j-hO*Eh+I1<@Ty2@T}VS>|f)x^DZInTNg*L!ho6!+PMnS;#^#B68Fc8t9-dj0&{SGiNJAO$sVZ;hvC%R8A|brvtyrx z!=E~o(XrcaJM{YMyeE67h5ngw)M1MME#;)4cgF(mLo+hkA|9s_%TPSW9_kt7XmMN- z8QdIH75Ay5vOHPt31_?zn0BgXnxjPVWGGI@@1W7}$>$`FJwv(ej>gztN`P1CHt}TK{VMowF9b0%NOC6`7rW1bdZ0idLjQt?V}8*d{}-$ z=B)ectQ%a(2CX(R4fjXB z_|m6MuiUk5?1hK_;k`%hoLzqH@Og=Q_qE=7(g(X2@7uDkVeql#S1fz*vW`DLHAFw} zgx}qHpfYPwcA$B)zIfd533vQq!TY(bV?Vs9Z1{>P)t4V~*8W8wPWk)O*}0GC=?fDt zedws@ef6c0^V+Wewr2SIMbTG2&V21a#tBco`RS&M3)g*nc8C(_~P-Z$*DC{)Y3&4@7%Wgh%i6tgYpg4` zB>3LfXHGu(n$L6Me_lT1{qygSH;s8YJn75hXH=b4{+9`dPPqA|j~=SO=Ha_Ljf<9# zyY{oAo}RYvvf}mct3{*VTK4Xv=YCk~e{=O;X6dK=?y`>Nzg+(PS=l*b!k4bHrbNi+}Ph|d0xqbYLzxRIP+}h(BoB!Lxi(c({!TH>Z=?^^j z*^6_^caMK{@p09bE0;~N?>-Z~x&N|0$Zm!n(%%;m@vV6Lx`X>v0sAhO!`Tn(L)^y^ zL~zAJH@1U(p2x-!d^2lcI%_Ba9Pk;>tK@Y!_{vw+m zVj`WRenp=7$p4qpsj=zdW07x(P0m4rKQd#W{1u2#$0Ig*XdFk!t2SQev~tF;$Vt;I zSq~^aJD#wmLwx}qqipgl5qh}M#+$%&yk$$LRut?~8{f=>D-&(}M!`pz-i9c#R!*EH z(*GT6FGG~bAzY9NBK*@#o*{~x3=+q=LeAkV{UJ)Kl@pgj?{vJz+R+fDbO*;YcBSKA zIEN|VuVs*pQ|ay&)?S7vEno0-tbY9C!6Lkq^FAI;`M1co^=r;s^?M1c_aTaZ&p`eu zQLYYAE*eYHu@1pVp3Yl2{tNP><2#(hx8BB}ave`jsTSpG-NyOTMaF|fzMgLe=KG^4 zSL|WVj}-QHg9zVjlXHjAbLuf3-Ws=%?GO6}|CTS(Po2TT7jv`p!6$DPOK8ViC~Nudb7s&(?odBP9AVE^hL)}LLT=koPS2hf47jQ z)7HKcqTUtiC~=Hoe=&9!e9J=4hXj8t(j$449!``9{$gB-Zx;3-)T!K$=)`;G@_?2- zHwj*$$sLa4pcgu#qFuzu;ozWlPRFBy_lWju`Mt9Q-zxO!XQ8ovAo$2`PE6v(P}+t5 zD_-FICg_WfQei*JU>@*MPAdTszFGL6lLdc>(2rZRuNuKm7wNQ$bgcg3J?P)9?CH(D z&`Nx%6BGW&niC!>?9eal_Gl4)vL)wbJe}S%_=B}VKd~&% zA3U7%^I*S}e#h@QK0&1OD1s61zL^u&xab?9pJpddXR`=@oJglR!HEg{u~H=L-!1Gv zUxdF)$XW0e511js=L$J1262M?9UWUlzTKIezmn6+RI9#z;>1OQFBbY~{WlN)xv=xI zMfiwlM-Y!4)O?s8L_0c3@Y{tQww}P#d0+4;A-`X=-<^V=BFbAT%1iB&j){m)>8C`+ z3UQSCg#Ebp@^DC&9SejW++v&n$c~3ZzRK-fo|i;I7l`n!LT{Id@IhhctsR^w7W}ay z-)7N%hYS8aTuDy9@Oucx4#U!$gXbIJ7iE{ow{rw1Ecs6n`TEI_a0Fl*6jTxnrE(h>3_Iy*=$tbPSQO7NLN&gS=cI>(5C$Y^0# z1wucfIVx46eq+M_TYknN+E*;W6Bcemd0Xhm?%$e(KAVLJRQr=pC;*G>z6{#&Zl_5Eh68~MY#&Z__LS?R~``gb_xez z*~0-LXX!p3uvvs(FVZi4h!Zt}e^toS`Wz>o6ms4!_)=l#g(Cb_qF$6OocN27($jr375h2SF8D@ahb_Wy zoFn*gBK?+XP8=`zr%^5%4=ZP%%oxAO_ezm|!H+!POi`|jEV~l@%l9Yp=g$Z|SBQ3Z zgh+qCXh+?mT^}p>C6<1E&k0)Jq~kJ>AQvf_ywOW!gmV(H-f*(;zd95vXK8( z!MBKhCn&-z<>fPH&6!<3FFJK@w7gs?ubEvFRmx}Jf=8A0Q|WeUZOtuJO8F%>mrtmg zSu-zMHMgX8>b!YX^OR{dbINDe&6>6#DgZ?Bb zGO~b0;UU;<<<#2B@~ZksZA~TAiwcO$LygQ+X4KA^Gna+n(Rp$t^Smll125#vxysG+ zB6DkIM`y4C)XbVXv#Q+EG6m)gS95`a%t+7n2gEipV&KTo-{{qz9gYka1uz zi==>3Y%V>EF4$=0^m1W3bj!_0q_6ypDUa6FRxw(rvJaCTifH|TBvM4;MoWd`1>w~< z7iybZ3v0oJDwdv$3~q=}RYDQ76uM=N1r}LejpjiL0EdSVT;h0aP|>N=q_ntBVI+06 zXes5x?>@=Hv$?2C^y&p8PijvJeC8VPAa9o+y}TS9EI?7`H5C zU=~@_G*5Kqtf_OE!CC1tNi1=BKR_YjO{(A}=>ZuPybC!McHd_auxhS(3c+(JpI;NL zwv#N@K+B>SU?B61sdcqhz0EC;Or1M*Ru!^_5~^k)gcY|hBroNFkd#=TP?jqq(r%_a zAanNvBg+kR41K;^XB8%2LKg97lx$~hhFYtIU9t++GEzmcw^xWo14skL?RzyLyi zgcYerrdHkvGo{!f;XVezh2W7o3c)=6ja9W%7gWu~*rmQ|I^*WT!ddr2{;{8)HB|&< z`C7%U<((y^CC5`DbLK0RRW-FJA+oi~fl$-yW<``4qK_?~JbQl4?CBUQ&8wSLr3B_g zFRO|MShqF>W*Q==QGWGoxP3mr>JzJ~zOpJ3C3`QwdQzzL(n=8^T0IvT^T5+E0GnN2 zIW<~YEto1~W#O6i_2m&*@f;emMHiIcT=0w8pF4U0JplAQ3-XQv?P1oOo2_DSvMZYVn>&`14#F?{49I zo{f)*@I^L0CDsEp8{cssPp8brm)^_yY8xLB3k~%)zT!?EeyNS`xQFvAY<$Y#{7M^N zx|H*)YejFe2_d5&0@s{qyFmSn0cM ze38JpHr`4<&&HPuTwvoP=ZSi^@znxrHh!rHUuNTD0$14h77;#T<5vh=Z{t^q@Jnrc ztH8}RUMb@8x7hfN0hdnla zm4$^JS@vMrq1(n=Xm43C2Zx%RW<1M|# zZ2U@rm)dwsZ!2tkO5he7Um$R+jo&WtDjTl}ywS#Y3*2GjD+KPe@mZpuHEn#oz&$qJ zBf=}WJ%u<@4OA~t@7 z!1XrX(%VuS-zspkjrR!LV&gXoywb)O3B1b2cM6=c@udQH*!UiSx7+w?flV9l7UQCB z8y^!`5zno9&$F;~75;yP2%l@?{Q`Sze5(jwVB^aKF0%2K-ZUHEHx9J%mfk9CeBU_G z##?%;xA83k$85Z%w`Lo^O5hbX-qPDj8{Z*ttBv;yoU-wzz#DCRnZVm^yduWKoi;uq zaJP-m72$hq{89^x=axMb2<*1;Eh4 zF@Y;=yrs8@jb9;fy^Xi@w$#SA3fyetJp#Ab_>BUuwDCm(ud?x0`Y9V?>$zyU*X+naQnjc1+4P*AGs1w&#c2E@z!1>dX^{gtyW-M z3nc!0i7%4)p%U+x_~8=o7V^_}3y;KCi165kGT^(-YKcEf3LlYpYflP2u9tXP*R+n9 z#EYda_GqcZXIO!8ZI<}IO8g3me@Wt7B>qW>Un%jcB)(PR=Suu4i7%1(l*Cs{{6>k# zmYlw$L*m7fC407A;`tgpkJ2geVri8K6DDldf+&-y(>9me4 ziMMQ>p1CESz7@2NT!}x|B60Ode38WGN&GyCFOYb#g^WEdlK2%;c)!G3dll)iCh@uy zzEt9CCB97JpOW|riGNh$t0lfn;v*7|h4{XsUgB@)V-+PP@p%%zRN_Mt-z@PDNc;+k zk4Sur#6K+YD<%FWiEowo-%9){iLa6Pl*Cs_{6>ktO5!^t-Y4>IPKkd^;!TOa zU*fwZ{!)qWk@!m_UOB7Z{);6(OXBM!-YxNBD;;~9EAfk^@E(cBYnr|zPvZaF$HJdW z{PhxFB=O?a4twgC_!&}oP2&F|@ud=fio};me7VF|NW9oG%br$C{2!$75s80I;_D^; zLWz$_yxiX{mH4O>zFFc|O8g3m&zJZXiGN<=S4zCK*ODH$O1#)w$zrXNc-l*89Vv;w z(jsx)DDm|Y-y!j{C4RfaPn7shiJvd=ro@kz_-=_8ugcid9*LhUg;xst?SGuaXG#1m z67QCH@hJp*nk(^*Qh1NVzaa5>5_oFH5{%;;p^d^jMSlGom~kniH}MASczXM@xvs(S>jKZ_!Sa=tHifRd_v+^ zO8gv&Z^D~0{`f1ku>N&N35-YxORNPMouw@AE4;&UZFPvXU^boR7B;#W)IizNP7iT6wV z;}Wk)d|2X3C4QE~mq~n+#8*iCXo;_u_~Rr#BJtK9d3szg@fS(qV-o*_#4nY2uf#V? z{FxHJLgFuw_!f!(qr|V2_=_dJRpL*O_*D{roy4ak{x=f8QQ~it_zsCbQR25te5J&9 zO8hetZ%X_f65lQHf0OtgiN9Im6|p~r#{MTse3rz&DDiHIZ;<$0i4RD;N8-mwe4fOY zN_>ID$0WW;;^PwUm-sg%UX%D|CB9VRnIiQE@a`EX1!=nh33r|-td^%xr#pzOpPbN&RFzsjfIKt!t(*+CF?>GZ^9V;69!0o_a0SDs6ZR1mowiqZuP4PVVL!tU5WbXf0mF9_rlCmM!|)x1#}jrld>dhMy=jHvTL@oHxO+dV zf5OyNq&peDf$$ZCI~blucmm-R!&eigsZ_d^;R%E%5pH4l62g-SH#1yJ_)5YthR-KF zg>Z!7QH09~S1^1!;j0LjGJG=Os|ouVK92A;gbNrRMwo`kX%EAP5vHL;+RbnV;p+)2 z4Da6oTu!+A2Uh=tD+qToyp!-$!W|5MN_ZOK6vH18t|Z*b@K(aqC8b*!-b}cPa5KYe z2+trKV|X>;nS>(@KS!84pmYVpPY|vlT*~mHgl{11XZQiaHxe#j_-?|rggp%3L70Z1 zX*a{S5uQz0VfYrpa|n0$u=*z)A>7IE4TNtZ+`;fP!gC3y7`~eDJi@IEPaqs6+`{lB zgzE@5Gh9sgX2LOs&nG;eaD?GegzE`cFnl`U1%yi(KAG?>g#8R3NBCC41q=@(ypXVm z;ll_oBJ5^3gD?%L(h9@-KLTzf+`W(0Kj9eRPKI|9UQD=y;ZF(QMmWXrM}*^qTN&O; zI6=6D;mw4b2sbmlhVbo#V+^k*yo7Ls;pYf1C0xPq6NGibr3^nx_zuE;h94ko5H4W& zZo+pG_Aq=0;Ur-+IC&M=ozKd`N!_x@gO*qBy)r9XM z+{*9-!uJwxVfYfl_YrPpxR~(o2*(&cpYZ*JBMgrsyn=8A!>1GeJ>gP@PbT~TVL!vi z5q^+x0mH)xKSbEW@L_}>ChTT7gYYAS6^8eJ2>b`a-Tz_rPq>9}C&N1l|B-M9!=Dm< zlyHjSj|l&Xa4Rsb?4a?cW(=DA?n#Q)l!|8bcCg`Qvvo|4UFiS(B&?t4U#OEN)=ksm z7ZxF`63y0(3zs8F^EtFmEjg%U>q$yDdCF*9G~=kF5GS19skQZFYRR%*&G*qfkLyJA zHd?aSq3MJE^Vvy?+MBZuL3iR7&*y%zVbJ@ybzGxfyJ_tV*NJ4B_>D$nxO)p1AbK(+ zeSRC4^k^-4;RkpS(${WMdq1U?@;5Wqkfv}#2AG!#tm;u)tzUI%hil2?zYY> z*Gn4)b?ps;U>+P z?_T^V)%oK6EZ-@}w=Ld=eCKEBmk*ye)b-+EB&#LII*CU2wKJMm zIiRG0=`kh!Qd$reO8SSER5Os?(koy{pxsCI{K1eT2Wa>EG0CO-sq6@L9`&QXOw}CzWm?tAcJ(n z_r1M+_E#`soCiX1d)6xVYMJvrP(T4VKibN;yb!+SalPo);wh4_fLg9qUKG}&85f82En4!ZzuxCSJ4w-R8Y+b;vtv(hZ{b!Enu*^p zzd9+TADCRYYoh*LyvtF4d|3a=Y(@BF_CFC>fvUE3I@aUSf-kPo&Fj=_ZRO|w1hQN( zE^pp({-qF#3&$#&`4;X6jEf=I3J7LNbv{XzVj-mRtCLmzJuZ}{|7W7UjWXyuwa-5Y zxitM7NUCl7#_xJ@ulWu-3^=na67!RQZc?JxKvwm-wWz;|n*L+-taxKqMs%pA|LdA` z0cxvX|BY_*L=f!B(YWFDd=0q}*pa4R>)o#DwcgIKKHY1Ean~Kve+uhSZ_gV=&=BOy z3+a1R{av&ETO`wz()6{OzCL>P_@=#KJuf;w*z|d{wB65s@F%QC+yT8JSE~%dK}>dQ z`efL~GW{>p_|F(0(YfQdq(BPTsUIcuSEO$OH_&}I!--wnwAZz49YjwCh8+y)Kfs}_2q%Xx z>B>Vo@is@$IMTPd@eI|-3^+Qr^r-o%psqSY@wP1A+pcBQqx&`o4b|DOjRhX++uX2C zHPo!G4#aQT>Pl=!kfyy{U#?}t&`Jj6bnOyn*J!IeO`DKibhK}?E7``hNtq&Dk*~wb z_AQaEqv0PEY5Rh$ec8A!dY zCj;52I!}JHYuS1d8R-sY#@1g733`G`YlswhVSjh5vq~F z#AUK>)WD@YZg|fam({h6r)T${6VYEof^0;|3LD3u z@2m?pZF2o#t!r5!Dkj*JaxIJDrX(3S^k7*30Df%6_~f;>IlE2~eo@inBi z{0->rA&2Vga4pjiuW74so-1)G?o{8Fgzok4bqw=qD7#9IFyl;%n>Uvk` zKmLOwdJ7ei*Gt3o$VWlRw)B_mRA#5Dadz}{B)DigGIDeywJkl49^IkA&?(hZ@XYWv zypIyz>* zzDQX$E^)e+e}d@9m@SrpPwe3GN1qn*ZY7%-pM+k}EdA6jA+YM(NQMD%nXJW7${Gl} z$+avBv%*v37H7k|2y2W2fMFDqVaWYy)24~4zO}9%K7efCCzviW9Owu9kcZ`WqzXqc zmg*tLO#`=@t!-EU()5l~=vzthsck)n+x)}JNDCA%qUCJfU3ujT3U8`mOrCXS=w1xgE!<9Tu% zt3~>j|8Om%saKGkNDMcS>k0h*nJ*ayY4i@qnmz%ZLqUE?Axr=&_zZF@j_5ew+Y8tF z-i81N8iM3jL_S^5^Lp>|E6cxtVO-N}*-f8687%zC+r|{cRT^J`CU9ko$GG;{&upQ~ zo<6sJQJ?*=`Ye&_Q^ml}E`HMKP<1~XehLo1;WtcsnzP|GR+(-p(`zbv7*ZkpDm1o? zX0cpVB3G)xBH=#<>Z|aGU&&CR{3!7YNnu&h-#}q&NMWT18jeMNmLC@S@{t}Izd~8K z{<Z5!D8CTCL(wX8-a(wq z<9;5;`3~YZAZp`B*Q`zKh}I6U67-{E5T7aQNceG8R`;)23-4a3^e6h>W=-b}mcUR{ zz#FXPylS-v^xZM2dtfb-zKfZ@d3za)q^S3zhKq!FTlv+xW~xU{BM=L!Z+L|gDRtJZ zriStw*DGp(^=n;E+4MYnK*gi<7c)8f%3my(|5t0Dn;R(r^&T`}Zm+Wx+z{(^W^J$V ze4F+*6k<-+H$M>d^hj_n`BeBDkcpQtqg`1kS$|+9L$S+qd?_?oH;|JuqF+MF! z(F7$qt``HZV==AC;2o@#|6YvgFkipNa9|KO`bC`czje8t-Bx@yp#ORJ-`??y;ngXs z{(*XBuyC(BIas($oithh$3zJ2HZITBFevWOjPs1fEVNmzt<$L`hYv1EIxp52dJpIU z?^^+MU;*z&t+EYIGc??H26W7IUAX(0&lvKN!XzZaVmk-xZ-?}EDPXr&Nimbo+X$JV z%62OWv>_yIp;h|EecKV@1*EcZyyNSn^Jt%mfvvthd}!xNSKSfdKZa9C{1a9>qnXB< zw8%u6rozUx-VQZ6`aI1DdpiR7^HxCb4Nyv9gECD9j$$EKg&b=cK&S0!BR``W&K%!Q zx^vsYQ(#a5-#_%gHs``)4M)KD9&WQ19-$fvZn7=E-j0rZ4V>6oG=J20ybaei@X9Ht zZ(rTBYJ7tuoQYY7hI~6U2QpXV2Q#7`a4%>Ovm0}Q12jeGNFNE$3*+PSMLz9OuUE_0 z!W37DVxcrt0H}81z*4k{QiL3-IYKy<7E(>En;}{JFpyhX=+btq1PId=n#3Uq|CNc;?qX3g};A9>(M~Q&=}_+QGzXI7x$gG2asjD8^vKqamtJ z3Hi1)euJ50gO@_NDO5dW1Aj6woa%eGaaWv|39$p-2>PRdx851J;00Dt*K#&N6cPmW z@6Bz{PpI->F#iCl)13ZUFB%XO1%N1~ttr-FXk!`v+War;y$}6r}p+dSh)Fiu)Rx zngnfkg¬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

    |gUNS)nvNgdl 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%0AD+`16`)#^GX=e&hpy4z@~4D;;!ATX+DJeXMSl~ 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 U*drml`O|e?@wGUK_sPEg4Jl{knE(I) literal 149392 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 From 7bdb9a6f25880420ed8597c4188729d7de9282d9 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Thu, 18 Oct 2012 04:00:40 +0200 Subject: [PATCH 20/57] openmv.org has expired, use the full domain name --- OpenMetaverse/Caps.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenMetaverse/Caps.cs b/OpenMetaverse/Caps.cs index 09024721..45730827 100644 --- a/OpenMetaverse/Caps.cs +++ b/OpenMetaverse/Caps.cs @@ -259,7 +259,7 @@ namespace OpenMetaverse else { Logger.Log("No Message handler exists for event " + eventName + ". Unable to decode. Will try Generic Handler next", Helpers.LogLevel.Warning); - Logger.Log("Please report this information to http://jira.openmv.org/: \n" + body, Helpers.LogLevel.Debug); + Logger.Log("Please report this information to http://jira.openmetaverse.org/: \n" + body, Helpers.LogLevel.Debug); // try generic decoder next which takes a caps event and tries to match it to an existing packet if (body.Type == OSDType.Map) From 21f6d2237f5b4865df6d5e15895193f3fc9b8ea6 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Wed, 24 Oct 2012 02:24:55 +0200 Subject: [PATCH 21/57] Updated library version numbers --- bin/OpenMetaverse.dll.config | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) mode change 100644 => 100755 bin/OpenMetaverse.dll.config diff --git a/bin/OpenMetaverse.dll.config b/bin/OpenMetaverse.dll.config old mode 100644 new mode 100755 index dc36a451..ccafc0ff --- a/bin/OpenMetaverse.dll.config +++ b/bin/OpenMetaverse.dll.config @@ -1,7 +1,7 @@ - - - - - + + + + + From 3731ee411153cc84f22d653a24c300f9c81ff837 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Thu, 1 Nov 2012 04:11:59 +0100 Subject: [PATCH 22/57] Compile openjpeg in 32 bit mode on OS X --- bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylib | Bin 147288 -> 130560 bytes openjpeg-dotnet/Makefile.osx | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylib b/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylib index 18ca868c6511030cf94c9d8e23ab337180385ffa..91f7264fdba36cdeed9846718a95c9ca111e5bb6 100755 GIT binary patch literal 130560 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 literal 147288 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%0Agq^Jjf0Rqs~EFc z0-)t285a|GS6j|hjsJ+g)NN>x z$SGbhz6r)z8vGW3!09U$9Ta--#*BzCmK%dKyKi;EaX}d7%;iz z{bpMwXwc3{K!LVZzMJ8i6OXR&pc3`uw7^Rs4#y;sSglO5Ye3y3h*R`hF63`u&fTh` zzmKRaaV7SKQKo!)aAr3AuMM-iBwTTvIh^0YZoZglQr&z_t%r+0r64 zhqq#5i!je3Cx};yoFIfq^oQ3yCAJ5l&QgR&!oUUovy0ZPx9nZh#IIKS+nVVl?c=T$ zZid4N*+F-f5?KC4MWpEG13K75gCG_Svq~b(k0kFLAt)zA)QSS)^n=9!N8;i&8e9Jb zrWzf{2Lu*u1yeqKU-CLI!RMjsgVp&|LPKJV9c-a$!Ww%)NjPzf*AWj%ss|} zFW;9hlcOUaHe!ePv|=2z)fwPQg2^SatJovjA@$i8o~+Jx1f}p=Q}+7 z9_G^spI(85wmA(ib}cSLtu<1$6_5-T185r;VLFLNIs_`>bm(0xjF5Xgj42V^TIv#C zf$3c13pXDL_q{YJ@zd+v`D=c}C6i%XRs1Jp$2_t-&@#uJ$>hDb*x-@`4bMB|rUL|Z z(L`~$`3cfpa9ITiZde5m1Ui&gw6EBi<+E!ml0ODu=;f#79GBdDK22^aKyJdo!-c5u zx5Q!lAiM>TNzOXgxJ@Vj6PYwY+Gi=N@-P-*F|peTv|%1%oJSr}{WmPeGO((u^H#5( z)%-;CLUrJg&^x)l(%R&ZoEa7+`X-nLE!xcH%CvV3p^hLPNS)y0DfAjff`iURy3 z{s^m-WC-b`Ck#&xK5SZhdWRSDcYP8a966>ZIZ08I4CSuhdr5vT=~GCOZ}%Vsvk09z ze3*)&QyBbp^4XEi1JdS}Gux_Ct&`iX^WEHXP1yNDR~yLHU8?{~T%t!g>=~F3Z_n5+ zd&Vs68ENLP1<|&Jr;P5mJu>AujLTauFZ}NI(#&wwC zjhrig-D>2l!%SVYER*L#=0Olico~6erL{MC4dy>3YHT`%(no7K-(eY}|IjD!NQK1= zfTe=B`FKvl4Z_!fCrbyW^?>T71ccCujh5fEzp@o1z8<$Tw(m!ycGrM3T?f%k?2tSz zfK_fqaMYsJ;#N+_2#VYrw_q1m=TFqMD-@ALFq>{6(kes;3BO%|}oHNS;pr z+a{zsv0@@Sm|50(`2k3fy0-EWE=gn+=;m}(k`eh3W2=yPYTpz!Xjfee;qX5AY+*+_ z&_X?EVJQu9U#~GfWmOizgL(h!#`(Bb(JTD3Q>fQF_u5fL9CL^fKcXh9xkcF0H_$X9f};YzHcL?%0G%NzM*!s% z=3x)kT^@?4yZBV^+k;REZadJ6X~scEP@xCKcV8BPoxy=wPGtVE>H8o>xyp>A|2P2P9>U)0 zbalLkfWSyVwZje2-yu>aaisx{PSO(x!AWJ2Ijy=B;S2B$lFaX_Ii2dXvWJ5MtMkhS z%KCS(Vk10gs_+aP8omR>!yTMFT&O9-WdmH&Y_Uz%I0L;1iVrc-pZe?l)di|LfiP-; zdW8z-8vsken+_p6JR{kF2l3xuufhf4XtKzwfIgB7=c_>9w7_FhMRWBGcRr+M z2wD^MeyMi&=Y)Go08NWefV4uGGWv-l^o@-QD={V0gbajvDQH0ee0l&f6XY<1bKxq7 zmL4fR^X-B#Jbi(dA_Jys1V7>`=RR=LDOqi(j7tZbe!LPs3M8MyMH@8XQs-ybCb3C! zrDtuDZcQ*ckvo>2zC`H5!UZ4+pikAf&xAGCyS8NdQ!c+GColSF{7d2KTLSa{XJ z#rf-AMCJQ-jiN7*3okcH2cgi6sC8l(jf3=ZW6@Law0!CX@rsc8Ce#>k_;o&T20}D! z%N{KWfpg}t85(I&epSO@y&r0Ey8%L$ub>eaagA*a?S zfqba%n$d4De%i}L!==kNsZ&5G=fd|v>r9+oAeeu|G(x!fJ9|XDUF|J0gZ*o(VbJgd zE^uke7U)-}OoKch#a=fq2%~JvZut5{0EY_)bR7?yMr~I4b-nh8g?-1*CGZ+XY$|gG zo@1|b^lr7F=Y^fbG1FEE_YSLYU{Lbv0nxC1N2n~ti`?Z(D+Tmzxa_|%J2%x28P z)?gTGW0s`fhJA2ARz=fooNQSSx$>zSMFuNWL$?{62jt&_MUsW}o8mmrVv1|!?3}y+ zt<$wQ z)~TEbtDicS+PoxrptL@6)cQaWx=JiFu*65gmmOKm{ge@Pp}`OPn(!Ois;ULwP8x-s zE}n~08YTnK`9moJmupxP*m8IcEUu%N1Cx7YxT*=kc`pSfUks5;O9_My@WRrHPYw28 z;vv{b69<6Xg5iZ&@HHB{mv0iO#zp8Q&Mv^ZNr^`+^b$en^xICn={c^*s(@$Ez4ch~ zi4T60vYDcUZ?GUyW1vEu zAYuOLA8e9jf~5r1`cP+7X680|4~htXBOpaAf_=#!At|lEYU41+!aoct;U--G8Z$ez z#fA9K1mYeAnwYX^^9)L-GBl`{jX=EB%h`+gS7KYAB{ndVkqyBIcen%y$y^Y6gVs|f z#0Q)bPWS=_|M>*F0D4MdVXa_oF{}3`V@l$SI<=Ik8IkE6(LcT*`xzytv(?PvaP)7v ziH#7_=!Dh9d5QL{w}Qmgc+-;9jPXoj9fpBmkBjgPlYv>pEW7=dReG+T4NTdp%EWZ3 z5AzqVsbq&_`SzEB>h4gX&1P^GmM^C-72@)Bryt9=X{$_s9Lt0+GW{=J!JcB85I4Ni_KDuv=GiacSDQOTJPc z6tN$z$BI;IE8%(Z3TQkErtce`H<~^uXvYh%haPAt#~z9!#DxQ3VX&7j6(D%Pc-^>2 zpn-S!rBb4|DEMZ}>DYaLs|uzyCZry2$cKmTQRkIRJ8vqyx=zC)K#U3B!jj@~Y4b}Z z^n4$PGA+zqg`8B0RF1+WB1JD3!JUt2LUgw?<4FbVjAL2#kj8Q*lPSW7VR@W z(`S6=YE)#zzK*|c11Qqb9l?p8rFdD~C>{8_ap9CtW7vq0xQ`(4;W;q_{lbew7^aa7 z%v7WVV7_30c-DzesCF@aqN|D^ru>3#M<)~`0m^$;qJimw?GtIR)r2t+ftNZL=5pGW zO$C7Arv?rRBd@mW;R^joR6`h}VoV`3m;f||y(@tQQzD$&h1~&F6EMM=d}BkmK-(eI zP@(nYNb(_|6#$^ets!*7QlJP1QH)&FImosRi8Njl?T=%P+k3qM5TjN|Wd%-HSL&=} zF<2Jk2ScS8Vfdo4>y@h7Ph%!CJ?B>I_M9Ll9KlEr7&r1D!R9vU>ZLiT%FOmu8@?DF zbX3Xjx*LmQY##4Z7U46HUuK16ryn3q7!5rC-_x_D!o`%$ek!6CPG^f2^ZnVvXc=T&P9$UzWsFCW`trjj?f*CfQy(z zcqKoko7eMGU>zI*NETa9S4h}e7e~}p*dzaMbn3;YyiUbhfCb50@rRIPPjKJ^-uL$f z*j1gdP(aCNulvi5CW$zwzn|BKkrE*e-cIEo{Ge ze;zPLD=eHZtixWOs6gMqx^#k#FSXQcOet(o!vPIvXbl5)0CNjr4wB*i@$B=-0H`&a zpmBULnbucJIal5OVYJ*}AM+#tY{B+?3qH zT7HZ#nzIM@?skSohaKbKc@?v-M0R2J_m<+|Wd;$Aej_Zlu}09vY;2#$+%=MWGZ^|E z!euaSwR=>fj9&^t$(x?CkFn4cDRdhT_c+{TPVhZgaZ&=yHeF)mYbf#5GIpw)$9_2` zrx!_8sN2|>lqHPr>ethL5) zbABi6owRY3_+X4^$vbs_w(FD;=lIL^=|jBsCMD!{q^MZ(Bo+Q5-?US;J4sJD>*`OghxSl>{K zuvWVcQrv0?bwfKK#6=|VOr7~zb*B4J4P}~pQDPOOM5|zDFDz=}go}v7+HF28D$p}l z51AA8_zm-DE0Cdun_YNqI*csnh(ISApNhi}wIKAJWWjhe^{`b2KV%Cf6OmH`Oot3# zfmAKf`~xBkG0)In?42$6t+#s>?#cQ_hDKc758TbGYS;s6FQs1g5xWiqr#f$fbP%5E z{0Y+Yqigmvj@hAO^n_N2QA*#BoB)&RH5j9LA1RNyL;gOH(}viV{Nr{*onXVXXWtNd z3P^DPpq>HCeg^I+hK>!rgbl}1^Yba9Z-Gj8VLmvAeM4^zJy-S?q9?(ZGD<+biOWoG z>8kVdTh6R;tkaOOZ)jxbP}yOQS*o^c3bj#f?5;_;JtP)N_Vx?dD10=_kC=PG+&4sB zqiETbnHLlX@0Kxd1RCC;4p(H%JM0aiP6Q&0u*e~N=>*z9$`tC2hv-KHY#iqS>Qd2n z@y;rPmtk6pkSec$J=jH61=!CgTSN%KazyN1uZybd4s@VJu(R(Hrnp^K4*HA9 z)&4Ymu=f${veZ`#DKQs=DH*3)Rgw7f9@rw`fcL2d;LVntz6ugSobOIwj9*M97e9`N zK+rWiVANVP&F>pTUa)QjlbR&!sbXlDSn*|Ho8<-dAk&i5OC-bj{cH=H=Bd>dhQu{$ zsy5mb`TeN@P?b)*rW#EVE7i5Q>vb(etI*xfT!+J3AaV43b_8}Zc3mZkGnWZta=C6= z4Kby$;dS6gJXVemz!Q)Mu|DUc>SCg%Q^)Kl0AInGm$aFkQ}{)s2*w zT$4y}Z%~G*mBqo=jfU6lvsAbw_&d|yXBiE@v+Owme-|+iw6;^3r7%TBG>TfRJF%^; zaSBgRW;s&fsdhoWX}6_bhh7ZX`z`x5bLbs&=ml))L>*!$5fuy1DoY@|MQwo+ zn@%V2dF0jUhnOxm;h^8Xe55k*%n}UNt}Rkm7pm(D5?}pKc`bHd7wgwjHK%~L$aI{N z9|0%`urs|ky#clnPWD^&2!doCebat|-FOMT{|wtbRO8Gjj@W%+|D2+5oU0JfHM#xc z3IfK~&~KXssx|;GgAIFavk-wOFcJ((L&HS$WG*zPaI&h+chjcE%?ehKilb++)2h_H zgKltREApmf9$nI-u7XTnX0w9s2Wkqd4O*EzLrQJYF__P%gjL;6~&`R+U7*~lOGgu7? z#@9wL-|f4}9%LOTmP5wa)ETdlVWH>2ZjlfaofjI zU*AuyS;rX|YH|wxV99rKJ^!wc>p3|MNvZf_DNV3bdo{^^Z07|WO=_P@yG8ZMsQ9QbUwdFu5L4hh=@^&5f+7EmeEyr$qmPD)~}t_OE+ z;&d1p3a&0$yzV|`Bl%$Da97)h%3X6;wB#vHAh31SiV~sfDGp;0Z>46;wTOFq7>br|6#xkFC7MS82>TDF-3yq|ZW^*v@a>@-z3347tY1FNdhJ=z26}~r9n_z|Yr;I0 zUo4aYr%2w<;}q>#V!P2nLsu)QOK;pw%Evjk?~I^B@LeGO-UNFZ%JIuceswQatHzkIyu*y zj9Ix)l4kEp8uRp`0r+^4)VbaiZllY=G0=?d%f1)#2M*xRACi7N9{wh+Itx!UBn)KI z?yMDOYd-Ep9rK{ zbdw=BjI_oj<314`aHv=wWe;199IzfGB}RH?1ShhNpTQBFRpQ_$y~g5oFk#H-aDoGh zjdk+G&){&*l;7=^_mfa3MKY9?EQ2}|3=8%S?FuWEnx#pJqbJ!%{T(Wn(M2(vD+A|F zXSR@0f!mkqgs&8}e}>(shjcC759wNDNY^kKV>xrSNTPx@ecv<;=tkkDj$Dyib`zBW zfT{$b9?0!OzmAss-uB(eft(3mAKn`_I9$iW^HO+;`g9)rENIoOk7-cvHx`_swNk}UwzWJts%hT#|vagH#Y^xlE9hvB6E4x9pxH%5QOuHp61W5ICc z7BGaPgzOmk^3pMVu<{{bx*yOfR21~KsRTNZ*n&SI&q2toyjJW zi5R<49MFZk9TChW($^Cj4j46!Z*p4D56MN{`oWQ1Bk1G|8%K81J%#25Ch^5g0rW-v zOVR_5tr5ezyBFwT-3q+HMk@Hz!#b%yB8GL#gwzb{ZkZN6th)jY5QcLc&7s_nhe!S! zLW8+!YkZk5@W+ycgUjr;>!HUj>}3Vd|3wVaMu1k=Bzll0+2K9hjS752%Bhf$WQKPC zoimARt(a1XJeuiqcrBK@KGAK(>wfUrefWQ${Xa=SW<$#bhHj(fZ127!^gr1z8L`3s zb>mcz;V_d#+msx1cT)oixhVVi;?(fc5ghbxbD?wuUb=`2-B=YOnb~9W!_(Q1T#D_j zvH@o*z)Wo7Num4Xz(U%>1^UrJ+~o#`SpqD-`dSePLS{jI1A)i{^dU10%<_GJ)jcx; zv|@w=VC;1QNGZc`FmZgY?-Q!1z?K&K2;J$NjBf}!V|&uH?KspFzm9SdA(>u>6ALTi zlZ{xbFETUs#5wMCYH2!8h@bm}@YJN`yHqaUQZ z{(X+`D3$_Qg zrkS*%LBVUj{U~yohp)$|z=xf3IDLhgK6GT#5hzOQEDZZ*A;4~j1wJg~ZkmOm+^p`$ z1!3-^M+Oa-aU5ve_Bb?{jG+PQiVJL*F*<~iK{lr0IXb8-(4&Jg{r>)J{k}lnS(p{P z2#9R#c<9)N=;~oYrWfb&lUCXWFl(Ra0O8qg(>8PAW#J=)Bhe!S3=o>l0AVuw0;L=u zV0h4Mh6m4Zc+eli17w}Sxy>n=8K2jFo#S%d`3EU_{}^)Ygf+f!D9PRROjbtA_22Uy zwnh*1P7fYVL5d}<8iJ>BzdP%9q})=7_mixAt=|u1Mv$La1bQNIL$J;|fgN$?zSa zkVifCkLm2AXB^g#fX|#kuzb$@myRjk&Y}RL#}qhQXZK<9*eoP%6CxRzP|AkhEF>jj z39g%kBt7b=-+@twbg@uv$@&qOk62BjK5Q~Iu3Hb?*k1gP8+DwC*#C=19km#B;N;{@ z|FTg>2}T__HE;?RrT%-2I&i%#;`~n1%756S#~p`&`QJG1;4R`*`>^UZM9>;}-1J`& zBaiRM!qDs?eesT{F*x$DMT|V`LTW}H!!rNxM;@pN(4C%~;!fIh1hpshUz!=%LJ!#WLDGl}<>~+7GXPnsEK|ML%y*sN<8d@*#s{v;?zz!;pHt9i5m`^zD zln&oAjx2waJ827gG2+QQd_>lz*kQuD?f>E-54s!}7P$+L=rPWLADA&t*ofsmG?~$( zm|F}kb`oW7!LC2RWLn*k$cr5 zR>6WJ7+D2dh~D~fM=)3g8+Jk?nCrV8!9>gl{~O0IbDpP`j~R%0$5cG5@yp}ClJUy| zpiX%Fa`_33U!FL^F~egAnOH%6ilbq!T)!}a{qp`hwO`kz;yzxN z+ubl^Xf}3zp*2z13i-#!k9JMtB4>_`>()?VfODNmH#q?1mTqCsi~GTMXWs^L(T+-i zo48=$G8j zhvlkqNjG!vzq?eX+9(HT1Svr+dp*urTDvFW1Ha2)R;Z_ftIXZm7+)}rOj=BbjIP0? zEn$A?x^ua8ss%c}K(4bf_=6UKJ{+xl_fBXRU~*y$)sMn~#*<0u}R z@VLN%@r(`5$pn+xg$>c}_(nYn!im(b!1BeMg`n2d^qdttMMIKK^{k9*l9%5}lHotZ z_Tl@xM4^n8|FGd63^xpUc9O||diUmZOrr*tf)qKKQ`@p5$FC2SG$Z2R9gz^lng^~% z_J%lJsfYK*U!IH=M@;x?1cp;1Fq&R797)*Vv8_6^?6hDiaJtk>{wLKhO-r%WTo!0} zSoDcvZVNjRc8t$iu}jB7!p7ZL$;&dZGulYf9lwM_8y$_zbbsCm6p>X`QszQ|AMgbZ z-+Q#{z{WuHQAXR8k|j7Ies(yuu$d3FGTUYkg7{o z@puN*P^LCa)%&@9JFqA)r^&ZxUpv(DWp6Mm^JsC_`+wx{abyg=scO^?e8Qarm-t~n zu(evuZNS*^(14A>*nfk4uwAWC5wY*fociVIn4sWE;*cz@bm4kN{nEG;oVAz8>Tkd_=GK>L;9&* z&q`t1*Y4Ya`^@IFnv`n-rRv~8_iTSQWSR|`UIK=3mtN+mS0U4Bkm*}gHjtSy&9Q7Q zWZEyZu;_d4zyLFEO0lDF6q2V+%aie*;q=>Y5D8wZB^V|;U&^_n-WQUa=D>!Ku9mEL zgb7BL`#P{K4hu;SphjJuXw^Rp$Dx|_U6?M4bkKN7p2qPs>^jf#C;6{U^j~hrwx;^e zUf4o|TArLNykj`JD;vIIqiVdIk;mh z)TyEsh4IbxOFNwFzc$TxtvhTNg!B-wz0Y0vrn_{9-bs;-k{sGb0myfu3t~o{u<}0m z1r?ubRLua6Id@M=B>OmO457{PQc3LSCN@`C9n0Q`V-G0k!Q(BYWG%qul}zlT)n^3k zcsuBq+m}MMrnl)WQ0vGT^tkd2rsLOWR(!ko`QTmngr8llnHd*4pt=u5h^M1g?4%&V z@_u0Q=V&;v@$teu;WugJ9OhHu|hDh?JfkY_|tx>a0`FsvgK(Jg_gt#kZWA*r&rVrU+pJ@$3%OLb!6q;`N*6`7CNGWWgh zPs;S4(=c<8Ss47>CpCe;n}DEAc(d<0 z&|@-k)W_Pz=S)PL9(G&GuV%GEmq7}ZS+AT7*4gN=KM8dW_U!YgCnhzl29)L7n>FgM z5Wt_Zv8Ro!`)g9ubNo5Z%#0(~PetW3S{TIaK6gH>&hoWojcVr=@`T5&2rlq=;hFOH zh319r?E`#$FlAt;$WirVXJk5-zsvO$+XvYh(-W5srkD_uY<~f^moIi4xY4Ld;FhJ9 zbRL6{${Ppdb&iq)(M?hn%))seeV%4jUuo1N%i$yvvKyu*J_Hl`2nsg0>C`)LnmHa~ zdYT5El~IzMbkjD_BVW4Z{7q1H=+$Vst%EfbKW+``Pp;LW4q-3q>EwdmS8#$|!W!ZP?_u zp54z2o<_}lKJbBWeJ1t8l^5peT0-iuh9S$)X_qmO?t{MYAe&-c#@xwFznkC~H3Sn+ z64veK{PxmRXW+MIa(J>6{YG@|#R)r%%U|jEk?^70aHvhdS*g*N*ioU5?u*vR6b5Kl z!gSu=T5ME|Y@ikn1ILfa!JJ5ozhdt~$1h=FDlahAu>&DlH?Qb7$ERGko+1_avWe8@ zs(V8EiKZZVcUH24dgje{qL#hjlld(gUsE$KaV+2SEDq{>i3?x9qxy`7af_h24oavx z-O!R>lX`xhW2xi7;KqzR$Fc#wJk;>YjeOb}=7IPVJ$_C_J&@x=b^ih{6@v~C+%WSe z2ACT^KRLHyRU7hJuCFDhe!>VtYXwV2mWv)Rb^sm){2m8 z+i(mwH`1T*T6>UdG*$79{9W7{(7?ZFD$;hq8_`cXp zd?hAHD|aCJZXI>Z8<3CgV!Nxm*uJ@Jw2tkd0~4edtYeujrDp6Q7Ky7@!^0g}8K2a? zEwReYc#uKV{9u~D7%}@BWA-a<1I8(!+CPg!OGbe)a7#r7$%w0nGSRrMeL7YGkx}TF zio&Y5STg{L&Dz?@Mg**LMYFgC2uv>~W#8K;|3d zx}=r6Kn2ke=R;|gk1St_-6ylYS-uCEtz>t8ZiB3?yBpRK<@Sko-pT%y8{rD$(XL7U zM6d6~q)i`lPoreeEgWYx*TOhk$ zT>fyTZ|MjJ7e=R%E2~kTHHs`g!%5g=;rV;8&GaYYfaA;&cE1j(6_L4#BfX?edn}FF z4T*5niY6sflEv^j#h-|K3!hz9eNmx(Qx@iYw63DzyC@UHwBd)i1a@y7cDU_z`v$oi zpd@8)&8gT=@4Gmalj+c@mRkQoT-`}Q+uC=C1B zp!GQ8rP}**utNkRq4T#;I!UXphKSs|u^7epG`C`Y}7C}{{j#U>3SyP<=PKW*JkYd$<-d)>Pkz>i8;tX z8?tSq_PYx^<@hMEFB4mT)V8b;qxV*=h`|)I$Ep+M7$?a#flL6_6z>O`0AgcV)~KVX z@q>Q-7+7~@&Jb9VY`cUrK!@Dt%xV0xXsvte93 zq3@7-KdOM#uoTw(Ma##*!hZ<+M37K!-%Eiv>M7*iL5U29S6U+TD+)v+uc6MuRW*~b zM!M_=P_KlN6E;8KE<8KPR5K_MGkXwm7puEa%=VGjg$U5MBWu)`S-ztd93HcUaD%fv zP)7T{)M=SlX3ojHDl`At4kUm+zkz9)cIc}KDab#oGdXRJ2+lVnn zi|B>KohX>7;iTL-9OR+6{eA`Fm%Y)5@}s~%0Bcd!6_rAi9|fL3hJl80f9(TVXdLID zvdN|DhmUc=ng99?0bctIMv~n=oHxgz2Dcu*W;^+j3=9t7V0?=Yu!3EI_!!TRG<>-D zfxcn3n;+xxk;e}gK4$a7jSrOaEIDCQ!jIX&c=$0FA9egF$@P6m#{P(&UZ$@PG=$q( z)M5SaWC`MGB3C!1qVmN_8(-Y+N#M&<^Ka%$M74OZFx6_9DyhM-70iHRDWtds7v4@7 zaVgs3J#33H3jvKpPMv}E6GbrTG2DjswABAeD}N2TuI=Yfd$RUjw_MZPf%)O7L2{4DOkFDv<7$qJSwREVpXQQwY8qh5`RN25Dg%i_A z(kOfsIEhN|vo~Zu3D2;jV?$ihs?#vVMwKk*q6$HKv0^7{m#`*-p8nx_1`=wQQAy)I zV<3a=a)y^pMpV1J0TdnIK!}F7+Xz1%GrWqKk0S@Z-*dl`Zwsd=F^q8G<#Id5_lar=(UyU(*}Dz zdc|Cr^kai~8QusFdk$B%)O~O4UYwR{aC6`Ax>U@*tX#(_E=;R5+Jw^G^|U+Vx!QJj z;TAg7R}ET$EJ7gJNt=%15{xThnNxT;(*82o``6Kmi;4vpd!p^zx_ecLVF79e@YVGM zAHF%a>7^fr?UVh*$VS*jxyC13eErj~if4AiNq62KkMmd14zpWsfnI9~XQ|A0KeD zhV>11fH!FP46)~yDgT^1LMOI6eu9WJy8Q{$=d&twJdV0Ns03tr8rtZWha*b0>m%Ct z(OYD1Ug4q01g=GX^w-|j^~~tn_2?`{TF!=Lm!2SrzmL&~m!)Vdu%=?+4ZmHfh**YD z)LdJC{aSm{jobx~(Nrp54FmgwHFu%?7F=J{)!vu~Xfl47F;^%(3j0=&p90dWLzT1D z9e;z|GUT>ne%!Bo*jV^X2QSaWoqh+<{W)^rRqh$)l~mBWdf<874S3-1Hpx9*GPMYe ziCDbRiaTtxn)GIB8`P)X$&6u}vjLmgGlVi}RVm_z^NkykM{Ue!%uTjwo3X9jHfJY> zFKLWH2J*_PE!+jaj)f;ft^>V(f)*1uL+P^mJrwq6+$q3y32*)eaoeyIKGg2)lEOnh zFkF!K-^s$2Aq&(v>GTzar~Q1QPAc6yDNz3wEmm#wTi96DuSNafb>Kj%8`Q!Uat*!c zrn=>M+{pg9UZ3z?zY|*2(SyTS3l(2hPT^7M`2`BT&Q9NMGc|42GI3}M1L!Kc$7Zc7g@eTIDZt_4^?2IVRbt)0$S;@uZQ$!XZdQg{;dt; zG+)3!?Md`dr9-(h@C3HFO!C>!$C=0T(J~gy*HefXI(>>$MMxwHq0hCFXmeU|R@s8B zq!M@uk}12@w3LBG$RgR#L(d7?NK9bDi>|=QUqdy;M2lJ|F+OgFn~t@hjT|oj^V_#4 z&N^oMHXM9()4t6D+Di3M`_H7;VV~_1y9W4JX?VIC&So?NKEsKc`Z^nz9$5EitBj+ek0|8SUGOldbj*QN(SivR5aneH+cd!rHfmfUTO&Bg3Ro;4z|o zJ96-UTl@BHk0e^KeIslo72CIOS0kB%?VAI(G40#gCmpkW`(tJA+P6A%o-jX!1qDvN z`R8EL<(0sVaO_)EhW=V`4sItr?C2P$hfktr)3JZGo1y!E>cR_?(xq51#q4B6e>>^1vx5_@$#4`l&1VDXueL`` z&mNFmU+oCGdJTx+B<4d5YWZ(C)pt*Yq`{qxrhf~c#NGjHC?x>HwO>RbosIVc*U=dZ z3ndpe_U>W5hP@AH8NvJ?=EFF(mpuW)A`FRfY|y&NHDw*-5JW5G!c)#Yq7DnG3-iNXw3#M$fXKu z%*P>rjXmUFA+eVIfl1Tkr8g1cf}$02O)u^zdJX$gw7y8p^*qhFo=x9DUwHLMOn>Oh zuWU){S~$^jVMEafsJh$lZn*Lk+wN5p5S#kTeZc;8^agt`$UKSm3X*d|m=>XQeKI+MtMfD|X&xetT(?HG-E&azuyO^x zIQQ|qF=mk@#Tx84B3>NV=K3C-jTe;4<4FO@78j!YYbYSji`)-1G(71wC%wrT(=)QY zllcRqaSZe61f%xZaFgYq>+q-g_K(*0y%lzbxJw3inGIPZ^x{?se*`%fBW-$8zm?%) ze-XD@VWU_Ub~$4mjPq)Y-;1Ecv;&m8V`Gvy$XHJYNjKNP@%b_dbo~^q5|O);PK7VQ z4G>;<0zG#WE7!*k2fXkt9QFY2+M#`^eHj|z8LJf%42y-n+b%;Um!KHXl*&^ufq;T7 zs$TTPZS;Bwu%Y4&Sc2jS(S~s+li<@5IP0d*aw76UV`+1>F5{Xy}RqvHNJ?h3nUDsb2t>O0Ue1z(YcB-{25i-_%Y zT|k(m9j|?b+-z-7k@S)I2)*8mWi?Ouvf6JKaNakxtoC=nR{P;W`+@aO6gJca|IU?_ zw|uXSJ(Pt6-a+kf;OWcx%pX~!tQ9)Kp_~DG%a*&y06sCXE-K zBwTtar~MGuS*>ID<~H2d^cNlA6}U5GY**l3J1ggBIFpQN=y&5$re`?Z{azx`H`wWi>FTa$Ydd*<1ey=CY#(K1T$HwaGetVv$8N&mz+6O%QzdI4Hrf8= z_79mbol=?B>OQ-F?Mdk6P+noZoWQL(&ifQA=YR)a5DjK07oywm_CYw`9}3rF_XZYd ztH2Dr12gd$+j8Ju%^%Yv0P#VaNeiwqiJ5N+J*kyAgmpJQFrojf#_V3@!56Hsi)i30yzJW7upiV+0o;hXrE?2LTwTj%VHb#V z>|X43=KkE=5yM#@?{((HbVplLXuP*%qvhO&^2-(-| zdo7pRC3XjXg2NbN_v)JH{UYYyUBcZkaF^3?bKBY{>(8&S{k*+)QGACxrC9N`F@1_rnVbH-|22>uIlq09P0(}(C72wnrf zfm@x=*Jxj`Mg2i^(%rsft^(pR+_$c6zEfj|X$&!_De?&p3K0OEp zOX2k?eFG`DiDu%z>Y^$eL5_%K8?vQOam*w zBn18okpH^jNt>?2-9Wfz4PyEw38<}6UstCa1IbrASa}Qrai9zs20QgKOaz(yvLBBXL+9j>i`xX zC8VyAt?;jFzAVrE@_bF6Z^-jadA7^*ukw6Hp6|(%)p*y) z59E1Jo*&AyQ=T8o^HX^qlIIb5et~Ch!#Cpb%ACUgiKt4n{q5&XiH zDqST`+P3nG%a$G6_?5@6&HO6l*KhcB9lx6Rbql|K%CEclwU%EG@aqPCJem%>t z3VyxHFD~y7XZ+%_e@S2DnT{#^8p6jaqXFK~`5I>T95TUAwDVL^02e1COqRcQ@8pqE$< z&gR=$P*zr1SWr`1vA|hgTwYnV*f}5A!pd?_Rk4IQue3&o!4+hhSrrBI%8H#em6qG$ zaF?a!1q+JDkakwZ!ivgkE1cy8RSSy|;5J zGi_wiC}&mif`Y0dG6V0Yo^?_Fw9MI)GB3`Wp{@I$=`1TPFBNV>UTJ@#9l&#E4Wa{l zdF3MEm*T4^uB$ODRqGgOITRH`nhcmxudJZ>Mi!0fKa);^OhY7l@-eE7S6#y_0$)eg^*3a-h@TU41(32E#NbgPT8yZv zoC-2hhLD`$i9E9UJovq+pscjWDXHnKE?rXWOsh*jkD04(th^R$XfdHtBFG<2&6|0q z&MI@9=Q*>54@y)*FVUgTFRiMsasH^V3>i87kwxdp$C(gh4X{PUb6o3wSsuD$zB~J^7V$`wOoKy48 zGCr|1Vn0SfMMY(e6IrMTg!3xvMDCG!>#VEJKC8ddqJ^LE!VU52@)gA9xU((|VWpH` zTUt}%6#S%0w?`}-OLW6{n==tG1T%X ztw1%4I$#MY@(KzUg8LjqvY>{IM=%4;xFj!F!E1+MRTVbt8q1J_5KfnRrF0#0odqhV zv*y|hSku&$;N`4Km*-eM7t8lze)lIGOH|OI6Gn*7&~&V-KnO^`P(E2OtBqsryfD)J zaeWAD0mPsF2oyN_!tk{@78f2JHxJ`>hBPf~1%o`%1GZ-&wv_gh&tv(EI?%&<`ht=3 zwYOmr)jps>m)M5wA{F|CsS|>P%sVOYV*CmwgOIXum zbuZ3Df)-a*pE(wFY~@1dNOThDP-m-P`%I6=ID6AB|7c{<=&^H-(L9s6umolKl_FJD zx}db8pbYJFuzv-=<{Y=RR%beku0<&g=U%CcgWZR)c0qbOD0UQtX~AloQcD*&r%j$Y z#yJBuj&K7AwOO$T4K@XY9B*21va4le@Ve$eqix~m2Wv)DUUk5uC6pr0dd5_innn>L z1u?%+T1saazOb}1ztV%M%HWuoVdjPBX?9K&lN*Sp00@{xBPAC z#4X9L+MlG_FMHAHnosjyy6fQdt*5R!;BsAg^V6TD9n5q6;^#0ObIsf1I-BNwuZzwG zovB=pe)5k$)^#Mg4yD1x7N?88U(kQ7YsY6md^6KU-=?Qc*X~CZnD;fBzqA!WKL6SN zZ2%Xq+^bA{2Dz@?cGuUxcc;_!(1mX;Nf|TNbzKU+uE^AU7aRUc4S%KAXg*6r{AnR} zYWb=o=G{m0?;WD$b>&ExME~;dYky~DyAb=Wr_P$C<$GDNOVVj(t?Q-3Gv2=M_Rfh@ zM1Y@9{LWa%1H-TA>-xqOMd$zJrJ=4-On{BwcIkMWqr+*M;yR5U{_-;I&mHrF^807| z_uv;-mhU?H-o(qUf9TP9%l|fU_eJOWGUt9i@#DSI<|WT|xV~6+^^-Lxr|S46q!~WO zYdL&%p_coXmk0Tqz39$~;XjqyHZlA+>*Tk$h5r`ynfFxq?;+a{F9`ot_xZ!b@ShUX z;%fNYmZrncH2adueR*55j+M?Kx*+`0w4ezfKJQ(Jkn=f#xaVUCL#5DrcNmc^%10&YfC8 z>9@@mXN!xIA6{|sQ6`~Jr0E-FqR8XzQ6`E!20Whsj^mgZ52Fyraqdu2@sH*wI(|{! z_l>5H4lkNM+WvU{M~TxO?O!w;?f>!YqvIdVPjvjE{fnkQQGSo-e{_7J;b?xM;b{73 z7#F+siSN_L!CxO(+U)ke5VC{6zTLoa2?>1@V8>r??4#+U;pp(9?f=zqzy65>`}ZF> zFcE(=fCu#NH!v}AK;i%*1@1p!Kq71gf>P-F4S+r1#Qyz)Fo@wKL=S)_=pWn{c zYz7Q4{zbw%{182;5PrzNf&CeNC_D{^_|fzsexu_P5#Pwl5D=!}B8?3g{*18&;UF&f zL6S&nBH+MsFP1ZWmE=uUCwWg+L%c&(s`qQ^6z_0#s`oT?y7!xEgmlmqTJpbb&)q$UF^L?P4`}^W_o9- z%e}MJ72Y4IIo_+(TyKFY^cJc4-UX`Ed$lU_ma9syM^$;NRjqeXc-+xO${*4Ye_s5l zI2Gr`pNdBu;+0+55t9Tj{t%x&sxRW?@H!B$eyYE>zjpv)m#7A+LEb@7j+pFC_6}Aj zsgu1YdsEa9HB=4r4)Y?u-mj}u)Nu6;b*ef|Io0Xvo9bI?gc|Anwihw?j#8u58H~I4 zdupsY%PX;0=X%Gh^VIp?3F-&l9^&tvu4Z^=s>{@D?+=y4-aA*#Q$^ll#$7E`<=zUf z$6MvCQHxZaTB4S!Wsv_c@HJEo^$tOLq^K06%gNr8kUoReV5C#BHwo!A2yq&y1|oKe zh~)sJV}HcCAL8zS4EjPAeISzrNXHI2#Y19oke3R_^8Q@CY0Q|55CJg1`jYz9KvlD2IO5A4KqvCCYRh(^)!%mnn84P>AnXv{t#f4Hl zU0EbJ`k>*a2W=|QW>c7X5}l=mEE zYdS}%5r(m#z$1VYcuROE9H3^^slJ6rdO0bc|YPd!e&b!VT<>UfGj85>|QEobK7iA z?G)(#_%BZ0n13>!Y^V`Xk-?AkF$9z52|1)YcC%Q9R2@V_R~m zvehNqk`wzn8o|yPz%ie>F2E8aOd^SB?66dWl2^ysncM^W5C=ngh*&ud{YWBdjzPZ^ z)+a*$Kp1@u{iZpF|8KzBWB92O;$zcO*J6vIm-S@2IfnleD2g9w`QUVfHpignGH$2w zpW2Vb9E1K2(6<@-pB;z(c3GEO*&F|vj{6Ng=WN9s zgCC~j))Vlb>A2p|2OFzn_|J5-{6EjIbF6e{I<^}BS@nyF_TSEip+0^bo=nGpp=VJS z6GNX0^v&@%*&7np_NnhncT_;EChGi!YDt?IcPz&B32W^QERRwS6H%4VHtyDGSF!on z@OQj?(`@{CvM0Wc|7YOMeB;X0{2uIyUihz%Cq46xnyl$Rw-bPgi61@E^vpMH7i#)p zq@{_b*I1DQ^G%DPcN+Y$=$UVt4ZWim^vpMnz4V{y$$aBA^xGLNnrQy*lAe9n_Gw7C z$$qospADc*&C&6`LQ=UqcgaB3N4R?f?p(P>UcGe3bV)(}NxMY5TLoB5G@k}d`Yh0| zG4u-zJ|$xqgecDqUC0fOsC_Ozs4&J-`clW{|ugT&Bf1a=y`v)n3(Xn*(+4f^b|h* z8;)Pok97F8;u#(>{>9cmGeH(G?kxXf+!_BE&Px3D8~PV| z?jU|gjJq0qi;3n>*BilhfbK>>maeO`9G)=FV$#9h7dG{M)+RLAZ$g-K$FkLG++EqD zyU28>yW8Nd)3|HxWjfN`^PpWbSM&Lc9>Yt4%}wzQ_O%K1=ycK@ccyk4cW2^TOpIJ2 z^9|ii0BrzUifMXIzsUNB`GobB2ivx3IHVI36JDs@-w;MW<^<&N2Hcfk%REib{e{?g zr6B#h#oFBsJ@Oapj`h}la^}^ESBaH13Le3@=vx&%<3B zjzZDQI)U)mh08PUmYhI%6X0$=4~N0rdjjri;ErbkX};`{&)9n50l3?5+{O18USxS= zy1xT=%{X*Sb6=0{V&yp;^+OuZu*1wjSrQYIFJs-!gu6T(@}_YhO?vBYEyJTu3Yc5* z-CK7%LEA`mLooNBK>WUfJI6BZZuAMnZyd8al(Es&qfGUd&oa214V{=Yl_$XG2Dod) zSp}NaDLsXEV*R1E_1eEI<6TU9X7E;U(ftGFEB0&l8-E@=0r|~@yS&?V`2CSL#l+;R z$oMe4wfLnqX?Od2lwV}IVg0%jzqY%zyUXz{CMG;GqQ{w^lHeXqKVFFOh@p?Hw;0YD z;K^a!^(Gwl55^n%jvm9I93uNa(mycnRx>Zs#PAm@KlTsYJi-JMT!4vj7a1?go&AGG zI9YJlY}|2GSWI;O zH1cIW;e0{6p}*IV$L5n*c|8Dkvv=zF954Po0dmPU&I;jP85{T1!*Ail-Kghxgq=V#f^UB6$uyYvM5ggs&-S<7(3kdt{sGW94L`kUkJ$cN{2#A9 zI-VT%8$NqeFEEcf44)-E#mk-uo5*<`)`u?Rjt6DM#N?OQd4VTEnEIZUd)^7S`xNfd z-`DQqzoCPRNw28+dFJagSie9$3(e{?dgtzV@^w?U5X|w?mElvq;|={Z6MXl4M~=5B z-#p`PPmkjm)<2Quk@7tT|uC&qg?e(Ai% z2qx98z3V>Sk^IjDX)0Cw!nlmHSa*zAXkz3MnctYN*e<7)Xm_voQjT=TcDaqW zEy3*P1}vIhg!c~I)h*KQen+v<^uitc!>V4pt2lx3I}`54`?b4o_Sk+$$|XgZ>bYG^ zy+!*c8_2rj-?(SK&c)Ad=+83vnD`nz<+>EV*@nKOC;D#c<;|c?zE$%z2zgJ;apX$= z4&oOu?!Kj6b(0>Ud9~s2+oC_K$NbVec{0AN*Y@A0`EKeld={X{b-9_qxYlWRU+*!# zvE^hf+@(>e1_d| z9Gmv`T25=>rWHEyXnHFr^1Bo6nvA=75-P&Y?dz#$7OehxcfYV)CDkpAkc^UxOag36^T!-!$(t%=;Yk zcA587^PXwmSDAN-c~_bDQuAJI-i_w{3-jJ!-Vd4gR`Y(^yq`Dkm(9D~ygxASPtE(N zc{@b=mQt5=p-eOOtW01U0Vm?^Vqt{&31HTIbB+D0fSJc-A2{CA0YmKAr-cX1rGQiL zPM;#6nqk3{G<=nTvHx7ml?HCg*6Iz`h&vCZ2M& zV9Vadf&tTH=;p?2cf^x^tHIY6$*z;5`XC zzBb@VUt;iUEc^&f?=|?QFg)qk8~j!aKU~u{8@%dc{0E-&tp=ZJ;fES}lOE||c%e6V zw}m(PGuea}jF*vrn!yLMEV)?W5Knqb zE><`;lU{8mTq_*nNgptHD;%qQS#q?(vC5YvM=KnrBaJ0TD;z6*Eje1@*wQrpTqEBg zJ@DkG&ftUeCOw*S$q*s`ZR;L_}XsfJzNHF@kKo8 zXB)i5*WC_bM_Kit#TW6Ux9UNQFRQ+7GX7Y6S@rE!gSYs~v}^y{4Bq04c={hOc#E&Q zb@icCRQ*gm=~JWX=hF>+y1`p~5l?!z!CQP~5(#6~{}x}w)5@y@E-~Mx0Jx()6?gEJ=2@y@T7X<9hYYQkNq>!9qh`_zhY)iUZI+P zO%z%H<<}L0w(G2g?2`p=YnOW^w+abajoh@gz{^Lz8jg!u-OLh4~9= zp$u4ElT4>TLwjwN2hNKYmlXl5otHn4D($M&HL4L|2Sb{EO?oIWrLJ+2qx{0Uf_$Uw zxH!MKuCUlc^_p;bjXP*RuNaE|@}Um7u!I(QK?~?m4xwiU(KRJimDiGTZWQO#lt+At z;1^YUplGvZJ|jh}2iQX4g-{)#;?lDD1iUst^UEqLs|c+LLSoq{p!SQ_>jkbVE+)_< zfT(yTxRKz3VyHo-K2l) zEUU8SV(|OrFx8jJc^B6dSF5{hr4?#}P0Q(d8(1w;du*cTv2w9`-KNzas&?D_vfAnr z^{y>mHDg67t`y8{wjr}Fs8BCMD-4t^s;A+uQ0)du%eT-S>Exqn1Ro>$_%_-Z(^Uo=3eBN8Z(2 zal-9u@tXO+#K)_4jQQeriQ)Q54EwKeJ!5VR0Y z1r2=*)&22I(9i6}>aGN>{!#rd0s3?E)n6QoP&}oC3@R#CKOLmv$^29CNZ5tyCWmN= z%vU>;R9sodqrhcx!Qu=&TW}C$y@4a0G$@F8$jbEhR8?b6hqTV znp^`MAkAztbOj!5^B|LawIZR`ldn1lL4u2*?>oPIL6!PNLQ(Pjg4!~q_Sz({UJgoa zS-n7QPJp&f2xI>s1V$Sx+q{@yvdz8(gyVrtx_To)y+!C61lW8HP-iX7S05*M)NKxx zP^j+i1IaV|FZxiteT_iYI6PIA3-T+gP_N~eL9?~`udk{2$_gY#O+Kxluav2xDb%0( zm~?op59C-|2DQHVH6C@SFIcZdnAA8*7wS`l5(NIx*RGnNb%GIKgizO*@T=5Uuxk@L zl-kP0`RcyDg=$aVFt48K8|Kw6kT*BlFd^E03!hEgX%I&t{k3m?IjZt`>b|c5eXq@y zf3=4R42H|q4LFR`_A5GQd4$hKEDYd#FQ08+(hFq4CI?dClYS~emvm&y67{OXi0yNS z5q`c}*N^1_-ot)-Kb;c!YIi>b%XI@5RWkGmT*$}YVAHk&!vtefrEczL31SQE+WoW( zN^6r?8aX}z`<9#Iz-Ch;pY8H&{z-(3x58b#PZ#%)w&h-VZXhkyD?>gD^0lI9wYGm% zvAVUt9lO=LvwomIBB&mQeeKgX11B+E)pj~-)l4J0wex3*h zRU2@P#Knu3wAhx&=gvfNNJZJ|xkNAmBFIgiExYImuR=f#mWV3nNTQK7sXrF?Z_wjs zNQdmnCgH~ewO_!u3mz99z(U0vU~5sHdB0CExGKVZ|ek~-YH zxA56{E1zw5VKyDoAFfkv1nZeqaxdO5>#KS#*-HySN>s$iig9SPcq& zVZSjKH{XC^eJ)dG&|1`xanH0q%Lrg^2 z1yj4ABx+%CS;1m7E(cC#Z!ll21}=YoXcJF~w$G%1TKs=JMYYg_1|e?bvk6b+ZM8q8w%ntj-;IR>g8VQ=1S!s*8iD|B z6F2MlY?o)-hOoeXVd9~FM|Q>4{X^7)aM+AfuMqtl_|}r`#i;{xJlysUK=0@Qa~FcE1`5@&BX`UE^tT(``dF$4#(ozKxbmKjpJ|J)iCJ zY`PQVcBIg*p@r(Lp&s?+&>HnSsNpKDC@(3kQ-2y-F<-q74_baHj+*GZr>07MG_T;ei{>v=vvuixJar1kGk-|U zlo7=H*d*HYdY`y+#;MJzm*ake99(apUIw=LO?uMuW*-~ub^+1yj)eA(Al9(Y@veNn z1v_sCdC*}MsehQjiquUYYwQrRyYT7#K>Ykb5I?6E2Z-<e?^Kf1Tpg&#Apwa&fEz}C7n_kWSzTDN}7z}C9S&`G0Jn5+t&@Mv zz{(}o>N^HbpQK@4-zDK0n0gQhTkGJ{4Q#EGbKfoPt#$cw16%9**BRK_2jDZXwU6Lu z2DbJM@Vq(wYoDh1*=%6wkQ2lGQ?#c(IU00E1-AATv>SNtT(MRk8ra&Wz`iEkw=K~2 z1L8Cc9du%b8<_gyXvP@W$@`{YCL5SK1Eciuj z|CI%sgIpLisX^G%}eTUNvy?85%xh z!Qaww9P&2(qs~a0lMU?owuX7_Cha|EYB=4%ZB7keVBqA_HGGMIJB|I726h_z3Ijvu zqBuamLx(>@yI*f$ui0nwn1P{>Qq1!PhE7T`ZxiO0MH@0c%*Ph}bOF^-11HbZ@DQ{~ zj1Tl$iWzO-b^}i~u&Y$tUqTrEJ6W;76d8Ny#uRg{fm_T$wjW#WZ_)O5S@s5g)PmWt zz@W7jexNr~4BAtHsXvqE69YSqeV@MCzI~Op|C)iRhm&TMfuVC#%nu9<{hMNVE{yS~ zE>0R=`781;@G=88|5Drk*uZ&rY4~;vHum=$xTQ(kZ#6J;5-AL9W7W^A+KiPuWP{YhHu-d5Ms|-AMgNDlt zoNU5hV$mCTjRhO}pIPor_!|w}`77<;?+l!5>|e6zAJF#g25vI;9~v0?Ud8;wvN!O6 zep(*Ty((s?1vhJWw1J^NRm>yYt@KXt_6Vmw}v*k$M+F>t!!zr~_&)Bf!>u=8mRzhhu;tA;xb?0HtheNb1h zJW*dQ4eJgmU$1ER6azQCtl{q%IN8{bGqBg#Pckrc--^kz+#C8IS@egseVKuwCs$0J z<^DAd`wR@dxq`UOz%A(-zTd#mttdkx%a6eqoHVCdf!`%VMr zU8>h0>+mH0KY8oiXi-E6#TBh zwxE4i6nqjkx>FCgc#g-nqTqCaL*Y%)_Hh>dY;7Ne7e>L0qUcvg!8b+0>!RR0qTmft z@PkqCBT?`ZQSdWS@QYFK%Te%~QSkdw@JCVbr%~`1QE+^c$U7*n0a5VD0?RO5MEp9Q zZ{YW5{NBXxFZi|N_gDPh#qT}*-p4P1Uk834;CBGOgZTXozYp>I2)|DJ{*K?r_uo&V!S5~nSf%~{3g4;n^UF)}u?k)~&ssjn=VGaue;ca=(vzO~ z2D0q*`dR*>addz+>Ef!g;(|rR`6bHWj5998jm^gez}?`_ip5)0VLmQW`B!7fOO|G8 zD;9=9Raim|*?G!pBB1gxsHQ9&Dy&)%W`{e2BcQ@CsIW5Jt`JMnq3|$K9R_(k5utm+ z?XD>-3Zuj%Vi;5$;b(OeWGMBzmB+HwV30Qp3}+5EIEDohbSXltt~9J_hu0L+A(m>z za$aR!Nl}#w?Qob^JAXbFa8-WISYGv)UszTl3o=YtAkVULi=GcwxMHw&9&Rly5-VK;`uQMkd$M2%Pi#N>ji(AI?R%ZMI=Nl4ikpqSUvL?NojB) zO6{HHPD9bQ!TCw!yQZ?RA!_Zp<(Gy+wle=|eBd{2xHrN~9Lu-0{vm)~Mw3t8TFDIx z2EY;L2$fESAWU22f>+Onag_G4-i(TMbvKyqD&(YIj%#5SA`)= zq*xmYTTnM7vVIWdy|qpr?Y|{2dKkUwK)ll{?K&(}Eu_;Z?UE=|KRREAhZ#af1PQdo zN?1h0u+h}aJ$hAN0*Yn_F1ukzSB|n5K;$D!RAEcxf)t-aYv>_dEMbg$)^}Pax-Qh; zVU?jJR}$*)Fw0;@qpblfYgA-r)f~=r#b)5pg11z625YUpX;Q0xV0{?mPrmh{lDG`= z1`F&cv6iF7&eS7xFFwN)?Q>)}Rw>tZvfjmLhJjXXOrKyctMTC!f{66Ax;V7du50vS zvj~ryXRnqzLhmvPg0k62L$V`De?}KCajcP)iCL8vT1!SG(cfW9)P^FuIB8mg#Y-=} zM-WE`V@aG&^>=hIX7dsD7l}vVxA4Yd(BRQ0O%!Yfh+g9Oddoq5&(xjkeY1Mwxq0-?( zro1bi9j{=07u(;WHTDDqgAHDdtrwidG8likIGbzQf;KG3!n7b{W!{Q3X~Pg<-U-$c zFUhPDD6I++SI%36MSaC#4^5qnsG1|J?|#GV52FB}sL2m2&~lEHT{ zF!{C;13=JgeCvhx{2F{B@9DMoeBBrna^c(h=2E!%F30vlS-uX!SUNY~9xiByeai~C z1#`JP>^t19Cd?g^DBS;=Fn9dc?#y0kYnwFQ+$7!ehGk Date: Sat, 17 Nov 2012 13:57:19 +0100 Subject: [PATCH 23/57] Make prebuild executable --- bin/Prebuild.exe | Bin 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 bin/Prebuild.exe diff --git a/bin/Prebuild.exe b/bin/Prebuild.exe old mode 100644 new mode 100755 From b28d9b916294c945e8d42d95853c342a5b1dc988 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sat, 17 Nov 2012 14:06:30 +0100 Subject: [PATCH 24/57] Added .gitignore --- .gitignore | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..953a1e20 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +compile.bat +*.csproj +*.user +*.sln +*.cache + +[Oo]bj/ +[Bb]in/ + From ad3ae73b793e422d9519101d8fae97ecc7c5fd9f Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sat, 17 Nov 2012 14:23:04 +0100 Subject: [PATCH 25/57] Couple of doc fixes --- OpenMetaverse/AgentManager.cs | 1 + OpenMetaverse/Assets/AssetTypes/AssetMutable.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/OpenMetaverse/AgentManager.cs b/OpenMetaverse/AgentManager.cs index 562aef26..4965110a 100644 --- a/OpenMetaverse/AgentManager.cs +++ b/OpenMetaverse/AgentManager.cs @@ -4692,6 +4692,7 @@ namespace OpenMetaverse /// The meters credited /// The meters comitted /// A brief description of the transaction + /// Transaction info public MoneyBalanceReplyEventArgs(UUID transactionID, bool transactionSuccess, int balance, int metersCredit, int metersCommitted, string description, TransactionInfo transactionInfo) { this.m_TransactionID = transactionID; diff --git a/OpenMetaverse/Assets/AssetTypes/AssetMutable.cs b/OpenMetaverse/Assets/AssetTypes/AssetMutable.cs index 59c6baae..8b2e4d02 100644 --- a/OpenMetaverse/Assets/AssetTypes/AssetMutable.cs +++ b/OpenMetaverse/Assets/AssetTypes/AssetMutable.cs @@ -48,6 +48,7 @@ namespace OpenMetaverse.Assets ///

    /// Construct an Asset object of type Animation /// + /// Asset type /// A unique specific to this asset /// A byte array containing the raw asset data public AssetMutable(AssetType type, UUID assetID, byte[] assetData) From 48da5bc264ae9b888fb59824a421b958f32dd8f4 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sat, 17 Nov 2012 14:33:34 +0100 Subject: [PATCH 26/57] Windows fails to load assemblies if files are not executable --- bin/Be.Windows.Forms.HexBox.dll | Bin bin/GlacialList.dll | Bin bin/ICSharpCode.SharpZipLib.dll | Bin bin/OpenMetaverse.Rendering.Linden.dll | Bin bin/PrimMesher.dll | Bin bin/Tao.OpenGl.dll | Bin bin/Tao.Platform.Windows.dll | Bin bin/XMLRPC.dll | Bin bin/log4net.dll | Bin bin/nunit.framework.dll | Bin bin/openjpeg-dotnet-x86_64.dll | Bin bin/zlib.net.dll | Bin 12 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 bin/Be.Windows.Forms.HexBox.dll mode change 100644 => 100755 bin/GlacialList.dll mode change 100644 => 100755 bin/ICSharpCode.SharpZipLib.dll mode change 100644 => 100755 bin/OpenMetaverse.Rendering.Linden.dll mode change 100644 => 100755 bin/PrimMesher.dll mode change 100644 => 100755 bin/Tao.OpenGl.dll mode change 100644 => 100755 bin/Tao.Platform.Windows.dll mode change 100644 => 100755 bin/XMLRPC.dll mode change 100644 => 100755 bin/log4net.dll mode change 100644 => 100755 bin/nunit.framework.dll mode change 100644 => 100755 bin/openjpeg-dotnet-x86_64.dll mode change 100644 => 100755 bin/zlib.net.dll diff --git a/bin/Be.Windows.Forms.HexBox.dll b/bin/Be.Windows.Forms.HexBox.dll old mode 100644 new mode 100755 diff --git a/bin/GlacialList.dll b/bin/GlacialList.dll old mode 100644 new mode 100755 diff --git a/bin/ICSharpCode.SharpZipLib.dll b/bin/ICSharpCode.SharpZipLib.dll old mode 100644 new mode 100755 diff --git a/bin/OpenMetaverse.Rendering.Linden.dll b/bin/OpenMetaverse.Rendering.Linden.dll old mode 100644 new mode 100755 diff --git a/bin/PrimMesher.dll b/bin/PrimMesher.dll old mode 100644 new mode 100755 diff --git a/bin/Tao.OpenGl.dll b/bin/Tao.OpenGl.dll old mode 100644 new mode 100755 diff --git a/bin/Tao.Platform.Windows.dll b/bin/Tao.Platform.Windows.dll old mode 100644 new mode 100755 diff --git a/bin/XMLRPC.dll b/bin/XMLRPC.dll old mode 100644 new mode 100755 diff --git a/bin/log4net.dll b/bin/log4net.dll old mode 100644 new mode 100755 diff --git a/bin/nunit.framework.dll b/bin/nunit.framework.dll old mode 100644 new mode 100755 diff --git a/bin/openjpeg-dotnet-x86_64.dll b/bin/openjpeg-dotnet-x86_64.dll old mode 100644 new mode 100755 diff --git a/bin/zlib.net.dll b/bin/zlib.net.dll old mode 100644 new mode 100755 From 814c749bde39accd5d973f34be36bfbf868dd24e Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sat, 17 Nov 2012 17:45:14 +0100 Subject: [PATCH 27/57] Updated list of capabilities --- OpenMetaverse/Caps.cs | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/OpenMetaverse/Caps.cs b/OpenMetaverse/Caps.cs index 45730827..2a888090 100644 --- a/OpenMetaverse/Caps.cs +++ b/OpenMetaverse/Caps.cs @@ -128,64 +128,69 @@ namespace OpenMetaverse // Create a request list OSDArray req = new OSDArray(); // This list can be updated by using the following command to obtain a current list of capabilities the official linden viewer supports: - // wget -q -O - http://bitbucket.org/lindenlab/viewer-development/raw/default/indra/newview/llviewerregion.cpp | grep 'capabilityNames.append' | sed 's/^[ \t]*//;s/capabilityNames.append("/req.Add("/' + // wget -q -O - https://bitbucket.org/lindenlab/viewer-development/raw/default/indra/newview/llviewerregion.cpp | grep 'capabilityNames.append' | sed 's/^[ \t]*//;s/capabilityNames.append("/req.Add("/' + req.Add("AgentState"); req.Add("AttachmentResources"); req.Add("AvatarPickerSearch"); + req.Add("CharacterProperties"); req.Add("ChatSessionRequest"); req.Add("CopyInventoryFromNotecard"); + req.Add("CreateInventoryCategory"); req.Add("DispatchRegionInfo"); + req.Add("EnvironmentSettings"); req.Add("EstateChangeInfo"); req.Add("EventQueueGet"); - req.Add("ObjectMedia"); - req.Add("ObjectMediaNavigate"); - req.Add("FetchLib2"); - req.Add("FetchLibDescendents2"); req.Add("FetchInventory2"); req.Add("FetchInventoryDescendents2"); + req.Add("FetchLib2"); + req.Add("FetchLibDescendents2"); req.Add("GetDisplayNames"); - req.Add("GetTexture"); req.Add("GetMesh"); req.Add("GetObjectCost"); req.Add("GetObjectPhysicsData"); + req.Add("GetTexture"); + req.Add("GroupMemberData"); req.Add("GroupProposalBallot"); req.Add("HomeLocation"); req.Add("LandResources"); req.Add("MapLayer"); req.Add("MapLayerGod"); + req.Add("MeshUploadFlag"); + req.Add("NavMeshGenerationStatus"); req.Add("NewFileAgentInventory"); - req.Add("NewFileAgentInventoryVariablePrice"); - req.Add("ObjectAdd"); + req.Add("ObjectMedia"); + req.Add("ObjectMediaNavigate"); + req.Add("ObjectNavMeshProperties"); req.Add("ParcelPropertiesUpdate"); - req.Add("ParcelMediaURLFilterList"); - req.Add("ParcelNavigateMedia"); req.Add("ParcelVoiceInfoRequest"); req.Add("ProductInfoRequest"); req.Add("ProvisionVoiceAccountRequest"); req.Add("RemoteParcelRequest"); req.Add("RequestTextureDownload"); + req.Add("ResourceCostSelected"); + req.Add("RetrieveNavMeshSrc"); req.Add("SearchStatRequest"); req.Add("SearchStatTracking"); req.Add("SendPostcard"); req.Add("SendUserReport"); req.Add("SendUserReportWithScreenshot"); req.Add("ServerReleaseNotes"); - req.Add("SimConsole"); - req.Add("SimulatorFeatures"); req.Add("SetDisplayName"); req.Add("SimConsoleAsync"); + req.Add("SimulatorFeatures"); req.Add("StartGroupProposal"); + req.Add("TerrainNavMeshProperties"); req.Add("TextureStats"); req.Add("UntrustedSimulatorMessage"); req.Add("UpdateAgentInformation"); req.Add("UpdateAgentLanguage"); req.Add("UpdateGestureAgentInventory"); - req.Add("UpdateNotecardAgentInventory"); - req.Add("UpdateScriptAgent"); req.Add("UpdateGestureTaskInventory"); + req.Add("UpdateNotecardAgentInventory"); req.Add("UpdateNotecardTaskInventory"); + req.Add("UpdateScriptAgent"); req.Add("UpdateScriptTask"); req.Add("UploadBakedTexture"); - req.Add("UploadObjectAsset"); req.Add("ViewerMetrics"); req.Add("ViewerStartAuction"); req.Add("ViewerStats"); From 9d42f0071eaa68ab75043012ece41e2bac66deed Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sat, 17 Nov 2012 19:51:18 +0100 Subject: [PATCH 28/57] LIBOMV-956: Add support for large groups (GroupMemberData capability) --- OpenMetaverse/GroupManager.cs | 65 +++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/OpenMetaverse/GroupManager.cs b/OpenMetaverse/GroupManager.cs index a3e4fd37..e6bbfc28 100644 --- a/OpenMetaverse/GroupManager.cs +++ b/OpenMetaverse/GroupManager.cs @@ -30,6 +30,7 @@ using OpenMetaverse.Packets; using OpenMetaverse.StructuredData; using OpenMetaverse.Messages.Linden; using OpenMetaverse.Interfaces; +using OpenMetaverse.Http; namespace OpenMetaverse { @@ -1002,6 +1003,27 @@ namespace OpenMetaverse public UUID RequestGroupMembers(UUID group) { UUID requestID = UUID.Random(); + Uri url = null; + + if (Client.Network.CurrentSim.Caps != null && + null != (url = Client.Network.CurrentSim.Caps.CapabilityURI("GroupMemberData"))) + { + CapsClient req = new CapsClient(url); + req.OnComplete += (client, result, error) => + { + if (error == null) + { + GroupMembersHandlerCaps(requestID, result); + } + }; + + OSDMap requestData = new OSDMap(1); + requestData["group_id"] = group; + req.BeginGetResponse(requestData, OSDFormat.Xml, Client.Settings.CAPS_TIMEOUT * 4); + + return requestID; + } + lock (GroupMembersRequests) GroupMembersRequests.Add(requestID); GroupMembersRequestPacket request = new GroupMembersRequestPacket(); @@ -1613,6 +1635,49 @@ namespace OpenMetaverse } } + protected void GroupMembersHandlerCaps(UUID requestID, OSD result) + { + try + { + OSDMap res = (OSDMap)result; + int memberCount = res["member_count"]; + OSDArray titlesOSD = (OSDArray)res["titles"]; + string[] titles = new string[titlesOSD.Count]; + for (int i = 0; i < titlesOSD.Count; i++) + { + titles[i] = titlesOSD[i]; + } + UUID groupID = res["group_id"]; + GroupPowers defaultPowers = (GroupPowers)(ulong)((OSDMap)res["defaults"])["default_powers"]; + OSDMap membersOSD = (OSDMap)res["members"]; + Dictionary groupMembers = new Dictionary(membersOSD.Count); + foreach (var memberID in membersOSD.Keys) + { + OSDMap member = (OSDMap)membersOSD[memberID]; + + GroupMember groupMember = new GroupMember(); + groupMember.ID = (UUID)memberID; + groupMember.Contribution = member["donated_square_meters"]; + groupMember.IsOwner = "Y" == member["owner"].AsString(); + groupMember.OnlineStatus = member["last_login"]; + groupMember.Powers = defaultPowers; + if (member.ContainsKey("powers")) + { + groupMember.Powers = (GroupPowers)(ulong)member["powers"]; + } + groupMember.Title = titles[(int)member["title"]]; + + groupMembers[groupMember.ID] = groupMember; + } + + OnGroupMembersReply(new GroupMembersReplyEventArgs(requestID, groupID, groupMembers)); + } + catch (Exception ex) + { + Logger.Log("Failed to decode result of GroupMemberData capability: ", Helpers.LogLevel.Error, Client, ex); + } + } + /// Process an incoming packet and raise the appropriate events /// The sender /// The EventArgs object containing the packet data From 7970572637861520a5c6aa8a708a884ed9e88e79 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sat, 17 Nov 2012 23:43:51 +0100 Subject: [PATCH 29/57] Added field for last updated timestamp to display name class --- OpenMetaverse/AvatarManager.cs | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/OpenMetaverse/AvatarManager.cs b/OpenMetaverse/AvatarManager.cs index 742f3405..65eb72b0 100644 --- a/OpenMetaverse/AvatarManager.cs +++ b/OpenMetaverse/AvatarManager.cs @@ -56,6 +56,8 @@ namespace OpenMetaverse public bool IsDefaultDisplayName; /// Cache display name until public DateTime NextUpdate; + /// Last updated timestamp + public DateTime Updated; /// /// Creates AgentDisplayName object from OSD @@ -74,6 +76,7 @@ namespace OpenMetaverse ret.LegacyLastName = map["legacy_last_name"]; ret.IsDefaultDisplayName = map["is_display_name_default"]; ret.NextUpdate = map["display_name_next_update"]; + ret.Updated = map["last_updated"]; return ret; } @@ -93,23 +96,14 @@ namespace OpenMetaverse map["legacy_last_name"] = LegacyLastName; map["is_display_name_default"] = IsDefaultDisplayName; map["display_name_next_update"] = NextUpdate; - + map["last_updated"] = Updated; + return map; } public override string ToString() { return Helpers.StructToString(this); - //StringBuilder result = new StringBuilder(); - //result.AppendLine(); - //result.AppendFormat("{0, 30}: {1,-40} [{2}]" + Environment.NewLine, "ID", ID, "UUID"); - //result.AppendFormat("{0, 30}: {1,-40} [{2}]" + Environment.NewLine, "UserName", UserName, "string"); - //result.AppendFormat("{0, 30}: {1,-40} [{2}]" + Environment.NewLine, "DisplayName", DisplayName, "string"); - //result.AppendFormat("{0, 30}: {1,-40} [{2}]" + Environment.NewLine, "LegacyFirstName", LegacyFirstName, "string"); - //result.AppendFormat("{0, 30}: {1,-40} [{2}]" + Environment.NewLine, "LegaacyLastName", LegaacyLastName, "string"); - //result.AppendFormat("{0, 30}: {1,-40} [{2}]" + Environment.NewLine, "IsDefaultDisplayName", IsDefaultDisplayName, "bool"); - //result.AppendFormat("{0, 30}: {1,-40} [{2}]", "NextUpdate", NextUpdate, "DateTime"); - //return result.ToString(); } } From 2799ada5d2f7d7ae483899ee6f86f2e4a19aef63 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sat, 17 Nov 2012 23:44:39 +0100 Subject: [PATCH 30/57] Line endings --- OpenMetaverse/Messages/LindenMessages.cs | 76 ++++++++++++------------ 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/OpenMetaverse/Messages/LindenMessages.cs b/OpenMetaverse/Messages/LindenMessages.cs index c9bf83e2..5fe792d7 100644 --- a/OpenMetaverse/Messages/LindenMessages.cs +++ b/OpenMetaverse/Messages/LindenMessages.cs @@ -1,27 +1,27 @@ -/* - * Copyright (c) 2009, openmetaverse.org - * All rights reserved. - * - * - 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. - * - Neither the name of the openmetaverse.org 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR 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. +/* + * Copyright (c) 2009, openmetaverse.org + * All rights reserved. + * + * - 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. + * - Neither the name of the openmetaverse.org 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR 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; @@ -539,7 +539,7 @@ namespace OpenMetaverse.Messages.Linden block.IsGroupOwned = dataMap["IsGroupOwned"].AsBoolean(); block.OnlineStatus = dataMap["OnlineStatus"].AsBoolean(); // deprecated - /* if the agent has no permissions, or there are no prims, the counts + /* if the agent has no permissions, or there are no prims, the counts * should not match up, so we don't decode the DataExtended map */ if (dataExtendedArray.Count == dataArray.Count) { @@ -3282,7 +3282,7 @@ namespace OpenMetaverse.Messages.Linden if (kvp.Key == "updates") { // This appears to be redundant and duplicated by the info block, more dumps will confirm this - /* 32939971-a520-4b52-8ca5-6085d0e39933 + /* 32939971-a520-4b52-8ca5-6085d0e39933 ENTER */ } else if (kvp.Key == "session_id") @@ -3290,24 +3290,24 @@ namespace OpenMetaverse.Messages.Linden // I am making the assumption that each osdmap will contain the information for a // single session. This is how the map appears to read however more dumps should be taken // to confirm this. - /* session_id + /* session_id 984f6a1e-4ceb-6366-8d5e-a18c6819c6f7 */ } else // key is an agent uuid (we hope!) { // should be the agents uuid as the key, and "info" as the datablock - /* 32939971-a520-4b52-8ca5-6085d0e39933 - - info - - can_voice_chat - 1 - is_moderator - 1 - - transition - ENTER + /* 32939971-a520-4b52-8ca5-6085d0e39933 + + info + + can_voice_chat + 1 + is_moderator + 1 + + transition + ENTER */ AgentUpdatesBlock block = new AgentUpdatesBlock(); block.AgentID = UUID.Parse(kvp.Key); From d5ba5ce9c43599c138c091e109aa262764591162 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sat, 15 Dec 2012 08:20:13 +0100 Subject: [PATCH 31/57] Updated message_template from the project sunshine viewer (server side baking) --- OpenMetaverse/_Packets_.cs | 532 ++++++++++++++++++++++++++++++++++++- data/message_template.msg | 23 ++ 2 files changed, 542 insertions(+), 13 deletions(-) diff --git a/OpenMetaverse/_Packets_.cs b/OpenMetaverse/_Packets_.cs index 35d2c792..21d2a887 100644 --- a/OpenMetaverse/_Packets_.cs +++ b/OpenMetaverse/_Packets_.cs @@ -24669,21 +24669,62 @@ namespace OpenMetaverse.Packets } + /// + public sealed class RegionInfoBlock : PacketBlock + { + public ulong RegionFlagsExtended; + + public override int Length + { + get + { + return 8; + } + } + + public RegionInfoBlock() { } + public RegionInfoBlock(byte[] bytes, ref int i) + { + FromBytes(bytes, ref i); + } + + public override void FromBytes(byte[] bytes, ref int i) + { + try + { + RegionFlagsExtended = (ulong)((ulong)bytes[i++] + ((ulong)bytes[i++] << 8) + ((ulong)bytes[i++] << 16) + ((ulong)bytes[i++] << 24) + ((ulong)bytes[i++] << 32) + ((ulong)bytes[i++] << 40) + ((ulong)bytes[i++] << 48) + ((ulong)bytes[i++] << 56)); + } + catch (Exception) + { + throw new MalformedDataException(); + } + } + + public override void ToBytes(byte[] bytes, ref int i) + { + Utils.UInt64ToBytes(RegionFlagsExtended, bytes, i); i += 8; + } + + } + public override int Length { get { - int length = 11; + int length = 12; length += Region.Length; for (int j = 0; j < Stat.Length; j++) length += Stat[j].Length; length += PidStat.Length; + for (int j = 0; j < RegionInfo.Length; j++) + length += RegionInfo[j].Length; return length; } } public RegionBlock Region; public StatBlock[] Stat; public PidStatBlock PidStat; + public RegionInfoBlock[] RegionInfo; public SimStatsPacket() { @@ -24696,6 +24737,7 @@ namespace OpenMetaverse.Packets Region = new RegionBlock(); Stat = null; PidStat = new PidStatBlock(); + RegionInfo = null; } public SimStatsPacket(byte[] bytes, ref int i) : this() @@ -24722,6 +24764,14 @@ namespace OpenMetaverse.Packets for (int j = 0; j < count; j++) { Stat[j].FromBytes(bytes, ref i); } PidStat.FromBytes(bytes, ref i); + count = (int)bytes[i++]; + if(RegionInfo == null || RegionInfo.Length != -1) { + RegionInfo = new RegionInfoBlock[count]; + for(int j = 0; j < count; j++) + { RegionInfo[j] = new RegionInfoBlock(); } + } + for (int j = 0; j < count; j++) + { RegionInfo[j].FromBytes(bytes, ref i); } } public SimStatsPacket(Header head, byte[] bytes, ref int i): this() @@ -24743,6 +24793,14 @@ namespace OpenMetaverse.Packets for (int j = 0; j < count; j++) { Stat[j].FromBytes(bytes, ref i); } PidStat.FromBytes(bytes, ref i); + count = (int)bytes[i++]; + if(RegionInfo == null || RegionInfo.Length != count) { + RegionInfo = new RegionInfoBlock[count]; + for(int j = 0; j < count; j++) + { RegionInfo[j] = new RegionInfoBlock(); } + } + for (int j = 0; j < count; j++) + { RegionInfo[j].FromBytes(bytes, ref i); } } public override byte[] ToBytes() @@ -24752,6 +24810,8 @@ namespace OpenMetaverse.Packets length += PidStat.Length; length++; for (int j = 0; j < Stat.Length; j++) { length += Stat[j].Length; } + length++; + for (int j = 0; j < RegionInfo.Length; j++) { length += RegionInfo[j].Length; } if (Header.AckList != null && Header.AckList.Length > 0) { length += Header.AckList.Length * 4 + 1; } byte[] bytes = new byte[length]; int i = 0; @@ -24760,6 +24820,8 @@ namespace OpenMetaverse.Packets bytes[i++] = (byte)Stat.Length; for (int j = 0; j < Stat.Length; j++) { Stat[j].ToBytes(bytes, ref i); } PidStat.ToBytes(bytes, ref i); + bytes[i++] = (byte)RegionInfo.Length; + for (int j = 0; j < RegionInfo.Length; j++) { RegionInfo[j].ToBytes(bytes, ref i); } if (Header.AckList != null && Header.AckList.Length > 0) { Header.AcksToBytes(bytes, ref i); } return bytes; } @@ -25077,24 +25139,65 @@ namespace OpenMetaverse.Packets } + /// + public sealed class RegionInfo3Block : PacketBlock + { + public ulong RegionFlagsExtended; + + public override int Length + { + get + { + return 8; + } + } + + public RegionInfo3Block() { } + public RegionInfo3Block(byte[] bytes, ref int i) + { + FromBytes(bytes, ref i); + } + + public override void FromBytes(byte[] bytes, ref int i) + { + try + { + RegionFlagsExtended = (ulong)((ulong)bytes[i++] + ((ulong)bytes[i++] << 8) + ((ulong)bytes[i++] << 16) + ((ulong)bytes[i++] << 24) + ((ulong)bytes[i++] << 32) + ((ulong)bytes[i++] << 40) + ((ulong)bytes[i++] << 48) + ((ulong)bytes[i++] << 56)); + } + catch (Exception) + { + throw new MalformedDataException(); + } + } + + public override void ToBytes(byte[] bytes, ref int i) + { + Utils.UInt64ToBytes(RegionFlagsExtended, bytes, i); i += 8; + } + + } + public override int Length { get { - int length = 10; + int length = 11; length += AgentData.Length; length += RegionInfo.Length; length += RegionInfo2.Length; + for (int j = 0; j < RegionInfo3.Length; j++) + length += RegionInfo3[j].Length; return length; } } public AgentDataBlock AgentData; public RegionInfoBlock RegionInfo; public RegionInfo2Block RegionInfo2; + public RegionInfo3Block[] RegionInfo3; public RegionInfoPacket() { - HasVariableBlocks = false; + HasVariableBlocks = true; Type = PacketType.RegionInfo; Header = new Header(); Header.Frequency = PacketFrequency.Low; @@ -25104,6 +25207,7 @@ namespace OpenMetaverse.Packets AgentData = new AgentDataBlock(); RegionInfo = new RegionInfoBlock(); RegionInfo2 = new RegionInfo2Block(); + RegionInfo3 = null; } public RegionInfoPacket(byte[] bytes, ref int i) : this() @@ -25123,6 +25227,14 @@ namespace OpenMetaverse.Packets AgentData.FromBytes(bytes, ref i); RegionInfo.FromBytes(bytes, ref i); RegionInfo2.FromBytes(bytes, ref i); + int count = (int)bytes[i++]; + if(RegionInfo3 == null || RegionInfo3.Length != -1) { + RegionInfo3 = new RegionInfo3Block[count]; + for(int j = 0; j < count; j++) + { RegionInfo3[j] = new RegionInfo3Block(); } + } + for (int j = 0; j < count; j++) + { RegionInfo3[j].FromBytes(bytes, ref i); } } public RegionInfoPacket(Header head, byte[] bytes, ref int i): this() @@ -25137,6 +25249,14 @@ namespace OpenMetaverse.Packets AgentData.FromBytes(bytes, ref i); RegionInfo.FromBytes(bytes, ref i); RegionInfo2.FromBytes(bytes, ref i); + int count = (int)bytes[i++]; + if(RegionInfo3 == null || RegionInfo3.Length != count) { + RegionInfo3 = new RegionInfo3Block[count]; + for(int j = 0; j < count; j++) + { RegionInfo3[j] = new RegionInfo3Block(); } + } + for (int j = 0; j < count; j++) + { RegionInfo3[j].FromBytes(bytes, ref i); } } public override byte[] ToBytes() @@ -25145,6 +25265,8 @@ namespace OpenMetaverse.Packets length += AgentData.Length; length += RegionInfo.Length; length += RegionInfo2.Length; + length++; + for (int j = 0; j < RegionInfo3.Length; j++) { length += RegionInfo3[j].Length; } if (Header.AckList != null && Header.AckList.Length > 0) { length += Header.AckList.Length * 4 + 1; } byte[] bytes = new byte[length]; int i = 0; @@ -25152,13 +25274,72 @@ namespace OpenMetaverse.Packets AgentData.ToBytes(bytes, ref i); RegionInfo.ToBytes(bytes, ref i); RegionInfo2.ToBytes(bytes, ref i); + bytes[i++] = (byte)RegionInfo3.Length; + for (int j = 0; j < RegionInfo3.Length; j++) { RegionInfo3[j].ToBytes(bytes, ref i); } if (Header.AckList != null && Header.AckList.Length > 0) { Header.AcksToBytes(bytes, ref i); } return bytes; } public override byte[][] ToBytesMultiple() { - return new byte[][] { ToBytes() }; + System.Collections.Generic.List packets = new System.Collections.Generic.List(); + int i = 0; + int fixedLength = 10; + + byte[] ackBytes = null; + int acksLength = 0; + if (Header.AckList != null && Header.AckList.Length > 0) { + Header.AppendedAcks = true; + ackBytes = new byte[Header.AckList.Length * 4 + 1]; + Header.AcksToBytes(ackBytes, ref acksLength); + } + + fixedLength += AgentData.Length; + fixedLength += RegionInfo.Length; + fixedLength += RegionInfo2.Length; + byte[] fixedBytes = new byte[fixedLength]; + Header.ToBytes(fixedBytes, ref i); + AgentData.ToBytes(fixedBytes, ref i); + RegionInfo.ToBytes(fixedBytes, ref i); + RegionInfo2.ToBytes(fixedBytes, ref i); + fixedLength += 1; + + int RegionInfo3Start = 0; + do + { + int variableLength = 0; + int RegionInfo3Count = 0; + + i = RegionInfo3Start; + while (fixedLength + variableLength + acksLength < Packet.MTU && i < RegionInfo3.Length) { + int blockLength = RegionInfo3[i].Length; + if (fixedLength + variableLength + blockLength + acksLength <= MTU) { + variableLength += blockLength; + ++RegionInfo3Count; + } + else { break; } + ++i; + } + + byte[] packet = new byte[fixedLength + variableLength + acksLength]; + int length = fixedBytes.Length; + Buffer.BlockCopy(fixedBytes, 0, packet, 0, length); + if (packets.Count > 0) { packet[0] = (byte)(packet[0] & ~0x10); } + + packet[length++] = (byte)RegionInfo3Count; + for (i = RegionInfo3Start; i < RegionInfo3Start + RegionInfo3Count; i++) { RegionInfo3[i].ToBytes(packet, ref length); } + RegionInfo3Start += RegionInfo3Count; + + if (acksLength > 0) { + Buffer.BlockCopy(ackBytes, 0, packet, length, acksLength); + acksLength = 0; + } + + packets.Add(packet); + } while ( + RegionInfo3Start < RegionInfo3.Length); + + return packets.ToArray(); } } @@ -25271,22 +25452,63 @@ namespace OpenMetaverse.Packets } + /// + public sealed class RegionInfo2Block : PacketBlock + { + public ulong RegionFlagsExtended; + + public override int Length + { + get + { + return 8; + } + } + + public RegionInfo2Block() { } + public RegionInfo2Block(byte[] bytes, ref int i) + { + FromBytes(bytes, ref i); + } + + public override void FromBytes(byte[] bytes, ref int i) + { + try + { + RegionFlagsExtended = (ulong)((ulong)bytes[i++] + ((ulong)bytes[i++] << 8) + ((ulong)bytes[i++] << 16) + ((ulong)bytes[i++] << 24) + ((ulong)bytes[i++] << 32) + ((ulong)bytes[i++] << 40) + ((ulong)bytes[i++] << 48) + ((ulong)bytes[i++] << 56)); + } + catch (Exception) + { + throw new MalformedDataException(); + } + } + + public override void ToBytes(byte[] bytes, ref int i) + { + Utils.UInt64ToBytes(RegionFlagsExtended, bytes, i); i += 8; + } + + } + public override int Length { get { - int length = 10; + int length = 11; length += AgentData.Length; length += RegionInfo.Length; + for (int j = 0; j < RegionInfo2.Length; j++) + length += RegionInfo2[j].Length; return length; } } public AgentDataBlock AgentData; public RegionInfoBlock RegionInfo; + public RegionInfo2Block[] RegionInfo2; public GodUpdateRegionInfoPacket() { - HasVariableBlocks = false; + HasVariableBlocks = true; Type = PacketType.GodUpdateRegionInfo; Header = new Header(); Header.Frequency = PacketFrequency.Low; @@ -25295,6 +25517,7 @@ namespace OpenMetaverse.Packets Header.Zerocoded = true; AgentData = new AgentDataBlock(); RegionInfo = new RegionInfoBlock(); + RegionInfo2 = null; } public GodUpdateRegionInfoPacket(byte[] bytes, ref int i) : this() @@ -25313,6 +25536,14 @@ namespace OpenMetaverse.Packets } AgentData.FromBytes(bytes, ref i); RegionInfo.FromBytes(bytes, ref i); + int count = (int)bytes[i++]; + if(RegionInfo2 == null || RegionInfo2.Length != -1) { + RegionInfo2 = new RegionInfo2Block[count]; + for(int j = 0; j < count; j++) + { RegionInfo2[j] = new RegionInfo2Block(); } + } + for (int j = 0; j < count; j++) + { RegionInfo2[j].FromBytes(bytes, ref i); } } public GodUpdateRegionInfoPacket(Header head, byte[] bytes, ref int i): this() @@ -25326,6 +25557,14 @@ namespace OpenMetaverse.Packets Header = header; AgentData.FromBytes(bytes, ref i); RegionInfo.FromBytes(bytes, ref i); + int count = (int)bytes[i++]; + if(RegionInfo2 == null || RegionInfo2.Length != count) { + RegionInfo2 = new RegionInfo2Block[count]; + for(int j = 0; j < count; j++) + { RegionInfo2[j] = new RegionInfo2Block(); } + } + for (int j = 0; j < count; j++) + { RegionInfo2[j].FromBytes(bytes, ref i); } } public override byte[] ToBytes() @@ -25333,19 +25572,78 @@ namespace OpenMetaverse.Packets int length = 10; length += AgentData.Length; length += RegionInfo.Length; + length++; + for (int j = 0; j < RegionInfo2.Length; j++) { length += RegionInfo2[j].Length; } if (Header.AckList != null && Header.AckList.Length > 0) { length += Header.AckList.Length * 4 + 1; } byte[] bytes = new byte[length]; int i = 0; Header.ToBytes(bytes, ref i); AgentData.ToBytes(bytes, ref i); RegionInfo.ToBytes(bytes, ref i); + bytes[i++] = (byte)RegionInfo2.Length; + for (int j = 0; j < RegionInfo2.Length; j++) { RegionInfo2[j].ToBytes(bytes, ref i); } if (Header.AckList != null && Header.AckList.Length > 0) { Header.AcksToBytes(bytes, ref i); } return bytes; } public override byte[][] ToBytesMultiple() { - return new byte[][] { ToBytes() }; + System.Collections.Generic.List packets = new System.Collections.Generic.List(); + int i = 0; + int fixedLength = 10; + + byte[] ackBytes = null; + int acksLength = 0; + if (Header.AckList != null && Header.AckList.Length > 0) { + Header.AppendedAcks = true; + ackBytes = new byte[Header.AckList.Length * 4 + 1]; + Header.AcksToBytes(ackBytes, ref acksLength); + } + + fixedLength += AgentData.Length; + fixedLength += RegionInfo.Length; + byte[] fixedBytes = new byte[fixedLength]; + Header.ToBytes(fixedBytes, ref i); + AgentData.ToBytes(fixedBytes, ref i); + RegionInfo.ToBytes(fixedBytes, ref i); + fixedLength += 1; + + int RegionInfo2Start = 0; + do + { + int variableLength = 0; + int RegionInfo2Count = 0; + + i = RegionInfo2Start; + while (fixedLength + variableLength + acksLength < Packet.MTU && i < RegionInfo2.Length) { + int blockLength = RegionInfo2[i].Length; + if (fixedLength + variableLength + blockLength + acksLength <= MTU) { + variableLength += blockLength; + ++RegionInfo2Count; + } + else { break; } + ++i; + } + + byte[] packet = new byte[fixedLength + variableLength + acksLength]; + int length = fixedBytes.Length; + Buffer.BlockCopy(fixedBytes, 0, packet, 0, length); + if (packets.Count > 0) { packet[0] = (byte)(packet[0] & ~0x10); } + + packet[length++] = (byte)RegionInfo2Count; + for (i = RegionInfo2Start; i < RegionInfo2Start + RegionInfo2Count; i++) { RegionInfo2[i].ToBytes(packet, ref length); } + RegionInfo2Start += RegionInfo2Count; + + if (acksLength > 0) { + Buffer.BlockCopy(ackBytes, 0, packet, length, acksLength); + acksLength = 0; + } + + packets.Add(packet); + } while ( + RegionInfo2Start < RegionInfo2.Length); + + return packets.ToArray(); } } @@ -25567,24 +25865,68 @@ namespace OpenMetaverse.Packets } + /// + public sealed class RegionInfo4Block : PacketBlock + { + public ulong RegionFlagsExtended; + public ulong RegionProtocols; + + public override int Length + { + get + { + return 16; + } + } + + public RegionInfo4Block() { } + public RegionInfo4Block(byte[] bytes, ref int i) + { + FromBytes(bytes, ref i); + } + + public override void FromBytes(byte[] bytes, ref int i) + { + try + { + RegionFlagsExtended = (ulong)((ulong)bytes[i++] + ((ulong)bytes[i++] << 8) + ((ulong)bytes[i++] << 16) + ((ulong)bytes[i++] << 24) + ((ulong)bytes[i++] << 32) + ((ulong)bytes[i++] << 40) + ((ulong)bytes[i++] << 48) + ((ulong)bytes[i++] << 56)); + RegionProtocols = (ulong)((ulong)bytes[i++] + ((ulong)bytes[i++] << 8) + ((ulong)bytes[i++] << 16) + ((ulong)bytes[i++] << 24) + ((ulong)bytes[i++] << 32) + ((ulong)bytes[i++] << 40) + ((ulong)bytes[i++] << 48) + ((ulong)bytes[i++] << 56)); + } + catch (Exception) + { + throw new MalformedDataException(); + } + } + + public override void ToBytes(byte[] bytes, ref int i) + { + Utils.UInt64ToBytes(RegionFlagsExtended, bytes, i); i += 8; + Utils.UInt64ToBytes(RegionProtocols, bytes, i); i += 8; + } + + } + public override int Length { get { - int length = 10; + int length = 11; length += RegionInfo.Length; length += RegionInfo2.Length; length += RegionInfo3.Length; + for (int j = 0; j < RegionInfo4.Length; j++) + length += RegionInfo4[j].Length; return length; } } public RegionInfoBlock RegionInfo; public RegionInfo2Block RegionInfo2; public RegionInfo3Block RegionInfo3; + public RegionInfo4Block[] RegionInfo4; public RegionHandshakePacket() { - HasVariableBlocks = false; + HasVariableBlocks = true; Type = PacketType.RegionHandshake; Header = new Header(); Header.Frequency = PacketFrequency.Low; @@ -25594,6 +25936,7 @@ namespace OpenMetaverse.Packets RegionInfo = new RegionInfoBlock(); RegionInfo2 = new RegionInfo2Block(); RegionInfo3 = new RegionInfo3Block(); + RegionInfo4 = null; } public RegionHandshakePacket(byte[] bytes, ref int i) : this() @@ -25613,6 +25956,14 @@ namespace OpenMetaverse.Packets RegionInfo.FromBytes(bytes, ref i); RegionInfo2.FromBytes(bytes, ref i); RegionInfo3.FromBytes(bytes, ref i); + int count = (int)bytes[i++]; + if(RegionInfo4 == null || RegionInfo4.Length != -1) { + RegionInfo4 = new RegionInfo4Block[count]; + for(int j = 0; j < count; j++) + { RegionInfo4[j] = new RegionInfo4Block(); } + } + for (int j = 0; j < count; j++) + { RegionInfo4[j].FromBytes(bytes, ref i); } } public RegionHandshakePacket(Header head, byte[] bytes, ref int i): this() @@ -25627,6 +25978,14 @@ namespace OpenMetaverse.Packets RegionInfo.FromBytes(bytes, ref i); RegionInfo2.FromBytes(bytes, ref i); RegionInfo3.FromBytes(bytes, ref i); + int count = (int)bytes[i++]; + if(RegionInfo4 == null || RegionInfo4.Length != count) { + RegionInfo4 = new RegionInfo4Block[count]; + for(int j = 0; j < count; j++) + { RegionInfo4[j] = new RegionInfo4Block(); } + } + for (int j = 0; j < count; j++) + { RegionInfo4[j].FromBytes(bytes, ref i); } } public override byte[] ToBytes() @@ -25635,6 +25994,8 @@ namespace OpenMetaverse.Packets length += RegionInfo.Length; length += RegionInfo2.Length; length += RegionInfo3.Length; + length++; + for (int j = 0; j < RegionInfo4.Length; j++) { length += RegionInfo4[j].Length; } if (Header.AckList != null && Header.AckList.Length > 0) { length += Header.AckList.Length * 4 + 1; } byte[] bytes = new byte[length]; int i = 0; @@ -25642,13 +26003,72 @@ namespace OpenMetaverse.Packets RegionInfo.ToBytes(bytes, ref i); RegionInfo2.ToBytes(bytes, ref i); RegionInfo3.ToBytes(bytes, ref i); + bytes[i++] = (byte)RegionInfo4.Length; + for (int j = 0; j < RegionInfo4.Length; j++) { RegionInfo4[j].ToBytes(bytes, ref i); } if (Header.AckList != null && Header.AckList.Length > 0) { Header.AcksToBytes(bytes, ref i); } return bytes; } public override byte[][] ToBytesMultiple() { - return new byte[][] { ToBytes() }; + System.Collections.Generic.List packets = new System.Collections.Generic.List(); + int i = 0; + int fixedLength = 10; + + byte[] ackBytes = null; + int acksLength = 0; + if (Header.AckList != null && Header.AckList.Length > 0) { + Header.AppendedAcks = true; + ackBytes = new byte[Header.AckList.Length * 4 + 1]; + Header.AcksToBytes(ackBytes, ref acksLength); + } + + fixedLength += RegionInfo.Length; + fixedLength += RegionInfo2.Length; + fixedLength += RegionInfo3.Length; + byte[] fixedBytes = new byte[fixedLength]; + Header.ToBytes(fixedBytes, ref i); + RegionInfo.ToBytes(fixedBytes, ref i); + RegionInfo2.ToBytes(fixedBytes, ref i); + RegionInfo3.ToBytes(fixedBytes, ref i); + fixedLength += 1; + + int RegionInfo4Start = 0; + do + { + int variableLength = 0; + int RegionInfo4Count = 0; + + i = RegionInfo4Start; + while (fixedLength + variableLength + acksLength < Packet.MTU && i < RegionInfo4.Length) { + int blockLength = RegionInfo4[i].Length; + if (fixedLength + variableLength + blockLength + acksLength <= MTU) { + variableLength += blockLength; + ++RegionInfo4Count; + } + else { break; } + ++i; + } + + byte[] packet = new byte[fixedLength + variableLength + acksLength]; + int length = fixedBytes.Length; + Buffer.BlockCopy(fixedBytes, 0, packet, 0, length); + if (packets.Count > 0) { packet[0] = (byte)(packet[0] & ~0x10); } + + packet[length++] = (byte)RegionInfo4Count; + for (i = RegionInfo4Start; i < RegionInfo4Start + RegionInfo4Count; i++) { RegionInfo4[i].ToBytes(packet, ref length); } + RegionInfo4Start += RegionInfo4Count; + + if (acksLength > 0) { + Buffer.BlockCopy(ackBytes, 0, packet, length, acksLength); + acksLength = 0; + } + + packets.Add(packet); + } while ( + RegionInfo4Start < RegionInfo4.Length); + + return packets.ToArray(); } } @@ -26880,21 +27300,68 @@ namespace OpenMetaverse.Packets } + /// + public sealed class AppearanceDataBlock : PacketBlock + { + public byte AppearanceVersion; + public int CofVersion; + public uint Flags; + + public override int Length + { + get + { + return 9; + } + } + + public AppearanceDataBlock() { } + public AppearanceDataBlock(byte[] bytes, ref int i) + { + FromBytes(bytes, ref i); + } + + public override void FromBytes(byte[] bytes, ref int i) + { + try + { + AppearanceVersion = (byte)bytes[i++]; + CofVersion = (int)(bytes[i++] + (bytes[i++] << 8) + (bytes[i++] << 16) + (bytes[i++] << 24)); + Flags = (uint)(bytes[i++] + (bytes[i++] << 8) + (bytes[i++] << 16) + (bytes[i++] << 24)); + } + catch (Exception) + { + throw new MalformedDataException(); + } + } + + public override void ToBytes(byte[] bytes, ref int i) + { + bytes[i++] = AppearanceVersion; + Utils.IntToBytes(CofVersion, bytes, i); i += 4; + Utils.UIntToBytes(Flags, bytes, i); i += 4; + } + + } + public override int Length { get { - int length = 11; + int length = 12; length += Sender.Length; length += ObjectData.Length; for (int j = 0; j < VisualParam.Length; j++) length += VisualParam[j].Length; + for (int j = 0; j < AppearanceData.Length; j++) + length += AppearanceData[j].Length; return length; } } public SenderBlock Sender; public ObjectDataBlock ObjectData; public VisualParamBlock[] VisualParam; + public AppearanceDataBlock[] AppearanceData; public AvatarAppearancePacket() { @@ -26908,6 +27375,7 @@ namespace OpenMetaverse.Packets Sender = new SenderBlock(); ObjectData = new ObjectDataBlock(); VisualParam = null; + AppearanceData = null; } public AvatarAppearancePacket(byte[] bytes, ref int i) : this() @@ -26934,6 +27402,14 @@ namespace OpenMetaverse.Packets } for (int j = 0; j < count; j++) { VisualParam[j].FromBytes(bytes, ref i); } + count = (int)bytes[i++]; + if(AppearanceData == null || AppearanceData.Length != -1) { + AppearanceData = new AppearanceDataBlock[count]; + for(int j = 0; j < count; j++) + { AppearanceData[j] = new AppearanceDataBlock(); } + } + for (int j = 0; j < count; j++) + { AppearanceData[j].FromBytes(bytes, ref i); } } public AvatarAppearancePacket(Header head, byte[] bytes, ref int i): this() @@ -26955,6 +27431,14 @@ namespace OpenMetaverse.Packets } for (int j = 0; j < count; j++) { VisualParam[j].FromBytes(bytes, ref i); } + count = (int)bytes[i++]; + if(AppearanceData == null || AppearanceData.Length != count) { + AppearanceData = new AppearanceDataBlock[count]; + for(int j = 0; j < count; j++) + { AppearanceData[j] = new AppearanceDataBlock(); } + } + for (int j = 0; j < count; j++) + { AppearanceData[j].FromBytes(bytes, ref i); } } public override byte[] ToBytes() @@ -26964,6 +27448,8 @@ namespace OpenMetaverse.Packets length += ObjectData.Length; length++; for (int j = 0; j < VisualParam.Length; j++) { length += VisualParam[j].Length; } + length++; + for (int j = 0; j < AppearanceData.Length; j++) { length += AppearanceData[j].Length; } if (Header.AckList != null && Header.AckList.Length > 0) { length += Header.AckList.Length * 4 + 1; } byte[] bytes = new byte[length]; int i = 0; @@ -26972,6 +27458,8 @@ namespace OpenMetaverse.Packets ObjectData.ToBytes(bytes, ref i); bytes[i++] = (byte)VisualParam.Length; for (int j = 0; j < VisualParam.Length; j++) { VisualParam[j].ToBytes(bytes, ref i); } + bytes[i++] = (byte)AppearanceData.Length; + for (int j = 0; j < AppearanceData.Length; j++) { AppearanceData[j].ToBytes(bytes, ref i); } if (Header.AckList != null && Header.AckList.Length > 0) { Header.AcksToBytes(bytes, ref i); } return bytes; } @@ -26996,13 +27484,15 @@ namespace OpenMetaverse.Packets Header.ToBytes(fixedBytes, ref i); Sender.ToBytes(fixedBytes, ref i); ObjectData.ToBytes(fixedBytes, ref i); - fixedLength += 1; + fixedLength += 2; int VisualParamStart = 0; + int AppearanceDataStart = 0; do { int variableLength = 0; int VisualParamCount = 0; + int AppearanceDataCount = 0; i = VisualParamStart; while (fixedLength + variableLength + acksLength < Packet.MTU && i < VisualParam.Length) { @@ -27015,6 +27505,17 @@ namespace OpenMetaverse.Packets ++i; } + i = AppearanceDataStart; + while (fixedLength + variableLength + acksLength < Packet.MTU && i < AppearanceData.Length) { + int blockLength = AppearanceData[i].Length; + if (fixedLength + variableLength + blockLength + acksLength <= MTU) { + variableLength += blockLength; + ++AppearanceDataCount; + } + else { break; } + ++i; + } + byte[] packet = new byte[fixedLength + variableLength + acksLength]; int length = fixedBytes.Length; Buffer.BlockCopy(fixedBytes, 0, packet, 0, length); @@ -27024,6 +27525,10 @@ namespace OpenMetaverse.Packets for (i = VisualParamStart; i < VisualParamStart + VisualParamCount; i++) { VisualParam[i].ToBytes(packet, ref length); } VisualParamStart += VisualParamCount; + packet[length++] = (byte)AppearanceDataCount; + for (i = AppearanceDataStart; i < AppearanceDataStart + AppearanceDataCount; i++) { AppearanceData[i].ToBytes(packet, ref length); } + AppearanceDataStart += AppearanceDataCount; + if (acksLength > 0) { Buffer.BlockCopy(ackBytes, 0, packet, length, acksLength); acksLength = 0; @@ -27031,7 +27536,8 @@ namespace OpenMetaverse.Packets packets.Add(packet); } while ( - VisualParamStart < VisualParam.Length); + VisualParamStart < VisualParam.Length || + AppearanceDataStart < AppearanceData.Length); return packets.ToArray(); } diff --git a/data/message_template.msg b/data/message_template.msg index 2cb0a833..6702de9b 100644 --- a/data/message_template.msg +++ b/data/message_template.msg @@ -2939,6 +2939,10 @@ version 2.0 PidStat Single { PID S32 } } + { + RegionInfo Variable + { RegionFlagsExtended U64 } + } } // viewer -> sim @@ -2991,6 +2995,10 @@ version 2.0 { HardMaxAgents U32 } { HardMaxObjects U32 } } + { + RegionInfo3 Variable + { RegionFlagsExtended U64 } + } } // GodUpdateRegionInfo @@ -3016,6 +3024,10 @@ version 2.0 { RedirectGridX S32 } { RedirectGridY S32 } } + { + RegionInfo2 Variable + { RegionFlagsExtended U64 } + } } //NearestLandingRegionRequest @@ -3116,6 +3128,11 @@ version 2.0 { ProductSKU Variable 1 } // string { ProductName Variable 1 } // string } + { + RegionInfo4 Variable + { RegionFlagsExtended U64 } + { RegionProtocols U64 } + } } // RegionHandshakeReply @@ -3571,6 +3588,12 @@ version 2.0 VisualParam Variable { ParamValue U8 } } + { + AppearanceData Variable + { AppearanceVersion U8 } + { CofVersion S32 } + { Flags U32 } + } } // AvatarSitResponse - response to a request to sit on an object From 2807f66c02091d18dc1f9c60a2f5523a236fad8e Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sun, 16 Dec 2012 00:22:18 +0100 Subject: [PATCH 32/57] Removed obsolete XMPP login param. Added new param used for server side baking --- OpenMetaverse/Login.cs | 46 +++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/OpenMetaverse/Login.cs b/OpenMetaverse/Login.cs index 1b02f5b6..519ea21f 100644 --- a/OpenMetaverse/Login.cs +++ b/OpenMetaverse/Login.cs @@ -261,7 +261,7 @@ namespace OpenMetaverse public string InventoryHost; public int MaxAgentGroups; public string OpenIDUrl; - public string XMPPHost; + public string AgentAppearanceServiceURL; /// /// Parse LLSD Login Reply Data @@ -493,9 +493,9 @@ namespace OpenMetaverse OpenIDUrl = ParseString("openid_url", reply); } - if (reply.ContainsKey("xmpp_host")) + if (reply.ContainsKey("agent_appearance_service")) { - XMPPHost = ParseString("xmpp_host", reply); + AgentAppearanceServiceURL = ParseString("agent_appearance_service", reply); } } @@ -830,8 +830,8 @@ namespace OpenMetaverse public string LoginMessage { get { return InternalLoginMessage; } } /// Maximum number of groups an agent can belong to, -1 for unlimited public int MaxAgentGroups = -1; - /// XMPP server to connect to for Group chat and IM services - public string XMPPHost; + /// Server side baking service URL + public string AgentAppearanceServiceURL; #endregion #region Private Members @@ -975,22 +975,22 @@ namespace OpenMetaverse public static string StartLocation(string sim, int x, int y, int z) { return String.Format("uri:{0}&{1}&{2}&{3}", sim, x, y, z); - } - public void AbortLogin() - { - LoginParams loginParams = CurrentContext; - CurrentContext = null; // Will force any pending callbacks to bail out early - // FIXME: Now that we're using CAPS we could cancel the current login and start a new one - if (loginParams == null) - { - Logger.DebugLog("No Login was in progress: " + CurrentContext, Client); - } - else - { - InternalStatusCode = LoginStatus.Failed; - InternalLoginMessage = "Aborted"; - } - UpdateLoginStatus(LoginStatus.Failed, "Abort Requested"); + } + public void AbortLogin() + { + LoginParams loginParams = CurrentContext; + CurrentContext = null; // Will force any pending callbacks to bail out early + // FIXME: Now that we're using CAPS we could cancel the current login and start a new one + if (loginParams == null) + { + Logger.DebugLog("No Login was in progress: " + CurrentContext, Client); + } + else + { + InternalStatusCode = LoginStatus.Failed; + InternalLoginMessage = "Aborted"; + } + UpdateLoginStatus(LoginStatus.Failed, "Abort Requested"); } #endregion @@ -1148,7 +1148,7 @@ namespace OpenMetaverse { ArrayList loginArray = new ArrayList(1); loginArray.Add(loginXmlRpc); - XmlRpcRequest request = new XmlRpcRequest(CurrentContext.MethodName, loginArray); + XmlRpcRequest request = new XmlRpcRequest(CurrentContext.MethodName, loginArray); var cc = CurrentContext; // Start the request Thread requestThread = new Thread( @@ -1289,7 +1289,7 @@ namespace OpenMetaverse // Misc: MaxAgentGroups = reply.MaxAgentGroups; - XMPPHost = reply.XMPPHost; + AgentAppearanceServiceURL = reply.AgentAppearanceServiceURL; //uint timestamp = (uint)reply.seconds_since_epoch; //DateTime time = Helpers.UnixTimeToDateTime(timestamp); // TODO: Do something with this? From cf953b201a7c3040ed2532f908e0518eba0594a9 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sun, 16 Dec 2012 01:15:14 +0100 Subject: [PATCH 33/57] Process additional information in AvatarAppearance message --- OpenMetaverse/AppearanceManager.cs | 10 ++++++++++ OpenMetaverse/Avatar.cs | 15 ++++++++++++++ OpenMetaverse/AvatarManager.cs | 32 ++++++++++++++++++++++++++++-- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/OpenMetaverse/AppearanceManager.cs b/OpenMetaverse/AppearanceManager.cs index 20382f1d..bcbe775f 100644 --- a/OpenMetaverse/AppearanceManager.cs +++ b/OpenMetaverse/AppearanceManager.cs @@ -89,6 +89,16 @@ namespace OpenMetaverse Hair = 5 } + /// + /// Appearance Flags, introdued with server side baking, currently unused + /// + [Flags] + public enum AppearanceFlags : uint + { + None = 0 + } + + #endregion Enums public class AppearanceManager diff --git a/OpenMetaverse/Avatar.cs b/OpenMetaverse/Avatar.cs index bed6eca7..59ee368c 100644 --- a/OpenMetaverse/Avatar.cs +++ b/OpenMetaverse/Avatar.cs @@ -308,6 +308,21 @@ namespace OpenMetaverse /// public byte[] VisualParameters = null; + /// + /// Appearance version. Value greater than 0 indicates using server side baking + /// + public byte AppearanceVersion = 0; + + /// + /// Version of the Current Outfit Folder that the appearance is based on + /// + public int COFVersion = 0; + + /// + /// Appearance flags. Introduced with server side baking, currently unused. + /// + public AppearanceFlags AppearanceFlags = AppearanceFlags.None; + #endregion Public Members protected string name; diff --git a/OpenMetaverse/AvatarManager.cs b/OpenMetaverse/AvatarManager.cs index 65eb72b0..d874e9bc 100644 --- a/OpenMetaverse/AvatarManager.cs +++ b/OpenMetaverse/AvatarManager.cs @@ -920,15 +920,29 @@ namespace OpenMetaverse Primitive.TextureEntryFace defaultTexture = textureEntry.DefaultTexture; Primitive.TextureEntryFace[] faceTextures = textureEntry.FaceTextures; + byte appearanceVersion = 0; + int COFVersion = 0; + AppearanceFlags appearanceFlags = 0; + + if (appearance.AppearanceData != null && appearance.AppearanceData.Length > 0) + { + appearanceVersion = appearance.AppearanceData[0].AppearanceVersion; + COFVersion = appearance.AppearanceData[0].CofVersion; + appearanceFlags = (AppearanceFlags)appearance.AppearanceData[0].Flags; + } + Avatar av = simulator.ObjectsAvatars.Find((Avatar a) => { return a.ID == appearance.Sender.ID; }); if (av != null) { av.Textures = textureEntry; av.VisualParameters = visualParams.ToArray(); + av.AppearanceVersion = appearanceVersion; + av.COFVersion = COFVersion; + av.AppearanceFlags = appearanceFlags; } OnAvatarAppearance(new AvatarAppearanceEventArgs(simulator, appearance.Sender.ID, appearance.Sender.IsTrial, - defaultTexture, faceTextures, visualParams)); + defaultTexture, faceTextures, visualParams, appearanceVersion, COFVersion, appearanceFlags)); } } @@ -1391,6 +1405,9 @@ namespace OpenMetaverse private readonly Primitive.TextureEntryFace m_DefaultTexture; private readonly Primitive.TextureEntryFace[] m_FaceTextures; private readonly List m_VisualParams; + private readonly byte m_AppearanceVersion; + private readonly int m_COFVersion; + private readonly AppearanceFlags m_AppearanceFlags; /// Get the Simulator this request is from of the agent public Simulator Simulator { get { return m_Simulator; } } @@ -1404,6 +1421,13 @@ namespace OpenMetaverse public Primitive.TextureEntryFace[] FaceTextures { get { return m_FaceTextures; } } /// Get the for the agent public List VisualParams { get { return m_VisualParams; } } + /// Version of the appearance system used. + /// Value greater than 0 indicates that server side baking is used + public byte AppearanceVersion { get { return m_AppearanceVersion; } } + /// Version of the Current Outfit Folder the appearance is based on + public int COFVersion { get { return m_COFVersion; } } + /// Appearance flags, introduced with server side baking, currently unused + public AppearanceFlags AppearanceFlags { get { return m_AppearanceFlags; } } /// /// Construct a new instance of the AvatarAppearanceEventArgs class @@ -1415,7 +1439,8 @@ namespace OpenMetaverse /// The agents appearance layer textures /// The for the agent public AvatarAppearanceEventArgs(Simulator sim, UUID avatarID, bool isTrial, Primitive.TextureEntryFace defaultTexture, - Primitive.TextureEntryFace[] faceTextures, List visualParams) + Primitive.TextureEntryFace[] faceTextures, List visualParams, + byte appearanceVersion, int COFVersion, AppearanceFlags appearanceFlags) { this.m_Simulator = sim; this.m_AvatarID = avatarID; @@ -1423,6 +1448,9 @@ namespace OpenMetaverse this.m_DefaultTexture = defaultTexture; this.m_FaceTextures = faceTextures; this.m_VisualParams = visualParams; + this.m_AppearanceVersion = appearanceVersion; + this.m_COFVersion = COFVersion; + this.m_AppearanceFlags = appearanceFlags; } } From d1080a24d9c23c46a04d7fecbab9539fc2fda54c Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sun, 16 Dec 2012 01:34:26 +0100 Subject: [PATCH 34/57] Added support for new fields in the RegionHandshake packet --- OpenMetaverse/NetworkManager.cs | 7 +++++++ OpenMetaverse/Simulator.cs | 18 +++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/OpenMetaverse/NetworkManager.cs b/OpenMetaverse/NetworkManager.cs index b0ef4cd7..c507250f 100644 --- a/OpenMetaverse/NetworkManager.cs +++ b/OpenMetaverse/NetworkManager.cs @@ -1157,6 +1157,13 @@ namespace OpenMetaverse simulator.ProductName = Utils.BytesToString(handshake.RegionInfo3.ProductName); simulator.ProductSku = Utils.BytesToString(handshake.RegionInfo3.ProductSKU); + if (handshake.RegionInfo4 != null && handshake.RegionInfo4.Length > 0) + { + simulator.Protocols = (RegionProtocols)handshake.RegionInfo4[0].RegionProtocols; + // Yes, overwrite region flags if we have extended version of them + simulator.Flags = (RegionFlags)handshake.RegionInfo4[0].RegionFlagsExtended; + } + // Send a RegionHandshakeReply RegionHandshakeReplyPacket reply = new RegionHandshakeReplyPacket(); reply.AgentData.AgentID = Client.Self.AgentID; diff --git a/OpenMetaverse/Simulator.cs b/OpenMetaverse/Simulator.cs index 157e61d8..fb431af6 100644 --- a/OpenMetaverse/Simulator.cs +++ b/OpenMetaverse/Simulator.cs @@ -39,7 +39,7 @@ namespace OpenMetaverse /// Simulator (region) properties /// [Flags] - public enum RegionFlags + public enum RegionFlags : ulong { /// No flags set None = 0, @@ -109,6 +109,16 @@ namespace OpenMetaverse } + /// + /// Region protocol flags + /// + [Flags] + public enum RegionProtocols : ulong + { + None = 0, + AgentAppearanceService = 1 << 0 + } + /// /// Access level for a simulator /// @@ -345,6 +355,12 @@ namespace OpenMetaverse /// public string ProductSku; + /// + /// Flags indicating which protocols this region supports + /// + public RegionProtocols Protocols; + + /// The current sequence number for packets sent to this /// simulator. Must be Interlocked before modifying. Only /// useful for applications manipulating sequence numbers From a8232385ff99ac2d9310e0efacd8b109e3f29a97 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sun, 16 Dec 2012 01:51:36 +0100 Subject: [PATCH 35/57] Request URL for the capability to initiate server side baking --- OpenMetaverse/Caps.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenMetaverse/Caps.cs b/OpenMetaverse/Caps.cs index 2a888090..2242db9e 100644 --- a/OpenMetaverse/Caps.cs +++ b/OpenMetaverse/Caps.cs @@ -184,6 +184,7 @@ namespace OpenMetaverse req.Add("UntrustedSimulatorMessage"); req.Add("UpdateAgentInformation"); req.Add("UpdateAgentLanguage"); + req.Add("UpdateAvatarAppearance"); req.Add("UpdateGestureAgentInventory"); req.Add("UpdateGestureTaskInventory"); req.Add("UpdateNotecardAgentInventory"); From 496d233034e0f820e4bf77a9e90053110965f919 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sun, 16 Dec 2012 04:33:30 +0100 Subject: [PATCH 36/57] Use server side baking where supported. This requires Current Outfit Folder to be maintained which is not yet supported by the library, but it allows the appearance to be set correctly if outfit was set in a COF compliant viewer on previous login --- OpenMetaverse/AppearanceManager.cs | 147 ++++++++++++++++++++++++----- 1 file changed, 123 insertions(+), 24 deletions(-) diff --git a/OpenMetaverse/AppearanceManager.cs b/OpenMetaverse/AppearanceManager.cs index bcbe775f..8d7e31f4 100644 --- a/OpenMetaverse/AppearanceManager.cs +++ b/OpenMetaverse/AppearanceManager.cs @@ -32,6 +32,8 @@ using OpenMetaverse; using OpenMetaverse.Packets; using OpenMetaverse.Imaging; using OpenMetaverse.Assets; +using OpenMetaverse.Http; +using OpenMetaverse.StructuredData; namespace OpenMetaverse { @@ -378,6 +380,10 @@ namespace OpenMetaverse /// Main appearance thread /// private Thread AppearanceThread; + /// + /// Is server baking complete. It needs doing only once + /// + private bool ServerBakingDone = false; #endregion Private Members /// @@ -469,36 +475,54 @@ namespace OpenMetaverse } } - // Download and parse all of the agent wearables - if (!DownloadWearables()) + // Is this server side baking enabled sim + if ((Client.Network.CurrentSim.Protocols & RegionProtocols.AgentAppearanceService) != 0) { - success = false; - Logger.Log("One or more agent wearables failed to download, appearance will be incomplete", - Helpers.LogLevel.Warning, Client); - } - - // If this is the first time setting appearance and we're not forcing rebakes, check the server - // for cached bakes - if (SetAppearanceSerialNum == 0 && !forceRebake) - { - // Compute hashes for each bake layer and compare against what the simulator currently has - if (!GetCachedBakes()) + if (!ServerBakingDone || forceRebake) { - Logger.Log("Failed to get a list of cached bakes from the simulator, appearance will be rebaked", - Helpers.LogLevel.Warning, Client); + if (UpdateAvatarAppearance()) + { + ServerBakingDone = true; + } + else + { + success = false; + } } } - - // Download textures, compute bakes, and upload for any cache misses - if (!CreateBakes()) + else // Classic client side baking { - success = false; - Logger.Log("Failed to create or upload one or more bakes, appearance will be incomplete", - Helpers.LogLevel.Warning, Client); - } + // Download and parse all of the agent wearables + if (!DownloadWearables()) + { + success = false; + Logger.Log("One or more agent wearables failed to download, appearance will be incomplete", + Helpers.LogLevel.Warning, Client); + } - // Send the appearance packet - RequestAgentSetAppearance(); + // If this is the first time setting appearance and we're not forcing rebakes, check the server + // for cached bakes + if (SetAppearanceSerialNum == 0 && !forceRebake) + { + // Compute hashes for each bake layer and compare against what the simulator currently has + if (!GetCachedBakes()) + { + Logger.Log("Failed to get a list of cached bakes from the simulator, appearance will be rebaked", + Helpers.LogLevel.Warning, Client); + } + } + + // Download textures, compute bakes, and upload for any cache misses + if (!CreateBakes()) + { + success = false; + Logger.Log("Failed to create or upload one or more bakes, appearance will be incomplete", + Helpers.LogLevel.Warning, Client); + } + + // Send the appearance packet + RequestAgentSetAppearance(); + } } catch (Exception) { @@ -1706,6 +1730,81 @@ namespace OpenMetaverse return paramValues; } + /// + /// Initate server baking process + /// + /// True if the server baking was successful + private bool UpdateAvatarAppearance() + { + Caps caps = Client.Network.CurrentSim.Caps; + if (caps == null) + { + return false; + } + + Uri url = caps.CapabilityURI("UpdateAvatarAppearance"); + if (url == null) + { + return false; + } + + InventoryFolder COF = GetCOF(); + if (COF == null) + { + return false; + } + else + { + // TODO: create Current Outfit Folder + } + + + CapsClient capsRequest = new CapsClient(url); + OSDMap request = new OSDMap(1); + request["cof_version"] = COF.Version; + + string msg = "Setting server side baking failed"; + + OSD res = capsRequest.GetResponse(request, OSDFormat.Xml, Client.Settings.CAPS_TIMEOUT * 2); + if (res != null && res is OSDMap) + { + OSDMap result = (OSDMap)res; + if (result["success"]) + { + // TODO: Set local visual params and baked textures based on the result here + return true; + } + else + { + if (result.ContainsKey("error")) + { + msg += ": " + result["error"].AsString(); + } + } + } + + Logger.Log(msg, Helpers.LogLevel.Error, Client); + + return false; + } + + private InventoryFolder GetCOF() + { + InventoryFolder COF = null; + + List rootContent = Client.Inventory.Store.GetContents(Client.Inventory.Store.RootFolder.UUID); + foreach (InventoryBase baseItem in rootContent) + { + if (baseItem is InventoryFolder && ((InventoryFolder)baseItem).PreferredType == AssetType.CurrentOutfitFolder) + { + COF = (InventoryFolder)baseItem; + break; + } + } + + return COF; + } + /// /// Create an AgentSetAppearance packet from Wearables data and the /// Textures array and send it From 9186f946546dede459fd8452762529b2bfa75040 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sun, 16 Dec 2012 19:21:23 +0100 Subject: [PATCH 37/57] Fetch fresh version of COF during appearance setting. Added setting whether to use caps for some inventory operations. TODO: Add support for FetchInventory2 capability --- OpenMetaverse/AppearanceManager.cs | 26 +++++++++++++++++++------- OpenMetaverse/InventoryManager.cs | 8 ++++++++ OpenMetaverse/Settings.cs | 4 ++++ 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/OpenMetaverse/AppearanceManager.cs b/OpenMetaverse/AppearanceManager.cs index 8d7e31f4..6734ee38 100644 --- a/OpenMetaverse/AppearanceManager.cs +++ b/OpenMetaverse/AppearanceManager.cs @@ -366,6 +366,8 @@ namespace OpenMetaverse private int CacheCheckSerialNum = -1; /// Incrementing serial number for AgentSetAppearance packets private int SetAppearanceSerialNum = 0; + /// Indicates if WearablesRequest succeeded + private bool GotWearables = false; /// Indicates whether or not the appearance thread is currently /// running, to prevent multiple appearance threads from running /// simultaneously @@ -464,7 +466,7 @@ namespace OpenMetaverse Textures[(int)BakeTypeToAgentTextureIndex((BakeType)bakedIndex)].TextureID = UUID.Zero; } - if (SetAppearanceSerialNum == 0) + if (!GotWearables) { // Fetch a list of the current agent wearables if (!GetAgentWearables()) @@ -473,6 +475,7 @@ namespace OpenMetaverse Helpers.LogLevel.Error, Client); throw new Exception("Failed to retrieve a list of current agent wearables, appearance cannot be set"); } + GotWearables = true; } // Is this server side baking enabled sim @@ -1757,7 +1760,6 @@ namespace OpenMetaverse { // TODO: create Current Outfit Folder } - CapsClient capsRequest = new CapsClient(url); OSDMap request = new OSDMap(1); @@ -1766,11 +1768,13 @@ namespace OpenMetaverse string msg = "Setting server side baking failed"; OSD res = capsRequest.GetResponse(request, OSDFormat.Xml, Client.Settings.CAPS_TIMEOUT * 2); + if (res != null && res is OSDMap) { OSDMap result = (OSDMap)res; if (result["success"]) { + Logger.Log("Successfully set appearance", Helpers.LogLevel.Info, Client); // TODO: Set local visual params and baked textures based on the result here return true; } @@ -1788,17 +1792,25 @@ namespace OpenMetaverse return false; } + /// + /// Get the latest version of COF + /// + /// Current Outfit Folder (or null if getting the data failed) private InventoryFolder GetCOF() { InventoryFolder COF = null; - List rootContent = Client.Inventory.Store.GetContents(Client.Inventory.Store.RootFolder.UUID); - foreach (InventoryBase baseItem in rootContent) + // COF should be in the root folder. Request update to get the latest versio number + List root = Client.Inventory.FolderContents(Client.Inventory.Store.RootFolder.UUID, Client.Self.AgentID, true, true, InventorySortOrder.ByDate, Client.Settings.CAPS_TIMEOUT); + if (root != null) { - if (baseItem is InventoryFolder && ((InventoryFolder)baseItem).PreferredType == AssetType.CurrentOutfitFolder) + foreach (InventoryBase baseItem in root) { - COF = (InventoryFolder)baseItem; - break; + if (baseItem is InventoryFolder && ((InventoryFolder)baseItem).PreferredType == AssetType.CurrentOutfitFolder) + { + COF = (InventoryFolder)baseItem; + break; + } } } diff --git a/OpenMetaverse/InventoryManager.cs b/OpenMetaverse/InventoryManager.cs index 08e93404..b752cf20 100644 --- a/OpenMetaverse/InventoryManager.cs +++ b/OpenMetaverse/InventoryManager.cs @@ -1359,6 +1359,14 @@ namespace OpenMetaverse public void RequestFolderContents(UUID folder, UUID owner, bool folders, bool items, InventorySortOrder order) { + if (Client.Settings.HTTP_INVENTORY && + Client.Network.CurrentSim.Caps != null && + Client.Network.CurrentSim.Caps.CapabilityURI("FetchInventoryDescendents2") != null) + { + RequestFolderContentsCap(folder, owner, folders, items, order); + return; + } + FetchInventoryDescendentsPacket fetch = new FetchInventoryDescendentsPacket(); fetch.AgentData.AgentID = Client.Self.AgentID; fetch.AgentData.SessionID = Client.Self.SessionID; diff --git a/OpenMetaverse/Settings.cs b/OpenMetaverse/Settings.cs index 8eeabf25..24d4c8f1 100644 --- a/OpenMetaverse/Settings.cs +++ b/OpenMetaverse/Settings.cs @@ -70,6 +70,10 @@ namespace OpenMetaverse /// GridClient initializes an Inventory store for the library. /// public const bool ENABLE_LIBRARY_STORE = true; + /// + /// Use Caps for fetching inventory where available + /// + public bool HTTP_INVENTORY = true; #endregion #region Timeouts and Intervals From 6d711e88dc172629289f0cf744c6d9088db8cebf Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Tue, 18 Dec 2012 02:31:40 +0100 Subject: [PATCH 38/57] * Added OSD serialization/Deserialization for InventoryItem * Implemented FetchInventory2 capability --- OpenMetaverse/InventoryManager.cs | 187 +++++++++++++++++++++++------- 1 file changed, 143 insertions(+), 44 deletions(-) diff --git a/OpenMetaverse/InventoryManager.cs b/OpenMetaverse/InventoryManager.cs index b752cf20..2ca74764 100644 --- a/OpenMetaverse/InventoryManager.cs +++ b/OpenMetaverse/InventoryManager.cs @@ -369,6 +369,77 @@ namespace OpenMetaverse && o.SaleType == SaleType && o.LastOwnerID == LastOwnerID; } + + /// + /// Create InventoryItem from OSD + /// + /// OSD Data that makes up InventoryItem + /// Inventory item created + public static InventoryItem FromOSD(OSD data) + { + OSDMap descItem = (OSDMap)data; + + InventoryType type = (InventoryType)descItem["inv_type"].AsInteger(); + if (type == InventoryType.Texture && (AssetType)descItem["type"].AsInteger() == AssetType.Object) + { + type = InventoryType.Attachment; + } + InventoryItem item = InventoryManager.CreateInventoryItem(type, descItem["item_id"]); + + item.ParentUUID = descItem["parent_id"]; + item.Name = descItem["name"]; + item.Description = descItem["desc"]; + item.OwnerID = descItem["agent_id"]; + item.AssetUUID = descItem["asset_id"]; + item.AssetType = (AssetType)descItem["type"].AsInteger(); + item.CreationDate = Utils.UnixTimeToDateTime(descItem["created_at"]); + item.Flags = descItem["flags"]; + + OSDMap perms = (OSDMap)descItem["permissions"]; + item.CreatorID = perms["creator_id"]; + item.LastOwnerID = perms["last_owner_id"]; + item.Permissions = new Permissions(perms["base_mask"], perms["everyone_mask"], perms["group_mask"], perms["next_owner_mask"], perms["owner_mask"]); + item.GroupOwned = perms["is_owner_group"]; + item.GroupID = perms["group_id"]; + + OSDMap sale = (OSDMap)descItem["sale_info"]; + item.SalePrice = sale["sale_price"]; + item.SaleType = (SaleType)sale["sale_type"].AsInteger(); + + return item; + } + + /// + /// Convert InventoryItem to OSD + /// + /// OSD representation of InventoryItem + public OSD GetOSD() + { + OSDMap map = new OSDMap(); + map["inv_type"] = (int)InventoryType; + map["parent_id"] = ParentUUID; + map["name"] = Name; + map["desc"] = Description; + map["agent_id"] = OwnerID; + map["asset_id"] = AssetUUID; + map["type"] = (int)AssetType; + map["created_at"] = CreationDate; + map["flags"] = Flags; + + OSDMap perms = (OSDMap)Permissions.GetOSD(); + perms["creator_id"] = CreatorID; + perms["last_owner_id"] = LastOwnerID; + perms["is_owner_group"] = GroupOwned; + perms["group_id"] = GroupID; + map["permissions"] = perms; + + OSDMap sale = new OSDMap(); + sale["sale_price"] = SalePrice; + sale["sale_type"] = (int)SaleType; + map["sale_info"] = sale; + + return map; + } } /// @@ -1258,17 +1329,7 @@ namespace OpenMetaverse /// public void RequestFetchInventory(UUID itemID, UUID ownerID) { - FetchInventoryPacket fetch = new FetchInventoryPacket(); - fetch.AgentData = new FetchInventoryPacket.AgentDataBlock(); - fetch.AgentData.AgentID = Client.Self.AgentID; - fetch.AgentData.SessionID = Client.Self.SessionID; - - fetch.InventoryData = new FetchInventoryPacket.InventoryDataBlock[1]; - fetch.InventoryData[0] = new FetchInventoryPacket.InventoryDataBlock(); - fetch.InventoryData[0].ItemID = itemID; - fetch.InventoryData[0].OwnerID = ownerID; - - Client.Network.SendPacket(fetch); + RequestFetchInventory(new List(1) { itemID }, new List(1) { ownerID }); } /// @@ -1282,6 +1343,15 @@ namespace OpenMetaverse if (itemIDs.Count != ownerIDs.Count) throw new ArgumentException("itemIDs and ownerIDs must contain the same number of entries"); + if (Client.Settings.HTTP_INVENTORY && + Client.Network.CurrentSim.Caps != null && + Client.Network.CurrentSim.Caps.CapabilityURI("FetchInventory2") != null) + { + RequestFetchInventoryCap(itemIDs, ownerIDs); + return; + } + + FetchInventoryPacket fetch = new FetchInventoryPacket(); fetch.AgentData = new FetchInventoryPacket.AgentDataBlock(); fetch.AgentData.AgentID = Client.Self.AgentID; @@ -1298,6 +1368,65 @@ namespace OpenMetaverse Client.Network.SendPacket(fetch); } + /// + /// Request inventory items via Capabilities + /// + /// Inventory items to request + /// Owners of the inventory items + /// + private void RequestFetchInventoryCap(List itemIDs, List ownerIDs) + { + if (itemIDs.Count != ownerIDs.Count) + throw new ArgumentException("itemIDs and ownerIDs must contain the same number of entries"); + + if (Client.Settings.HTTP_INVENTORY && + Client.Network.CurrentSim.Caps != null && + Client.Network.CurrentSim.Caps.CapabilityURI("FetchInventory2") != null) + { + Uri url = Client.Network.CurrentSim.Caps.CapabilityURI("FetchInventory2"); + CapsClient request = new CapsClient(url); + + request.OnComplete += (client, result, error) => + { + if (error == null) + { + try + { + OSDMap res = (OSDMap)result; + OSDArray itemsOSD = (OSDArray)res["items"]; + + for (int i = 0; i < itemsOSD.Count; i++) + { + InventoryItem item = InventoryItem.FromOSD(itemsOSD[i]); + _Store[item.UUID] = item; + OnItemReceived(new ItemReceivedEventArgs(item)); + } + } + catch (Exception ex) + { + Logger.Log("Failed getting data from FetchInventory2 capability.", Helpers.LogLevel.Error, Client, ex); + } + } + }; + + OSDMap OSDRequest = new OSDMap(); + OSDRequest["agent_id"] = Client.Self.AgentID; + + OSDArray items = new OSDArray(itemIDs.Count); + for (int i = 0; i < itemIDs.Count; i++) + { + OSDMap item = new OSDMap(2); + item["item_id"] = itemIDs[i]; + item["owner_id"] = ownerIDs[i]; + items.Add(item); + } + + OSDRequest["items"] = items; + + request.BeginGetResponse(OSDRequest, OSDFormat.Xml, Client.Settings.CAPS_TIMEOUT); + } + } + /// /// Get contents of a folder /// @@ -1465,35 +1594,8 @@ namespace OpenMetaverse OSDArray items = (OSDArray)res["items"]; for (int i = 0; i < items.Count; i++) { - OSDMap descItem = (OSDMap)items[i]; - InventoryType type = (InventoryType)descItem["inv_type"].AsInteger(); - if (type == InventoryType.Texture && (AssetType)descItem["type"].AsInteger() == AssetType.Object) - { - type = InventoryType.Attachment; - } - InventoryItem item = CreateInventoryItem(type, descItem["item_id"]); - - item.ParentUUID = descItem["parent_id"]; - item.Name = descItem["name"]; - item.Description = descItem["desc"]; - item.OwnerID = descItem["agent_id"]; - item.AssetUUID = descItem["asset_id"]; - item.AssetType = (AssetType)descItem["type"].AsInteger(); - item.CreationDate = Utils.UnixTimeToDateTime(descItem["created_at"]); - item.Flags = descItem["flags"]; - - OSDMap perms = (OSDMap)descItem["permissions"]; - item.CreatorID = perms["creator_id"]; - item.LastOwnerID = perms["last_owner_id"]; - item.Permissions = new Permissions(perms["base_mask"], perms["everyone_mask"], perms["group_mask"], perms["next_owner_mask"], perms["owner_mask"]); - item.GroupOwned = perms["is_owner_group"]; - item.GroupID = perms["group_id"]; - - OSDMap sale = (OSDMap)descItem["sale_info"]; - item.SalePrice = sale["sale_price"]; - item.SaleType = (SaleType)sale["sale_type"].AsInteger(); - - _Store[item.UUID] = item; + InventoryItem item = InventoryItem.FromOSD(items[i]); + _Store[item.UUID] = item; } } } @@ -4622,10 +4724,7 @@ namespace OpenMetaverse _Store[item.UUID] = item; // Fire the callback for an item being fetched - if (m_ItemReceived != null) - { - OnItemReceived(new ItemReceivedEventArgs(item)); - } + OnItemReceived(new ItemReceivedEventArgs(item)); } } From 6fe0fd267b975573185032505de20797e987bc8f Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Tue, 18 Dec 2012 04:35:49 +0100 Subject: [PATCH 39/57] Added OSD serialization to InventoryFolder --- OpenMetaverse/InventoryManager.cs | 47 ++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/OpenMetaverse/InventoryManager.cs b/OpenMetaverse/InventoryManager.cs index 2ca74764..a88c3b6f 100644 --- a/OpenMetaverse/InventoryManager.cs +++ b/OpenMetaverse/InventoryManager.cs @@ -203,6 +203,12 @@ namespace OpenMetaverse && o.Name == Name && o.OwnerID == OwnerID; } + + /// + /// Convert inventory to OSD + /// + /// OSD representation + public abstract OSD GetOSD(); } /// @@ -390,6 +396,7 @@ namespace OpenMetaverse item.Name = descItem["name"]; item.Description = descItem["desc"]; item.OwnerID = descItem["agent_id"]; + item.ParentUUID = descItem["parent_id"]; item.AssetUUID = descItem["asset_id"]; item.AssetType = (AssetType)descItem["type"].AsInteger(); item.CreationDate = Utils.UnixTimeToDateTime(descItem["created_at"]); @@ -413,7 +420,7 @@ namespace OpenMetaverse /// Convert InventoryItem to OSD /// /// OSD representation of InventoryItem - public OSD GetOSD() + public override OSD GetOSD() { OSDMap map = new OSDMap(); map["inv_type"] = (int)InventoryType; @@ -421,6 +428,7 @@ namespace OpenMetaverse map["name"] = Name; map["desc"] = Description; map["agent_id"] = OwnerID; + map["parent_id"] = ParentUUID; map["asset_id"] = AssetUUID; map["type"] = (int)AssetType; map["created_at"] = CreationDate; @@ -943,6 +951,43 @@ namespace OpenMetaverse && o.PreferredType == PreferredType && o.Version == Version; } + + /// + /// Create InventoryFolder from OSD + /// + /// OSD Data that makes up InventoryFolder + /// Inventory folder created + public static InventoryFolder FromOSD(OSD data) + { + OSDMap res = (OSDMap)data; + UUID folderID = res.ContainsKey("category_id") ? res["category_id"] : res["folder_id"]; + InventoryFolder folder = new InventoryFolder(folderID); + folder.Name = res["name"]; + folder.DescendentCount = res["descendents"]; + folder.Version = res["version"]; + folder.OwnerID = res.ContainsKey("agent_id") ? res["agent_id"] : res["owner_id"]; + folder.ParentUUID = res["parent_id"]; + folder.PreferredType = (AssetType)(int)res["type_default"]; + return folder; + } + + /// + /// Convert InventoryItem to OSD + /// + /// OSD representation of InventoryItem + public override OSD GetOSD() + { + OSDMap res = new OSDMap(4); + res["name"] = Name; + res["type_default"] = (int)PreferredType; + res["folder_id"] = UUID; + res["descendents"] = DescendentCount; + res["version"] = Version; + res["owner_id"] = OwnerID; + res["parent_id"] = ParentUUID; + return res; + } + } #endregion Inventory Object Classes From 9447076f198b1c67cc0cfcb519188810baf44205 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Fri, 21 Dec 2012 01:49:36 +0100 Subject: [PATCH 40/57] Store what inventory item we requested to create, to workaround bug in Linden service that returns broken info --- OpenMetaverse/AppearanceManager.cs | 3 +++ OpenMetaverse/InventoryManager.cs | 14 +++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/OpenMetaverse/AppearanceManager.cs b/OpenMetaverse/AppearanceManager.cs index 6734ee38..d98a3f60 100644 --- a/OpenMetaverse/AppearanceManager.cs +++ b/OpenMetaverse/AppearanceManager.cs @@ -495,6 +495,9 @@ namespace OpenMetaverse } else // Classic client side baking { + // If we get back to server side backing region re-request server bake + ServerBakingDone = false; + // Download and parse all of the agent wearables if (!DownloadWearables()) { diff --git a/OpenMetaverse/InventoryManager.cs b/OpenMetaverse/InventoryManager.cs index a88c3b6f..cad349da 100644 --- a/OpenMetaverse/InventoryManager.cs +++ b/OpenMetaverse/InventoryManager.cs @@ -1291,6 +1291,7 @@ namespace OpenMetaverse private uint _CallbackPos; private Dictionary _ItemCreatedCallbacks = new Dictionary(); private Dictionary _ItemCopiedCallbacks = new Dictionary(); + private Dictionary _ItemInventoryTypeRequest = new Dictionary(); private List _Searches = new List(); #region Properties @@ -2466,6 +2467,10 @@ namespace OpenMetaverse create.AgentData.SessionID = Client.Self.SessionID; create.InventoryBlock.CallbackID = RegisterItemCreatedCallback(callback); + lock (_ItemInventoryTypeRequest) + { + _ItemInventoryTypeRequest[create.InventoryBlock.CallbackID] = invType; + } create.InventoryBlock.FolderID = folderID; create.InventoryBlock.TransactionID = transactionID; create.InventoryBlock.OldItemID = itemID; @@ -4591,8 +4596,15 @@ namespace OpenMetaverse foreach (BulkUpdateInventoryMessage.ItemDataInfo newItem in msg.ItemData) { if (newItem.ItemID == UUID.Zero) continue; + InventoryType invType = newItem.InvType; - InventoryItem item = SafeCreateInventoryItem(newItem.InvType, newItem.ItemID); + InventoryType storedType = 0; + if (_ItemInventoryTypeRequest.TryGetValue(newItem.CallbackID, out storedType)) + { + _ItemInventoryTypeRequest.Remove(newItem.CallbackID); + invType = storedType; + } + InventoryItem item = SafeCreateInventoryItem(invType, newItem.ItemID); item.AssetType = newItem.Type; item.AssetUUID = newItem.AssetID; From 3586f59aee34f7135d72fb61031af68ae1490f2b Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Mon, 24 Dec 2012 05:38:48 +0100 Subject: [PATCH 41/57] Added metod for downloading server side bakes --- OpenMetaverse/AssetManager.cs | 91 +++++++++++++++++++++++++++++++++-- 1 file changed, 87 insertions(+), 4 deletions(-) diff --git a/OpenMetaverse/AssetManager.cs b/OpenMetaverse/AssetManager.cs index 9a30d502..6272cae1 100644 --- a/OpenMetaverse/AssetManager.cs +++ b/OpenMetaverse/AssetManager.cs @@ -111,14 +111,16 @@ namespace OpenMetaverse } /// - /// + /// When requesting image download, type of the image requested /// public enum ImageType : byte { - /// + /// Normal in-world object texture Normal = 0, - /// - Baked = 1 + /// Avatar texture + Baked = 1, + /// Server baked avatar texture + ServerBaked = 1 } /// @@ -1133,6 +1135,87 @@ namespace OpenMetaverse } } + /// + /// Fetach avatar texture on a grid capable of server side baking + /// + /// ID of the avatar + /// ID of the texture + /// Name of the part of the avatar texture applies to + /// Callback invoked on operation completion + public void RequestServerBakedImage(UUID avatarID, UUID textureID, string bakeName, TextureDownloadCallback callback) + { + if (avatarID == UUID.Zero || textureID == UUID.Zero || callback == null) + return; + + if (string.IsNullOrEmpty(Client.Network.AgentAppearanceServiceURL)) + { + callback(TextureRequestState.NotFound, null); + return; + } + + byte[] assetData; + // Do we have this image in the cache? + if (Client.Assets.Cache.HasAsset(textureID) + && (assetData = Client.Assets.Cache.GetCachedAssetBytes(textureID)) != null) + { + ImageDownload image = new ImageDownload(); + image.ID = textureID; + image.AssetData = assetData; + image.Size = image.AssetData.Length; + image.Transferred = image.AssetData.Length; + image.ImageType = ImageType.ServerBaked; + image.AssetType = AssetType.Texture; + image.Success = true; + + callback(TextureRequestState.Finished, new AssetTexture(image.ID, image.AssetData)); + FireImageProgressEvent(image.ID, image.Transferred, image.Size); + return; + } + + CapsBase.DownloadProgressEventHandler progressHandler = null; + + Uri url = new Uri(string.Format("{0}texture/{1}/{2}/{3}", Client.Network.AgentAppearanceServiceURL, avatarID, bakeName, textureID)); + + DownloadRequest req = new DownloadRequest( + url, + Client.Settings.CAPS_TIMEOUT, + "image/x-j2c", + progressHandler, + (HttpWebRequest request, HttpWebResponse response, byte[] responseData, Exception error) => + { + if (error == null && responseData != null) // success + { + ImageDownload image = new ImageDownload(); + image.ID = textureID; + image.AssetData = responseData; + image.Size = image.AssetData.Length; + image.Transferred = image.AssetData.Length; + image.ImageType = ImageType.ServerBaked; + image.AssetType = AssetType.Texture; + image.Success = true; + + callback(TextureRequestState.Finished, new AssetTexture(image.ID, image.AssetData)); + + Client.Assets.Cache.SaveAssetToCache(textureID, responseData); + } + else // download failed + { + Logger.Log( + string.Format("Failed to fetch server bake {0}: {1}", + textureID, + (error == null) ? "" : error.Message + ), + Helpers.LogLevel.Warning, Client); + + callback(TextureRequestState.Timeout, null); + } + } + ); + + HttpDownloads.QueueDownlad(req); + + } + /// /// Lets TexturePipeline class fire the progress event /// From 98a455ea3086400f8a1482ae59218c939f5e97f3 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Mon, 24 Dec 2012 06:24:52 +0100 Subject: [PATCH 42/57] Track avatar animations --- OpenMetaverse/Avatar.cs | 5 ++++ OpenMetaverse/AvatarManager.cs | 45 ++++++++++++++++++---------------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/OpenMetaverse/Avatar.cs b/OpenMetaverse/Avatar.cs index 59ee368c..a96c7b05 100644 --- a/OpenMetaverse/Avatar.cs +++ b/OpenMetaverse/Avatar.cs @@ -323,6 +323,11 @@ namespace OpenMetaverse /// public AppearanceFlags AppearanceFlags = AppearanceFlags.None; + /// + /// List of current avatar animations + /// + public List Animations; + #endregion Public Members protected string name; diff --git a/OpenMetaverse/AvatarManager.cs b/OpenMetaverse/AvatarManager.cs index d874e9bc..f1136e84 100644 --- a/OpenMetaverse/AvatarManager.cs +++ b/OpenMetaverse/AvatarManager.cs @@ -51,7 +51,7 @@ namespace OpenMetaverse /// Last name (legacy) public string LegacyLastName; /// Full name (legacy) - public string LegacyFullName { get { return string.Format("{0} {1}", LegacyFirstName, LegacyLastName); }} + public string LegacyFullName { get { return string.Format("{0} {1}", LegacyFirstName, LegacyLastName); } } /// Is display name default display name public bool IsDefaultDisplayName; /// Cache display name until @@ -88,7 +88,7 @@ namespace OpenMetaverse public OSD GetOSD() { OSDMap map = new OSDMap(); - + map["id"] = ID; map["username"] = UserName; map["display_name"] = DisplayName; @@ -708,7 +708,7 @@ namespace OpenMetaverse if (error != null) throw error; GetDisplayNamesMessage msg = new GetDisplayNamesMessage(); - msg.Deserialize((OSDMap) result); + msg.Deserialize((OSDMap)result); callback(true, msg.Agents, msg.BadIDs); } catch (Exception ex) @@ -873,27 +873,30 @@ namespace OpenMetaverse { Packet packet = e.Packet; - if (m_AvatarAnimation != null) + AvatarAnimationPacket data = (AvatarAnimationPacket)packet; + + List signaledAnimations = new List(data.AnimationList.Length); + + for (int i = 0; i < data.AnimationList.Length; i++) { - AvatarAnimationPacket data = (AvatarAnimationPacket)packet; - - List signaledAnimations = new List(data.AnimationList.Length); - - for (int i = 0; i < data.AnimationList.Length; i++) + Animation animation = new Animation(); + animation.AnimationID = data.AnimationList[i].AnimID; + animation.AnimationSequence = data.AnimationList[i].AnimSequenceID; + if (i < data.AnimationSourceList.Length) { - Animation animation = new Animation(); - animation.AnimationID = data.AnimationList[i].AnimID; - animation.AnimationSequence = data.AnimationList[i].AnimSequenceID; - if (i < data.AnimationSourceList.Length) - { - animation.AnimationSourceObjectID = data.AnimationSourceList[i].ObjectID; - } - - signaledAnimations.Add(animation); + animation.AnimationSourceObjectID = data.AnimationSourceList[i].ObjectID; } - OnAvatarAnimation(new AvatarAnimationEventArgs(data.Sender.ID, signaledAnimations)); + signaledAnimations.Add(animation); } + + Avatar avatar = e.Simulator.ObjectsAvatars.Find(avi => avi.ID == data.Sender.ID); + if (avatar != null) + { + avatar.Animations = signaledAnimations; + } + + OnAvatarAnimation(new AvatarAnimationEventArgs(data.Sender.ID, signaledAnimations)); } /// Process an incoming packet and raise the appropriate events @@ -1020,7 +1023,7 @@ namespace OpenMetaverse { if (m_DisplayNameUpdate != null) { - DisplayNameUpdateMessage msg = (DisplayNameUpdateMessage) message; + DisplayNameUpdateMessage msg = (DisplayNameUpdateMessage)message; OnDisplayNameUpdate(new DisplayNameUpdateEventArgs(msg.OldDisplayName, msg.DisplayName)); } } @@ -1689,7 +1692,7 @@ namespace OpenMetaverse private string oldDisplayName; private AgentDisplayName displayName; - public string OldDisplayName { get { return oldDisplayName; }} + public string OldDisplayName { get { return oldDisplayName; } } public AgentDisplayName DisplayName { get { return displayName; } } public DisplayNameUpdateEventArgs(string oldDisplayName, AgentDisplayName displayName) From 1ed090f4d25c44130c043124ad5ababdc5f8b7ba Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Fri, 25 Jan 2013 13:41:21 +0100 Subject: [PATCH 43/57] Added new RequestLure type of IIM. See https://jira.secondlife.com/browse/storm-1838 for details --- OpenMetaverse/AgentManager.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/OpenMetaverse/AgentManager.cs b/OpenMetaverse/AgentManager.cs index 4965110a..e17dbcc7 100644 --- a/OpenMetaverse/AgentManager.cs +++ b/OpenMetaverse/AgentManager.cs @@ -142,9 +142,8 @@ namespace OpenMetaverse DenyTeleport = 24, /// Only useful if you have Linden permissions GodLikeRequestTeleport = 25, - /// A placeholder type for future expansion, currently not - /// used - CurrentlyUnused = 26, + /// Request a teleport lure + RequestLure = 26, // Notification of a new group election, this is // deprecated //[Obsolete] From 5c2c1638e4c59a423efeee6af83e2d4462e72d3b Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sat, 2 Feb 2013 04:02:13 +0100 Subject: [PATCH 44/57] Increase the capacity of the buffer for tracking incoming seen messages. Fixed enum typo --- OpenMetaverse/AssetManager.cs | 2 +- OpenMetaverse/Settings.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenMetaverse/AssetManager.cs b/OpenMetaverse/AssetManager.cs index 6272cae1..e8f88484 100644 --- a/OpenMetaverse/AssetManager.cs +++ b/OpenMetaverse/AssetManager.cs @@ -120,7 +120,7 @@ namespace OpenMetaverse /// Avatar texture Baked = 1, /// Server baked avatar texture - ServerBaked = 1 + ServerBaked = 2 } /// diff --git a/OpenMetaverse/Settings.cs b/OpenMetaverse/Settings.cs index 24d4c8f1..27196749 100644 --- a/OpenMetaverse/Settings.cs +++ b/OpenMetaverse/Settings.cs @@ -135,7 +135,7 @@ namespace OpenMetaverse public const int MAX_SEQUENCE = 0xFFFFFF; /// The maximum size of the sequence number archive, used to /// check for resent and/or duplicate packets - public const int PACKET_ARCHIVE_SIZE = 200; + public static int PACKET_ARCHIVE_SIZE = 1000; /// Maximum number of queued ACKs to be sent before SendAcks() /// is forced public int MAX_PENDING_ACKS = 10; From 12e5f53577664c2d7f9dc1867c27c0f5212db0b5 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sat, 9 Feb 2013 00:55:50 +0100 Subject: [PATCH 45/57] Request CAP for setting object materials --- OpenMetaverse/Caps.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenMetaverse/Caps.cs b/OpenMetaverse/Caps.cs index 2242db9e..49bf14b0 100644 --- a/OpenMetaverse/Caps.cs +++ b/OpenMetaverse/Caps.cs @@ -166,6 +166,7 @@ namespace OpenMetaverse req.Add("ProductInfoRequest"); req.Add("ProvisionVoiceAccountRequest"); req.Add("RemoteParcelRequest"); + req.Add("RenderMaterials"); req.Add("RequestTextureDownload"); req.Add("ResourceCostSelected"); req.Add("RetrieveNavMeshSrc"); From 5421745bc34b709c7d7f30ea5dca79524de83cc4 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sat, 16 Feb 2013 05:39:32 +0100 Subject: [PATCH 46/57] LIBOMV-958: Added ability to report status of last application run to the grid login service --- OpenMetaverse/Login.cs | 67 +++++++++++++++++++++++++++++------------- 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/OpenMetaverse/Login.cs b/OpenMetaverse/Login.cs index 519ea21f..f1f512e7 100644 --- a/OpenMetaverse/Login.cs +++ b/OpenMetaverse/Login.cs @@ -62,6 +62,26 @@ namespace OpenMetaverse Success } + /// + /// Status of the last application run. + /// Used for error reporting to the grid login service for statistical purposes. + /// + public enum LastExecStatus + { + /// Application exited normally + Normal = 0, + /// Application froze + Froze, + /// Application detected error and exited abnormally + ForcedCrash, + /// Other crash + OtherCrash, + /// Application froze during logout + LogoutFroze, + /// Application crashed during logout + LogoutCrash + } + #endregion Enums #region Structs @@ -115,6 +135,9 @@ namespace OpenMetaverse public bool AgreeToTos; /// Unknown public bool ReadCritical; + /// Status of the last application run sent to the grid login server for statistical purposes + public LastExecStatus LastExecEvent = LastExecStatus.Normal; + /// An array of string sent to the login server to enable various options public string[] Options; @@ -154,6 +177,7 @@ namespace OpenMetaverse this.ID0 = NetworkManager.GetMAC(); this.AgreeToTos = true; this.ReadCritical = true; + this.LastExecEvent = LastExecStatus.Normal; } /// @@ -1065,6 +1089,7 @@ namespace OpenMetaverse loginLLSD["read_critical"] = OSD.FromBoolean(loginParams.ReadCritical); loginLLSD["viewer_digest"] = OSD.FromString(loginParams.ViewerDigest); loginLLSD["id0"] = OSD.FromString(loginParams.ID0); + loginLLSD["last_exec_event"] = OSD.FromInteger((int)loginParams.LastExecEvent); // Create the options LLSD array OSDArray optionsOSD = new OSDArray(); @@ -1124,7 +1149,7 @@ namespace OpenMetaverse if (loginParams.ReadCritical) loginXmlRpc["read_critical"] = "true"; loginXmlRpc["id0"] = loginParams.ID0; - loginXmlRpc["last_exec_event"] = 0; + loginXmlRpc["last_exec_event"] = (int)loginParams.LastExecEvent; // Create the options array ArrayList options = new ArrayList(); @@ -1199,15 +1224,15 @@ namespace OpenMetaverse } - /// - /// LoginParams and the initial login XmlRpcRequest were made on a remote machine. - /// This method now initializes libomv with the results. - /// - public void RemoteLoginHandler(LoginResponseData response, LoginParams newContext) - { - CurrentContext = newContext; - LoginReplyXmlRpcHandler(response, newContext); - } + /// + /// LoginParams and the initial login XmlRpcRequest were made on a remote machine. + /// This method now initializes libomv with the results. + /// + public void RemoteLoginHandler(LoginResponseData response, LoginParams newContext) + { + CurrentContext = newContext; + LoginReplyXmlRpcHandler(response, newContext); + } /// @@ -1240,19 +1265,19 @@ namespace OpenMetaverse Logger.Log("Login response failure: " + e.Message + " " + e.StackTrace, Helpers.LogLevel.Warning); return; } - LoginReplyXmlRpcHandler(reply, context); - } + LoginReplyXmlRpcHandler(reply, context); + } - /// - /// Handles response from XML-RPC login replies with already parsed LoginResponseData - /// - private void LoginReplyXmlRpcHandler(LoginResponseData reply, LoginParams context) - { - ushort simPort = 0; - uint regionX = 0; - uint regionY = 0; - string reason = reply.Reason; + /// + /// Handles response from XML-RPC login replies with already parsed LoginResponseData + /// + private void LoginReplyXmlRpcHandler(LoginResponseData reply, LoginParams context) + { + ushort simPort = 0; + uint regionX = 0; + uint regionY = 0; + string reason = reply.Reason; string message = reply.Message; if (reply.Login == "true") From 5a3b03856c2dc76b91d44d463451e363bdb96aa0 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sat, 16 Feb 2013 07:05:16 +0100 Subject: [PATCH 47/57] LIBOMV-955: Added handling AgentStateUpdate EQ message --- OpenMetaverse/AgentManager.cs | 12 ++++ OpenMetaverse/Messages/LindenMessages.cs | 58 +++++++++++++++++++ OpenMetaverse/Messages/MessageEventDecoder.cs | 1 + 3 files changed, 71 insertions(+) diff --git a/OpenMetaverse/AgentManager.cs b/OpenMetaverse/AgentManager.cs index e17dbcc7..947d6f9c 100644 --- a/OpenMetaverse/AgentManager.cs +++ b/OpenMetaverse/AgentManager.cs @@ -1449,6 +1449,9 @@ namespace OpenMetaverse } } + /// Various abilities and preferences sent by the grid + public AgentStateUpdateMessage AgentStateStatus; + #endregion Properties internal uint localID; @@ -1534,6 +1537,7 @@ namespace OpenMetaverse // CAPS callbacks Client.Network.RegisterEventCallback("EstablishAgentCommunication", new Caps.EventQueueCallback(EstablishAgentCommunicationEventHandler)); Client.Network.RegisterEventCallback("SetDisplayNameReply", new Caps.EventQueueCallback(SetDisplayNameReplyEventHandler)); + Client.Network.RegisterEventCallback("AgentStateUpdate", new Caps.EventQueueCallback(AgentStateUpdateEventHandler)); // Incoming Group Chat Client.Network.RegisterEventCallback("ChatterBoxInvitation", new Caps.EventQueueCallback(ChatterBoxInvitationEventHandler)); // Outgoing Group Chat Reply @@ -3702,6 +3706,14 @@ namespace OpenMetaverse } } + protected void AgentStateUpdateEventHandler(string capsKey, IMessage message, Simulator simulator) + { + if (message is AgentStateUpdateMessage) + { + AgentStateStatus = (AgentStateUpdateMessage)message; + } + } + protected void EstablishAgentCommunicationEventHandler(string capsKey, IMessage message, Simulator simulator) { EstablishAgentCommunicationMessage msg = (EstablishAgentCommunicationMessage)message; diff --git a/OpenMetaverse/Messages/LindenMessages.cs b/OpenMetaverse/Messages/LindenMessages.cs index 5fe792d7..9d671dcc 100644 --- a/OpenMetaverse/Messages/LindenMessages.cs +++ b/OpenMetaverse/Messages/LindenMessages.cs @@ -1703,6 +1703,64 @@ namespace OpenMetaverse.Messages.Linden } } + public class AgentStateUpdateMessage : IMessage + { + public OSDMap RawData; + public bool CanModifyNavmesh; + public bool HasModifiedNavmesh; + public string MaxAccess; // PG, M, A + public bool AlterNavmeshObjects; + public bool AlterPermanentObjects; + public int GodLevel; + public string Language; + public bool LanguageIsPublic; + + public void Deserialize(OSDMap map) + { + RawData = map; + CanModifyNavmesh = map["can_modify_navmesh"]; + HasModifiedNavmesh = map["has_modified_navmesh"]; + if (map["preferences"] is OSDMap) + { + var prefs = (OSDMap)map["preferences"]; + AlterNavmeshObjects = prefs["alter_navmesh_objects"]; + AlterPermanentObjects = prefs["alter_permanent_objects"]; + GodLevel = prefs["god_level"]; + Language = prefs["language"]; + LanguageIsPublic = prefs["language_is_public"]; + if (prefs["access_prefs"] is OSDMap) + { + var access = (OSDMap)prefs["access_prefs"]; + MaxAccess = access["max"]; + } + } + } + + public OSDMap Serialize() + { + RawData = new OSDMap(); + RawData["can_modify_navmesh"] = CanModifyNavmesh; + RawData["has_modified_navmesh"] = HasModifiedNavmesh; + + OSDMap prefs = new OSDMap(); + { + OSDMap access = new OSDMap(); + { + access["max"] = MaxAccess; + } + prefs["access_prefs"] = access; + prefs["alter_navmesh_objects"] = AlterNavmeshObjects; + prefs["alter_permanent_objects"] = AlterPermanentObjects; + prefs["god_level"] = GodLevel; + prefs["language"] = Language; + prefs["language_is_public"] = LanguageIsPublic; + } + RawData["preferences"] = prefs; + return RawData; + } + + } + /// Base class for Asset uploads/results via Capabilities public abstract class AssetUploaderBlock { diff --git a/OpenMetaverse/Messages/MessageEventDecoder.cs b/OpenMetaverse/Messages/MessageEventDecoder.cs index cd070f7a..d169a019 100644 --- a/OpenMetaverse/Messages/MessageEventDecoder.cs +++ b/OpenMetaverse/Messages/MessageEventDecoder.cs @@ -84,6 +84,7 @@ namespace OpenMetaverse.Messages case "ScriptRunningReply": message = new ScriptRunningReplyMessage(); break; case "SearchStatRequest": message = new SearchStatRequestMessage(); break; case "AgentDropGroup": message = new AgentDropGroupMessage(); break; + case "AgentStateUpdate": message = new AgentStateUpdateMessage(); break; case "ForceCloseChatterBoxSession": message = new ForceCloseChatterBoxSessionMessage(); break; case "UploadBakedTexture": message = new UploadBakedTextureMessage(); break; case "RegionInfo": message = new RegionInfoMessage(); break; From 5c49c4f00218532ada020adbdca0aede95cee92a Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sun, 17 Feb 2013 23:15:32 +0100 Subject: [PATCH 48/57] Updated to the newer tool version --- docs/OpenMetaverse.shfbproj | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/docs/OpenMetaverse.shfbproj b/docs/OpenMetaverse.shfbproj index cf33f420..f345bb3e 100644 --- a/docs/OpenMetaverse.shfbproj +++ b/docs/OpenMetaverse.shfbproj @@ -1,4 +1,5 @@ - + + Documentation @@ -17,12 +18,12 @@ .\trunk\ OpenMetaverse The OpenMetaverse Developers API Documentation - http://libopenmetaverse.googlecode.com/svn/libopenmetaverse/trunk/LICENSE.txt - %28c%29 2011 The OpenMetaverse Ninjas and Contributors + https://github.com/openmetaversefoundation/libopenmetaverse/blob/master/LICENSE.txt + %28c%29 2013 The OpenMetaverse Ninjas and Contributors OpenMetaverse Protocol Library Developers API Documentation HtmlHelp1, Website MemberName - True + False Prototype @@ -32,7 +33,7 @@ - 3.5 + .NET Framework 3.5 @@ -103,6 +104,10 @@ True AutoDocumentCtors, AutoDocumentDispose False + Blank + False + en-US + AboveNamespaces From af39cd2dc7f702e76454a823b2d7e0203f31edcf Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Mon, 18 Feb 2013 00:01:57 +0100 Subject: [PATCH 49/57] More tools update --- docs/OpenMetaverse.shfbproj | 118 ++++++++++++++++++++---------------- 1 file changed, 65 insertions(+), 53 deletions(-) mode change 100644 => 100755 docs/OpenMetaverse.shfbproj diff --git a/docs/OpenMetaverse.shfbproj b/docs/OpenMetaverse.shfbproj old mode 100644 new mode 100755 index f345bb3e..1d0f57bc --- a/docs/OpenMetaverse.shfbproj +++ b/docs/OpenMetaverse.shfbproj @@ -43,61 +43,73 @@ None CSharp - + - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - -{@CachedFrameworkCommentList} -{@CommentFileList} - - - - - + + + + + + + + + + + + + {@HelpFormatOutputPaths} + + + + + + + + + + + {@CachedFrameworkCommentList} + {@CommentFileList} + + + The Primary namespace used by libOpenMetaverse. Common classes, Structs and Enums are all located within this namespace. From e67dbaeff3e2123c05a840233dc04bdf504a2d1c Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Mon, 18 Feb 2013 00:17:31 +0100 Subject: [PATCH 50/57] Docs building now requires .net 4.0 --- runprebuild2010.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runprebuild2010.bat b/runprebuild2010.bat index 07dfc910..58260de2 100644 --- a/runprebuild2010.bat +++ b/runprebuild2010.bat @@ -34,7 +34,7 @@ if(.%1)==(.nant) echo nant >> compile.bat if(.%1)==(.nant) echo IF ERRORLEVEL 1 GOTO FAIL >> compile.bat if(.%2)==(.docs) echo echo ==== GENERATE DOCUMENTATION BEGIN ==== >> compile.bat -if(.%2)==(.docs) echo %SystemRoot%\Microsoft.NET\Framework\v3.5\MSBuild.exe /p:Configuration=Release docs\OpenMetaverse.shfbproj >> compile.bat +if(.%2)==(.docs) echo %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /p:Configuration=Release docs\OpenMetaverse.shfbproj >> compile.bat if(.%2)==(.docs) echo IF ERRORLEVEL 1 GOTO FAIL >> compile.bat if(.%2)==(.docs) echo 7z.exe a -tzip docs\documentation.zip docs\trunk >> compile.bat if(.%2)==(.docs) echo IF ERRORLEVEL 1 GOTO FAIL >> compile.bat From 165f8c4280196134048829d1eb6dbaf29071e75f Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Thu, 21 Feb 2013 23:38:42 +0100 Subject: [PATCH 51/57] Line endings --- OpenMetaverse/AgentManagerMovement.cs | 1474 ++++++++++++------------- 1 file changed, 737 insertions(+), 737 deletions(-) diff --git a/OpenMetaverse/AgentManagerMovement.cs b/OpenMetaverse/AgentManagerMovement.cs index abc00497..435eba16 100644 --- a/OpenMetaverse/AgentManagerMovement.cs +++ b/OpenMetaverse/AgentManagerMovement.cs @@ -1,744 +1,744 @@ -/* - * Copyright (c) 2006-2008, openmetaverse.org - * All rights reserved. - * - * - 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. - * - Neither the name of the openmetaverse.org 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR 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.Threading; -using OpenMetaverse; -using OpenMetaverse.Packets; - -namespace OpenMetaverse -{ - public partial class AgentManager - { - #region Enums - - /// - /// Used to specify movement actions for your agent - /// - [Flags] - public enum ControlFlags - { - /// Empty flag - NONE = 0, - /// Move Forward (SL Keybinding: W/Up Arrow) - AGENT_CONTROL_AT_POS = 0x1 << CONTROL_AT_POS_INDEX, - /// Move Backward (SL Keybinding: S/Down Arrow) - AGENT_CONTROL_AT_NEG = 0x1 << CONTROL_AT_NEG_INDEX, - /// Move Left (SL Keybinding: Shift-(A/Left Arrow)) - AGENT_CONTROL_LEFT_POS = 0x1 << CONTROL_LEFT_POS_INDEX, - /// Move Right (SL Keybinding: Shift-(D/Right Arrow)) - AGENT_CONTROL_LEFT_NEG = 0x1 << CONTROL_LEFT_NEG_INDEX, - /// Not Flying: Jump/Flying: Move Up (SL Keybinding: E) - AGENT_CONTROL_UP_POS = 0x1 << CONTROL_UP_POS_INDEX, - /// Not Flying: Croutch/Flying: Move Down (SL Keybinding: C) - AGENT_CONTROL_UP_NEG = 0x1 << CONTROL_UP_NEG_INDEX, - /// Unused - AGENT_CONTROL_PITCH_POS = 0x1 << CONTROL_PITCH_POS_INDEX, - /// Unused - AGENT_CONTROL_PITCH_NEG = 0x1 << CONTROL_PITCH_NEG_INDEX, - /// Unused - AGENT_CONTROL_YAW_POS = 0x1 << CONTROL_YAW_POS_INDEX, - /// Unused - AGENT_CONTROL_YAW_NEG = 0x1 << CONTROL_YAW_NEG_INDEX, - /// ORed with AGENT_CONTROL_AT_* if the keyboard is being used - AGENT_CONTROL_FAST_AT = 0x1 << CONTROL_FAST_AT_INDEX, - /// ORed with AGENT_CONTROL_LEFT_* if the keyboard is being used - AGENT_CONTROL_FAST_LEFT = 0x1 << CONTROL_FAST_LEFT_INDEX, - /// ORed with AGENT_CONTROL_UP_* if the keyboard is being used - AGENT_CONTROL_FAST_UP = 0x1 << CONTROL_FAST_UP_INDEX, - /// Fly - AGENT_CONTROL_FLY = 0x1 << CONTROL_FLY_INDEX, - /// - AGENT_CONTROL_STOP = 0x1 << CONTROL_STOP_INDEX, - /// Finish our current animation - AGENT_CONTROL_FINISH_ANIM = 0x1 << CONTROL_FINISH_ANIM_INDEX, - /// Stand up from the ground or a prim seat - AGENT_CONTROL_STAND_UP = 0x1 << CONTROL_STAND_UP_INDEX, - /// Sit on the ground at our current location - AGENT_CONTROL_SIT_ON_GROUND = 0x1 << CONTROL_SIT_ON_GROUND_INDEX, - /// Whether mouselook is currently enabled - AGENT_CONTROL_MOUSELOOK = 0x1 << CONTROL_MOUSELOOK_INDEX, - /// Legacy, used if a key was pressed for less than a certain amount of time - AGENT_CONTROL_NUDGE_AT_POS = 0x1 << CONTROL_NUDGE_AT_POS_INDEX, - /// Legacy, used if a key was pressed for less than a certain amount of time - AGENT_CONTROL_NUDGE_AT_NEG = 0x1 << CONTROL_NUDGE_AT_NEG_INDEX, - /// Legacy, used if a key was pressed for less than a certain amount of time - AGENT_CONTROL_NUDGE_LEFT_POS = 0x1 << CONTROL_NUDGE_LEFT_POS_INDEX, - /// Legacy, used if a key was pressed for less than a certain amount of time - AGENT_CONTROL_NUDGE_LEFT_NEG = 0x1 << CONTROL_NUDGE_LEFT_NEG_INDEX, - /// Legacy, used if a key was pressed for less than a certain amount of time - AGENT_CONTROL_NUDGE_UP_POS = 0x1 << CONTROL_NUDGE_UP_POS_INDEX, - /// Legacy, used if a key was pressed for less than a certain amount of time - AGENT_CONTROL_NUDGE_UP_NEG = 0x1 << CONTROL_NUDGE_UP_NEG_INDEX, - /// - AGENT_CONTROL_TURN_LEFT = 0x1 << CONTROL_TURN_LEFT_INDEX, - /// - AGENT_CONTROL_TURN_RIGHT = 0x1 << CONTROL_TURN_RIGHT_INDEX, - /// Set when the avatar is idled or set to away. Note that the away animation is - /// activated separately from setting this flag - AGENT_CONTROL_AWAY = 0x1 << CONTROL_AWAY_INDEX, - /// - AGENT_CONTROL_LBUTTON_DOWN = 0x1 << CONTROL_LBUTTON_DOWN_INDEX, - /// - AGENT_CONTROL_LBUTTON_UP = 0x1 << CONTROL_LBUTTON_UP_INDEX, - /// - AGENT_CONTROL_ML_LBUTTON_DOWN = 0x1 << CONTROL_ML_LBUTTON_DOWN_INDEX, - /// - AGENT_CONTROL_ML_LBUTTON_UP = 0x1 << CONTROL_ML_LBUTTON_UP_INDEX - } - - #endregion Enums - - #region AgentUpdate Constants - - private const int CONTROL_AT_POS_INDEX = 0; - private const int CONTROL_AT_NEG_INDEX = 1; - private const int CONTROL_LEFT_POS_INDEX = 2; - private const int CONTROL_LEFT_NEG_INDEX = 3; - private const int CONTROL_UP_POS_INDEX = 4; - private const int CONTROL_UP_NEG_INDEX = 5; - private const int CONTROL_PITCH_POS_INDEX = 6; - private const int CONTROL_PITCH_NEG_INDEX = 7; - private const int CONTROL_YAW_POS_INDEX = 8; - private const int CONTROL_YAW_NEG_INDEX = 9; - private const int CONTROL_FAST_AT_INDEX = 10; - private const int CONTROL_FAST_LEFT_INDEX = 11; - private const int CONTROL_FAST_UP_INDEX = 12; - private const int CONTROL_FLY_INDEX = 13; - private const int CONTROL_STOP_INDEX = 14; - private const int CONTROL_FINISH_ANIM_INDEX = 15; - private const int CONTROL_STAND_UP_INDEX = 16; - private const int CONTROL_SIT_ON_GROUND_INDEX = 17; - private const int CONTROL_MOUSELOOK_INDEX = 18; - private const int CONTROL_NUDGE_AT_POS_INDEX = 19; - private const int CONTROL_NUDGE_AT_NEG_INDEX = 20; - private const int CONTROL_NUDGE_LEFT_POS_INDEX = 21; - private const int CONTROL_NUDGE_LEFT_NEG_INDEX = 22; - private const int CONTROL_NUDGE_UP_POS_INDEX = 23; - private const int CONTROL_NUDGE_UP_NEG_INDEX = 24; - private const int CONTROL_TURN_LEFT_INDEX = 25; - private const int CONTROL_TURN_RIGHT_INDEX = 26; - private const int CONTROL_AWAY_INDEX = 27; - private const int CONTROL_LBUTTON_DOWN_INDEX = 28; - private const int CONTROL_LBUTTON_UP_INDEX = 29; - private const int CONTROL_ML_LBUTTON_DOWN_INDEX = 30; - private const int CONTROL_ML_LBUTTON_UP_INDEX = 31; - private const int TOTAL_CONTROLS = 32; - - #endregion AgentUpdate Constants - - /// - /// Agent movement and camera control - /// - /// Agent movement is controlled by setting specific - /// After the control flags are set, An AgentUpdate is required to update the simulator of the specified flags - /// This is most easily accomplished by setting one or more of the AgentMovement properties - /// - /// Movement of an avatar is always based on a compass direction, for example AtPos will move the - /// agent from West to East or forward on the X Axis, AtNeg will of course move agent from - /// East to West or backward on the X Axis, LeftPos will be South to North or forward on the Y Axis - /// The Z axis is Up, finer grained control of movements can be done using the Nudge properties - /// - public partial class AgentMovement - { - #region Properties - - /// Move agent positive along the X axis - public bool AtPos - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_AT_POS); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_AT_POS, value); } - } - /// Move agent negative along the X axis - public bool AtNeg - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG, value); } - } - /// Move agent positive along the Y axis - public bool LeftPos - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS, value); } - } - /// Move agent negative along the Y axis - public bool LeftNeg - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG, value); } - } - /// Move agent positive along the Z axis - public bool UpPos - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_UP_POS); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_UP_POS, value); } - } - /// Move agent negative along the Z axis - public bool UpNeg - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG, value); } - } - /// - public bool PitchPos - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_PITCH_POS); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_PITCH_POS, value); } - } - /// - public bool PitchNeg - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_PITCH_NEG); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_PITCH_NEG, value); } - } - /// - public bool YawPos - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS, value); } - } - /// - public bool YawNeg - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG, value); } - } - /// - public bool FastAt - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FAST_AT); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FAST_AT, value); } - } - /// - public bool FastLeft - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FAST_LEFT); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FAST_LEFT, value); } - } - /// - public bool FastUp - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FAST_UP); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FAST_UP, value); } - } - /// Causes simulator to make agent fly - public bool Fly - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FLY); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FLY, value); } - } - /// Stop movement - public bool Stop - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_STOP); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_STOP, value); } - } - /// Finish animation - public bool FinishAnim - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FINISH_ANIM); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FINISH_ANIM, value); } - } - /// Stand up from a sit - public bool StandUp - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP, value); } - } - /// Tells simulator to sit agent on ground - public bool SitOnGround - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND, value); } - } - /// Place agent into mouselook mode - public bool Mouselook - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK, value); } - } - /// Nudge agent positive along the X axis - public bool NudgeAtPos - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS, value); } - } - /// Nudge agent negative along the X axis - public bool NudgeAtNeg - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG, value); } - } - /// Nudge agent positive along the Y axis - public bool NudgeLeftPos - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS, value); } - } - /// Nudge agent negative along the Y axis - public bool NudgeLeftNeg - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG, value); } - } - /// Nudge agent positive along the Z axis - public bool NudgeUpPos - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS, value); } - } - /// Nudge agent negative along the Z axis - public bool NudgeUpNeg - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG, value); } - } - /// - public bool TurnLeft - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT, value); } - } - /// - public bool TurnRight - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT, value); } - } - /// Tell simulator to mark agent as away - public bool Away - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_AWAY); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_AWAY, value); } - } - /// - public bool LButtonDown - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN, value); } - } - /// - public bool LButtonUp - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP, value); } - } - /// - public bool MLButtonDown - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN, value); } - } - /// - public bool MLButtonUp - { - get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_UP); } - set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_UP, value); } - } - /// - /// Returns "always run" value, or changes it by sending a SetAlwaysRunPacket - /// - public bool AlwaysRun - { - get - { - return alwaysRun; - } - set - { - alwaysRun = value; - SetAlwaysRunPacket run = new SetAlwaysRunPacket(); - run.AgentData.AgentID = Client.Self.AgentID; - run.AgentData.SessionID = Client.Self.SessionID; - run.AgentData.AlwaysRun = alwaysRun; - Client.Network.SendPacket(run); - } - } - /// The current value of the agent control flags - public uint AgentControls - { - get { return agentControls; } - } - - /// Gets or sets the interval in milliseconds at which - /// AgentUpdate packets are sent to the current simulator. Setting - /// this to a non-zero value will also enable the packet sending if - /// it was previously off, and setting it to zero will disable - public int UpdateInterval - { - get - { - return updateInterval; - } - set - { - if (value > 0) - { - if (updateTimer != null) - { - updateTimer.Change(value, value); - } - updateInterval = value; - } - else - { - if (updateTimer != null) - { - updateTimer.Change(Timeout.Infinite, Timeout.Infinite); - } - updateInterval = 0; - } - } - } - /// Gets or sets whether AgentUpdate packets are sent to - /// the current simulator - public bool UpdateEnabled - { - get { return (updateInterval != 0); } - } - - /// Reset movement controls every time we send an update - public bool AutoResetControls - { - get { return autoResetControls; } - set { autoResetControls = value; } - } - - #endregion Properties - - /// Agent camera controls - public AgentCamera Camera; - /// Currently only used for hiding your group title - public AgentFlags Flags = AgentFlags.None; - /// Action state of the avatar, which can currently be - /// typing and editing - public AgentState State = AgentState.None; - /// - public Quaternion BodyRotation = Quaternion.Identity; - /// - public Quaternion HeadRotation = Quaternion.Identity; - - #region Change tracking - /// - private Quaternion LastBodyRotation; - /// - private Quaternion LastHeadRotation; - /// - private Vector3 LastCameraCenter; - /// - private Vector3 LastCameraXAxis; - /// - private Vector3 LastCameraYAxis; - /// - private Vector3 LastCameraZAxis; - /// - private float LastFar; - #endregion Change tracking - - private bool alwaysRun; - private GridClient Client; - private uint agentControls; - private int duplicateCount; - private AgentState lastState; - /// Timer for sending AgentUpdate packets - private Timer updateTimer; - private int updateInterval; - private bool autoResetControls; - - /// Default constructor - public AgentMovement(GridClient client) - { - Client = client; - Camera = new AgentCamera(); - Client.Network.LoginProgress += Network_OnConnected; - Client.Network.Disconnected += Network_OnDisconnected; - updateInterval = Settings.DEFAULT_AGENT_UPDATE_INTERVAL; - } - - private void CleanupTimer() - { - if (updateTimer != null) - { - updateTimer.Dispose(); - updateTimer = null; - } - } - - private void Network_OnDisconnected(object sender, DisconnectedEventArgs e) - { - CleanupTimer(); - } - - private void Network_OnConnected(object sender, LoginProgressEventArgs e) - { - if (e.Status == LoginStatus.Success) - { - CleanupTimer(); - updateTimer = new Timer(new TimerCallback(UpdateTimer_Elapsed), null, updateInterval, updateInterval); - } - } - - /// - /// Send an AgentUpdate with the camera set at the current agent - /// position and pointing towards the heading specified - /// - /// Camera rotation in radians - /// Whether to send the AgentUpdate reliable - /// or not - public void UpdateFromHeading(double heading, bool reliable) - { - Camera.Position = Client.Self.SimPosition; - Camera.LookDirection(heading); - - BodyRotation.Z = (float)Math.Sin(heading / 2.0d); - BodyRotation.W = (float)Math.Cos(heading / 2.0d); - HeadRotation = BodyRotation; - - SendUpdate(reliable); - } - - /// - /// Rotates the avatar body and camera toward a target position. - /// This will also anchor the camera position on the avatar +/* + * Copyright (c) 2006-2008, openmetaverse.org + * All rights reserved. + * + * - 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. + * - Neither the name of the openmetaverse.org 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR 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.Threading; +using OpenMetaverse; +using OpenMetaverse.Packets; + +namespace OpenMetaverse +{ + public partial class AgentManager + { + #region Enums + + /// + /// Used to specify movement actions for your agent + /// + [Flags] + public enum ControlFlags + { + /// Empty flag + NONE = 0, + /// Move Forward (SL Keybinding: W/Up Arrow) + AGENT_CONTROL_AT_POS = 0x1 << CONTROL_AT_POS_INDEX, + /// Move Backward (SL Keybinding: S/Down Arrow) + AGENT_CONTROL_AT_NEG = 0x1 << CONTROL_AT_NEG_INDEX, + /// Move Left (SL Keybinding: Shift-(A/Left Arrow)) + AGENT_CONTROL_LEFT_POS = 0x1 << CONTROL_LEFT_POS_INDEX, + /// Move Right (SL Keybinding: Shift-(D/Right Arrow)) + AGENT_CONTROL_LEFT_NEG = 0x1 << CONTROL_LEFT_NEG_INDEX, + /// Not Flying: Jump/Flying: Move Up (SL Keybinding: E) + AGENT_CONTROL_UP_POS = 0x1 << CONTROL_UP_POS_INDEX, + /// Not Flying: Croutch/Flying: Move Down (SL Keybinding: C) + AGENT_CONTROL_UP_NEG = 0x1 << CONTROL_UP_NEG_INDEX, + /// Unused + AGENT_CONTROL_PITCH_POS = 0x1 << CONTROL_PITCH_POS_INDEX, + /// Unused + AGENT_CONTROL_PITCH_NEG = 0x1 << CONTROL_PITCH_NEG_INDEX, + /// Unused + AGENT_CONTROL_YAW_POS = 0x1 << CONTROL_YAW_POS_INDEX, + /// Unused + AGENT_CONTROL_YAW_NEG = 0x1 << CONTROL_YAW_NEG_INDEX, + /// ORed with AGENT_CONTROL_AT_* if the keyboard is being used + AGENT_CONTROL_FAST_AT = 0x1 << CONTROL_FAST_AT_INDEX, + /// ORed with AGENT_CONTROL_LEFT_* if the keyboard is being used + AGENT_CONTROL_FAST_LEFT = 0x1 << CONTROL_FAST_LEFT_INDEX, + /// ORed with AGENT_CONTROL_UP_* if the keyboard is being used + AGENT_CONTROL_FAST_UP = 0x1 << CONTROL_FAST_UP_INDEX, + /// Fly + AGENT_CONTROL_FLY = 0x1 << CONTROL_FLY_INDEX, + /// + AGENT_CONTROL_STOP = 0x1 << CONTROL_STOP_INDEX, + /// Finish our current animation + AGENT_CONTROL_FINISH_ANIM = 0x1 << CONTROL_FINISH_ANIM_INDEX, + /// Stand up from the ground or a prim seat + AGENT_CONTROL_STAND_UP = 0x1 << CONTROL_STAND_UP_INDEX, + /// Sit on the ground at our current location + AGENT_CONTROL_SIT_ON_GROUND = 0x1 << CONTROL_SIT_ON_GROUND_INDEX, + /// Whether mouselook is currently enabled + AGENT_CONTROL_MOUSELOOK = 0x1 << CONTROL_MOUSELOOK_INDEX, + /// Legacy, used if a key was pressed for less than a certain amount of time + AGENT_CONTROL_NUDGE_AT_POS = 0x1 << CONTROL_NUDGE_AT_POS_INDEX, + /// Legacy, used if a key was pressed for less than a certain amount of time + AGENT_CONTROL_NUDGE_AT_NEG = 0x1 << CONTROL_NUDGE_AT_NEG_INDEX, + /// Legacy, used if a key was pressed for less than a certain amount of time + AGENT_CONTROL_NUDGE_LEFT_POS = 0x1 << CONTROL_NUDGE_LEFT_POS_INDEX, + /// Legacy, used if a key was pressed for less than a certain amount of time + AGENT_CONTROL_NUDGE_LEFT_NEG = 0x1 << CONTROL_NUDGE_LEFT_NEG_INDEX, + /// Legacy, used if a key was pressed for less than a certain amount of time + AGENT_CONTROL_NUDGE_UP_POS = 0x1 << CONTROL_NUDGE_UP_POS_INDEX, + /// Legacy, used if a key was pressed for less than a certain amount of time + AGENT_CONTROL_NUDGE_UP_NEG = 0x1 << CONTROL_NUDGE_UP_NEG_INDEX, + /// + AGENT_CONTROL_TURN_LEFT = 0x1 << CONTROL_TURN_LEFT_INDEX, + /// + AGENT_CONTROL_TURN_RIGHT = 0x1 << CONTROL_TURN_RIGHT_INDEX, + /// Set when the avatar is idled or set to away. Note that the away animation is + /// activated separately from setting this flag + AGENT_CONTROL_AWAY = 0x1 << CONTROL_AWAY_INDEX, + /// + AGENT_CONTROL_LBUTTON_DOWN = 0x1 << CONTROL_LBUTTON_DOWN_INDEX, + /// + AGENT_CONTROL_LBUTTON_UP = 0x1 << CONTROL_LBUTTON_UP_INDEX, + /// + AGENT_CONTROL_ML_LBUTTON_DOWN = 0x1 << CONTROL_ML_LBUTTON_DOWN_INDEX, + /// + AGENT_CONTROL_ML_LBUTTON_UP = 0x1 << CONTROL_ML_LBUTTON_UP_INDEX + } + + #endregion Enums + + #region AgentUpdate Constants + + private const int CONTROL_AT_POS_INDEX = 0; + private const int CONTROL_AT_NEG_INDEX = 1; + private const int CONTROL_LEFT_POS_INDEX = 2; + private const int CONTROL_LEFT_NEG_INDEX = 3; + private const int CONTROL_UP_POS_INDEX = 4; + private const int CONTROL_UP_NEG_INDEX = 5; + private const int CONTROL_PITCH_POS_INDEX = 6; + private const int CONTROL_PITCH_NEG_INDEX = 7; + private const int CONTROL_YAW_POS_INDEX = 8; + private const int CONTROL_YAW_NEG_INDEX = 9; + private const int CONTROL_FAST_AT_INDEX = 10; + private const int CONTROL_FAST_LEFT_INDEX = 11; + private const int CONTROL_FAST_UP_INDEX = 12; + private const int CONTROL_FLY_INDEX = 13; + private const int CONTROL_STOP_INDEX = 14; + private const int CONTROL_FINISH_ANIM_INDEX = 15; + private const int CONTROL_STAND_UP_INDEX = 16; + private const int CONTROL_SIT_ON_GROUND_INDEX = 17; + private const int CONTROL_MOUSELOOK_INDEX = 18; + private const int CONTROL_NUDGE_AT_POS_INDEX = 19; + private const int CONTROL_NUDGE_AT_NEG_INDEX = 20; + private const int CONTROL_NUDGE_LEFT_POS_INDEX = 21; + private const int CONTROL_NUDGE_LEFT_NEG_INDEX = 22; + private const int CONTROL_NUDGE_UP_POS_INDEX = 23; + private const int CONTROL_NUDGE_UP_NEG_INDEX = 24; + private const int CONTROL_TURN_LEFT_INDEX = 25; + private const int CONTROL_TURN_RIGHT_INDEX = 26; + private const int CONTROL_AWAY_INDEX = 27; + private const int CONTROL_LBUTTON_DOWN_INDEX = 28; + private const int CONTROL_LBUTTON_UP_INDEX = 29; + private const int CONTROL_ML_LBUTTON_DOWN_INDEX = 30; + private const int CONTROL_ML_LBUTTON_UP_INDEX = 31; + private const int TOTAL_CONTROLS = 32; + + #endregion AgentUpdate Constants + + /// + /// Agent movement and camera control + /// + /// Agent movement is controlled by setting specific + /// After the control flags are set, An AgentUpdate is required to update the simulator of the specified flags + /// This is most easily accomplished by setting one or more of the AgentMovement properties + /// + /// Movement of an avatar is always based on a compass direction, for example AtPos will move the + /// agent from West to East or forward on the X Axis, AtNeg will of course move agent from + /// East to West or backward on the X Axis, LeftPos will be South to North or forward on the Y Axis + /// The Z axis is Up, finer grained control of movements can be done using the Nudge properties + /// + public partial class AgentMovement + { + #region Properties + + /// Move agent positive along the X axis + public bool AtPos + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_AT_POS); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_AT_POS, value); } + } + /// Move agent negative along the X axis + public bool AtNeg + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG, value); } + } + /// Move agent positive along the Y axis + public bool LeftPos + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS, value); } + } + /// Move agent negative along the Y axis + public bool LeftNeg + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG, value); } + } + /// Move agent positive along the Z axis + public bool UpPos + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_UP_POS); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_UP_POS, value); } + } + /// Move agent negative along the Z axis + public bool UpNeg + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG, value); } + } + /// + public bool PitchPos + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_PITCH_POS); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_PITCH_POS, value); } + } + /// + public bool PitchNeg + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_PITCH_NEG); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_PITCH_NEG, value); } + } + /// + public bool YawPos + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS, value); } + } + /// + public bool YawNeg + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG, value); } + } + /// + public bool FastAt + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FAST_AT); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FAST_AT, value); } + } + /// + public bool FastLeft + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FAST_LEFT); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FAST_LEFT, value); } + } + /// + public bool FastUp + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FAST_UP); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FAST_UP, value); } + } + /// Causes simulator to make agent fly + public bool Fly + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FLY); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FLY, value); } + } + /// Stop movement + public bool Stop + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_STOP); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_STOP, value); } + } + /// Finish animation + public bool FinishAnim + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FINISH_ANIM); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_FINISH_ANIM, value); } + } + /// Stand up from a sit + public bool StandUp + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP, value); } + } + /// Tells simulator to sit agent on ground + public bool SitOnGround + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND, value); } + } + /// Place agent into mouselook mode + public bool Mouselook + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK, value); } + } + /// Nudge agent positive along the X axis + public bool NudgeAtPos + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS, value); } + } + /// Nudge agent negative along the X axis + public bool NudgeAtNeg + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG, value); } + } + /// Nudge agent positive along the Y axis + public bool NudgeLeftPos + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS, value); } + } + /// Nudge agent negative along the Y axis + public bool NudgeLeftNeg + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG, value); } + } + /// Nudge agent positive along the Z axis + public bool NudgeUpPos + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS, value); } + } + /// Nudge agent negative along the Z axis + public bool NudgeUpNeg + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG, value); } + } + /// + public bool TurnLeft + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT, value); } + } + /// + public bool TurnRight + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT, value); } + } + /// Tell simulator to mark agent as away + public bool Away + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_AWAY); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_AWAY, value); } + } + /// + public bool LButtonDown + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN, value); } + } + /// + public bool LButtonUp + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP, value); } + } + /// + public bool MLButtonDown + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN, value); } + } + /// + public bool MLButtonUp + { + get { return GetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_UP); } + set { SetControlFlag(AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_UP, value); } + } + /// + /// Returns "always run" value, or changes it by sending a SetAlwaysRunPacket + /// + public bool AlwaysRun + { + get + { + return alwaysRun; + } + set + { + alwaysRun = value; + SetAlwaysRunPacket run = new SetAlwaysRunPacket(); + run.AgentData.AgentID = Client.Self.AgentID; + run.AgentData.SessionID = Client.Self.SessionID; + run.AgentData.AlwaysRun = alwaysRun; + Client.Network.SendPacket(run); + } + } + /// The current value of the agent control flags + public uint AgentControls + { + get { return agentControls; } + } + + /// Gets or sets the interval in milliseconds at which + /// AgentUpdate packets are sent to the current simulator. Setting + /// this to a non-zero value will also enable the packet sending if + /// it was previously off, and setting it to zero will disable + public int UpdateInterval + { + get + { + return updateInterval; + } + set + { + if (value > 0) + { + if (updateTimer != null) + { + updateTimer.Change(value, value); + } + updateInterval = value; + } + else + { + if (updateTimer != null) + { + updateTimer.Change(Timeout.Infinite, Timeout.Infinite); + } + updateInterval = 0; + } + } + } + /// Gets or sets whether AgentUpdate packets are sent to + /// the current simulator + public bool UpdateEnabled + { + get { return (updateInterval != 0); } + } + + /// Reset movement controls every time we send an update + public bool AutoResetControls + { + get { return autoResetControls; } + set { autoResetControls = value; } + } + + #endregion Properties + + /// Agent camera controls + public AgentCamera Camera; + /// Currently only used for hiding your group title + public AgentFlags Flags = AgentFlags.None; + /// Action state of the avatar, which can currently be + /// typing and editing + public AgentState State = AgentState.None; + /// + public Quaternion BodyRotation = Quaternion.Identity; + /// + public Quaternion HeadRotation = Quaternion.Identity; + + #region Change tracking + /// + private Quaternion LastBodyRotation; + /// + private Quaternion LastHeadRotation; + /// + private Vector3 LastCameraCenter; + /// + private Vector3 LastCameraXAxis; + /// + private Vector3 LastCameraYAxis; + /// + private Vector3 LastCameraZAxis; + /// + private float LastFar; + #endregion Change tracking + + private bool alwaysRun; + private GridClient Client; + private uint agentControls; + private int duplicateCount; + private AgentState lastState; + /// Timer for sending AgentUpdate packets + private Timer updateTimer; + private int updateInterval; + private bool autoResetControls; + + /// Default constructor + public AgentMovement(GridClient client) + { + Client = client; + Camera = new AgentCamera(); + Client.Network.LoginProgress += Network_OnConnected; + Client.Network.Disconnected += Network_OnDisconnected; + updateInterval = Settings.DEFAULT_AGENT_UPDATE_INTERVAL; + } + + private void CleanupTimer() + { + if (updateTimer != null) + { + updateTimer.Dispose(); + updateTimer = null; + } + } + + private void Network_OnDisconnected(object sender, DisconnectedEventArgs e) + { + CleanupTimer(); + } + + private void Network_OnConnected(object sender, LoginProgressEventArgs e) + { + if (e.Status == LoginStatus.Success) + { + CleanupTimer(); + updateTimer = new Timer(new TimerCallback(UpdateTimer_Elapsed), null, updateInterval, updateInterval); + } + } + + /// + /// Send an AgentUpdate with the camera set at the current agent + /// position and pointing towards the heading specified + /// + /// Camera rotation in radians + /// Whether to send the AgentUpdate reliable + /// or not + public void UpdateFromHeading(double heading, bool reliable) + { + Camera.Position = Client.Self.SimPosition; + Camera.LookDirection(heading); + + BodyRotation.Z = (float)Math.Sin(heading / 2.0d); + BodyRotation.W = (float)Math.Cos(heading / 2.0d); + HeadRotation = BodyRotation; + + SendUpdate(reliable); + } + + /// + /// Rotates the avatar body and camera toward a target position. + /// This will also anchor the camera position on the avatar /// /// Region coordinates to turn toward public bool TurnToward(Vector3 target) { return TurnToward(target, true); - } - - /// - /// Rotates the avatar body and camera toward a target position. - /// This will also anchor the camera position on the avatar + } + + /// + /// Rotates the avatar body and camera toward a target position. + /// This will also anchor the camera position on the avatar /// /// Region coordinates to turn toward - /// whether to send update or not - public bool TurnToward(Vector3 target, bool sendUpdate) - { - if (Client.Settings.SEND_AGENT_UPDATES) - { - Quaternion parentRot = Quaternion.Identity; - - if (Client.Self.SittingOn > 0) - { - if (!Client.Network.CurrentSim.ObjectsPrimitives.ContainsKey(Client.Self.SittingOn)) - { - Logger.Log("Attempted TurnToward but parent prim is not in dictionary", Helpers.LogLevel.Warning, Client); - return false; - } - else parentRot = Client.Network.CurrentSim.ObjectsPrimitives[Client.Self.SittingOn].Rotation; - } - - Quaternion between = Vector3.RotationBetween(Vector3.UnitX, Vector3.Normalize(target - Client.Self.SimPosition)); - Quaternion rot = between * (Quaternion.Identity / parentRot); - - BodyRotation = rot; - HeadRotation = rot; - Camera.LookAt(Client.Self.SimPosition, target); - - if (sendUpdate) SendUpdate(); - - return true; - } - else - { - Logger.Log("Attempted TurnToward but agent updates are disabled", Helpers.LogLevel.Warning, Client); - return false; - } - } - - /// - /// Send new AgentUpdate packet to update our current camera - /// position and rotation - /// - public void SendUpdate() - { - SendUpdate(false, Client.Network.CurrentSim); - } - - /// - /// Send new AgentUpdate packet to update our current camera - /// position and rotation - /// - /// Whether to require server acknowledgement - /// of this packet - public void SendUpdate(bool reliable) - { - SendUpdate(reliable, Client.Network.CurrentSim); - } - - /// - /// Send new AgentUpdate packet to update our current camera - /// position and rotation - /// - /// Whether to require server acknowledgement - /// of this packet - /// Simulator to send the update to - public void SendUpdate(bool reliable, Simulator simulator) - { - // Since version 1.40.4 of the Linden simulator, sending this update - // causes corruption of the agent position in the simulator - if (simulator != null && (!simulator.AgentMovementComplete)) - return; - - Vector3 origin = Camera.Position; - Vector3 xAxis = Camera.LeftAxis; - Vector3 yAxis = Camera.AtAxis; - Vector3 zAxis = Camera.UpAxis; - - // Attempted to sort these in a rough order of how often they might change - if (agentControls == 0 && - yAxis == LastCameraYAxis && - origin == LastCameraCenter && - State == lastState && - HeadRotation == LastHeadRotation && - BodyRotation == LastBodyRotation && - xAxis == LastCameraXAxis && - Camera.Far == LastFar && - zAxis == LastCameraZAxis) - { - ++duplicateCount; - } - else - { - duplicateCount = 0; - } - - if (Client.Settings.DISABLE_AGENT_UPDATE_DUPLICATE_CHECK || duplicateCount < 10) - { - // Store the current state to do duplicate checking - LastHeadRotation = HeadRotation; - LastBodyRotation = BodyRotation; - LastCameraYAxis = yAxis; - LastCameraCenter = origin; - LastCameraXAxis = xAxis; - LastCameraZAxis = zAxis; - LastFar = Camera.Far; - lastState = State; - - // Build the AgentUpdate packet and send it - AgentUpdatePacket update = new AgentUpdatePacket(); - update.Header.Reliable = reliable; - - update.AgentData.AgentID = Client.Self.AgentID; - update.AgentData.SessionID = Client.Self.SessionID; - update.AgentData.HeadRotation = HeadRotation; - update.AgentData.BodyRotation = BodyRotation; - update.AgentData.CameraAtAxis = yAxis; - update.AgentData.CameraCenter = origin; - update.AgentData.CameraLeftAxis = xAxis; - update.AgentData.CameraUpAxis = zAxis; - update.AgentData.Far = Camera.Far; - update.AgentData.State = (byte)State; - update.AgentData.ControlFlags = agentControls; - update.AgentData.Flags = (byte)Flags; - - Client.Network.SendPacket(update, simulator); - - if (autoResetControls) { - ResetControlFlags(); - } - } - } - - /// - /// Builds an AgentUpdate packet entirely from parameters. This - /// will not touch the state of Self.Movement or - /// Self.Movement.Camera in any way - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - public void SendManualUpdate(AgentManager.ControlFlags controlFlags, Vector3 position, Vector3 forwardAxis, - Vector3 leftAxis, Vector3 upAxis, Quaternion bodyRotation, Quaternion headRotation, float farClip, - AgentFlags flags, AgentState state, bool reliable) - { - // Since version 1.40.4 of the Linden simulator, sending this update - // causes corruption of the agent position in the simulator - if (Client.Network.CurrentSim != null && (!Client.Network.CurrentSim.HandshakeComplete)) - return; - - AgentUpdatePacket update = new AgentUpdatePacket(); - - update.AgentData.AgentID = Client.Self.AgentID; - update.AgentData.SessionID = Client.Self.SessionID; - update.AgentData.BodyRotation = bodyRotation; - update.AgentData.HeadRotation = headRotation; - update.AgentData.CameraCenter = position; - update.AgentData.CameraAtAxis = forwardAxis; - update.AgentData.CameraLeftAxis = leftAxis; - update.AgentData.CameraUpAxis = upAxis; - update.AgentData.Far = farClip; - update.AgentData.ControlFlags = (uint)controlFlags; - update.AgentData.Flags = (byte)flags; - update.AgentData.State = (byte)state; - - update.Header.Reliable = reliable; - - Client.Network.SendPacket(update); - } - - private bool GetControlFlag(ControlFlags flag) - { - return (agentControls & (uint)flag) != 0; - } - - private void SetControlFlag(ControlFlags flag, bool value) - { - if (value) agentControls |= (uint)flag; - else agentControls &= ~((uint)flag); - } - - public void ResetControlFlags() - { - // Reset all of the flags except for persistent settings like - // away, fly, mouselook, and crouching - agentControls &= - (uint)(ControlFlags.AGENT_CONTROL_AWAY | - ControlFlags.AGENT_CONTROL_FLY | - ControlFlags.AGENT_CONTROL_MOUSELOOK | - ControlFlags.AGENT_CONTROL_UP_NEG); - } - - private void UpdateTimer_Elapsed(object obj) - { - if (Client.Network.Connected && Client.Settings.SEND_AGENT_UPDATES) - { - //Send an AgentUpdate packet - SendUpdate(false, Client.Network.CurrentSim); - } - } - } - } -} + /// whether to send update or not + public bool TurnToward(Vector3 target, bool sendUpdate) + { + if (Client.Settings.SEND_AGENT_UPDATES) + { + Quaternion parentRot = Quaternion.Identity; + + if (Client.Self.SittingOn > 0) + { + if (!Client.Network.CurrentSim.ObjectsPrimitives.ContainsKey(Client.Self.SittingOn)) + { + Logger.Log("Attempted TurnToward but parent prim is not in dictionary", Helpers.LogLevel.Warning, Client); + return false; + } + else parentRot = Client.Network.CurrentSim.ObjectsPrimitives[Client.Self.SittingOn].Rotation; + } + + Quaternion between = Vector3.RotationBetween(Vector3.UnitX, Vector3.Normalize(target - Client.Self.SimPosition)); + Quaternion rot = between * (Quaternion.Identity / parentRot); + + BodyRotation = rot; + HeadRotation = rot; + Camera.LookAt(Client.Self.SimPosition, target); + + if (sendUpdate) SendUpdate(); + + return true; + } + else + { + Logger.Log("Attempted TurnToward but agent updates are disabled", Helpers.LogLevel.Warning, Client); + return false; + } + } + + /// + /// Send new AgentUpdate packet to update our current camera + /// position and rotation + /// + public void SendUpdate() + { + SendUpdate(false, Client.Network.CurrentSim); + } + + /// + /// Send new AgentUpdate packet to update our current camera + /// position and rotation + /// + /// Whether to require server acknowledgement + /// of this packet + public void SendUpdate(bool reliable) + { + SendUpdate(reliable, Client.Network.CurrentSim); + } + + /// + /// Send new AgentUpdate packet to update our current camera + /// position and rotation + /// + /// Whether to require server acknowledgement + /// of this packet + /// Simulator to send the update to + public void SendUpdate(bool reliable, Simulator simulator) + { + // Since version 1.40.4 of the Linden simulator, sending this update + // causes corruption of the agent position in the simulator + if (simulator != null && (!simulator.AgentMovementComplete)) + return; + + Vector3 origin = Camera.Position; + Vector3 xAxis = Camera.LeftAxis; + Vector3 yAxis = Camera.AtAxis; + Vector3 zAxis = Camera.UpAxis; + + // Attempted to sort these in a rough order of how often they might change + if (agentControls == 0 && + yAxis == LastCameraYAxis && + origin == LastCameraCenter && + State == lastState && + HeadRotation == LastHeadRotation && + BodyRotation == LastBodyRotation && + xAxis == LastCameraXAxis && + Camera.Far == LastFar && + zAxis == LastCameraZAxis) + { + ++duplicateCount; + } + else + { + duplicateCount = 0; + } + + if (Client.Settings.DISABLE_AGENT_UPDATE_DUPLICATE_CHECK || duplicateCount < 10) + { + // Store the current state to do duplicate checking + LastHeadRotation = HeadRotation; + LastBodyRotation = BodyRotation; + LastCameraYAxis = yAxis; + LastCameraCenter = origin; + LastCameraXAxis = xAxis; + LastCameraZAxis = zAxis; + LastFar = Camera.Far; + lastState = State; + + // Build the AgentUpdate packet and send it + AgentUpdatePacket update = new AgentUpdatePacket(); + update.Header.Reliable = reliable; + + update.AgentData.AgentID = Client.Self.AgentID; + update.AgentData.SessionID = Client.Self.SessionID; + update.AgentData.HeadRotation = HeadRotation; + update.AgentData.BodyRotation = BodyRotation; + update.AgentData.CameraAtAxis = yAxis; + update.AgentData.CameraCenter = origin; + update.AgentData.CameraLeftAxis = xAxis; + update.AgentData.CameraUpAxis = zAxis; + update.AgentData.Far = Camera.Far; + update.AgentData.State = (byte)State; + update.AgentData.ControlFlags = agentControls; + update.AgentData.Flags = (byte)Flags; + + Client.Network.SendPacket(update, simulator); + + if (autoResetControls) { + ResetControlFlags(); + } + } + } + + /// + /// Builds an AgentUpdate packet entirely from parameters. This + /// will not touch the state of Self.Movement or + /// Self.Movement.Camera in any way + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public void SendManualUpdate(AgentManager.ControlFlags controlFlags, Vector3 position, Vector3 forwardAxis, + Vector3 leftAxis, Vector3 upAxis, Quaternion bodyRotation, Quaternion headRotation, float farClip, + AgentFlags flags, AgentState state, bool reliable) + { + // Since version 1.40.4 of the Linden simulator, sending this update + // causes corruption of the agent position in the simulator + if (Client.Network.CurrentSim != null && (!Client.Network.CurrentSim.HandshakeComplete)) + return; + + AgentUpdatePacket update = new AgentUpdatePacket(); + + update.AgentData.AgentID = Client.Self.AgentID; + update.AgentData.SessionID = Client.Self.SessionID; + update.AgentData.BodyRotation = bodyRotation; + update.AgentData.HeadRotation = headRotation; + update.AgentData.CameraCenter = position; + update.AgentData.CameraAtAxis = forwardAxis; + update.AgentData.CameraLeftAxis = leftAxis; + update.AgentData.CameraUpAxis = upAxis; + update.AgentData.Far = farClip; + update.AgentData.ControlFlags = (uint)controlFlags; + update.AgentData.Flags = (byte)flags; + update.AgentData.State = (byte)state; + + update.Header.Reliable = reliable; + + Client.Network.SendPacket(update); + } + + private bool GetControlFlag(ControlFlags flag) + { + return (agentControls & (uint)flag) != 0; + } + + private void SetControlFlag(ControlFlags flag, bool value) + { + if (value) agentControls |= (uint)flag; + else agentControls &= ~((uint)flag); + } + + public void ResetControlFlags() + { + // Reset all of the flags except for persistent settings like + // away, fly, mouselook, and crouching + agentControls &= + (uint)(ControlFlags.AGENT_CONTROL_AWAY | + ControlFlags.AGENT_CONTROL_FLY | + ControlFlags.AGENT_CONTROL_MOUSELOOK | + ControlFlags.AGENT_CONTROL_UP_NEG); + } + + private void UpdateTimer_Elapsed(object obj) + { + if (Client.Network.Connected && Client.Settings.SEND_AGENT_UPDATES) + { + //Send an AgentUpdate packet + SendUpdate(false, Client.Network.CurrentSim); + } + } + } + } +} From 090dcedab317e320de3d7006868600d0c3eca4b9 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Thu, 21 Feb 2013 23:40:37 +0100 Subject: [PATCH 52/57] Fixed camera direction sent to the sim in AgentUpdate --- OpenMetaverse/AgentManagerMovement.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenMetaverse/AgentManagerMovement.cs b/OpenMetaverse/AgentManagerMovement.cs index 435eba16..7d0e0755 100644 --- a/OpenMetaverse/AgentManagerMovement.cs +++ b/OpenMetaverse/AgentManagerMovement.cs @@ -647,9 +647,9 @@ namespace OpenMetaverse update.AgentData.SessionID = Client.Self.SessionID; update.AgentData.HeadRotation = HeadRotation; update.AgentData.BodyRotation = BodyRotation; - update.AgentData.CameraAtAxis = yAxis; + update.AgentData.CameraAtAxis = xAxis; update.AgentData.CameraCenter = origin; - update.AgentData.CameraLeftAxis = xAxis; + update.AgentData.CameraLeftAxis = yAxis; update.AgentData.CameraUpAxis = zAxis; update.AgentData.Far = Camera.Far; update.AgentData.State = (byte)State; From d703f21a6c08ddffd27de8bd14fb1f73190fdafd Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Fri, 22 Feb 2013 14:07:32 +0100 Subject: [PATCH 53/57] Don't crash trying to enable voice on a system with no sound card --- OpenMetaverse/Voice/VoiceGateway.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/OpenMetaverse/Voice/VoiceGateway.cs b/OpenMetaverse/Voice/VoiceGateway.cs index 45058923..1cba246b 100644 --- a/OpenMetaverse/Voice/VoiceGateway.cs +++ b/OpenMetaverse/Voice/VoiceGateway.cs @@ -316,6 +316,10 @@ namespace OpenMetaverse.Voice break; case "Aux.GetCaptureDevices.1": inputDevices = new List(); + + if (rsp.Results.CaptureDevices.Count == 0 || rsp.Results.CurrentCaptureDevice == null) + break; + foreach (CaptureDevice device in rsp.Results.CaptureDevices) inputDevices.Add(device.Device); currentCaptureDevice = rsp.Results.CurrentCaptureDevice.Device; @@ -335,8 +339,14 @@ namespace OpenMetaverse.Voice break; case "Aux.GetRenderDevices.1": outputDevices = new List(); + + if (rsp.Results.RenderDevices.Count == 0 || rsp.Results.CurrentRenderDevice == null) + break; + foreach (RenderDevice device in rsp.Results.RenderDevices) outputDevices.Add(device.Device); + + currentPlaybackDevice = rsp.Results.CurrentRenderDevice.Device; if (OnAuxGetRenderDevicesResponse != null) From 61b7c70c65b421bdd0b4df4616265e310e037a97 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sun, 24 Feb 2013 01:25:54 +0100 Subject: [PATCH 54/57] Some grids send UTF-8 bom char with their xml response --- OpenMetaverse.StructuredData/StructuredData.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/OpenMetaverse.StructuredData/StructuredData.cs b/OpenMetaverse.StructuredData/StructuredData.cs index 87d253cb..bcc2088a 100644 --- a/OpenMetaverse.StructuredData/StructuredData.cs +++ b/OpenMetaverse.StructuredData/StructuredData.cs @@ -1178,6 +1178,18 @@ namespace OpenMetaverse.StructuredData { string header = Encoding.ASCII.GetString(data, 0, data.Length >= 17 ? 17 : data.Length); + try + { + string uHeader = Encoding.UTF8.GetString(data, 0, data.Length >= 17 ? 17 : data.Length).TrimStart(); + if (uHeader.StartsWith(LLSD_XML_HEADER, StringComparison.InvariantCultureIgnoreCase) || + uHeader.StartsWith(LLSD_XML_ALT_HEADER, StringComparison.InvariantCultureIgnoreCase) || + uHeader.StartsWith(LLSD_XML_ALT2_HEADER, StringComparison.InvariantCultureIgnoreCase)) + { + return DeserializeLLSDXml(data); + } + } + catch { } + if (header.StartsWith(LLSD_BINARY_HEADER, StringComparison.InvariantCultureIgnoreCase)) { return DeserializeLLSDBinary(data); From 12f29799ac7ff5c55b09382c6d68efbba83907fc Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Wed, 27 Feb 2013 15:11:41 +0100 Subject: [PATCH 55/57] Make camera follow TestClient so it can find objects --- Programs/examples/TestClient/TestClient.cs | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/Programs/examples/TestClient/TestClient.cs b/Programs/examples/TestClient/TestClient.cs index 395315ec..4223e662 100644 --- a/Programs/examples/TestClient/TestClient.cs +++ b/Programs/examples/TestClient/TestClient.cs @@ -52,6 +52,9 @@ namespace OpenMetaverse.TestClient Network.RegisterCallback(PacketType.AgentDataUpdate, AgentDataUpdateHandler); Network.LoginProgress += LoginHandler; + Objects.AvatarUpdate += new EventHandler(Objects_AvatarUpdate); + Objects.TerseObjectUpdate += new EventHandler(Objects_TerseObjectUpdate); + Network.SimChanged += new EventHandler(Network_SimChanged); Self.IM += Self_IM; Groups.GroupMembersReply += GroupMembersHandler; Inventory.InventoryObjectOffered += Inventory_OnInventoryObjectReceived; @@ -64,6 +67,42 @@ namespace OpenMetaverse.TestClient updateTimer.Start(); } + void Objects_TerseObjectUpdate(object sender, TerseObjectUpdateEventArgs e) + { + if (e.Prim.LocalID == Self.LocalID) + { + SetDefaultCamera(); + } + } + + void Objects_AvatarUpdate(object sender, AvatarUpdateEventArgs e) + { + if (e.Avatar.LocalID == Self.LocalID) + { + SetDefaultCamera(); + } + } + + void Network_SimChanged(object sender, SimChangedEventArgs e) + { + OpenMetaverse.Packets.AgentFOVPacket msg = new OpenMetaverse.Packets.AgentFOVPacket(); + msg.AgentData.AgentID = Self.AgentID; + msg.AgentData.SessionID = Self.SessionID; + msg.AgentData.CircuitCode = Network.CircuitCode; + msg.FOVBlock.GenCounter = 0; + msg.FOVBlock.VerticalAngle = Utils.TWO_PI; + Network.SendPacket(msg); + } + + public void SetDefaultCamera() + { + Self.Movement.Camera.LookAt( + Self.SimPosition + new Vector3(-5, 0, 0) * Self.Movement.BodyRotation, + Self.SimPosition + ); + } + + void Self_IM(object sender, InstantMessageEventArgs e) { bool groupIM = e.IM.GroupIM && GroupMembers != null && GroupMembers.ContainsKey(e.IM.FromAgentID) ? true : false; From 40dfae115aacba033b937112fe04717f8dd888ec Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Wed, 27 Feb 2013 22:46:16 +0100 Subject: [PATCH 56/57] Added a comment and reduced a FOV just a tiny bit --- Programs/examples/TestClient/TestClient.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Programs/examples/TestClient/TestClient.cs b/Programs/examples/TestClient/TestClient.cs index 4223e662..53024117 100644 --- a/Programs/examples/TestClient/TestClient.cs +++ b/Programs/examples/TestClient/TestClient.cs @@ -90,12 +90,13 @@ namespace OpenMetaverse.TestClient msg.AgentData.SessionID = Self.SessionID; msg.AgentData.CircuitCode = Network.CircuitCode; msg.FOVBlock.GenCounter = 0; - msg.FOVBlock.VerticalAngle = Utils.TWO_PI; + msg.FOVBlock.VerticalAngle = Utils.TWO_PI - 0.05f; Network.SendPacket(msg); } public void SetDefaultCamera() { + // SetCamera 5m behind the avatar Self.Movement.Camera.LookAt( Self.SimPosition + new Vector3(-5, 0, 0) * Self.Movement.BodyRotation, Self.SimPosition From f8f8e616b37a7ea22b7922b2331999bc06725bf9 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Mon, 4 Mar 2013 08:33:08 +0100 Subject: [PATCH 57/57] Added KillObjects event to allow for more efficient processing of the kill messages by the apps --- OpenMetaverse/ObjectManager.cs | 68 ++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/OpenMetaverse/ObjectManager.cs b/OpenMetaverse/ObjectManager.cs index e8685792..52e1a62c 100644 --- a/OpenMetaverse/ObjectManager.cs +++ b/OpenMetaverse/ObjectManager.cs @@ -166,6 +166,7 @@ namespace OpenMetaverse #region Delegates + #region ObjectUpdate event /// The event subscribers, null of no subscribers private EventHandler m_ObjectUpdate; @@ -181,7 +182,9 @@ namespace OpenMetaverse add { lock (m_ObjectUpdateLock) { m_ObjectUpdate += value; } } remove { lock (m_ObjectUpdateLock) { m_ObjectUpdate -= value; } } } + #endregion ObjectUpdate event + #region ObjectProperties event /// The event subscribers, null of no subscribers private EventHandler m_ObjectProperties; @@ -231,7 +234,9 @@ namespace OpenMetaverse add { lock (m_ObjectPropertiesUpdatedLock) { m_ObjectPropertiesUpdated += value; } } remove { lock (m_ObjectPropertiesUpdatedLock) { m_ObjectPropertiesUpdated -= value; } } } + #endregion ObjectProperties event + #region ObjectPropertiesFamily event /// The event subscribers, null of no subscribers private EventHandler m_ObjectPropertiesFamily; @@ -256,7 +261,9 @@ namespace OpenMetaverse add { lock (m_ObjectPropertiesFamilyLock) { m_ObjectPropertiesFamily += value; } } remove { lock (m_ObjectPropertiesFamilyLock) { m_ObjectPropertiesFamily -= value; } } } + #endregion ObjectPropertiesFamily + #region AvatarUpdate event /// The event subscribers, null of no subscribers private EventHandler m_AvatarUpdate; @@ -280,7 +287,9 @@ namespace OpenMetaverse add { lock (m_AvatarUpdateLock) { m_AvatarUpdate += value; } } remove { lock (m_AvatarUpdateLock) { m_AvatarUpdate -= value; } } } + #endregion AvatarUpdate event + #region TerseObjectUpdate event /// The event subscribers, null of no subscribers private EventHandler m_TerseObjectUpdate; @@ -294,7 +303,9 @@ namespace OpenMetaverse add { lock (m_TerseObjectUpdateLock) { m_TerseObjectUpdate += value; } } remove { lock (m_TerseObjectUpdateLock) { m_TerseObjectUpdate -= value; } } } + #endregion TerseObjectUpdate event + #region ObjectDataBlockUpdate event /// The event subscribers, null of no subscribers private EventHandler m_ObjectDataBlockUpdate; @@ -318,7 +329,9 @@ namespace OpenMetaverse add { lock (m_ObjectDataBlockUpdateLock) { m_ObjectDataBlockUpdate += value; } } remove { lock (m_ObjectDataBlockUpdateLock) { m_ObjectDataBlockUpdate -= value; } } } + #endregion ObjectDataBlockUpdate event + #region KillObject event /// The event subscribers, null of no subscribers private EventHandler m_KillObject; @@ -342,7 +355,35 @@ namespace OpenMetaverse add { lock (m_KillObjectLock) { m_KillObject += value; } } remove { lock (m_KillObjectLock) { m_KillObject -= value; } } } + #endregion KillObject event + #region KillObjects event + /// The event subscribers, null of no subscribers + private EventHandler m_KillObjects; + + ///Raises the KillObjects Event + /// A KillObjectsEventArgs object containing + /// the data sent from the simulator + protected virtual void OnKillObjects(KillObjectsEventArgs e) + { + EventHandler handler = m_KillObjects; + if (handler != null) + handler(this, e); + } + + /// Thread sync lock object + private readonly object m_KillObjectsLock = new object(); + + /// Raised when the simulator informs us when a group of + /// or is no longer within view + public event EventHandler KillObjects + { + add { lock (m_KillObjectsLock) { m_KillObjects += value; } } + remove { lock (m_KillObjectsLock) { m_KillObjects -= value; } } + } + #endregion KillObjects event + + #region AvatarSitChanged event /// The event subscribers, null of no subscribers private EventHandler m_AvatarSitChanged; @@ -366,7 +407,9 @@ namespace OpenMetaverse add { lock (m_AvatarSitChangedLock) { m_AvatarSitChanged += value; } } remove { lock (m_AvatarSitChangedLock) { m_AvatarSitChanged -= value; } } } + #endregion AvatarSitChanged event + #region PayPriceReply event /// The event subscribers, null of no subscribers private EventHandler m_PayPriceReply; @@ -390,7 +433,9 @@ namespace OpenMetaverse add { lock (m_PayPriceReplyLock) { m_PayPriceReply += value; } } remove { lock (m_PayPriceReplyLock) { m_PayPriceReply -= value; } } } + #endregion PayPriceReply + #region PhysicsProperties event /// /// Callback for getting object media data via CAP /// @@ -424,6 +469,7 @@ namespace OpenMetaverse add { lock (m_PhysicsPropertiesLock) { m_PhysicsProperties += value; } } remove { lock (m_PhysicsPropertiesLock) { m_PhysicsProperties -= value; } } } + #endregion PhysicsProperties event #endregion Delegates @@ -2617,10 +2663,13 @@ namespace OpenMetaverse // Notify first, so that handler has a chance to get a // reference from the ObjectTracker to the object being killed + uint[] killed = new uint[kill.ObjectData.Length]; for (int i = 0; i < kill.ObjectData.Length; i++) { OnKillObject(new KillObjectEventArgs(simulator, kill.ObjectData[i].ID)); + killed[i] = kill.ObjectData[i].ID; } + OnKillObjects(new KillObjectsEventArgs(e.Simulator, killed)); lock (simulator.ObjectsPrimitives.Dictionary) @@ -3594,6 +3643,25 @@ namespace OpenMetaverse } } + /// Provides notification when an Avatar, Object or Attachment is DeRezzed or moves out of the avatars view for the + /// event + public class KillObjectsEventArgs : EventArgs + { + private readonly Simulator m_Simulator; + private readonly uint[] m_ObjectLocalIDs; + + /// Get the simulator the object is located + public Simulator Simulator { get { return m_Simulator; } } + /// The LocalID of the object + public uint[] ObjectLocalIDs { get { return m_ObjectLocalIDs; } } + + public KillObjectsEventArgs(Simulator simulator, uint[] objectIDs) + { + this.m_Simulator = simulator; + this.m_ObjectLocalIDs = objectIDs; + } + } + /// /// Provides updates sit position data ///