// Copyright 2018 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.

library fuchsia.mediaplayer;

using fuchsia.math;
using fuchsia.media;
using fuchsia.media.audio;
using fuchsia.net.oldhttp;
using fuchsia.ui.viewsv1;
using fuchsia.ui.viewsv1token;

// Plays media.
[Discoverable]
protocol Player {
    compose SourceManager;
    /////////////////////////////////////////////////////////////////////////////
    // Player methods
    // These methods will remain in Player.
    // TODO(dalesat): Player will inherit SourceManager and SinkManager.

    // Sets an HTTP URL to read from. The provided headers are added to each
    // HTTP request issued to the URL.
    SetHttpSource(string http_url,
                  vector<fuchsia.net.oldhttp.HttpHeader>? headers);

    // Sets a file channel to read from.
    SetFileSource(handle<channel> file_channel);

    // Starts playback.
    Play();

    // Pauses playback.
    Pause();

    // Provides current status immediately after binding and whenever status
    // changes thereafter.
    -> OnStatusChanged(PlayerStatus player_status);

    // Seeks to the specified position, specified in nanoseconds.
    Seek(int64 position);

    // Creates a video view.
    // DEPRECATED
    CreateView(fuchsia.ui.viewsv1.ViewManager view_manager,
               request<fuchsia.ui.viewsv1token.ViewOwner> view_owner_request);

    // Creates a video view.
    // Temporary, in use for V2 transition.
    CreateView2(handle<eventpair> view_owner_token);

    // Binds to the gain control for this player.
    BindGainControl(
        request<fuchsia.media.audio.GainControl> gain_control_request);

    // Adds a new binding to this player.
    AddBinding(request<Player> player_request);

    /////////////////////////////////////////////////////////////////////////////
    // SourceManager methods
    // See source_manager.fidl

    /////////////////////////////////////////////////////////////////////////////
    // SinkManager methods
    // Player will inherit the SinkManager interface.
};

// Player status information.
struct PlayerStatus {
    // Duration in nanoseconds.
    int64 duration_ns;

    // Whether the player can pause.
    bool can_pause;

    // Whether the player can seek.
    bool can_seek;

    // Whether the source has an audio stream.
    bool has_audio;

    // Whether the source has a video stream.
    bool has_video;

    // Indicates whether the player is ready to play. After SetHttpSource,
    // SetFileSource or SourceManager.SetSource is called, this value is false
    // until the player is fully prepared to play the content from the source.
    bool ready;

    // Describes the media.
    fuchsia.media.Metadata? metadata;

    // Indicates a problem preventing intended operation.
    Problem? problem;

    // Indicates whether an audio stream is currently connected for rendering.
    // This value will be false if |has_audio| is false if the audio stream
    // type isn't supported.
    bool audio_connected;

    // Indicates whether a video stream is currently connected for rendering.
    // This value will be false if |has_video| is false if the video stream
    // type isn't supported.
    bool video_connected;

    // Size of the video currently being produced.
    fuchsia.math.Size? video_size;

    // Relative dimensions of a video pixel.
    fuchsia.math.Size? pixel_aspect_ratio;

    // Function translating local time to presentation time.
    fuchsia.media.TimelineFunction? timeline_function;

    // Indicates whether presentation has reached end-of-stream.
    bool end_of_stream;
};
