use linesize workaround for setting OIIO pixels as well as getting

This commit is contained in:
itsmattkc
2020-05-02 22:51:29 +10:00
parent 90597bd08a
commit 3e57cdac1d
3 changed files with 34 additions and 7 deletions
+31 -2
View File
@@ -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,
+2
View File
@@ -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:
+1 -5
View File
@@ -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(),