sig
  module Numbers :
    sig
      type rational = int64 * int64
      type srational = int32 * int32
      val float_of_rational : int64 * int64 -> float
      val float_of_srational : int32 * int32 -> float
      val string_of_rational : int64 -> int64 -> string
      val string_of_srational : int32 -> int32 -> string
    end
  module Endian :
    sig
      type t = Big | Little
      val to_string : Exif.Endian.t -> string
      val sys : Exif.Endian.t
    end
  module IFD : sig type t = IFD_0 | IFD_1 | EXIF | GPS | Interop end
  module Date :
    sig
      type t = { year : int; month : int; day : int; }
      val to_string : Exif.Date.t -> string
      val of_string : string -> [> `Error of string | `Ok of Exif.Date.t ]
    end
  module DateTime :
    sig
      type t = {
        year : int;
        month : int;
        day : int;
        hour : int;
        min : int;
        sec : int;
      }
      val to_string : Exif.DateTime.t -> string
      val of_string :
        string -> [> `Error of string | `Ok of Exif.DateTime.t ]
      val of_string_packed_unix_time :
        string -> [> `Error of string | `Ok of Exif.DateTime.t ]
    end
  module Tag :
    sig type t = int val to_string : Exif.Tag.t -> Exif.IFD.t -> string end
  module Entry :
    sig
      type t
      module Pack :
        sig
          type format =
              ILLEGAL
            | BYTE
            | ASCII
            | SHORT
            | LONG
            | RATIONAL
            | SBYTE
            | UNDEFINED
            | SSHORT
            | SLONG
            | SRATIONAL
            | FLOAT
            | DOUBLE
          val string_of_format : Exif.Entry.Pack.format -> string
          type unpacked =
              Bytes of int array
            | Asciis of string
            | Shorts of int array
            | Longs of int64 array
            | Rationals of (int64 * int64) array
            | SBytes of int array
            | Undefined of string
            | SShorts of int array
            | SLongs of int32 array
            | SRationals of (int32 * int32) array
            | Floats of float array
            | Doubles of float array
          val unpack :
            Exif.Entry.Pack.format ->
            int -> string -> Exif.Entry.Pack.unpacked
          val format : Format.formatter -> Exif.Entry.Pack.unpacked -> unit
        end
      module Decoded :
        sig
          type t = {
            tag : int;
            format : Exif.Entry.Pack.format;
            components : int;
            data : string;
          }
        end
      val decode : Exif.Entry.t -> Exif.Entry.Decoded.t
      type unpacked_entry = Exif.Tag.t * Exif.Entry.Pack.unpacked
      val unpack : Exif.Entry.Decoded.t -> Exif.Entry.unpacked_entry
      val format_unpacked_entry :
        Exif.IFD.t ->
        Exifutil.Format.formatter ->
        Exif.Tag.t * Exif.Entry.Pack.unpacked -> unit
      val format :
        Exif.IFD.t -> Exifutil.Format.formatter -> Exif.Entry.t -> unit
    end
  module Content :
    sig
      type t
      val entries : Exif.Content.t -> Exif.Entry.t list
      val format :
        Exif.IFD.t -> Exifutil.Format.formatter -> Exif.Content.t -> unit
    end
  module Data :
    sig
      type t
      val get_byte_order : Exif.Data.t -> Exif.Endian.t
      val set_byte_order : Exif.Data.t -> Exif.Endian.t -> unit
      val fix : Exif.Data.t -> unit
      val dump : Exif.Data.t -> unit
      val from_string : string -> Exif.Data.t
      val format : Exifutil.Format.formatter -> Exif.Data.t -> unit
      type contents = {
        ifd_0 : Exif.Content.t option;
        ifd_1 : Exif.Content.t option;
        exif : Exif.Content.t option;
        gps : Exif.Content.t option;
        interop : Exif.Content.t option;
      }
      val contents : Exif.Data.t -> Exif.Data.contents
      val get_ifd_0 : Exif.Data.t -> Exif.Content.t option
      val get_ifd_1 : Exif.Data.t -> Exif.Content.t option
      val get_exif : Exif.Data.t -> Exif.Content.t option
      val get_gps : Exif.Data.t -> Exif.Content.t option
      val get_interop : Exif.Data.t -> Exif.Content.t option
      val unpack_ifd_0 : Exif.Data.t -> Exif.Entry.unpacked_entry list option
      val unpack_ifd_1 : Exif.Data.t -> Exif.Entry.unpacked_entry list option
      val unpack_exif : Exif.Data.t -> Exif.Entry.unpacked_entry list option
      val unpack_gps : Exif.Data.t -> Exif.Entry.unpacked_entry list option
      val unpack_interop :
        Exif.Data.t -> Exif.Entry.unpacked_entry list option
    end
  module Analyze :
    sig
      type datetime =
          [ `EncodedInUnixTime of Exif.DateTime.t
          | `Error of string
          | `Ok of Exif.DateTime.t ]
      val parse_datetime : string -> [> Exif.Analyze.datetime ]
      val analyze_ifd :
        int * Exif.Entry.Pack.unpacked ->
        [> `DateTime of [> Exif.Analyze.datetime ]
         | `Make of string
         | `Model of string
         | `Orientation of
             [> `BottomLeft
              | `BottomRight
              | `LeftBottom
              | `LeftTop
              | `RightBottom
              | `RightTop
              | `TopLeft
              | `TopRight ]
         | `ResolutionUnit of [> `Centimeters | `Inches ]
         | `Software of Exif.Entry.Pack.unpacked
         | `Unknown of int * Exif.Entry.Pack.unpacked
         | `XResolution of int64 * int64
         | `YResolution of int64 * int64 ]
      val analyze_exif :
        int * Exif.Entry.Pack.unpacked ->
        [> `DateTimeDigitized of [> Exif.Analyze.datetime ]
         | `DateTimeOriginal of [> Exif.Analyze.datetime ]
         | `ExifVersion of string
         | `MakerNote of string
         | `SubsecTime of string
         | `SubsecTimeDigitized of string
         | `SubsecTimeOriginal of string
         | `Unknown of int * Exif.Entry.Pack.unpacked
         | `UserComment of string ]
      val analyze_gps :
        int * Exif.Entry.Pack.unpacked ->
        [> `AboveSeaLevel
         | `Altitude of int64 * int64
         | `BelowSeaLevel
         | `EastLongitude
         | `GPSDate of [> `Error of string | `Ok of Exif.Date.t ]
         | `GPSMapDatum of string
         | `GPSVersion of int * int * int * int
         | `ImgDirection of int64 * int64
         | `ImgDirectionMagnetic
         | `ImgDirectionTrue
         | `Latitude of int64 * int64
         | `Longitude of int64 * int64
         | `NorthLatitude
         | `SouthLatitude
         | `TimeStampUTC of float * float * float
         | `TimeStampUTCinSRationals of float * float * float
         | `Unknown of int * Exif.Entry.Pack.unpacked
         | `WestLongitude ]
      val ifd_0_datetime : Exif.Data.t -> [> Exif.Analyze.datetime ] option
      val exif_datetime : Exif.Data.t -> [> Exif.Analyze.datetime ] option
      val datetime : Exif.Data.t -> [> Exif.Analyze.datetime ] option
    end
end