sig
  type t
  val create : Schroedinger.video_format -> Schroedinger.Encoder.t
  val get_video_format : Schroedinger.Encoder.t -> Schroedinger.video_format
  val encode_header : Schroedinger.Encoder.t -> Ogg.Stream.t -> unit
  val encode_frame :
    Schroedinger.Encoder.t -> Schroedinger.frame -> Ogg.Stream.t -> unit
  val encoded_of_granulepos : Int64.t -> Schroedinger.Encoder.t -> Int64.t
  val eos : Schroedinger.Encoder.t -> Ogg.Stream.t -> unit
  type rate_control =
      Constant_noise_threshold
    | Constant_bitrate
    | Low_delay
    | Lossless
    | Constant_lambda
    | Constant_error
  type gop_structure =
      Adaptive
    | Intra_only
    | Backref
    | Chained_backref
    | Biref
    | Chained_biref
  type perceptual_weighting = None | Ccir959 | Moo | Manos_sakrison
  type filtering =
      None
    | Center_weighted_median
    | Gaussian
    | Add_noise
    | Adaptive_gaussian
  type wavelet =
      Desl_dubuc_9_7
    | Le_gall_5_3
    | Desl_dubuc_13_7
    | Haar_0
    | Haar_1
    | Fidelity
    | Daub_9_7
  type block_size = Automatic | Small | Medium | Large
  type block_overlap = Automatic | None | Partial | Full
  type settings = {
    rate_control : Schroedinger.Encoder.rate_control;
    bitrate : int;
    max_bitrate : int;
    min_bitrate : int;
    buffer_size : int;
    buffer_level : int;
    noise_threshold : float;
    gop_structure : Schroedinger.Encoder.gop_structure;
    queue_depth : int;
    perceptual_weighting : Schroedinger.Encoder.perceptual_weighting;
    perceptual_distance : float;
    filtering : Schroedinger.Encoder.filtering;
    filter_value : float;
    profile : int;
    level : int;
    au_distance : int;
    enable_psnr : bool;
    enable_ssim : bool;
    ref_distance : int;
    transform_depth : int;
    intra_wavelet : Schroedinger.Encoder.wavelet;
    inter_wavelet : Schroedinger.Encoder.wavelet;
    mv_precision : int;
    motion_block_size : Schroedinger.Encoder.block_size;
    motion_block_overlap : Schroedinger.Encoder.block_overlap;
    interlaced_coding : bool;
    enable_internal_testing : bool;
    enable_noarith : bool;
    enable_md5 : bool;
    enable_fullscan_estimation : bool;
    enable_hierarchical_estimation : bool;
    enable_zero_estimation : bool;
    enable_phasecorr_estimation : bool;
    enable_bigblock_estimation : bool;
    horiz_slices : int;
    vert_slices : int;
    magic_dc_metric_offset : float;
    magic_subband0_lambda_scale : float;
    magic_chroma_lambda_scale : float;
    magic_nonref_lambda_scale : float;
    magic_allocation_scale : float;
    magic_keyframe_weight : float;
    magic_scene_change_threshold : float;
    magic_inter_p_weight : float;
    magic_inter_b_weight : float;
    magic_mc_bailout_limit : float;
    magic_bailout_weight : float;
    magic_error_power : float;
    magic_mc_lambda : float;
    magic_subgroup_length : float;
    magic_lambda : float;
  }
  val get_settings : Schroedinger.Encoder.t -> Schroedinger.Encoder.settings
  val set_settings :
    Schroedinger.Encoder.t -> Schroedinger.Encoder.settings -> unit
end