module Sonycam::Liveview

Public Instance Methods

stream(liveview_url) { |packet| ... } click to toggle source
# File lib/sonycam/liveview.rb, line 7
def stream liveview_url
  uri = URI(liveview_url)
  Net::HTTP.start(uri.host, uri.port) do |http|
    request = Net::HTTP::Get.new uri
    http.request request do |response|
      state = :commen_header
      buf = ''.force_encoding('BINARY')
      commen_header = nil
      payload_header = nil
      response.read_body do |chunk|
        buf += chunk
        until buf.empty?
          case state
          when :commen_header # 8 bytes
            break if buf.size < 8
            commen_header = buf.slice!(0, 8).unpack('aanN')
            state = :payload_header
          when :payload_header # 128 bytes
            break if buf.size < 128
            payload_header = buf.slice!(0, 128).unpack('a4H6Ca4aa*')
            state = :payload_data
          when :payload_data
            jpeg_data_size = payload_header[1].to_i(16)
            padding_size = payload_header[2]
            break if buf.size < jpeg_data_size + padding_size
            jpeg_data = buf.slice!(0, jpeg_data_size)
            padding_data = buf.slice!(0, padding_size)
            state = :commen_header
            yield Packet.new(commen_header, payload_header, jpeg_data, padding_data)
          end # case state
        end # until buf.empty?
      end # response.read_body do |chunk|
    end # http.request request do |response|
  end rescue retry # Net::HTTP.start(uri.host, uri.port) do |http|
end