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

#ifndef SRC_MEDIA_PLAYBACK_MEDIAPLAYER_DEMUX_DEMUX_H_
#define SRC_MEDIA_PLAYBACK_MEDIAPLAYER_DEMUX_DEMUX_H_

#include <memory>
#include <vector>

#include <lib/fit/function.h>

#include "lib/component/cpp/startup_context.h"
#include "src/media/playback/mediaplayer/demux/reader_cache.h"
#include "src/media/playback/mediaplayer/graph/metadata.h"
#include "src/media/playback/mediaplayer/graph/nodes/node.h"
#include "src/media/playback/mediaplayer/graph/packet.h"
#include "src/media/playback/mediaplayer/graph/result.h"
#include "src/media/playback/mediaplayer/graph/types/stream_type.h"

namespace media_player {

// Abstract base class for sources that parse input from a reader and
// produce one or more output streams.
class Demux : public Node {
 public:
  using SeekCallback = fit::closure;
  using StatusCallback = fit::function<void(
      int64_t duration_ns, bool can_seek, const Metadata& metadata,
      const std::string& problem_type, const std::string& problem_details)>;

  // Represents a stream produced by the demux.
  class DemuxStream {
   public:
    virtual ~DemuxStream() {}

    virtual size_t index() const = 0;

    virtual std::unique_ptr<StreamType> stream_type() const = 0;

    virtual media::TimelineRate pts_rate() const = 0;
  };

  ~Demux() override {}

  // Sets a callback to call when metadata or problem changes occur.
  virtual void SetStatusCallback(StatusCallback callback) = 0;

  // Sets the lead duration ahead of playback and the retained duration behind
  // playback to optimize skipping back.
  virtual void SetCacheOptions(zx_duration_t lead, zx_duration_t backtrack) = 0;

  // Calls the callback when the initial streams and metadata have
  // established.
  virtual void WhenInitialized(fit::function<void(Result)> callback) = 0;

  // Gets the stream collection. This method should not be called until the
  // WhenInitialized callback has been called.
  virtual const std::vector<std::unique_ptr<DemuxStream>>& streams() const = 0;

  // Seeks to the specified position and calls the callback. THE CALLBACK MAY
  // BE CALLED ON AN ARBITRARY THREAD.
  virtual void Seek(int64_t position, SeekCallback callback) = 0;
};

// Abstract base class for |Demux| factories.
class DemuxFactory {
 public:
  // Creates a demux factory.
  static std::unique_ptr<DemuxFactory> Create(
      component::StartupContext* startup_context);

  virtual ~DemuxFactory() {}

  // Creates a |Demux| object for a given reader.
  virtual Result CreateDemux(std::shared_ptr<ReaderCache> reader_cache,
                             std::shared_ptr<Demux>* demux_out) = 0;

 protected:
  DemuxFactory() {}

 private:
  // Disallow copy and assign.
  DemuxFactory(const DemuxFactory&) = delete;
  DemuxFactory& operator=(const DemuxFactory&) = delete;
};

}  // namespace media_player

#endif  // SRC_MEDIA_PLAYBACK_MEDIAPLAYER_DEMUX_DEMUX_H_
