123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- #------------------------------------------------------------------------------
- # 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-2016, 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
|