Skip to content

Commit

Permalink
holy moly, multiple streams support! (thanks Ned!)
Browse files Browse the repository at this point in the history
  • Loading branch information
greatseth committed Apr 5, 2010
1 parent d2ee5a5 commit 15992da
Show file tree
Hide file tree
Showing 12 changed files with 1,296 additions and 564 deletions.
436 changes: 268 additions & 168 deletions lib/mediainfo.rb

Large diffs are not rendered by default.

55 changes: 26 additions & 29 deletions lib/mediainfo/attr_readers.rb
Expand Up @@ -3,45 +3,46 @@

class Mediainfo
module AttrReaders
def supported_attributes
@supported_attributes ||= []
end

def mediainfo_attr_reader(name, mediainfo_key = nil)
supported_attributes << name
attr_name = "#{name}_before_type_cast"
def mediainfo_attr_reader(method_name, mediainfo_key = nil)
# NOTE explicit self necessary here until we rename local var 'name'
stream_class_type = name[/::([^:]+)Stream$/, 1]

before_type_cast_method_name = "#{method_name}_before_type_cast"
mediainfo_key = mediainfo_key.gsub(/\W+/, "_").downcase if mediainfo_key

define_method attr_name do
if v = instance_variable_get("@#{attr_name}")
if m = stream_class_type.match(/^#{Regexp.union *Mediainfo::NON_GENERAL_SECTIONS.map { |x| x.to_s.capitalize }}$/)
k1 = stream_class_type.downcase.to_sym
else
k1 = :general
end

define_method before_type_cast_method_name do
if v = instance_variable_get("@#{before_type_cast_method_name}")
v
else
v = if md = name.to_s.match(/^(#{SECTIONS.map { |x| x.underscore } * "|"})_(.+)$/)
k = mediainfo_key ? mediainfo_key : md[2]
if subsection = @parsed_response[md[1]]
subsection[k]
end
else
k = mediainfo_key ? mediainfo_key : name.to_s
@parsed_response[k]
end
k2 = mediainfo_key ? mediainfo_key : method_name.to_s
v = @parsed_response[k1][k2]

instance_variable_set "@#{attr_name}", v
v
instance_variable_set "@#{before_type_cast_method_name}", v
instance_variable_get "@#{before_type_cast_method_name}"
end
end

define_method name do
if v = instance_variable_get("@#{name}")
define_method method_name do
if v = instance_variable_get("@#{method_name}")
v
else
v = send "#{name}_before_type_cast"
v = send(before_type_cast_method_name)
v = yield v if v and block_given?

instance_variable_set "@#{name}", v
v
instance_variable_set "@#{method_name}", v
instance_variable_get "@#{method_name}"
end
end

supported_attribute = method_name
supported_attribute = "#{stream_class_type.downcase}_#{method_name}".to_sym unless k1 == :general
Mediainfo.supported_attributes << supported_attribute
end

def mediainfo_duration_reader(*a)
Expand Down Expand Up @@ -70,9 +71,5 @@ def mediainfo_date_reader(*a)
def mediainfo_int_reader(*a)
mediainfo_attr_reader(*a) { |v| v.gsub(/\D+/, "").to_i }
end

def mediainfo_section_query(name)
define_method("#{name}?") { @parsed_response.key? name.to_s }
end
end
end
111 changes: 111 additions & 0 deletions test/fixtures/multiple-streams.xml
@@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8"?>
<Mediainfo>
<File>
<track type="General">
<Complete_name>/Users/seth/diversion/hdcloud/test/videos/brightcove/VzbWkxMTrgYv8UoOiXZrbzowe0CV8wIr-me2-grunt.mov</Complete_name>
<Format>MPEG-4</Format>
<Format_profile>QuickTime</Format_profile>
<Codec_ID>qt </Codec_ID>
<File_size>101 MiB</File_size>
<Duration>1mn 25s</Duration>
<Overall_bit_rate>9 872 Kbps</Overall_bit_rate>
<Encoded_date>UTC 2009-08-18 16:42:50</Encoded_date>
<Tagged_date>UTC 2009-08-18 16:42:55</Tagged_date>
<Writing_application>Sorenson Squeeze 5.0</Writing_application>
<Writing_library>Apple QuickTime</Writing_library>
<com.apple.quicktime.player.movie.audio.mute>(Binary)</com.apple.quicktime.player.movie.audio.mute>
</track>
<track type="Video" streamid="1">
<ID>2</ID>
<Format>AVC</Format>
<Format_Info>Advanced Video Codec</Format_Info>
<Format_profile>Baseline@L3.2</Format_profile>
<Format_settings__CABAC>No</Format_settings__CABAC>
<Format_settings__ReFrames>4 frames</Format_settings__ReFrames>
<Codec_ID>avc1</Codec_ID>
<Codec_ID_Info>Advanced Video Coding</Codec_ID_Info>
<Duration>1mn 25s</Duration>
<Bit_rate_mode>Variable</Bit_rate_mode>
<Bit_rate>9 392 Kbps</Bit_rate>
<Width>1 280 pixels</Width>
<Height>720 pixels</Height>
<Display_aspect_ratio>16:9</Display_aspect_ratio>
<Frame_rate_mode>Variable</Frame_rate_mode>
<Frame_rate>29.970 fps</Frame_rate>
<Minimum_frame_rate>29.940 fps</Minimum_frame_rate>
<Maximum_frame_rate>29.970 fps</Maximum_frame_rate>
<Standard>NTSC</Standard>
<Resolution>24 bits</Resolution>
<Colorimetry>4:2:0</Colorimetry>
<Scan_type>Progressive</Scan_type>
<Bits__Pixel_Frame_>0.340</Bits__Pixel_Frame_>
<Stream_size>95.6 MiB (95%)</Stream_size>
<Encoded_date>UTC 2009-08-17 05:05:13</Encoded_date>
<Tagged_date>UTC 2009-08-18 16:42:55</Tagged_date>
</track>
<track type="Video" streamid="2">
<ID>6</ID>
<Format>AVC</Format>
<Format_Info>Advanced Video Codec</Format_Info>
<Format_profile>Baseline@L3.2</Format_profile>
<Format_settings__CABAC>No</Format_settings__CABAC>
<Format_settings__ReFrames>4 frames</Format_settings__ReFrames>
<Codec_ID>avc1</Codec_ID>
<Codec_ID_Info>Advanced Video Coding</Codec_ID_Info>
<Duration>4s 170ms</Duration>
<Bit_rate_mode>Variable</Bit_rate_mode>
<Bit_rate>656 Kbps</Bit_rate>
<Width>1 280 pixels</Width>
<Height>720 pixels</Height>
<Display_aspect_ratio>16:9</Display_aspect_ratio>
<Frame_rate_mode>Constant</Frame_rate_mode>
<Frame_rate>29.970 fps</Frame_rate>
<Standard>NTSC</Standard>
<Resolution>24 bits</Resolution>
<Colorimetry>4:2:0</Colorimetry>
<Scan_type>Progressive</Scan_type>
<Bits__Pixel_Frame_>0.024</Bits__Pixel_Frame_>
<Stream_size>334 KiB (0%)</Stream_size>
<Encoded_date>UTC 2009-08-18 16:42:20</Encoded_date>
<Tagged_date>UTC 2009-08-18 16:42:56</Tagged_date>
</track>
<track type="Audio" streamid="1">
<ID>1</ID>
<Format>AAC</Format>
<Format_Info>Advanced Audio Codec</Format_Info>
<Format_version>Version 4</Format_version>
<Format_profile>LC</Format_profile>
<Format_settings__SBR>No</Format_settings__SBR>
<Codec_ID>40</Codec_ID>
<Duration>1mn 25s</Duration>
<Bit_rate_mode>Variable</Bit_rate_mode>
<Bit_rate>256 Kbps</Bit_rate>
<Channel_s_>2 channels</Channel_s_>
<Channel_positions>L R</Channel_positions>
<Sampling_rate>48.0 KHz</Sampling_rate>
<Resolution>16 bits</Resolution>
<Stream_size>2.61 MiB (3%)</Stream_size>
<Encoded_date>UTC 2009-08-17 05:05:13</Encoded_date>
<Tagged_date>UTC 2009-08-18 16:42:55</Tagged_date>
</track>
<track type="Audio" streamid="2">
<ID>5</ID>
<Format>AAC</Format>
<Format_Info>Advanced Audio Codec</Format_Info>
<Format_version>Version 4</Format_version>
<Format_profile>LC</Format_profile>
<Format_settings__SBR>No</Format_settings__SBR>
<Codec_ID>40</Codec_ID>
<Duration>4s 156ms</Duration>
<Bit_rate_mode>Constant</Bit_rate_mode>
<Bit_rate>256 Kbps</Bit_rate>
<Channel_s_>2 channels</Channel_s_>
<Channel_positions>L R</Channel_positions>
<Sampling_rate>44.1 KHz</Sampling_rate>
<Resolution>16 bits</Resolution>
<Stream_size>130 KiB (0%)</Stream_size>
<Encoded_date>UTC 2009-08-18 16:42:20</Encoded_date>
<Tagged_date>UTC 2009-08-18 16:42:56</Tagged_date>
</track>
</File>
</Mediainfo>

0 comments on commit 15992da

Please sign in to comment.