// Copyright 2016 The Chromium 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 SERVICES_MEDIA_FRAMEWORK_GRAPH_H_
#define SERVICES_MEDIA_FRAMEWORK_GRAPH_H_

#include <list>

#include "services/media/framework/engine.h"
#include "services/media/framework/refs.h"
#include "services/media/framework/stages/active_sink_stage.h"
#include "services/media/framework/stages/active_source_stage.h"
#include "services/media/framework/stages/multistream_source_stage.h"
#include "services/media/framework/stages/stage.h"
#include "services/media/framework/stages/transform_stage.h"

namespace mojo {
namespace media {

namespace {

// StageCreator::Create creates a stage for a part. DEFINE_STAGE_CREATOR defines
// a specialization for a particular model/stage type pair. Every new
// model/stage type pair that's defined will need an entry here.
template<typename T, typename Enable = void> class StageCreator;

#define DEFINE_STAGE_CREATOR(TModel, TStage) \
template<typename T> \
class StageCreator<T, typename std::enable_if< \
    std::is_base_of<TModel, T>::value>::type> { \
 public: \
  static inline Stage* Create(std::shared_ptr<T> t_ptr) { \
    return new TStage(std::shared_ptr<TModel>(t_ptr)); \
  } \
};

DEFINE_STAGE_CREATOR(MultistreamSource, MultistreamSourceStage);
DEFINE_STAGE_CREATOR(Transform, TransformStage);
DEFINE_STAGE_CREATOR(ActiveSource, ActiveSourceStage);
DEFINE_STAGE_CREATOR(ActiveSink, ActiveSinkStage);

#undef DEFINE_STAGE_CREATOR

} // namespace

//
// USAGE
//
// Graph is a container for sources, sinks and transforms ('parts') connected
// in a graph. PartRef, InputRef and OutputRef are all
// references to parts and their inputs and outputs. Graph provides a variety
// of methods for adding and removing parts and for connecting inputs and
// outputs to form a graph.
//
// The graph isn't thread-safe. If the graph is to be modified and/or
// interrogated on multiple threads, the caller must provide its own lock
// to prevent collisions. In this case, the caller must also acquire the same
// lock when making calls that cause parts to add or remove inputs or outputs.
//
// The graph prevents the disconnection of prepared inputs and outputs. Once
// a connected input/output pair is prepared, it must be unprepared before
// disconnection. This allows the engine to operate freely over prepared
// portions of the graph (prepare and unprepare are synchronized with the
// engine).
//
// Parts added to the graph are referenced using shared pointers. The graph
// holds pointers to the parts it contains, and the application, in many cases,
// also holds pointers to the parts so it can call methods that are outside the
// graph's scope. When a part is added, the graph returns a PartRef
// object, which can be used to reference the part when the graph is modified.
// PartRef objects can be interrogated to retrieve inputs (as
// InputRef objects) and outputs (as OutputRef objects).
//
// Parts come in various flavors, defined by 'model' abstract classes. The
// current list of supported models is:
//
//  ActiveSink        - a sink that consumes packets asynchronously
//  ActiveSource      - a source that produces packets asynchronously
//  MultistreamSource - a source that produces multiple streams of packets
//                      synchronously
//  Transform         - a synchronous transform that consumes and produces
//                      packets via one input and one output
//
// Other models will be defined in the future as needed.
//

//
// DESIGN
//
// The Graph is implemented as a system of cooperating objects. Of those
// objects, only the graph itself is of relevance to code that uses Graph and
// to part implementations. The other objects are:
//
// Stage
// A stage hosts a single part. There are many subclasses of Stage, one for
// each supported part model. The stage's job is to implement the contract
// represented by the model so the parts that conform to the model can
// participate in the operation of the graph. Stages are uniform with respect
// to how they interact with graph. PartRef references a stage.
//
// Input
// A stage possesses zero or more Input instances. Input objects
// implement the supply of media into the stage and demand for media signalled
// upstream. Inputs recieve media from Outputs in the form of packets
// (type Packet).
//
// Output
// A stage possesses zero or more Output instances. Output objects
// implement the supply of media output of the stage to a downstream input and
// demand for media signalled from that input.
//

// Host for a source, sink or transform.
class Graph {
 public:
  Graph();

  ~Graph();

  // Adds a part to the graph.
  template<typename T>
  PartRef Add(std::shared_ptr<T> t_ptr) {
    DCHECK(t_ptr);
    return Add(StageCreator<T>::Create(t_ptr));
  }

  // Removes a part from the graph after disconnecting it from other parts.
  void RemovePart(PartRef part);

  // Connects an output connector to an input connector. Returns the dowstream
  // part.
  PartRef Connect(const OutputRef& output, const InputRef& input);

  // Connects a part with exactly one output to a part with exactly one input.
  // Returns the downstream part.
  PartRef ConnectParts(PartRef upstream_part, PartRef downstream_part);

  // Connects an output connector to a part that has exactly one input. Returns
  // the downstream part.
  PartRef ConnectOutputToPart(const OutputRef& output, PartRef downstream_part);

  // Connects a part with exactly one output to an input connector. Returns the
  // downstream part.
  PartRef ConnectPartToInput(PartRef upstream_part, const InputRef& input);

  // Disconnects an output connector and the input connector to which it's
  // connected.
  void DisconnectOutput(const OutputRef& output);

  // Disconnects an input connector and the output connector to which it's
  // connected.
  void DisconnectInput(const InputRef& input);

  // Disconnects and removes part and everything connected to it.
  void RemovePartsConnectedToPart(PartRef part);

  // Disconnects and removes everything connected to output.
  void RemovePartsConnectedToOutput(const OutputRef& output);

  // Disconnects and removes everything connected to input.
  void RemovePartsConnectedToInput(const InputRef& input);

  // Adds all the parts in t (which must all have one input and one output) and
  // connects them in sequence to the output connector. Returns the output
  // connector of the last part or the output parameter if it is empty.
  template<typename T>
  OutputRef AddAndConnectAll(OutputRef output, const T& t) {
    for (const auto& element : t) {
      PartRef part = Add(StageCreator<T>::Create(element));
      Connect(output, part.input());
      output = part.output();
    }
    return output;
  }

  // Removes all parts from the graph.
  void Reset();

  // Prepares the graph for operation.
  void Prepare();

  // Prepares the input and everything upstream of it. This method is used to
  // prepare subgraphs added when the rest of the graph is already prepared.
  void PrepareInput(const InputRef& input);

  // Primes all the sinks in the graph.
  void PrimeSinks();

  // Flushes the output and the subgraph downstream of it.
  void FlushOutput(const OutputRef& output);

  // Flushes the output and the subgraph downstream of it.
  void FlushAllOutputs(PartRef part);

 private:
  // Adds a stage to the graph.
  PartRef Add(Stage* stage);

  std::list<Stage*> stages_;
  std::list<Stage*> sources_;
  std::list<Stage*> sinks_;

  Engine engine_;
  Stage::UpdateCallback update_function_;
};

}  // namespace media
}  // namespace mojo

#endif  // SERVICES_MEDIA_FRAMEWORK_GRAPH_H_
