diff options
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs | 37 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs | 23 |
2 files changed, 48 insertions, 12 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs b/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs index 6cffd70..b186720 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs | |||
@@ -60,14 +60,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
60 | private sbyte m_discardLevel=-1; | 60 | private sbyte m_discardLevel=-1; |
61 | private uint m_packetNumber; | 61 | private uint m_packetNumber; |
62 | private bool m_decoderequested = false; | 62 | private bool m_decoderequested = false; |
63 | private bool m_hasasset = false; | 63 | public bool m_hasasset = false; |
64 | private bool m_asset_requested = false; | 64 | private bool m_asset_requested = false; |
65 | private bool m_sentinfo = false; | 65 | private bool m_sentinfo = false; |
66 | private uint m_stopPacket = 0; | 66 | private uint m_stopPacket = 0; |
67 | private const int cImagePacketSize = 1000; | 67 | private const int cImagePacketSize = 1000; |
68 | private const int cFirstPacketSize = 600; | 68 | private const int cFirstPacketSize = 600; |
69 | |||
69 | private AssetBase m_asset = null; | 70 | private AssetBase m_asset = null; |
71 | private int m_assetDataLength = 0; | ||
72 | |||
70 | private LLImageManager m_image; | 73 | private LLImageManager m_image; |
74 | |||
71 | public J2KImage(LLImageManager image) | 75 | public J2KImage(LLImageManager image) |
72 | { | 76 | { |
73 | m_image = image; | 77 | m_image = image; |
@@ -99,7 +103,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
99 | return 0; | 103 | return 0; |
100 | try | 104 | try |
101 | { | 105 | { |
102 | return (ushort)(((m_asset.Data.Length - cFirstPacketSize + cImagePacketSize - 1) / cImagePacketSize) + 1); | 106 | return (ushort)(((m_assetDataLength - cFirstPacketSize + cImagePacketSize - 1) / cImagePacketSize) + 1); |
103 | } | 107 | } |
104 | catch (Exception) | 108 | catch (Exception) |
105 | { | 109 | { |
@@ -110,6 +114,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
110 | } | 114 | } |
111 | } | 115 | } |
112 | 116 | ||
117 | public void DropAsset() | ||
118 | { | ||
119 | m_log.WarnFormat("[LLIMAGE MANAGER]: Dropping texture asset {0}", m_requestedUUID); | ||
120 | m_asset = null; | ||
121 | m_hasasset = false; | ||
122 | m_asset_requested = false; | ||
123 | } | ||
124 | |||
113 | public void J2KDecodedCallback(UUID AssetId, OpenJPEG.J2KLayerInfo[] layers) | 125 | public void J2KDecodedCallback(UUID AssetId, OpenJPEG.J2KLayerInfo[] layers) |
114 | { | 126 | { |
115 | m_image.m_outstandingtextures++; | 127 | m_image.m_outstandingtextures++; |
@@ -127,8 +139,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
127 | } | 139 | } |
128 | else | 140 | else |
129 | { | 141 | { |
130 | m_asset = asset; | 142 | m_asset = asset; |
131 | } | 143 | } |
144 | |||
145 | m_assetDataLength = m_asset.Data.Length; | ||
146 | |||
132 | RunUpdate(); | 147 | RunUpdate(); |
133 | } | 148 | } |
134 | 149 | ||
@@ -150,8 +165,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
150 | public int LastPacketSize() | 165 | public int LastPacketSize() |
151 | { | 166 | { |
152 | if (m_packetNumber == 1) | 167 | if (m_packetNumber == 1) |
153 | return m_asset.Data.Length; | 168 | return m_assetDataLength; |
154 | int lastsize = (m_asset.Data.Length - cFirstPacketSize) % cImagePacketSize; | 169 | int lastsize = (m_assetDataLength - cFirstPacketSize) % cImagePacketSize; |
155 | //If the last packet size is zero, it's really cImagePacketSize, it sits on the boundary | 170 | //If the last packet size is zero, it's really cImagePacketSize, it sits on the boundary |
156 | if (lastsize == 0) | 171 | if (lastsize == 0) |
157 | { | 172 | { |
@@ -185,10 +200,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
185 | return true; | 200 | return true; |
186 | } | 201 | } |
187 | // Do we have less then 1 packet's worth of data? | 202 | // Do we have less then 1 packet's worth of data? |
188 | else if (m_asset.Data.Length <= cFirstPacketSize) | 203 | else if (m_assetDataLength <= cFirstPacketSize) |
189 | { | 204 | { |
190 | // Send only 1 packet | 205 | // Send only 1 packet |
191 | client.SendImageFirstPart(1, m_requestedUUID, (uint)m_asset.Data.Length, m_asset.Data, 2); | 206 | client.SendImageFirstPart(1, m_requestedUUID, (uint)m_assetDataLength, m_asset.Data, 2); |
192 | m_stopPacket = 0; | 207 | m_stopPacket = 0; |
193 | return true; | 208 | return true; |
194 | } | 209 | } |
@@ -198,7 +213,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
198 | try | 213 | try |
199 | { | 214 | { |
200 | Buffer.BlockCopy(m_asset.Data, 0, firstImageData, 0, (int)cFirstPacketSize); | 215 | Buffer.BlockCopy(m_asset.Data, 0, firstImageData, 0, (int)cFirstPacketSize); |
201 | client.SendImageFirstPart(TexturePacketCount(), m_requestedUUID, (uint)m_asset.Data.Length, firstImageData, 2); | 216 | client.SendImageFirstPart(TexturePacketCount(), m_requestedUUID, (uint)m_assetDataLength, firstImageData, 2); |
202 | } | 217 | } |
203 | catch (Exception) | 218 | catch (Exception) |
204 | { | 219 | { |
@@ -216,13 +231,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
216 | 231 | ||
217 | try | 232 | try |
218 | { | 233 | { |
219 | if ((CurrentBytePosition() + cImagePacketSize) > m_asset.Data.Length) | 234 | if ((CurrentBytePosition() + cImagePacketSize) > m_assetDataLength) |
220 | { | 235 | { |
221 | imagePacketSize = LastPacketSize(); | 236 | imagePacketSize = LastPacketSize(); |
222 | complete=true; | 237 | complete=true; |
223 | if ((CurrentBytePosition() + imagePacketSize) > m_asset.Data.Length) | 238 | if ((CurrentBytePosition() + imagePacketSize) > m_assetDataLength) |
224 | { | 239 | { |
225 | imagePacketSize = m_asset.Data.Length - CurrentBytePosition(); | 240 | imagePacketSize = m_assetDataLength - CurrentBytePosition(); |
226 | complete = true; | 241 | complete = true; |
227 | } | 242 | } |
228 | } | 243 | } |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs b/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs index 295a5e6..b039049 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs | |||
@@ -257,6 +257,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
257 | J2KImage imagereq = m_imagestore[m_priorities.Values[x]]; | 257 | J2KImage imagereq = m_imagestore[m_priorities.Values[x]]; |
258 | if (imagereq.m_decoded == true && !imagereq.m_completedSendAtCurrentDiscardLevel) | 258 | if (imagereq.m_decoded == true && !imagereq.m_completedSendAtCurrentDiscardLevel) |
259 | { | 259 | { |
260 | // we need to test this here now that we are dropping assets | ||
261 | if (!imagereq.m_hasasset) | ||
262 | { | ||
263 | m_log.WarnFormat("[LLIMAGE MANAGER]: Re-requesting the image asset {0}", imagereq.m_requestedUUID); | ||
264 | imagereq.RunUpdate(); | ||
265 | continue; | ||
266 | } | ||
267 | |||
260 | numCollected++; | 268 | numCollected++; |
261 | //SendPackets will send up to ten packets per cycle | 269 | //SendPackets will send up to ten packets per cycle |
262 | if (imagereq.SendPackets(m_client, maxpack)) | 270 | if (imagereq.SendPackets(m_client, maxpack)) |
@@ -264,8 +272,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
264 | //Send complete | 272 | //Send complete |
265 | if (!imagereq.m_completedSendAtCurrentDiscardLevel) | 273 | if (!imagereq.m_completedSendAtCurrentDiscardLevel) |
266 | { | 274 | { |
267 | imagereq.m_completedSendAtCurrentDiscardLevel = true; | 275 | // I think this field imagereq.m_completedSendAtCurrentDiscardLevel |
276 | // is completely redundant | ||
277 | //imagereq.m_completedSendAtCurrentDiscardLevel = true; | ||
278 | |||
268 | Interlocked.Decrement(ref m_outstandingtextures); | 279 | Interlocked.Decrement(ref m_outstandingtextures); |
280 | |||
281 | // First and foremost, drop the reference to the asset | ||
282 | // so that the asset doesn't stay in memory forever. | ||
283 | // We'll Get it again from the asset service (usually cache) | ||
284 | // if/when the client requests it again. | ||
285 | // In order not to mess much with the current implementation | ||
286 | // of this management code, we drop only the asset reference | ||
287 | // but keep the image request itself. | ||
288 | imagereq.DropAsset(); | ||
289 | |||
269 | //Re-assign priority to bottom | 290 | //Re-assign priority to bottom |
270 | //Remove the old priority | 291 | //Remove the old priority |
271 | m_priorities.Remove(imagereq.m_designatedPriorityKey); | 292 | m_priorities.Remove(imagereq.m_designatedPriorityKey); |