Re: Technical Introduction update ?

Karl Rasche <[email protected]> Mon, 28 Mar 2016 17:31:04 -0700
Newsgroups gmane.comp.video.openexr.devel
Message-ID <CAD5HwvQ8YERCXYbPcAOyVKc8gZNmtecp0uUwOF4RXy8HEfNsPg@mail.gmail.com>
I agree its a little funky to have a compression scheme (or 4 in this case)
within a compression type, but its much nicer than accidently lossy
compressing your z channel.

There isn't a great way to introspect it, short of a hex editor (the
choices made are recorded at the start of the compressed block).

I've had to use that giant comment myself a few times to refresh my memory
after being away from the code a while.

Karl

On Monday, March 28, 2016, Deke Kincaid <[email protected]> wrote:

> Ahh got it.  I thought exrheader would explicitly say "zip, individual
> scanlines" next to those parts and not "dwa, small scanline". blocks".  Is
> there a way to introspect the compression for each part that dwaa is doing
> auto-magically?
>
> Richard: sorry for hijacking your thread 😈  It appears a lot of this is
> explained in the header for ImfDwaCompressor.cpp.  Most of the time the top
> of the EXR source is just copy-write data and basic comments so I didn't
> realize there as a whole book chapter in there on the topic. 😀
>
> On Mon, Mar 28, 2016 at 4:43 PM, Karl Rasche <[email protected]
> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>
>>
>> Ahh; I see what you are saying.
>>
>> The filtering we're talking about happens internally when you set the
>> compressor = DWAA or DWAB. You won't see the affect in exrheader.
>>
>> So in your example there are multiple parts, all set to DWAB. But only
>> part 3 will be lossy compressed, and of that, only the A channel.
>>
>> Parts 0-2 will be lossless.
>>
>> Karl
>>
>> On Mon, Mar 28, 2016 at 4:35 PM, Deke Kincaid <[email protected]
>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>
>>> The channel filtering you and Piotr mentioned as being automatic does
>>> not occur.  Every part whether it has XYZ, UV, Z, etc... is written with
>>> dwa compression.
>>>
>>> On Mon, Mar 28, 2016 at 4:29 PM, Karl Rasche <[email protected]
>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>>
>>>>
>>>> So.. what's the issue at hand then?
>>>>
>>>> On Mon, Mar 28, 2016 at 4:17 PM, Deke Kincaid <[email protected]
>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>>>
>>>>> They must be implementing something incorrectly then.  Below is a
>>>>> truncated exrheader on a file out of Nuke with the "interleave" knob set to
>>>>> "channels" which means each layer is put into a separate part..
>>>>>
>>>>> file testMultiPartChannelsdwaa.exr:
>>>>>
>>>>> file format version: 2, flags 0x1000
>>>>>
>>>>>  part 0:
>>>>> channels (type chlist):
>>>>>     x, 16-bit floating-point, sampling 1 1
>>>>>     y, 16-bit floating-point, sampling 1 1
>>>>>     z, 16-bit floating-point, sampling 1 1
>>>>> chunkCount (type int): 34
>>>>> compression (type compression): dwa, small scanline blocks
>>>>> dataWindow (type box2i): (0 240) - (2047 1315)
>>>>> displayWindow (type box2i): (0 0) - (2047 1555)
>>>>> dwaCompressionLevel (type float): 45
>>>>> lineOrder (type lineOrder): increasing y
>>>>> name (type string): "N.left"
>>>>> nuke/full_layer_names (type int): 0
>>>>> nuke/node_hash (type string): "368b9d1b87a4b787"
>>>>> nuke/version (type string): "9.0v8"
>>>>> pixelAspectRatio (type float): 1
>>>>> screenWindowCenter (type v2f): (0 0)
>>>>> screenWindowWidth (type float): 1
>>>>> type (type string): "scanlineimage"
>>>>> version (type int): 1
>>>>> view (type string): "left"
>>>>>
>>>>>  part 1:
>>>>> channels (type chlist):
>>>>>     x, 16-bit floating-point, sampling 1 1
>>>>>     y, 16-bit floating-point, sampling 1 1
>>>>>     z, 16-bit floating-point, sampling 1 1
>>>>> chunkCount (type int): 34
>>>>> compression (type compression): dwa, small scanline blocks
>>>>> dataWindow (type box2i): (0 240) - (2047 1315)
>>>>> displayWindow (type box2i): (0 0) - (2047 1555)
>>>>> dwaCompressionLevel (type float): 45
>>>>> lineOrder (type lineOrder): increasing y
>>>>> name (type string): "P.left"
>>>>> pixelAspectRatio (type float): 1
>>>>> screenWindowCenter (type v2f): (0 0)
>>>>> screenWindowWidth (type float): 1
>>>>> type (type string): "scanlineimage"
>>>>> version (type int): 1
>>>>> view (type string): "left"
>>>>>
>>>>>  part 2:
>>>>> channels (type chlist):
>>>>>     Z, 16-bit floating-point, sampling 1 1
>>>>> chunkCount (type int): 34
>>>>> compression (type compression): dwa, small scanline blocks
>>>>> dataWindow (type box2i): (0 240) - (2047 1315)
>>>>> displayWindow (type box2i): (0 0) - (2047 1555)
>>>>> dwaCompressionLevel (type float): 45
>>>>> lineOrder (type lineOrder): increasing y
>>>>> name (type string): "depth.left"
>>>>> pixelAspectRatio (type float): 1
>>>>> screenWindowCenter (type v2f): (0 0)
>>>>> screenWindowWidth (type float): 1
>>>>> type (type string): "scanlineimage"
>>>>> version (type int): 1
>>>>> view (type string): "left"
>>>>>
>>>>>  part 3:
>>>>> channels (type chlist):
>>>>>     u, 16-bit floating-point, sampling 1 1
>>>>>     v, 16-bit floating-point, sampling 1 1
>>>>> chunkCount (type int): 34
>>>>> compression (type compression): dwa, small scanline blocks
>>>>> dataWindow (type box2i): (0 240) - (2047 1315)
>>>>> displayWindow (type box2i): (0 0) - (2047 1555)
>>>>> dwaCompressionLevel (type float): 45
>>>>> lineOrder (type lineOrder): increasing y
>>>>> name (type string): "motion.left"
>>>>> pixelAspectRatio (type float): 1
>>>>> screenWindowCenter (type v2f): (0 0)
>>>>> screenWindowWidth (type float): 1
>>>>> type (type string): "scanlineimage"
>>>>> version (type int): 1
>>>>> view (type string): "left"
>>>>>
>>>>>  part 4:
>>>>> channels (type chlist):
>>>>>     A, 16-bit floating-point, sampling 1 1
>>>>>     B, 16-bit floating-point, sampling 1 1
>>>>>     G, 16-bit floating-point, sampling 1 1
>>>>>     R, 16-bit floating-point, sampling 1 1
>>>>> chunkCount (type int): 34
>>>>> compression (type compression): dwa, small scanline blocks
>>>>> dataWindow (type box2i): (0 240) - (2047 1315)
>>>>> displayWindow (type box2i): (0 0) - (2047 1555)
>>>>> dwaCompressionLevel (type float): 45
>>>>> lineOrder (type lineOrder): increasing y
>>>>> name (type string): "rgba.left"
>>>>> pixelAspectRatio (type float): 1
>>>>> screenWindowCenter (type v2f): (0 0)
>>>>> screenWindowWidth (type float): 1
>>>>> type (type string): "scanlineimage"
>>>>> version (type int): 1
>>>>> view (type string): "left"
>>>>>
>>>>>
>>>>>
>>>>> On Mon, Mar 28, 2016 at 3:16 PM, Piotr Stanczyk <
>>>>> [email protected]
>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>>>>
>>>>>> +1 .. there is nothing that the client code really has to do. It's
>>>>>> purely based off the channel names.
>>>>>>
>>>>>> -Piotr
>>>>>>
>>>>>>
>>>>>> On 28 March 2016 at 15:05, Karl Rasche <[email protected]
>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>>>>>
>>>>>>> Deke -
>>>>>>>
>>>>>>> All the channel rule setup should happen automagically; there isn't
>>>>>>> anything for Nuke to setup.
>>>>>>>
>>>>>>> That said, if your channels are all named RGB going into the write
>>>>>>> node, they'll all be handled the same by the compressor.
>>>>>>>
>>>>>>> Karl
>>>>>>>
>>>>>>> On Monday, March 28, 2016, Deke Kincaid <[email protected]
>>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>>>>>>
>>>>>>>> Thanks for the info Karl.  Currently Nuke doesn't follow these
>>>>>>>> rules and when you pick DWAA and just compresses all channels the same
>>>>>>>> instead of selectively based on channel names. So we are having to write
>>>>>>>> some hackery to work around it at the moment.
>>>>>>>>
>>>>>>>> I'll put this into my feature request/bug to the Foundry.
>>>>>>>>
>>>>>>>> On Mon, Mar 28, 2016 at 2:15 PM, Karl Rasche <[email protected]>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>>
>>>>>>>>> This won't help on the documentation front, but for your question
>>>>>>>>> about how channels are handled...
>>>>>>>>>
>>>>>>>>> This is setup in initializeChannelRules()
>>>>>>>>> <https://github.com/openexr/openexr/blob/master/OpenEXR/IlmImf/ImfDwaCompressor.cpp#L3120>.
>>>>>>>>> That logic is basically saying:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>    - If the channel name is A, use a lossless RLE compression on
>>>>>>>>>    it
>>>>>>>>>    - If the channel name is {Y, BY, RY}, and the data is {FLOAT,
>>>>>>>>>    HALF}, lossy compress the channel
>>>>>>>>>    - If the channel name is {R, G, B}, and the data is {FLOAT,
>>>>>>>>>    HALF}, lossy compress the channels.
>>>>>>>>>    - If we have R, G, and B channels, convert to a color
>>>>>>>>>    difference format prior to quantization. Otherwise, deal with the channels
>>>>>>>>>    independently as-is.
>>>>>>>>>    - Otherwise, use a lossless compression on the data
>>>>>>>>>
>>>>>>>>> So channels named {y, u, U, v, V} should not be lossy compressed.
>>>>>>>>>
>>>>>>>>> The rule set that Jonathan is referring to is in
>>>>>>>>> initializeLegacyChannelRules()
>>>>>>>>> <https://github.com/openexr/openexr/blob/master/OpenEXR/IlmImf/ImfDwaCompressor.cpp#L3149>,
>>>>>>>>> and are slightly different from what 2.2 does by default.
>>>>>>>>>
>>>>>>>>> Most of this is hold-over from the time before multi-part files
>>>>>>>>> allowed more control over compression on different channel sets.
>>>>>>>>>
>>>>>>>>> Karl
>>>>>>>>>
>>>>>>>>> On Mon, Mar 28, 2016 at 1:56 PM, Richard Hadsell <
>>>>>>>>> [email protected]> wrote:
>>>>>>>>>
>>>>>>>>>> There has been discussion on the [nuke-prerelease] e-mail list
>>>>>>>>>> about DWAA and DWAB compression with OpenExr 2.2.  I checked the OpenExr
>>>>>>>>>> Technical Introduction, but was disappointed to see that it has not been
>>>>>>>>>> updated since November 2013.  Is there any chance that someone is working
>>>>>>>>>> on an update?
>>>>>>>>>>
>>>>>>>>>> It is not difficult to use DWAA and DWAB compressions, which are
>>>>>>>>>> available in the compression header.  That is not the problem.  The
>>>>>>>>>> questions that I would like to see answered pertain more to lossy vs.
>>>>>>>>>> lossless compression.  The [nuke-prerelease] discussion included
>>>>>>>>>> interesting information like this:
>>>>>>>>>>
>>>>>>>>>> On Thu, Mar 17, 2016 at 1:03 PM, Jonathan Egstad <
>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>> ...
>>>>>>>>>> > 3. Does the lossyness cause issues with data aov's, motion
>>>>>>>>>> vectors, uv, position, normals, etc...?
>>>>>>>>>>
>>>>>>>>>> Yup - it will destroy data AOVs like normals, positions, etc.  I
>>>>>>>>>> believe the codec recognizes typical color-channel names like
>>>>>>>>>> 'r/R/red/RED', etc and only lossy compresses those.  Channels it doesn't
>>>>>>>>>> recognize will get lossless compressed with I believe ZIP - alpha for
>>>>>>>>>> example is lossless compressed.
>>>>>>>>>> One gotcha is I think it traps 'Y/y, u/U, v/V' as valid color
>>>>>>>>>> channels and lossy-compresses those, which is a problem for xyz and uv
>>>>>>>>>> channels...
>>>>>>>>>> This is how our internal codec works so you might want to check
>>>>>>>>>> that the one in the official OpenEXR2.2+ release has these behaviors.
>>>>>>>>>> ...
>>>>>>>>>> (end quote)
>>>>>>>>>>
>>>>>>>>>> It would be great to see a list of those special channel names.
>>>>>>>>>> Are they the only channels that are compressed with DWAA/DWAB?  What
>>>>>>>>>> compression would be applied to the other channels?  Does this behavior
>>>>>>>>>> apply to all lossy compressions?
>>>>>>>>>>
>>>>>>>>>> I hope to see answers to these questions in an updated Technical
>>>>>>>>>> Intro (eventually).
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> Dick Hadsell			203-992-6320  Fax: 203-992-6001
>>>>>>>>>> Reply-to:			[email protected]
>>>>>>>>>> Blue Sky Studios                http://www.blueskystudios.com
>>>>>>>>>> 1 American Lane, Greenwich, CT 06831-2560
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> _______________________________________________
>>>>>>>>>> Openexr-devel mailing list
>>>>>>>>>> [email protected]
>>>>>>>>>> https://lists.nongnu.org/mailman/listinfo/openexr-devel
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> Openexr-devel mailing list
>>>>>>>>> [email protected]
>>>>>>>>> https://lists.nongnu.org/mailman/listinfo/openexr-devel
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> Openexr-devel mailing list
>>>>>>> [email protected]
>>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>
>>>>>>> https://lists.nongnu.org/mailman/listinfo/openexr-devel
>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Openexr-devel mailing list
>>>>> [email protected]
>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>
>>>>> https://lists.nongnu.org/mailman/listinfo/openexr-devel
>>>>>
>>>>>
>>>>
>>>
>>> _______________________________________________
>>> Openexr-devel mailing list
>>> [email protected]
>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>
>>> https://lists.nongnu.org/mailman/listinfo/openexr-devel
>>>
>>>
>>
>

_______________________________________________
Openexr-devel mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/openexr-devel