class FormatParser::DPXParser

Constants

BE_MAGIC
DPX_MIME_TYPE

There is no official MIME type for DPX, so we have to invent something useful. We will prefix it with x- to indicate that it is a vendor subtype

LE_MAGIC

Public Instance Methods

call(io) click to toggle source
# File lib/parsers/dpx_parser.rb, line 31
def call(io)
  io = FormatParser::IOConstraint.new(io)
  magic = safe_read(io, 4)
  return unless [BE_MAGIC, LE_MAGIC].include?(magic)

  io.seek(0)

  dpx_structure = DPX.read_and_unpack(ByteOrderHintIO.new(io, magic == LE_MAGIC))

  w = dpx_structure.fetch(:image).fetch(:pixels_per_line)
  h = dpx_structure.fetch(:image).fetch(:lines_per_element)

  display_w = w
  display_h = h

  pixel_aspect_w = dpx_structure.fetch(:orientation).fetch(:horizontal_pixel_aspect)
  pixel_aspect_h = dpx_structure.fetch(:orientation).fetch(:vertical_pixel_aspect)

  # Find display height and width based on aspect only if the file structure has pixel aspects
  if pixel_aspect_h != 0 && pixel_aspect_w != 0
    pixel_aspect = pixel_aspect_w / pixel_aspect_h.to_f

    image_aspect = w / h.to_f * pixel_aspect

    if image_aspect > 1
      display_h = (display_w / image_aspect).round
    else
      display_w = (display_h * image_aspect).round
    end
  end

  FormatParser::Image.new(
    format: :dpx,
    width_px: w,
    height_px: h,
    display_width_px: display_w,
    display_height_px: display_h,
    intrinsics: dpx_structure,
    content_type: DPX_MIME_TYPE,
  )
end
likely_match?(filename) click to toggle source
# File lib/parsers/dpx_parser.rb, line 27
def likely_match?(filename)
  filename =~ /\.dpx$/i
end