sig
  val log : Dtools.Log.t
  exception Invalid_data
  exception Invalid_usage
  type audio = float array array
  type video = Video.buffer
  type 'a data = { data : 'a; offset : int; length : int; }
  type track_data =
      Audio_data of Ogg_muxer.audio Ogg_muxer.data
    | Video_data of Ogg_muxer.video Ogg_muxer.data
  type 'a track_encoder =
      'Ogg_muxer.data -> Ogg.Stream.t -> (Ogg.Page.t -> unit) -> unit
  type header_encoder = Ogg.Stream.t -> Ogg.Page.t
  type position = Unknown | Time of float
  type page_end_time = Ogg.Page.t -> Ogg_muxer.position
  type fisbone_packet = Ogg.Stream.t -> Ogg.Stream.packet option
  type stream_start = Ogg.Stream.t -> Ogg.Page.t list
  type end_of_stream = Ogg.Stream.t -> unit
  type data_encoder =
      Audio_encoder of Ogg_muxer.audio Ogg_muxer.track_encoder
    | Video_encoder of Ogg_muxer.video Ogg_muxer.track_encoder
  type stream_encoder = {
    header_encoder : Ogg_muxer.header_encoder;
    fisbone_packet : Ogg_muxer.fisbone_packet;
    stream_start : Ogg_muxer.stream_start;
    data_encoder : Ogg_muxer.data_encoder;
    end_of_page : Ogg_muxer.page_end_time;
    end_of_stream : Ogg_muxer.end_of_stream;
  }
  type t
  type state = Eos | Streaming | Bos
  val create : skeleton:bool -> string -> Ogg_muxer.t
  val state : Ogg_muxer.t -> Ogg_muxer.state
  val get_data : Ogg_muxer.t -> string
  val get_header : Ogg_muxer.t -> string
  val peek_data : Ogg_muxer.t -> string
  val register_track :
    ?fill:int -> Ogg_muxer.t -> Ogg_muxer.stream_encoder -> nativeint
  val streams_start : Ogg_muxer.t -> unit
  val encode : Ogg_muxer.t -> nativeint -> Ogg_muxer.track_data -> unit
  val end_of_track : Ogg_muxer.t -> nativeint -> unit
  val end_of_stream : Ogg_muxer.t -> unit
  val flush_pages : Ogg.Stream.t -> Ogg.Page.t list
end