I struggle to properly release the BitmapBuffer locked with SoftwareBitmap.LockBuffer() method in C++/CX code on UWP.
The base code looks as below (it's a OpenCV bridge sample from Microsoft available here.
bool OpenCVHelper::GetPointerToPixelData(SoftwareBitmap^ bitmap, unsigned char** pPixelData, unsigned int* capacity)
{
BitmapBuffer^ bmpBuffer = bitmap->LockBuffer(BitmapBufferAccessMode::ReadWrite);
IMemoryBufferReference^ reference = bmpBuffer->CreateReference();
ComPtr<IMemoryBufferByteAccess> pBufferByteAccess;
if ((reinterpret_cast<IInspectable*>(reference)->QueryInterface(IID_PPV_ARGS(&pBufferByteAccess))) != S_OK)
{
return false;
}
if (pBufferByteAccess->GetBuffer(pPixelData, capacity) != S_OK)
{
return false;
}
return true;
}
This buffer (pPixelData) is then used to initialize cv:Mat object (shallow copy). And is never released.
Consecutive call to LockBuffer() on the same SoftwareBitmap object raises exception:
Platform::AccessDeniedException ^ at memory location 0x00000002CEEFDCC0. HRESULT:0x80070005 Access is denied. WinRT information: Bitmap shared lock taken
How to properly release this buffer? Especially in C++/CX?
I tried to keep the reference to release it when no more needed. In C++/CX Dispose() or Close() methods are inaccessible and compiler advises to call destructor instead:
BitmapBuffer^ bmpBuffer = nullptr;
// ... get the buffer, use it
//((IDisposable^)bmpBuffer)->Dispose();
bmpBuffer->~BitmapBuffer();
But it doesn't work (does nothing). Destructor is being invoked but another call to LockBuffer() raises the same error as before.
How to properly Release BitmapBuffer from SoftwareBitmap (UWP)?
After BitmapBuffer and IMemoryBufferReference completing their work, these objects could be closed by invoking delete expression. More details please check Destructors. For example:
SoftwareBitmap^ bitmap = ref new SoftwareBitmap(
BitmapPixelFormat::Bgra8,
100,
200,
BitmapAlphaMode::Premultiplied);
BitmapBuffer^ bmpBuffer = bitmap->LockBuffer(BitmapBufferAccessMode::ReadWrite);
IMemoryBufferReference^ reference = bmpBuffer->CreateReference();
delete reference;
delete bmpBuffer;
BitmapBuffer^ bmpBuffer2 = bitmap->LockBuffer(BitmapBufferAccessMode::ReadWrite);
As above code snippet showed, after delete the BitmapBuffer object, you could lock the buffer again successfully.
User contributions licensed under CC BY-SA 3.0