// 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.net.oldhttp;
using fuchsia.ui.viewsv1;
using fuchsia.ui.viewsv1token;

// Plays media.
[Discoverable]
interface Player : 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.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.
    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.
    TimelineFunction? timeline_function;

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