Linux iad1-shared-b7-18 6.6.49-grsec-jammy+ #10 SMP Thu Sep 12 23:23:08 UTC 2024 x86_64
Apache
: 67.205.6.31 | : 216.73.216.47
Cant Read [ /etc/named.conf ]
8.2.29
fernandoquevedo
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
README
+ Create Folder
+ Create File
/
usr /
share /
perl5 /
Image /
ExifTool /
[ HOME SHELL ]
Name
Size
Permission
Action
Charset
[ DIR ]
drwxr-xr-x
Lang
[ DIR ]
drwxr-xr-x
AES.pm
18.66
KB
-rw-r--r--
AFCP.pm
10.38
KB
-rw-r--r--
AIFF.pm
9.59
KB
-rw-r--r--
APE.pm
9.06
KB
-rw-r--r--
APP12.pm
10.44
KB
-rw-r--r--
ASF.pm
30.21
KB
-rw-r--r--
Apple.pm
5.43
KB
-rw-r--r--
Audible.pm
11.52
KB
-rw-r--r--
BMP.pm
10.45
KB
-rw-r--r--
BPG.pm
7.53
KB
-rw-r--r--
BZZ.pm
17.46
KB
-rw-r--r--
BigTIFF.pm
11.27
KB
-rw-r--r--
BuildTagLookup.pm
121.94
KB
-rw-r--r--
CBOR.pm
11.51
KB
-rw-r--r--
Canon.pm
375.39
KB
-rw-r--r--
CanonCustom.pm
84.32
KB
-rw-r--r--
CanonRaw.pm
29.68
KB
-rw-r--r--
CanonVRD.pm
75.2
KB
-rw-r--r--
CaptureOne.pm
7.85
KB
-rw-r--r--
Casio.pm
62.21
KB
-rw-r--r--
Charset.pm
16.01
KB
-rw-r--r--
DICOM.pm
245.09
KB
-rw-r--r--
DJI.pm
6.31
KB
-rw-r--r--
DNG.pm
31.59
KB
-rw-r--r--
DPX.pm
9.51
KB
-rw-r--r--
DV.pm
9.75
KB
-rw-r--r--
DarwinCore.pm
15.43
KB
-rw-r--r--
DjVu.pm
12.46
KB
-rw-r--r--
EXE.pm
50.3
KB
-rw-r--r--
Exif.pm
246.64
KB
-rw-r--r--
FITS.pm
5.73
KB
-rw-r--r--
FLAC.pm
9.89
KB
-rw-r--r--
FLIF.pm
11.65
KB
-rw-r--r--
FLIR.pm
59.45
KB
-rw-r--r--
Fixup.pm
12.43
KB
-rw-r--r--
Flash.pm
27.5
KB
-rw-r--r--
FlashPix.pm
87.44
KB
-rw-r--r--
Font.pm
27.34
KB
-rw-r--r--
FotoStation.pm
7.97
KB
-rw-r--r--
FujiFilm.pm
54.47
KB
-rw-r--r--
GE.pm
2
KB
-rw-r--r--
GIF.pm
21.85
KB
-rw-r--r--
GIMP.pm
8.35
KB
-rw-r--r--
GPS.pm
19.53
KB
-rw-r--r--
GeoTiff.pm
87.51
KB
-rw-r--r--
Geotag.pm
62.87
KB
-rw-r--r--
GoPro.pm
28
KB
-rw-r--r--
H264.pm
39.29
KB
-rw-r--r--
HP.pm
8
KB
-rw-r--r--
HTML.pm
22.1
KB
-rw-r--r--
HtmlDump.pm
32.8
KB
-rw-r--r--
ICC_Profile.pm
45.63
KB
-rw-r--r--
ID3.pm
56.91
KB
-rw-r--r--
IPTC.pm
39.54
KB
-rw-r--r--
ISO.pm
6.81
KB
-rw-r--r--
ITC.pm
6.63
KB
-rw-r--r--
Import.pm
12.83
KB
-rw-r--r--
InDesign.pm
10.4
KB
-rw-r--r--
JPEG.pm
24.3
KB
-rw-r--r--
JPEGDigest.pm
212.38
KB
-rw-r--r--
JSON.pm
6.15
KB
-rw-r--r--
JVC.pm
3.57
KB
-rw-r--r--
Jpeg2000.pm
49.65
KB
-rw-r--r--
Kodak.pm
120.47
KB
-rw-r--r--
KyoceraRaw.pm
4.31
KB
-rw-r--r--
LIF.pm
4.66
KB
-rw-r--r--
LNK.pm
22.02
KB
-rw-r--r--
Leaf.pm
16.34
KB
-rw-r--r--
Lytro.pm
7.56
KB
-rw-r--r--
M2TS.pm
37.11
KB
-rw-r--r--
MIE.pm
102.09
KB
-rw-r--r--
MIEUnits.pod
13.68
KB
-rw-r--r--
MIFF.pm
9.05
KB
-rw-r--r--
MNG.pm
16.22
KB
-rw-r--r--
MOI.pm
4.14
KB
-rw-r--r--
MPC.pm
4.05
KB
-rw-r--r--
MPEG.pm
22.32
KB
-rw-r--r--
MPF.pm
8.94
KB
-rw-r--r--
MRC.pm
18.39
KB
-rw-r--r--
MWG.pm
30.64
KB
-rw-r--r--
MXF.pm
252.65
KB
-rw-r--r--
MacOS.pm
30.7
KB
-rw-r--r--
MakerNotes.pm
68.93
KB
-rw-r--r--
Matroska.pm
34.44
KB
-rw-r--r--
Microsoft.pm
52.13
KB
-rw-r--r--
Minolta.pm
99.93
KB
-rw-r--r--
MinoltaRaw.pm
16.49
KB
-rw-r--r--
Motorola.pm
5.31
KB
-rw-r--r--
Nikon.pm
431.96
KB
-rw-r--r--
NikonCapture.pm
28.13
KB
-rw-r--r--
NikonCustom.pm
290.78
KB
-rw-r--r--
NikonSettings.pm
71.88
KB
-rw-r--r--
Nintendo.pm
3.24
KB
-rw-r--r--
OOXML.pm
13.61
KB
-rw-r--r--
Ogg.pm
8.81
KB
-rw-r--r--
Olympus.pm
139.89
KB
-rw-r--r--
OpenEXR.pm
10.26
KB
-rw-r--r--
Opus.pm
2.22
KB
-rw-r--r--
Other.pm
2.63
KB
-rw-r--r--
PCX.pm
3.72
KB
-rw-r--r--
PDF.pm
90.77
KB
-rw-r--r--
PGF.pm
4.04
KB
-rw-r--r--
PICT.pm
33.2
KB
-rw-r--r--
PLIST.pm
17.07
KB
-rw-r--r--
PLUS.pm
147.71
KB
-rw-r--r--
PNG.pm
60.72
KB
-rw-r--r--
PPM.pm
4.97
KB
-rw-r--r--
PSP.pm
9.02
KB
-rw-r--r--
Palm.pm
11.9
KB
-rw-r--r--
Panasonic.pm
96.62
KB
-rw-r--r--
PanasonicRaw.pm
31.77
KB
-rw-r--r--
Parrot.pm
20.95
KB
-rw-r--r--
Pentax.pm
220.46
KB
-rw-r--r--
PhaseOne.pm
26.24
KB
-rw-r--r--
PhotoCD.pm
18.25
KB
-rw-r--r--
PhotoMechanic.pm
8.09
KB
-rw-r--r--
Photoshop.pm
43.36
KB
-rw-r--r--
PostScript.pm
29.11
KB
-rw-r--r--
PrintIM.pm
3.44
KB
-rw-r--r--
Qualcomm.pm
43.43
KB
-rw-r--r--
QuickTime.pm
409.72
KB
-rw-r--r--
QuickTimeStream.pl
126.03
KB
-rw-r--r--
RIFF.pm
70.97
KB
-rw-r--r--
RSRC.pm
9.58
KB
-rw-r--r--
RTF.pm
13.46
KB
-rw-r--r--
Radiance.pm
4.56
KB
-rw-r--r--
Rawzor.pm
6.17
KB
-rw-r--r--
Real.pm
26.89
KB
-rw-r--r--
Reconyx.pm
14.2
KB
-rw-r--r--
Red.pm
10.82
KB
-rw-r--r--
Ricoh.pm
37.18
KB
-rw-r--r--
Samsung.pm
54.64
KB
-rw-r--r--
Sanyo.pm
11.83
KB
-rw-r--r--
Scalado.pm
3.91
KB
-rw-r--r--
Shift.pl
23.28
KB
-rw-r--r--
Shortcuts.pm
9.81
KB
-rw-r--r--
Sigma.pm
33.16
KB
-rw-r--r--
SigmaRaw.pm
23.45
KB
-rw-r--r--
Sony.pm
439.69
KB
-rw-r--r--
SonyIDC.pm
11.95
KB
-rw-r--r--
Stim.pm
4.53
KB
-rw-r--r--
TagInfoXML.pm
33.14
KB
-rw-r--r--
TagLookup.pm
647.18
KB
-rw-r--r--
TagNames.pod
1.76
MB
-rw-r--r--
Text.pm
8.12
KB
-rw-r--r--
Theora.pm
3.41
KB
-rw-r--r--
Torrent.pm
11.58
KB
-rw-r--r--
Unknown.pm
1.69
KB
-rw-r--r--
VCard.pm
17.31
KB
-rw-r--r--
Validate.pm
29.75
KB
-rw-r--r--
Vorbis.pm
8.13
KB
-rw-r--r--
WTV.pm
12.97
KB
-rw-r--r--
WriteCanonRaw.pl
24.29
KB
-rw-r--r--
WriteExif.pl
130.6
KB
-rw-r--r--
WriteIPTC.pl
29.6
KB
-rw-r--r--
WritePDF.pl
29.02
KB
-rw-r--r--
WritePNG.pl
16.07
KB
-rw-r--r--
WritePhotoshop.pl
10.85
KB
-rw-r--r--
WritePostScript.pl
26.71
KB
-rw-r--r--
WriteQuickTime.pl
89.63
KB
-rw-r--r--
WriteXMP.pl
70.49
KB
-rw-r--r--
Writer.pl
301.76
KB
-rw-r--r--
XMP.pm
176.89
KB
-rw-r--r--
XMP2.pl
81.66
KB
-rw-r--r--
XMPStruct.pl
36.66
KB
-rw-r--r--
ZIP.pm
27.61
KB
-rw-r--r--
ZISRAW.pm
7.85
KB
-rw-r--r--
iWork.pm
7.79
KB
-rw-r--r--
Delete
Unzip
Zip
${this.title}
Close
Code Editor : Real.pm
#------------------------------------------------------------------------------ # File: Real.pm # # Description: Read Real audio/video meta information # # Revisions: 05/16/2006 - P. Harvey Created # # References: 1) http://www.getid3.org/ # 2) https://common.helixcommunity.org/nonav/2003/HCS_SDK_r5/htmfiles/rmff.htm #------------------------------------------------------------------------------ package Image::ExifTool::Real; use strict; use vars qw($VERSION); use Image::ExifTool qw(:DataAccess :Utils); use Image::ExifTool::Canon; $VERSION = '1.06'; sub ProcessRealMeta($$$); sub ProcessRealProperties($$$); # Real property types (ref PH) my %propertyType = ( 0 => 'int32u', 2 => 'string', ); # Real Metadata property types my %metadataFormat = ( 1 => 'string', # text 2 => 'string', # text list 3 => 'flag', # 1 or 4 byte integer 4 => 'int32u', # 4-byte integer 5 => 'undef', # binary data 6 => 'string', # URL 7 => 'string', # date 8 => 'string', # file name 9 => undef, # grouping 10 => undef, # reference ); # Real Metadata property flag bit descriptions my %metadataFlag = ( 0 => 'Read Only', 1 => 'Private', 2 => 'Type Descriptor', ); # tags used in RealMedia (RM, RV and RMVB) files %Image::ExifTool::Real::Media = ( GROUPS => { 2 => 'Video' }, NOTES => q{ These B<Tag ID>'s are Chunk ID's used in RealMedia and RealVideo (RM, RV and RMVB) files. }, CONT => { SubDirectory => { TagTable => 'Image::ExifTool::Real::ContentDescr' } }, MDPR => { SubDirectory => { TagTable => 'Image::ExifTool::Real::MediaProps' } }, PROP => { SubDirectory => { TagTable => 'Image::ExifTool::Real::Properties' } }, RJMD => { SubDirectory => { TagTable => 'Image::ExifTool::Real::Metadata' } }, ); # pseudo-tags used in RealAudio (RA) files %Image::ExifTool::Real::Audio = ( GROUPS => { 2 => 'Audio' }, NOTES => q{ Tags in the following table reference information extracted from various versions of RealAudio (RA) files. }, '.ra3' => { Name => 'RA3', SubDirectory => { TagTable => 'Image::ExifTool::Real::AudioV3' } }, '.ra4' => { Name => 'RA4', SubDirectory => { TagTable => 'Image::ExifTool::Real::AudioV4' } }, '.ra5' => { Name => 'RA5', SubDirectory => { TagTable => 'Image::ExifTool::Real::AudioV5' } }, ); # pseudo-tags used in RealMedia Metafiles and RealMedia Plug-in Metafiles (RAM and RPM) %Image::ExifTool::Real::Metafile = ( GROUPS => { 2 => 'Video' }, NOTES => q{ Tags representing information extracted from Real Audio Metafile and RealMedia Plug-in Metafile (RAM and RPM) files. }, txt => 'Text', url => 'URL', ); %Image::ExifTool::Real::Properties = ( GROUPS => { 1 => 'Real-PROP', 2 => 'Video' }, PROCESS_PROC => \&Image::ExifTool::Canon::ProcessSerialData, VARS => { ID_LABEL => 'Sequence' }, FORMAT => 'int32u', 0 => { Name => 'MaxBitrate', PrintConv => 'ConvertBitrate($val)' }, 1 => { Name => 'AvgBitrate', PrintConv => 'ConvertBitrate($val)' }, 2 => 'MaxPacketSize', 3 => 'AvgPacketSize', 4 => 'NumPackets', 5 => { Name => 'Duration', ValueConv => '$val / 1000', PrintConv => 'ConvertDuration($val)' }, 6 => { Name => 'Preroll', ValueConv => '$val / 1000', PrintConv => 'ConvertDuration($val)' }, 7 => { Name => 'IndexOffset', Unknown => 1 }, 8 => { Name => 'DataOffset', Unknown => 1 }, 9 => { Name => 'NumStreams', Format => 'int16u' }, 10 => { Name => 'Flags', Format => 'int16u', PrintConv => { BITMASK => { 0 => 'Allow Recording', 1 => 'Perfect Play', 2 => 'Live', 3 => 'Allow Download', #PH (from rmeditor dump) } }, }, ); %Image::ExifTool::Real::MediaProps = ( GROUPS => { 1 => 'Real-MDPR', 2 => 'Video' }, PROCESS_PROC => \&Image::ExifTool::Canon::ProcessSerialData, VARS => { ID_LABEL => 'Sequence' }, FORMAT => 'int32u', PRIORITY => 0, # first stream takes priority 0 => { Name => 'StreamNumber', Format => 'int16u' }, 1 => { Name => 'StreamMaxBitrate', PrintConv => 'ConvertBitrate($val)' }, 2 => { Name => 'StreamAvgBitrate', PrintConv => 'ConvertBitrate($val)' }, 3 => { Name => 'StreamMaxPacketSize' }, 4 => { Name => 'StreamAvgPacketSize' }, 5 => { Name => 'StreamStartTime' }, 6 => { Name => 'StreamPreroll', ValueConv => '$val / 1000', PrintConv => 'ConvertDuration($val)' }, 7 => { Name => 'StreamDuration',ValueConv => '$val / 1000', PrintConv => 'ConvertDuration($val)' }, 8 => { Name => 'StreamNameLen', Format => 'int8u', Unknown => 1 }, 9 => { Name => 'StreamName', Format => 'string[$val{8}]' }, 10 => { Name => 'StreamMimeLen', Format => 'int8u', Unknown => 1 }, 11 => { Name => 'StreamMimeType', Format => 'string[$val{10}]', RawConv => '$self->{RealStreamMime} = $val', }, 12 => { Name => 'FileInfoLen', Unknown => 1 }, 13 => { Name => 'FileInfoLen2', # if this condition fails, subsequent tags will not be processed Condition => '$self->{RealStreamMime} eq "logical-fileinfo"', Unknown => 1, }, 14 => { Name => 'FileInfoVersion', Format => 'int16u', }, 15 => { Name => 'PhysicalStreams', Format => 'int16u', Unknown => 1, }, 16 => { Name => 'PhysicalStreamNumbers', Format => 'int16u[$val{15}]', Unknown => 1, }, 17 => { Name => 'DataOffsets', Format => 'int32u[$val{15}]', Unknown => 1, }, 18 => { Name => 'NumRules', Format => 'int16u', Unknown => 1, }, 19 => { Name => 'PhysicalStreamNumberMap', Format => 'int16u[$val{18}]', Unknown => 1, }, 20 => { Name => 'NumProperties', Format => 'int16u', Unknown => 1, }, 21 => { Name => 'FileInfoProperties', Format => 'undef[$val{13}-$val{15}*6-$val{18}*2-12]', SubDirectory => { TagTable => 'Image::ExifTool::Real::FileInfo' }, }, ); # Observed FileInfo properties (ref PH) %Image::ExifTool::Real::FileInfo = ( GROUPS => { 1 => 'Real-MDPR', 2 => 'Video' }, PROCESS_PROC => \&ProcessRealProperties, NOTES => q{ The following tags have been observed in the FileInfo properties, but any other existing information will also be extracted. }, Indexable => { PrintConv => { 0 => 'False', 1 => 'True' } }, Keywords => { }, Description => { }, 'File ID' => { Name => 'FileID' }, 'Content Rating' => { Name => 'ContentRating', PrintConv => { 0 => 'No Rating', 1 => 'All Ages', 2 => 'Older Children', 3 => 'Younger Teens', 4 => 'Older Teens', 5 => 'Adult Supervision Recommended', 6 => 'Adults Only', }, }, Audiences => { }, audioMode => { Name => 'AudioMode' }, 'Creation Date' => { Name => 'CreateDate', Groups => { 2 => 'Time' }, ValueConv => q{ $val =~ m{(\d+)/(\d+)/(\d+)\s+(\d+):(\d+):(\d+)} ? sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d",$3,$2,$1,$4,$5,$6) : $val }, PrintConv => '$self->ConvertDateTime($val)', }, 'Generated By' => { Name => 'Software' }, 'Modification Date' => { Name => 'ModifyDate', Groups => { 2 => 'Time' }, ValueConv => q{ $val =~ m{(\d+)/(\d+)/(\d+)\s+(\d+):(\d+):(\d+)} ? sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d",$3,$2,$1,$4,$5,$6) : $val }, PrintConv => '$self->ConvertDateTime($val)', }, 'Target Audiences' => { Name => 'TargetAudiences' }, 'Audio Format' => { Name => 'AudioFormat' }, 'Video Quality' => { Name => 'VideoQuality' }, videoMode => { Name => 'VideoMode' }, ); %Image::ExifTool::Real::ContentDescr = ( GROUPS => { 1 => 'Real-CONT', 2 => 'Video' }, PROCESS_PROC => \&Image::ExifTool::Canon::ProcessSerialData, VARS => { ID_LABEL => 'Sequence' }, FORMAT => 'int16u', 0 => { Name => 'TitleLen', Unknown => 1 }, 1 => { Name => 'Title', Format => 'string[$val{0}]' }, 2 => { Name => 'AuthorLen', Unknown => 1 }, 3 => { Name => 'Author', Format => 'string[$val{2}]', Groups => { 2 => 'Author' } }, 4 => { Name => 'CopyrightLen', Unknown => 1 }, 5 => { Name => 'Copyright', Format => 'string[$val{4}]', Groups => { 2 => 'Author' } }, 6 => { Name => 'CommentLen', Unknown => 1 }, 7 => { Name => 'Comment', Format => 'string[$val{6}]' }, ); # Real RJMD meta information (ref PH) %Image::ExifTool::Real::Metadata = ( GROUPS => { 1 => 'Real-RJMD', 2 => 'Video' }, PROCESS_PROC => \&ProcessRealMeta, NOTES => q{ The tags below represent information which has been observed in the Real Metadata format, but ExifTool will extract any information it finds in this format. (As far as I can tell from the referenced documentation, string values should be plain text, but this is not the case for the only sample file I have been able to obtain containing this information. These tags could also be split into separate sub-directories, but this will wait until I have better documentation or a more complete set of samples.) }, 'Album/Name' => 'AlbumName', 'Track/Category' => 'TrackCategory', 'Track/Comments' => 'TrackComments', 'Track/Lyrics' => 'TrackLyrics', ); %Image::ExifTool::Real::AudioV3 = ( GROUPS => { 1 => 'Real-RA3', 2 => 'Audio' }, PROCESS_PROC => \&Image::ExifTool::Canon::ProcessSerialData, VARS => { ID_LABEL => 'Sequence' }, FORMAT => 'int8u', 0 => { Name => 'Channels', Format => 'int16u' }, 1 => { Name => 'Unknown', Format => 'int16u[3]', Unknown => 1 }, 2 => { Name => 'BytesPerMinute', Format => 'int16u' }, 3 => { Name => 'AudioBytes', Format => 'int32u' }, 4 => { Name => 'TitleLen', Unknown => 1 }, 5 => { Name => 'Title', Format => 'string[$val{4}]' }, 6 => { Name => 'ArtistLen', Unknown => 1 }, 7 => { Name => 'Artist', Format => 'string[$val{6}]', Groups => { 2 => 'Author' } }, 8 => { Name => 'CopyrightLen', Unknown => 1 }, 9 => { Name => 'Copyright', Format => 'string[$val{8}]', Groups => { 2 => 'Author' } }, 10 => { Name => 'CommentLen', Unknown => 1 }, 11 => { Name => 'Comment', Format => 'string[$val{10}]' }, ); %Image::ExifTool::Real::AudioV4 = ( GROUPS => { 1 => 'Real-RA4', 2 => 'Audio' }, PROCESS_PROC => \&Image::ExifTool::Canon::ProcessSerialData, VARS => { ID_LABEL => 'Sequence' }, FORMAT => 'int16u', 0 => { Name => 'FourCC1', Format => 'undef[4]', Unknown => 1 }, 1 => { Name => 'AudioFileSize', Format => 'int32u', Unknown => 1 }, 2 => { Name => 'Version2', Unknown => 1 }, 3 => { Name => 'HeaderSize', Format => 'int32u', Unknown => 1 }, 4 => { Name => 'CodecFlavorID', Unknown => 1 }, 5 => { Name => 'CodedFrameSize', Format => 'int32u', Unknown => 1 }, 6 => { Name => 'AudioBytes', Format => 'int32u' }, 7 => { Name => 'BytesPerMinute', Format => 'int32u' }, 8 => { Name => 'Unknown', Format => 'int32u', Unknown => 1 }, 9 => { Name => 'SubPacketH', Unknown => 1 }, 10 => 'AudioFrameSize', 11 => { Name => 'SubPacketSize', Unknown => 1 }, 12 => { Name => 'Unknown', Unknown => 1 }, 13 => 'SampleRate', 14 => { Name => 'Unknown', Unknown => 1 }, 15 => 'BitsPerSample', 16 => 'Channels', 17 => { Name => 'FourCC2Len', Format => 'int8u', Unknown => 1 }, 18 => { Name => 'FourCC2', Format => 'undef[4]', Unknown => 1 }, 19 => { Name => 'FourCC3Len', Format => 'int8u', Unknown => 1 }, 20 => { Name => 'FourCC3', Format => 'undef[4]', Unknown => 1 }, 21 => { Name => 'Unknown', Format => 'int8u', Unknown => 1 }, 22 => { Name => 'Unknown', Unknown => 1 }, 23 => { Name => 'TitleLen', Format => 'int8u', Unknown => 1 }, 24 => { Name => 'Title', Format => 'string[$val{23}]' }, 25 => { Name => 'ArtistLen', Format => 'int8u', Unknown => 1 }, 26 => { Name => 'Artist', Format => 'string[$val{25}]', Groups => { 2 => 'Author' } }, 27 => { Name => 'CopyrightLen', Format => 'int8u', Unknown => 1 }, 28 => { Name => 'Copyright', Format => 'string[$val{27}]', Groups => { 2 => 'Author' } }, 29 => { Name => 'CommentLen', Format => 'int8u', Unknown => 1 }, 30 => { Name => 'Comment', Format => 'string[$val{29}]' }, ); %Image::ExifTool::Real::AudioV5 = ( GROUPS => { 1 => 'Real-RA5', 2 => 'Audio' }, PROCESS_PROC => \&Image::ExifTool::Canon::ProcessSerialData, VARS => { ID_LABEL => 'Sequence' }, FORMAT => 'int16u', 0 => { Name => 'FourCC1', Format => 'undef[4]', Unknown => 1 }, 1 => { Name => 'AudioFileSize', Format => 'int32u', Unknown => 1 }, 2 => { Name => 'Version2', Unknown => 1 }, 3 => { Name => 'HeaderSize', Format => 'int32u', Unknown => 1 }, 4 => { Name => 'CodecFlavorID', Unknown => 1 }, 5 => { Name => 'CodedFrameSize', Format => 'int32u', Unknown => 1 }, 6 => { Name => 'AudioBytes', Format => 'int32u' }, 7 => { Name => 'BytesPerMinute', Format => 'int32u' }, 8 => { Name => 'Unknown', Format => 'int32u', Unknown => 1 }, 9 => { Name => 'SubPacketH', Unknown => 1 }, 10 => { Name => 'FrameSize', Unknown => 1 }, 11 => { Name => 'SubPacketSize', Unknown => 1 }, 12 => 'SampleRate', 13 => { Name => 'SampleRate2', Unknown => 1 }, 14 => { Name => 'BitsPerSample', Format => 'int32u' }, 15 => 'Channels', 16 => { Name => 'Genr', Format => 'int32u', Unknown => 1 }, 17 => { Name => 'FourCC3', Format => 'undef[4]', Unknown => 1 }, ); #------------------------------------------------------------------------------ # Process Real NameValueProperties # Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table ref # Returns: 1 on success sub ProcessRealProperties($$$) { my ($et, $dirInfo, $tagTablePtr) = @_; my $dataPt = $$dirInfo{DataPt}; my $dirLen = $$dirInfo{DirLen}; my $pos = $$dirInfo{DirStart}; my $verbose = $et->Options('Verbose'); $verbose and $et->VerboseDir('RealProperties', undef, $dirLen); while ($pos + 6 <= $dirLen) { # get property size and version my ($size, $vers) = unpack("x${pos}Nn", $$dataPt); last if $size < 6; unless ($vers == 0) { $pos += $size; next; } $pos += 6; my $tagLen = unpack("x${pos}C", $$dataPt); ++$pos; last if $pos + $tagLen > $dirLen; my $tag = substr($$dataPt, $pos, $tagLen); $pos += $tagLen; last if $pos + 6 > $dirLen; my ($type, $valLen) = unpack("x${pos}Nn", $$dataPt); $pos += 6; last if $pos + $valLen > $dirLen; my $format = $propertyType{$type} || 'undef'; my $count = int($valLen / Image::ExifTool::FormatSize($format)); my $val = ReadValue($dataPt, $pos, $format, $count, $dirLen-$pos); my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); unless ($tagInfo) { my $tagName; ($tagName = $tag) =~ s/\s+//g; next unless $tagName =~ /^\w+$/; # ignore crazy names $tagInfo = { Name => ucfirst($tagName) }; AddTagToTable($tagTablePtr, $tag, $tagInfo); } if ($verbose) { $et->VerboseInfo($tag, $tagInfo, Table => $tagTablePtr, Value => $val, DataPt => $dataPt, Size => $valLen, Start => $pos, Addr => $pos + $$dirInfo{DataPos}, Format => $format, Count => $count, ); } $et->FoundTag($tagInfo, $val); $pos += $valLen; } return 1; } #------------------------------------------------------------------------------ # Process Real metadata properties # Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table ref # Returns: 1 on success sub ProcessRealMeta($$$) { my ($et, $dirInfo, $tagTablePtr) = @_; my $dataPt = $$dirInfo{DataPt}; my $dataPos = $$dirInfo{DataPos}; my $pos = $$dirInfo{DirStart}; my $dirEnd = $pos + $$dirInfo{DirLen}; my $verbose = $et->Options('Verbose'); my $prefix = $$dirInfo{Prefix} || ''; $prefix and $prefix .= '/'; $verbose and $et->VerboseDir('RealMetadata', undef, $$dirInfo{DirLen}); for (;;) { last if $pos + 28 > $dirEnd; # extract fixed-position metadata structure members my ($size, $type, $flags, $valuePos, $subPropPos, $numSubProps, $nameLen) = unpack("x${pos}N7", $$dataPt); # make pointers relative to data start $valuePos += $pos; $subPropPos += $pos; # validate what we have read so far last if $pos + $size > $dirEnd; last if $pos + 28 + $nameLen > $dirEnd; last if $valuePos < $pos + 28 + $nameLen; last if $valuePos + 4 > $dirEnd; my $tag = substr($$dataPt, $pos + 28, $nameLen); $tag =~ s/\0.*//s; # truncate at null $tag = $prefix . $tag; my $valueLen = unpack("x${valuePos}N", $$dataPt); $valuePos += 4; # point at value itself last if $valuePos + $valueLen > $dirEnd; my $format = $metadataFormat{$type}; my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); unless ($tagInfo) { my $tagName = $tag; $tagName =~ tr/A-Za-z0-9//dc; $tagInfo = { Name => ucfirst($tagName) }; AddTagToTable($tagTablePtr, $tag, $tagInfo); } if ($verbose) { $format = 'undef' unless defined $format; $flags = Image::ExifTool::DecodeBits($flags, \%metadataFlag); } if ($valueLen and $format) { # (a flag can be 1 or 4 bytes) if ($format eq 'flag') { $format = ($valueLen == 4) ? 'int32u' : 'int8u'; } elsif ($type == 7 and $tagInfo) { # add PrintConv and ValueConv for "date" type $$tagInfo{ValueConv} or $$tagInfo{ValueConv} = q{ $val =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/ ? sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d",$1,$2,$3,$4,$5,$6) : $val; }; $$tagInfo{PrintConv} or $$tagInfo{PrintConv} = '$self->ConvertDateTime($val)'; } my $count = int($valueLen / Image::ExifTool::FormatSize($format)); my $val = ReadValue($dataPt, $valuePos, $format, $count, $dirEnd-$valuePos); $et->HandleTag($tagTablePtr, $tag, $val, DataPt => $dataPt, DataPos => $dataPos, Start => $valuePos, Size => $valueLen, Format => "type=$type, flags=$flags", ); } # extract sub-properties if ($numSubProps) { my $dirStart = $valuePos + $valueLen + $numSubProps * 8; my %dirInfo = ( DataPt => $dataPt, DataPos => $dataPos, DirStart => $dirStart, DirLen => $pos + $size - $dirStart, Prefix => $tag, ); $et->ProcessDirectory(\%dirInfo, $tagTablePtr); } $pos += $size; # step to next Metadata structure } unless ($pos == $dirEnd) { $et->Warn('Format error in Real Metadata'); return 0; } return 1; } #------------------------------------------------------------------------------ # Read information frame a Real file # Inputs: 0) ExifTool object reference, 1) Directory information reference # Returns: 1 on success, 0 if this wasn't a valid Real file sub ProcessReal($$) { my ($et, $dirInfo) = @_; my $raf = $$dirInfo{RAF}; my ($buff, $tag, $vers, $extra, @mimeTypes, %dirCount); $raf->Read($buff, 8) == 8 or return 0; $buff =~ m{^(\.RMF|\.ra\xfd|pnm://|rtsp://|http://)} or return 0; my $fast3 = $$et{OPTIONS}{FastScan} && $$et{OPTIONS}{FastScan} == 3; my ($type, $tagTablePtr); if ($1 eq '.RMF') { $tagTablePtr = GetTagTable('Image::ExifTool::Real::Media'); $type = 'RM'; } elsif ($1 eq ".ra\xfd") { $tagTablePtr = GetTagTable('Image::ExifTool::Real::Audio'); $type = 'RA'; } else { $tagTablePtr = GetTagTable('Image::ExifTool::Real::Metafile'); my $ext = $$et{FILE_EXT}; $type = ($ext and $ext eq 'RPM') ? 'RPM' : 'RAM'; require Image::ExifTool::PostScript; local $/ = Image::ExifTool::PostScript::GetInputRecordSeparator($raf) || "\n"; $raf->Seek(0,0); while ($raf->ReadLine($buff)) { last if length $buff > 256; next unless $buff ; chomp $buff; if ($type) { # must be a Real file type if protocol is http return 0 if $buff =~ /^http/ and $buff !~ /\.(ra|rm|rv|rmvb|smil)$/i; $et->SetFileType($type); return 1 if $fast3; undef $type; } # save URL or Text from RAM file my $tag = $buff =~ m{^[a-z]{3,4}://} ? 'url' : 'txt'; $et->HandleTag($tagTablePtr, $tag, $buff); } return 1; } $et->SetFileType($type); return 1 if $fast3; SetByteOrder('MM'); my $verbose = $et->Options('Verbose'); # # Process RealAudio file # if ($type eq 'RA') { ($vers, $extra) = unpack('x4nn', $buff); $tag = ".ra$vers"; my $fpos = $raf->Tell(); unless ($raf->Read($buff, 512)) { $et->Warn('Error reading audio header'); return 1; } my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); if ($verbose > 2) { $et->VerboseInfo($tag, $tagInfo, DataPt => \$buff, DataPos => $fpos); } if ($tagInfo) { my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable}); my %dirInfo = ( DataPt => \$buff, DataPos => $fpos, DirLen => length $buff, DirStart => 0, ); $et->ProcessDirectory(\%dirInfo, $subTablePtr); } else { $et->Warn('Unsupported RealAudio version'); } return 1; } # # Process RealMedia file # # skip the rest of the RM header my $size = unpack('x4N', $buff); unless ($raf->Seek($size - 8, 1)) { $et->Warn('Error seeking in file'); return 0; } # Process RealMedia chunks for (;;) { $raf->Read($buff, 10) == 10 or last; ($tag, $size, $vers) = unpack('a4Nn', $buff); last if $tag eq "\0\0\0\0"; if ($verbose) { $et->VPrint(0, "$tag chunk ($size bytes):\n"); } else { last if $tag eq 'DATA'; # stop normal parsing at DATA tag } if ($size & 0x80000000) { $et->Warn('Bad chunk header'); last; } my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); if ($tagInfo and $$tagInfo{SubDirectory}) { my $fpos = $raf->Tell(); unless ($raf->Read($buff, $size-10) == $size-10) { $et->Warn("Error reading $tag chunk"); last; } if ($verbose > 2) { $et->VerboseInfo($tag, $tagInfo, DataPt => \$buff, DataPos => $fpos); } my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable}); my %dirInfo = ( DataPt => \$buff, DataPos => $fpos, DirLen => length $buff, DirStart => 0, ); if ($dirCount{$tag}) { $$et{SET_GROUP1} = '+' . ++$dirCount{$tag}; } else { $dirCount{$tag} = 1; } $et->ProcessDirectory(\%dirInfo, $subTablePtr); delete $$et{SET_GROUP1}; # keep track of stream MIME types my $mime = $$et{RealStreamMime}; if ($mime) { delete $$et{RealStreamMime}; $mime =~ s/\0.*//s; push @mimeTypes, $mime unless $mime =~ /^logical-/; } } else { unless ($raf->Seek($size-10, 1)) { $et->Warn('Error seeking in file'); last; } } } # override MIMEType with stream MIME type if we only have one stream if (@mimeTypes == 1 and length $mimeTypes[0]) { $$et{VALUE}{MIMEType} = $mimeTypes[0]; $et->VPrint(0, " MIMEType = $mimeTypes[0]\n"); } # # Process footer containing Real metadata and ID3 information # if ($raf->Seek(-140, 2) and $raf->Read($buff, 12) == 12 and $buff =~ /^RMJE/) { my $metaSize = unpack('x8N', $buff); if ($raf->Seek(-$metaSize-12, 1) and $raf->Read($buff, $metaSize) == $metaSize and $buff =~ /^RJMD/) { my %dirInfo = ( DataPt => \$buff, DataPos => $raf->Tell() - $metaSize, DirStart => 8, DirLen => length($buff) - 8, ); my $tagTablePtr = GetTagTable('Image::ExifTool::Real::Metadata'); $et->ProcessDirectory(\%dirInfo, $tagTablePtr); } else { $et->Warn('Bad metadata footer'); } if ($raf->Seek(-128, 2) and $raf->Read($buff, 128) == 128 and $buff =~ /^TAG/) { $et->VPrint(0, "ID3v1:\n"); my %dirInfo = ( DataPt => \$buff, DirStart => 0, DirLen => length($buff), ); my $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v1'); $et->ProcessDirectory(\%dirInfo, $tagTablePtr); } } return 1; } 1; # end __END__ =head1 NAME Image::ExifTool::Real - Read Real audio/video meta information =head1 SYNOPSIS This module is used by Image::ExifTool =head1 DESCRIPTION This module contains the routines required by Image::ExifTool to read meta information in RealAudio (RA), RealMedia (RM, RV and RMVB) and RealMedia Metafile (RAM and RPM) files. =head1 NOTES There must be a bug in the software that wrote the Metadata used in the test file t/images/Real.rm because the TrackLyricsDataSize word is written little-endian, but the Real format is big-endian. =head1 AUTHOR Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) 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<http://www.getid3.org/> =item L<https://common.helixcommunity.org/nonav/2003/HCS_SDK_r5/htmfiles/rmff.htm> =back =head1 SEE ALSO L<Image::ExifTool::TagNames/Real Tags>, L<Image::ExifTool(3pm)|Image::ExifTool> =cut
Close