#include <mfapi.h>
#include "videobufferlock.h"
VideoBufferLock::VideoBufferLock(IMFMediaBuffer *aBuffer) : m2DBuffer(NULL), mLocked(FALSE)
{
mBuffer = aBuffer;
mBuffer->AddRef();
(void)mBuffer->QueryInterface(IID_PPV_ARGS(&m2DBuffer));
}
VideoBufferLock::~VideoBufferLock()
{
UnlockBuffer();
if (mBuffer)
mBuffer->Release();
if (m2DBuffer)
m2DBuffer->Release();
}
HRESULT VideoBufferLock::LockBuffer(
LONG aDefaultStride, DWORD aHeightInPixels, BYTE **aScanLine0, LONG *aStride )
{
HRESULT hr = S_OK;
if (m2DBuffer)
{
hr = m2DBuffer->Lock2D(aScanLine0, aStride);
}
else
{
BYTE *data = NULL;
hr = mBuffer->Lock(&data, NULL, NULL);
if (SUCCEEDED(hr))
{
*aStride = aDefaultStride;
if (aDefaultStride < 0)
{
*aScanLine0 = data + abs(aDefaultStride) * (aHeightInPixels - 1);
}
else
{
*aScanLine0 = data;
}
}
}
mLocked = (SUCCEEDED(hr));
return hr;
}
void VideoBufferLock::UnlockBuffer()
{
if (mLocked)
{
if (m2DBuffer)
{
(void)m2DBuffer->Unlock2D();
}
else
{
(void)mBuffer->Unlock();
}
mLocked = FALSE;
}
}