Raúl
Moderator
 Moderator
| Posts: 434 |  | Karma: 6
|
Re:Simulated WebCam exception in QueryFrame - 2007/09/18 13:25
The code after making the mentioned changes is as follows (this code seems to work ok. I am unsure whether or not some frames are loss when the method is called when the simulator engine has blocked the image).
| Code: | // Raul - Service handler changed from Concurrent to Exclusive.
[ServiceHandler(ServiceHandlerBehavior.Exclusive)]
public IEnumerator<ITask> QueryFrameHandler(webcam.QueryFrame query)
{
if (_state.Image == null)
{
query.ResponsePort.Post(new webcam.QueryFrameResponse());
yield break;
}
Size size = new Size((int)query.Body.Size.X, (int)query.Body.Size.Y);
if (query.Body.Format == Guid.Empty)
{
// raw image requested;
BitmapData raw = null;
try
{
// Raul - This check moved into the try-catch block.
// size not specified
if (size.Width == 0)
size = _state.Image.Size;
raw = _state.Image.LockBits(new Rectangle(Point.Empty, size),
ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
int byteSize = raw.Height * raw.Stride;
webcam.QueryFrameResponse response = new webcam.QueryFrameResponse();
response.TimeStamp = _state.LastFrameUpdate;
response.Frame = new byte[byteSize];
response.Size = new Size(raw.Width, raw.Height);
response.Format = Guid.Empty;
System.Runtime.InteropServices.Marshal.Copy(raw.Scan0, response.Frame, 0, byteSize);
query.ResponsePort.Post(response);
}
catch (Exception ex)
{
query.ResponsePort.Post(Fault.FromException(ex));
}
finally
{
if (raw != null)
{
_state.Image.UnlockBits(raw);
}
}
}
else
{
ImageFormat format = new ImageFormat(query.Body.Format);
using (MemoryStream stream = new MemoryStream())
{
if (size == _state.Image.Size ||
size.Width == 0 ||
size.Height == 0 ||
size.Width >= _state.Image.Width ||
size.Height >= _state.Image.Height)
{
size = _state.Image.Size;
_state.Image.Save(stream, format);
}
else
{
using (Bitmap temp = new Bitmap(
_state.Image, size))
{
temp.Save(stream, format);
}
}
webcam.QueryFrameResponse response = new webcam.QueryFrameResponse();
response.TimeStamp = _state.LastFrameUpdate;
response.Frame = new byte[(int)stream.Length];
response.Size = size;
response.Format = format.Guid;
stream.Position = 0;
stream.Read(response.Frame, 0, response.Frame.Length);
query.ResponsePort.Post(response);
}
}
yield break;
}
|
Raúl Arrabales Moreno. conscious-robots.com/raul |