use linesize workaround for setting OIIO pixels as well as getting
This commit is contained in:
@@ -231,6 +231,35 @@ QString OIIODecoder::GetIndexFilename()
|
|||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OIIODecoder::FrameToBuffer(FramePtr frame, OpenImageIO_v2_1::ImageBuf *buf)
|
||||||
|
{
|
||||||
|
#if OIIO_VERSION < 20112
|
||||||
|
//
|
||||||
|
// Workaround for OIIO bug that ignores destination stride in versions OLDER than 2.1.12
|
||||||
|
//
|
||||||
|
// See more: https://github.com/OpenImageIO/oiio/pull/2487
|
||||||
|
//
|
||||||
|
int width_in_bytes = frame->width() * PixelFormat::BytesPerPixel(frame->format());
|
||||||
|
|
||||||
|
for (int i=0;i<buf->spec().height;i++) {
|
||||||
|
memcpy(
|
||||||
|
#if OIIO_VERSION < 10903
|
||||||
|
reinterpret_cast<char*>(buf->localpixels()) + i * width_in_bytes,
|
||||||
|
#else
|
||||||
|
reinterpret_cast<char*>(buf->localpixels()) + i * buf->scanline_stride(),
|
||||||
|
#endif
|
||||||
|
frame->data() + i * frame->linesize_bytes(),
|
||||||
|
width_in_bytes);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
buf->set_pixels(OIIO::ROI(),
|
||||||
|
buf->spec().format,
|
||||||
|
frame->data(),
|
||||||
|
OIIO::AutoStride,
|
||||||
|
frame->linesize_bytes());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void OIIODecoder::BufferToFrame(OIIO::ImageBuf *buf, FramePtr frame)
|
void OIIODecoder::BufferToFrame(OIIO::ImageBuf *buf, FramePtr frame)
|
||||||
{
|
{
|
||||||
#if OIIO_VERSION < 20112
|
#if OIIO_VERSION < 20112
|
||||||
@@ -239,9 +268,9 @@ void OIIODecoder::BufferToFrame(OIIO::ImageBuf *buf, FramePtr frame)
|
|||||||
//
|
//
|
||||||
// See more: https://github.com/OpenImageIO/oiio/pull/2487
|
// See more: https://github.com/OpenImageIO/oiio/pull/2487
|
||||||
//
|
//
|
||||||
for (int i=0;i<buf->spec().height;i++) {
|
int width_in_bytes = frame->width() * PixelFormat::BytesPerPixel(frame->format());
|
||||||
int width_in_bytes = frame->width() * PixelFormat::BytesPerPixel(frame->format());
|
|
||||||
|
|
||||||
|
for (int i=0;i<buf->spec().height;i++) {
|
||||||
memcpy(frame->data() + i * frame->linesize_bytes(),
|
memcpy(frame->data() + i * frame->linesize_bytes(),
|
||||||
#if OIIO_VERSION < 10903
|
#if OIIO_VERSION < 10903
|
||||||
reinterpret_cast<const char*>(buf->localpixels()) + i * width_in_bytes,
|
reinterpret_cast<const char*>(buf->localpixels()) + i * width_in_bytes,
|
||||||
|
|||||||
@@ -48,6 +48,8 @@ public:
|
|||||||
|
|
||||||
virtual QString GetIndexFilename() override;
|
virtual QString GetIndexFilename() override;
|
||||||
|
|
||||||
|
static void FrameToBuffer(FramePtr frame, OIIO::ImageBuf* buf);
|
||||||
|
|
||||||
static void BufferToFrame(OIIO::ImageBuf* buf, FramePtr frame);
|
static void BufferToFrame(OIIO::ImageBuf* buf, FramePtr frame);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -230,11 +230,7 @@ FramePtr PixelFormat::ConvertPixelFormat(FramePtr frame, const PixelFormat::Form
|
|||||||
|
|
||||||
// Set the pixels (this is necessary as opposed to an OIIO buffer wrapper since Frame has
|
// Set the pixels (this is necessary as opposed to an OIIO buffer wrapper since Frame has
|
||||||
// linesizes)
|
// linesizes)
|
||||||
src.set_pixels(OIIO::ROI(),
|
OIIODecoder::FrameToBuffer(frame, &src);
|
||||||
GetOIIOTypeDesc(frame->format()),
|
|
||||||
frame->const_data(),
|
|
||||||
OIIO::AutoStride,
|
|
||||||
frame->linesize_bytes());
|
|
||||||
|
|
||||||
// Create a destination OIIO buffer with our destination format
|
// Create a destination OIIO buffer with our destination format
|
||||||
OIIO::ImageBuf dst(OIIO::ImageSpec(converted->width(),
|
OIIO::ImageBuf dst(OIIO::ImageSpec(converted->width(),
|
||||||
|
|||||||
Reference in New Issue
Block a user