#include "config.h"
#include "QTPixelBuffer.h"
#include <CFString.h>
#include <CGColorSpace.h>
#include <CGImage.h>
#include <CVPixelBuffer.h>
#include <QuickDraw.h>
#include <memory.h>
QTPixelBuffer::QTPixelBuffer()
: m_pixelBuffer(0)
{
}
QTPixelBuffer::QTPixelBuffer(const QTPixelBuffer& p)
: m_pixelBuffer(p.m_pixelBuffer)
{
CVPixelBufferRetain(m_pixelBuffer);
}
QTPixelBuffer::QTPixelBuffer(CVPixelBufferRef ref)
: m_pixelBuffer(ref)
{
CVPixelBufferRetain(m_pixelBuffer);
}
QTPixelBuffer::~QTPixelBuffer()
{
clear();
}
QTPixelBuffer& QTPixelBuffer::operator=(const QTPixelBuffer& p)
{
set(p.m_pixelBuffer);
return *this;
}
void QTPixelBuffer::set(CVPixelBufferRef ref)
{
CVPixelBufferRetain(ref);
CVPixelBufferRelease(m_pixelBuffer);
m_pixelBuffer = ref;
}
CVPixelBufferRef QTPixelBuffer::pixelBufferRef()
{
return m_pixelBuffer;
}
void QTPixelBuffer::adopt(CVPixelBufferRef ref)
{
if (ref == m_pixelBuffer)
return;
CVPixelBufferRelease(m_pixelBuffer);
m_pixelBuffer = ref;
}
void QTPixelBuffer::clear()
{
CVPixelBufferRelease(m_pixelBuffer);
m_pixelBuffer = 0;
}
CVReturn QTPixelBuffer::lockBaseAddress()
{
return CVPixelBufferLockBaseAddress(m_pixelBuffer, 0);
}
CVReturn QTPixelBuffer::unlockBaseAddress()
{
return CVPixelBufferUnlockBaseAddress(m_pixelBuffer, 0);
}
void* QTPixelBuffer::baseAddress()
{
return CVPixelBufferGetBaseAddress(m_pixelBuffer);
}
size_t QTPixelBuffer::width() const
{
return CVPixelBufferGetWidth(m_pixelBuffer);
}
size_t QTPixelBuffer::height() const
{
return CVPixelBufferGetHeight(m_pixelBuffer);
}
unsigned long QTPixelBuffer::pixelFormatType() const
{
return CVPixelBufferGetPixelFormatType(m_pixelBuffer);
}
bool QTPixelBuffer::pixelFormatIs32ARGB() const
{
return CVPixelBufferGetPixelFormatType(m_pixelBuffer) == k32ARGBPixelFormat;
}
bool QTPixelBuffer::pixelFormatIs32BGRA() const
{
return CVPixelBufferGetPixelFormatType(m_pixelBuffer) == k32BGRAPixelFormat;
}
size_t QTPixelBuffer::bytesPerRow() const
{
return CVPixelBufferGetBytesPerRow(m_pixelBuffer);
}
size_t QTPixelBuffer::dataSize() const
{
return CVPixelBufferGetDataSize(m_pixelBuffer);
}
bool QTPixelBuffer::isPlanar() const
{
return CVPixelBufferIsPlanar(m_pixelBuffer);
}
size_t QTPixelBuffer::planeCount() const
{
return CVPixelBufferGetPlaneCount(m_pixelBuffer);
}
size_t QTPixelBuffer::widthOfPlane(size_t plane) const
{
return CVPixelBufferGetWidthOfPlane(m_pixelBuffer, plane);
}
size_t QTPixelBuffer::heightOfPlane(size_t plane) const
{
return CVPixelBufferGetHeightOfPlane(m_pixelBuffer, plane);
}
void* QTPixelBuffer::baseAddressOfPlane(size_t plane) const
{
return CVPixelBufferGetBaseAddressOfPlane(m_pixelBuffer, plane);
}
size_t QTPixelBuffer::bytesPerRowOfPlane(size_t plane) const
{
return CVPixelBufferGetBytesPerRowOfPlane(m_pixelBuffer, plane);
}
void QTPixelBuffer::getExtendedPixels(size_t* left, size_t* right, size_t* top, size_t* bottom) const
{
return CVPixelBufferGetExtendedPixels(m_pixelBuffer, left, right, top, bottom);
}
CFDictionaryRef QTPixelBuffer::attachments() const
{
return CVBufferGetAttachments(m_pixelBuffer, kCVAttachmentMode_ShouldPropagate);
}
void QTPixelBuffer::retainCallback(void* refcon)
{
CVPixelBufferRetain(static_cast<CVPixelBufferRef>(refcon));
}
void QTPixelBuffer::releaseCallback(void* refcon)
{
CVPixelBufferRelease(static_cast<CVPixelBufferRef>(refcon));
}
void QTPixelBuffer::imageQueueReleaseCallback(unsigned int type, uint64_t id, void* refcon)
{
CVPixelBufferRelease(static_cast<CVPixelBufferRef>(refcon));
}
void QTPixelBuffer::dataProviderReleaseBytePointerCallback(void* refcon, const void* pointer)
{
CVPixelBufferUnlockBaseAddress(static_cast<CVPixelBufferRef>(refcon), 0);
}
const void* QTPixelBuffer::dataProviderGetBytePointerCallback(void* refcon)
{
CVPixelBufferLockBaseAddress(static_cast<CVPixelBufferRef>(refcon), 0);
return CVPixelBufferGetBaseAddress(static_cast<CVPixelBufferRef>(refcon));
}
size_t QTPixelBuffer::dataProviderGetBytesAtPositionCallback(void* refcon, void* buffer, size_t position, size_t count)
{
char* data = (char*)CVPixelBufferGetBaseAddress(static_cast<CVPixelBufferRef>(refcon));
size_t size = CVPixelBufferGetDataSize(static_cast<CVPixelBufferRef>(refcon));
if (size - position < count)
count = size - position;
memcpy(buffer, data+position, count);
return count;
}
void QTPixelBuffer::dataProviderReleaseInfoCallback(void* refcon)
{
CVPixelBufferRelease(static_cast<CVPixelBufferRef>(refcon));
}