// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

module media;

import "lib/media/fidl/audio_renderer.fidl";
import "lib/media/fidl/media_capturer.fidl";
import "lib/media/fidl/media_player.fidl";
import "lib/media/fidl/media_renderer.fidl";
import "lib/media/fidl/media_sink.fidl";
import "lib/media/fidl/media_source.fidl";
import "lib/media/fidl/media_type_converter.fidl";
import "lib/media/fidl/media_types.fidl";
import "lib/media/fidl/seeking_reader.fidl";
import "lib/media/fidl/timeline_controller.fidl";
import "lib/media/fidl/video_renderer.fidl";

// Primary media service definition.
[ServiceName="media::MediaService"]
interface MediaService {
  // Creates a player that reads from a file specified by channel.
  CreateFilePlayer@0(handle<channel> file_channel,
                     MediaRenderer? audio_renderer,
                     MediaRenderer? video_renderer,
                     MediaPlayer& player);

  // Creates a player that reads from a seeking reader.
  CreatePlayer@1(SeekingReader? reader,
                 MediaRenderer? audio_renderer,
                 MediaRenderer? video_renderer,
                 MediaPlayer& player);

  // Creates a source. If allowed_media_types is supplied, conversions will be
  // added to each stream as needed to make the media type of the stream match
  // one of the allowed types. If a stream cannot be converted to one of the
  // allowed types, the source will not expose that stream.
  CreateSource@2(SeekingReader reader,
                 array<MediaTypeSet>? allowed_media_types,
                 MediaSource& source);

  // Creates a sink.
  CreateSink@3(MediaRenderer renderer, MediaSink& sink);

  // Creates a demux.
  CreateDemux@4(SeekingReader reader, MediaSource& demux);

  // Creates a decoder.
  CreateDecoder@5(MediaType input_media_type, MediaTypeConverter& decoder);

  // Creates a network reader.
  CreateNetworkReader@6(string url, SeekingReader& reader);

  // Creates an audio renderer.
  CreateAudioRenderer@7(AudioRenderer& audio_renderer,
                        MediaRenderer& media_renderer);

  // Creates a video renderer.
  CreateVideoRenderer@8(VideoRenderer& video_renderer,
                        MediaRenderer& media_renderer);

  // Creates a timeline controller reader.
  CreateTimelineController@9(MediaTimelineController& timeline_controller);

  // Creates a reformatter for LPCM audio.
  CreateLpcmReformatter@10(MediaType input_media_type,
                          AudioSampleFormat output_sample_format,
                          MediaTypeConverter& lpcm_reformatter);
};
