sig
  exception Incorrect_stream_type
  module type S =
    sig
      type t
      val length : Generator.S.t -> int
      val remaining : Generator.S.t -> int
      val clear : Generator.S.t -> unit
      val fill : Generator.S.t -> Frame.t -> unit
      val remove : Generator.S.t -> int -> unit
      val add_metadata : Generator.S.t -> Frame.metadata -> unit
    end
  module Generator :
    sig
      type 'a t
      val create : unit -> 'Generator.Generator.t
      val clear : 'Generator.Generator.t -> unit
      val length : 'Generator.Generator.t -> int
      val remove : 'Generator.Generator.t -> int -> unit
      val put : 'Generator.Generator.t -> '-> int -> int -> unit
      val get :
        'Generator.Generator.t -> int -> ('a * int * int * int) list
    end
  module From_frames :
    sig
      type t
      val create : unit -> Generator.From_frames.t
      val clear : Generator.From_frames.t -> unit
      val length : Generator.From_frames.t -> int
      val remaining : Generator.From_frames.t -> int
      val add_metadata : Generator.From_frames.t -> Frame.metadata -> unit
      val add_break : Generator.From_frames.t -> unit
      val remove : Generator.From_frames.t -> int -> unit
      val feed :
        Generator.From_frames.t ->
        ?copy:bool ->
        ?breaks:int list ->
        ?metadata:(int * Frame.metadata) list ->
        Frame.content -> int -> int -> unit
      val feed_from_frame : Generator.From_frames.t -> Frame.t -> unit
      val fill : Generator.From_frames.t -> Frame.t -> unit
    end
  module From_audio_video :
    sig
      type t
      type mode = [ `Audio | `Both | `Undefined | `Video ]
      val create :
        Generator.From_audio_video.mode -> Generator.From_audio_video.t
      val mode :
        Generator.From_audio_video.t -> Generator.From_audio_video.mode
      val set_mode :
        Generator.From_audio_video.t ->
        Generator.From_audio_video.mode -> unit
      val audio_length : Generator.From_audio_video.t -> int
      val video_length : Generator.From_audio_video.t -> int
      val length : Generator.From_audio_video.t -> int
      val remaining : Generator.From_audio_video.t -> int
      val add_metadata :
        Generator.From_audio_video.t -> Frame.metadata -> unit
      val add_break :
        ?sync:[ `Drop | `Ignore | `Strict ] ->
        Generator.From_audio_video.t -> unit
      val put_audio :
        Generator.From_audio_video.t ->
        Frame.audio_t array -> int -> int -> unit
      val put_video :
        Generator.From_audio_video.t ->
        Frame.video_t array -> int -> int -> unit
      val fill : Generator.From_audio_video.t -> Frame.t -> unit
      val remove : Generator.From_audio_video.t -> int -> unit
      val clear : Generator.From_audio_video.t -> unit
    end
  module type S_Asio =
    sig
      type t
      val length : Generator.S_Asio.t -> int
      val audio_length : Generator.S_Asio.t -> int
      val video_length : Generator.S_Asio.t -> int
      val remaining : Generator.S_Asio.t -> int
      val clear : Generator.S_Asio.t -> unit
      val fill : Generator.S_Asio.t -> Frame.t -> unit
      val add_metadata : Generator.S_Asio.t -> Frame.metadata -> unit
      val add_break :
        ?sync:[ `Drop | `Ignore | `Strict ] -> Generator.S_Asio.t -> unit
      val put_audio :
        Generator.S_Asio.t -> Frame.audio_t array -> int -> int -> unit
      val put_video :
        Generator.S_Asio.t -> Frame.video_t array -> int -> int -> unit
      val set_mode :
        Generator.S_Asio.t ->
        [ `Audio | `Both | `Undefined | `Video ] -> unit
    end
  module From_audio_video_plus :
    sig
      type t
      type mode = [ `Audio | `Both | `Undefined | `Video ]
      type overfull = [ `Drop_old of int ]
      val create :
        ?lock:Mutex.t ->
        ?overfull:Generator.From_audio_video_plus.overfull ->
        kind:Frame.content_kind ->
        log:(string -> unit) ->
        Generator.From_audio_video_plus.mode ->
        Generator.From_audio_video_plus.t
      val mode :
        Generator.From_audio_video_plus.t -> Generator.From_audio_video.mode
      val set_mode :
        Generator.From_audio_video_plus.t ->
        Generator.From_audio_video.mode -> unit
      val audio_length : Generator.From_audio_video_plus.t -> int
      val video_length : Generator.From_audio_video_plus.t -> int
      val length : Generator.From_audio_video_plus.t -> int
      val remaining : Generator.From_audio_video_plus.t -> int
      val set_rewrite_metadata :
        Generator.From_audio_video_plus.t ->
        (Frame.metadata -> Frame.metadata) -> unit
      val add_metadata :
        Generator.From_audio_video_plus.t -> Frame.metadata -> unit
      val add_break :
        ?sync:[ `Drop | `Ignore | `Strict ] ->
        Generator.From_audio_video_plus.t -> unit
      val put_audio :
        Generator.From_audio_video_plus.t ->
        Frame.audio_t array -> int -> int -> unit
      val put_video :
        Generator.From_audio_video_plus.t ->
        Frame.video_t array -> int -> int -> unit
      val fill : Generator.From_audio_video_plus.t -> Frame.t -> unit
      val remove : Generator.From_audio_video_plus.t -> int -> unit
      val clear : Generator.From_audio_video_plus.t -> unit
    end
end