Audio-WMA
view release on metacpan or search on metacpan
$image_mime = _UTF16ToUTF8($image_mime);
$image_desc = _UTF16ToUTF8($image_desc);
$image_data = substr($value, $offset, $image_size);
$value = {
'TYPE' => $image_mime,
'DATA' => $image_data,
};
if ($DEBUG) {
print "Ext Cont Desc: $id";
print "\tname = $name\n";
print "\timage_type_id = $image_type_id\n";
print "\timage_size = $image_size\n";
print "\timage_mime = $image_mime\n";
print "\timage_desc = $image_desc\n";
print "\n";
}
}
$ext{'content'}->{$id} = {
'name' => $name,
'value' => $value,
};
}
push @{$self->{'EXT'}}, \%ext;
}
sub _parseASFStreamPropertiesObject {
my $self = shift;
my $inline = shift;
my %stream = ();
my $streamNumber;
# Stream Properties Object: (mandatory, one per media stream)
# Field Name Field Type Size (bits)
# Object ID GUID 128 GUID for stream properties object - ASF_Stream_Properties_Object
# Object Size QWORD 64 size of stream properties object, including 78 bytes of
# Stream Properties Object header
# Stream Type GUID 128 ASF_Audio_Media, ASF_Video_Media or ASF_Command_Media
# Error Correction Type GUID 128 ASF_Audio_Spread for audio-only streams,
# ASF_No_Error_Correction for other stream types
# Time Offset QWORD 64 100-nanosecond units. typically zero. added to all
# timestamps of samples in the stream
# Type-Specific Data Length DWORD 32 number of bytes for Type-Specific Data field
# Error Correction Data Length DWORD 32 number of bytes for Error Correction Data field
# Flags WORD 16
# * Stream Number bits 7 (0x007F) number of this stream. 1 <= valid <= 127
# * Reserved bits 8 (0x7F80) reserved - set to zero
# * Encrypted Content Flag bits 1 (0x8000) stream contents encrypted if set
# Reserved DWORD 32 reserved - set to zero
# Type-Specific Data BYTESTREAM variable type-specific format data, depending on value of Stream Type
# Error Correction Data BYTESTREAM variable error-correction-specific format data, depending on
# value of Error Correct Type
#
# There is one ASF_Stream_Properties_Object for each stream (audio, video) but the
# stream number isn't known until halfway through decoding the structure, hence it
# it is decoded to a temporary variable and then stuck in the appropriate index later
my $method = $inline ? '_readAndIncrementInlineOffset' : '_readAndIncrementOffset';
$stream{'stream_type'} = $self->$method($GUID);
$stream{'stream_type_guid'} = _byteStringToGUID($stream{'stream_type'});
$stream{'error_correct_type'} = $self->$method($GUID);
$stream{'error_correct_guid'} = _byteStringToGUID($stream{'error_correct_type'});
$stream{'time_offset'} = unpack('v', $self->$method($QWORD));
$stream{'type_data_length'} = unpack('V', $self->$method($DWORD));
$stream{'error_data_length'} = unpack('V', $self->$method($DWORD));
$stream{'flags_raw'} = unpack('v', $self->$method($WORD));
$stream{'streamNumber'} = $stream{'flags_raw'} & 0x007F;
$stream{'flags'}{'encrypted'} = ($stream{'flags_raw'} & 0x8000);
# Skip the reserved DWORD
$self->$method($DWORD);
# XXX: If a file has bogus data for either of these length values
# it will screw up parsing the rest of the header
# i.e. mms://c9l.earthcache.net/wlc-01.media.globix.net/COMP005996BCT1_wqxr_live_hi.wmv
$stream{'type_specific_data'} = $self->$method($stream{'type_data_length'});
$stream{'error_correct_data'} = $self->$method($stream{'error_data_length'});
push @{$self->{'STREAM'}}, \%stream;
}
sub _parseASFStreamBitratePropertiesObject {
my $self = shift;
my $bitrates = {};
my $count = unpack('v', $self->_readAndIncrementOffset($WORD));
# Read each bitrate record
for ( 1..$count ) {
my $stream = unpack('v', $self->_readAndIncrementOffset($WORD)) & 0x007F;
my $bitrate = unpack('V', $self->_readAndIncrementOffset($DWORD));
$bitrates->{$stream} = $bitrate;
}
$self->{'BITRATES'} = $bitrates;
}
sub _parseASFAudioMediaObject {
my $self = shift;
my $stream = shift;
# Field Name Field Type Size (bits)
# Codec ID / Format Tag WORD 16 unique ID of audio codec - defined as wFormatTag field of WAVEFORMATEX structure
#
# Number of Channels WORD 16 number of channels of audio - defined as nChannels field of WAVEFORMATEX structure
#
# Samples Per Second DWORD 32 in Hertz - defined as nSamplesPerSec field of WAVEFORMATEX structure
#
# Average number of Bytes/sec DWORD 32 bytes/sec of audio stream - defined as nAvgBytesPerSec field of WAVEFORMATEX structure
#
# Block Alignment WORD 16 block size in bytes of audio codec - defined as nBlockAlign field of WAVEFORMATEX structure
#
# Bits per sample WORD 16 bits per sample of mono data. set to zero for variable bitrate codecs.
( run in 0.529 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )