public void Unload() { lock (_syncLock) { _alreadyRetrieved = false; _retrieveResult = null; ResetAttemptData(); } }
public byte[] GetUncompressedPixelData() { try { //construct this object before the lock so there's no chance of deadlocking //with the parent data source (because we are accessing its tags at the //same time as it's trying to get the pixel data). FramePixelDataRetriever retriever = new FramePixelDataRetriever(this); lock (_syncLock) { RetrievePixelDataResult result; if (_retrieveResult == null) { AbortAttemptIfNecessary(); ResetAttemptData(); _retrievesAttempted++; result = retriever.Retrieve(); } else result = _retrieveResult; //free this memory up in case it's holding a compressed buffer. _retrieveResult = null; CodeClock clock = new CodeClock(); clock.Start(); //synchronize the call to decompress; it's really already synchronized by //the parent b/c it's only called from CreateFrameNormalizedPixelData, but it doesn't hurt. byte[] pixelData = result.GetPixelData(); clock.Stop(); Platform.Log(LogLevel.Debug, "[Decompress Info] Sop/Frame: {0}/{1}, Transfer Syntax: {2}, Uncompressed bytes: {3}, Elapsed (s): {4}", retriever.SopInstanceUid, FrameNumber, retriever.TransferSyntaxUid, pixelData.Length, clock.Seconds); return pixelData; } } catch(Exception ex) { _lastError = ex; throw; } }
public void Retrieve() { if (!_alreadyRetrieved) { //construct this object before the lock so there's no chance of deadlocking //with the parent data source (because we are accessing it's tags at the //same time as it's trying to get the pixel data). FramePixelDataRetriever retriever = new FramePixelDataRetriever(this); lock (_syncLock) { if (!_alreadyRetrieved) { AbortAttemptIfNecessary(); try { ResetAttemptData(); _retrievesAttempted++; var start = DateTime.Now; _retrieveResult = retriever.Retrieve(); var end = DateTime.Now; _lastRetrievePerformanceInfo = new StreamingPerformanceInfo(start, end, _retrieveResult.MetaData.ContentLength); _alreadyRetrieved = true; } catch (Exception ex) { _lastError = ex; throw; } } } } }
public ImageServerFramePixelData(RetrievePixelDataResult result) { InternalResult = result; }
public RetrievePixelDataResult RetrievePixelData(string serverAE, string studyInstanceUID, string seriesInstanceUID, string sopInstanceUid, int frame) { try { CodeClock clock = new CodeClock(); clock.Start(); FrameStreamingResultMetaData result = new FrameStreamingResultMetaData(); StringBuilder url = new StringBuilder(); if (_baseUri.ToString().EndsWith("/")) { url.AppendFormat("{0}{1}", _baseUri, serverAE); } else { url.AppendFormat("{0}/{1}", _baseUri, serverAE); } url.AppendFormat("?requesttype=WADO&studyUID={0}&seriesUID={1}&objectUID={2}", studyInstanceUID, seriesInstanceUID, sopInstanceUid); url.AppendFormat("&frameNumber={0}", frame); url.AppendFormat("&contentType={0}", HttpUtility.HtmlEncode("application/clearcanvas")); result.Speed.Start(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url.ToString()); request.Accept = "application/dicom,application/clearcanvas,image/jpeg"; request.Timeout = (int)TimeSpan.FromSeconds(StreamingSettings.Default.ClientTimeoutSeconds).TotalMilliseconds; request.KeepAlive = false; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); if (response.StatusCode != HttpStatusCode.OK) { throw new StreamingClientException(response.StatusCode, HttpUtility.HtmlDecode(response.StatusDescription)); } Stream responseStream = response.GetResponseStream(); BinaryReader reader = new BinaryReader(responseStream); byte[] buffer = reader.ReadBytes((int)response.ContentLength); reader.Close(); responseStream.Close(); response.Close(); result.Speed.SetData(buffer.Length); result.Speed.End(); result.ResponseMimeType = response.ContentType; result.Status = response.StatusCode; result.StatusDescription = response.StatusDescription; result.Uri = response.ResponseUri; result.ContentLength = buffer.Length; result.IsLast = (response.Headers["IsLast"] != null && bool.Parse(response.Headers["IsLast"])); clock.Stop(); PerformanceReportBroker.PublishReport("Streaming", "RetrievePixelData", clock.Seconds); RetrievePixelDataResult pixelDataResult; if (response.Headers["Compressed"] != null && bool.Parse(response.Headers["Compressed"])) { pixelDataResult = new RetrievePixelDataResult(CreateCompressedPixelData(response, buffer), result); } else { pixelDataResult = new RetrievePixelDataResult(buffer, result); } return(pixelDataResult); } catch (WebException ex) { if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response is HttpWebResponse) { HttpWebResponse response = (HttpWebResponse)ex.Response; throw new StreamingClientException(response.StatusCode, HttpUtility.HtmlDecode(response.StatusDescription)); } throw new StreamingClientException(StreamingClientExceptionType.Network, ex); } }
public RetrievePixelDataResult RetrievePixelData(string serverAE, string studyInstanceUID, string seriesInstanceUID, string sopInstanceUid, int frame) { try { CodeClock clock = new CodeClock(); clock.Start(); FrameStreamingResultMetaData result = new FrameStreamingResultMetaData(); StringBuilder url = new StringBuilder(); if (_baseUri.ToString().EndsWith("/")) { url.AppendFormat("{0}{1}", _baseUri, serverAE); } else { url.AppendFormat("{0}/{1}", _baseUri, serverAE); } url.AppendFormat("?requesttype=WADO&studyUID={0}&seriesUID={1}&objectUID={2}", studyInstanceUID, seriesInstanceUID, sopInstanceUid); url.AppendFormat("&frameNumber={0}", frame); url.AppendFormat("&contentType={0}", HttpUtility.HtmlEncode("application/clearcanvas")); result.Speed.Start(); HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url.ToString()); request.Accept = "application/dicom,application/clearcanvas,image/jpeg"; request.Timeout = (int) TimeSpan.FromSeconds(StreamingSettings.Default.ClientTimeoutSeconds).TotalMilliseconds; request.KeepAlive = false; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); if (response.StatusCode != HttpStatusCode.OK) { throw new StreamingClientException(response.StatusCode, HttpUtility.HtmlDecode(response.StatusDescription)); } Stream responseStream = response.GetResponseStream(); BinaryReader reader = new BinaryReader(responseStream); byte[] buffer = reader.ReadBytes((int) response.ContentLength); reader.Close(); responseStream.Close(); response.Close(); result.Speed.SetData(buffer.Length); result.Speed.End(); result.ResponseMimeType = response.ContentType; result.Status = response.StatusCode; result.StatusDescription = response.StatusDescription; result.Uri = response.ResponseUri; result.ContentLength = buffer.Length; result.IsLast = (response.Headers["IsLast"] != null && bool.Parse(response.Headers["IsLast"])); clock.Stop(); PerformanceReportBroker.PublishReport("Streaming", "RetrievePixelData", clock.Seconds); RetrievePixelDataResult pixelDataResult; if (response.Headers["Compressed"] != null && bool.Parse(response.Headers["Compressed"])) pixelDataResult = new RetrievePixelDataResult(CreateCompressedPixelData(response, buffer), result); else pixelDataResult = new RetrievePixelDataResult(buffer, result); return pixelDataResult; } catch (WebException ex) { if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response is HttpWebResponse) { HttpWebResponse response = (HttpWebResponse) ex.Response; throw new StreamingClientException(response.StatusCode, HttpUtility.HtmlDecode(response.StatusDescription)); } throw new StreamingClientException(StreamingClientExceptionType.Network, ex); } }