--------------------------------------------------------------------------------
File:         Image/ExifTool/README

Description:  ExifTool support modules documentation

The ExifTool support modules are loaded by ExifTool to allow processing of
various meta information formats.

The tables in these files are used as lookups based on the tag ID values.  The
hash keys are the tag IDs (in decimal or hexadecimal if the ID is numerical as
with EXIF tables, or the tag name if the ID is ASCII as with XMP tables).  In
the case of a BinaryData table, the IDs are numerical and specify offsets into
the binary data block (floating point IDs allow multiple tags for the same
offset, with the integer part being used for the offset).  The corresponding
hash value provides information about the tag (explained later).

Twenty-four special keys (TABLE_NAME, SHORT_NAME, PROCESS_PROC, WRITE_PROC,
CHECK_PROC, GROUPS, FORMAT, FIRST_ENTRY, TAG_PREFIX, PRINT_CONV, WRITABLE,
TABLE_DESC, NOTES, IS_OFFSET, EXTRACT_UNKNOWN, NAMESPACE, PREFERRED, PARENT,
PRIORITY, WRITE_GROUP, LANG_INFO, VARS, DATAMEMBER and SET_GROUP1) are used to
provide additional information about a table. The special keys have names that
are all capitalized to avoid possible conflicts with tag keys.  Below is an
explanation of the meaning of each special key:

  TABLE_NAME : Name of this table (set by GetTagTable()).

  SHORT_NAME : Table name with leading "Image::ExifTool::" removed.

  PROCESS_PROC : Reference to a function used to process the directory for this
  table.  If PROCESS_PROC is not given, \&Image::ExifTool::Exif::ProcessExif is
  assumed.  If PROCESS_PROC is set to 0, the tags are not added to the lookup.
  The process proc returns 1 on success or 0 on failure, and takes 3 arguments:
  0) reference to the ExifTool object, 1) reference to a directory information
  hash (with the following entries:), 2) reference to the tag table hash.

    Name        - Tag name for this SubDirectory entry (for verbose messages)
    Base        - Base offset for pointers from start of file
    DataPt      - Reference to data block containing directory (may be undef)
    DataPos     - Position of data block within file (relative to Base)
    DataLen     - Length of data block in bytes
    DirStart    - Offset to start of directory from start of data block
    DirLen      - Length of directory data within block
    DirName     - Name of this directory
    OutFile     - Output file or scalar reference
    Parent      - Name of parent directory
    RAF         - Reference to File::RandomAccess object if available
    NewDataPos  - File position of new data (write proc only)
    Fixup       - Reference to hash of offset fixups (used in EXIF writing only)
    FixBase     - Flag set to attempt to fix base offsets
    FixOffsets  - Evaluated for each value pointer to patch maker note offsets
    LastIFD     - Used by WriteExif() to return offset of last IFD written
    ImageData   - Used by WriteExif() to avoid buffering large image data blocks

  WRITE_PROC : Reference to a function to write all new tags for this directory.
  The write proc returns the new directory data or undefined on error.  It takes
  the same arguments as the process proc above except that the second argument
  (reference to directory information hash) is optional, and if specified gives
  information about the source directory for tags to be copied to the output.

  CHECK_PROC : Reference to a function which validates Raw values for writing.
  The function takes three arguments: 0) ExifTool object reference, 1) tagInfo
  reference, 2) value reference, and returns undefined (and possibly modifies
  the input value) if successful, or an error message if there was a format
  problem.

  GROUPS : A hash lookup for the default group names for all entries in this
  table. If not specified, the Group 0 and 1 names will be set automatically
  according to the name of the module.

  FORMAT : Specifies the default tag Format and corresponding pointer increment
  for entries in a BinaryData table, and defaults to 'int8u' if not specified.
  The possible values of FORMAT are:

    int8s       - Signed 8-bit integer                    (EXIF 'SBYTE')
    int8u       - Unsigned 8-bit integer                  (EXIF 'BYTE')
    int16s      - Signed 16-bit integer                   (EXIF 'SSHORT')
    int16u      - Unsigned 16-bit integer                 (EXIF 'SHORT')
    int32s      - Signed 32-bit integer                   (EXIF 'SLONG')
    int32u      - Unsigned 32-bit integer                 (EXIF 'LONG')
    int64s      - Signed 64-bit integer                   (BigTIFF 'SLONG8')
    int64u      - Unsigned 64-bit integer                 (BigTIFF 'LONG8')
    rational32s - Rational consisting of 2 int16s values
    rational32u - Rational consisting of 2 int16u values
    rational64s - Rational consisting of 2 int32s values  (EXIF 'SRATIONAL')
    rational64u - Rational consisting of 2 int32u values  (EXIF 'RATIONAL')
    fixed16s    - Signed 16-bit fixed point value
    fixed16u    - Unsigned 16-bit fixed point value
    fixed32s    - Signed 32-bit fixed point value
    fixed32u    - Unsigned 32-bit fixed point value
    float       - 32-bit IEEE floating point value        (EXIF 'FLOAT')
    double      - 64-bit IEEE floating point value        (EXIF 'DOUBLE')
    extended    - 80-bit extended floating float
    ifd         - Unsigned 32-bit integer sub-IFD pointer (EXIF 'IFD')
    ifd8        - Unsigned 64-bit integer sub-IFD pointer (BigTIFF 'IFD8')
    string      - Series of 8-bit ASCII characters        (EXIF 'ASCII')
    pstring     - Pascal string [BinaryData tables only]
    undef       - Undefined-format binary data            (EXIF 'UNDEFINED')
    binary      - Binary data

  FIRST_ENTRY : Specifies the index for the first tag entry in a binary table.
  This value is only used if the Unknown option is set to 2 or higher, and
  allows the binary data to be scanned for unknown tag entries.

  TAG_PREFIX : Prefix for names of unknown tags.

  PRINT_CONV : Default print conversion tags where PrintConv isn't specified.

  WRITABLE : Indicates that all tags in this table are writable.  This is the
  same as setting the Writable flag for each individual tag in the table, except
  for SubDirectory tags which are not made Writable.

  TABLE_DESC : Short description for this table.  Plain text only.

  NOTES : Notes to introduce the table in the TagNames documentation.  Pod
  formatting codes B<> and C<> may be used in this text.

  IS_OFFSET : Reference to list of TagID's representing offsets for binary
  data tables only.  Not used for EXIF tables.

  EXTRACT_UNKNOWN : Used in PDF tables to specify a directory where all unknown
  tags should be extracted.  Set to 0 to extract only unknown numbered tags for
  which the unnumbered tag is known.

  NAMESPACE : Namespace prefix for tags in the XMP table.  If this isn't a
  standard (pre-defined) namespace, then the URI must be defined as well.  To do
  this, the NAMESPACE value is a reference to either a list or a hash, where the
  first element (or hash key) is the namespace prefix and and the second element
  (or hash value) is the URI.

  PREFERRED : Set to true if the tags in this table should always be added when
  writing information.  Overrides the order specified by SetNewGroups().  When
  this feature is used, it may also be desireable to specify a preferred group
  when calling InitWriteDirs() to write these tags; this avoids creating other
  directories for tags which are already being creating in the preferred group.

  PARENT : Used internally to store the parent table name of a user-defined tag
  table so the appropriate module can be loaded as required.

  PRIORITY : Default Priority for all tags in this table.

  WRITE_GROUP : Default WriteGroup for all tags in the table.

  LANG_INFO : Code reference to a routine which returns a reference to a
  language-specific tag information hash.  The routine takes two arguments: a
  reference to the non-specific tagInfo hash, and the language code. Used only
  in tables with writable tags which support tag name language extensions (ie.
  MIE and XMP).

  VARS : Hash used to store additional parameters.  Individual modules may use
  this to store any parameters they want.  The following additional parameters
  have been defined, and may be used by any module:

    ID_LABEL      Label to use instead of "Tag ID" for column heading in tag
                  name documentation.  When this is set, numerical TagID's are
                  not converted to hexadecimal notation. Unless otherwise set,
                  an ID_LABEL of "Index" is assumed for tables which use
                  ProcessBinaryData.

    NO_ID         Avoid printing "Tag ID" column in tag name documentation.

    CAPTURE       Used by PDF module to name dictionaries to capture when
                  writing.

    HAS_SUBDIR    Flag used in binary data tables to indicate that one of the
                  tags represents a subdirectory.  This is required in order to
                  write tags in nested binary subdirectories.

    MINOR_ERRORS  [EXIF tables only] Flag to make errors in this IFD minor, or
                  to downgrade already minor errors to warnings while writing.
                  (Errors in MakerNote IFD's are already classified as minor.)
                  Note that for certain types errors, the response is to delete
                  the entire IFD from the image.

  DATAMEMBER : BinaryData tables only.  A reference to a list of tag ID's which
  must be extracted as data members when writing.

  SET_GROUP1 : [EXIF tables only] Flag to set group1 name to the directory name
  for all tags in the table.

The remaining entries in a tag table are the tag IDs with their associated
information.  The information may exist in one of three forms:  1) A simple
scalar which is the name of the tag, 2) A reference to a hash of information
describing this tag, or 3) a reference to a list of hashes which contain
Condition expressions allowing the appropriate hash to be selected to suit the
conditions.  The following is a description of possible hash entries.  All
entries are optional, except for the tag Name which is required if the tag ID is
numerical.

  Name          : The tag name.  Tag names need not be unique.  If they aren't
                  unique, then duplicate tags will hide the values of previous
                  tags when extracting information unless the Duplicates option
                  is set or the new tag has lower Priority.  With Duplicates
                  set, to allow multiple tags with the same name to exist in the
                  tag information hash, the key of the previous tag is changed
                  to the form "TagName (N)", where N starts at 1 and increments
                  for subsequent duplicate tags.  A tag name should start with
                  an uppercase letter, and contain only the charcters in the set
                  [A-Za-z0-9_-].  If not given, the Name is taken from the tag
                  ID with the first character changed to upper case.

  Description   : A more readable description of tag name.  If a tag doesn't
                  specify a Description, then the tag Name is used instead, with
                  spaces inserted between the words.

  Notes         : Notes for this tag in the HTML TagNames documentation.

  Groups        : Hash lookup for group names for this tag.

  Format        : Only valid for BinaryData, EXIF and IPTC tables. For a Binary
                  or EXIF table, this gives the format that is used to convert
                  the binary data, and is one of the FORMAT types specified
                  above. For BinaryData tables, the format may have a size in
                  trailing brackets which is a perl expression to be evaluated.
                  The expression may access any of the previous table entries
                  through a %val hash, or the data size via $size. For example,
                  'string[$val{3}]' defines a string with length given by the
                  table entry with tag index '3'. If not specified, the format
                  of an EXIF entry is taken from the EXIF information, and the
                  format of a BinaryData entry is taken from the FORMAT
                  specified for the table (or int8u if FORMAT is not specified).
                  Must be specified for Writable tags where the value must be
                  converted for a Condition.

  Count         : Used when writing EXIF information to specify the number
                  values to write, or the number of characters in a fixed-length
                  string.  A value of -1 indicates that the count is variable
                  and should be determined by the number of values provided.
                  Note that this count that corresponds to the specified Format,
                  so if a different-sized Writable format is defined, the actual
                  count written to the file will be different.

  Flags         : Flags to specify characteristics for this tag.  May be a
                  simple scalar flag name, a reference to a list of flag names,
                  or a reference to a hash of flag/value pairs. If not a hash
                  reference, the flag value is set to 1. Flags are expanded for
                  faster access at run time into members of the tagInfo hash,
                  and may be written directly as members if desired. The
                  available flag names are:

                  'AutoSplit' - [List tags only] Similar to ListSplit option,
                  but applied automatically to individual tags.  Value specifies
                  pattern for split, or 1 for default pattern ',?\\s+'.

                  'Avoid' - avoid creating this tag if possible.  This is only
                  effective if another tag exists with the same name.

                  'Binary' - set to 1 for binary data.  This has the same effect
                  as setting ValueConv to '\$val', but it it a bit cleaner and
                  avoids dummy ValueConvInv entries for writable tags.  Has no
                  effect if ValueConv is defined for the tag.  Some values may
                  be treated as binary data even if this flag is not set.

                  'BlockExtract' - set for writable directories in EXIF
                  information which are extracted by default.  Otherwise
                  writable directories are only extracted as a block if
                  specified explicitly.
                  
                  'DataMember' - name of exiftool data member associated with
                  this tag if it should be stored as a special data member when
                  writing information.  Necessary only if the value of the tag
                  affects other written information.  Currently only used for
                  tags in EXIF tables.

                  'DataTag' - associated tag name containing data for offset or
                  byte count tags.

                  'Drop' - set to 1 for tags that should be excluded when
                  rebuilding maker notes when copying all tags.

                  'EntryBased' - set to 1 if the offset for this value is based
                  on the IFD entry position.  This allows individual values to
                  be entry-based even though some others aren't (as with the
                  Casio PrintIM information).

                  'GotGroups' - [reserved] flag used internally to indicate that
                  the Groups hash has been initialized for this tag.

                  'IsOffset' - flag set if the tag represents an offset to some
                  data, and causes value will be adjusted to an absolute file
                  offset.  If set to 2, the offset base of the parent directory
                  is used even if the base changes for the current directory
                  (only some maker notes are this messed up).  May be set to an
                  expression to be evaluated.  Expression may access $val and
                  $exifTool, and is evaluated only when reading.

                  'List' - flag indicating that duplicate entries of this tag
                  are allowed, and will be accumulated in a list.  Note that for
                  XMP information, 3 different types of lists are supported and
                  the List value specifies the type: 'Bag', 'Seq' or 'Alt'.  As
                  well, a value of '1' is used in XMP to allow list behaviour
                  for a tag which is itself not a list element (ie. a member of
                  list of structures).

                  'MakerNotes' - set if this tag is maker note data.

                  'Mandatory' - set for mandatory tags.  Used only by TagInfoXML
                  and documentation purposes.  Mandatory tags may be added
                  automatically by ExifTool.

                  'NestedHtmlDump' - flag set if value for this tag is also
                  dumped when processing the SubDirectory.  This flag is implied
                  if the MakerNotes flag is set.

                  'NotIFD' - set for 'MakerNotes' tags only if the data is not
                  in standard EXIF IFD format.

                  'OffsetPair' - set if the tag represents half of an offset/
                  byte count pair.  Data for these tags must be handled
                  separately.  Value is the tagID for the paired tag.

                  'Permanent' - flag indicates that a tag is permanent, and
                  can't be added or deleted from the file, although a new value
                  may be written if the tag already exists.  By default, all
                  MakerNotes tags are permanent unless otherwise specified.

                  'PrintHex' - specifies that unknown PrintConv values should
                  be printed in hex (ie. 'Unknown (0x01)')

                  'PrintString' - flag set to force PrintConv values to be
                  printed as strings in the documentation.

                  'Priority' - gives the priority of this tag while reading.  If
                  set to zero, this tag will not override the value of previous
                  tags with the same name.  If the priority is greater than
                  zero, this tag won't be overridden by subsequent tags unless
                  their priority is equal to or greater than this priority.  A
                  special feature is that Priority 0 tags are automatically
                  incremented to Priority 1 if they exist in the IFD of the full
                  resolution image (as determined by SubFileType).

                  'Protected' - bit mask to protect tags from writing:
                  Bit 0x01 indicates an 'unsafe' tag, which is not set via
                  SetNewValuesFromFile() unless specified explicitly.
                  Bit 0x02 indicates a 'protected' tag, which should not be set
                  directly by the user.

                  'Resource' - [XMP only] flag to write value as an rdf:resource
                  in an empty element instead of as a normal string.

                  'SeparateTable' - set to list PrintConv values in a separate
                  table in the HTML documentation.  Value is 1 for a table name
                  of 'Module TagName', or 'TAG' for 'Module TAG', or 'MODULE
                  TAG' to fully specify the table name.

                  'SetResourceName' - [Photoshop tags only] set to 1 to append
                  resource name to the extracted value (ie. 'VALUE/#NAME#/').
                  Also allows resource name to be appended when writing new
                  values.  May be set to any value other than 1 for a default
                  resource name to use when writing if an appended name is not
                  provided.

                  'SubIFD' - used in writing to determine that the tag specifies
                  an offset to a sub-IFD.  When this flag is set, the Group1
                  name gives the name of the IFD.

                  'Unknown' - this is an unknown tag (only extracted when the
                  Unknown option is set).

                  'WrongBase' - ['IsOffset' tags only] An expression using $self
                  that is evaluated to generate a base shift for 'IsOffset' tags
                  which use a different base than the rest of the tags.

  RawConv       : Used to convert the Raw value at extraction time (while the
                  image file is still open, unlike ValueConv and PrintConv below
                  which are done later only if the value is requested).  May be
                  a scalar expression using $val (the Raw tag value), $self (the
                  current ExifTool object) and $tag (the tag key), or a code
                  reference with $val and $self as arguments.  For Composite
                  tags, $val is a reference to a hash of component tag names,
                  and @val may be used to access the Raw values of these tags.
                  The returned value may be a scalar which is used as the new
                  Raw value, a scalar reference to a binary data value, a hash
                  reference for Composite tags, an ARRAY reference for a list of
                  values, or undefined to indicate that the tag should be
                  ignored.  Also, RawConv may generate Warning or Error tags,
                  while ValueConv and PrintConv may not. Note: RawConv should
                  only be used if necessary (in general, only if the tag may be
                  ignored).  It is preferable to use ValueConv instead of
                  RawConv because ValueConv is only executed if the tag value is
                  requested, while RawConv is executed for all extracted tags.

  ValueConv     : Used to convert the Raw value to a useable form. May be a hash
                  reference to act as a lookup table, a scalar which is
                  evaluated as a Perl expression, or a code reference to a
                  subroutine.  May also be a list reference, in which case the
                  value is split at whitespace into a list of values and each
                  value is converted by the associated entry in the ValueConv
                  list.  If a hash reference is used and the Raw value doesn't
                  appear as one of the keys, then the converted value is set to
                  "Unknown (X)", where X is the Raw value (unless either of the
                  special keys exist: 'BITMASK', a reference to a hash used to
                  decode individual value bits; or 'OTHER', a reference to a
                  subroutine used to convert unknown values.  The subroutine
                  takes 3 arguments: the value, a flag which is set for the
                  inverse conversion, and a reference to the PrintConv hash, and
                  returns the converted value or undef on error.  The lookup
                  hash may also contain a 'Notes' entry which is used for
                  documentation if the SeparateTable flag is set).  In an
                  expression, $self is a reference to the current ExifTool
                  object, $val is the Raw value, and $tag is the tag key.  The
                  subroutine takes 2 arguments: the Raw value and a reference to
                  the current ExifTool object.  The expression or subroutine is
                  evaluated when and if the tag value is requested (ie. only
                  after all extraction is complete), so if necessary at this
                  time the values of all other tags are available via calls to
                  $self->GetValue("Tag","Raw"). (Note: In theory, types other
                  than "Raw" may be accessed, but they are slower and may lead
                  to cyclical dependencies so they should be avoided). When
                  evaluated, the expression or subroutine returns a scalar for
                  the converted value, a SCALAR reference to a binary data value
                  (see the 'Binary' flag), or an ARRAY reference for a list of
                  values.  Except for Composite tags, the return value should
                  always be defined -- use RawConv instead to return undef if it
                  is necessary to test the value for validity, otherwise an
                  undef tag may hide a previously defined value when the
                  Duplicates option is not enabled.  Composite tags which
                  Require or Desire other tags may access the ValueConv,
                  PrintConv and Raw values of these tags through the elements of
                  the @val, @prt and @raw lists respectively (only if there was
                  no RawConv or it returned a hash reference).  For these tags,
                  $val may be used in an expression to represent $val[0], and
                  the first argument passed for a code reference is a reference
                  to @val.  If ValueConv is not specified, the Raw value is not
                  converted.

  PrintConv     : This entry is similar to ValueConv above, except that it is
                  used to further convert the tag value to a human readable
                  form.  It can be either a hash lookup, a scalar Perl
                  expression, a code reference or a list reference.  In this
                  expression, $self, $val and $tag may be used as with
                  ValueConv, but if ValueConv was defined then $val is the
                  ValueConv value instead of the Raw value.  The returned value
                  should always be defined.  Note that the print conversion is
                  only done if the PrintConv option is enabled (which it is by
                  default), and if the result of the ValueConv is not a scalar
                  reference.  If it is a list reference, then the converted
                  values are joined by '; ' in the output string.

  RawConvInv    : The inverse of RawConv.  This should only be used in very rare
                  situations when the raw value can not be predetermined.
                  Unlike the other inverse conversions which are applied in
                  SetNewValue(), this conversion is applied in WriteInfo() as
                  the file is being written.  This is important because it means
                  that FILE_TYPE and any DataMember tags ocurring before this
                  tag in the file are available.  Beware that if the return
                  value is not defined, the tag will be deleted unless there is
                  specific logic to avoid this (currently, only EXIF and Binary
                  data directories handle this case).

  ValueConvInv  : The inverse of ValueConv.  Only necessary for Writable tags
                  when ValueConv is specified (except WriteAlso tags).  Note
                  that DataMember tags may NOT be used in the inverse
                  conversions because these conversions are done before the
                  input file is parsed.  Instead, a Condition or RawConvInv must
                  be used.  May return undef on conversion error and call warn()
                  to issue a warning.  If warn() is not called, a generic
                  warning is generated when undef is returned.  An empty warning
                  ("\n") may be issued to suppress warning messages when undef
                  is returned.  If a scalar, the expression may use the
                  variables $val, $self and $wantgroup.  If a code ref, the
                  routine is passed 2 arguments: $val and $self.

  PrintConvInv  : The inverse of PrintConv.  Only necessary if for Writable tags
                  when PrintConv is specified (unless WriteAlso is used).  See
                  ValueConvInv above for more details.

  PrintConvColumns : Number of columns for PrintConv lookup in HTML docs.
                  Default is 1 if not specified.

  DelValue      : Raw value to be used when deleting a permanent tag.  (Note all
                  MakerNotes tags are permanent.)  If not specified, an attempt
                  is made to convert an empty string for the raw value.

  Relist        : [Only if ValueConv or PrintConv is a list ref] Reference to a
                  list of original value indices used to reorganize values. Each
                  entry in the list may be a scalar index, or a reference to a
                  list of indices to join values.  (Currently values may be
                  joined, but the order of writable values must not be changed
                  until this ability is added to the writer.)

  Mask          : [BinaryData tags only] Bitmask for this value.  (Multiple tags
                  may have the same index by using floating point indices.  An
                  unknown tag will only be generated for a certain TagID if
                  there is no integral TagID for that tag.) When Mask is used,
                  PrintHex=1 is implied unless otherwise defined.

  Condition     : If given, specifies scalar which is evaluated as a Perl
                  expression at extraction time to decide whether the tag is
                  valid.  If used in a list of alternate tag definitions, the
                  first list entry with a true condition is taken.  If no
                  condition exists, then a 'true' condition is assumed.  The
                  expression may use $self to access the ExifTool object, and
                  $oldVal to access the previous Raw value of the tag (if it
                  exists).  The first 48 bytes of the raw data value are
                  accessible through the reference $valPt for EXIF and Jpeg2000
                  tags only.  EXIF tags may also reference the format string and
                  value count through $format and $count.  Note that if the
                  value is writable and $valPt is used, the tag must have a
                  Format (unless 'undef' or 'string'), and a Count (unless 1 or
                  length of the 'undef' or 'string'), so the raw data may be
                  generated for evaluating the Condition.

  Require       : [Composite tags only] A hash reference specifying the tags
                  required to calculate the composite tag value.  The hash
                  values are the names of the required tags, and the keys
                  specify the indices where the tag values are stored in the
                  @val list used in the ValueConv and/or PrintConv expression.
                  The composite value is only calculated if the values for all
                  Require'd tags are defined.  Require and Desire tag names may
                  be prefixed by an optional group family 0 or 1 name followed
                  by a colon.  Case IS significant.  A special feature allows
                  a scalar tag name to be used instead of the hash reference
                  when only the 0th tag is defined.  For example, the following
                  two definitions are equivalent:

                        Require => { 0 => 'XMP:Title' },
                        Require => 'XMP:Title',

  Desire        : [Composite tags only] This is the same as Require except that
                  the value is still calculated even if the specified tags don't
                  exist.  Beware that the elements of @val, @prt and @raw may be
                  undefined for Desire'd tags.  Both Require and Desire may
                  exist together, however be sure to specify unique keys for
                  each tag since they are used as indices into the @val, @prt
                  and @raw lists common to both Require'd and Desire'd tags.

  Shift         : [Writable tags only] Specifies type of shift to apply if this
                  value may be shifted.  Set to 'Time' for shifting date/time
                  tags.

  Writable      : Indicates this tag can be written (or not written if value is
                  set to zero), and for EXIF-type tables gives format for
                  writing.  Writable may be set to 1 for MakerNotes information
                  because the existing format is always used, however providing
                  a format is desireable because it is used in validating the
                  value.  For EXIF tables, the Writable flag may be different
                  than the Format flag, in which case Format is used for
                  converting the binary value and Writable specifies the format
                  code written to the EXIF IFD.  For SubDirectories in EXIF
                  information, this flag is only defined if the SubDirectory is
                  writable as a block, or if the SubDirectory can not be edited
                  (in which case Writable is set to 0).  If non-zero, the
                  SubDirectory is also extracted as a block, so the Binary and
                  Protected flags should usually set as well.  There is
                  currently no way to specify a write format for a SubDirectory
                  that is not writable as a block (the default is 'int32u' for
                  IFD-type SubDirectories, and 'undef' for all others).

  WriteAlso     : Used for writable tag to specify other tags to write when this
                  tag is written.  The value is a hash reference.  The hash keys
                  are the names of the tags to write, and the values are
                  evaluated to obtain the ValueConv values of each tag (or undef
                  to delete the tag).  In the eval, $val may be used as the Raw
                  value of the parent tag.  This will write Protected tags that
                  aren't directly writable (Protected bit 0x02 set).

  WriteCheck    : If given, specifies a scalar which is evaluated as a Perl
                  expression for a one-time validatation the value being
                  written.  The expression has access to 3 variables: $val is
                  the value to be written, $self is the ExifTool object, and
                  $tagInfo is the tag information hash reference.  It returns an
                  error string or undef if the value is good.

  DelCheck      : Similar to WriteCheck, but called when the tag is deleted. The
                  expression may access $self, $tagInfo and $wantGroup.  Returns
                  error string, or undef on success.  May return empty string
                  ('') to suppress warning messages but not delete tag (ie.
                  when deleting only associated tags).

  WriteCondition: [Writable EXIF tags only] Specifies a condition to be
                  evaluated before the tag can be written to a specific file.
                  The condition may use $self to reference the ExifTool object,
                  and returns true if it is OK for writing. Unlike WriteCheck
                  which is done only once when the new value is set, this
                  condition is evaluated before the information is written in
                  each file.

  WriteGroup    : [Writable EXIF tags only] Specifies the IFD where the
                  information gets written by default.  Must be defined for
                  writable EXIF tags if WRITE_GROUP is not specified in table.

  AllowGroup    : [Writable tags only] Regular expression string (case
                  insensitive) to match group names which are allowed when
                  writing this tag.  Only needed if tag can be written to
                  non-standard groups (very rare).

  OffsetPair    : Used in EXIF table to specify the tagID for the corresponding
                  offset or length tag.

  DataTag       : Used in EXIF table to specify the tag name of the data
                  associated with offset/length tags.

  Struct        : [XMP tags only] Used by XMP writer code to specify name of XMP
                  structure so the PropertyPath can be determined.  Tags with
                  Struct entries should also include a dummy SubDirectory entry
                  to prevent the tag name from showing up in the documentation.
                  Tags for each element in the flattened structure hierarchy
                  should be included parallel to each tag defining a Struct.

  Units         : [MIE tags only] Reference to a list of valid units strings.
                  The default units are the first item in the list.

  TagID         : [reserved] Used internally to save the table key for this tag.

  Index         : [reserved] Used internally to save the index of tagInfo records
                  which are in a conditional list.

  Table         : [reserved] Reference to parent tag table.

  PropertyPath  : [reserved] Used internally by XMP writer to save property path
                  name.

  PropertyPath  : [StructType] Used internally by XMP writer to save name of
                  structure for tags contained in a structure.

  Module        : [reserved] Used internally to store module name for writable
                  Composite tags.

  LangCode      : [reserved] Used internally to indicate language code for
                  alternate language tags (ie. 'fr').  XMP and MIE only.

  SubDirectory {  If it exists, this specifies the start of a new subdirectory.
                  It contains a collection of variables which specify the type
                  and location of the subdirectory.  These variables are
                  described below:

     TagTable   : Specifies the name of the tag table lookup for the new
                  subdirectory.  If not specified, the parent tag table is used.

     Start      : The offset to the start of the subdirectory relative to the
                  current Base.  This is a Perl expression which may use
                  $valuePtr to represent the location of the tag value in the
                  file, or $val for the value itself.  If not specified, a Start
                  of '$valuePtr' is assumed.

     OffsetPt   : If specified, this is a Perl expression that gives the
                  position of a 32-bit word in the current directory that is
                  added to the Start position to get the position of the new
                  subdirectory.  The expression should use the position of the
                  current tag ($valuePtr).

     Base       : This specifies the base offset for all pointers in the
                  subdirectory.  This need not be specified if the offset is the
                  same as the current directory, which is normally the case.
                  May use $start to represent the subdirectory start location
                  relative to the current base.  If this is defined, the
                  automatic validation of base offsets is disabled for maker
                  notes directories.

     EntryBased : Flag indicating that the offsets are based on the individual
                  directory entry position, so offsets are incremented by 12
                  times the corresponding entry index.

     MaxSubdirs : Maximum number of subdirectories specified by the current tag
                  (if the tag specifies multiple values).  If not specified, the
                  tag value ($val) is used as-is.  If MaxSubdirs is specified,
                  then one subdirectory is parsed for each value found up to the
                  maximum number specified.  Ignored when writing.

     ByteOrder  : Specifies byte ordering if different than than the rest of the
                  file.  Must be either BigEndian, LittleEndian or Unknown.  If
                  Unknown is specified, the byte order will be determined from
                  the directory count (however, this can not be done if OffsetPt
                  is specified).

     Validate   : If given, specifies Perl expression which is used to validate
                  the subdirectory data.  The following variables may be used in
                  the expression: $val (value of the tag), $dirData (reference
                  to directory data), $subdirStart (offset to subdirectory
                  start) and $size (size of subdirectory).  Returns true if
                  subirectory is valid.

     ProcessProc: If given, specifies processing procedure used to decode this
                  subdirectory data.  This overrides the default procedure
                  specified by PROCESS_PROC in the tag table.

     WriteProc:  If given, specifies processing procedure used to write this
                  subdirectory data.  This overrides the default procedure
                  specified by WRITE_PROC in the tag table.

     DirName    : Name of this subdirectory.  If not specified, the name is
                  taken from the tag name.  DirName is important because it is
                  used when writing to compare against names in the directory
                  map to determine which directories need to be edited.

     FixBase    : Flag set if base offsets should be fixed.  Used to add a
                  constant to maker notes offsets to fix damage done by some
                  image editing utilities. (maker notes only)

     FixOffsets : Expression to evaluate for each value pointer to patch
                  problems with some EXIF maker note offsets.  May access the
                  following variables: $valuePtr, $valEnd, $size, $tagID and
                  $wFlag.  May return undef when writing to ignore the entry.

     Multi      : [EXIF directories only] Flag to allow multiple linked IFD's.
                  1 is assumed if DirName is IFD0 or SubIFD unless otherwise
                  defined.

     Magic      : [TiffIFD directories only] Magic number used in TIFF-like
                  header.
  }

--------------------------------------------------------------------------------
