Parent

Class/Module Index [+]

Quicksearch

MediaInfo

Constants

INFO_ALL

TODO: add signals

INFO_FORMAT

Public Class Methods

new(source_element) click to toggle source
# File gstreamer/sample/media-type2.rb, line 38
def initialize(source_element)
  @pipeline = Gst::Pipeline.new 'media-info'
  @typefind = Gst::ElementFactory.make 'typefind', 'typefind'
  @source_element = source_element
  @source = Gst::ElementFactory.make @source_element, 'source'
  if @source != nil
    @pipeline.add @source
  else
    @source_element = nil
    @source = nil
  end
  @decoder = @type = @format = @metadata = @stream = nil
  @decoders = Hash.new
  @pipeline.signal_connect 'deep_notify' do |obj, origin, pspec|
    case pspec.name
    when 'metadata'
      @metadata = origin.metadata
    when 'caps'
      @format = origin.caps if origin == @decoder_pad
    when 'streaminfo'
      @streaminfo = origin.streaminfo
    end
  end
end

Public Instance Methods

clear_decoder() click to toggle source
# File gstreamer/sample/media-type2.rb, line 173
def clear_decoder
  if @decoder != nil
    @pipeline.ready
    @source.unlink_pads @decoder
    @pipeline.remove @decoder
    @decoder = nil
  end
end
find_format() click to toggle source
# File gstreamer/sample/media-type2.rb, line 164
def find_format
  @pipeline.play
  while @format == nil && @pipeline.iterate do end
  @pipeline.pause
  format = @format
  @format = nil
  return format
end
find_metadata() click to toggle source
# File gstreamer/sample/media-type2.rb, line 139
def find_metadata
  @pipeline.play
  while @metadata == nil && @pipeline.iterate do end
  @pipeline.pause
  metadata = @metadata
  @metadata = nil
  return metadata
end
find_streaminfo() click to toggle source
# File gstreamer/sample/media-type2.rb, line 148
def find_streaminfo
  @pipeline.play
  while @streaminfo == nil && @pipeline.iterate do end
  @pipeline.pause
  streaminfo = @streaminfo
  @streaminfo = nil

  track_format = Gst::Format.find 'logical_stream'
  if track_format != nil
    start = @decoder_pad.query(Gst::QueryType::POSITION, track_format.type_id)
    track_num = start
    # XXX: need Gst::Pad#convert
  end
  return streaminfo
end
find_type(location) click to toggle source
# File gstreamer/sample/media-type2.rb, line 98
def find_type(location)
  @type = nil
  @pipeline.add @typefind
  @source.location = location
  @source >> @typefind
  @typefind.signal_connect 'have-type' do |typefind, type|
    @type = type
  end
  @pipeline.play
  while @type == nil && @pipeline.iterate do end
  @pipeline.ready
  # TODO: this is different
  @source.unlink_pads @typefind
  @pipeline.remove @typefind
end
get_decoder(mime) click to toggle source
# File gstreamer/sample/media-type2.rb, line 82
def get_decoder(mime)
  decoder = @decoders[mime]
  if decoder == nil
    factories = {
      'application/x-ogg' => 'vorbisfile',
      'audio/x-mp3' => 'mad',
      'audio/x-wav' => 'wavparse'
    }
    factory = factories[mime]
    return nil if factory == nil
    decoder = Gst::ElementFactory.make factory, 'decoder'
    @decoders[mime] = decoder if decoder != nil
  end
  return decoder
end
get_stream(stream) click to toggle source
# File gstreamer/sample/media-type2.rb, line 114
def get_stream(stream)
  @pipeline.play
  while @format == nil && @pipeline.iterate do end
  @pipeline.pause
  return nil if @format == nil
  track_format = Gst::Format.find 'logical_stream'
  @decoder_pad.formats.each do |format|
    value = @decoder_pad.query(Gst::QueryType::TOTAL, format.type_id)
    case format.type_id
    when Gst::Format::TIME
      stream.length_time = value ? value : 1
    else
      stream.length_tracks = value if format == track_format && value != nil
    end
  end
  stream.length_tracks = 1 if stream.length_tracks == 0
  value = @source_pad.query(Gst::QueryType::TOTAL, Gst::Format::BYTES)
  if value
    seconds = stream.length_time.to_f / Gst::SECOND 
    bits = value * 8
    stream.bitrate = bits / seconds
  end
  return stream
end
read(location, flags) click to toggle source
# File gstreamer/sample/media-type2.rb, line 204
def read(location, flags)
  reset
  find_type location
  return nil if @type == nil
  stream = MediaInfoStream.new
  mime = @type.mime
  stream.mime = mime if flags & INFO_MIME
  stream.path = location
  decoder = get_decoder mime
  return nil if decoder == nil
  set_decoder decoder
  stream = get_stream stream
  stream.length_tracks.times do |i|
    track = MediaInfoTrack.new
    track.metadata = find_metadata if flags & INFO_METADATA
    track.streaminfo = find_streaminfo if flags & INFO_STREAMINFO
    track.format = find_format if flags & INFO_FORMAT
    stream.tracks << track
  end
  clear_decoder
  return stream
end
reset() click to toggle source
# File gstreamer/sample/media-type2.rb, line 63
def reset
  @format = nil
  @metadata = nil
  @stream = nil
end
seek_to_track(track) click to toggle source
# File gstreamer/sample/media-type2.rb, line 69
def seek_to_track(track)
  track_format = Gst::Format.find 'logical_stream'
  return false if track_format == nil
  @pipeline.play
              # XXX: todo, need Gst::Event
  event = gst_event_new_seek(format.id | Gst::EventSeek::METHOD_SET |
                             Gst::EventSeek::FLAG_FLUSH)
  return false if event == nil
  @metadata = nil
  @streaminfo = nil
  return true
end
set_decoder(decoder) click to toggle source
# File gstreamer/sample/media-type2.rb, line 182
def set_decoder(decoder)
  @decoder = decoder
  @pipeline.add @decoder
  @source >> @decoder
  @decoder_pad = @decoder.get_pad 'src'
  @source_pad = @source.get_pad 'src'
end
set_source(source) click to toggle source
# File gstreamer/sample/media-type2.rb, line 190
def set_source(source)
  src = Gst::ElementFactory.make source, 'new-source'
  return false if src == nil
  if @source != nil
    @pipeline.remove @source
    @source_element = nil if @source_element != nil
  end
  src.name = 'source'
  @pipeline.add src
  @source = src
  @source_element = source
  return true
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.