AcademySoftwareFoundation / AcademySoftwareFoundation/OpenImageIO
bug: `oiiotool --attrib` apply beyond the top image when `--dup` is used
- Dominant language
- C++
- Stars
- 2.4k
- Forks
- 698
- Avg merge
- 3d 4h
- Merged PRs (30d)
- 47
Description
**Describe the bug**
The [oiiotool --attrib](https://openimageio.readthedocs.io/en/latest/oiiotool.html#oiiotool-commands-that-change-the-current-image-metadata) documentation state that it applies only to the top image.
However I had issues where it applied accross the whole image stack and it's a problem for me.
I believe that `--dup` does not clone the metadata so write attribute operations on the duplicated image go through the source images as well.
**OpenImageIO version and dependencies**
Happens on both ArchLinux version and fresh Git compiled version:
```sh
$ ./bin/oiiotool --buildinfo
OIIO 3.2.0.2dev | Linux/x86_64
Build compiler: gcc 16.2 | C++17/201703
HW features enabled at build: sse2
No CUDA support (disabled / unavailable at build time)
Dependencies: BZip2 1.0.8, DCMTK NONE, FFmpeg 8.0, fmt 12.2.0, Freetype 2.14.3, GIF 6.1.3, Imath 3.2.3, JXL 0.12.0, libdeflate 1.26, Libheif 1.23.2,
libjpeg-turbo 3.2.0, LibRaw 0.22.2, libuhdr NONE, nanobind 2.13.0, OpenColorIO 2.5.1, OpenCV 5.0.0, OpenEXR 3.4.15, OpenGL, OpenJPEG 2.5.4, openjph
0.31.0, OpenVDB 13.0.0, PNG 1.6.58, Ptex 2.5, Python3 3.14.7, Qt6 6.11.2, Robinmap 1.4.1, TBB 2023.1.0, TIFF 4.7.2, WebP 1.6.0, ZLIB 1.3.2
```
**To Reproduce**
```sh
$ oiiotool \
--create 256x256 1 \
--create 256x256 4 \
--dup \
--sattrib 'Dummy' 'attribute' \
--ch R,G,B \
--siappendall \
--printinfo:allsubimages=1
```
This output :
```
256 x 256, 1 channel, float
3 subimages: 256x256 [f], 256x256 [f,f,f,f], 256x256 [f,f,f]
subimage 0: 256 x 256, 1 channel, float
channel list: Y
subimage 1: 256 x 256, 4 channel, float
channel list: R, G, B, A
Dummy: "attribute"
subimage 2: 256 x 256, 3 channel, float
channel list: R, G, B
Dummy: "attribute"
```
The Dummy attribute should only be on the last subimage but it went through the previous image as well. If you play around you see that `--dup` seem to don't clone the metadata :
```sh
$ oiiotool \
--create 256x256 1 \
--create 256x256 4 \
--dup \
--dup \
--sattrib 'Dummy' 'attribute' \
--ch R,G,B \
--siappendall \
--printinfo:allsubimages=1
```
Output:
```
256 x 256, 1 channel, float
4 subimages: 256x256 [f], 256x256 [f,f,f,f], 256x256 [f,f,f,f], 256x256 [f,f,f]
subimage 0: 256 x 256, 1 channel, float
channel list: Y
subimage 1: 256 x 256, 4 channel, float
channel list: R, G, B, A
Dummy: "attribute"
subimage 2: 256 x 256, 4 channel, float
channel list: R, G, B, A
Dummy: "attribute"
subimage 3: 256 x 256, 3 channel, float
channel list: R, G, B
Dummy: "attribute"
```
And a last one with stack reordering reinforce the hypothesis that `--dup` doesn't duplicate metadata :
```sh
oiiotool \
--create 256x256 1 \
--create 256x256 4 \
--dup \
--dup \
--create 256x256 2 \
--stackextract 1 \
--sattrib 'Dummy' 'attribute' \
--ch R,G,B \
--siappendall \
--printinfo:allsubimages=1
```
Output:
```
256 x 256, 1 channel, float
5 subimages: 256x256 [f], 256x256 [f,f,f,f], 256x256 [f,f,f,f], 256x256 [f,f], 256x256 [f,f,f]
subimage 0: 256 x 256, 1 channel, float
channel list: Y
subimage 1: 256 x 256, 4 channel, float
channel list: R, G, B, A
Dummy: "attribute"
subimage 2: 256 x 256, 4 channel, float
channel list: R, G, B, A
Dummy: "attribute"
subimage 3: 256 x 256, 2 channel, float
channel list: R, G
subimage 4: 256 x 256, 3 channel, float
channel list: R, G, B
Dummy: "attribute"
```
Contributor guide
Assessment
This issue has not been assessed yet.