test_pie/external/exiftool/lib/Image/ExifTool/MOI.pm

159 lines
4.1 KiB
Perl
Raw Permalink Normal View History

2023-09-14 11:12:02 +02:00
#------------------------------------------------------------------------------
# File: MOI.pm
#
# Description: Read MOI meta information
#
# Revisions: 2014/12/15 - P. Harvey Created
#
# References: 1) https://en.wikipedia.org/wiki/MOI_(file_format)
#------------------------------------------------------------------------------
package Image::ExifTool::MOI;
use strict;
use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
$VERSION = '1.02';
# MOI tags (ref 1)
%Image::ExifTool::MOI::Main = (
GROUPS => { 2 => 'Video' },
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
NOTES => q{
MOI files store information about associated MOD or TOD files, and are
written by some JVC, Canon and Panasonic camcorders.
},
0x00 => { Name => 'MOIVersion', Format => 'string[2]' },
# 0x02 => { Name => 'MOIFileSize', Format => 'int32u' },
0x06 => {
Name => 'DateTimeOriginal',
Format => 'undef[8]',
Groups => { 2 => 'Time' },
ValueConv => sub {
my $val = shift;
return undef unless length($val) >= 8;
my @v = unpack('nCCCCn', $val);
$v[5] /= 1000;
return sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%06.3f', @v);
},
PrintConv => '$self->ConvertDateTime($val)',
},
0x0e => {
Name => 'Duration',
Format => 'int32u',
ValueConv => '$val / 1000',
PrintConv => 'ConvertDuration($val)',
},
0x80 => {
Name => 'AspectRatio',
Format => 'int8u',
PrintConv => q{
my $lo = ($val & 0x0f);
my $hi = ($val >> 4);
my $aspect;
if ($lo < 2) {
$aspect = '4:3';
} elsif ($lo == 4 or $lo == 5) {
$aspect = '16:9';
} else {
$aspect = 'Unknown';
}
if ($hi == 4) {
$aspect .= ' NTSC';
} elsif ($hi == 5) {
$aspect .= ' PAL';
}
return $aspect;
},
},
0x84 => {
Name => 'AudioCodec',
Format => 'int16u',
Groups => { 2 => 'Audio' },
PrintHex => 1,
PrintConv => {
0x00c1 => 'AC3',
0x4001 => 'MPEG',
},
},
0x86 => {
Name => 'AudioBitrate',
Format => 'int8u',
Groups => { 2 => 'Audio' },
ValueConv => '$val * 16000 + 48000',
PrintConv => 'ConvertBitrate($val)',
},
0xda => {
Name => 'VideoBitrate',
Format => 'int16u',
PrintHex => 1,
ValueConv => {
0x5896 => '8500000',
0x813d => '5500000',
},
PrintConv => 'ConvertBitrate($val)',
},
);
#------------------------------------------------------------------------------
# Validate and extract metadata from MOI file
# Inputs: 0) ExifTool ref, 1) dirInfo ref
# Returns: 1 on success, 0 if this wasn't a valid MOI file
sub ProcessMOI($$)
{
my ($et, $dirInfo) = @_;
my $raf = $$dirInfo{RAF};
my $buff;
# read enough to allow skipping over run-in if it exists
$raf->Read($buff, 256) == 256 and $buff =~ /^V6/ or return 0;
if (defined $$et{VALUE}{FileSize}) {
my $size = unpack('x2N', $buff);
$size == $$et{VALUE}{FileSize} or return 0;
}
$et->SetFileType();
SetByteOrder('MM');
my $tagTablePtr = GetTagTable('Image::ExifTool::MOI::Main');
return $et->ProcessBinaryData({ DataPt => \$buff }, $tagTablePtr);
}
1; # end
__END__
=head1 NAME
Image::ExifTool::MOI - Read MOI meta information
=head1 SYNOPSIS
This module is used by Image::ExifTool
=head1 DESCRIPTION
This module contains definitions required by Image::ExifTool to read meta
information from MOI files.
=head1 AUTHOR
Copyright 2003-2018, Phil Harvey (phil at owl.phy.queensu.ca)
This library is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=head1 REFERENCES
=over 4
=item L<https://en.wikipedia.org/wiki/MOI_(file_format)>
=back
=head1 SEE ALSO
L<Image::ExifTool::TagNames/MOI Tags>,
L<Image::ExifTool(3pm)|Image::ExifTool>
=cut