But it isn't just SMPTE timecodes. there are many different rich types
exposed in EXR metadata, some of which overlap with each other in
terms of POD types, but you would want their types to be maintained.

I agree that TypeDesc probably shouldn't describe these rich types, so
perhaps the ParamValue shouldn't take a TypeDesc and maybe needs a
more general AttributeDesc?

I have some exr's with metadata like this:

End (type string): "21:38:14:09"
Start (type string): "21:37:36:03"
timeCode (type timecode):
    time 21:37:36:03
    drop frame 0, color frame 0, field/phase 0
    bgf0 0, bgf1 0, bgf2 0
    user data 0x0

When writing this data back out, I would expect that the "End" and
"Start" attributes remain as strings, whereas the "timeCode" attribute
is written as a TimeCode instance.

The readers and writers can convert from these richer types to strings
or ints or whatever we decide on a case by case basis, as long as they
are consistent for their filetype, but I don't feel as though richer
formats should lose out on this functionality.



On Thu, Oct 10, 2013 at 4:45 PM, Larry Gritz <[email protected]> wrote:
> I'm leaning toward representing it (as it travels through the OIIO interface) 
> as a string, where we can pick the representation/convention for encoding it 
> to preserve all the original information.  There's an example (which may or 
> may not be correct and/or complete) in how we handle DPX, but I'm not at all 
> averse to changing it if we now have a better understanding of what we want.
>
> But I'm not an expert on SMPTE timecodes and how they're used, so if there's 
> a good argument for keeping it as a 64 bit int or two 32 bit ints -- for 
> example, if there is an established convention for storing them this way that 
> SMPTE experts expect -- we can probably deal with that, too.  Maybe the 
> metadata name is required to have some kind of hint (e.g., needs the 
> substring 'SMPTETime' in it somewhere).  Maybe we need to provide utility 
> functions to split the bit fields into a more self-documenting struct, and 
> back.  But I do know that I would prefer not to extend TypeDesc (and our 
> metadata passing in the ParamList) to take on the complexity of being able to 
> describe arbitrary structs, or even adding tags for one-off special purpose 
> structs. It's so nicely simple and general now.
>
> One of the best arguments I can think of for preferring strings is as 
> follows.  If you were somehow making a round trip like this
>
>         format A -> format B -> format A
>
> Now, suppose A supports SMPTE timecodes, but B does not (but does support 
> string metadata).  Merely by adopting the string<->timecode convention within 
> A's format reader/writer, the timecode would make it through the above 
> pipeline intact.  B will blindly pass the string along, and then the A writer 
> will recognize it as a timecode and deal with that appropriately.  The 
> alternative is that *every* format reader would need to recognize SMPTE 
> timecodes (even if that is not a concept native to that file format) and have 
> to deal with it in some way.  Also, the string approach lets a program like 
> 'iinfo' just print the string and be on its merry way, without needing to be 
> cluttered with timecode-specific logic.
>
>         -- lg
>
>
> On Oct 9, 2013, at 11:31 AM, Pete Black wrote:
>
>> Hi All,
>>
>> First, the below is my understanding of SMPTE timecode, it may not be 100% 
>> complete, or totally correct -
>>
>> SMPTE timecode includes both clock data - this is binary-coded decimal and 
>> takes 32 bits, and user data which is another 32 bits with unspecified 
>> content (often a 'tape name' or similar, but also containing flag bits to 
>> indicate drop frame or otr details).
>>
>> In LTC (Longitudinal timecode, as it is encoded and written to tape or sent 
>> on the wire), the 4-bit nibbles which make up each binary-coded digit in 
>> both blocks of data are interleaved, which is why a SMPTE timecode is often  
>> represented by 64 bits of packed data.
>>
>> If you wanted to read timecode off the wire, write it into a file, then read 
>> the data from the file and write it back on the wire, without parsing it at 
>> all then you might want to ensure you had a 'flat' 64-bit type for this.
>>
>> Personally I think it makes more sense to separate clock and user data into 
>> 2 32 bit fields, if you want 'raw' storage of this data - using a string 
>> representation to get and set the clock data seems ideal, but might be 
>> tricky for user data, as bitwise interpretation/manipulation of this data ( 
>> e.g. drop frame indicator bit ) may be desirable - though this usage tends 
>> to be less important now we are leaving the world of analog tape, I know we 
>> abuse it for our purposes in 48fps workflow.
>>
>> There would also be some merit in dumping the 'raw' format entirely and just 
>> reading/writing an arbitrary string for timecode, as this would work for 
>> most practical purposes ( image file metadata is reference only, and 
>> timecode is always reconstructed and sent by some application) just fine.
>>
>> Not sure if this helps too much, I guess following what the DPX format does 
>> would be good for consistency.
>>
>> -Pete
>>
>>
>> Mark Boorer <[email protected]> wrote:
>>
>>> Hi,
>>>
>>> Looking further into this, are we sure that timecode doesn't warrant a
>>> new type? EXR's can contain many metadata fields in Timecode format
>>> (not just one) and I don't think we can just give users 2 unsigned
>>> ints and be done with it. Users will probably want their timecode in
>>> string format (as is presently done in the DPX header) or at least
>>> have an easy way for converting to/from strings.
>>>
>>> Further more, I don't think it's particularly intuitive to assume that
>>> any TypeDesc of 2 UINT32 should be written as timecode, especially
>>> where I would expect a TypeDesc of 2 INT32s to be written as an
>>> ImfVecAttribute "v2i".
>>>
>>> Thoughts?
>>>
>>> Cheers,
>>> Mark
>>>
>>> On Sun, Oct 6, 2013 at 9:27 PM, Pete Black <[email protected]> wrote:
>>>> Hi All,
>>>>
>>>> DPX definitely supports timecode - and inside the DPX file, this is stored 
>>>> as a uint32 for the timecode data and a uint32 for the user data, by the 
>>>> looks
>>>>
>>>> Retrieving timecode from the DPX files we have using OIIO involves reading 
>>>> the metadata attribute 'dpx:Timecode' which returns the 'TV Industry 
>>>> specific' timecode formatted as a string e.g. '00:00:00:05'.
>>>>
>>>> -Pete
>>>>
>>>>
>>>>
>>>> I believe this maps to the
>>>>
>>>> On 7/10/2013, at 6:58 AM, Andrew Hunter <[email protected]> wrote:
>>>>
>>>>> I believe that DPX also supports SMPTE time code as well as CinemaDNG.
>>>>>
>>>>> --
>>>>> +1 416 567 9514
>>>>> [email protected]
>>>>> http://aehunter.net
>>>>>
>>>>> On 3 Oct 2013 13:14, "Larry Gritz" <[email protected]> wrote:
>>>>> I would welcome a pull request with this fully fleshed out and tested.
>>>>>
>>>>> Two more things...
>>>>>
>>>>> 1. Just to future-proof it, I might add this in there:
>>>>>
>>>>>      ASSERT(sizeof(Imf::TimeCode) == 2*sizeof(unsigned int));
>>>>>
>>>>> 2. If there are other formats that have full SMPTE timecodes, we might 
>>>>> want to instead change the attribute to "SMPTE:TimeCode" (making it not 
>>>>> be exr-specific) and dictate that any other formats follow the same 
>>>>> encoding if they have an SMPTE timecode.
>>>>>
>>>>>
>>>>> On Oct 3, 2013, at 10:07 AM, Larry Gritz wrote:
>>>>>
>>>>>> I don't think this merits a new core type.
>>>>>>
>>>>>> I would add it to the metadata as an array of two unsigned ints, which 
>>>>>> is how it's encoded in Imf::TimeCode.  You'd want something like this in 
>>>>>> exrinput.cpp:
>>>>>>
>>>>>>     static TypeDesc TwoUints (TypeDesc::UINT, 2);
>>>>>>     Imf::TimeCode tc = ...;  // get the timecode from the EXR file
>>>>>>     spec.attribute ("openexr:TimeCode", TwoUints, &tc);
>>>>>>
>>>>>> And then to extract it (including in exroutput.cpp):
>>>>>>
>>>>>>     ImageIOParameter *f = spec.find_attribute ("openexr:TimeCode", 
>>>>>> TwoUints);
>>>>>>     if (f) {
>>>>>>         Imf::TimeCode tc = *(const ImfTimeCode *) f->data();
>>>>>>         ... do your thing with tc ...
>>>>>>     }
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Oct 3, 2013, at 8:56 AM, Mark Boorer wrote:
>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> Was just looking to access timecode metadata from some EXR files, and 
>>>>>>> noticed that timecode keys aren't extracted by the reader.
>>>>>>>
>>>>>>> I then found this rather old issue 
>>>>>>> https://github.com/OpenImageIO/oiio/issues/337. Is it possible for me 
>>>>>>> to add this in? A simple class based on ImfTimeCode.h (or even just 
>>>>>>> this class directly) and a new enum added to TypeDesc?
>>>>>>>
>>>>>>> Cheers,
>>>>>>> Mark
>>>>>>
>>>>>> --
>>>>>> Larry Gritz
>>>>>> [email protected]
>>>>>>
>>>>>
>>>>> --
>>>>> Larry Gritz
>>>>> [email protected]
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Oiio-dev mailing list
>>>>> [email protected]
>>>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>>>>
>>>>> _______________________________________________
>>>>> Oiio-dev mailing list
>>>>> [email protected]
>>>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>>>
>>>> _______________________________________________
>>>> Oiio-dev mailing list
>>>> [email protected]
>>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>> _______________________________________________
>>> Oiio-dev mailing list
>>> [email protected]
>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>> _______________________________________________
>> Oiio-dev mailing list
>> [email protected]
>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>
> --
> Larry Gritz
> [email protected]
>
>
> _______________________________________________
> Oiio-dev mailing list
> [email protected]
> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
_______________________________________________
Oiio-dev mailing list
[email protected]
http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org

Reply via email to