Skip to content

Build correctly against OCIO 2.x (in progress) #2530

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 30, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/workflows/workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ jobs:
source src/build-scripts/ci-build-and-test.bash

linux-bleeding:
name: "Linux bleeding edge: gcc9, C++17, avx2, exr 2.4"
name: "Linux bleeding edge: gcc9, C++17, avx2, exr 2.4, OCIO master"
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v1
Expand All @@ -79,6 +79,7 @@ jobs:
CMAKE_CXX_STANDARD: 17
USE_SIMD: avx2,f16c
OPENEXR_BRANCH: v2.4.0
OCIO_BRANCH: master
run: |
source src/build-scripts/ci-startup.bash
source src/build-scripts/gh-installdeps.bash
Expand Down
41 changes: 39 additions & 2 deletions src/libOpenImageIO/color_ocio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -591,12 +591,39 @@ ColorConfig::configname() const


#ifdef USE_OCIO

# if OCIO_VERSION_HEX >= 0x02000000
inline OCIO::BitDepth
ocio_bitdepth(TypeDesc type)
{
if (type == TypeDesc::UINT8)
return OCIO::BIT_DEPTH_UINT8;
if (type == TypeDesc::UINT16)
return OCIO::BIT_DEPTH_UINT16;
if (type == TypeDesc::UINT32)
return OCIO::BIT_DEPTH_UINT32;
// N.B.: OCIOv2 also supports 10, 12, and 14 bit int, but we won't

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure exactly what you use this function for, but I just wanted to clarify something in case it may be helpful ... The OCIO BitDepth enum is unchanged from v1. What has changed is that we can now process image buffers that are not F32. However we did not add support for all of the BitDepths that v1 declared. The pixel types we support in v2 are UINT8, UINT10, UINT12, UINT16, F16, and F32. Note that we do not support (that is, are unable to process) the UINT14 or UINT32 pixel types.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, that's good to know. I will adjust the comments.

Currently, the rest of OIIO's interface with OCIO assumes (from v1) that it can only handle float, so that's the only kind of buffer that's passed into this section. But when v2 is released, there are probably places where I can accommodate that without needing to do data type conversions first.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In case it could help OCIOv2 now supports the channel ordering for PackedImageDesc:

enum ChannelOrdering
{
    CHANNEL_ORDERING_RGBA = 0,
    CHANNEL_ORDERING_BGRA,
    CHANNEL_ORDERING_ABGR,
    CHANNEL_ORDERING_RGB,
    CHANNEL_ORDERING_BGR
};

// ever have data in that format at this stage.
if (type == TypeDesc::HALF)
return OCIO::BIT_DEPTH_F16;
if (type == TypeDesc::FLOAT)
return OCIO::BIT_DEPTH_F32;
return OCIO::BIT_DEPTH_UNKNOWN;
}
# endif


// Custom ColorProcessor that wraps an OpenColorIO Processor.
class ColorProcessor_OCIO : public ColorProcessor {
public:
ColorProcessor_OCIO(OCIO::ConstProcessorRcPtr p)
: m_p(p) {};
virtual ~ColorProcessor_OCIO(void) {};
: m_p(p)
# if OCIO_VERSION_HEX >= 0x02000000
, m_cpuproc(p->getDefaultCPUProcessor())
# endif
{
}
virtual ~ColorProcessor_OCIO(void) {}

virtual bool isNoOp() const { return m_p->isNoOp(); }
virtual bool hasChannelCrosstalk() const
Expand All @@ -607,13 +634,23 @@ class ColorProcessor_OCIO : public ColorProcessor {
stride_t chanstride, stride_t xstride,
stride_t ystride) const
{
# if OCIO_VERSION_HEX >= 0x02000000
OCIO::PackedImageDesc pid(data, width, height, channels,
OCIO::BIT_DEPTH_F32, // For now, only float
chanstride, xstride, ystride);
m_cpuproc->apply(pid);
# else
OCIO::PackedImageDesc pid(data, width, height, channels, chanstride,
xstride, ystride);
m_p->apply(pid);
# endif
}

private:
OCIO::ConstProcessorRcPtr m_p;
# if OCIO_VERSION_HEX >= 0x02000000
OCIO::ConstCPUProcessorRcPtr m_cpuproc;
# endif
};
#endif

Expand Down
12 changes: 12 additions & 0 deletions testsuite/python-colorconfig/ref/out-ocio2-python27.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
getNumColorSpaces = 14
getColorSpaceNames = [u'linear', u'sRGB', u'sRGBf', u'rec709', u'Cineon', u'Gamma1.8', u'Gamma2.2', u'Panalog', u'REDLog', u'ViperLog', u'AlexaV3LogC', u'PLogLin', u'SLog', u'raw']
getNumLooks = 0
getLookNames = []
getNumDisplays = 1
getDisplayNames = [u'default']
getDefaultDisplayName = default
getNumViews = 1
getViewNames = [u'sRGB']
getDefaultViewName =

Done.
12 changes: 12 additions & 0 deletions testsuite/python-colorconfig/ref/out-ocio2.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
getNumColorSpaces = 14
getColorSpaceNames = ['linear', 'sRGB', 'sRGBf', 'rec709', 'Cineon', 'Gamma1.8', 'Gamma2.2', 'Panalog', 'REDLog', 'ViperLog', 'AlexaV3LogC', 'PLogLin', 'SLog', 'raw']
getNumLooks = 0
getLookNames = []
getNumDisplays = 1
getDisplayNames = ['default']
getDefaultDisplayName = default
getNumViews = 1
getViewNames = ['sRGB']
getDefaultViewName =

Done.