#------------------------------------------------------------------------------ # File: DigiKam_Audio_Video_tags.config # # Description: A large list of XMP-video and XMP-audio tags taken from exiv2 source code # # Due to the lack of examples and uncertainty regarding many of these "closed list" tags, # some of these tags are almost certainly broken. # # I believe these are used by DigiKam: https://community.kde.org/GSoC/2012/Ideas#Project:_Video_metadata_support # XMP-video source: https://github.com/Exiv2/exiv2/blob/06fe8268dcd2559f8039529c62ea6d97b1adebb3/src/properties.cpp#L3424 # XMP-audio source: https://github.com/Exiv2/exiv2/blob/06fe8268dcd2559f8039529c62ea6d97b1adebb3/src/properties.cpp#L3975 # exiftool forum thread, especially the last post: https://exiftool.org/forum/index.php?msg=81852 # Revisions: 2023/09/25 - Bryan K. Williams (aka StarGeek) Created (and forgotten) # 2024/07/04 - Cleaned up, added links # #------------------------------------------------------------------------------ # imported to allow use of GPS Value/PrintConv routines use Image::ExifTool::XMP; # The %Image::ExifTool::UserDefined hash defines new tags to be added # to existing tables. %Image::ExifTool::UserDefined = ( # new XMP namespaces (eg. xxx) must be added to the Main XMP table: 'Image::ExifTool::XMP::Main' => { # namespace definition for examples 8 to 11 video => { # <-- must be the same as the NAMESPACE prefix SubDirectory => { TagTable => 'Image::ExifTool::UserDefined::video', # (see the definition of this table below) }, }, audio => { # <-- must be the same as the NAMESPACE prefix SubDirectory => { TagTable => 'Image::ExifTool::UserDefined::audio', # (see the definition of this table below) }, }, }, ); %Image::ExifTool::UserDefined::video = ( GROUPS => { 0 => 'XMP', 1 => 'XMP-video', 2 => 'Image' }, NAMESPACE => { 'video' => 'http://www.video/' }, #PRIORITY => 0, # copy/pasted from XMP-exif, which says "not as reliable as actual EXIF tags" WRITABLE => 'string', # (default to string-type tags) Album => { }, ArchivalLocation => { }, Arranger => { }, # ? check if it's a list if so, add List => 'Bag' ArrangerKeywords => { }, Artist => { }, # ? double check AspectRatio => { Writable => 'rational' }, AspectRatioType => { }, AttachFileData => { }, AttachFileDesc => { }, AttachFileMIME => { }, AttachFileName => { }, # Integer AttachFileUID => { Writable => 'integer' }, BaseURL => { }, BitDepth => { Writable => 'integer' }, Brightness => { Writable => 'integer' }, CameraByteOrder => { }, Cinematographer => { }, CleanApertureWidth => { Writable => 'integer' }, CleanApertureHeight => { Writable => 'integer' }, Codec => { }, CodecDecodeAll => { }, CodecDescription => { }, CodecInfo => { }, CodecDownloadUrl => { }, CodecSettings => { }, ColorMode => { }, ColorNoiseReduction => { Writable => 'integer' }, # ? closed Choice of Text # Need list of choices to fix ColorSpace => { }, Comment => { }, Commissioned => { }, CompatibleBrands => { }, Composer => { }, ComposerKeywords => { }, Compressor => { }, CompressorID => { }, CompressorVersion => { }, Container => { }, ContentCompressAlgo => { }, ContentEncodingType => { }, ContentEncryptAlgo => { }, ContentSignAlgo => { }, ContentSignHashAlgo => { }, # Closed Choice of Integer # Need list of choices to fix Contrast => { Writable => 'integer' }, Copyright => { }, CostumeDesigner => { }, Country => { }, # Listed as integer, must get more details # Suspect it might be unix time, need more data to fix CreationDate => { Writable => 'integer', Groups => { 2 => 'Time' } }, CropBottom => { Writable => 'integer' }, CropLeft => { Writable => 'integer' }, CropRight => { Writable => 'integer' }, Cropped => { Writable => 'integer' }, CropTop => { Writable => 'integer' }, # Listed as integer, must get more details, double check about group # Suspect it might be unix time, need more data to fix CurrentTime => { Writable => 'integer', Groups => { 2 => 'Time' } }, DataPackets => { Writable => 'integer' }, # Listed as type 'Date', unsure if it is EXIF time format or ISO format # need more data to fix DateTimeOriginal => { Groups => { 2 => 'Time' } }, DateTimeDigitized => { Groups => { 2 => 'Time' } }, # Listed as string # need more data to fix DateUTC => { Groups => { 2 => 'Time' }}, DefaultOn => { }, DigitalZoomRatio => { Writable => 'rational'}, Dimensions => { }, Director => { }, DisplayUnit => { }, DistributedBy => { }, DocType => { }, DocTypeReadVersion => { Writable => 'integer' }, DocTypeVersion => { Writable => 'integer' }, DotsPerInch => { Writable => 'integer' }, duration => { Writable => 'integer' }, EBMLReadVersion => { Writable => 'integer' }, EBMLVersion => { Writable => 'integer' }, Edit1 => { }, Edit2 => { }, Edit3 => { }, Edit4 => { }, Edit5 => { }, Edit6 => { }, Edit7 => { }, Edit8 => { }, Edit9 => { }, EditedBy => { }, Enabled => { }, EncodedBy => { }, EncodedPixelsWidth => { Writable => 'integer' }, EncodedPixelsHeight => { Writable => 'integer' }, Encoder => { }, EndTimecode => { Writable => 'integer' }, Engineer => { }, Equipment => { }, ExposureCompensation => { }, ExposureProgram => { }, ExposureTime => { Writable => 'rational' }, ExtendedContentDescription => { }, FileDataRate => { Writable => 'rational' }, FileID => { }, FileLength => { Writable => 'integer' }, FileName => { }, FileSize => { Writable => 'integer' }, FileType => { }, FilterEffect => { }, FirmwareVersion => { }, FNumber => { Writable => 'rational' }, FocalLength => { Writable => 'rational' }, FocusMode => { }, Format => { }, FrameCount => { Writable => 'integer' }, FrameHeight => { Writable => 'integer' }, # Listed as type "Frames per Second" FrameRate => { }, # Listed as type "Dimensions" FrameSize => { }, FrameWidth => {Writable => 'integer'}, Genre => { }, GPSAltitude => { Writable => 'rational' }, # ? closed Choice of integer GPSAltitudeRef => { Writable => 'integer' }, GPSCoordinates => { }, # Listed as type 'Date' GPSDateStamp => { Groups => { 2 => 'Time' } }, GPSImgDirection => { Writable => 'rational' }, # # ? closed Choice of text GPSImgDirectionRef => { }, # Listed as type 'GPSCoordinate', using exiftool's definitions GPSLatitude => { Groups => { 2 => 'Location' }, %Image::ExifTool::XMP::latConv }, GPSLongitude => { Groups => { 2 => 'Location' }, %Image::ExifTool::XMP::longConv }, GPSMapDatum => { Groups => { 2 => 'Location' } }, GPSSatellites => { Groups => { 2 => 'Location' }}, # Listed as type 'Date' GPSTimeStamp => { Groups => { 2 => 'Location' }}, GPSVersionID => { Groups => { 2 => 'Location' } }, GraphicsMode => { }, Grouping => { }, HandlerClass => { }, HandlerDescription => { }, HandlerType => { }, HandlerVendorID => { }, Height => { Writable => 'integer' }, HueAdjustment => { Writable => 'integer' }, ImageLength => { Writable => 'integer' }, InfoBannerImage => { }, InfoBannerURL => { }, Information => { }, InfoText => { }, InfoURL => { }, ISO => { Writable => 'integer' }, ISRCCode => { }, Junk => { }, Language => { }, Length => { Writable => 'integer' }, LensModel => { }, LensType => { }, Lightness => { }, LocationInfo => { }, LogoIconURL => { }, LogoURL => { }, Lyrics => { }, MajorBrand => { }, Make => { }, MakerNoteType => { }, MakerNoteVersion => { }, MakerURL => { }, MaxApertureValue => { Writable => 'rational' }, MaxBitRate => { Writable => 'integer' }, # Listed as type 'kiloBytes per Second' # need more data to fix MaxDataRate => { }, MediaCreateDate => { Writable => 'integer' }, MediaDuration => { Writable => 'integer' }, MediaHeaderVersion => { }, MediaLangCode => { Writable => 'integer' }, MediaModifyDate => { Writable => 'integer' }, MediaTimeScale => { Writable => 'integer' }, Medium => { }, Metadata => { }, MetadataLibrary => { }, # ? closed Choice of 'integer' # need more data to fix MeteringMode => { Writable => 'integer' }, MicroSecPerFrame => { Writable => 'integer' }, MimeType => { }, MinorVersion => { }, Model => { }, ModificationDate => { }, MovieHeaderVersion => { Writable => 'integer' }, MusicBy => { }, MuxingApp => { }, Name => { }, NextTrackID => { Writable => 'integer' }, # Listed as type 'Integer/Text' NumOfColours => { }, NumOfImpColours => { }, NumOfParts => { Writable => 'integer' }, # Listed as type 'Integer/Text' OpColor => { }, Organization => { }, # ? closed Choice of 'integer' # I'm assuming it uses the same numbers as the EXIF:Orientation tag. When listing this tag without this config file # the output will be just the base number, as no PrintConv will be done Orientation => { Writable => 'integer' , PrintConv => \%Image::ExifTool::Exif::orientation, }, Part => { }, Performers => { }, PerformerKeywords => { }, PerformerURL => { }, PictureControlData => { }, PictureControlVersion => { }, PictureControlName => { }, PictureControlBase => { }, PictureControlAdjust => { }, PictureControlQuickAdjust => { }, PlaySelection => { }, PlayMode => { }, PhysicalEquivalent => { }, PixelDepth => { }, PixelPerMeterX => { Writable => 'integer' }, PixelPerMeterY => { Writable => 'integer' }, Planes => { Writable => 'integer' }, PosterTime => { Writable => 'integer' }, PreferredRate => { Writable => 'rational'}, PreferredVolume => { Writable => 'rational'}, # The text along side this says "Specifies the amount of time to buffer data before starting to play the file, in millisecond units. # If this value is nonzero the Play Duration field and all of the payload Presentation Time fields have been offset by this amount. # Therefore, player software must subtract the value in the preroll field from the play duration and presentation times to calculate # their actual values." Preroll => { Writable => 'integer' }, PreviewAtomType => { }, PreviewDate => { Writable => 'integer' }, PreviewDuration => { Writable => 'integer' }, PreviewTime => { Writable => 'integer' }, PreviewVersion => { Writable => 'integer' }, ProducedBy => { }, Producer => { }, ProducerKeywords => { }, ProductionApertureWidth => { Writable => 'integer'}, ProductionApertureHeight => { Writable => 'integer'}, ProductionDesigner => { }, ProductionStudio => { }, Product => { }, # ? Listed as type 'ProjectLink' # need more data to fix ProjectRef => { }, Rate => { Writable => 'integer' }, Rated => { }, Rating => { }, RecordLabelName => { }, RecordLabelURL => { }, RecordingCopyright => { }, Requirements => { }, # ? closed Choice of 'integer' # need more data to fix ResolutionUnit => { }, RippedBy => { }, # ? closed Choice of 'integer' # need more data to fix Saturation => { Writable => 'integer' }, SecondaryGenre => { }, SelectionTime => { Writable => 'integer' }, SelectionDuration => { Writable => 'integer' }, SendDuration => { Writable => 'integer' }, Sharpness => { Writable => 'integer' }, Software => { }, SoftwareVersion => { }, SongWriter => { }, SongWriterKeywords => { }, Source => { }, SourceCredits => { }, SourceForm => { }, SourceImageHeight => { Writable => 'integer' }, SourceImageWidth => { Writable => 'integer' }, Starring => { }, StartTimecode => { Writable => 'integer' }, Statistics => { }, StreamCount => { Writable => 'integer'}, StreamName => { }, StreamQuality => { Writable => 'integer'}, StreamSampleRate => { Writable => 'rational' }, StreamSampleCount => { Writable => 'integer' }, StreamSampleSize => { Writable => 'integer' }, StreamType => { }, SubTCodec => { }, SubTCodecDecodeAll => { }, SubTCodecInfo => { }, SubTCodecDownloadUrl => { }, SubTCodecSettings => { }, SubTDefaultOn => { }, SubTEnabled => { }, Subtitle => { }, SubtitleKeywords => { }, SubTLang => { }, SubTTrackForced => { }, SubTTrackLacing => { }, Subject => { }, TapeName => { }, TagDefault => { }, TagLanguage => { }, TagName => { }, TagString => { }, TargetType => { }, Technician => { }, ThumbnailHeight => { Writable => 'integer' }, ThumbnailLength => { Writable => 'integer' }, ThumbnailWidth => { Writable => 'integer' }, TimecodeScale => { Writable => 'rational' }, TimeOffset => { Writable => 'integer' }, TimeScale => { Writable => 'integer' }, Title => { }, ToningEffect => { }, TotalFrameCount => { Writable => 'integer' }, TotalStream => { Writable => 'integer' }, Track => { }, TrackCreateDate => { Writable => 'integer' }, TrackDuration => { Writable => 'integer' }, TrackForced => { }, TrackID => { Writable => 'integer' }, TrackHeaderVersion => { }, TrackLacing => { }, TrackLang => { }, TrackLayer => { Writable => 'integer' }, TrackModifyDate => { Writable => 'integer' }, TrackName => { }, TrackNumber => { Writable => 'integer' }, TrackVolume => { Writable => 'rational' }, TranslateCodec => { }, UnknownInfo => { }, UnknownInfo2 => { }, URL => { }, URN => { }, VariProgram => { }, VegasVersionMajor => { }, VegasVersionMinor => { }, Vendor => { }, VendorID => { }, VideoQuality => { Writable => 'integer' }, VideoSampleSize => { Writable => 'integer' }, VideoScanType => { }, WatermarkURL => { }, # ? closed Choice of 'text' # need more data to fix WhiteBalance => { }, WhiteBalanceFineTune => { Writable => 'integer' }, Width => { Writable => 'integer' }, WindowLocation => { }, WorldTime => { Writable => 'integer' }, WrittenBy => { }, WritingApp => { }, XResolution => { Writable => 'rational' }, Year => { Writable => 'integer' }, YResolution => { Writable => 'rational' }, ), %Image::ExifTool::UserDefined::audio = ( GROUPS => { 0 => 'XMP', 1 => 'XMP-audio', 2 => 'Image' }, NAMESPACE => { 'audio' => 'http://www.audio/' }, #PRIORITY => 0, # copy/pasted from XMP-exif, which says "not as reliable as actual EXIF tags" WRITABLE => 'string', # (default to string-type tags) AvgBytePerSec => { Writable => 'integer' }, Balance => { Writable => 'integer' }, BitsPerSample => { Writable => 'integer' }, # Listed as type 'integers' (plural) # need more data to fix ChannelType => { Writable => 'integer' }, Codec => { }, CodecDecodeAll => { }, CodecDescription => { }, CodecDownloadUrl => { }, CodecInfo => { }, CodecSettings => { }, Compressor => { }, DefaultDuration => { }, DefaultStream => { }, DefaultOn => { }, Enabled => { }, Format => { }, HandlerClass => { }, HandlerDescription => { }, HandlerType => { }, HandlerVendorID => { }, MediaCreateDate => { Writable => 'integer' }, MediaDuration => { Writable => 'integer' }, MediaHeaderVersion => { }, MediaLangCode => { Writable => 'integer' }, MediaModifyDate => { Writable => 'integer' }, MediaTimeScale => { Writable => 'integer' }, OutputSampleRate => { Writable => 'integer' }, SampleCount => { Writable => 'integer' }, SampleRate => { Writable => 'integer' }, # ? closed Choice of 'text' # need more data to fix SampleType => { }, SchemeTitle => { }, TimeOffset => { Writable => 'integer' }, TrackCreateDate => { Writable => 'integer' }, TrackDuration => { Writable => 'integer' }, TrackForced => { }, TrackID => { Writable => 'integer' }, TrackHeaderVersion => { }, TrackLacing => { }, TrackLang => { }, TrackLayer => { Writable => 'integer' }, TrackModifyDate => { Writable => 'integer' }, TrackVolume => { Writable => 'rational' }, URL => { }, URN => { }, VendorID => { }, ); #------------------------------------------------------------------------------ 1; #end